adaptor/macos: handle case when adapter enable sends notification before event delegate is set

Signed-off-by: Ron Evans <ron@hybridgroup.com>
This commit is contained in:
Ron Evans 2020-10-25 17:58:27 +01:00
parent 266de9824a
commit 0bc0ef868d

@ -43,16 +43,23 @@ func (a *Adapter) Enable() error {
}
// wait until powered
a.poweredChan = make(chan error)
a.poweredChan = make(chan error, 1)
a.cmd = &centralManagerDelegate{a: a}
a.cm.SetDelegate(a.cmd)
select {
case <-a.poweredChan:
case <-time.NewTimer(10 * time.Second).C:
return errors.New("timeout enabling CentralManager")
if a.cm.State() != cbgo.ManagerStatePoweredOn {
select {
case <-a.poweredChan:
case <-time.NewTimer(10 * time.Second).C:
return errors.New("timeout enabling CentralManager")
}
}
// drain any extra powered-on events from channel
for len(a.poweredChan) > 0 {
<-a.poweredChan
}
a.poweredChan = nil
// wait until powered?
a.pmd = &peripheralManagerDelegate{a: a}
@ -73,7 +80,7 @@ type centralManagerDelegate struct {
func (cmd *centralManagerDelegate) CentralManagerDidUpdateState(cmgr cbgo.CentralManager) {
// powered on?
if cmgr.State() == cbgo.ManagerStatePoweredOn {
close(cmd.a.poweredChan)
cmd.a.poweredChan <- nil
}
// TODO: handle other state changes.