Commit 9293de24 authored by Dean Camera's avatar Dean Camera
Browse files

Start implementation of RFCOMM decoding layer. Add new service initialize...

Start implementation of RFCOMM decoding layer. Add new service initialize routines for each Bluetooth service - currently unused, but will eventually reset the service state of RFCOMM when a new connection is made.
parent 13d812a7
......@@ -213,6 +213,10 @@ void Bluetooth_StackInitialized(void)
printf_P(PSTR("Stack initialized with local address %02X:%02X:%02X:%02X:%02X:%02X.\r\n"),
Bluetooth_State.LocalBDADDR[5], Bluetooth_State.LocalBDADDR[4], Bluetooth_State.LocalBDADDR[3],
Bluetooth_State.LocalBDADDR[2], Bluetooth_State.LocalBDADDR[1], Bluetooth_State.LocalBDADDR[0]);
/* Reinitialize the services placed on top of the bluetooth stack ready for new connections */
SDP_Initialize();
RFCOMM_Initialize();
}
/** Bluetooth stack callback event for a Bluetooth connection request. When this callback fires, the
......
......@@ -28,9 +28,76 @@
this software.
*/
#define INCLUDE_FROM_RFCOMM_C
#include "RFCOMM.h"
/** 8-Bit CRC table used by the FCS field of each RFCOMM encoded frame, sourced from the ETSI TS 101 369 V7.2.0
* specification document, upon which the RFCOMM specification is based.
*/
const uint8_t CRC8_Table[256] PROGMEM =
{
0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B,
0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,
0x38, 0xA9, 0xDB, 0x4A, 0x3F, 0xAE, 0xDC, 0x4D, 0x36, 0xA7, 0xD5, 0x44, 0x31, 0xA0, 0xD2, 0x43,
0x24, 0xB5, 0xC7, 0x56, 0x23, 0xB2, 0xC0, 0x51, 0x2A, 0xBB, 0xC9, 0x58, 0x2D, 0xBC, 0xCE, 0x5F,
0x70, 0xE1, 0x93, 0x02, 0x77, 0xE6, 0x94, 0x05, 0x7E, 0xEF, 0x9D, 0x0C, 0x79, 0xE8, 0x9A, 0x0B,
0x6C, 0xFD, 0x8F, 0x1E, 0x6B, 0xFA, 0x88, 0x19, 0x62, 0xF3, 0x81, 0x10, 0x65, 0xF4, 0x86, 0x17,
0x48, 0xD9, 0xAB, 0x3A, 0x4F, 0xDE, 0xAC, 0x3D, 0x46, 0xD7, 0xA5, 0x34, 0x41, 0xD0, 0xA2, 0x33,
0x54, 0xC5, 0xB7, 0x26, 0x53, 0xC2, 0xB0, 0x21, 0x5A, 0xCB, 0xB9, 0x28, 0x5D, 0xCC, 0xBE, 0x2F,
0xE0, 0x71, 0x03, 0x92, 0xE7, 0x76, 0x04, 0x95, 0xEE, 0x7F, 0x0D, 0x9C, 0xE9, 0x78, 0x0A, 0x9B,
0xFC, 0x6D, 0x1F, 0x8E, 0xFB, 0x6A, 0x18, 0x89, 0xF2, 0x63, 0x11, 0x80, 0xF5, 0x64, 0x16, 0x87,
0xD8, 0x49, 0x3B, 0xAA, 0xDF, 0x4E, 0x3C, 0xAD, 0xD6, 0x47, 0x35, 0xA4, 0xD1, 0x40, 0x32, 0xA3,
0xC4, 0x55, 0x27, 0xB6, 0xC3, 0x52, 0x20, 0xB1, 0xCA, 0x5B, 0x29, 0xB8, 0xCD, 0x5C, 0x2E, 0xBF,
0x90, 0x01, 0x73, 0xE2, 0x97, 0x06, 0x74, 0xE5, 0x9E, 0x0F, 0x7D, 0xEC, 0x99, 0x08, 0x7A, 0xEB,
0x8C, 0x1D, 0x6F, 0xFE, 0x8B, 0x1A, 0x68, 0xF9, 0x82, 0x13, 0x61, 0xF0, 0x85, 0x14, 0x66, 0xF7,
0xA8, 0x39, 0x4B, 0xDA, 0xAF, 0x3E, 0x4C, 0xDD, 0xA6, 0x37, 0x45, 0xD4, 0xA1, 0x30, 0x42, 0xD3,
0xB4, 0x25, 0x57, 0xC6, 0xB3, 0x22, 0x50, 0xC1, 0xBA, 0x2B, 0x59, 0xC8, 0xBD, 0x2C, 0x5E, 0xCF
};
/** Initializes the RFCOMM service, ready for new connections from a SDP client. */
void RFCOMM_Initialize(void)
{
/* Not currently used */
}
void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel)
{
BT_RFCOMM_DEBUG(1, "PACKET RECEIVED");
RFCOMM_Header_t* FrameHeader = (RFCOMM_Header_t*)Data;
/* Decode the RFCOMM frame type from the header */
switch (FrameHeader->FrameType & ~FRAME_POLL_FINAL)
{
case RFCOMM_Frame_SABM:
BT_RFCOMM_DEBUG(1, "<< SABM Received");
break;
case RFCOMM_Frame_UA:
BT_RFCOMM_DEBUG(1, "<< UA Received");
break;
case RFCOMM_Frame_DM:
BT_RFCOMM_DEBUG(1, "<< DM Received");
break;
case RFCOMM_Frame_DISC:
BT_RFCOMM_DEBUG(1, "<< DISC Received");
break;
case RFCOMM_Frame_UIH:
BT_RFCOMM_DEBUG(1, "<< UIH Received");
break;
}
}
static uint16_t RFCOMM_GetFrameDataLength(void** BufferPos)
{
uint8_t FirstOctet = *((uint8_t*)*BufferPos);
(*BufferPos)++;
uint8_t SecondOctet = 0;
if (!(FirstOctet & 0x01))
{
SecondOctet = *((uint8_t*)*BufferPos);
(*BufferPos)++;
}
return (((uint16_t)SecondOctet << 7) | (FirstOctet >> 1));
}
......@@ -38,6 +38,7 @@
/* Includes: */
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
......@@ -50,8 +51,38 @@
/* Macros: */
#define BT_RFCOMM_DEBUG(l, s, ...) do { if (RFCOMM_DEBUG_LEVEL >= l) printf_P(PSTR("(RFCOMM) " s "\r\n"), ##__VA_ARGS__); } while (0)
#define RFCOMM_DEBUG_LEVEL 2
#define FRAME_POLL_FINAL (1 << 5)
/* Enums: */
enum RFCOMM_Frame_Types_t
{
RFCOMM_Frame_SABM = 0x2F, /**< Set Asynchronous Balance Mode Field */
RFCOMM_Frame_UA = 0x63, /**< Unnumbered Acknowledgement Field */
RFCOMM_Frame_DM = 0x0F, /**< Disconnected Mode Field */
RFCOMM_Frame_DISC = 0x43, /**< Disconnect Field */
RFCOMM_Frame_UIH = 0xEF, /**< Unnumbered Information with Header check Field */
};
/* Type Defines: */
typedef struct
{
struct
{
unsigned char LogicalChannel : 6;
unsigned char CommandResponse : 1;
unsigned char LastAddressOctet : 1;
} Header;
uint8_t FrameType;
} RFCOMM_Header_t;
/* Function Prototypes: */
void RFCOMM_Initialize(void);
void RFCOMM_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel);
#if defined(INCLUDE_FROM_RFCOMM_C)
static uint16_t RFCOMM_GetFrameDataLength(void** BufferPos);
#endif
#endif
......@@ -40,6 +40,12 @@ const ServiceAttributeTable_t* SDP_Services_Table[] PROGMEM =
/** Base UUID value common to all standardized Bluetooth services */
const UUID_t BaseUUID PROGMEM = {0x00000000, BASE_80BIT_UUID};
/** Initializes the SDP service, ready for new connections from a SDP client. */
void SDP_Initialize(void)
{
/* Not currently used */
}
/** Main Service Discovery Protocol packet processing routine. This function processes incomming SDP packets from
* a connected Bluetooth device, and sends back appropriate responses to allow other devices to determine the
* services the local device exposes.
......
......@@ -38,6 +38,7 @@
/* Includes: */
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>
......@@ -210,6 +211,7 @@
}
/* Function Prototypes: */
void SDP_Initialize(void);
void SDP_ProcessPacket(void* Data, Bluetooth_Channel_t* const Channel);
#if defined(INCLUDE_FROM_SERVICEDISCOVERYPROTOCOL_C)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment