From 0da6540de462cb8dfeab10286f05bcd72938556f Mon Sep 17 00:00:00 2001 From: IceStormNG Date: Sun, 14 Jan 2024 20:40:30 +0100 Subject: [PATCH] Support for Strix Carry (P508) (#1922) --- app/Peripherals/Mouse/Models/StrixCarry.cs | 179 +++++++++++++++++++++ app/Peripherals/PeripheralsProvider.cs | 1 + 2 files changed, 180 insertions(+) create mode 100644 app/Peripherals/Mouse/Models/StrixCarry.cs diff --git a/app/Peripherals/Mouse/Models/StrixCarry.cs b/app/Peripherals/Mouse/Models/StrixCarry.cs new file mode 100644 index 00000000..5fcb906d --- /dev/null +++ b/app/Peripherals/Mouse/Models/StrixCarry.cs @@ -0,0 +1,179 @@ +namespace GHelper.Peripherals.Mouse.Models +{ + //P508 + public class StrixCarry : AsusMouse + { + public StrixCarry() : base(0x0B05, 0x18B4, "mi_01", true) + { + } + + public override int DPIProfileCount() + { + return 2; + } + + public override string GetDisplayName() + { + return "ROG Strix Carry (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 7_200; + } + public override int DPIIncrements() + { + return 100; + } + + public override bool HasDebounceSetting() + { + return true; + } + + public override bool HasLiftOffSetting() + { + //Potentially does nothing. AC does not show the setting, but the mouse responds to it and stores it. + return true; + } + + public override bool HasRGB() + { + return false; + } + + public override bool HasAutoPowerOff() + { + return true; + } + + public override bool HasAngleSnapping() + { + return true; + } + public override bool HasXYDPI() + { + return false; + } + + public override bool CanChangeDPIProfile() + { + return false; + } + + //Has 25% increments only. + protected override int ParseBattery(byte[] packet) + { + if (packet[1] == 0x12 && packet[2] == 0x07) + { + return packet[7] * 25; + } + + return -1; + } + + protected override PowerOffSetting ParsePowerOffSetting(byte[] packet) + { + if (packet[1] == 0x12 && packet[2] == 0x07) + { + return (PowerOffSetting)packet[5]; + } + + return PowerOffSetting.Never; + } + + protected override PollingRate ParsePollingRate(byte[] packet) + { + if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00) + { + return (PollingRate)packet[9]; + } + + return PollingRate.PR125Hz; + } + + protected override byte[] GetUpdatePollingRatePacket(PollingRate pollingRate) + { + return new byte[] { reportId, 0x51, 0x31, 0x02, 0x00, (byte)pollingRate }; + } + + protected override bool ParseAngleSnapping(byte[] packet) + { + if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00) + { + return packet[13] == 0x01; + } + + return false; + } + + protected override byte[] GetUpdateAngleSnappingPacket(bool angleSnapping) + { + return new byte[] { reportId, 0x51, 0x31, 0x04, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) }; + } + + protected override DebounceTime ParseDebounce(byte[] packet) + { + if (packet[1] != 0x12 || packet[2] != 0x04 || packet[3] != 0x00) + { + return DebounceTime.MS12; + } + + if (packet[11] < 0x02) + { + return DebounceTime.MS12; + } + + if (packet[11] > 0x07) + { + return DebounceTime.MS32; + } + + return (DebounceTime)packet[11]; + } + + protected override byte[] GetUpdateDebouncePacket(DebounceTime debounce) + { + return new byte[] { reportId, 0x51, 0x31, 0x03, 0x00, ((byte)debounce) }; + } + + protected override int ParseProfile(byte[] packet) + { + if (packet[1] == 0x12 && packet[2] == 0x00 && packet[3] == 0x00) + { + return packet[10]; + } + Logger.WriteLine(GetDisplayName() + ": Failed to decode active profile"); + return 0; + } + + protected override int ParseDPIProfile(byte[] packet) + { + if (packet[1] == 0x12 && packet[2] == 0x00 && packet[3] == 0x00) + { + return packet[11]; + } + Logger.WriteLine(GetDisplayName() + ": Failed to decode active profile"); + return 1; + } + + protected override byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff) + { + return new byte[] { 0x00, 0x51, 0x37, 0x00, 0x00, (byte)powerOff, 0x00, (byte)lowBatteryWarning }; + } + } +} diff --git a/app/Peripherals/PeripheralsProvider.cs b/app/Peripherals/PeripheralsProvider.cs index 4619a261..28b5c3af 100644 --- a/app/Peripherals/PeripheralsProvider.cs +++ b/app/Peripherals/PeripheralsProvider.cs @@ -213,6 +213,7 @@ namespace GHelper.Peripherals DetectMouse(new ChakramWired()); DetectMouse(new ChakramCore()); DetectMouse(new SpathaX()); + DetectMouse(new StrixCarry()); } public static void DetectMouse(AsusMouse am)