in ScpControl/Usb/Gamepads/UsbGameStopPcAdvanced.cs [21:123]
protected override void ParseHidReport(byte[] report)
{
if (report[8] != 0xC0 && report[8] != 0x40) return;
PacketCounter++;
var inputReport = NewHidReport();
#region HID Report translation
// no battery state since the Gamepad is Usb-powered
Battery = DsBattery.None;
// packet counter
inputReport.PacketCounter = PacketCounter;
// reset buttons
inputReport.ZeroSelectStartButtonsState();
inputReport.ZeroShoulderButtonsState();
// buttons equaly reported in both modes
inputReport.Set(Ds3Button.Circle, IsBitSet(report[6], 5));
inputReport.Set(Ds3Button.Cross, IsBitSet(report[6], 6));
inputReport.Set(Ds3Button.Triangle, IsBitSet(report[6], 4));
inputReport.Set(Ds3Button.Square, IsBitSet(report[6], 7));
inputReport.Set(Ds3Button.Select, IsBitSet(report[7], 4));
inputReport.Set(Ds3Button.Start, IsBitSet(report[7], 5));
inputReport.Set(Ds3Button.L1, IsBitSet(report[7], 0));
inputReport.Set(Ds3Button.R1, IsBitSet(report[7], 1));
inputReport.Set(Ds3Button.L2, IsBitSet(report[7], 2));
inputReport.Set(Ds3Button.R2, IsBitSet(report[7], 3));
inputReport.Set(Ds3Button.L3, IsBitSet(report[7], 6));
inputReport.Set(Ds3Button.R3, IsBitSet(report[7], 7));
// detect mode it's running in
switch (report[8])
{
case 0xC0: // mode 1
{
inputReport.Set(Ds3Button.Up, (report[2] == 0x00));
inputReport.Set(Ds3Button.Right, (report[1] == 0xFF));
inputReport.Set(Ds3Button.Down, (report[2] == 0xFF));
inputReport.Set(Ds3Button.Left, (report[1] == 0x00));
// mode 1 doesn't report the thumb sticks
inputReport.Set(Ds3Axis.Lx, 0x80);
inputReport.Set(Ds3Axis.Ly, 0x80);
inputReport.Set(Ds3Axis.Rx, 0x80);
inputReport.Set(Ds3Axis.Ry, 0x80);
}
break;
case 0x40: // mode 2
{
var dPad = (byte) (report[6] & ~0xF0);
switch (dPad)
{
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;
}
inputReport.Set(Ds3Axis.Lx, report[1]);
inputReport.Set(Ds3Axis.Ly, report[2]);
inputReport.Set(Ds3Axis.Rx, report[4]);
inputReport.Set(Ds3Axis.Ry, report[5]);
}
break;
}
#endregion
OnHidReportReceived(inputReport);
}