diff --git a/app/AsusMouseSettings.cs b/app/AsusMouseSettings.cs index 62a9715b..63a30c99 100644 --- a/app/AsusMouseSettings.cs +++ b/app/AsusMouseSettings.cs @@ -301,8 +301,10 @@ namespace GHelper private void ComboBoxAnimationSpeed_DropDownClosed(object? sender, EventArgs e) { LightingSetting? ls = mouse.LightingSettingForZone(visibleZone); - ls.AnimationSpeed = (AnimationSpeed)comboBoxAnimationSpeed.SelectedIndex; - + // 0 => 0x9 + // 1 => 0x7 + // 2 => 0x5 + ls.AnimationSpeed = (AnimationSpeed)(0x9 - (comboBoxAnimationSpeed.SelectedIndex * 0x2)); UpdateLightingSettings(ls, visibleZone); } @@ -602,6 +604,12 @@ namespace GHelper labelLowBatteryWarningValue.Visible = false; sliderLowBatteryWarning.Visible = false; } + else + { + sliderLowBatteryWarning.Min = 0; + sliderLowBatteryWarning.Step = mouse.LowBatteryWarningStep(); + sliderLowBatteryWarning.Max = mouse.LowBatteryWarningMax(); + } if (!mouse.HasAutoPowerOff() && !mouse.HasLowBatteryWarning()) { @@ -824,8 +832,10 @@ namespace GHelper else pictureBoxLightingColor.BackColor = ls.RGBColor; - - comboBoxAnimationSpeed.SelectedIndex = (((int)ls.AnimationSpeed) - 5) / 2; + //0x09 => 0 + //0x07 => 1 + //0x05 => 2 + comboBoxAnimationSpeed.SelectedIndex = 2 - ((((int)ls.AnimationSpeed) - 5) / 2); comboBoxAnimationDirection.SelectedIndex = (int)ls.AnimationDirection; } diff --git a/app/Peripherals/Mouse/AsusMouse.cs b/app/Peripherals/Mouse/AsusMouse.cs index c8970608..5481e0e9 100644 --- a/app/Peripherals/Mouse/AsusMouse.cs +++ b/app/Peripherals/Mouse/AsusMouse.cs @@ -445,6 +445,16 @@ namespace GHelper.Peripherals.Mouse return false; } + public virtual int LowBatteryWarningStep() + { + return 10; + } + + public virtual int LowBatteryWarningMax() + { + return 50; + } + public virtual bool HasLowBatteryWarning() { return false; diff --git a/app/Peripherals/Mouse/Models/PugioII.cs b/app/Peripherals/Mouse/Models/PugioII.cs new file mode 100644 index 00000000..21f1b12e --- /dev/null +++ b/app/Peripherals/Mouse/Models/PugioII.cs @@ -0,0 +1,209 @@ + +namespace GHelper.Peripherals.Mouse.Models +{ + //P705 + public class PugioII : AsusMouse + { + public PugioII() : base(0x0B05, 0x1908, "mi_00", true) + { + } + + protected PugioII(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless) + { + } + public override int DPIProfileCount() + { + return 4; + } + + public override string GetDisplayName() + { + return "ROG Pugio II (Wireless)"; + } + + public override PollingRate[] SupportedPollingrates() + { + return new PollingRate[] { + PollingRate.PR125Hz, + PollingRate.PR250Hz, + PollingRate.PR500Hz, + PollingRate.PR1000Hz + }; + } + + + public override int ProfileCount() + { + return 3; + } + public override int MaxDPI() + { + return 16_000; + } + + public override bool HasDebounceSetting() + { + return true; + } + public override bool HasLiftOffSetting() + { + return true; + } + public override int DPIIncrements() + { + return 100; + } + + public override bool HasRGB() + { + return true; + } + public override int MaxBrightness() + { + return 4; + } + + public override LightingZone[] SupportedLightingZones() + { + return new LightingZone[] { LightingZone.Logo, LightingZone.Scrollwheel, LightingZone.Underglow }; + } + + public override bool HasAutoPowerOff() + { + return true; + } + + public override bool HasAngleSnapping() + { + return true; + } + + public override bool HasAngleTuning() + { + return false; + } + + public override bool HasLowBatteryWarning() + { + return true; + } + + public override int LowBatteryWarningStep() + { + return 25; + } + + public override int LowBatteryWarningMax() + { + return 100; + } + + protected override int ParseBattery(byte[] packet) + { + return base.ParseBattery(packet) * 25; + } + protected override int ParseLowBatteryWarning(byte[] packet) + { + return base.ParseLowBatteryWarning(packet) * 25; + } + protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff) + { + return base.GetUpdateEnergySettingsPacket(lowBatteryWarning / 25, powerOff); + } + protected override byte[] GetReadLightingModePacket(LightingZone zone) + { + return new byte[] { 0x00, 0x12, 0x03, 0x00 }; + } + + protected LightingSetting? ParseLightingSetting(byte[] packet, LightingZone zone) + { + if (packet[1] != 0x12 || packet[2] != 0x03) + { + return null; + } + + int offset = 5 + (((int)zone) * 5); + + LightingSetting setting = new LightingSetting(); + + setting.LightingMode = LightingModeForIndex(packet[offset + 0]); + setting.Brightness = packet[offset + 1]; + + setting.RGBColor = Color.FromArgb(packet[offset + 2], packet[offset + 3], packet[offset + 4]); + + setting.AnimationDirection = SupportsAnimationDirection(setting.LightingMode) + ? (AnimationDirection)packet[21] + : AnimationDirection.Clockwise; + + if (setting.AnimationDirection != AnimationDirection.Clockwise + && setting.AnimationDirection != AnimationDirection.CounterClockwise) + { + setting.AnimationDirection = AnimationDirection.Clockwise; + } + + setting.RandomColor = SupportsRandomColor(setting.LightingMode) && packet[22] == 0x01; + setting.AnimationSpeed = SupportsAnimationSpeed(setting.LightingMode) + ? (AnimationSpeed)packet[23] + : AnimationSpeed.Medium; + + //If the mouse reports an out of range value, which it does when the current setting has no speed option, chose medium as default + if (setting.AnimationSpeed != AnimationSpeed.Fast + && setting.AnimationSpeed != AnimationSpeed.Medium + && setting.AnimationSpeed != AnimationSpeed.Slow) + { + setting.AnimationSpeed = AnimationSpeed.Medium; + } + return setting; + } + + public override void ReadLightingSetting() + { + if (!HasRGB()) + { + return; + } + //Mouse sends all lighting zones in one response + //21: Direction + //22: Random + //23: Speed + // 20 21 22 23 + //00 12 03 00 00 [03 04 00 00 ff] [03 04 00 00 ff] [03 04 00 00 ff] 00 04 00 00 + //00 12 03 00 00 [05 02 ff 00 ff] [05 02 ff 00 ff] [05 02 ff 00 ff] 00 01 01 00 + //00 12 03 00 00 [03 01 00 00 ff] [03 01 00 00 ff] [03 01 00 00 ff] 00 01 00 01 + byte[]? response = WriteForResponse(GetReadLightingModePacket(LightingZone.All)); + if (response is null) return; + + LightingZone[] lz = SupportedLightingZones(); + for (int i = 0; i < lz.Length; ++i) + { + LightingSetting? ls = ParseLightingSetting(response, lz[i]); + if (ls is null) + { + Logger.WriteLine(GetDisplayName() + ": Failed to read RGB Setting for Zone " + lz[i].ToString()); + continue; + } + + Logger.WriteLine(GetDisplayName() + ": Read RGB Setting for Zone " + lz[i].ToString() + ": " + ls.ToString()); + LightingSetting[i] = ls; + } + } + + public override bool CanChangeDPIProfile() + { + return false; + } + } + + + public class PugioIIWired : PugioII + { + public PugioIIWired() : base(0x1906, false) + { + } + + public override string GetDisplayName() + { + return "ROG Pugio II (Wired)"; + } + } +} diff --git a/app/Peripherals/PeripheralsProvider.cs b/app/Peripherals/PeripheralsProvider.cs index 6aca090a..6ae33982 100644 --- a/app/Peripherals/PeripheralsProvider.cs +++ b/app/Peripherals/PeripheralsProvider.cs @@ -202,6 +202,8 @@ namespace GHelper.Peripherals DetectMouse(new TUFM3()); DetectMouse(new KerisWirelssAimpoint()); DetectMouse(new KerisWirelssAimpointWired()); + DetectMouse(new PugioII()); + DetectMouse(new PugioIIWired()); } public static void DetectMouse(AsusMouse am) diff --git a/app/Properties/Strings.pt-PT.resx b/app/Properties/Strings.pt-PT.resx index 51dc84fa..fd1e82b5 100644 --- a/app/Properties/Strings.pt-PT.resx +++ b/app/Properties/Strings.pt-PT.resx @@ -357,10 +357,10 @@ Quer prosseguir? Carregando - Aumento da frequência básica + Frequência da GPU - Aumento da frequência da memória + Frequência da Memória Modo da GPU diff --git a/app/Settings.cs b/app/Settings.cs index 3024602c..1a1947b8 100644 --- a/app/Settings.cs +++ b/app/Settings.cs @@ -25,6 +25,8 @@ namespace GHelper ScreenControl screenControl = new ScreenControl(); AutoUpdateControl updateControl; + AsusMouseSettings? mouseSettings; + public AniMatrixControl matrix; public static System.Timers.Timer sensorTimer = default!; @@ -1187,6 +1189,12 @@ namespace GHelper private void ButtonPeripheral_Click(object? sender, EventArgs e) { + if (mouseSettings is not null) + { + mouseSettings.Close(); + return; + } + int index = 0; if (sender == buttonPeripheral2) index = 1; if (sender == buttonPeripheral3) index = 2; @@ -1207,16 +1215,30 @@ namespace GHelper //Should not happen if all device classes are implemented correctly. But better safe than sorry. return; } - AsusMouseSettings s = new AsusMouseSettings(am); - if (!s.IsDisposed) + mouseSettings = new AsusMouseSettings(am); + mouseSettings.TopMost = true; + mouseSettings.FormClosed += MouseSettings_FormClosed; + mouseSettings.Disposed += MouseSettings_Disposed; + if (!mouseSettings.IsDisposed) { - s.Show(); + mouseSettings.Show(); + } + else + { + mouseSettings = null; } } + } + private void MouseSettings_Disposed(object? sender, EventArgs e) + { + mouseSettings = null; + } - + private void MouseSettings_FormClosed(object? sender, FormClosedEventArgs e) + { + mouseSettings = null; } public void VisualiseFnLock()