public override void ParseHidReport()

in ScpControl/Bluetooth/Ds4/BthDs4.cs [148:230]


        public override void ParseHidReport(byte[] report)
        {
            m_Packet++;

            var inputReport = NewHidReport();

            Battery = (DsBattery) ((byte) ((report[41] + 2)/2));

            inputReport.PacketCounter = m_Packet;

            var buttons = (report[16] << 0) | (report[17] << 8) | (report[18] << 16);
            var trigger = false;

            //++ Convert HAT to DPAD
            report[16] &= 0xF0;

            switch ((uint) buttons & 0xF)
            {
                case 0:
                    report[16] |= (byte) Ds4Button.Up.Offset;
                    break;
                case 1:
                    report[16] |= (byte) (Ds4Button.Up.Offset | Ds4Button.Right.Offset);
                    break;
                case 2:
                    report[16] |= (byte) Ds4Button.Right.Offset;
                    break;
                case 3:
                    report[16] |= (byte) (Ds4Button.Right.Offset | Ds4Button.Down.Offset);
                    break;
                case 4:
                    report[16] |= (byte) Ds4Button.Down.Offset;
                    break;
                case 5:
                    report[16] |= (byte) (Ds4Button.Down.Offset | Ds4Button.Left.Offset);
                    break;
                case 6:
                    report[16] |= (byte) Ds4Button.Left.Offset;
                    break;
                case 7:
                    report[16] |= (byte) (Ds4Button.Left.Offset | Ds4Button.Up.Offset);
                    break;
            }
            //--

            // copy controller data to report packet
            Buffer.BlockCopy(report, 11, inputReport.RawBytes, 8, 76);

            // set report ID
            inputReport.RawBytes[8] = report[9];

            // Quick Disconnect
            if (inputReport[Ds4Button.L1].IsPressed
                && inputReport[Ds4Button.R1].IsPressed
                && inputReport[Ds4Button.Ps].IsPressed)
            {
                trigger = true;
                // unset PS button
                inputReport.Unset(Ds4Button.Ps);
            }

            if (inputReport.IsPadActive)
            {
                m_IsIdle = false;
            }
            else if (!m_IsIdle)
            {
                m_IsIdle = true;
                m_Idle = DateTime.Now;
            }

            if (trigger && !m_IsDisconnect)
            {
                m_IsDisconnect = true;
                m_Disconnect = DateTime.Now;
            }
            else if (!trigger && m_IsDisconnect)
            {
                m_IsDisconnect = false;
            }

            OnHidReportReceived(inputReport);
        }