func()

in nmxact/nmble/conn.go [265:333]


func (c *Conn) eventListen(bl *Listener) error {
	// Terminates on:
	// * BLE listener error (also triggered by txvr being stopped).
	// * Receive of disconnect event.
	//
	// On terminate, this Goroutine shuts the connection object down.
	c.wg.Add(1)
	go func() {
		defer c.wg.Done()
		defer c.rxvr.RemoveListener("connect", bl)
		defer close(c.dropChan)

		for {
			select {
			case err, ok := <-bl.ErrChan:
				if ok {
					c.enqueueShutdown(err)
				}
				return

			case bm, ok := <-bl.MsgChan:
				if ok {
					switch msg := bm.(type) {
					case *BleMtuChangeEvt:
						if msg.Status != 0 {
							err := StatusError(MSG_OP_EVT,
								MSG_TYPE_MTU_CHANGE_EVT,
								msg.Status)
							log.Debugf(err.Error())
						} else {
							log.Debugf("BLE ATT MTU updated; from=%d to=%d",
								c.attMtu, msg.Mtu)
							c.attMtu = msg.Mtu
						}

					case *BleEncChangeEvt:
						var err error
						if msg.Status != 0 {
							err = StatusError(MSG_OP_EVT,
								MSG_TYPE_ENC_CHANGE_EVT,
								msg.Status)
							log.Debugf(err.Error())
						} else {
							log.Debugf("Connection encrypted; conn_handle=%d",
								msg.ConnHandle)
							c.updateDescriptor()
						}

						// Unblock any initiate-security procedures.
						c.encBlocker.Unblock(err)

					case *BlePasskeyEvt:
						c.smIoChan <- SmIoDemand{
							Action: msg.Action,
							Numcmp: msg.Numcmp,
						}

					case *BleDisconnectEvt:
						c.enqueueShutdown(c.newDisconnectError(msg.Reason))
						return

					default:
					}
				}
			}
		}
	}()
	return nil
}