protected override void ParseHidReport()

in ScpControl/Usb/Ds3/Replica/UsbDs3Afterglow.cs [8:118]


        protected override void ParseHidReport(byte[] report)
        {
            if (report[26] != 0x02) return;

            PacketCounter++;

            var inputReport = NewHidReport();

            #region HID Report translation

            // battery
            Battery = (DsBattery) report[30];

            // packet counter
            inputReport.PacketCounter = PacketCounter;

            // null button states
            inputReport.ZeroPsButtonState();
            inputReport.ZeroSelectStartButtonsState();
            inputReport.ZeroShoulderButtonsState();

            // control buttons
            inputReport.Set(Ds3Button.Ps, IsBitSet(report[1], 4));
            inputReport.Set(Ds3Button.Select, IsBitSet(report[1], 0));
            inputReport.Set(Ds3Button.Start, IsBitSet(report[1], 1));

            // Left shoulder
            inputReport.Set(Ds3Button.L1, IsBitSet(report[0], 4));
            inputReport.Set(Ds3Axis.L1, report[15]);

            // Right shoulder
            inputReport.Set(Ds3Button.R1, IsBitSet(report[0], 5));
            inputReport.Set(Ds3Axis.R1, report[16]);

            // Left trigger
            inputReport.Set(Ds3Button.L2, IsBitSet(report[0], 6));
            inputReport.Set(Ds3Axis.L2, report[17]);

            // Right trigger
            inputReport.Set(Ds3Button.R2, IsBitSet(report[0], 7));
            inputReport.Set(Ds3Axis.R2, report[18]);

            // Triangle
            inputReport.Set(Ds3Button.Triangle, IsBitSet(report[0], 3));
            inputReport.Set(Ds3Axis.Triangle, report[11]);

            // Circle
            inputReport.Set(Ds3Button.Circle, IsBitSet(report[0], 2));
            inputReport.Set(Ds3Axis.Circle, report[12]);

            // Cross
            inputReport.Set(Ds3Button.Cross, IsBitSet(report[0], 1));
            inputReport.Set(Ds3Axis.Cross, report[13]);

            // Square
            inputReport.Set(Ds3Button.Square, IsBitSet(report[0], 0));
            inputReport.Set(Ds3Axis.Square, report[14]);

            // Left thumb
            inputReport.Set(Ds3Button.L3, IsBitSet(report[1], 2));
            // Right thumb
            inputReport.Set(Ds3Button.R3, IsBitSet(report[1], 3));

            // D-Pad
            if (report[2] != 0x0F)
            {
                switch (report[2])
                {
                    case 0:
                        inputReport.Set(Ds3Button.Up);
                        break;
                    case 1:
                        inputReport.Set(Ds3Button.Up);
                        inputReport.Set(Ds3Button.Right);
                        break;
                    case 2:
                        inputReport.Set(Ds3Button.Right);
                        break;
                    case 3:
                        inputReport.Set(Ds3Button.Right);
                        inputReport.Set(Ds3Button.Down);
                        break;
                    case 4:
                        inputReport.Set(Ds3Button.Down);
                        break;
                    case 5:
                        inputReport.Set(Ds3Button.Down);
                        inputReport.Set(Ds3Button.Left);
                        break;
                    case 6:
                        inputReport.Set(Ds3Button.Left);
                        break;
                    case 7:
                        inputReport.Set(Ds3Button.Left);
                        inputReport.Set(Ds3Button.Up);
                        break;
                }
            }

            // Left thumb stick
            inputReport.Set(Ds3Axis.Lx, report[3]);
            inputReport.Set(Ds3Axis.Ly, report[4]);

            // Right thumb stick
            inputReport.Set(Ds3Axis.Rx, report[5]);
            inputReport.Set(Ds3Axis.Ry, report[6]);

            #endregion

            OnHidReportReceived(inputReport);
        }