in ScpControl/Bluetooth/Ds3/BthDs3.cs [150:255]
protected override void Process(DateTime now)
{
if (!Monitor.TryEnter(_hidOutputReport) || State != DsState.Connected) return;
try
{
#region LED manipulation
if ((now - m_Tick).TotalMilliseconds >= 500
&& m_Packet > 0
&& XInputSlot.HasValue)
{
m_Tick = now;
if (m_Queued == 0) m_Queued = 1;
_ledStatus = 0;
switch (GlobalConfiguration.Instance.Ds3LEDsFunc)
{
case 0:
_ledStatus = 0;
break;
case 1:
if (GlobalConfiguration.Instance.Ds3PadIDLEDsFlashCharging && Battery == DsBattery.Low)
{
_counterForLeds++;
_counterForLeds %= 2;
if (_counterForLeds == 1)
_ledStatus = _ledOffsets[(int) XInputSlot];
}
else _ledStatus = _ledOffsets[(int) XInputSlot];
break;
case 2:
switch (Battery)
{
case DsBattery.None:
_ledStatus = (byte) (_ledOffsets[0] | _ledOffsets[3]);
break;
case DsBattery.Dying:
_ledStatus = (byte) (_ledOffsets[1] | _ledOffsets[2]);
break;
case DsBattery.Low:
_counterForLeds++;
_counterForLeds %= 2;
if (_counterForLeds == 1)
_ledStatus = _ledOffsets[0];
break;
case DsBattery.Medium:
_ledStatus = (byte) (_ledOffsets[0] | _ledOffsets[1]);
break;
case DsBattery.High:
_ledStatus = (byte) (_ledOffsets[0] | _ledOffsets[1] | _ledOffsets[2]);
break;
case DsBattery.Full:
_ledStatus =
(byte) (_ledOffsets[0] | _ledOffsets[1] | _ledOffsets[2] | _ledOffsets[3]);
break;
default:
;
break;
}
break;
case 3:
if (GlobalConfiguration.Instance.Ds3LEDsCustom1) _ledStatus |= _ledOffsets[0];
if (GlobalConfiguration.Instance.Ds3LEDsCustom2) _ledStatus |= _ledOffsets[1];
if (GlobalConfiguration.Instance.Ds3LEDsCustom3) _ledStatus |= _ledOffsets[2];
if (GlobalConfiguration.Instance.Ds3LEDsCustom4) _ledStatus |= _ledOffsets[3];
break;
default:
_ledStatus = 0;
break;
}
_hidOutputReport[11] = _ledStatus;
}
#endregion
#region Fake DS3 workaround
// TODO: this works for some but breaks others, so... dafuq >_<
if (IsFake)
{
//_hidOutputReport[0] = 0xA2;
//_hidOutputReport[3] = 0xFF;
//_hidOutputReport[5] = 0x00;
}
#endregion
if (m_Blocked || m_Queued <= 0) return;
if (!((now - m_Last).TotalMilliseconds >= GlobalConfiguration.Instance.Latency)) return;
m_Last = now;
m_Blocked = true;
m_Queued--;
BluetoothDevice.HID_Command(HciHandle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), _hidOutputReport);
}
finally
{
Monitor.Exit(_hidOutputReport);
}
}