Add LUFA-side channel open/close routines, add signalling handlers for the creation...
[pub/USBasp.git] / Demos / Host / Incomplete / BluetoothHost / Lib / BluetoothACLPackets.c
index 7c238e9..50fba7c 100644 (file)
@@ -120,6 +120,9 @@ static void Bluetooth_ProcessACLPackets(void)
                        case BT_SIGNAL_CONNECTION_REQUEST:\r
                                Bluetooth_Signal_ConnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
                        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
                        case BT_SIGNAL_CONFIGURATION_REQUEST:\r
                                Bluetooth_Signal_ConfigurationReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
@@ -128,7 +131,10 @@ static void Bluetooth_ProcessACLPackets(void)
                                break;\r
                        case BT_SIGNAL_DISCONNECTION_REQUEST:\r
                                Bluetooth_Signal_DisconnectionReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\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
                        case BT_SIGNAL_ECHO_REQUEST:\r
                                Bluetooth_Signal_EchoReq(&ACLPacketHeader, &DataHeader, &SignalCommandHeader);\r
                                break;\r
@@ -193,6 +199,75 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
        return BT_SENDPACKET_NoError;\r
 }\r
 \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
 static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                   BT_DataPacket_Header_t* DataHeader,\r
                                                   BT_Signal_Header_t*     SignalCommandHeader)\r
@@ -208,8 +283,29 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPac
        BT_ACL_DEBUG(2, "-- PSM: 0x%04X", ConnectionRequest.PSM);\r
        BT_ACL_DEBUG(2, "-- Source Channel: 0x%04X", ConnectionRequest.SourceChannel);\r
        \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
 \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
        struct\r
        {\r
                BT_Signal_Header_t         SignalCommandHeader;\r
@@ -228,10 +324,37 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t*        ACLPac
 \r
        BT_ACL_DEBUG(1, ">> L2CAP Connection Response", NULL);\r
        BT_ACL_DEBUG(2, "-- Result: 0x%02X", ResponsePacket.ConnectionResponse.Result);\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, "-- 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
 \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
 static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t*        ACLPacketHeader,\r
                                                      BT_DataPacket_Header_t* DataHeader,\r
                                                      BT_Signal_Header_t*     SignalCommandHeader)\r
@@ -375,6 +498,27 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t*        ACL
        BT_ACL_DEBUG(2, "-- Destination Channel: 0x%04X", ResponsePacket.DisconnectionResponse.DestinationChannel);\r
 }\r
 \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
 static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,\r
                                             BT_DataPacket_Header_t* DataHeader,\r
                                             BT_Signal_Header_t* SignalCommandHeader)\r