Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationC...
[pub/USBasp.git] / Demos / Host / Incomplete / BluetoothHost / Lib / BluetoothHCICommands.c
index f678ecb..35bfcdd 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2011.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  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 
+  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 
+  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
   this software.
 */
 
+/** \file
+ *
+ *  Bluetooth HCI layer management code. This module manages the overall
+ *  Bluetooth stack connection state to and from other devices, processes
+ *  received events from the Bluetooth controller, and issues commands to
+ *  modify the controller's configuration, such as the broadcast name of the
+ *  device.
+ */
+
 /*
        TODO: Add local to remote device connections
  */
@@ -35,7 +44,7 @@
 #define  INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
 #include "BluetoothHCICommands.h"
 
-/** Temporary Bluetooth Device Address, for HCI responses which much include the detination address */
+/** Temporary Bluetooth Device Address, for HCI responses which much include the destination address */
 static uint8_t Bluetooth_TempDeviceAddress[6];
 
 /** Bluetooth HCI processing task. This task should be called repeatedly the main Bluetooth
@@ -50,28 +59,28 @@ void Bluetooth_HCITask(void)
                case Bluetooth_ProcessEvents:
                        Pipe_SelectPipe(BLUETOOTH_EVENTS_PIPE);
                        Pipe_Unfreeze();
-                       
+
                        if (Pipe_IsReadWriteAllowed())
                        {
                                BT_HCIEvent_Header_t HCIEventHeader;
 
                                /* Read in the event header to fetch the event code and payload length */
-                               Pipe_Read_Stream_LE(&HCIEventHeader, sizeof(HCIEventHeader));
-                               
+                               Pipe_Read_Stream_LE(&HCIEventHeader, sizeof(HCIEventHeader), NULL);
+
                                /* Create a temporary buffer for the event parameters */
                                uint8_t EventParams[HCIEventHeader.ParameterLength];
 
                                /* Read in the event parameters into the temporary buffer */
-                               Pipe_Read_Stream_LE(&EventParams, HCIEventHeader.ParameterLength);
+                               Pipe_Read_Stream_LE(&EventParams, HCIEventHeader.ParameterLength, NULL);
                                Pipe_ClearIN();
-                               
+
                                BT_HCI_DEBUG(1, "Event Received (0x%02X)", HCIEventHeader.EventCode);
 
                                switch (HCIEventHeader.EventCode)
                                {
                                        case EVENT_COMMAND_COMPLETE:
                                                BT_HCI_DEBUG(1, "<< Command Complete");
-                                               
+
                                                /* Check which operation was completed in case we need to process the even parameters */
                                                switch (((BT_HCIEvent_CommandComplete_t*)&EventParams)->Opcode)
                                                {
@@ -82,7 +91,7 @@ void Bluetooth_HCITask(void)
                                                                       sizeof(Bluetooth_State.LocalBDADDR));
                                                                break;
                                                }
-                                               
+
                                                Bluetooth_State.CurrentHCIState = Bluetooth_State.NextHCIState;
                                                break;
                                        case EVENT_COMMAND_STATUS:
@@ -101,7 +110,7 @@ void Bluetooth_HCITask(void)
                                                memcpy(Bluetooth_TempDeviceAddress,
                                                       &((BT_HCIEvent_ConnectionRequest_t*)&EventParams)->RemoteAddress,
                                                       sizeof(Bluetooth_TempDeviceAddress));
-                                                          
+
                                                bool IsACLConnection = (((BT_HCIEvent_ConnectionRequest_t*)&EventParams)->LinkType == 0x01);
 
                                                /* Only accept the connection if it is a ACL (data) connection, a device is not already connected
@@ -126,12 +135,12 @@ void Bluetooth_HCITask(void)
                                                break;
                                        case EVENT_LINK_KEY_REQUEST:
                                                BT_HCI_DEBUG(1, "<< Link Key Request");
-                                               
+
                                                /* Need to store the remote device's BT address in a temporary buffer for later use */
                                                memcpy(Bluetooth_TempDeviceAddress,
                                                       &((BT_HCIEvent_LinkKeyReq_t*)&EventParams)->RemoteAddress,
-                                                      sizeof(Bluetooth_TempDeviceAddress));                                            
-                                               
+                                                      sizeof(Bluetooth_TempDeviceAddress));
+
                                                Bluetooth_State.CurrentHCIState = Bluetooth_Conn_SendLinkKeyNAK;
                                                break;
                                        case EVENT_CONNECTION_COMPLETE:
