void HCI_Isr(void) { tHciDataPacket * hciReadPacket = NULL; uint8_t data_len,i=0; uint8_t retries = 0; while(BlueNRG_DataPresent()) { if (list_is_empty (&hciReadPktPool) == FALSE){//check if we have free hci read packets /* enqueueing a packet for read */ list_remove_head (&hciReadPktPool, (tListNode **)&hciReadPacket); data_len = BlueNRG_SPI_Read_All(hciReadPacket->dataBuff,HCI_READ_PACKET_SIZE); if(data_len > 0){ retries = 0; hciReadPacket->data_len = data_len; if(HCI_verify(hciReadPacket) == 0) list_insert_tail(&hciReadPktRxQueue, (tListNode *)hciReadPacket); else list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket); i++; if( i > HCI_READ_PACKET_NUM_MAX) { goto error; } } else { // Insert the packet back into the pool. list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket); retries++; //Device was busy or did not respond correctly if(retries > 10) { goto error; } } } else{ // HCI Read Packet Pool is empty, wait for a free packet. readPacketListFull = TRUE; return; } } return; error: ISRDevice_busy = TRUE; return; }
void HCI_recv_packet(unsigned char* packet_buffer, unsigned int packet_length) { tHciDataPacket * hciReadPacket = NULL; if (!list_is_empty ((tListNode*)&hciReadPktPool)){ if(packet_length > 0) { /* enqueueing a packet for read */ list_remove_head ((tListNode*)&hciReadPktPool, (tListNode **)&hciReadPacket); Osal_MemCpy(hciReadPacket->dataBuff, packet_buffer, MIN(HCI_READ_PACKET_SIZE, packet_length)); hciReadPacket->data_len = packet_length; switch(HCI_verify(hciReadPacket)) { case 0: list_insert_tail((tListNode*)&hciReadPktRxQueue, (tListNode *)hciReadPacket); break; default: case 1: case 2: list_insert_head((tListNode*)&hciReadPktPool, (tListNode *)hciReadPacket); break; } } } else{ // HCI Read Packet Pool is empty, wait for a free packet. readPacketListFull = TRUE; return; } // process incoming packet // don't process when hci_send_req is undergoing if (hciAwaitReply) { return; } /* process any pending events read */ while(!list_is_empty((tListNode*)&hciReadPktRxQueue)) { list_remove_head ((tListNode*)&hciReadPktRxQueue, (tListNode **)&hciReadPacket); //Enable_SPI_IRQ(); HCI_Event_CB(hciReadPacket->dataBuff); //Disable_SPI_IRQ(); list_insert_tail((tListNode*)&hciReadPktPool, (tListNode *)hciReadPacket); } }
void HCI_Isr(void) { tHciDataPacket * hciReadPacket = NULL; uint8_t data_len; Clear_SPI_EXTI_Flag(); while(BlueNRG_DataPresent()){ if (list_is_empty (&hciReadPktPool) == FALSE){ /* enqueueing a packet for read */ list_remove_head (&hciReadPktPool, (tListNode **)&hciReadPacket); data_len = BlueNRG_SPI_Read_All(&SpiHandle, hciReadPacket->dataBuff, HCI_READ_PACKET_SIZE); if(data_len > 0){ hciReadPacket->data_len = data_len; if(HCI_verify(hciReadPacket) == 0) list_insert_tail(&hciReadPktRxQueue, (tListNode *)hciReadPacket); else list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket); } else { // Insert the packet back into the pool. list_insert_head(&hciReadPktPool, (tListNode *)hciReadPacket); } } else{ // HCI Read Packet Pool is empty, wait for a free packet. readPacketListFull = TRUE; Clear_SPI_EXTI_Flag(); return; } Clear_SPI_EXTI_Flag(); } }