in ScpControl/Usb/Ds4/UsbDs4.cs [227:279]
protected override void ParseHidReport(byte[] report)
{
if (report[0] != 0x01) return;
PacketCounter++;
var inputReport = NewHidReport();
Battery = (DsBattery) MapBattery(report[30]);
inputReport.PacketCounter = PacketCounter;
var buttons = (report[5] << 0) | (report[6] << 8) | (report[7] << 16);
#region Convert HAT to DPAD
report[5] &= 0xF0;
switch ((uint) buttons & 0xF)
{
case 0:
report[5] |= (byte) Ds4Button.Up.Offset;
break;
case 1:
report[5] |= (byte) (Ds4Button.Up.Offset | Ds4Button.Right.Offset);
break;
case 2:
report[5] |= (byte) Ds4Button.Right.Offset;
break;
case 3:
report[5] |= (byte) (Ds4Button.Right.Offset | Ds4Button.Down.Offset);
break;
case 4:
report[5] |= (byte) Ds4Button.Down.Offset;
break;
case 5:
report[5] |= (byte) (Ds4Button.Down.Offset | Ds4Button.Left.Offset);
break;
case 6:
report[5] |= (byte) Ds4Button.Left.Offset;
break;
case 7:
report[5] |= (byte) (Ds4Button.Left.Offset | Ds4Button.Up.Offset);
break;
}
#endregion
// copy controller data to report packet
Buffer.BlockCopy(report, 0, inputReport.RawBytes, 8, 64);
OnHidReportReceived(inputReport);
}