/** Task to read in data received from the attached RNDIS device and print it to the serial port. */ void RNDISHost_Task(void) { if (USB_HostState != HOST_STATE_Configured) return; uint8_t ErrorCode; LEDs_SetAllLEDs(LEDMASK_USB_BUSY); uint16_t PacketLength; if ((ErrorCode = RNDIS_GetPacketLength(&PacketLength)) != HOST_SENDCONTROL_Successful) { printf_P(PSTR(ESC_FG_RED "Packet Reception Error.\r\n" " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode); return; } if (!(PacketLength)) return; Pipe_Unfreeze(); printf_P(PSTR("***PACKET (Size %d)***\r\n"), PacketLength); if (PacketLength > 1024) { puts_P(PSTR(ESC_FG_RED "Packet too large.\r\n" ESC_FG_WHITE)); Pipe_Discard_Stream(PacketLength, NULL); } else { uint8_t PacketBuffer[PacketLength]; Pipe_Read_Stream_LE(&PacketBuffer, PacketLength, NULL); for (uint16_t i = 0; i < PacketLength; i++) printf("0x%02x ", PacketBuffer[i]); } Pipe_ClearIN(); Pipe_Freeze(); printf("\r\n\r\n"); LEDs_SetAllLEDs(LEDMASK_USB_READY); }
/** Incoming ACL packet processing task. This task is called by the main ACL processing task to read in and process * any incoming ACL packets to the device, handling signal requests as they are received or passing along channel * data to the user application. */ static void Bluetooth_ProcessIncomingACLPackets(void) { BT_ACL_Header_t ACLPacketHeader; BT_DataPacket_Header_t DataHeader; Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE); Pipe_Unfreeze(); if (!(Pipe_IsReadWriteAllowed())) { Pipe_Freeze(); return; } /* Read in the received ACL packet headers when it has been discovered that a packet has been received */ Pipe_Read_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader)); Pipe_Read_Stream_LE(&DataHeader, sizeof(DataHeader)); BT_ACL_DEBUG(2, ""); BT_ACL_DEBUG(2, "Packet Received"); BT_ACL_DEBUG(2, "-- Connection Handle: 0x%04X", (ACLPacketHeader.ConnectionHandle & 0x0FFF)); BT_ACL_DEBUG(2, "-- Data Length: 0x%04X", ACLPacketHeader.DataLength); BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DataHeader.DestinationChannel); BT_ACL_DEBUG(2, "-- Payload Length: 0x%04X", DataHeader.PayloadLength); /* Check the packet's destination channel - signaling channel should be processed by the stack internally */ if (DataHeader.DestinationChannel == BT_CHANNEL_SIGNALING) { /* Read in the Signal Command header of the incoming packet */ BT_Signal_Header_t SignalCommandHeader; Pipe_Read_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader)); /* Dispatch to the appropriate handler function based on the Signal message code */ switch (SignalCommandHeader.Code) { case BT_SIGNAL_CONNECTION_REQUEST: Bluetooth_Signal_ConnectionReq(&SignalCommandHeader); break; case BT_SIGNAL_CONNECTION_RESPONSE: Bluetooth_Signal_ConnectionResp(&SignalCommandHeader); break; case BT_SIGNAL_CONFIGURATION_REQUEST: Bluetooth_Signal_ConfigurationReq(&SignalCommandHeader); break; case BT_SIGNAL_CONFIGURATION_RESPONSE: Bluetooth_Signal_ConfigurationResp(&SignalCommandHeader); break; case BT_SIGNAL_DISCONNECTION_REQUEST: Bluetooth_Signal_DisconnectionReq(&SignalCommandHeader); break; case BT_SIGNAL_DISCONNECTION_RESPONSE: Bluetooth_Signal_DisconnectionResp(&SignalCommandHeader); break; case BT_SIGNAL_ECHO_REQUEST: Bluetooth_Signal_EchoReq(&SignalCommandHeader); break; case BT_SIGNAL_INFORMATION_REQUEST: Bluetooth_Signal_InformationReq(&SignalCommandHeader); break; case BT_SIGNAL_COMMAND_REJECT: BT_ACL_DEBUG(1, "<< Command Reject"); uint16_t RejectReason; Pipe_Read_Stream_LE(&RejectReason, sizeof(RejectReason)); Pipe_Discard_Stream(ACLPacketHeader.DataLength - sizeof(RejectReason)); Pipe_ClearIN(); Pipe_Freeze(); BT_ACL_DEBUG(2, "-- Reason: %d", RejectReason); break; default: BT_ACL_DEBUG(1, "<< Unknown Signaling Command 0x%02X", SignalCommandHeader.Code); Pipe_Discard_Stream(ACLPacketHeader.DataLength); Pipe_ClearIN(); Pipe_Freeze(); break; } } else { /* Non-signaling packet received, read in the packet contents and pass to the user application */ uint8_t PacketData[DataHeader.PayloadLength]; Pipe_Read_Stream_LE(PacketData, DataHeader.PayloadLength); Pipe_ClearIN(); Pipe_Freeze(); Bluetooth_PacketReceived(PacketData, DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, CHANNEL_SEARCH_LOCALNUMBER)); } }
static void Bluetooth_DiscardRemainingHCIEventParameters(void) { Pipe_SelectPipe(BLUETOOTH_EVENTS_PIPE); Pipe_Discard_Stream(HCIEventHeader.ParameterLength); Pipe_ClearCurrentBank(); }