Add packet reception and send routines to the ACL layer of the incomplete Bluetooth Host demo.
This commit is contained in:
		
							parent
							
								
									ee74b4948f
								
							
						
					
					
						commit
						b9c7d19615
					
				
					 5 changed files with 68 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -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");	
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue