3      Copyright (C) Dean Camera, 2012. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this  
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in  
  15   all copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting  
  17   documentation, and that the name of the author not be used in  
  18   advertising or publicity pertaining to distribution of the  
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  33  *  Bluetooth stack event callback handlers. This module handles the callback events that are 
  34  *  thrown from the Bluetooth stack in response to changes in the connection and channel 
  38 #include "BluetoothEvents.h" 
  40 /** Pointer to the opened Bluetooth ACL channel structure for RFCOMM, used to send and receive data between the 
  41  *  local and remote device once a RFCOMM channel has been opened. 
  43 Bluetooth_Channel_t
* SerialChannel_ACL    
= NULL
; 
  45 /** Pointer to the opened RFCOMM logical channel between local and remote device, once a RFCOMM ACL channel has been 
  46  *  negotiated and a logical RFCOMM channel requested. 
  48 RFCOMM_Channel_t
*    SerialChannel_RFCOMM 
= NULL
; 
  50 /** Bluetooth stack callback event for when the Bluetooth stack has fully initialized using the attached 
  53 void Bluetooth_StackInitialized(void) 
  55         printf_P(PSTR("Stack initialized with local address %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), 
  56                  Bluetooth_State
.LocalBDADDR
[5], Bluetooth_State
.LocalBDADDR
[4], Bluetooth_State
.LocalBDADDR
[3], 
  57                  Bluetooth_State
.LocalBDADDR
[2], Bluetooth_State
.LocalBDADDR
[1], Bluetooth_State
.LocalBDADDR
[0]); 
  59         /* Reinitialize the services placed on top of the Bluetooth stack ready for new connections */ 
  63 /** Bluetooth stack callback event for a Bluetooth connection request. When this callback fires, the 
  64  *  user application must indicate if the connection is to be allowed or rejected. 
  66  *  \param[in] RemoteAddress  Bluetooth address of the remote device attempting the connection 
  68  *  \return Boolean true to accept the connection, false to reject it 
  70 bool Bluetooth_ConnectionRequest(const uint8_t* RemoteAddress
) 
  72         printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), 
  73                  RemoteAddress
[5], RemoteAddress
[4], RemoteAddress
[3], RemoteAddress
[2], 
  74                  RemoteAddress
[1], RemoteAddress
[0]); 
  76         /* Always accept connections from remote devices */ 
  80 /** Bluetooth stack callback event for a completed Bluetooth connection. When this callback is made, 
  81  *  the connection information can be accessed through the global \ref Bluetooth_Connection structure. 
  83 void Bluetooth_ConnectionComplete(void) 
  85         printf_P(PSTR("Connection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"),  
  86                  Bluetooth_Connection
.RemoteAddress
[5], Bluetooth_Connection
.RemoteAddress
[4], 
  87                  Bluetooth_Connection
.RemoteAddress
[3], Bluetooth_Connection
.RemoteAddress
[2], 
  88                  Bluetooth_Connection
.RemoteAddress
[1], Bluetooth_Connection
.RemoteAddress
[0]); 
  90         LEDs_SetAllLEDs(LEDMASK_USB_BUSY
); 
  93 /** Bluetooth stack callback event for a completed Bluetooth disconnection. When this callback is made, 
  94  *  the connection information in the global \ref Bluetooth_Connection structure is invalidated with the 
  95  *  exception of the RemoteAddress element, which can be used to determine the address of the device that 
  98 void Bluetooth_DisconnectionComplete(void) 
 100         printf_P(PSTR("Disconnection Complete to Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"),  
 101                  Bluetooth_Connection
.RemoteAddress
[5], Bluetooth_Connection
.RemoteAddress
[4], 
 102                  Bluetooth_Connection
.RemoteAddress
[3], Bluetooth_Connection
.RemoteAddress
[2], 
 103                  Bluetooth_Connection
.RemoteAddress
[1], Bluetooth_Connection
.RemoteAddress
[0]); 
 105         LEDs_SetAllLEDs(LEDMASK_USB_READY
); 
 108 /** Bluetooth stack callback event for a Bluetooth ACL Channel connection request. When is callback fires, 
 109  *  the user application must indicate if the channel connection should be rejected or not, based on the  
 110  *  protocol (PSM) value of the requested channel. 
 112  *  \param[in] PSM  Protocol PSM value for the requested channel 
 114  *  \return Boolean true to accept the channel connection request, false to reject it 
 116 bool Bluetooth_ChannelConnectionRequest(const uint16_t PSM
) 
 118         /* Only accept connections for channels that will be used for RFCOMM or SDP data */ 
 119         return ((PSM 
== CHANNEL_PSM_RFCOMM
) || (PSM 
== CHANNEL_PSM_SDP
)); 
 122 /** Bluetooth stack callback event for when a Bluetooth ACL channel has been fully created and configured, 
 123  *  either at the request of the local device, or the remote device. 
 125  *  \param[in] ACLChannel  Bluetooth ACL data channel information structure for the channel that can now be used 
 127 void Bluetooth_ChannelOpened(Bluetooth_Channel_t
* const ACLChannel
) 
 129         /* Save the RFCOMM channel for later use when we want to send RFCOMM data */ 
 130         if (ACLChannel
->PSM 
== CHANNEL_PSM_RFCOMM
) 
 131           SerialChannel_ACL 
