private void hci_DataReceived(object sender, EndpointDataEventArgs e)
{
switch ((HCIEvent)e.Buffer[0])
{
case HCIEvent.InquiryComplete:
{
lock (_completedCommands)
{
_completedCommands.Add(new Opcode(OpcodeGroupField.LinkControl, OpcodeCommandField.Inquiry));
}
break;
}
case HCIEvent.InquiryResult:
{
var opcode = new Opcode(OpcodeGroupField.LinkControl, OpcodeCommandField.Inquiry);
if (!_commandData.ContainsKey(opcode))
{
_commandData.Add(opcode, new List <InquiryResult>());
}
var list = _commandData[opcode] as List <InquiryResult>;
int responses = Convert.ToInt32(e.Buffer[2]);
int offset = 3;
for (int i = 0; i < responses; i++)
{
list.Add(new InquiryResult(Utilities.GetLEULong(e.Buffer, offset + 0, 6), e.Buffer[offset + 6],
e.Buffer[offset + 7], e.Buffer[offset + 8], (uint)Utilities.GetLEULong(e.Buffer, offset + 9, 3),
(ushort)Utilities.GetLEULong(e.Buffer, offset + 12, 2)));
offset += 14;
}
break;
}
case HCIEvent.ConnectionComplete:
{
Logger.WriteLine("Connection Complete, Status: " + e.Buffer[2].ToString("X2"));
ushort connectionHandle = (ushort)(e.Buffer[3] | (e.Buffer[4] << 8));
ulong bdAddr = Utilities.GetLEULong(e.Buffer, 5, 6);
//Raise event out
if (ConnectionComplete != null)
{
ConnectionComplete(this, new HCIEventEventArgs(e.Buffer, e.Count));
}
break;
}
case HCIEvent.DisconnectionComplete:
{
Logger.WriteLine("Disconnection Complete, Status: " + e.Buffer[2].ToString("X2"));
break;
}
case HCIEvent.ConnectionRequest:
{
var bdAddr = Utilities.GetLEULong(e.Buffer, 2, 6);
var deviceClass = Utilities.GetLEULong(e.Buffer, 8, 3);
byte linkType = e.Buffer[11];
Logger.WriteLine(String.Format("Connection Request Received, BD_ADDR {0}, class {1}, link type {2}",
bdAddr.ToString("X12"), deviceClass.ToString("X6"), linkType.ToString("X2")));
//Accept this request (or do whatever with it)
if (ConnectionRequestReceived != null)
{
ConnectionRequestReceived(this, new HCIEventEventArgs(e.Buffer, e.Count));
}
break;
}
case HCIEvent.RemoteNameRequestComplete:
{
var opcode = new Opcode(OpcodeGroupField.LinkControl, OpcodeCommandField.RemoteNameRequest);
if (!_commandData.ContainsKey(opcode))
{
_commandData.Add(opcode, ASCIIEncoding.ASCII.GetString(e.Buffer, 9, 248).Trim(new char[] { '\0' }));
}
lock (_completedCommands)
{
_completedCommands.Add(opcode);
}
break;
}
case HCIEvent.QoSSetupComplete:
{
Logger.WriteLine("QoS Setup Complete");
break;
}
case HCIEvent.Complete:
{
var command = new Opcode(e.Buffer, 3);
lock (_completedCommands)
{
_completedCommands.Add(command);
}
break;
}
case HCIEvent.Status:
{
var command = new Opcode(e.Buffer, 4);
break;
}
case HCIEvent.PINCodeRequestEvent:
{
var bdAddr = Utilities.GetLEULong(e.Buffer, 2, 6);
//Send the reply
SendPINCodeReply(bdAddr, String.Empty);
break;
}
default:
{
//Uh?
Logger.WriteLine("Unknown HCI event: " + e.Buffer[0].ToString("X2"));
break;
}
}
}