Hey Chris,


On Wed, May 3, 2017 at 12:16 PM, Christopher Collins <ch...@runtime.io>
wrote:

> On Wed, May 03, 2017 at 12:10:28PM -0700, Christopher Collins wrote:
> > On Wed, May 03, 2017 at 10:59:59AM -0700, Pritish Gandhi wrote:
> > > Hi All,
> > > Just wanted to give an update to the community on the status of trying
> to
> > > start the GATT server after the OS is initialized.
> > >
> > > to ble_hs.c
> > > @@ -606,5 +603,7 @@ ble_hs_init(void)
> > >      /* Configure the HCI transport to communicate with a host. */
> > >      ble_hci_trans_cfg_hs(ble_hs_hci_rx_evt, NULL, ble_hs_rx_data,
> NULL);
> > >
> > > +#if 0 /* Let the Application set the queue and start the BLE stack */
> > >      ble_hs_evq_set(os_eventq_dflt_get());
> > > +#endif
> > >  }
> >
> > Is there a particular reason you removed the call to ble_hs_evq_set(),
> > rather than the call to ble_hs_start()?  I think it is preferable to
> > keep ble_hs_evq_set() here, and just hold off on starting the host.  If
> > some other package tries to use the host before its eventq is set, it
> > will result in a null pointer dereference.
>
My application was setting the ble evq anyways
and I thought it might be cleaner to just let the applications decide which
queue
to use and when to start it.

But I didn't have a good reason, I guess I didn't expect anything to use
the host before
the application set the queue and started the stack since the way I
understand it is that
no one should call into the host without getting an on_sync callback which
won't happen
until ble_hs_evq_set().

>
> > > Then, I just have to call ble_hs_evq_set() with my ble thread's queue
> after
> > > registering my GATT services.
> > >
> > > The next thing I need to figure out though, is how to remove registered
> > > GATT services and add new ones after the GATT server has started.
> > > I think ble_hs_sched_reset() might work, if I move its function
> definition
> > > from src/ble_hs_priv.h to include/ble_hs.h.
> > > I haven't tried this out yet though. Will get to it soon.
> >
> > Unfortunately, I don't think ble_hs_sched_reset() will work here.  That
> > function just resets the controller and connection / procedure lists,
> > but it does not have any effect on the registered GATT services.]
> >
> > I haven't tried it, but I think the following sequence should do the
> > trick:
> >
> > 1. Register your new services with ble_gatts_add_svcs().
> > 2. Call ble_gatts_start()
> >
> > ble_gatts_start() should already get called at startup as soon as the
> > host starts.  When this happens, the registered services get exposed to
> > BLE peers, and the "working set" of services is cleared.  This is why
> > you can just start adding new services in step 1; the working set has
> > been cleared, so you are starting from scratch.  When you call
> > ble_gatts_start() in step 2, the previously-exported services get
> > replaced with the new ones.
>
> Actually, there is one more thing that you'll need to do here: set
> ble_gatts_num_cfgable_chrs to 0.  This is a static variable, so you'll
> need to hack the code a bit to get access to it.  So the sequence should
> be:
>
> 1. ble_gatts_num_cfgable_chrs = 0;
> 2. Register your new services with ble_gatts_add_svcs().
> 3. Call ble_gatts_start()
>
> Without this step, the GATT server will try to allocate too many CCCD
> entries, which could cause the ble_gatts_start() call to fail.
>
> Chris
>

This worked! I can now remove old GATT services and register new ones on
the fly.
Thanks,
Pritish

Reply via email to