X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/70983caea5dc6d817c3a887d66a2f43fce535bbd..ca007f91f2aa959a738649d35becb54cb1efc8b8:/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c index 17cf7ede4..543e1b879 100644 --- a/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c @@ -37,11 +37,15 @@ #include "BluetoothEvents.h" -/** Bluetooth RFCOMM channel structure - used to send and receive RFCOMM data between the local and remote - * device once a RFCOMM channel has been opened. +/** Pointer to the opened Bluetooth ACL channel structure for RFCOMM, used to send and receive data between the + * local and remote device once a RFCOMM channel has been opened. */ -Bluetooth_Channel_t* RFCOMMChannel = NULL; +Bluetooth_Channel_t* SerialChannel_ACL = NULL; +/** Pointer to the opened RFCOMM logical channel between local and remote device, once a RFCOMM ACL channel has been + * negotiated and a logical RFCOMM channel requested. + */ +RFCOMM_Channel_t* SerialChannel_RFCOMM = NULL; /** Bluetooth stack callback event for when the Bluetooth stack has fully initialized using the attached * Bluetooth dongle. @@ -111,46 +115,79 @@ void Bluetooth_DisconnectionComplete(void) */ bool Bluetooth_ChannelConnectionRequest(const uint16_t PSM) { - /* Always accept channel connection requests regardless of PSM */ - return true; + /* Only accept connections for channels that will be used for RFCOMM or SDP data */ + return ((PSM == CHANNEL_PSM_RFCOMM) || (PSM == CHANNEL_PSM_SDP)); } /** Bluetooth stack callback event for when a Bluetooth ACL channel has been fully created and configured, * either at the request of the local device, or the remote device. * - * \param[in] Channel Bluetooth ACL data channel information structure for the channel that can now be used + * \param[in] ACLChannel Bluetooth ACL data channel information structure for the channel that can now be used */ -void Bluetooth_ChannelOpened(Bluetooth_Channel_t* const Channel) +void Bluetooth_ChannelOpened(Bluetooth_Channel_t* const ACLChannel) { /* Save the RFCOMM channel for later use when we want to send RFCOMM data */ - if (Channel->PSM == CHANNEL_PSM_RFCOMM) - RFCOMMChannel = Channel; + if (ACLChannel->PSM == CHANNEL_PSM_RFCOMM) + SerialChannel_ACL = ACLChannel; } /** 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. + * to a remote Bluetooth device has been made, and the remote device has sent a non-signaling ACL packet. * - * \param[in] Data Pointer to a buffer where the received data is stored - * \param[in] DataLen Length of the packet data, in bytes - * \param[in] Channel Bluetooth ACL data channel information structure for the packet's destination channel + * \param[in] Data Pointer to a buffer where the received data is stored + * \param[in] DataLen Length of the packet data, in bytes + * \param[in] ACLChannel Bluetooth ACL data channel information structure for the packet's destination channel */ -void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* const Channel) +void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* const ACLChannel) { /* Run the correct packet handler based on the received packet's PSM, which indicates the service being carried */ - switch (Channel->PSM) + switch (ACLChannel->PSM) { case CHANNEL_PSM_SDP: /* Service Discovery Protocol packet */ - SDP_ProcessPacket(Data, Channel); + SDP_ProcessPacket(Data, ACLChannel); break; case CHANNEL_PSM_RFCOMM: /* RFCOMM (Serial Port) Protocol packet */ - RFCOMM_ProcessPacket(Data, Channel); - break; - default: - /* Unknown Protocol packet */ - printf_P(PSTR("Unknown Packet Received (Channel 0x%04X, PSM: 0x%02X, Len: 0x%04X):\r\n"), - Channel->LocalNumber, Channel->PSM, DataLen); + RFCOMM_ProcessPacket(Data, ACLChannel); break; } } + +/** RFCOMM layer callback for event for when a RFCOMM logical channel has been fully opened and configured between + * the local and remote device. Once open, this RFCOMM channel can be read from and written to freely until is it + * closed by either end. + * + * \param[in] RFCOMMChannel RFCOMM channel that was opened + */ +void RFCOMM_ChannelOpened(RFCOMM_Channel_t* const RFCOMMChannel) +{ + /* Save the serial port RFCOMM logical channel for later use */ + SerialChannel_RFCOMM = RFCOMMChannel; +} + +/** RFCOMM layer callback event for when a packet is received on an open RFCOMM channel. + * + * \param[in] ACLChannel RFCOMM ACL channel that the data was directed to + * \param[in] DataLen Length of the received data, in bytes + * \param[in] Data Pointer to a buffer where the received data is stored + */ +void RFCOMM_DataReceived(RFCOMM_Channel_t* const ACLChannel, uint16_t DataLen, const uint8_t* Data) +{ + /* Write the received bytes to the serial port */ + for (uint8_t i = 0; i < DataLen; i++) + putchar(Data[i]); + + /* Echo the data back to the sending device */ + RFCOMM_SendData(DataLen, Data, SerialChannel_RFCOMM, SerialChannel_ACL); +} + +/** RFCOMM layer callback event for when the remote device has updated the channel terminal control signals + * for a particular RFCOMM channel. + * + * \param[in] RFCOMMChannel RFCOMM logical channel whose signals were altered + */ +void RFCOMM_ChannelSignalsReceived(RFCOMM_Channel_t* const RFCOMMChannel) +{ + // Currently do nothing in response to the remote device sending new terminal control signals +}