@@ -146,24 +155,22 @@ void Bluetooth_HCITask(void)
                                                /* Store the created connection handle and indicate that the connection has been established */
                                                Bluetooth_Connection.ConnectionHandle = ((BT_HCIEvent_ConnectionComplete_t*)&EventParams)->ConnectionHandle;
                                                Bluetooth_Connection.IsConnected      = true;
-                                               
-                                               Bluetooth_ConnectionComplete();                                         
+
+                                               Bluetooth_ConnectionComplete();
                                                break;
                                        case EVENT_DISCONNECTION_COMPLETE:
                                                BT_HCI_DEBUG(1, "<< Disconnection Complete");
 
                                                /* Device disconnected, indicate connection information no longer valid */
                                                Bluetooth_Connection.IsConnected = false;
-                                               
+
                                                Bluetooth_DisconnectionComplete();
-                                               
-                                               Bluetooth_State.CurrentHCIState = Bluetooth_Init;
                                                break;
                                }
                        }
-                       
+
                        Pipe_Freeze();
-                       
+
                        break;
                case Bluetooth_Init:
                        BT_HCI_DEBUG(1, "# Init");
@@ -173,7 +180,7 @@ void Bluetooth_HCITask(void)
                        /* Reset the connection information structure to destroy any previous connection state */
                        memset(&Bluetooth_Connection, 0x00, sizeof(Bluetooth_Connection));
 
-                       Bluetooth_State.CurrentHCIState = Bluetooth_Init_Reset; 
+                       Bluetooth_State.CurrentHCIState = Bluetooth_Init_Reset;
                        break;
                case Bluetooth_Init_Reset:
                        BT_HCI_DEBUG(1, "# Reset");
@@ -184,22 +191,22 @@ void Bluetooth_HCITask(void)
                                ParameterLength: 0,
                        };
 
-                       /* Send the command to reset the bluetooth dongle controller */
+                       /* Send the command to reset the Bluetooth dongle controller */
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
-                       
+
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_ReadBufferSize;
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
                case Bluetooth_Init_ReadBufferSize:
                        BT_HCI_DEBUG(1, "# Read Buffer Size");
-               
+
                        HCICommandHeader = (BT_HCICommand_Header_t)
                        {
                                OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBUFFERSIZE),
                                ParameterLength: 0,
                        };
 
-                       /* Send the command to read the bluetooth buffer size (mandatory before device sends any data) */
+                       /* Send the command to read the Bluetooth buffer size (mandatory before device sends any data) */
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_GetBDADDR;
@@ -207,14 +214,14 @@ void Bluetooth_HCITask(void)
                        break;
                case Bluetooth_Init_GetBDADDR:
                        BT_HCI_DEBUG(1, "# Get BDADDR");
-               
+
                        HCICommandHeader = (BT_HCICommand_Header_t)
                        {
                                OpCode: (OGF_CTRLR_INFORMATIONAL | OCF_CTRLR_INFORMATIONAL_READBDADDR),
                                ParameterLength: 0,
                        };
 
-                       /* Send the command to retrieve the BDADDR of the inserted bluetooth dongle */
+                       /* Send the command to retrieve the BDADDR of the inserted Bluetooth dongle */
                        Bluetooth_SendHCICommand(&HCICommandHeader, NULL, 0);
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_SetLocalName;
@@ -229,7 +236,7 @@ void Bluetooth_HCITask(void)
                                        ParameterLength: 248,
                                };
 
