-
-
Notifications
You must be signed in to change notification settings - Fork 288
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1419 from IceStormNG/asus-mouse-support
Support for ROG Chakram P704
- Loading branch information
Showing
2 changed files
with
211 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,209 @@ | ||
| ||
namespace GHelper.Peripherals.Mouse.Models | ||
{ | ||
//P704 | ||
public class Chakram : AsusMouse | ||
{ | ||
public Chakram() : base(0x0B05, 0x18E5, "mi_00", true) { | ||
|
||
} | ||
|
||
protected Chakram(ushort vendorId, bool wireless) : base(0x0B05, vendorId, "mi_00", wireless) | ||
{ | ||
} | ||
public override int DPIProfileCount() | ||
{ | ||
return 4; | ||
} | ||
|
||
public override string GetDisplayName() | ||
{ | ||
return "ROG Chakram (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 ChakramWired : Chakram | ||
{ | ||
public ChakramWired() : base(0x18E3, false) | ||
{ | ||
} | ||
|
||
public override string GetDisplayName() | ||
{ | ||
return "ROG Chakram (Wired)"; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters