diff --git a/app/AsusMouseSettings.cs b/app/AsusMouseSettings.cs index 6e226baf..8f1c816a 100644 --- a/app/AsusMouseSettings.cs +++ b/app/AsusMouseSettings.cs @@ -105,7 +105,7 @@ namespace GHelper private void ComboBoxPollingRate_DropDownClosed(object? sender, EventArgs e) { - mouse.SetPollingRate(comboBoxPollingRate.SelectedIndex + 1); + mouse.SetPollingRate(mouse.SupportedPollingrates()[comboBoxPollingRate.SelectedIndex]); } private void ButtonDPIColor_Click(object? sender, EventArgs e) @@ -337,7 +337,11 @@ namespace GHelper if (mouse.CanSetPollingRate()) { - comboBoxPollingRate.Items.AddRange(mouse.PollingRateDisplayStrings()); + foreach(PollingRate pr in mouse.SupportedPollingrates()) + { + comboBoxPollingRate.Items.Add(mouse.PollingRateDisplayString(pr)); + } + } else { @@ -433,7 +437,12 @@ namespace GHelper if (mouse.CanSetPollingRate()) { - comboBoxPollingRate.SelectedIndex = mouse.PollingRate - 1; + int idx = mouse.PollingRateIndex(mouse.PollingRate); + if(idx == -1) + { + return; + } + comboBoxPollingRate.SelectedIndex = idx; } if (mouse.HasAngleSnapping()) diff --git a/app/Peripherals/Mouse/AsusMouse.cs b/app/Peripherals/Mouse/AsusMouse.cs index 5f72029d..90e7e09e 100644 --- a/app/Peripherals/Mouse/AsusMouse.cs +++ b/app/Peripherals/Mouse/AsusMouse.cs @@ -15,6 +15,18 @@ namespace GHelper.Peripherals.Mouse Never = 0xFF } + public enum PollingRate + { + PR125Hz = 0, + PR250Hz = 1, + PR500Hz = 2, + PR1000Hz = 3, + PR2000Hz = 4, + PR4000Hz = 5, + PR8000Hz = 6, + PR16000Hz = 7 //for whenever that gets supported lol + } + public enum LiftOffDistance { Low = 0, @@ -88,6 +100,8 @@ namespace GHelper.Peripherals.Mouse public abstract class AsusMouse : Device, IPeripheral { + private static string[] POLLING_RATES = { "125 Hz", "250 Hz", "500 Hz", "1000 Hz", "2000 Hz", "4000 Hz", "8000 Hz", "16000 Hz" }; + internal const int ASUS_MOUSE_PACKET_SIZE = 65; public event EventHandler? Disconnect; @@ -106,7 +120,7 @@ namespace GHelper.Peripherals.Mouse public int DpiProfile { get; protected set; } public AsusMouseDPI[] DpiSettings { get; protected set; } public int Profile { get; protected set; } - public int PollingRate { get; protected set; } + public PollingRate PollingRate { get; protected set; } public bool AngleSnapping { get; protected set; } public short AngleAdjustmentDegrees { get; protected set; } @@ -453,17 +467,35 @@ namespace GHelper.Peripherals.Mouse return false; } - public virtual string PollingRateDisplayString(int pollingRate) + public virtual string PollingRateDisplayString(PollingRate pollingRate) { - return PollingRateDisplayStrings()[pollingRate -1]; + return POLLING_RATES[(int)pollingRate]; } public virtual int PollingRateCount() { - return PollingRateDisplayStrings().Length; + return SupportedPollingrates().Length; } - public abstract string[] PollingRateDisplayStrings(); + public virtual int PollingRateIndex(PollingRate pollingRate) + { + for (int i = 0; i < PollingRateCount(); ++i) + { + if (SupportedPollingrates()[i] == pollingRate) + { + return i; + } + } + return -1; + } + + + public virtual bool IsPollingRateSupported(PollingRate pollingRate) + { + return SupportedPollingrates().Contains(pollingRate); + } + + public abstract PollingRate[] SupportedPollingrates(); public virtual bool CanSetPollingRate() { @@ -475,7 +507,7 @@ namespace GHelper.Peripherals.Mouse return new byte[] { 0x00, 0x12, 0x04, 0x00 }; } - protected virtual byte[] GetUpdatePollingRatePacket(int pollingRate) + protected virtual byte[] GetUpdatePollingRatePacket(PollingRate pollingRate) { return new byte[] { 0x00, 0x51, 0x31, 0x04, 0x00, (byte)pollingRate }; } @@ -488,14 +520,14 @@ namespace GHelper.Peripherals.Mouse return new byte[] { 0x00, 0x51, 0x31, 0x0B, 0x00, (byte)(angleAdjustment & 0xFF), (byte)((angleAdjustment >> 8) & 0xFF) }; } - protected virtual int ParsePollingRate(byte[] packet) + protected virtual PollingRate ParsePollingRate(byte[] packet) { if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00) { - return packet[13]; + return (PollingRate)packet[13]; } - return -1; + return PollingRate.PR125Hz; } protected virtual bool ParseAngleSnapping(byte[] packet) @@ -539,16 +571,16 @@ namespace GHelper.Peripherals.Mouse } } - public void SetPollingRate(int pollingRate) + public void SetPollingRate(PollingRate pollingRate) { if (!CanSetPollingRate()) { return; } - if (pollingRate > PollingRateCount() || pollingRate < 1) + if (!IsPollingRateSupported(pollingRate)) { - Logger.WriteLine(GetDisplayName() + ": Pollingrate:" + pollingRate + " is invalid."); + Logger.WriteLine(GetDisplayName() + ": Pollingrate:" + pollingRate + " is not supported by this mouse."); return; } diff --git a/app/Peripherals/Mouse/Models/ChakramX.cs b/app/Peripherals/Mouse/Models/ChakramX.cs index 8f5eca9a..7a96116c 100644 --- a/app/Peripherals/Mouse/Models/ChakramX.cs +++ b/app/Peripherals/Mouse/Models/ChakramX.cs @@ -3,8 +3,6 @@ namespace GHelper.Peripherals.Mouse.Models { public class ChakramX : AsusMouse { - private static string[] POLLING_RATES = { "250Hz", "500Hz", "1000Hz" }; - public ChakramX() : base(0x0B05, 0x1A1A, "mi_00", true) { } @@ -18,9 +16,13 @@ namespace GHelper.Peripherals.Mouse.Models return "ROG Chakram X (Wireless)"; } - public override string[] PollingRateDisplayStrings() + public override PollingRate[] SupportedPollingrates() { - return POLLING_RATES; + return new PollingRate[] { + PollingRate.PR250Hz, + PollingRate.PR500Hz, + PollingRate.PR1000Hz + }; } public override bool HasAngleSnapping() @@ -62,7 +64,6 @@ namespace GHelper.Peripherals.Mouse.Models public class ChakramXWired : ChakramX { - private static string[] POLLING_RATES = { "250Hz", "500Hz", "1000Hz", "2000Hz", "4000Hz", "8000Hz" }; public ChakramXWired() : base(0x1A18, false) { } @@ -72,9 +73,16 @@ namespace GHelper.Peripherals.Mouse.Models return "ROG Chakram X (Wired)"; } - public override string[] PollingRateDisplayStrings() + public override PollingRate[] SupportedPollingrates() { - return POLLING_RATES; + return new PollingRate[] { + PollingRate.PR250Hz, + PollingRate.PR500Hz, + PollingRate.PR1000Hz, + PollingRate.PR2000Hz, + PollingRate.PR4000Hz, + PollingRate.PR8000Hz + }; } } } diff --git a/app/Peripherals/Mouse/Models/P711.cs b/app/Peripherals/Mouse/Models/P711.cs index 3d2d57ec..fae8f775 100644 --- a/app/Peripherals/Mouse/Models/P711.cs +++ b/app/Peripherals/Mouse/Models/P711.cs @@ -2,8 +2,6 @@ { public class P711 : AsusMouse { - private static string[] POLLING_RATES = { "125Hz", "250Hz", "500Hz", "1000Hz" }; - public P711() : base(0x0B05, 0x1A70, "mi_01", true) { } @@ -23,9 +21,14 @@ } - public override string[] PollingRateDisplayStrings() + public override PollingRate[] SupportedPollingrates() { - return POLLING_RATES; + return new PollingRate[] { + PollingRate.PR125Hz, + PollingRate.PR250Hz, + PollingRate.PR500Hz, + PollingRate.PR1000Hz + }; } public override int ProfileCount()