-                       /* Send the command to set the bluetooth dongle's name for other devices to see */
+                       /* Send the command to set the Bluetooth dongle's name for other devices to see */
                        Bluetooth_SendHCICommand(&HCICommandHeader, Bluetooth_DeviceConfiguration.Name, strlen(Bluetooth_DeviceConfiguration.Name));
 
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_SetDeviceClass;
@@ -260,10 +267,10 @@ void Bluetooth_HCITask(void)
                        };
 
                        uint8_t Interval = BT_SCANMODE_InquiryAndPageScans;
-                       
+
                        /* Send the command to set the remote device scanning mode */
                        Bluetooth_SendHCICommand(&HCICommandHeader, &Interval, 1);
-                       
+
                        Bluetooth_State.NextHCIState    = Bluetooth_Init_FinalizeInit;
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
@@ -294,7 +301,7 @@ void Bluetooth_HCITask(void)
 
                        /* Send the command to accept the remote connection request */
                        Bluetooth_SendHCICommand(&HCICommandHeader, &AcceptConnectionParams, sizeof(BT_HCICommand_AcceptConnectionReq_t));
-                       
+
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
                case Bluetooth_Conn_RejectConnection:
@@ -314,7 +321,7 @@ void Bluetooth_HCITask(void)
 
                        /* Send the command to reject the remote connection request */
                        Bluetooth_SendHCICommand(&HCICommandHeader, &RejectConnectionParams, sizeof(BT_HCICommand_RejectConnectionReq_t));
-               
+
                        Bluetooth_State.CurrentHCIState = Bluetooth_ProcessEvents;
                        break;
                case Bluetooth_Conn_SendPINCode:
@@ -332,7 +339,7 @@ void Bluetooth_HCITask(void)
                        memcpy(PINCodeRequestParams.RemoteAddress, Bluetooth_TempDeviceAddress, sizeof(PINCodeRequestParams.RemoteAddress));
                        PINCodeRequestParams.PINCodeLength = strlen(Bluetooth_DeviceConfiguration.PINCode);
                        memcpy(PINCodeRequestParams.PINCode, Bluetooth_DeviceConfiguration.PINCode, sizeof(PINCodeRequestParams.PINCode));
-                       
+
                        /* Send the command to transmit the device's local PIN number for authentication */
                        Bluetooth_SendHCICommand(&HCICommandHeader, &PINCodeRequestParams, sizeof(BT_HCICommand_PinCodeResp_t));
 
@@ -367,7 +374,9 @@ void Bluetooth_HCITask(void)
  *
  *  \return A value from the USB_Host_SendControlErrorCodes_t enum.
  */
-static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCICommandHeader, const void* Parameters, const uint16_t ParameterLength)
+static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCICommandHeader,
+                                        const void* Parameters,
+                                        const uint16_t ParameterLength)
 {
        /* Need to reserve the amount of bytes given in the header for the complete payload */
        uint8_t CommandBuffer[sizeof(BT_HCICommand_Header_t) + HCICommandHeader->ParameterLength];
@@ -383,14 +392,15 @@ static uint8_t Bluetooth_SendHCICommand(const BT_HCICommand_Header_t* const HCIC
 
        /* Copy over the HCI command header to the allocated buffer */
        memcpy(CommandBuffer, HCICommandHeader, sizeof(BT_HCICommand_Header_t));
-       
+
        /* Zero out the parameter section of the response so that all padding bytes are known to be zero */
        memset(&CommandBuffer[sizeof(BT_HCICommand_Header_t)], 0x00, HCICommandHeader->ParameterLength);
 
        /* Copy over the command parameters (if any) to the command buffer - note, the number of actual source parameter bytes
           may differ to those in the header; any difference in length is filled with 0x00 padding bytes */
        memcpy(&CommandBuffer[sizeof(BT_HCICommand_Header_t)], Parameters, ParameterLength);
-       
+
        Pipe_SelectPipe(PIPE_CONTROLPIPE);
        return USB_Host_SendControlRequest(CommandBuffer);
 }
+