Add bidirectional channel configuration -- remote device is not ACKing sent Configuration Requests, needs further debugging. Implement Bluetooth spec's channel states.
Use abbreviations for the structure and function names where possible to try to cut down on the code verbosity.
This commit is contained in:
parent
b9c7d19615
commit
c77f136661
8 changed files with 465 additions and 356 deletions
|
@ -28,14 +28,214 @@
|
|||
this software.
|
||||
*/
|
||||
|
||||
#define INCLUDE_FROM_BLUETOOTHHCICOMMANDS_C
|
||||
#include "BluetoothHCICommands.h"
|
||||
|
||||
static Bluetooth_HCICommand_Header_t HCICommandHeader;
|
||||
static BT_HCICommand_Header_t HCICommandHeader;
|
||||
|
||||
uint8_t Bluetooth_HCIProcessingState;
|
||||
static uint8_t Bluetooth_HCINextState;
|
||||
static uint8_t Bluetooth_TempDeviceAddress[6];
|
||||
|
||||
void Bluetooth_HCITask(void)
|
||||
{
|
||||
switch (Bluetooth_HCIProcessingState)
|
||||
{
|
||||
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));
|
||||
|
||||
/* 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_ClearIN();
|
||||
|
||||
switch (HCIEventHeader.EventCode)
|
||||
{
|
||||
case EVENT_COMMAND_COMPLETE:
|
||||
Bluetooth_HCIProcessingState = Bluetooth_HCINextState;
|
||||
break;
|
||||
case EVENT_COMMAND_STATUS:
|
||||
/* If the execution of a command failed, reset the stack */
|
||||
if (((BT_HCIEvent_CommandStatus_t*)&EventParams)->Status)
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init;
|
||||
break;
|
||||
case EVENT_CONNECTION_REQUEST:
|
||||
/* Need to store the remote device's BT address in a temporary buffer for later use */
|
||||
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
|
||||
and the user application has indicated that the connection should be allowed */
|
||||
Bluetooth_HCIProcessingState = (Bluetooth_Connection.IsConnected || !(IsACLConnection) ||
|
||||
!(Bluetooth_ConnectionRequest(Bluetooth_TempDeviceAddress))) ?
|
||||
Bluetooth_Conn_RejectConnection : Bluetooth_Conn_AcceptConnection;
|
||||
break;
|
||||
case EVENT_PIN_CODE_REQUEST:
|
||||
/* Need to store the remote device's BT address in a temporary buffer for later use */
|
||||
memcpy(Bluetooth_TempDeviceAddress,
|
||||
&((BT_HCIEvent_PinCodeReq_t*)&EventParams)->RemoteAddress,
|
||||
sizeof(Bluetooth_TempDeviceAddress));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Conn_SendPINCode;
|
||||
break;
|
||||
case EVENT_CONNECTION_COMPLETE:
|
||||
/* Need to store the remote device's BT address in a temporary buffer for later use */
|
||||
memcpy(Bluetooth_Connection.RemoteAddress,
|
||||
&((BT_HCIEvent_ConnectionComplete_t*)&EventParams)->RemoteAddress,
|
||||
sizeof(Bluetooth_TempDeviceAddress));
|
||||
|
||||
/* 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();
|
||||
break;
|
||||
case EVENT_DISCONNECTION_COMPLETE:
|
||||
/* Device disconnected, indicate connection information no longer valid */
|
||||
Bluetooth_Connection.IsConnected = false;
|
||||
|
||||
Bluetooth_DisconnectionComplete();
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Pipe_Freeze();
|
||||
|
||||
break;
|
||||
case Bluetooth_Init:
|
||||
/* Reset the connection information structure to destroy any previous connection state */
|
||||
memset(&Bluetooth_Connection, 0x00, sizeof(Bluetooth_Connection));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init_Reset;
|
||||
break;
|
||||
case Bluetooth_Init_Reset:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_RESET},
|
||||
ParameterLength: 0,
|
||||
};
|
||||
|
||||
/* Send the command to reset the bluetooth dongle controller */
|
||||
Bluetooth_SendHCICommand(NULL, 0);
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_Init_SetLocalName;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Init_SetLocalName:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_WRITE_LOCAL_NAME},
|
||||
ParameterLength: 248,
|
||||
};
|
||||
|
||||
/* Send the command to set the bluetooth dongle's name for other devices to see */
|
||||
Bluetooth_SendHCICommand(Bluetooth_DeviceConfiguration.Name, strlen(Bluetooth_DeviceConfiguration.Name));
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_Init_SetDeviceClass;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Init_SetDeviceClass:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_WRITE_CLASS_OF_DEVICE},
|
||||
ParameterLength: 3,
|
||||
};
|
||||
|
||||
/* Send the command to set the class of the device for other devices to see */
|
||||
Bluetooth_SendHCICommand(&Bluetooth_DeviceConfiguration.Class, 3);
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_Init_WriteScanEnable;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Init_WriteScanEnable:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_WRITE_SCAN_ENABLE},
|
||||
ParameterLength: 1,
|
||||
};
|
||||
|
||||
uint8_t Interval = BT_SCANMODE_InquiryAndPageScans;
|
||||
|
||||
/* Send the command to set the remote device scanning mode */
|
||||
Bluetooth_SendHCICommand(&Interval, 1);
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_ProcessEvents;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Conn_AcceptConnection:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_LINK_CONTROL, OCF: OCF_LINK_CONTROL_ACCEPT_CONNECTION_REQUEST},
|
||||
ParameterLength: sizeof(BT_HCICommand_AcceptConnectionReq_t),
|
||||
};
|
||||
|
||||
/* Copy over the temporary BT device address saved from the Connection Request event, indicate slave
|
||||
connection role */
|
||||
BT_HCICommand_AcceptConnectionReq_t AcceptConnectionParams;
|
||||
memcpy(AcceptConnectionParams.RemoteAddress, Bluetooth_TempDeviceAddress,
|
||||
sizeof(AcceptConnectionParams.RemoteAddress));
|
||||
AcceptConnectionParams.SlaveRole = true;
|
||||
|
||||
/* Send the command to accept the remote connection request */
|
||||
Bluetooth_SendHCICommand(&AcceptConnectionParams, sizeof(BT_HCICommand_AcceptConnectionReq_t));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Conn_RejectConnection:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_LINK_CONTROL, OCF: OCF_LINK_CONTROL_REJECT_CONNECTION_REQUEST},
|
||||
ParameterLength: sizeof(BT_HCICommand_RejectConnectionReq_t),
|
||||
};
|
||||
|
||||
/* Copy over the temporary BT device address saved from the Connection Request event, indicate failure
|
||||
to accept the connection due to limited device resources or incorrect device address */
|
||||
BT_HCICommand_RejectConnectionReq_t RejectConnectionParams;
|
||||
memcpy(RejectConnectionParams.RemoteAddress, Bluetooth_TempDeviceAddress, sizeof(RejectConnectionParams.RemoteAddress));
|
||||
RejectConnectionParams.Reason = Bluetooth_Connection.IsConnected ? ERROR_LIMITED_RESOURCES : ERROR_UNACCEPTABLE_BDADDR;
|
||||
|
||||
/* Send the command to reject the remote connection request */
|
||||
Bluetooth_SendHCICommand(&RejectConnectionParams, sizeof(BT_HCICommand_RejectConnectionReq_t));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Conn_SendPINCode:
|
||||
HCICommandHeader = (BT_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_LINK_CONTROL, OCF: OCF_LINK_CONTROL_PIN_CODE_REQUEST_REPLY},
|
||||
ParameterLength: sizeof(BT_HCICommand_PinCodeResp_t),
|
||||
};
|
||||
|
||||
/* Copy over the temporary BT device address saved from the PIN Code Request event, copy over the
|
||||
local PIN authentication code to the response */
|
||||
BT_HCICommand_PinCodeResp_t PINCodeRequestParams;
|
||||
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(&PINCodeRequestParams, sizeof(BT_HCICommand_PinCodeResp_t));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t Bluetooth_SendHCICommand(void* Parameters, uint16_t ParameterLength)
|
||||
{
|
||||
/* Need to reserve the amount of bytes given in the header for the complete payload */
|
||||
|
@ -63,202 +263,3 @@ static uint8_t Bluetooth_SendHCICommand(void* Parameters, uint16_t ParameterLeng
|
|||
Pipe_SelectPipe(PIPE_CONTROLPIPE);
|
||||
return USB_Host_SendControlRequest(CommandBuffer);
|
||||
}
|
||||
|
||||
void Bluetooth_ProcessHCICommands(void)
|
||||
{
|
||||
switch (Bluetooth_HCIProcessingState)
|
||||
{
|
||||
case Bluetooth_ProcessEvents:
|
||||
Pipe_SelectPipe(BLUETOOTH_EVENTS_PIPE);
|
||||
Pipe_Unfreeze();
|
||||
|
||||
if (Pipe_IsReadWriteAllowed())
|
||||
{
|
||||
Bluetooth_HCIEvent_Header_t HCIEventHeader;
|
||||
|
||||
/* Read in the event header to fetch the event code and payload length */
|
||||
Pipe_Read_Stream_LE(&HCIEventHeader, sizeof(HCIEventHeader));
|
||||
|
||||
/* 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_ClearIN();
|
||||
|
||||
switch (HCIEventHeader.EventCode)
|
||||
{
|
||||
case EVENT_COMMAND_COMPLETE:
|
||||
Bluetooth_HCIProcessingState = Bluetooth_HCINextState;
|
||||
break;
|
||||
case EVENT_COMMAND_STATUS:
|
||||
/* If the execution of a command failed, reset the stack */
|
||||
if (((Bluetooth_HCIEvent_CommandStatus_t*)&EventParams)->Status)
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init;
|
||||
break;
|
||||
case EVENT_CONNECTION_REQUEST:
|
||||
/* Need to store the remote device's BT address in a temporary buffer for later use */
|
||||
memcpy(Bluetooth_TempDeviceAddress,
|
||||
&((Bluetooth_HCIEvent_ConnectionRequest_t*)&EventParams)->RemoteAddress,
|
||||
sizeof(Bluetooth_TempDeviceAddress));
|
||||
|
||||
bool IsACLConnection = (((Bluetooth_HCIEvent_ConnectionRequest_t*)&EventParams)->LinkType == 0x01);
|
||||
|
||||
/* Only accept the connection if it is a ACL (data) connection, a device is not already connected
|
||||
and the user application has indicated that the connection should be allowed */
|
||||
Bluetooth_HCIProcessingState = (Bluetooth_Connection.IsConnected || !(IsACLConnection) ||
|
||||
!(Bluetooth_ConnectionRequest(Bluetooth_TempDeviceAddress))) ?
|
||||
Bluetooth_Conn_RejectConnection : Bluetooth_Conn_AcceptConnection;
|
||||
break;
|
||||
case EVENT_PIN_CODE_REQUEST:
|
||||
/* Need to store the remote device's BT address in a temporary buffer for later use */
|
||||
memcpy(Bluetooth_TempDeviceAddress,
|
||||
&((Bluetooth_HCIEvent_PinCodeRequest_t*)&EventParams)->RemoteAddress,
|
||||
sizeof(Bluetooth_TempDeviceAddress));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Conn_SendPINCode;
|
||||
break;
|
||||
case EVENT_CONNECTION_COMPLETE:
|
||||
/* Need to store the remote device's BT address in a temporary buffer for later use */
|
||||
memcpy(Bluetooth_Connection.RemoteAddress,
|
||||
&((Bluetooth_HCIEvent_ConnectionComplete_t*)&EventParams)->RemoteAddress,
|
||||
sizeof(Bluetooth_TempDeviceAddress));
|
||||
|
||||
/* Store the created connection handle and indicate that the connection has been established */
|
||||
Bluetooth_Connection.ConnectionHandle = ((Bluetooth_HCIEvent_ConnectionComplete_t*)&EventParams)->ConnectionHandle;
|
||||
Bluetooth_Connection.IsConnected = true;
|
||||
|
||||
Bluetooth_ConnectionComplete();
|
||||
break;
|
||||
case EVENT_DISCONNECTION_COMPLETE:
|
||||
/* Device disconnected, indicate connection information no longer valid */
|
||||
Bluetooth_Connection.IsConnected = false;
|
||||
|
||||
Bluetooth_DisconnectionComplete();
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Pipe_Freeze();
|
||||
|
||||
break;
|
||||
case Bluetooth_Init:
|
||||
/* Reset the connection information structure to destroy any previous connection state */
|
||||
memset(&Bluetooth_Connection, 0x00, sizeof(Bluetooth_Connection));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_Init_Reset;
|
||||
break;
|
||||
case Bluetooth_Init_Reset:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_RESET},
|
||||
ParameterLength: 0,
|
||||
};
|
||||
|
||||
/* Send the command to reset the bluetooth dongle controller */
|
||||
Bluetooth_SendHCICommand(NULL, 0);
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_Init_SetLocalName;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Init_SetLocalName:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_WRITE_LOCAL_NAME},
|
||||
ParameterLength: 248,
|
||||
};
|
||||
|
||||
/* Send the command to set the bluetooth dongle's name for other devices to see */
|
||||
Bluetooth_SendHCICommand(Bluetooth_DeviceConfiguration.Name, strlen(Bluetooth_DeviceConfiguration.Name));
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_Init_SetDeviceClass;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Init_SetDeviceClass:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_WRITE_CLASS_OF_DEVICE},
|
||||
ParameterLength: 3,
|
||||
};
|
||||
|
||||
/* Send the command to set the class of the device for other devices to see */
|
||||
Bluetooth_SendHCICommand(&Bluetooth_DeviceConfiguration.Class, 3);
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_Init_WriteScanEnable;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Init_WriteScanEnable:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_CTRLR_BASEBAND, OCF: OCF_CTRLR_BASEBAND_WRITE_SCAN_ENABLE},
|
||||
ParameterLength: 1,
|
||||
};
|
||||
|
||||
uint8_t Interval = BT_SCANMODE_InquiryAndPageScans;
|
||||
|
||||
/* Send the command to set the remote device scanning mode */
|
||||
Bluetooth_SendHCICommand(&Interval, 1);
|
||||
|
||||
Bluetooth_HCINextState = Bluetooth_ProcessEvents;
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Conn_AcceptConnection:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_LINK_CONTROL, OCF: OCF_LINK_CONTROL_ACCEPT_CONNECTION_REQUEST},
|
||||
ParameterLength: sizeof(Bluetooth_HCICommand_AcceptConnectionRequest_t),
|
||||
};
|
||||
|
||||
/* Copy over the temporary BT device address saved from the Connection Request event, indicate slave
|
||||
connection role */
|
||||
Bluetooth_HCICommand_AcceptConnectionRequest_t AcceptConnectionParams;
|
||||
memcpy(AcceptConnectionParams.RemoteAddress, Bluetooth_TempDeviceAddress,
|
||||
sizeof(AcceptConnectionParams.RemoteAddress));
|
||||
AcceptConnectionParams.SlaveRole = true;
|
||||
|
||||
/* Send the command to accept the remote connection request */
|
||||
Bluetooth_SendHCICommand(&AcceptConnectionParams, sizeof(Bluetooth_HCICommand_AcceptConnectionRequest_t));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Conn_RejectConnection:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_LINK_CONTROL, OCF: OCF_LINK_CONTROL_REJECT_CONNECTION_REQUEST},
|
||||
ParameterLength: sizeof(Bluetooth_HCICommand_RejectConnectionRequest_t),
|
||||
};
|
||||
|
||||
/* Copy over the temporary BT device address saved from the Connection Request event, indicate failure
|
||||
to accept the connection due to limited device resources or incorrect device address */
|
||||
Bluetooth_HCICommand_RejectConnectionRequest_t RejectConnectionParams;
|
||||
memcpy(RejectConnectionParams.RemoteAddress, Bluetooth_TempDeviceAddress, sizeof(RejectConnectionParams.RemoteAddress));
|
||||
RejectConnectionParams.Reason = Bluetooth_Connection.IsConnected ? ERROR_LIMITED_RESOURCES : ERROR_UNACCEPTABLE_BDADDR;
|
||||
|
||||
/* Send the command to reject the remote connection request */
|
||||
Bluetooth_SendHCICommand(&RejectConnectionParams, sizeof(Bluetooth_HCICommand_RejectConnectionRequest_t));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
case Bluetooth_Conn_SendPINCode:
|
||||
HCICommandHeader = (Bluetooth_HCICommand_Header_t)
|
||||
{
|
||||
OpCode: {OGF: OGF_LINK_CONTROL, OCF: OCF_LINK_CONTROL_PIN_CODE_REQUEST_REPLY},
|
||||
ParameterLength: sizeof(Bluetooth_HCICommand_PinCodeResponse_t),
|
||||
};
|
||||
|
||||
/* Copy over the temporary BT device address saved from the PIN Code Request event, copy over the
|
||||
local PIN authentication code to the response */
|
||||
Bluetooth_HCICommand_PinCodeResponse_t PINCodeRequestParams;
|
||||
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(&PINCodeRequestParams, sizeof(Bluetooth_HCICommand_PinCodeResponse_t));
|
||||
|
||||
Bluetooth_HCIProcessingState = Bluetooth_ProcessEvents;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue