in nmxact/nmble/ble_advertiser.go [181:245]
func (a *Advertiser) Start(cfg AdvertiseCfg) (sesn.Sesn, error) {
var advData []byte
var rspData []byte
var connHandle uint16
var bl *Listener
var err error
fns := []func() error{
// Convert advertising fields to data.
func() error {
advData, err = a.fields(cfg.AdvFields)
return err
},
// Set advertising data.
func() error {
return a.setAdvData(advData)
},
// Convert response fields to data.
func() error {
rspData, err = a.fields(cfg.RspFields)
return err
},
// Set response data.
func() error {
return a.setRspData(rspData)
},
// Advertise
func() error {
connHandle, bl, err = a.advertise(cfg)
return err
},
}
a.stopChan = make(chan struct{})
a.stoppedChan = make(chan struct{})
defer func() {
a.stopChan = nil
close(a.stoppedChan)
}()
if err := a.bx.AcquireSlave(a); err != nil {
return nil, err
}
defer a.bx.ReleaseSlave()
for _, fn := range fns {
// Check for abort before each step.
select {
case <-a.stopChan:
return nil, fmt.Errorf("advertise aborted")
default:
}
if err := fn(); err != nil {
return nil, err
}
}
return a.buildSesn(cfg, connHandle, bl)
}