func actScan()

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
}