aboutsummaryrefslogtreecommitdiffstats
path: root/Demos
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2010-06-07 13:39:34 +0000
committerDean Camera <dean@fourwalledcubicle.com>2010-06-07 13:39:34 +0000
commite9307382479c0f3ae500e6e8d8b55f7a682c423b (patch)
treec40d5226a25d2043587cf083eab61ebc00b3847e /Demos
parentf92229697f148f0929b75a0ee2a5c4d246e72d80 (diff)
downloadlufa-e9307382479c0f3ae500e6e8d8b55f7a682c423b.tar.gz
lufa-e9307382479c0f3ae500e6e8d8b55f7a682c423b.tar.bz2
lufa-e9307382479c0f3ae500e6e8d8b55f7a682c423b.zip
Add stub RFCOMM command handlers. Move out RFCOMM frame length and data pointer calculations to the master RFCOMM frame reception routine, instead of inside each frame type handler function.
Diffstat (limited to 'Demos')
-rw-r--r--Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c107
-rw-r--r--Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h40
2 files changed, 103 insertions, 44 deletions
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c
index 5a7edc2a8..46cc182ec 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.c
@@ -69,85 +69,134 @@ void RFCOMM_Initialize(void)
void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel)
{
- const RFCOMM_Header_t* FrameHeader = (const RFCOMM_Header_t*)Data;
+ const RFCOMM_Header_t* FrameHeader = (const RFCOMM_Header_t*)Data;
+ const uint8_t* FrameData = (const uint8_t*)Data + sizeof(RFCOMM_Header_t);
+ uint16_t FrameDataLen = RFCOMM_GetFrameDataLength(FrameData);
+
+ FrameData += (FrameDataLen < 128) ? 1 : 2;
/* Decode the RFCOMM frame type from the header */
switch (FrameHeader->Control & ~FRAME_POLL_FINAL)
{
case RFCOMM_Frame_DM:
- RFCOMM_ProcessDM(FrameHeader, Channel);
+ RFCOMM_ProcessDM(&FrameHeader->Address, Channel);
break;
case RFCOMM_Frame_DISC:
- RFCOMM_ProcessDISC(FrameHeader, Channel);
+ RFCOMM_ProcessDISC(&FrameHeader->Address, Channel);
break;
case RFCOMM_Frame_SABM:
- RFCOMM_ProcessSABM(FrameHeader, Channel);
+ RFCOMM_ProcessSABM(&FrameHeader->Address, Channel);
break;
case RFCOMM_Frame_UA:
- RFCOMM_ProcessUA(FrameHeader, Channel);
+ RFCOMM_ProcessUA(&FrameHeader->Address, Channel);
break;
case RFCOMM_Frame_UIH:
- RFCOMM_ProcessUIH(FrameHeader, Channel);
+ RFCOMM_ProcessUIH(&FrameHeader->Address, FrameDataLen, FrameData, Channel);
break;
default:
- BT_RFCOMM_DEBUG(1, "<< Unknown Frame Type");
+ BT_RFCOMM_DEBUG(1, "<< Unknown Frame Received");
break;
}
}
-static void RFCOMM_ProcessDM(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel)
+static void RFCOMM_ProcessDM(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel)
{
BT_RFCOMM_DEBUG(1, "<< DM Received");
- BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameHeader->Address.DLCI);
+ BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI);
}
-static void RFCOMM_ProcessDISC(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel)
+static void RFCOMM_ProcessDISC(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel)
{
BT_RFCOMM_DEBUG(1, "<< DISC Received");
- BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameHeader->Address.DLCI);
+ BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI);
// TODO: Close down connection
BT_RFCOMM_DEBUG(1, ">> UA Sent");
- RFCOMM_SendFrame(FrameHeader->Address.DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, Channel);
+ RFCOMM_SendFrame(FrameAddress->DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, Channel);
}
-static void RFCOMM_ProcessSABM(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel)
+static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel)
{
BT_RFCOMM_DEBUG(1, "<< SABM Received");
- BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameHeader->Address.DLCI);
+ BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI);
// TODO: Reset channel send/receive state
BT_RFCOMM_DEBUG(1, ">> UA Sent");
- RFCOMM_SendFrame(FrameHeader->Address.DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, Channel);
+ RFCOMM_SendFrame(FrameAddress->DLCI, true, (RFCOMM_Frame_UA | FRAME_POLL_FINAL), 0, NULL, Channel);
}
-static void RFCOMM_ProcessUA(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel)
+static void RFCOMM_ProcessUA(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel)
{
BT_RFCOMM_DEBUG(1, "<< UA Received");
- BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameHeader->Address.DLCI);
+ BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI);
}
-static void RFCOMM_ProcessUIH(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel)
+static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, const uint16_t FrameLength,
+ const uint8_t* FrameData, Bluetooth_Channel_t* const Channel)
{
BT_RFCOMM_DEBUG(1, "<< UIH Received");
- BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameHeader->Address.DLCI);
-
- uint8_t* FrameData = (uint8_t*)FrameHeader + sizeof(RFCOMM_Header_t);
- uint16_t FrameDataLen = RFCOMM_GetFrameDataLength(FrameData);
- FrameData += (FrameDataLen < 128) ? 1 : 2;
-
- BT_RFCOMM_DEBUG(2, "-- Length 0x%02X", FrameDataLen);
+ BT_RFCOMM_DEBUG(2, "-- DLCI 0x%02X", FrameAddress->DLCI);
+ BT_RFCOMM_DEBUG(2, "-- Length 0x%02X", FrameLength);
- if (FrameHeader->Address.DLCI == RFCOMM_CONTROL_DLCI)
+ if (FrameAddress->DLCI == RFCOMM_CONTROL_DLCI)
{
- // TODO: Process control command
+ RFCOMM_ProcessControlCommand((const RFCOMM_Command_t*)FrameData, Channel);
+ return;
+ }
+
+ // TODO: Handle regular channel data here
+}
+
+static void RFCOMM_ProcessControlCommand(const RFCOMM_Command_t* CommandHeader, Bluetooth_Channel_t* const Channel)
+{
+ switch (CommandHeader->Command)
+ {
+ case RFCOMM_Control_Test:
+ BT_RFCOMM_DEBUG(1, "<< TEST Command");
+ break;
+ case RFCOMM_Control_FlowControlEnable:
+ BT_RFCOMM_DEBUG(1, "<< FCE Command");
+ break;
+ case RFCOMM_Control_FlowControlDisable:
+ BT_RFCOMM_DEBUG(1, "<< FCD Command");
+ break;
+ case RFCOMM_Control_ModemStatus:
+ BT_RFCOMM_DEBUG(1, "<< MS Command");
+ break;
+ case RFCOMM_Control_RemotePortNegotiation:
+ BT_RFCOMM_DEBUG(1, "<< RPN Command");
+ break;
+ case RFCOMM_Control_RemoteLineStatus:
+ BT_RFCOMM_DEBUG(1, "<< RLS Command");
+ break;
+ case RFCOMM_Control_DLCParameterNegotiation:
+ BT_RFCOMM_DEBUG(1, "<< DPN Command");
+
+ struct
+ {
+ RFCOMM_Command_t Header;
+ RFCOMM_Command_t Command;
+ } Response =
+ {
+ .Header = (RFCOMM_Command_t)
+ {
+ .Command = RFCOMM_Control_NonSupportedCommand,
+ .CR = true,
+ .EA = true,
+ },
+
+ .Command = *CommandHeader,
+ };
+
+ RFCOMM_SendFrame(RFCOMM_CONTROL_DLCI, false, RFCOMM_Frame_UIH, sizeof(RFCOMM_Command_t), &Response, Channel);
+ break;
}
}
-static void RFCOMM_SendFrame(const uint8_t DLCI, const bool CommandResponse, const uint8_t Control, const uint16_t DataLen, const uint8_t* Data,
- Bluetooth_Channel_t* const Channel)
+static void RFCOMM_SendFrame(const uint8_t DLCI, const bool CommandResponse, const uint8_t Control, const uint16_t DataLen,
+ const void* Data, Bluetooth_Channel_t* const Channel)
{
struct
{
diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h
index 3f7887fed..8d44c1815 100644
--- a/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h
+++ b/Demos/Host/Incomplete/BluetoothHost/Lib/RFCOMM.h
@@ -69,15 +69,15 @@
enum RFCOMM_Control_Commands_t
{
- RFCOMM_Control_Test = 0x20;
- RFCOMM_Control_FlowControlEnable = 0xA0;
- RFCOMM_Control_FlowControlDisable = 0x60;
- RFCOMM_Control_ModemStatus = 0xE0;
- RFCOMM_Control_RemotePortNegotiation = 0x90;
- RFCOMM_Control_RemoteLineStatus = 0x50;
- RFCOMM_Control_DLCParameterNegotiation = 0x80;
- RFCOMM_Control_NonSupportedCommand = 0x10;
- }
+ RFCOMM_Control_Test = (0x20 >> 2),
+ RFCOMM_Control_FlowControlEnable = (0xA0 >> 2),
+ RFCOMM_Control_FlowControlDisable = (0x60 >> 2),
+ RFCOMM_Control_ModemStatus = (0xE0 >> 2),
+ RFCOMM_Control_RemotePortNegotiation = (0x90 >> 2),
+ RFCOMM_Control_RemoteLineStatus = (0x50 >> 2),
+ RFCOMM_Control_DLCParameterNegotiation = (0x80 >> 2),
+ RFCOMM_Control_NonSupportedCommand = (0x10 >> 2),
+ };
/* Type Defines: */
typedef struct
@@ -92,20 +92,30 @@
RFCOMM_Address_t Address;
uint8_t Control;
} RFCOMM_Header_t;
+
+ typedef struct
+ {
+ unsigned char EA : 1;
+ unsigned char CR : 1;
+ unsigned char Command : 6;
+ } RFCOMM_Command_t;
/* Function Prototypes: */
void RFCOMM_Initialize(void);
void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel);
#if defined(INCLUDE_FROM_RFCOMM_C)
- static void RFCOMM_ProcessDM(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel);
- static void RFCOMM_ProcessDISC(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel);
- static void RFCOMM_ProcessSABM(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel);
- static void RFCOMM_ProcessUA(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel);
- static void RFCOMM_ProcessUIH(const RFCOMM_Header_t* const FrameHeader, Bluetooth_Channel_t* const Channel);
+ static void RFCOMM_ProcessDM(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel);
+ static void RFCOMM_ProcessDISC(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel);
+ static void RFCOMM_ProcessSABM(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel);
+ static void RFCOMM_ProcessUA(const RFCOMM_Address_t* const FrameAddress, Bluetooth_Channel_t* const Channel);
+ static void RFCOMM_ProcessUIH(const RFCOMM_Address_t* const FrameAddress, const uint16_t FrameLength,
+ const uint8_t* FrameData, Bluetooth_Channel_t* const Channel);
+ static void RFCOMM_ProcessControlCommand(const RFCOMM_Command_t* CommandHeader, Bluetooth_Channel_t* const Channel);
+
static void RFCOMM_SendFrame(const uint8_t DLCI, const bool CommandResponse, const uint8_t Control,
- const uint16_t DataLen, const uint8_t* Data, Bluetooth_Channel_t* const Channel);
+ const uint16_t DataLen, const void* Data, Bluetooth_Channel_t* const Channel);
static uint8_t RFCOMM_GetFCSValue(const void* FrameStart, uint8_t Length);
static uint16_t RFCOMM_GetFrameDataLength(const uint8_t* const BufferPos);
#endif