{\r
BT_Signal_Header_t SignalCommandHeader;\r
Pipe_Read_Stream_LE(&SignalCommandHeader, sizeof(SignalCommandHeader));\r
-\r
+ \r
switch (SignalCommandHeader.Code)\r
{\r
case BT_SIGNAL_CONNECTION_REQUEST:\r
case BT_SIGNAL_CONFIGURATION_REQUEST:\r
Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
break;\r
+ case BT_SIGNAL_CONFIGURATION_RESPONSE:\r
+ Bluetooth_Signal_ConfigurationResp(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
+ break;\r
case BT_SIGNAL_DISCONNECTION_REQUEST:\r
Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
break; \r
}\r
else\r
{\r
- Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, true));\r
+ Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, false));\r
\r
Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE);\r
Pipe_Discard_Stream(DataHeader.PayloadLength);\r
\r
// TODO: Add packet fragmentation here after retrieving the device's signal channel MTU\r
\r
- ACLPacketHeader.ConnectionHandle = Bluetooth_Connection.ConnectionHandle | (1 << 13);\r
+ ACLPacketHeader.ConnectionHandle = (Bluetooth_Connection.ConnectionHandle | BT_ACL_FIRST_AUTOFLUSH);\r
ACLPacketHeader.DataLength = sizeof(DataHeader) + DataLen;\r
DataHeader.PayloadLength = DataLen;\r
DataHeader.DestinationChannel = (Channel == NULL) ? BT_CHANNEL_SIGNALING : Channel->RemoteNumber;\r
Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader));\r
Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader));\r
Pipe_Write_Stream_LE(Data, DataLen);\r
+ Pipe_ClearOUT();\r
\r
Pipe_Freeze();\r
\r
return BT_SENDPACKET_NoError;\r
}\r
\r
-static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
+static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
BT_DataPacket_Header_t* DataHeader,\r
- BT_Signal_Header_t* SignalCommandHeader)\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
{\r
BT_Signal_ConnectionReq_t ConnectionRequest;\r
\r
ResponsePacket.SignalCommandHeader.Identifier = SignalCommandHeader->Identifier;\r
ResponsePacket.SignalCommandHeader.Length = sizeof(ResponsePacket.ConnectionResponse);\r
ResponsePacket.ConnectionResponse.Result = (ChannelData == NULL) ? BT_CONNECTION_REFUSED_RESOURCES : BT_CONNECTION_SUCCESSFUL;\r
- ResponsePacket.ConnectionResponse.DestinationChannel = ChannelData->LocalNumber;\r
- ResponsePacket.ConnectionResponse.SourceChannel = ChannelData->RemoteNumber;\r
+ ResponsePacket.ConnectionResponse.DestinationChannel = ChannelData->RemoteNumber;\r
+ ResponsePacket.ConnectionResponse.SourceChannel = ChannelData->LocalNumber;\r
ResponsePacket.ConnectionResponse.Status = 0x00;\r
\r
Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.ConnectionResponse.DestinationChannel);\r
}\r
\r
-static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,\r
+static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketHeader,\r
BT_DataPacket_Header_t* DataHeader,\r
- BT_Signal_Header_t* SignalCommandHeader)\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
{\r
BT_Signal_ConfigurationReq_t ConfigurationRequest;\r
uint8_t OptionsLen;\r
\r
BT_ACL_DEBUG(1, "<< L2CAP Configuration Request", NULL);\r
BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConfigurationRequest.DestinationChannel);\r
- BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", ConfigurationRequest.DestinationChannel);\r
+ BT_ACL_DEBUG(2, "-- Options Len: 0x%04X", (DataHeader->PayloadLength - sizeof(*SignalCommandHeader)));\r
BT_ACL_DEBUG(2, "-- Remote MTU: 0x%04X", ChannelData->RemoteMTU);\r
\r
struct\r
BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConfigurationResponse.Result);\r
}\r
\r
-static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
+static inline void Bluetooth_Signal_ConfigurationResp(BT_ACL_Header_t* ACLPacketHeader,\r
+ BT_DataPacket_Header_t* DataHeader,\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
+{\r
+ BT_Signal_ConfigurationResp_t ConfigurationResponse;\r
+\r
+ Pipe_Read_Stream_LE(&ConfigurationResponse, sizeof(ConfigurationResponse));\r
+\r
+ Pipe_ClearIN();\r
+ Pipe_Freeze();\r
+ \r
+ BT_ACL_DEBUG(1, "<< L2CAP Configuration Response", NULL);\r
+ BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConfigurationResponse.SourceChannel);\r
+ BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConfigurationResponse.Result);\r
+\r
+ if (ConfigurationResponse.Result == BT_CONFIGURATION_SUCCESSFUL)\r
+ {\r
+ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConfigurationResponse.SourceChannel, true);\r
+ \r
+ if (ChannelData != NULL)\r
+ {\r
+ switch (ChannelData->State)\r
+ {\r
+ case Channel_Config_WaitReqResp:\r
+ ChannelData->State = Channel_Config_WaitReq;\r
+ break;\r
+ case Channel_Config_WaitResp:\r
+ ChannelData->State = Channel_Open;\r
+ break;\r
+ }\r
+ } \r
+ }\r
+}\r
+\r
+static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketHeader,\r
BT_DataPacket_Header_t* DataHeader,\r
- BT_Signal_Header_t* SignalCommandHeader)\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
{\r
BT_Signal_DisconnectionReq_t DisconnectionRequest;\r
\r
Pipe_ClearIN();\r
Pipe_Freeze();\r
\r
- Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);\r
+ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionRequest.SourceChannel, true);\r
\r
struct\r
{\r
ResponsePacket.SignalCommandHeader.Code = BT_SIGNAL_DISCONNECTION_RESPONSE;\r
ResponsePacket.SignalCommandHeader.Identifier = SignalCommandHeader->Identifier;\r
ResponsePacket.SignalCommandHeader.Length = sizeof(ResponsePacket.DisconnectionResponse);\r
- ResponsePacket.DisconnectionResponse.DestinationChannel = ChannelData->LocalNumber;\r
- ResponsePacket.DisconnectionResponse.SourceChannel = ChannelData->RemoteNumber;\r
+ ResponsePacket.DisconnectionResponse.DestinationChannel = ChannelData->RemoteNumber;\r
+ ResponsePacket.DisconnectionResponse.SourceChannel = ChannelData->LocalNumber;\r
\r
Bluetooth_SendPacket(&ResponsePacket, sizeof(ResponsePacket), NULL);\r
\r
BT_ACL_DEBUG(1, ">> L2CAP Echo Response", NULL);\r
}\r
\r
-static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,\r
+static inline void Bluetooth_Signal_InformationReq(BT_ACL_Header_t* ACLPacketHeader,\r
BT_DataPacket_Header_t* DataHeader,\r
- BT_Signal_Header_t* SignalCommandHeader)\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
{\r
BT_Signal_InformationReq_t InformationRequest;\r
\r
Bluetooth_ACLTask();\r
}\r
\r
-Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource)\r
+Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchByRemoteChannel)\r
{\r
for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
{\r
Bluetooth_Channel_t* ChannelData = &Bluetooth_Connection.Channels[i];\r
\r
- uint16_t CurrentChannelNumber = (SearchBySource) ? ChannelData->RemoteNumber : ChannelData->LocalNumber;\r
+ uint16_t CurrentChannelNumber = (SearchByRemoteChannel) ? ChannelData->RemoteNumber : ChannelData->LocalNumber;\r
\r
if (CurrentChannelNumber == ChannelNumber)\r
return ChannelData;\r
\r
Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM)\r
{\r
- for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
+ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(RemoteChannelNumber, false);\r
+\r
+ if (ChannelData == NULL)\r
{\r
- Bluetooth_Channel_t* ChannelData = &Bluetooth_Connection.Channels[i];\r
- \r
- if (ChannelData->State == Channel_Closed)\r
+ for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\r
{\r
- ChannelData->RemoteNumber = RemoteChannelNumber;\r
- ChannelData->LocalNumber = (BLUETOOTH_CHANNELNUMBER_BASEOFFSET + i);\r
- ChannelData->PSM = PSM;\r
- ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;\r
- ChannelData->State = Channel_Config_WaitConfig;\r
- \r
- return ChannelData;\r
- } \r
+ if (Bluetooth_Connection.Channels[i].State == Channel_Closed)\r
+ {\r
+ ChannelData = &Bluetooth_Connection.Channels[i]; \r
+ ChannelData->LocalNumber = (BLUETOOTH_CHANNELNUMBER_BASEOFFSET + i);\r
+ break;\r
+ }\r
+ }\r
}\r
\r
- return NULL;\r
+ if (ChannelData != NULL)\r
+ {\r
+ ChannelData->RemoteNumber = RemoteChannelNumber;\r
+ ChannelData->PSM = PSM;\r
+ ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;\r
+ ChannelData->State = Channel_Config_WaitConfig;\r
+ }\r
+\r
+ return ChannelData;\r
}\r