Bluetooth demo can now create and maintain logical channels - need to determine why...
[pub/USBasp.git] / Demos / Host / Incomplete / BluetoothHost / Lib / BluetoothACLPackets.c
index a35dcb1..7c238e9 100644 (file)
@@ -114,7 +114,7 @@ static void Bluetooth_ProcessACLPackets(void)
        {\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
@@ -123,6 +123,9 @@ static void Bluetooth_ProcessACLPackets(void)
                        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
@@ -143,7 +146,7 @@ static void Bluetooth_ProcessACLPackets(void)
        }\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
@@ -165,7 +168,7 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
 \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
@@ -176,6 +179,7 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
        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
@@ -189,9 +193,9 @@ uint8_t Bluetooth_SendPacket(void* Data, uint16_t DataLen, Bluetooth_Channel_t*
        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
@@ -216,8 +220,8 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHead
        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
@@ -228,9 +232,9 @@ static inline void Bluetooth_Signal_ConnectionReq(BT_ACL_Header_t* ACLPacketHead
        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
@@ -259,7 +263,7 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
 \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
@@ -298,9 +302,43 @@ static inline void Bluetooth_Signal_ConfigurationReq(BT_ACL_Header_t* ACLPacketH
        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
@@ -313,7 +351,7 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
        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
@@ -324,8 +362,8 @@ static inline void Bluetooth_Signal_DisconnectionReq(BT_ACL_Header_t* ACLPacketH
        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
@@ -360,9 +398,9 @@ static inline void Bluetooth_Signal_EchoReq(BT_ACL_Header_t* ACLPacketHeader,
        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