in nmxact/nmble/ble_act.go [640:708]
func actScan(x *BleXport, bl *Listener, r *BleScanReq) (
<-chan BleAdvReport, <-chan error, error) {
const rspType = MSG_TYPE_SCAN
j, err := json.Marshal(r)
if err != nil {
return nil, nil, err
}
if err := x.Tx(j); err != nil {
return nil, nil, err
}
ach := make(chan BleAdvReport)
ech := make(chan error)
nmxutil.Assert(bl != nil)
bhdTmoChan := bl.AfterTimeout(x.RspTimeout())
go func() {
defer close(ach)
defer close(ech)
for {
select {
case err := <-bl.ErrChan:
ech <- err
return
case bm, ok := <-bl.MsgChan:
if ok {
switch msg := bm.(type) {
case *BleScanRsp:
bl.Acked = true
if msg.Status != 0 {
ech <- StatusError(MSG_OP_RSP, rspType, msg.Status)
return
}
case *BleScanEvt:
r := BleAdvReportFromScanEvt(msg)
ach <- r
case *BleScanCompleteEvt:
if msg.Reason == 0 {
// On successful completion, just return and allow
// the ech channel to close.
return
} else {
ech <- StatusError(MSG_OP_RSP, rspType, msg.Reason)
return
}
default:
}
}
case _, ok := <-bhdTmoChan:
if ok {
x.Restart("Blehostd timeout: " + MsgTypeToString(rspType))
}
bhdTmoChan = nil
}
}
}()
return ach, ech, nil
}