= ACLChannel
; 
 134 /** Bluetooth stack callback event for a non-signal ACL packet reception. This callback fires once a connection 
 135  *  to a remote Bluetooth device has been made, and the remote device has sent a non-signaling ACL packet. 
 137  *  \param[in] Data        Pointer to a buffer where the received data is stored 
 138  *  \param[in] DataLen     Length of the packet data, in bytes 
 139  *  \param[in] ACLChannel  Bluetooth ACL data channel information structure for the packet's destination channel 
 141 void Bluetooth_PacketReceived(void* Data
, uint16_t DataLen
, Bluetooth_Channel_t
* const ACLChannel
) 
 143         /* Run the correct packet handler based on the received packet's PSM, which indicates the service being carried */ 
 144         switch (ACLChannel
->PSM
) 
 146                 case CHANNEL_PSM_SDP
: 
 147                         /* Service Discovery Protocol packet */ 
 148                         SDP_ProcessPacket(Data
, ACLChannel
); 
 150                 case CHANNEL_PSM_RFCOMM
: 
 151                         /* RFCOMM (Serial Port) Protocol packet */ 
 152                         RFCOMM_ProcessPacket(Data
, ACLChannel
); 
 157 /** RFCOMM layer callback for event for when a RFCOMM logical channel has been fully opened and configured between 
 158  *  the local and remote device. Once open, this RFCOMM channel can be read from and written to freely until is it 
 159  *  closed by either end. 
 161  *  \param[in] RFCOMMChannel  RFCOMM channel that was opened 
 163 void RFCOMM_ChannelOpened(RFCOMM_Channel_t
* const RFCOMMChannel
) 
 165         /* Save the serial port RFCOMM logical channel for later use */ 
 166         SerialChannel_RFCOMM 
= RFCOMMChannel
; 
 169 /** RFCOMM layer callback event for when a packet is received on an open RFCOMM channel. 
 171  *  \param[in] ACLChannel  RFCOMM ACL channel that the data was directed to 
 172  *  \param[in] DataLen     Length of the received data, in bytes 
 173  *  \param[in] Data        Pointer to a buffer where the received data is stored 
 175 void RFCOMM_DataReceived(RFCOMM_Channel_t
* const ACLChannel
, uint16_t DataLen
, const uint8_t* Data
) 
 177         /* Write the received bytes to the serial port */ 
 178         for (uint8_t i 
= 0; i 
< DataLen
; i
++) 
 181         /* Echo the data back to the sending device */ 
 182         RFCOMM_SendData(DataLen
, Data
, SerialChannel_RFCOMM
, SerialChannel_ACL
); 
 185 /** RFCOMM layer callback event for when the remote device has updated the channel terminal control signals 
 186  *  for a particular RFCOMM channel. 
 188  *  \param[in] RFCOMMChannel  RFCOMM logical channel whose signals were altered 
 190 void RFCOMM_ChannelSignalsReceived(RFCOMM_Channel_t
* const RFCOMMChannel
) 
 192         // Currently do nothing in response to the remote device sending new terminal control signals