in ScpControl/Usb/Ds3/UsbDs3.cs [266:378]
protected override void Process(DateTime now)
{
if (!Monitor.TryEnter(_hidReport)) return;
try
{
#region Quick Disconnect handling
if (IsShutdown)
{
if ((now - m_Disconnect).TotalMilliseconds >= 2000)
{
Log.InfoFormat("Pad {0} disconnected due to quick disconnect combo", PadId);
Shutdown();
return;
}
}
#endregion
#region LED control
if ((now - m_Last).TotalMilliseconds >= GlobalConfiguration.Instance.Ds3LEDsPeriod
&& PacketCounter > 0
&& XInputSlot.HasValue)
{
m_Last = now;
_ledStatus = 0;
switch (GlobalConfiguration.Instance.Ds3LEDsFunc)
{
case 0:
_ledStatus = 0;
break;
case 1:
if (GlobalConfiguration.Instance.Ds3PadIDLEDsFlashCharging &&
Battery == DsBattery.Charging)
{
_counterForLeds++;
_counterForLeds %= 2;
if (_counterForLeds == 1)
_ledStatus = _ledOffsets[(int) XInputSlot];
}
else _ledStatus = _ledOffsets[(int) XInputSlot];
break;
case 2:
switch (Battery)
{
case DsBattery.None:
_ledStatus = 0;
break;
case DsBattery.Charging:
_counterForLeds++;
_counterForLeds %= (byte) _ledOffsets.Length;
for (byte i = 0; i <= _counterForLeds; i++)
_ledStatus |= _ledOffsets[i];
break;
case DsBattery.Charged:
_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;
}
_hidReport[9] = _ledStatus;
}
#endregion
#region send HID Output Report
var transfered = 0;
if (!IsFake)
{
SendTransfer(UsbHidRequestType.HostToDevice, UsbHidRequest.SetReport,
ToValue(UsbHidReportRequestType.Output, UsbHidReportRequestId.One),
_hidReport, ref transfered);
}
else
{
var outReport = ReportDescriptor.OutputReports.FirstOrDefault();
if (outReport == null)
return;
var buffer = new byte[outReport.Length + 1];
Buffer.BlockCopy(_hidReport, 0, buffer, 1, _hidReport.Length);
buffer[0] = outReport.ID;
WriteIntPipe(buffer, buffer.Length, ref transfered);
}
#endregion
}
finally
{
Monitor.Exit(_hidReport);
}
}