diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c index a3ca0aaa4b6ae9d4b2e639e3b0734cceabc096a0..5ed120a62a0fa49aaa83026b517b03430df2983e 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 17503ea54f53b504c0a68c965537903d7cfd4164..c2c9902141177d1af801ffe2a88fe7001f208bce 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 46d323f00fcfdf0ad6b30a4ce6f21594440f7102..f6f8f769d33fd54f4faa00d4d77447619f864300 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 2295e558cd510257efa0b068627a28110c499f7a..f64bba016be5b648fb226b37565b1ab25580c7a6 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 1cc0d9242d2ee3e2d2a1b81abb0f3f779a9171ab..b529ea48304b1eea2e3c289471cb97c42c62c8e8 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h @@ -35,8 +35,6 @@ #include <LUFA/Drivers/USB/USB.h> #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;