case BT_SIGNAL_CONNECTION_REQUEST:\r
Bluetooth_Signal_ConnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
break;\r
+ case BT_SIGNAL_CONNECTION_RESPONSE:\r
+ Bluetooth_Signal_ConnectionResp(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
+ break;\r
case BT_SIGNAL_CONFIGURATION_REQUEST:\r
Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
break;\r
break;\r
case BT_SIGNAL_DISCONNECTION_REQUEST:\r
Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
- break; \r
+ break;\r
+ case BT_SIGNAL_DISCONNECTION_RESPONSE:\r
+ Bluetooth_Signal_DisconnectionResp(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
+ break;\r
case BT_SIGNAL_ECHO_REQUEST:\r
Bluetooth_Signal_EchoReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
break;\r
return BT_SENDPACKET_NoError;\r
}\r
\r
+Bluetooth_Channel_t* Bluetooth_OpenChannel(uint16_t PSM)\r
+{\r
+ Bluetooth_Channel_t* ChannelData = NULL;\r
+\r
+ for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\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
+ if (ChannelData == NULL)\r
+ return NULL;\r
+\r
+ ChannelData->RemoteNumber = 0;\r
+ ChannelData->PSM = PSM;\r
+ ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;\r
+ ChannelData->State = Channel_Config_WaitConfig;\r
+ \r
+ struct\r
+ {\r
+ BT_Signal_Header_t SignalCommandHeader;\r
+ BT_Signal_ConnectionReq_t ConnectionRequest;\r
+ } PacketData;\r
+\r
+ PacketData.SignalCommandHeader.Code = BT_SIGNAL_CONNECTION_REQUEST;\r
+ PacketData.SignalCommandHeader.Identifier = ++Bluetooth_Connection.SignallingIdentifier;\r
+ PacketData.SignalCommandHeader.Length = sizeof(PacketData.ConnectionRequest);\r
+ PacketData.ConnectionRequest.PSM = PSM;\r
+ PacketData.ConnectionRequest.SourceChannel = ChannelData->LocalNumber;\r
+ \r
+ Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL);\r
+\r
+ BT_ACL_DEBUG(1, ">> L2CAP Connection Request", NULL);\r
+ BT_ACL_DEBUG(2, "-- PSM 0x%04X", PacketData.ConnectionRequest.PSM);\r
+ BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData.ConnectionRequest.SourceChannel);\r
+\r
+ return ChannelData;\r
+}\r
+\r
+void Bluetooth_CloseChannel(Bluetooth_Channel_t* Channel)\r
+{\r
+ if ((Channel == NULL) || (Channel->State == Channel_Closed))\r
+ return;\r
+ \r
+ Channel->State = Channel_WaitDisconnect;\r
+\r
+ struct\r
+ {\r
+ BT_Signal_Header_t SignalCommandHeader;\r
+ BT_Signal_DisconnectionReq_t DisconnectionRequest;\r
+ } PacketData;\r
+ \r
+ PacketData.SignalCommandHeader.Code = BT_SIGNAL_DISCONNECTION_REQUEST;\r
+ PacketData.SignalCommandHeader.Identifier = ++Bluetooth_Connection.SignallingIdentifier;\r
+ PacketData.SignalCommandHeader.Length = sizeof(PacketData.DisconnectionRequest);\r
+ PacketData.DisconnectionRequest.DestinationChannel = Channel->RemoteNumber;\r
+ PacketData.DisconnectionRequest.SourceChannel = Channel->LocalNumber;\r
+\r
+ Bluetooth_SendPacket(&PacketData, sizeof(PacketData), NULL);\r
+ \r
+ BT_ACL_DEBUG(1, ">> L2CAP Disconnection Request", NULL);\r
+ BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", PacketData.DisconnectionRequest.DestinationChannel); \r
+ BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", PacketData.DisconnectionRequest.SourceChannel); \r
+}\r
+\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_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest.PSM);\r
BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel);\r
\r
- Bluetooth_Channel_t* ChannelData = Bluetooth_InitChannelData(ConnectionRequest.SourceChannel, ConnectionRequest.PSM);\r
+ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConnectionRequest.SourceChannel, true);\r
\r
+ if (ChannelData == NULL)\r
+ {\r
+ for (uint8_t i = 0; i < BLUETOOTH_MAX_OPEN_CHANNELS; i++)\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
+ if (ChannelData != NULL)\r
+ {\r
+ ChannelData->RemoteNumber = ConnectionRequest.SourceChannel;\r
+ ChannelData->PSM = ConnectionRequest.PSM;\r
+ ChannelData->LocalMTU = MAXIMUM_CHANNEL_MTU;\r
+ ChannelData->State = Channel_Config_WaitConfig;\r
+ }\r
+ \r
struct\r
{\r
BT_Signal_Header_t SignalCommandHeader;\r
\r
BT_ACL_DEBUG(1, ">> L2CAP Connection Response", NULL);\r
BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConnectionResponse.Result);\r
- BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.ConnectionResponse.SourceChannel);\r
BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.ConnectionResponse.DestinationChannel);\r
+ BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ResponsePacket.ConnectionResponse.SourceChannel);\r
+}\r
+\r
+static inline void Bluetooth_Signal_ConnectionResp(BT_ACL_Header_t* ACLPacketHeader,\r
+ BT_DataPacket_Header_t* DataHeader,\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
+{\r
+ BT_Signal_ConnectionResp_t ConnectionResponse;\r
+ \r
+ Pipe_Read_Stream_LE(&ConnectionResponse, sizeof(ConnectionResponse));\r
+\r
+ Pipe_ClearIN();\r
+ Pipe_Freeze();\r
+\r
+ BT_ACL_DEBUG(1, "<< L2CAP Connection Response", NULL);\r
+ BT_ACL_DEBUG(2, "-- Result: 0x%02X", ConnectionResponse.Result); \r
+ BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionResponse.SourceChannel); \r
+ BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ConnectionResponse.DestinationChannel); \r
+\r
+ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(ConnectionResponse.DestinationChannel, false);\r
+\r
+ if (ChannelData != NULL)\r
+ {\r
+ ChannelData->RemoteNumber = ConnectionResponse.SourceChannel;\r
+ ChannelData->State = (ConnectionResponse.Result == BT_CONNECTION_SUCCESSFUL) ?\r
+ Channel_Config_WaitConfig : Channel_Closed;\r
+ }\r
}\r
\r
+\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_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.DisconnectionResponse.DestinationChannel);\r
}\r
\r
+static inline void Bluetooth_Signal_DisconnectionResp(BT_ACL_Header_t* ACLPacketHeader,\r
+ BT_DataPacket_Header_t* DataHeader,\r
+ BT_Signal_Header_t* SignalCommandHeader)\r
+{\r
+ BT_Signal_DisconnectionResp_t DisconnectionResponse;\r
+ \r
+ Pipe_Read_Stream_LE(&DisconnectionResponse, sizeof(DisconnectionResponse));\r
+\r
+ BT_ACL_DEBUG(1, "<< L2CAP Disconnection Response", NULL);\r
+ BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", DisconnectionResponse.DestinationChannel);\r
+ BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", DisconnectionResponse.SourceChannel);\r
+ \r
+ Pipe_ClearIN();\r
+ Pipe_Freeze();\r
+ \r
+ Bluetooth_Channel_t* ChannelData = Bluetooth_GetChannelData(DisconnectionResponse.SourceChannel, true);\r
+ \r
+ if (ChannelData->State == Channel_WaitDisconnect)\r
+ ChannelData->State = Channel_Closed;\r
+}\r
+\r
static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,\r
BT_DataPacket_Header_t* DataHeader,\r
BT_Signal_Header_t* SignalCommandHeader)\r