Add user callback function to the Bluetooth host demo to filter out connections from...
authorDean Camera <dean@fourwalledcubicle.com>
Mon, 5 Apr 2010 08:09:12 +0000 (08:09 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Mon, 5 Apr 2010 08:09:12 +0000 (08:09 +0000)
Clean up RelayBoard project code.

Make AVRISP project clear the XMEGA target's reset register twice; this does not appear to take affect properly the first time under some circumstances.

Demos/Host/Incomplete/BluetoothHost/BluetoothHost.c
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.c
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothHCICommands.h
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.h
LUFA/ManPages/LibraryResources.txt
Projects/AVRISP-MKII/Descriptors.h
Projects/AVRISP-MKII/Lib/XPROG/XPROGProtocol.c
Projects/RelayBoard/RelayBoard.c

index 312d716..338997f 100644 (file)
 \r
 #include "BluetoothHost.h"\r
 \r
-Bluetooth_Device_t Bluetooth_DeviceConfiguration =\r
-       {\r
-               Class:   (DEVICE_CLASS_SERVICE_CAPTURING | DEVICE_CLASS_MAJOR_COMPUTER | DEVICE_CLASS_MINOR_COMPUTER_PALM),\r
-               PINCode: "0000",\r
-               Name:    "LUFA Bluetooth Demo"\r
-       };\r
-\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
  *  enters a loop to run the application tasks in sequence.\r
  */\r
@@ -56,7 +49,7 @@ int main(void)
 \r
        for (;;)\r
        {\r
-               Bluetooth_Stack_Task();\r
+               Bluetooth_Stack_USBTask();\r
                Bluetooth_Host_Task();\r
                USB_USBTask();\r
        }\r
@@ -196,7 +189,7 @@ void Bluetooth_Host_Task(void)
                        puts_P(PSTR("Bluetooth Dongle Enumerated.\r\n"));\r
                        \r
                        /* Initialize the Bluetooth stack */\r
-                       Bluetooth_State_Init();\r
+                       Bluetooth_Stack_Init();\r
 \r
                        USB_HostState = HOST_STATE_Configured;\r
                        break;\r
index dd2a3e5..a6e59d6 100644 (file)
@@ -109,10 +109,13 @@ void Bluetooth_ProcessHCICommands(void)
                                                memcpy(Bluetooth_TempDeviceAddress,\r
                                                       &((Bluetooth_HCIEvent_ConnectionRequest_t*)&EventParams)->RemoteAddress,\r
                                                       sizeof(Bluetooth_TempDeviceAddress));\r
-                                       \r
-                                               /* Only accept the connection if it is a ACL (data) connection */\r
-                                               Bluetooth_HCIProcessingState = (Bluetooth_Connection.IsConnected ||\r
-                                                                              (((Bluetooth_HCIEvent_ConnectionRequest_t*)&EventParams)->LinkType != 0x01)) ?\r
+                                                          \r
+                                               bool IsACLConnection = (((Bluetooth_HCIEvent_ConnectionRequest_t*)&EventParams)->LinkType == 0x01);\r
+\r
+                                               /* Only accept the connection if it is a ACL (data) connection, a device is not already connected\r
+                                                  and the user application has indicated that the connection should be allowed */\r
+                                               Bluetooth_HCIProcessingState = (Bluetooth_Connection.IsConnected || !(IsACLConnection) ||\r
+                                                                                                           !(CALLBACK_Bluetooth_ConnectionRequest(Bluetooth_TempDeviceAddress))) ?\r
                                                                                                           Bluetooth_Conn_RejectConnection : Bluetooth_Conn_AcceptConnection;\r
 \r
                                                BT_HCI_DEBUG(">> Connection Request from Device %02X:%02X:%02X:%02X:%02X:%02X",\r
@@ -261,10 +264,10 @@ void Bluetooth_ProcessHCICommands(void)
                        BT_HCI_DEBUG("Enter State: Bluetooth_Conn_RejectConnection", NULL);\r
 \r
                        /* Copy over the temporary BT device address saved from the Connection Request event, indicate failure\r
-                          to accept the connection due to limited device resources */\r
+                          to accept the connection due to limited device resources or incorrect device address */\r
                        Bluetooth_HCICommand_RejectConnectionRequest_t RejectConnectionParams;\r
                        memcpy(RejectConnectionParams.RemoteAddress, Bluetooth_TempDeviceAddress, sizeof(RejectConnectionParams.RemoteAddress));\r
-                       RejectConnectionParams.Reason = ERROR_LIMITED_RESOURCES;\r
+                       RejectConnectionParams.Reason = Bluetooth_Connection.IsConnected ? ERROR_LIMITED_RESOURCES : ERROR_UNACCEPTABLE_BDADDR;\r
 \r
                        /* Send the command to reject the remote connection request */\r
                        Bluetooth_SendHCICommand(&RejectConnectionParams, sizeof(Bluetooth_HCICommand_RejectConnectionRequest_t));\r
index 4df5861..317ebc7 100644 (file)
@@ -83,6 +83,7 @@
                #define EVENT_PIN_CODE_REQUEST                         0x16\r
                \r
                #define ERROR_LIMITED_RESOURCES                        0x0D\r
+               #define ERROR_UNACCEPTABLE_BDADDR                      0x0F\r
                \r
        /* Type Defines: */\r
                typedef struct\r
        /* Function Prototypes: */\r
                void Bluetooth_ProcessHCICommands(void);\r
                void Bluetooth_ProcessHCIEvents(void);\r
+               \r
+               bool CALLBACK_Bluetooth_ConnectionRequest(uint8_t* RemoteAddress);\r
 \r
                #if defined(INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C)\r
                        static uint8_t Bluetooth_SendHCICommand(void* Parameters, uint16_t ParameterLength);\r
index 7f49fc9..4e0330e 100644 (file)
 \r
 #include "BluetoothStack.h"\r
 \r
+/** Bluetooth device connection information structure. Once connected to a remote device, this structure tracks the\r
+ *  connection state of the individual L2CAP channels.\r
+ */\r
 Bluetooth_Connection_t Bluetooth_Connection = {IsConnected: false};\r
 \r
-Bluetooth_Device_t     Bluetooth_DeviceConfiguration ATTR_WEAK =\r
+/** Bluetooth configuration structure. This structure configures the bluetooth stack's user alterable settings. */\r
+Bluetooth_Device_t Bluetooth_DeviceConfiguration =\r
        {\r
-               Class:   DEVICE_CLASS_MAJOR_MISC,\r
+               Class:   (DEVICE_CLASS_SERVICE_CAPTURING | DEVICE_CLASS_MAJOR_COMPUTER | DEVICE_CLASS_MINOR_COMPUTER_PALM),\r
                PINCode: "0000",\r
-               Name:    "LUFA BT Device"\r
+               Name:    "LUFA Bluetooth Demo"\r
        };\r
 \r
-void Bluetooth_State_Init(void)\r
+void Bluetooth_Stack_Init(void)\r
 {\r
        Bluetooth_HCIProcessingState = Bluetooth_Init;\r
 }\r
 \r
-void Bluetooth_Stack_Task(void)\r
+void Bluetooth_Stack_USBTask(void)\r
 {\r
        Bluetooth_ProcessHCICommands();\r
        Bluetooth_ProcessACLPackets();\r
 }\r
 \r
+bool CALLBACK_Bluetooth_ConnectionRequest(uint8_t* RemoteAddress)\r
+{\r
+       /* Always accept connections from remote devices */\r
+       return true;\r
+}\r
+\r
 Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource)\r
 {\r
        Bluetooth_Channel_t* CurrentChannelStructure;\r
index 20bc956..b3ac684 100644 (file)
@@ -89,8 +89,8 @@
                Bluetooth_Channel_t* Bluetooth_GetChannelData(uint16_t ChannelNumber, bool SearchBySource);\r
                Bluetooth_Channel_t* Bluetooth_InitChannelData(uint16_t RemoteChannelNumber, uint16_t PSM);\r
                \r
-               void Bluetooth_State_Init(void);\r
-               void Bluetooth_Stack_Task(void);\r
+               void Bluetooth_Stack_Init(void);\r
+               void Bluetooth_Stack_USBTask(void);\r
 \r
        /* External Variables: */\r
                extern Bluetooth_Device_t     Bluetooth_DeviceConfiguration;\r
index 436d0ec..f189d0a 100644 (file)
@@ -11,6 +11,7 @@
  *  Project Homepage: http://www.fourwalledcubicle.com/LUFA.php \n\r
  *  Author's Website: http://www.fourwalledcubicle.com \n\r
  *  Development Blog: http://www.fourwalledcubicle.com/blog \n\r
+ *  Commercial Licences: http://fourwalledcubicle.com/PurchaseLUFA.php \n\r
  *\r
  *  \section Sec_ProjectHelp Assistance With LUFA\r
  *  Discussion Group: http://groups.google.com/group/myusb-support-list \n\r
index 9f6a412..3a48283 100644 (file)
@@ -42,7 +42,7 @@
                #include <LUFA/Drivers/USB/USB.h>\r
 \r
        /* Macros: */\r
-               #if !defined(WIN_LIBUSB_COMPAT)\r
+               #if !defined(LIBUSB_FILTERDRV_COMPAT)\r
                        /** Endpoint number of the AVRISP data OUT endpoint. */\r
                        #define AVRISP_DATA_OUT_EPNUM      2\r
 \r
index ef86e30..cc521ce 100644 (file)
@@ -179,6 +179,10 @@ static void XPROGProtocol_LeaveXPROGMode(void)
                XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);     \r
                XPROGTarget_SendByte(0x00);\r
 \r
+               /* Do it twice to make sure it takes affect (silicon bug?) */\r
+               XPROGTarget_SendByte(PDI_CMD_STCS | PDI_RESET_REG);     \r
+               XPROGTarget_SendByte(0x00);\r
+\r
                XPROGTarget_DisableTargetPDI();\r
        }\r
        else\r
