Example #1
0
        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);
        }
Example #2
0
        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");
        }