private int HCI_Command(HCI.Command Command, byte[] Buffer) { var Transfered = 0; Buffer[0] = (byte)(((uint)Command >> 0) & 0xFF); Buffer[1] = (byte)(((uint)Command >> 8) & 0xFF); Buffer[2] = (byte)(Buffer.Length - 3); SendTransfer(0x20, 0x00, 0x0000, Buffer, ref Transfered); Log.DebugFormat("<< {0} [{1:X4}]", Command, (ushort)Command); return(Transfered); }
private int HCI_Command(HCI.Command command, byte[] buffer) { var transfered = 0; buffer[0] = (byte)(((uint)command >> 0) & 0xFF); buffer[1] = (byte)(((uint)command >> 8) & 0xFF); buffer[2] = (byte)(buffer.Length - 3); SendTransfer(0x20, 0x00, 0x0000, buffer, ref transfered); Log.DebugFormat("<< {0} [{1:X4}]", command, (ushort)command); return(transfered); }
protected virtual void HCI_Worker_Thread(object sender, DoWorkEventArgs e) { Thread.Sleep(1); SortedDictionary <String, String> NameList = new SortedDictionary <String, String>(); StringBuilder nm = new StringBuilder(), debug = new StringBuilder(); Boolean bStarted = false; String bd = String.Empty; Byte[] Buffer = new Byte[512]; Byte[] BD_Addr = new Byte[6]; Int32 Transfered = 0; HCI.Event Event; LogDebug(String.Format("-- Bluetooth : HCI_Worker_Thread Starting [{0:X2}]", m_IntIn)); HCI_Reset(); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Reset, (UInt16)HCI.Command.HCI_Reset)); while (IsActive) { try { if (ReadIntPipe(Buffer, Buffer.Length, ref Transfered) && Transfered > 0) { if (Enum.IsDefined(typeof(HCI.Event), Buffer[0])) { Event = (HCI.Event)Buffer[0]; switch (Event) { case HCI.Event.HCI_Command_Complete_EV: HCI.Command Command = (HCI.Command)(UInt16)(Buffer[3] | Buffer[4] << 8); LogDebug(String.Format(">> {0} [{1:X2}] [{2:X2}]", Event, Buffer[0], Buffer[5])); if (Command == HCI.Command.HCI_Reset && Buffer[5] == 0 && !bStarted) { bStarted = true; Thread.Sleep(250); Transfered = HCI_Read_BD_Addr(); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Read_BD_ADDR, (UInt16)HCI.Command.HCI_Read_BD_ADDR)); } if (Command == HCI.Command.HCI_Read_BD_ADDR && Buffer[5] == 0) { Transfered = HCI_Read_Buffer_Size(); m_Local = new Byte[] { Buffer[6], Buffer[7], Buffer[8], Buffer[9], Buffer[10], Buffer[11] }; LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Read_Buffer_Size, (UInt16)HCI.Command.HCI_Read_Buffer_Size)); } if (Command == HCI.Command.HCI_Read_Buffer_Size && Buffer[5] == 0) { LogDebug(String.Format("-- {0:X2}{1:X2}, {2:X2}, {3:X2}{4:X2}, {5:X2}{6:X2}", Buffer[7], Buffer[6], Buffer[8], Buffer[10], Buffer[9], Buffer[12], Buffer[11])); Transfered = HCI_Read_Local_Version_Info(); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Read_Local_Version_Info, (UInt16)HCI.Command.HCI_Read_Local_Version_Info)); } if (Command == HCI.Command.HCI_Read_Local_Version_Info && Buffer[5] == 0) { Transfered = HCI_Write_Scan_Enable(); HCI_Version = String.Format("{0}.{1}", Buffer[6], Buffer[8] << 8 | Buffer[7]); LMP_Version = String.Format("{0}.{1}", Buffer[9], Buffer[13] << 8 | Buffer[12]); LogDebug(String.Format("-- Master {0}, HCI_Version {1}, LMP_Version {2}", Local, HCI_Version, LMP_Version)); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Write_Scan_Enable, (UInt16)HCI.Command.HCI_Write_Scan_Enable)); } if (Command == HCI.Command.HCI_Write_Scan_Enable && Buffer[5] == 0) { m_bInitialised = true; } break; case HCI.Event.HCI_Connection_Request_EV: for (int i = 0; i < 6; i++) { BD_Addr[i] = Buffer[i + 2]; } LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); Transfered = HCI_Remote_Name_Request(BD_Addr); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Remote_Name_Request, (UInt16)HCI.Command.HCI_Remote_Name_Request)); break; case HCI.Event.HCI_Connection_Complete_EV: bd = String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", Buffer[10], Buffer[9], Buffer[8], Buffer[7], Buffer[6], Buffer[5]); BthConnection Connection = Add(Buffer[3], (Byte)(Buffer[4] | 0x20), NameList[bd]); Connection.Remote_Name = NameList[bd]; NameList.Remove(bd); Connection.BD_Address = new Byte[] { Buffer[5], Buffer[6], Buffer[7], Buffer[8], Buffer[9], Buffer[10] }; LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); break; case HCI.Event.HCI_Page_Scan_Repetition_Mode_Change_EV: LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); break; case HCI.Event.HCI_Command_Status_EV: LogDebug(String.Format(">> {0} [{1:X2}] [{2:X2}]", Event, Buffer[0], Buffer[2])); break; case HCI.Event.HCI_Role_Change_EV: LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); break; case HCI.Event.HCI_Disconnection_Complete_EV: LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); Remove(Buffer[3], (Byte)(Buffer[4] | 0x20)); break; case HCI.Event.HCI_Number_Of_Completed_Packets_EV: for (Byte Index = 0, Ptr = 3; Index < Buffer[2]; Index++, Ptr += 4) { OnCompletedCount(Buffer[Ptr], (Byte)(Buffer[Ptr + 1] | 0x20), (UInt16)(Buffer[Ptr + 2] | Buffer[Ptr + 3] << 8)); } break; case HCI.Event.HCI_Remote_Name_Request_Complete_EV: bd = String.Format("{0:X2}:{1:X2}:{2:X2}:{3:X2}:{4:X2}:{5:X2}", Buffer[8], Buffer[7], Buffer[6], Buffer[5], Buffer[4], Buffer[3]); nm = new StringBuilder(); for (int Index = 9; Index < Buffer.Length; Index++) { if (Buffer[Index] > 0) { nm.Append((Char)Buffer[Index]); } else { break; } } String Name = nm.ToString(); LogDebug(String.Format(">> {0} [{1:X2}]", Event, Buffer[0])); LogDebug(String.Format("-- Remote Name : {0} - {1}", bd, Name)); for (int i = 0; i < 6; i++) { BD_Addr[i] = Buffer[i + 3]; } if (Name == "PLAYSTATION(R)3 Controller" || Name == "Navigation Controller") { NameList.Add(bd, nm.ToString()); Transfered = HCI_Accept_Connection_Request(BD_Addr, 0x00); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Accept_Connection_Request, (UInt16)HCI.Command.HCI_Accept_Connection_Request)); } else { Transfered = HCI_Reject_Connection_Request(BD_Addr, 0x0F); LogDebug(String.Format("<< {0} [{1:X4}]", HCI.Command.HCI_Reject_Connection_Request, (UInt16)HCI.Command.HCI_Reject_Connection_Request)); } break; default: break; } } } } catch (Exception Ex) { Console.WriteLine(Ex.ToString()); } } LogDebug("-- Bluetooth : HCI_Worker_Thread Exiting"); }