in ScpControl/Usb/Gamepads/UsbShanWanWirelessGamepad.cs [11:96]
protected override void ParseHidReport(byte[] report)
{
if (report[7] != 0x00) return;
if (PacketCounter++ + 1 < PacketCounter)
{
Log.WarnFormat("Packet counter rolled over ({0}), resetting to 0", PacketCounter);
PacketCounter = 0;
}
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();
inputReport.Set(Ds3Button.Circle, IsBitSet(report[5], 5));
inputReport.Set(Ds3Button.Cross, IsBitSet(report[5], 6));
inputReport.Set(Ds3Button.Select, IsBitSet(report[6], 4));
inputReport.Set(Ds3Button.Start, IsBitSet(report[6], 5));
var dPad = (byte)(report[5] & ~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(Ds3Button.Triangle, IsBitSet(report[5], 4));
inputReport.Set(Ds3Button.Square, IsBitSet(report[5], 7));
inputReport.Set(Ds3Button.L1, IsBitSet(report[6], 0));
inputReport.Set(Ds3Button.R1, IsBitSet(report[6], 1));
inputReport.Set(Ds3Button.L2, IsBitSet(report[6], 2));
inputReport.Set(Ds3Button.R2, IsBitSet(report[6], 3));
inputReport.Set(Ds3Button.L3, IsBitSet(report[6], 6));
inputReport.Set(Ds3Button.R3, IsBitSet(report[6], 7));
inputReport.Set(Ds3Axis.Lx, report[3]);
inputReport.Set(Ds3Axis.Ly, report[4]);
inputReport.Set(Ds3Axis.Rx, report[1]);
inputReport.Set(Ds3Axis.Ry, report[2]);
#endregion
OnHidReportReceived(inputReport);
}