mirror of
https://github.com/jkocon/g-helper.git
synced 2026-02-23 13:00:52 +01:00
210 lines
6.2 KiB
C#
210 lines
6.2 KiB
C#
|
|
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)";
|
|
}
|
|
}
|
|
}
|