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);
}