while(list_empty == FALSE) 如果NRG没有主设备连接进行的一些处理。
HCI_Event_CB(hciReadPacket->dataBuff); 控制接口事件的回调函数,对发生的主控制接口事件进行处理。list_insert_tail(&hciReadPktPool, (tListNode *)hciReadPacket); 对数据包链表的处理。
list_empty = list_is_empty(&hciReadPktRxQueue); 读链接队列,看是否有主设备连接。
if (readPacketListFull) 执行到这句的时候,NRG已经被主设备连接到了,并且NRG已经收到了主设备发过来的数据。
readPacketListFull的置位是在void HCI_Isr(void)函数中,SPI的中断函数会调用该函数。
void HCI_Isr(void)函数中先判断是否收到了数据,如果收到数据NRG是否有设备已经连接,如果已经连接到主设备了 readPacketListFull置位 告诉 HCI收到数据了在void HCI_Process(void);函数中处理即上边的if (readPacketListFull) 。读到数据的长度,调用HCI的事件回调函数HCI_Event_CB(buffer);处理发生的事件。
HCI_Event_CB(buffer);的事件包括:断开事件、连接事件、主设备的请求回复等等一系列的事件,具体事件的功能我也不太清楚,有个手册什么的像ST那样的固件库手册就好了。
点灯的具体过程综述如下:
小钢炮各种硬件的初始化,NRG参数设置开始间隔pack scan等待主设备的呼叫,HCI_Process();处理各种事件,dispatch();进行任务调度。
手机发送数据到小钢炮。
NRG的SPI进行中断,readPacketListFull置位。
HCI_Process();进行事件处理,调用void ble_device_on_message(uint8_t type, uint16_t length, uint8_t* value);函数对接收的数据进行处理,即灯的亮灭。
分析的过程肯定还有我认识上的错误,请大家多多指正一起进步,看代码的感觉就是有点找不着北。。。。