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">
-
+