index 0936c4d..a496679 100644 (file)
@@ -77,8 +77,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 /** Event handler for the library USB Unhandled Control Packet event. */\r
 void EVENT_USB_Device_UnhandledControlRequest(void)\r
 {\r
-    const uint8_t serial[5] = { 0, 0, 0, 0, 1 };\r
-       uint8_t data[2]         = { 0, 0 };\r
+    const uint8_t SerialNumber[5] = { 0, 0, 0, 0, 1 };\r
+       uint8_t ControlData[2]        = { 0, 0 };\r
 \r
     switch (USB_ControlRequest.bRequest)\r
        {\r
@@ -89,20 +89,22 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
 \r
                                Endpoint_ClearSETUP();\r
 \r
-                               Endpoint_Read_Control_Stream_LE(data, sizeof(data));\r
+                               Endpoint_Read_Control_Stream_LE(ControlData, sizeof(ControlData));\r
                                Endpoint_ClearIN();\r
 \r
                                switch (USB_ControlRequest.wValue)\r
                                {\r
                                        case 0x303:\r
-                                               if (data[1]) PORTC &= ~RELAY1; else PORTC |= RELAY1; break;\r
+                                               if (ControlData[1]) PORTC &= ~RELAY1; else PORTC |= RELAY1;\r
+                                               break;\r
                                        case 0x306:\r
-                                               if (data[1]) PORTC &= ~RELAY2; else PORTC |= RELAY2; break;\r
+                                               if (ControlData[1]) PORTC &= ~RELAY2; else PORTC |= RELAY2;\r
+                                               break;\r
                                        case 0x309:\r
-                                               if (data[1]) PORTC &= ~RELAY3; else PORTC |= RELAY3; break;\r
+                                               if (ControlData[1]) PORTC &= ~RELAY3; else PORTC |= RELAY3;\r
+                                               break;\r
                                        case 0x30c:\r
-                                               if (data[1]) PORTC &= ~RELAY4; else PORTC |= RELAY4; break;\r
-                                       default:\r
+                                               if (ControlData[1]) PORTC &= ~RELAY4; else PORTC |= RELAY4;\r
                                                break;\r
                                }\r
                        }\r
@@ -118,22 +120,24 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                switch (USB_ControlRequest.wValue)\r
                                {\r
                                        case 0x301:\r
-                                               Endpoint_Write_Control_Stream_LE(serial, sizeof(serial));\r
+                                               Endpoint_Write_Control_Stream_LE(SerialNumber, sizeof(SerialNumber));\r
                                                break;\r
                                        case 0x303:\r
-                                               if (PORTC & RELAY1) data[1] = 2; else data[1] = 3; break;\r
+                                               ControlData[1] = (PORTC & RELAY1) ? 2 : 3;\r
+                                               break;\r
                                        case 0x306:\r
-                                               if (PORTC & RELAY2) data[1] = 2; else data[1] = 3; break;\r
+                                               ControlData[1] = (PORTC & RELAY2) ? 2 : 3;\r
+                                               break;\r
                                        case 0x309:\r
-                                               if (PORTC & RELAY3) data[1] = 2; else data[1] = 3; break;\r
+                                               ControlData[1] = (PORTC & RELAY3) ? 2 : 3;\r
+                                               break;\r
                                        case 0x30c:\r
-                                               if (PORTC & RELAY4) data[1] = 2; else data[1] = 3; break;\r
-                                       default:\r
+                                               ControlData[1] = (PORTC & RELAY4) ? 2 : 3;\r
                                                break;\r
                                }\r
                                \r
-                               if (data[1])\r
-                                 Endpoint_Write_Control_Stream_LE(data, sizeof(data));\r
+                               if (ControlData[1])\r
+                                 Endpoint_Write_Control_Stream_LE(ControlData, sizeof(ControlData));\r
 \r
                                Endpoint_ClearOUT();\r
                        }\r