diff --git a/ScpControl/Bluetooth/BthDs3.cs b/ScpControl/Bluetooth/BthDs3.cs index 1ed1889a..f93c7a62 100644 --- a/ScpControl/Bluetooth/BthDs3.cs +++ b/ScpControl/Bluetooth/BthDs3.cs @@ -87,6 +87,9 @@ public BthDs3(IBthDevice device, byte[] master, byte lsb, byte msb) #endregion + private byte ledStatus = 0; + private byte counterForLeds = 0; + public override DsPadId PadId { get { return (DsPadId)m_ControllerId; } @@ -95,7 +98,7 @@ public override DsPadId PadId m_ControllerId = (byte)value; m_ReportArgs.Pad = PadId; - _hidReport[11] = _ledOffsets[m_ControllerId]; + _hidReport[11] = ledStatus; } } @@ -256,19 +259,69 @@ protected override void Process(DateTime now) { m_Tick = now; - if (m_Queued == 0) m_Queued = 1; + if (m_Queued == 0) m_Queued = 1; + + ledStatus = 0; + + switch (GlobalConfiguration.Instance.Ds3LEDsFunc) + { + case 0: + ledStatus = 0; + break; + case 1: + if (GlobalConfiguration.Instance.Ds3PadIDLEDsFlashCharging) + { + counterForLeds++; + counterForLeds %= 2; + if (counterForLeds == 1) + ledStatus = _ledOffsets[m_ControllerId]; + } + else ledStatus = _ledOffsets[m_ControllerId]; + break; + case 2: + switch (Battery) + { + case DsBattery.None: + ledStatus = (byte)(_ledOffsets[0] | _ledOffsets[3]); + break; + case DsBattery.Dieing: + 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; + } + + _hidReport[11] = ledStatus; - if (Battery < DsBattery.Medium) - { - _hidReport[11] ^= _ledOffsets[m_ControllerId]; - } - else - { - _hidReport[11] |= _ledOffsets[m_ControllerId]; } - } - if (GlobalConfiguration.Instance.DisableLED) _hidReport[11] = 0; + } #region Fake DS3 workaround @@ -290,7 +343,7 @@ protected override void Process(DateTime now) m_Queued--; m_Device.HID_Command(HciHandle.Bytes, Get_SCID(L2CAP.PSM.HID_Command), _hidReport); - } + } } } diff --git a/ScpControl/Properties/Settings.Designer.cs b/ScpControl/Properties/Settings.Designer.cs index 4f982e01..71eefaf3 100644 --- a/ScpControl/Properties/Settings.Designer.cs +++ b/ScpControl/Properties/Settings.Designer.cs @@ -93,19 +93,6 @@ public bool FlipAxisRy { } } - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Configuration.SettingsProviderAttribute(typeof(ScpControl.Utilities.PortableSettingsProvider))] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("False")] - public bool DisableLed { - get { - return ((bool)(this["DisableLed"])); - } - set { - this["DisableLed"] = value; - } - } - [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Configuration.SettingsProviderAttribute(typeof(ScpControl.Utilities.PortableSettingsProvider))] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] @@ -387,5 +374,89 @@ public string BluetoothDisconnectSoundFile { this["BluetoothDisconnectSoundFile"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1500")] + public int Ds3LEDsFlashingPeriod { + get { + return ((int)(this["Ds3LEDsFlashingPeriod"])); + } + set { + this["Ds3LEDsFlashingPeriod"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("1")] + public int Ds3LEDsFunction { + get { + return ((int)(this["Ds3LEDsFunction"])); + } + set { + this["Ds3LEDsFunction"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + public bool Ds3PadIDLEDsFlashCharging { + get { + return ((bool)(this["Ds3PadIDLEDsFlashCharging"])); + } + set { + this["Ds3PadIDLEDsFlashCharging"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool Ds3LEDsCustom1 { + get { + return ((bool)(this["Ds3LEDsCustom1"])); + } + set { + this["Ds3LEDsCustom1"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool Ds3LEDsCustom2 { + get { + return ((bool)(this["Ds3LEDsCustom2"])); + } + set { + this["Ds3LEDsCustom2"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool Ds3LEDsCustom3 { + get { + return ((bool)(this["Ds3LEDsCustom3"])); + } + set { + this["Ds3LEDsCustom3"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("False")] + public bool Ds3LEDsCustom4 { + get { + return ((bool)(this["Ds3LEDsCustom4"])); + } + set { + this["Ds3LEDsCustom4"] = value; + } + } } } diff --git a/ScpControl/Properties/Settings.settings b/ScpControl/Properties/Settings.settings index 79721642..2221c8f7 100644 --- a/ScpControl/Properties/Settings.settings +++ b/ScpControl/Properties/Settings.settings @@ -20,9 +20,6 @@ False - - False - False @@ -89,5 +86,26 @@ Media\disconnect.flac + + 1500 + + + 1 + + + True + + + False + + + False + + + False + + + False + \ No newline at end of file diff --git a/ScpControl/ScpCore/GlobalConfiguration.cs b/ScpControl/ScpCore/GlobalConfiguration.cs index 14e49d87..c4014ef6 100644 --- a/ScpControl/ScpCore/GlobalConfiguration.cs +++ b/ScpControl/ScpCore/GlobalConfiguration.cs @@ -96,12 +96,6 @@ public bool FlipRY set { Settings.Default.FlipAxisRy = value; } } - public bool DisableLED - { - get { return Settings.Default.DisableLed; } - set { Settings.Default.DisableLed = value; } - } - public bool DisableRumble { get { return Settings.Default.DisableRumble; } @@ -272,6 +266,45 @@ public string BluetoothDisconnectSoundFile set { Settings.Default.BluetoothDisconnectSoundFile = value; } } + public int Ds3LEDsPeriod + { + get { return Settings.Default.Ds3LEDsFlashingPeriod; } + set { Settings.Default.Ds3LEDsFlashingPeriod = value; } + } + + public int Ds3LEDsFunc + { + get { return Settings.Default.Ds3LEDsFunction; } + set { Settings.Default.Ds3LEDsFunction = value; } + } + + public bool Ds3PadIDLEDsFlashCharging + { + get { return Settings.Default.Ds3PadIDLEDsFlashCharging; } + set { Settings.Default.Ds3PadIDLEDsFlashCharging = value; } + } + + public bool Ds3LEDsCustom1 + { + get { return Settings.Default.Ds3LEDsCustom1; } + set { Settings.Default.Ds3LEDsCustom1 = value; } + } + public bool Ds3LEDsCustom2 + { + get { return Settings.Default.Ds3LEDsCustom2; } + set { Settings.Default.Ds3LEDsCustom2 = value; } + } + public bool Ds3LEDsCustom3 + { + get { return Settings.Default.Ds3LEDsCustom3; } + set { Settings.Default.Ds3LEDsCustom3 = value; } + } + public bool Ds3LEDsCustom4 + { + get { return Settings.Default.Ds3LEDsCustom4; } + set { Settings.Default.Ds3LEDsCustom4 = value; } + } + #endregion } } \ No newline at end of file diff --git a/ScpControl/Usb/UsbDs3.cs b/ScpControl/Usb/UsbDs3.cs index eeb408f5..7f5a74a1 100644 --- a/ScpControl/Usb/UsbDs3.cs +++ b/ScpControl/Usb/UsbDs3.cs @@ -50,6 +50,9 @@ public UsbDs3(IContainer container) #endregion + private byte counterForLeds = 0; + private byte ledStatus = 0; + public override DsPadId PadId { get { return (DsPadId)m_ControllerId; } @@ -58,7 +61,7 @@ public override DsPadId PadId m_ControllerId = (byte)value; m_ReportArgs.Pad = PadId; - _hidReport[9] = _ledOffsets[m_ControllerId]; + _hidReport[9] = ledStatus; } } @@ -130,7 +133,7 @@ public override bool Rumble(byte large, byte small) _hidReport[4] = large; } - _hidReport[9] = (byte)(GlobalConfiguration.Instance.DisableLED ? 0 : _ledOffsets[m_ControllerId]); + _hidReport[9] = ledStatus; return SendTransfer(UsbHidRequestType.HostToDevice, UsbHidRequest.SetReport, ToValue(UsbHidReportRequestType.Output, UsbHidReportRequestId.One), @@ -220,22 +223,60 @@ protected override void Process(DateTime now) } } - if ((now - m_Last).TotalMilliseconds >= 1500 && m_Packet > 0) + if ((now - m_Last).TotalMilliseconds >= GlobalConfiguration.Instance.Ds3LEDsPeriod && m_Packet > 0) { var transfered = 0; m_Last = now; - if (Battery == DsBattery.Charging) - { - _hidReport[9] ^= _ledOffsets[m_ControllerId]; - } - else + ledStatus = 0; + + switch (GlobalConfiguration.Instance.Ds3LEDsFunc) { - _hidReport[9] |= _ledOffsets[m_ControllerId]; + case 0: + ledStatus = 0; + break; + case 1: + if (GlobalConfiguration.Instance.Ds3PadIDLEDsFlashCharging) + { + counterForLeds++; + counterForLeds %= 2; + if (counterForLeds == 1) + ledStatus = _ledOffsets[m_ControllerId]; + } + else ledStatus = _ledOffsets[m_ControllerId]; + 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; } - if (GlobalConfiguration.Instance.DisableLED) _hidReport[9] = 0; + _hidReport[9] = ledStatus; SendTransfer(UsbHidRequestType.HostToDevice, UsbHidRequest.SetReport, ToValue(UsbHidReportRequestType.Output, UsbHidReportRequestId.One), diff --git a/ScpControl/app.config b/ScpControl/app.config index 1fb6d872..ba63630b 100644 --- a/ScpControl/app.config +++ b/ScpControl/app.config @@ -42,9 +42,6 @@ False - - False - False @@ -108,6 +105,27 @@ Media\disconnect.flac + + 1500 + + + 1 + + + True + + + False + + + False + + + False + + + False + \ No newline at end of file diff --git a/ScpSettings/MainWindow.xaml b/ScpSettings/MainWindow.xaml index 73a250ac..710f76d8 100644 --- a/ScpSettings/MainWindow.xaml +++ b/ScpSettings/MainWindow.xaml @@ -3,13 +3,14 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Layout.Toolkit" xmlns:customControls="clr-namespace:ScpSettings.Controls" + xmlns:local="clr-namespace:ScpSettings" xmlns:bluetooth="clr-namespace:ScpControl.Bluetooth;assembly=ScpControl" Title="ScpToolkit Global Configuration" Height="650" Width="480" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Closing="Window_Closing" Initialized="Window_Initialized" Icon="Scp.ico"> - +