protected override void Process()

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