+++ /dev/null
-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2012.\r
- \r
- dean [at] fourwalledcubicle [dot] com\r
- www.lufa-lib.org\r
-*/\r
-\r
-/*\r
- Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
- Permission to use, copy, modify, distribute, and sell this \r
- software and its documentation for any purpose is hereby granted\r
- without fee, provided that the above copyright notice appear in \r
- all copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting \r
- documentation, and that the name of the author not be used in \r
- advertising or publicity pertaining to distribution of the \r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- * Bluetooth stack event callback handlers. This module handles the callback events that are\r
- * thrown from the Bluetooth stack in response to changes in the connection and channel\r
- * states.\r
- */\r
-\r
-#include "BluetoothEvents.h"\r
-\r
-/** Pointer to the opened Bluetooth ACL channel structure for RFCOMM, used to send and receive data between the\r
- * local and remote device once a RFCOMM channel has been opened.\r
- */\r
-Bluetooth_Channel_t* SerialChannel_ACL = NULL;\r
-\r
-/** Pointer to the opened RFCOMM logical channel between local and remote device, once a RFCOMM ACL channel has been\r
- * negotiated and a logical RFCOMM channel requested.\r
- */\r
-RFCOMM_Channel_t* SerialChannel_RFCOMM = NULL;\r
-\r
-/** Bluetooth stack callback event for when the Bluetooth stack has fully initialized using the attached\r
- * Bluetooth dongle.\r
- */\r
-void Bluetooth_StackInitialized(void)\r
-{\r
- printf_P(PSTR("Stack initialized with local address %02X:%02X:%02X:%02X:%02X:%02X.\r\n"),\r
- Bluetooth_State.LocalBDADDR[5], Bluetooth_State.LocalBDADDR[4], Bluetooth_State.LocalBDADDR[3],\r
- Bluetooth_State.LocalBDADDR[2], Bluetooth_State.LocalBDADDR[1], Bluetooth_State.LocalBDADDR[0]);\r
- \r
- /* Reinitialize the services placed on top of the Bluetooth stack ready for new connections */\r
- RFCOMM_Initialize();\r
-}\r
-\r
-/** Bluetooth stack callback event for a Bluetooth connection request. When this callback fires, the\r
- * user application must indicate if the connection is to be allowed or rejected.\r
- *\r
- * \param[in] RemoteAddress Bluetooth address of the remote device attempting the connection\r
- *\r
- * \return Boolean true to accept the connection, false to reject it\r
- */\r
-bool Bluetooth_ConnectionRequest(const uint8_t* RemoteAddress)\r
-{\r
- printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"),\r
- RemoteAddress[5], RemoteAddress[4], RemoteAddress[3], RemoteAddress[2],\r
- RemoteAddress[1], RemoteAddress[0]);\r
-\r
- /* Always accept connections from remote devices */\r
- return true;\r
-}\r
-\r
-/** Bluetooth stack callback event for a completed Bluetooth connection. When this callback is made,\r
- * the connection information can be accessed through the global \ref Bluetooth_Connection structure.\r
- */\r
-void Bluetooth_ConnectionComplete(void)\r
-{\r
- printf_P(PSTR("Connection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), \r
- Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4],\r
- Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2],\r
- Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]);\r
-\r
- LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
-}\r
-\r
-/** Bluetooth stack callback event for a completed Bluetooth disconnection. When this callback is made,\r
- * the connection information in the global \ref Bluetooth_Connection structure is invalidated with the\r
- * exception of the RemoteAddress element, which can be used to determine the address of the device that\r
- * was disconnected.\r
- */\r
-void Bluetooth_DisconnectionComplete(void)\r
-{\r
- printf_P(PSTR("Disconnection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), \r
- Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4],\r
- Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2],\r
- Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]);\r
-\r
- LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-}\r
-\r
-/** Bluetooth stack callback event for a Bluetooth ACL Channel connection request. When is callback fires,\r
- * the user application must indicate if the channel connection should be rejected or not, based on the \r
- * protocol (PSM) value of the requested channel.\r
- *\r
- * \param[in] PSM Protocol PSM value for the requested channel\r
- *\r
- * \return Boolean true to accept the channel connection request, false to reject it\r
- */\r
-bool Bluetooth_ChannelConnectionRequest(const uint16_t PSM)\r
-{\r
- /* Only accept connections for channels that will be used for RFCOMM or SDP data */\r
- return ((PSM == CHANNEL_PSM_RFCOMM) || (PSM == CHANNEL_PSM_SDP));\r
-}\r
-\r
-/** Bluetooth stack callback event for when a Bluetooth ACL channel has been fully created and configured,\r
- * either at the request of the local device, or the remote device.\r
- *\r
- * \param[in] ACLChannel Bluetooth ACL data channel information structure for the channel that can now be used\r
- */\r
-void Bluetooth_ChannelOpened(Bluetooth_Channel_t* const ACLChannel)\r
-{\r
- /* Save the RFCOMM channel for later use when we want to send RFCOMM data */\r
- if (ACLChannel->PSM == CHANNEL_PSM_RFCOMM)\r
- SerialChannel_ACL = ACLChannel;\r
-}\r
-\r
-/** Bluetooth stack callback event for a non-signal ACL packet reception. This callback fires once a connection\r
- * to a remote Bluetooth device has been made, and the remote device has sent a non-signaling ACL packet.\r
- *\r
- * \param[in] Data Pointer to a buffer where the received data is stored\r
- * \param[in] DataLen Length of the packet data, in bytes\r
- * \param[in] ACLChannel Bluetooth ACL data channel information structure for the packet's destination channel\r
- */\r
-void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* const ACLChannel)\r
-{\r
- /* Run the correct packet handler based on the received packet's PSM, which indicates the service being carried */\r
- switch (ACLChannel->PSM)\r
- {\r
- case CHANNEL_PSM_SDP:\r
- /* Service Discovery Protocol packet */\r
- SDP_ProcessPacket(Data, ACLChannel);\r
- break;\r
- case CHANNEL_PSM_RFCOMM:\r
- /* RFCOMM (Serial Port) Protocol packet */\r
- RFCOMM_ProcessPacket(Data, ACLChannel);\r
- break;\r
- }\r
-}\r
-\r
-/** RFCOMM layer callback for event for when a RFCOMM logical channel has been fully opened and configured between\r
- * the local and remote device. Once open, this RFCOMM channel can be read from and written to freely until is it\r
- * closed by either end.\r
- *\r
- * \param[in] RFCOMMChannel RFCOMM channel that was opened\r
- */ \r
-void RFCOMM_ChannelOpened(RFCOMM_Channel_t* const RFCOMMChannel)\r
-{\r
- /* Save the serial port RFCOMM logical channel for later use */\r
- SerialChannel_RFCOMM = RFCOMMChannel;\r
-}\r
-\r
-/** RFCOMM layer callback event for when a packet is received on an open RFCOMM channel.\r
- *\r
- * \param[in] ACLChannel RFCOMM ACL channel that the data was directed to\r
- * \param[in] DataLen Length of the received data, in bytes\r
- * \param[in] Data Pointer to a buffer where the received data is stored\r
- */\r
-void RFCOMM_DataReceived(RFCOMM_Channel_t* const ACLChannel, uint16_t DataLen, const uint8_t* Data)\r
-{\r
- /* Write the received bytes to the serial port */\r
- for (uint8_t i = 0; i < DataLen; i++)\r
- putchar(Data[i]);\r
- \r
- /* Echo the data back to the sending device */\r
- RFCOMM_SendData(DataLen, Data, SerialChannel_RFCOMM, SerialChannel_ACL);\r
-}\r
-\r
-/** RFCOMM layer callback event for when the remote device has updated the channel terminal control signals\r
- * for a particular RFCOMM channel.\r
- *\r
- * \param[in] RFCOMMChannel RFCOMM logical channel whose signals were altered\r
- */ \r
-void RFCOMM_ChannelSignalsReceived(RFCOMM_Channel_t* const RFCOMMChannel)\r
-{\r
- // Currently do nothing in response to the remote device sending new terminal control signals\r
-}\r
-