diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c new file mode 100644 index 0000000000..17cf7ede4e --- /dev/null +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.c @@ -0,0 +1,156 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Bluetooth stack event callback handlers. This module handles the callback events that are + * thrown from the Bluetooth stack in response to changes in the connection and channel + * states. + */ + +#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. + */ +Bluetooth_Channel_t* RFCOMMChannel = NULL; + + +/** Bluetooth stack callback event for when the Bluetooth stack has fully initialized using the attached + * Bluetooth dongle. + */ +void Bluetooth_StackInitialized(void) +{ + printf_P(PSTR("Stack initialized with local address %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), + Bluetooth_State.LocalBDADDR[5], Bluetooth_State.LocalBDADDR[4], Bluetooth_State.LocalBDADDR[3], + Bluetooth_State.LocalBDADDR[2], Bluetooth_State.LocalBDADDR[1], Bluetooth_State.LocalBDADDR[0]); + + /* Reinitialize the services placed on top of the Bluetooth stack ready for new connections */ + RFCOMM_Initialize(); +} + +/** 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[in] RemoteAddress Bluetooth address of the remote device attempting the connection + * + * \return Boolean true to accept the connection, false to reject it + */ +bool Bluetooth_ConnectionRequest(const uint8_t* RemoteAddress) +{ + printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), + RemoteAddress[5], RemoteAddress[4], RemoteAddress[3], RemoteAddress[2], + RemoteAddress[1], RemoteAddress[0]); + + /* Always accept connections from remote devices */ + 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"), + Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4], + Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], + Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); + + LEDs_SetAllLEDs(LEDMASK_USB_BUSY); +} + +/** 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"), + Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4], + Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], + Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); + + LEDs_SetAllLEDs(LEDMASK_USB_READY); +} + +/** Bluetooth stack callback event for a Bluetooth ACL Channel connection request. When is callback fires, + * the user application must indicate if the channel connection should be rejected or not, based on the + * protocol (PSM) value of the requested channel. + * + * \param[in] PSM Protocol PSM value for the requested channel + * + * \return Boolean true to accept the channel connection request, false to reject it + */ +bool Bluetooth_ChannelConnectionRequest(const uint16_t PSM) +{ + /* Always accept channel connection requests regardless of PSM */ + return true; +} + +/** 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 + */ +void Bluetooth_ChannelOpened(Bluetooth_Channel_t* const Channel) +{ + /* Save the RFCOMM channel for later use when we want to send RFCOMM data */ + if (Channel->PSM == CHANNEL_PSM_RFCOMM) + RFCOMMChannel = Channel; +} + +/** 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[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 + */ +void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* const Channel) +{ + /* Run the correct packet handler based on the received packet's PSM, which indicates the service being carried */ + switch (Channel->PSM) + { + case CHANNEL_PSM_SDP: + /* Service Discovery Protocol packet */ + SDP_ProcessPacket(Data, Channel); + 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); + break; + } +} diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.h b/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.h new file mode 100644 index 0000000000..1cb104a934 --- /dev/null +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothEvents.h @@ -0,0 +1,70 @@ +/* + LUFA Library + Copyright (C) Dean Camera, 2010. + + dean [at] fourwalledcubicle [dot] com + www.fourwalledcubicle.com +*/ + +/* + Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com) + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that the above copyright notice appear in + all copies and that both that the copyright notice and this + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the + software without specific, written prior permission. + + The author disclaim all warranties with regard to this + software, including all implied warranties of merchantability + and fitness. In no event shall the author be liable for any + special, indirect or consequential damages or any damages + whatsoever resulting from loss of use, data or profits, whether + in an action of contract, negligence or other tortious action, + arising out of or in connection with the use or performance of + this software. +*/ + +/** \file + * + * Header file for BluetoothEvents.c. + */ + +#ifndef _BLUETOOTH_EVENTS_H_ +#define _BLUETOOTH_EVENTS_H_ + + /* Includes: */ + #include + #include + + #include "BluetoothHost.h" + #include "Lib/BluetoothStack.h" + #include "Lib/SDP.h" + #include "Lib/RFCOMM.h" + + #include + #include + + /* Macros: */ + /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ + #define LEDMASK_USB_NOTREADY LEDS_LED1 + + /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ + #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3) + + /** LED mask for the library LED driver, to indicate that the USB interface is ready. */ + #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4) + + /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ + #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3) + + /** LED mask for the library LED driver, to indicate that the USB interface is busy. */ + #define LEDMASK_USB_BUSY LEDS_LED2 + + /* External Variables: */ + extern Bluetooth_Channel_t* RFCOMMChannel; + +#endif diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c index 2ad3ed5154..486a023f95 100644 --- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c @@ -58,17 +58,11 @@ int main(void) for (;;) { - if (Bluetooth_Connection.IsConnected) - { - Bluetooth_Channel_t* RFCOMMChannel = Bluetooth_GetChannelData(CHANNEL_PSM_RFCOMM, CHANNEL_SEARCH_PSM); - - /* If an RFCOMM channel is open, service the RFCOMM logical channels */ - if (RFCOMMChannel) - RFCOMM_ServiceChannels(RFCOMMChannel); - } + if ((RFCOMMChannel != NULL) && (RFCOMMChannel->State == BT_Channel_Open)) + RFCOMM_ServiceChannels(RFCOMMChannel); - Bluetooth_Stack_USBTask(); Bluetooth_Host_Task(); + Bluetooth_Stack_USBTask(); USB_USBTask(); } } @@ -213,103 +207,3 @@ void Bluetooth_Host_Task(void) break; } } - -/** Bluetooth stack callback event for when the Bluetooth stack has fully initialized using the attached - * Bluetooth dongle. - */ -void Bluetooth_StackInitialized(void) -{ - printf_P(PSTR("Stack initialized with local address %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), - Bluetooth_State.LocalBDADDR[5], Bluetooth_State.LocalBDADDR[4], Bluetooth_State.LocalBDADDR[3], - Bluetooth_State.LocalBDADDR[2], Bluetooth_State.LocalBDADDR[1], Bluetooth_State.LocalBDADDR[0]); - - /* Reinitialize the services placed on top of the Bluetooth stack ready for new connections */ - RFCOMM_Initialize(); -} - -/** 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[in] RemoteAddress Bluetooth address of the remote device attempting the connection - * - * \return Boolean true to accept the connection, false to reject it - */ -bool Bluetooth_ConnectionRequest(const uint8_t* RemoteAddress) -{ - printf_P(PSTR("Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X.\r\n"), - RemoteAddress[5], RemoteAddress[4], RemoteAddress[3], RemoteAddress[2], - RemoteAddress[1], RemoteAddress[0]); - - /* Always accept connections from remote devices */ - 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"), - Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4], - Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], - Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); - - LEDs_SetAllLEDs(LEDMASK_USB_BUSY); -} - -/** 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"), - Bluetooth_Connection.RemoteAddress[5], Bluetooth_Connection.RemoteAddress[4], - Bluetooth_Connection.RemoteAddress[3], Bluetooth_Connection.RemoteAddress[2], - Bluetooth_Connection.RemoteAddress[1], Bluetooth_Connection.RemoteAddress[0]); - - LEDs_SetAllLEDs(LEDMASK_USB_READY); -} - -/** Bluetooth stack callback event for a Bluetooth ACL Channel connection request. When is callback fires, - * the user application must indicate if the channel connection should be rejected or not, based on the - * protocol (PSM) value of the requested channel. - * - * \param[in] PSM Protocol PSM value for the requested channel - * - * \return Boolean true to accept the channel connection request, false to reject it - */ -bool Bluetooth_ChannelConnectionRequest(const uint16_t PSM) -{ - /* Always accept channel connection requests regardless of PSM */ - return true; -} - -/** 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[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 - */ -void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* const Channel) -{ - /* Run the correct packet handler based on the received packet's PSM, which indicates the service being carried */ - switch (Channel->PSM) - { - case CHANNEL_PSM_SDP: - /* Service Discovery Protocol packet */ - SDP_ProcessPacket(Data, Channel); - 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); - break; - } -} diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h index 893b9466c3..e0de59ae25 100644 --- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h +++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h @@ -44,12 +44,10 @@ #include #include - #include "Lib/BluetoothStack.h" - #include "Lib/SDP.h" - #include "Lib/RFCOMM.h" - + #include "BluetoothEvents.h" #include "DeviceDescriptor.h" #include "ConfigDescriptor.h" + #include "Lib/BluetoothStack.h" #include #include diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c index ec85aab6cc..d4b951da53 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothACLPackets.c @@ -552,6 +552,7 @@ static inline void Bluetooth_Signal_ConfigurationReq(const BT_Signal_Header_t* c break; case BT_Channel_Config_WaitReq: ChannelData->State = BT_Channel_Open; + Bluetooth_ChannelOpened(ChannelData); break; } } @@ -594,6 +595,7 @@ static inline void Bluetooth_Signal_ConfigurationResp(const BT_Signal_Header_t* break; case BT_Channel_Config_WaitResp: ChannelData->State = BT_Channel_Open; + Bluetooth_ChannelOpened(ChannelData); break; } } diff --git a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h index 131c4aaf21..c1c938636c 100644 --- a/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h +++ b/Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h @@ -156,6 +156,8 @@ void Bluetooth_DisconnectionComplete(void); bool Bluetooth_ChannelConnectionRequest(const uint16_t PSM); void Bluetooth_PacketReceived(void* Data, uint16_t DataLen, Bluetooth_Channel_t* const Channel); + void Bluetooth_ChannelOpened(Bluetooth_Channel_t* const Channel); + Bluetooth_Channel_t* Bluetooth_GetChannelData(const uint16_t SearchValue, const uint8_t SearchKey); Bluetooth_Channel_t* Bluetooth_OpenChannel(const uint16_t PSM); void Bluetooth_CloseChannel(Bluetooth_Channel_t* const Channel); diff --git a/Demos/Host/Incomplete/BluetoothHost/makefile b/Demos/Host/Incomplete/BluetoothHost/makefile index 0281f86a56..946e500464 100644 --- a/Demos/Host/Incomplete/BluetoothHost/makefile +++ b/Demos/Host/Incomplete/BluetoothHost/makefile @@ -130,6 +130,7 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ + BluetoothEvents.c \ DeviceDescriptor.c \ ConfigDescriptor.c \ Lib/BluetoothStack.c \ diff --git a/LUFA.pnproj b/LUFA.pnproj index 64651b1804..e694327ae0 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Projects/AVRISP-MKII/makefile b/Projects/AVRISP-MKII/makefile index ff03706174..adb6495297 100644 --- a/Projects/AVRISP-MKII/makefile +++ b/Projects/AVRISP-MKII/makefile @@ -126,10 +126,10 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENAB # List C source files here. (C dependencies are automatically generated.) SRC = $(TARGET).c \ Descriptors.c \ - Lib/V2Protocol.c \ - Lib/V2ProtocolParams.c \ - Lib/ISP/ISPProtocol.c \ - Lib/ISP/ISPTarget.c \ + Lib/V2Protocol.c \ + Lib/V2ProtocolParams.c \ + Lib/ISP/ISPProtocol.c \ + Lib/ISP/ISPTarget.c \ Lib/XPROG/XPROGProtocol.c \ Lib/XPROG/XPROGTarget.c \ Lib/XPROG/XMEGANVM.c \