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.

pull/1469/head
Dean Camera 14 years ago
parent f92229697f
commit e930738247

@ -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
{

@ -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

Loading…
Cancel
Save