From b9c7d196152652df918a822522061c3fe193d273 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 6 Apr 2010 03:56:45 +0000 Subject: Add packet reception and send routines to the ACL layer of the incomplete Bluetooth Host demo. --- .../Host/Incomplete/BluetoothHost/BluetoothHost.c | 33 +++++++++++++++++++++ .../BluetoothHost/Lib/BluetoothACLPackets.c | 34 +++++++++++++++------- .../BluetoothHost/Lib/BluetoothACLPackets.h | 3 +- .../BluetoothHost/Lib/BluetoothHCICommands.h | 4 --- .../Incomplete/BluetoothHost/Lib/BluetoothStack.h | 11 +++++-- 5 files changed, 68 insertions(+), 17 deletions(-) (limited to 'Demos/Host/Incomplete') diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c index a3ca0aaa4..5ed120a62 100644 --- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c @@ -196,6 +196,13 @@ void Bluetooth_Host_Task(void) } } +/** Bluetooth stack callback event for a Bluetooth connection request. When this callback fires, the + * user application must indicate if the connection is to be allowed or rejected. + * + * \param RemoteAddress Bluetooth address of the remote device attempting the connection + * + * \return Boolean true to accept the connection, false to reject it + */ bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress) { printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), @@ -207,6 +214,9 @@ bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress) return true; } +/** Bluetooth stack callback event for a completed Bluetooth connection. When this callback is made, + * the connection information can be accessed through the global \ref Bluetooth_Connection structure. + */ void Bluetooth_ConnectionComplete(void) { printf_P(PSTR("Connection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), @@ -215,6 +225,11 @@ void Bluetooth_ConnectionComplete(void) Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); } +/** Bluetooth stack callback event for a completed Bluetooth disconnection. When this callback is made, + * the connection information in the global \ref Bluetooth_Connection structure is invalidated with the + * exception of the RemoteAddress element, which can be used to determine the address of the device that + * was disconnected. + */ void Bluetooth_DisconnectionComplete(void) { printf_P(PSTR("Disconnection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X\r\n"), @@ -222,3 +237,21 @@ void Bluetooth_DisconnectionComplete(void) Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); } + +/** Bluetooth stack callback event for a non-signal ACL packet reception. This callback fires once a connection + * to a remote Bluetooth device has been made, and the remote device has sent a non-signalling ACL packet. + * + * \param PacketLength Length of the packet data, in bytes - this must be decremented as data is read + * \param Channel Bluetooth ACL data channel information structure for the packet's destination channel + */ +void Bluetooth_PacketReceived(uint16_t* PacketLength, Bluetooth_Channel_t* Channel) +{ + uint8_t DataPayload[*PacketLength]; + Pipe_Read_Stream_LE(&DataPayload, *PacketLength); + *PacketLength = 0; + + BT_ACL_DEBUG("-- Data Payload: ", NULL); + for (uint16_t B = 0; B < sizeof(DataPayload); B++) + printf("0x%02X ", DataPayload[B]); + printf("\r\n"); +} diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c index 17503ea54..c2c990214 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c @@ -91,21 +91,35 @@ void Bluetooth_ProcessACLPackets(void) } else { - uint8_t DataPayload[DataHeader.PayloadLength]; - Pipe_Read_Stream_LE(&DataPayload, sizeof(DataPayload)); - DataHeader.PayloadLength = 0; + Bluetooth_PacketReceived(&DataHeader.PayloadLength, Bluetooth_GetChannelData(DataHeader.DestinationChannel, true)); - BT_ACL_DEBUG("-- Data Payload: ", NULL); - for (uint16_t B = 0; B < sizeof(DataPayload); B++) - printf("0x%02X ", DataPayload[B]); - printf("\r\n"); - - Pipe_Discard_Stream(ACLPacketHeader.DataLength); - Pipe_ClearIN(); + Pipe_SelectPipe(BLUETOOTH_DATA_IN_PIPE); + Pipe_Discard_Stream(DataHeader.PayloadLength); + Pipe_ClearIN(); Pipe_Freeze(); } } +void Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel) +{ + Bluetooth_ACL_Header_t ACLPacketHeader; + Bluetooth_DataPacket_Header_t DataHeader; + + ACLPacketHeader.ConnectionHandle = Bluetooth_Connection.ConnectionHandle; + ACLPacketHeader.DataLength = sizeof(DataHeader) + DataLen; + DataHeader.PayloadLength = DataLen; + DataHeader.DestinationChannel = Channel->RemoteNumber; + + Pipe_SelectPipe(BLUETOOTH_DATA_OUT_PIPE); + Pipe_Unfreeze(); + + Pipe_Write_Stream_LE(&ACLPacketHeader, sizeof(ACLPacketHeader)); + Pipe_Write_Stream_LE(&DataHeader, sizeof(DataHeader)); + Pipe_Write_Stream_LE(Data, DataLen); + + Pipe_Freeze(); +} + static inline void Bluetooth_SignalPacket_ConnectionRequest(Bluetooth_ACL_Header_t* ACLPacketHeader, Bluetooth_DataPacket_Header_t* DataHeader, Bluetooth_SignalCommand_Header_t* SignalCommandHeader) diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h index 46d323f00..f6f8f769d 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.h @@ -143,7 +143,8 @@ /* Function Prototypes: */ void Bluetooth_ProcessACLPackets(void); - + void Bluetooth_SendPacket(uint8_t* Data, uint16_t DataLen, Bluetooth_Channel_t* Channel); + #if defined(INCLUDE_FROM_BLUETOOTH_ACLPACKETS_C) static inline void Bluetooth_SignalPacket_ConnectionRequest(Bluetooth_ACL_Header_t* ACLPacketHeader, Bluetooth_DataPacket_Header_t* DataHeader, diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h index 2295e558c..f64bba016 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h @@ -190,10 +190,6 @@ /* Function Prototypes: */ void Bluetooth_ProcessHCICommands(void); void Bluetooth_ProcessHCIEvents(void); - - bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress); - void Bluetooth_ConnectionComplete(void); - void Bluetooth_DisconnectionComplete(void); #if defined(INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C) static uint8_t Bluetooth_SendHCICommand(void* Parameters, uint16_t ParameterLength); diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h index 1cc0d9242..b529ea483 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h @@ -35,8 +35,6 @@ #include #include "BluetoothHost.h" - #include "BluetoothHCICommands.h" - #include "BluetoothACLPackets.h" /* Macros: */ #define BLUETOOTH_DATA_IN_PIPE 1 @@ -84,6 +82,10 @@ char PINCode[16]; char Name[]; } Bluetooth_Device_t; + + /* Includes: */ + #include "BluetoothHCICommands.h" + #include "BluetoothACLPackets.h" /* Function Prototypes: */ Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource); @@ -92,6 +94,11 @@ void Bluetooth_Stack_Init(void); void Bluetooth_Stack_USBTask(void); + bool Bluetooth_ConnectionRequest(uint8_t* RemoteAddress); + void Bluetooth_ConnectionComplete(void); + void Bluetooth_DisconnectionComplete(void); + void Bluetooth_PacketReceived(uint16_t* PacketLength, Bluetooth_Channel_t* Channel); + /* External Variables: */ extern Bluetooth_Device_t Bluetooth_DeviceConfiguration; extern Bluetooth_Connection_t Bluetooth_Connection; -- cgit v1.2.3