Various fixes in the protocol. Now it is tested and works (at least with the Chakram X in Dongle mode.)

This commit is contained in:
IceStormNG
2023-07-23 17:54:09 +02:00
parent 890032a81b
commit 117ffd0f62
2 changed files with 116 additions and 53 deletions

View File

@@ -1,5 +1,6 @@
using GHelper.AnimeMatrix.Communication; using GHelper.AnimeMatrix.Communication;
using GHelper.AnimeMatrix.Communication.Platform; using GHelper.AnimeMatrix.Communication.Platform;
using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
@@ -26,7 +27,7 @@ namespace GHelper.Peripherals.Mouse
CounterClockwise = 0x1 CounterClockwise = 0x1
} }
public enum LightingSpeed public enum AnimationSpeed
{ {
Slow = 0x9, Slow = 0x9,
Medium = 0x7, Medium = 0x7,
@@ -36,7 +37,7 @@ namespace GHelper.Peripherals.Mouse
{ {
Static = 0x0, Static = 0x0,
Breathing = 0x1, Breathing = 0x1,
Colorwheel = 0x2, ColorCycle = 0x2,
Rainbow = 0x3, Rainbow = 0x3,
React = 0x4, React = 0x4,
Comet = 0x5, Comet = 0x5,
@@ -49,7 +50,7 @@ namespace GHelper.Peripherals.Mouse
{ {
//Some Sane defaults //Some Sane defaults
LightingMode = LightingMode.Static; LightingMode = LightingMode.Static;
LightingSpeed = LightingSpeed.Medium; AnimationSpeed = AnimationSpeed.Medium;
AnimationDirection = AnimationDirection.Clockwise; AnimationDirection = AnimationDirection.Clockwise;
RandomColor = false; RandomColor = false;
Brightness = 25; Brightness = 25;
@@ -60,14 +61,14 @@ namespace GHelper.Peripherals.Mouse
public int Brightness { get; set; } public int Brightness { get; set; }
public Color RGBColor { get; set; } public Color RGBColor { get; set; }
public bool RandomColor { get; set; } public bool RandomColor { get; set; }
public LightingSpeed LightingSpeed { get; set; } public AnimationSpeed AnimationSpeed { get; set; }
public AnimationDirection AnimationDirection { get; set; } public AnimationDirection AnimationDirection { get; set; }
public override string? ToString() public override string? ToString()
{ {
return "LightingMode: " + LightingMode + ", Color (" + RGBColor.R + ", " + RGBColor.G + ", " + RGBColor.B return "LightingMode: " + LightingMode + ", Color (" + RGBColor.R + ", " + RGBColor.G + ", " + RGBColor.B
+ "), Brightness: " + Brightness + "%, LightingSpeed: " + LightingSpeed + ", RandomColor:" + RandomColor + ", AnimationDirection:" + AnimationDirection; + "), Brightness: " + Brightness + "%, LightingSpeed: " + AnimationSpeed + ", RandomColor:" + RandomColor + ", AnimationDirection:" + AnimationDirection;
} }
} }
@@ -105,7 +106,7 @@ namespace GHelper.Peripherals.Mouse
public int DpiProfile { get; protected set; } public int DpiProfile { get; protected set; }
public AsusMouseDPI[] DpiSettings { get; protected set; } public AsusMouseDPI[] DpiSettings { get; protected set; }
public int Profile { get; protected set; } public int Profile { get; protected set; }
public int PollingRate1 { get; protected set; } public int PollingRate { get; protected set; }
public bool AngleSnapping { get; protected set; } public bool AngleSnapping { get; protected set; }
public short AngleAdjustmentDegrees { get; protected set; } public short AngleAdjustmentDegrees { get; protected set; }
@@ -260,7 +261,7 @@ namespace GHelper.Peripherals.Mouse
return true; return true;
} }
protected virtual bool HasEnergySettings() public virtual bool HasEnergySettings()
{ {
return false; return false;
} }
@@ -307,6 +308,24 @@ namespace GHelper.Peripherals.Mouse
return 0; return 0;
} }
protected virtual byte[] GetUpdateEnergySettingsPacket(int lowBatteryWarning, PowerOffSetting powerOff)
{
return new byte[] { 0x00, 0x51, 0x37, 0x00, 0x00, (byte)powerOff, 0x00, (byte)lowBatteryWarning };
}
public void SetEnergySettings(int lowBatteryWarning, PowerOffSetting powerOff)
{
if (!HasEnergySettings())
{
return;
}
WriteForResponse(GetUpdateEnergySettingsPacket(lowBatteryWarning, powerOff));
Logger.WriteLine(GetDisplayName() + ": Got Auto Power Off: " + powerOff + " - Low Battery Warnning at: " + lowBatteryWarning + "%");
this.PowerOffSetting = powerOff;
this.LowBatteryWarning = lowBatteryWarning;
}
public void ReadBattery() public void ReadBattery()
{ {
@@ -343,7 +362,7 @@ namespace GHelper.Peripherals.Mouse
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
public abstract int ProfileCount(); public abstract int ProfileCount();
protected virtual bool HasProfiles() public virtual bool HasProfiles()
{ {
return true; return true;
} }
@@ -421,10 +440,6 @@ namespace GHelper.Peripherals.Mouse
// Polling Rate and Angle Snapping // Polling Rate and Angle Snapping
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
public int PollingRate()
{
return PollingRate1;
}
public virtual bool HasAngleSnapping() public virtual bool HasAngleSnapping()
{ {
@@ -434,8 +449,9 @@ namespace GHelper.Peripherals.Mouse
public abstract string PollingRateDisplayString(int pollingRate); public abstract string PollingRateDisplayString(int pollingRate);
public abstract int PollingRateCount(); public abstract int PollingRateCount();
public abstract string[] PollingRateDisplayStrings();
protected virtual bool CanSetPollingRate() public virtual bool CanSetPollingRate()
{ {
return true; return true;
} }
@@ -449,9 +465,9 @@ namespace GHelper.Peripherals.Mouse
{ {
return new byte[] { 0x00, 0x51, 0x31, 0x04, 0x00, (byte)pollingRate }; return new byte[] { 0x00, 0x51, 0x31, 0x04, 0x00, (byte)pollingRate };
} }
protected virtual byte[] GetUpdateAngleSnappingPacket(bool angleSnappin) protected virtual byte[] GetUpdateAngleSnappingPacket(bool angleSnapping)
{ {
return new byte[] { 0x00, 0x51, 0x31, 0x06, 0x00, (byte)(AngleSnapping ? 0x01 : 0x00) }; return new byte[] { 0x00, 0x51, 0x31, 0x06, 0x00, (byte)(angleSnapping ? 0x01 : 0x00) };
} }
protected virtual byte[] GetUpdateAngleAdjustmentPacket(short angleAdjustment) protected virtual byte[] GetUpdateAngleAdjustmentPacket(short angleAdjustment)
{ {
@@ -482,7 +498,7 @@ namespace GHelper.Peripherals.Mouse
{ {
if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00) if (packet[1] == 0x12 && packet[2] == 0x04 && packet[3] == 0x00)
{ {
return (short)(packet[19] << 8 | packet[20]); return (short)(packet[20] << 8 | packet[19]);
} }
return 0; return 0;
@@ -498,8 +514,8 @@ namespace GHelper.Peripherals.Mouse
byte[]? response = WriteForResponse(GetReadPollingRatePacket()); byte[]? response = WriteForResponse(GetReadPollingRatePacket());
if (response is null) return; if (response is null) return;
PollingRate1 = ParsePollingRate(response); PollingRate = ParsePollingRate(response);
Logger.WriteLine(GetDisplayName() + ": Pollingrate: " + PollingRateDisplayString(PollingRate1) + " (" + PollingRate1 + ")"); Logger.WriteLine(GetDisplayName() + ": Pollingrate: " + PollingRateDisplayString(PollingRate) + " (" + PollingRate + ")");
if (HasAngleSnapping()) if (HasAngleSnapping())
{ {
@@ -525,7 +541,7 @@ namespace GHelper.Peripherals.Mouse
WriteForResponse(GetUpdatePollingRatePacket(pollingRate)); WriteForResponse(GetUpdatePollingRatePacket(pollingRate));
Logger.WriteLine(GetDisplayName() + ": Pollingrate set to " + PollingRateDisplayString(pollingRate)); Logger.WriteLine(GetDisplayName() + ": Pollingrate set to " + PollingRateDisplayString(pollingRate));
this.PollingRate1 = pollingRate; this.PollingRate = pollingRate;
} }
public void SetAngleSnapping(bool angleSnapping) public void SetAngleSnapping(bool angleSnapping)
@@ -563,22 +579,22 @@ namespace GHelper.Peripherals.Mouse
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
// DPI // DPI
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
protected abstract int DPIProfileCount(); public abstract int DPIProfileCount();
protected virtual bool HasDPIColors() public virtual bool HasDPIColors()
{ {
return true; return true;
} }
protected virtual bool CanChangeDPIProfile() public virtual bool CanChangeDPIProfile()
{ {
return DPIProfileCount() > 1; return DPIProfileCount() > 1;
} }
protected virtual int MaxDPI() public virtual int MaxDPI()
{ {
return 2000; return 2000;
} }
protected virtual int MinDPI() public virtual int MinDPI()
{ {
return 100; return 100;
} }
@@ -588,8 +604,7 @@ namespace GHelper.Peripherals.Mouse
return new byte[] { 0x00, 0x51, 0x31, 0x09, 0x00, (byte)profile }; return new byte[] { 0x00, 0x51, 0x31, 0x09, 0x00, (byte)profile };
} }
//There is no API to read this out from the mouse. Armoury Crate also doesn't read it. //profiles start to count at 1
//You can however get the HID button event when you change the profile via a mouse button which tells you the profile it was set to
public void SetDPIProfile(int profile) public void SetDPIProfile(int profile)
{ {
if (!CanChangeDPIProfile()) if (!CanChangeDPIProfile())
@@ -597,14 +612,14 @@ namespace GHelper.Peripherals.Mouse
return; return;
} }
if (profile >= DPIProfileCount() || profile < 0) if (profile > DPIProfileCount() || profile < 1)
{ {
Logger.WriteLine(GetDisplayName() + ": DPI Profile:" + profile + " is invalid."); Logger.WriteLine(GetDisplayName() + ": DPI Profile:" + profile + " is invalid.");
return; return;
} }
//The first DPI profile is 1 //The first DPI profile is 1
WriteForResponse(GetChangeDPIProfilePacket(profile + 1)); WriteForResponse(GetChangeDPIProfilePacket(profile));
Logger.WriteLine(GetDisplayName() + ": DPI Profile set to " + profile); Logger.WriteLine(GetDisplayName() + ": DPI Profile set to " + profile);
this.DpiProfile = profile; this.DpiProfile = profile;
@@ -615,9 +630,8 @@ namespace GHelper.Peripherals.Mouse
return new byte[] { 0x00, 0x12, 0x04, 0x02 }; return new byte[] { 0x00, 0x12, 0x04, 0x02 };
} }
protected virtual byte[]? GetUpdateDPIPacket(int profile) protected virtual byte[]? GetUpdateDPIPacket(AsusMouseDPI dpi, int profile)
{ {
AsusMouseDPI dpi = DpiSettings[profile];
if (dpi is null) if (dpi is null)
{ {
return null; return null;
@@ -630,11 +644,11 @@ namespace GHelper.Peripherals.Mouse
if (HasDPIColors()) if (HasDPIColors())
{ {
return new byte[] { 0x00, 0x51, 0x31, 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF), (byte)profile, dpi.Color.R, dpi.Color.G, dpi.Color.B }; return new byte[] { 0x00, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF), dpi.Color.R, dpi.Color.G, dpi.Color.B };
} }
else else
{ {
return new byte[] { 0x00, 0x51, 0x31, 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF), (byte)profile }; return new byte[] { 0x00, 0x51, 0x31, (byte)(profile - 1), 0x00, (byte)(dpiEncoded & 0xFF), (byte)((dpiEncoded >> 8) & 0xFF) };
} }
} }
@@ -653,9 +667,12 @@ namespace GHelper.Peripherals.Mouse
DpiSettings[i] = new AsusMouseDPI(); DpiSettings[i] = new AsusMouseDPI();
} }
int offset = 4 + (i * 4); int offset = 5 + (i * 4);
DpiSettings[i].DPI = (uint)(packet[offset] << 8 | packet[offset + 1]) * 50 + 50; uint b1 = packet[offset];
uint b2 = packet[offset + 1];
DpiSettings[i].DPI = (uint)(b2 << 8 | b1) * 50 + 50;
} }
} }
@@ -704,15 +721,15 @@ namespace GHelper.Peripherals.Mouse
} }
public void SetDPIForProfile(int profile) public void SetDPIForProfile(AsusMouseDPI dpi, int profile)
{ {
if (profile >= DPIProfileCount() || profile < 0) if (profile > DPIProfileCount() || profile < 1)
{ {
Logger.WriteLine(GetDisplayName() + ": DPI Profile:" + profile + " is invalid."); Logger.WriteLine(GetDisplayName() + ": DPI Profile:" + profile + " is invalid.");
return; return;
} }
byte[]? packet = GetUpdateDPIPacket(profile); byte[]? packet = GetUpdateDPIPacket(dpi, profile);
if (packet == null) if (packet == null)
{ {
Logger.WriteLine(GetDisplayName() + ": DPI setting for profile " + profile + " does not exist or is invalid."); Logger.WriteLine(GetDisplayName() + ": DPI setting for profile " + profile + " does not exist or is invalid.");
@@ -720,8 +737,9 @@ namespace GHelper.Peripherals.Mouse
} }
WriteForResponse(packet); WriteForResponse(packet);
Logger.WriteLine(GetDisplayName() + ": DPI for profile " + profile + " set to " + DpiSettings[profile].DPI); Logger.WriteLine(GetDisplayName() + ": DPI for profile " + profile + " set to " + DpiSettings[profile - 1].DPI);
this.DpiProfile = profile; //this.DpiProfile = profile;
this.DpiSettings[profile - 1] = dpi;
} }
@@ -730,7 +748,7 @@ namespace GHelper.Peripherals.Mouse
// Lift-off Distance // Lift-off Distance
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
protected virtual bool HasLiftOffSetting() public virtual bool HasLiftOffSetting()
{ {
return false; return false;
} }
@@ -788,7 +806,7 @@ namespace GHelper.Peripherals.Mouse
// RGB // RGB
// ------------------------------------------------------------------------------ // ------------------------------------------------------------------------------
protected virtual bool HasRGB() public virtual bool HasRGB()
{ {
return false; return false;
} }
@@ -807,11 +825,34 @@ namespace GHelper.Peripherals.Mouse
} }
//And this if not all modes are supported //And this if not all modes are supported
protected virtual bool IsLightingModeSupported(LightingMode lightingMode) public virtual bool IsLightingModeSupported(LightingMode lightingMode)
{ {
return true; return true;
} }
public virtual bool SupportsRandomColor(LightingMode lightingMode)
{
return lightingMode == LightingMode.Comet;
}
public virtual bool SupportsAnimationDirection(LightingMode lightingMode)
{
return lightingMode == LightingMode.Rainbow
|| lightingMode == LightingMode.Comet;
}
public virtual bool SupportsAnimationSpeed(LightingMode lightingMode)
{
return lightingMode == LightingMode.Rainbow;
}
public virtual bool SupportsColorSetting(LightingMode lightingMode)
{
return lightingMode == LightingMode.Static
|| lightingMode == LightingMode.Breathing
|| lightingMode == LightingMode.Comet
|| lightingMode == LightingMode.React;
}
protected virtual byte[] GetReadLightingModePacket() protected virtual byte[] GetReadLightingModePacket()
{ {
return new byte[] { 0x00, 0x12, 0x03 }; return new byte[] { 0x00, 0x12, 0x03 };
@@ -836,7 +877,7 @@ namespace GHelper.Peripherals.Mouse
lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B, lightingSetting.RGBColor.R, lightingSetting.RGBColor.G, lightingSetting.RGBColor.B,
(byte)lightingSetting.AnimationDirection, (byte)lightingSetting.AnimationDirection,
(byte)(lightingSetting.RandomColor ? 0x01: 0x00), (byte)(lightingSetting.RandomColor ? 0x01: 0x00),
(byte)lightingSetting.LightingSpeed (byte)lightingSetting.AnimationSpeed
}; };
} }
@@ -855,7 +896,7 @@ namespace GHelper.Peripherals.Mouse
setting.RGBColor = Color.FromArgb(packet[7], packet[8], packet[9]); setting.RGBColor = Color.FromArgb(packet[7], packet[8], packet[9]);
setting.AnimationDirection = (AnimationDirection)packet[10]; setting.AnimationDirection = (AnimationDirection)packet[10];
setting.RandomColor = packet[11] == 0x01; setting.RandomColor = packet[11] == 0x01;
setting.LightingSpeed = (LightingSpeed)packet[12]; setting.AnimationSpeed = (AnimationSpeed)packet[12];
return setting; return setting;
@@ -882,7 +923,7 @@ namespace GHelper.Peripherals.Mouse
} }
} }
public void SetLightingSettinge(LightingSetting lightingSetting) public void SetLightingSetting(LightingSetting lightingSetting)
{ {
if (!HasRGB() || lightingSetting is null) if (!HasRGB() || lightingSetting is null)
{ {
@@ -895,6 +936,18 @@ namespace GHelper.Peripherals.Mouse
this.LightingSetting = lightingSetting; this.LightingSetting = lightingSetting;
} }
protected virtual byte[] GetSaveProfilePacket()
{
return new byte[] { 0x00, 0x50, 0x03 };
}
public void FlushSettings()
{
WriteForResponse(GetSaveProfilePacket());
Logger.WriteLine(GetDisplayName() + ": Settings Flushed ");
}
public override string? ToString() public override string? ToString()
{ {
return ""; return "";

View File

@@ -3,7 +3,7 @@ namespace GHelper.Peripherals.Mouse.Models
{ {
public class ChakramX : AsusMouse public class ChakramX : AsusMouse
{ {
internal static string[] POLLING_RATES = { "250Hz", "500Hz", "1000Hz" }; private static string[] POLLING_RATES = { "250Hz", "500Hz", "1000Hz" };
public ChakramX() : base(0x0B05, 0x1A1A, "mi_00", true) public ChakramX() : base(0x0B05, 0x1A1A, "mi_00", true)
{ {
@@ -28,6 +28,11 @@ namespace GHelper.Peripherals.Mouse.Models
return "Unknown"; return "Unknown";
} }
public override string[] PollingRateDisplayStrings()
{
return POLLING_RATES;
}
public override bool HasAngleSnapping() public override bool HasAngleSnapping()
{ {
return true; return true;
@@ -43,27 +48,27 @@ namespace GHelper.Peripherals.Mouse.Models
return 5; return 5;
} }
protected override int DPIProfileCount() public override int DPIProfileCount()
{ {
return 4; return 4;
} }
protected override int MaxDPI() public override int MaxDPI()
{ {
return 65_000; return 36_000;
} }
protected override bool HasLiftOffSetting() public override bool HasLiftOffSetting()
{ {
return true; return true;
} }
protected override bool HasRGB() public override bool HasRGB()
{ {
return true; return true;
} }
protected override bool HasEnergySettings() public override bool HasEnergySettings()
{ {
return true; return true;
} }
@@ -72,7 +77,7 @@ namespace GHelper.Peripherals.Mouse.Models
public class ChakramXWired : ChakramX public class ChakramXWired : ChakramX
{ {
internal new static string[] POLLING_RATES = { "250Hz", "500Hz", "1000Hz", "2000Hz", "4000Hz", "8000Hz" }; private static string[] POLLING_RATES = { "250Hz", "500Hz", "1000Hz", "2000Hz", "4000Hz", "8000Hz" };
public ChakramXWired() : base(0x1A18, false) public ChakramXWired() : base(0x1A18, false)
{ {
} }
@@ -91,5 +96,10 @@ namespace GHelper.Peripherals.Mouse.Models
return "Unknown"; return "Unknown";
} }
public override string[] PollingRateDisplayStrings()
{
return POLLING_RATES;
}
} }
} }