From 1ca4ebca9589fe6f23bc6dfefced51005d29e9d3 Mon Sep 17 00:00:00 2001 From: Daniel Varga Date: Sun, 24 Nov 2024 10:49:34 +0100 Subject: [PATCH] Improve HidDevice Identifier (#1476) --- .../Hardware/Controller/AeroCool/P7-H1.cs | 4 +- .../AquaComputer/AquastreamUltimate.cs | 22 +- .../Controller/AquaComputer/AquastreamXT.cs | 4 +- .../Controller/AquaComputer/D5Next.cs | 2 +- .../Controller/AquaComputer/Farbwerk.cs | 2 +- .../Controller/AquaComputer/HighFlowNext.cs | 4 +- .../Hardware/Controller/AquaComputer/MPS.cs | 2 +- .../Hardware/Controller/AquaComputer/Octo.cs | 36 +- .../Controller/AquaComputer/Quadro.cs | 340 +++++++++--------- .../Hardware/Controller/Nzxt/GridV3.cs | 2 +- .../Hardware/Controller/Nzxt/KrakenV2.cs | 2 +- .../Hardware/Controller/Nzxt/KrakenV3.cs | 2 +- .../Controller/Razer/RazerFanController.cs | 2 +- .../Hardware/Identifier.cs | 35 +- 14 files changed, 244 insertions(+), 215 deletions(-) diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AeroCool/P7-H1.cs b/LibreHardwareMonitorLib/Hardware/Controller/AeroCool/P7-H1.cs index 2be3f88..28e63ad 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AeroCool/P7-H1.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AeroCool/P7-H1.cs @@ -19,7 +19,7 @@ internal sealed class P7H1 : Hardware private readonly HidStream _stream; private bool _running; - public P7H1(HidDevice dev, ISettings settings) : base("AeroCool P7-H1", new Identifier(dev.DevicePath), settings) + public P7H1(HidDevice dev, ISettings settings) : base("AeroCool P7-H1", new Identifier(dev), settings) { _device = dev; HubNumber = _device.ProductID - 0x1000; @@ -93,4 +93,4 @@ internal sealed class P7H1 : Hardware _rpm[i].Value = _speeds[i]; } } -} \ No newline at end of file +} diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamUltimate.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamUltimate.cs index 5e2da3b..26c380a 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamUltimate.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamUltimate.cs @@ -20,20 +20,20 @@ internal sealed class AquastreamUltimate : Hardware private readonly Sensor[] _powers = new Sensor[2]; private readonly Sensor[] _flows = new Sensor[2]; - public AquastreamUltimate(HidDevice dev, ISettings settings) : base("AquastreamUltimate", new Identifier(dev.DevicePath), settings) + public AquastreamUltimate(HidDevice dev, ISettings settings) : base("AquastreamUltimate", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { // Reading output report instead of feature report, as the measurements are in the output report. _stream.Read(_rawData); - + FirmwareVersion = GetConvertedValue(0xD).GetValueOrDefault(0); - + Name = "Aquastream ULTIMATE"; _temperatures[0] = new Sensor("Coolant", 0, SensorType.Temperature, this, Array.Empty(), settings); ActivateSensor(_temperatures[0]); - + _temperatures[1] = new Sensor("External Sensor", 1, SensorType.Temperature, this, Array.Empty(), settings); ActivateSensor(_temperatures[1]); @@ -88,20 +88,20 @@ internal sealed class AquastreamUltimate : Hardware // Reading output report instead of feature report, as the measurements are in the output report _stream.Read(_rawData); - _rpmSensors[0].Value = GetConvertedValue(0x51) ; // Pump speed. - _rpmSensors[1].Value = GetConvertedValue(0x41+0x06); // Fan speed. + _rpmSensors[0].Value = GetConvertedValue(0x51); // Pump speed. + _rpmSensors[1].Value = GetConvertedValue(0x41 + 0x06); // Fan speed. _temperatures[0].Value = GetConvertedValue(0x2D) / 100f; // Water temp. _temperatures[1].Value = GetConvertedValue(0x2F) / 100f; // Ext sensor temp. _voltages[0].Value = GetConvertedValue(0x3D) / 100f; // Pump input voltage. - _voltages[1].Value = GetConvertedValue(0x41+0x02) / 100f; // Fan output voltage. + _voltages[1].Value = GetConvertedValue(0x41 + 0x02) / 100f; // Fan output voltage. _currents[0].Value = GetConvertedValue(0x53) / 1000f; // Pump current. - _currents[1].Value = GetConvertedValue(0x41+0x00) / 1000f; // Fan current. + _currents[1].Value = GetConvertedValue(0x41 + 0x00) / 1000f; // Fan current. _powers[0].Value = GetConvertedValue(0x55) / 100f; // Pump power. - _powers[1].Value = GetConvertedValue(0x41+0x04) / 100f; // Fan power. + _powers[1].Value = GetConvertedValue(0x41 + 0x04) / 100f; // Fan power. _flows[0].Value = GetConvertedValue(0x37); // Flow. _flows[1].Value = GetConvertedValue(0x57) / 1000f; // Pressure. @@ -111,7 +111,7 @@ internal sealed class AquastreamUltimate : Hardware { if (_rawData[index] == sbyte.MaxValue) return null; - + return Convert.ToUInt16(_rawData[index + 1] | (_rawData[index] << 8)); - } + } } diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamXT.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamXT.cs index 9e3b820..a04e240 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamXT.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamXT.cs @@ -26,7 +26,7 @@ internal sealed class AquastreamXT : Hardware private readonly Sensor[] _temperatures = new Sensor[3]; private readonly Sensor[] _voltages = new Sensor[2]; - public AquastreamXT(HidDevice dev, ISettings settings) : base("Aquastream XT", new Identifier(dev.DevicePath), settings) + public AquastreamXT(HidDevice dev, ISettings settings) : base("Aquastream XT", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { @@ -129,7 +129,7 @@ internal sealed class AquastreamXT : Hardware { return; } - + if (_rawData[0] != 0x4) return; diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/D5Next.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/D5Next.cs index f429563..e6092e0 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/D5Next.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/D5Next.cs @@ -25,7 +25,7 @@ internal sealed class D5Next : Hardware private readonly HidStream _stream; private readonly Sensor[] _temperatures = new Sensor[1]; - public D5Next(HidDevice dev, ISettings settings) : base("D5Next", new Identifier(dev.DevicePath), settings) + public D5Next(HidDevice dev, ISettings settings) : base("D5Next", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs index 3aaf087..dfef6bd 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs @@ -27,7 +27,7 @@ internal sealed class Farbwerk : Hardware private readonly Sensor[] _temperatures = new Sensor[TEMPERATURE_COUNT]; private readonly Sensor[] _colors = new Sensor[COLOR_VALUE_COUNT]; - public Farbwerk(HidDevice dev, ISettings settings) : base("Farbwerk", new Identifier(dev.DevicePath), settings) + public Farbwerk(HidDevice dev, ISettings settings) : base("Farbwerk", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/HighFlowNext.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/HighFlowNext.cs index 8e0e389..f25872c 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/HighFlowNext.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/HighFlowNext.cs @@ -20,7 +20,7 @@ internal sealed class HighFlowNext : Hardware private readonly Sensor[] _voltages = new Sensor[2]; private readonly Sensor[] _alarms = new Sensor[4]; - public HighFlowNext(HidDevice dev, ISettings settings) : base("high flow NEXT", new Identifier(dev.DevicePath), settings) + public HighFlowNext(HidDevice dev, ISettings settings) : base("high flow NEXT", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { @@ -93,7 +93,7 @@ internal sealed class HighFlowNext : Hardware if (externalTempSensorConnected) { - _temperatures[1].Value = rawExtTempValue / 100f; + _temperatures[1].Value = rawExtTempValue / 100f; } else { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/MPS.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/MPS.cs index ea39fad..4db7054 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/MPS.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/MPS.cs @@ -23,7 +23,7 @@ internal sealed class MPS : Hardware private ushort _externalTemperature; - public MPS(HidDevice dev, ISettings settings) : base("MPS", new Identifier(dev.DevicePath), settings) + public MPS(HidDevice dev, ISettings settings) : base("MPS", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs index 5acc104..0eac4b8 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs @@ -18,30 +18,30 @@ internal sealed class Octo : Hardware private readonly Sensor[] _currents = new Sensor[8]; private readonly Sensor[] _powers = new Sensor[8]; - public Octo(HidDevice dev, ISettings settings) : base("Octo", new Identifier(dev.DevicePath), settings) + public Octo(HidDevice dev, ISettings settings) : base("Octo", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { //Reading output report instead of feature report, as the measurements are in the output report _stream.Read(_rawData); - + Name = "OCTO"; FirmwareVersion = GetConvertedValue(OctoDataIndexes.FIRMWARE_VERSION).GetValueOrDefault(0); // Initialize the 4 temperature sensors for (int i = 0; i < 4; i++) { - _temperatures[i] = new Sensor($"Temperature {i+1}", i, SensorType.Temperature, this, Array.Empty(), settings); + _temperatures[i] = new Sensor($"Temperature {i + 1}", i, SensorType.Temperature, this, Array.Empty(), settings); ActivateSensor(_temperatures[i]); } // Initialize the 8 fan speed sensors for (int i = 0; i < 8; i++) { - _rpmSensors[i] = new Sensor($"Fan {i+1}", i, SensorType.Fan, this, Array.Empty(), settings); + _rpmSensors[i] = new Sensor($"Fan {i + 1}", i, SensorType.Fan, this, Array.Empty(), settings); ActivateSensor(_rpmSensors[i]); } - + // Initialize the input voltage sensor _voltages[0] = new Sensor("Input", 0, SensorType.Voltage, this, Array.Empty(), settings); ActivateSensor(_voltages[0]); @@ -52,18 +52,18 @@ internal sealed class Octo : Hardware _voltages[i] = new Sensor($"Fan {i}", i, SensorType.Voltage, this, Array.Empty(), settings); ActivateSensor(_voltages[i]); } - + // Initialize the 8 fan current sensors for (int i = 0; i < 8; i++) { - _currents[i] = new Sensor($"Fan {i+1}", i, SensorType.Current, this, Array.Empty(), settings); + _currents[i] = new Sensor($"Fan {i + 1}", i, SensorType.Current, this, Array.Empty(), settings); ActivateSensor(_currents[i]); } - + // Initialize the 8 fan power sensors for (int i = 0; i < 8; i++) { - _powers[i] = new Sensor($"Fan {i+1}", i, SensorType.Power, this, Array.Empty(), settings); + _powers[i] = new Sensor($"Fan {i + 1}", i, SensorType.Power, this, Array.Empty(), settings); ActivateSensor(_powers[i]); } } @@ -86,7 +86,7 @@ internal sealed class Octo : Hardware { //Reading output report instead of feature report, as the measurements are in the output report _stream.Read(_rawData); - + _temperatures[0].Value = GetConvertedValue(OctoDataIndexes.TEMP_1) / 100f; // Temp 1 _temperatures[1].Value = GetConvertedValue(OctoDataIndexes.TEMP_2) / 100f; // Temp 2 _temperatures[2].Value = GetConvertedValue(OctoDataIndexes.TEMP_3) / 100f; // Temp 3 @@ -100,7 +100,7 @@ internal sealed class Octo : Hardware _rpmSensors[5].Value = GetConvertedValue(OctoDataIndexes.FAN_SPEED_6); // Fan 6 speed _rpmSensors[6].Value = GetConvertedValue(OctoDataIndexes.FAN_SPEED_7); // Fan 7 speed _rpmSensors[7].Value = GetConvertedValue(OctoDataIndexes.FAN_SPEED_8); // Fan 8 speed - + _voltages[0].Value = GetConvertedValue(OctoDataIndexes.VOLTAGE) / 100f; // Input voltage _voltages[1].Value = GetConvertedValue(OctoDataIndexes.FAN_VOLTAGE_1) / 100f; // Fan 1 voltage _voltages[2].Value = GetConvertedValue(OctoDataIndexes.FAN_VOLTAGE_2) / 100f; // Fan 2 voltage @@ -110,7 +110,7 @@ internal sealed class Octo : Hardware _voltages[6].Value = GetConvertedValue(OctoDataIndexes.FAN_VOLTAGE_6) / 100f; // Fan 6 voltage _voltages[7].Value = GetConvertedValue(OctoDataIndexes.FAN_VOLTAGE_7) / 100f; // Fan 7 voltage _voltages[8].Value = GetConvertedValue(OctoDataIndexes.FAN_VOLTAGE_8) / 100f; // Fan 8 voltage - + _currents[0].Value = GetConvertedValue(OctoDataIndexes.FAN_CURRENT_1) / 1000f; // Fan 1 current _currents[1].Value = GetConvertedValue(OctoDataIndexes.FAN_CURRENT_2) / 1000f; // Fan 2 current _currents[2].Value = GetConvertedValue(OctoDataIndexes.FAN_CURRENT_3) / 1000f; // Fan 3 current @@ -119,7 +119,7 @@ internal sealed class Octo : Hardware _currents[5].Value = GetConvertedValue(OctoDataIndexes.FAN_CURRENT_6) / 1000f; // Fan 6 current _currents[6].Value = GetConvertedValue(OctoDataIndexes.FAN_CURRENT_7) / 1000f; // Fan 7 current _currents[7].Value = GetConvertedValue(OctoDataIndexes.FAN_CURRENT_8) / 1000f; // Fan 8 current - + _powers[0].Value = GetConvertedValue(OctoDataIndexes.FAN_POWER_1) / 100f; // Fan 1 power _powers[1].Value = GetConvertedValue(OctoDataIndexes.FAN_POWER_2) / 100f; // Fan 2 power _powers[2].Value = GetConvertedValue(OctoDataIndexes.FAN_POWER_3) / 100f; // Fan 3 power @@ -133,7 +133,7 @@ internal sealed class Octo : Hardware private sealed class OctoDataIndexes { public const int FIRMWARE_VERSION = 13; - + public const int TEMP_1 = 61; public const int TEMP_2 = 63; public const int TEMP_3 = 65; @@ -147,7 +147,7 @@ internal sealed class Octo : Hardware public const int FAN_SPEED_6 = 198; public const int FAN_SPEED_7 = 211; public const int FAN_SPEED_8 = 224; - + public const int FAN_POWER_1 = 131; public const int FAN_POWER_2 = 144; public const int FAN_POWER_3 = 157; @@ -166,7 +166,7 @@ internal sealed class Octo : Hardware public const int FAN_VOLTAGE_6 = 192; public const int FAN_VOLTAGE_7 = 205; public const int FAN_VOLTAGE_8 = 218; - + public const int FAN_CURRENT_1 = 129; public const int FAN_CURRENT_2 = 142; public const int FAN_CURRENT_3 = 155; @@ -181,7 +181,7 @@ internal sealed class Octo : Hardware { if (_rawData[index] == sbyte.MaxValue) return null; - + return Convert.ToUInt16(_rawData[index + 1] | (_rawData[index] << 8)); } -} \ No newline at end of file +} diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs index e3216d2..13f37e4 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs @@ -1,170 +1,170 @@ -// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. -// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. -// Copyright (C) LibreHardwareMonitor and Contributors. -// All Rights Reserved. - -using System; -using HidSharp; - -namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer; - -internal sealed class Quadro : Hardware -{ - private readonly byte[] _rawData = new byte[210]; - private readonly HidStream _stream; - - private readonly Sensor[] _rpmSensors = new Sensor[4]; - private readonly Sensor[] _temperatures = new Sensor[4]; - private readonly Sensor[] _voltages = new Sensor[5]; - private readonly Sensor[] _currents = new Sensor[4]; - private readonly Sensor[] _powers = new Sensor[4]; - private readonly Sensor[] _flows = new Sensor[1]; - - public Quadro(HidDevice dev, ISettings settings) : base("Quadro", new Identifier(dev.DevicePath), settings) - { - if (dev.TryOpen(out _stream)) - { - //Reading output report instead of feature report, as the measurements are in the output report - _stream.Read(_rawData); - - Name = "QUADRO"; - FirmwareVersion = GetConvertedValue(QuadroDataIndexes.FIRMWARE_VERSION).GetValueOrDefault(0); - - // Initialize the 4 temperature sensors - for (int i = 0; i < 4; i++) - { - _temperatures[i] = new Sensor($"Temperature {i+1}", i, SensorType.Temperature, this, Array.Empty(), settings); - ActivateSensor(_temperatures[i]); - } - - // Initialize the input voltage sensor - _voltages[0] = new Sensor("Input", 0, SensorType.Voltage, this, Array.Empty(), settings); - ActivateSensor(_voltages[0]); - - // Initialize the flow sensor - _flows[0] = new Sensor("Flow", 0, SensorType.Flow, this, Array.Empty(), settings); - ActivateSensor(_flows[0]); - - // Initialize the 4 fan voltage sensors - for (int i = 1; i < 5; i++) - { - _voltages[i] = new Sensor($"Fan {i}", i, SensorType.Voltage, this, Array.Empty(), settings); - ActivateSensor(_voltages[i]); - } - - // Initialize the 4 fan current sensors - for (int i = 0; i < 4; i++) - { - _currents[i] = new Sensor($"Fan {i+1}", i, SensorType.Current, this, Array.Empty(), settings); - ActivateSensor(_currents[i]); - } - - // Initialize the 4 fan power sensors - for (int i = 0; i < 4; i++) - { - _powers[i] = new Sensor($"Fan {i+1}", i, SensorType.Power, this, Array.Empty(), settings); - ActivateSensor(_powers[i]); - } - - // Initialize the 4 fan speed sensors - for (int i = 0; i < 4; i++) - { - _rpmSensors[i] = new Sensor($"Fan {i + 1}", i, SensorType.Fan, this, Array.Empty(), settings); - ActivateSensor(_rpmSensors[i]); - } - - } - } - - public ushort FirmwareVersion { get; } - - public override HardwareType HardwareType - { - get { return HardwareType.Cooler; } - } - - public override void Close() - { - _stream.Close(); - base.Close(); - } - - public override void Update() - { - //Reading output report instead of feature report, as the measurements are in the output report - _stream.Read(_rawData); - - _temperatures[0].Value = GetConvertedValue(QuadroDataIndexes.TEMP_1) / 100f; // Temp 1 - _temperatures[1].Value = GetConvertedValue(QuadroDataIndexes.TEMP_2) / 100f; // Temp 2 - _temperatures[2].Value = GetConvertedValue(QuadroDataIndexes.TEMP_3) / 100f; // Temp 3 - _temperatures[3].Value = GetConvertedValue(QuadroDataIndexes.TEMP_4) / 100f; // Temp 4 - - _voltages[0].Value = GetConvertedValue(QuadroDataIndexes.VOLTAGE) / 100f; // Input voltage - - _flows[0].Value = GetConvertedValue(QuadroDataIndexes.FLOW) / 10f; // Flow - - _voltages[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_1) / 100f; // Fan 1 voltage - _voltages[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_2) / 100f; // Fan 2 voltage - _voltages[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_3) / 100f; // Fan 3 voltage - _voltages[4].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_4) / 100f; // Fan 4 voltage - - _currents[0].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_1) / 1000f; // Fan 1 current - _currents[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_2) / 1000f; // Fan 2 current - _currents[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_3) / 1000f; // Fan 3 current - _currents[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_4) / 1000f; // Fan 4 current - - _powers[0].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_1) / 100f; // Fan 1 power - _powers[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_2) / 100f; // Fan 2 power - _powers[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_3) / 100f; // Fan 3 power - _powers[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_4) / 100f; // Fan 4 power - - _rpmSensors[0].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_1); // Fan 1 speed - _rpmSensors[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_2); // Fan 2 speed - _rpmSensors[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_3); // Fan 3 speed - _rpmSensors[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_4); // Fan 4 speed - - } - - private sealed class QuadroDataIndexes - { - public const int FIRMWARE_VERSION = 13; - - public const int TEMP_1 = 52; - public const int TEMP_2 = 54; - public const int TEMP_3 = 56; - public const int TEMP_4 = 58; - - public const int VOLTAGE = 108; - - public const int FLOW = 110; - - public const int FAN_VOLTAGE_1 = 114; - public const int FAN_VOLTAGE_2 = 127; - public const int FAN_VOLTAGE_3 = 140; - public const int FAN_VOLTAGE_4 = 153; - - public const int FAN_CURRENT_1 = 116; - public const int FAN_CURRENT_2 = 129; - public const int FAN_CURRENT_3 = 142; - public const int FAN_CURRENT_4 = 155; - - public const int FAN_POWER_1 = 118; - public const int FAN_POWER_2 = 131; - public const int FAN_POWER_3 = 144; - public const int FAN_POWER_4 = 157; - - public const int FAN_SPEED_1 = 120; - public const int FAN_SPEED_2 = 133; - public const int FAN_SPEED_3 = 146; - public const int FAN_SPEED_4 = 159; - - } - - private ushort? GetConvertedValue(int index) - { - if (_rawData[index] == sbyte.MaxValue) - return null; - - return Convert.ToUInt16(_rawData[index + 1] | (_rawData[index] << 8)); - } -} +// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. +// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. +// Copyright (C) LibreHardwareMonitor and Contributors. +// All Rights Reserved. + +using System; +using HidSharp; + +namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer; + +internal sealed class Quadro : Hardware +{ + private readonly byte[] _rawData = new byte[210]; + private readonly HidStream _stream; + + private readonly Sensor[] _rpmSensors = new Sensor[4]; + private readonly Sensor[] _temperatures = new Sensor[4]; + private readonly Sensor[] _voltages = new Sensor[5]; + private readonly Sensor[] _currents = new Sensor[4]; + private readonly Sensor[] _powers = new Sensor[4]; + private readonly Sensor[] _flows = new Sensor[1]; + + public Quadro(HidDevice dev, ISettings settings) : base("Quadro", new Identifier(dev), settings) + { + if (dev.TryOpen(out _stream)) + { + //Reading output report instead of feature report, as the measurements are in the output report + _stream.Read(_rawData); + + Name = "QUADRO"; + FirmwareVersion = GetConvertedValue(QuadroDataIndexes.FIRMWARE_VERSION).GetValueOrDefault(0); + + // Initialize the 4 temperature sensors + for (int i = 0; i < 4; i++) + { + _temperatures[i] = new Sensor($"Temperature {i + 1}", i, SensorType.Temperature, this, Array.Empty(), settings); + ActivateSensor(_temperatures[i]); + } + + // Initialize the input voltage sensor + _voltages[0] = new Sensor("Input", 0, SensorType.Voltage, this, Array.Empty(), settings); + ActivateSensor(_voltages[0]); + + // Initialize the flow sensor + _flows[0] = new Sensor("Flow", 0, SensorType.Flow, this, Array.Empty(), settings); + ActivateSensor(_flows[0]); + + // Initialize the 4 fan voltage sensors + for (int i = 1; i < 5; i++) + { + _voltages[i] = new Sensor($"Fan {i}", i, SensorType.Voltage, this, Array.Empty(), settings); + ActivateSensor(_voltages[i]); + } + + // Initialize the 4 fan current sensors + for (int i = 0; i < 4; i++) + { + _currents[i] = new Sensor($"Fan {i + 1}", i, SensorType.Current, this, Array.Empty(), settings); + ActivateSensor(_currents[i]); + } + + // Initialize the 4 fan power sensors + for (int i = 0; i < 4; i++) + { + _powers[i] = new Sensor($"Fan {i + 1}", i, SensorType.Power, this, Array.Empty(), settings); + ActivateSensor(_powers[i]); + } + + // Initialize the 4 fan speed sensors + for (int i = 0; i < 4; i++) + { + _rpmSensors[i] = new Sensor($"Fan {i + 1}", i, SensorType.Fan, this, Array.Empty(), settings); + ActivateSensor(_rpmSensors[i]); + } + + } + } + + public ushort FirmwareVersion { get; } + + public override HardwareType HardwareType + { + get { return HardwareType.Cooler; } + } + + public override void Close() + { + _stream.Close(); + base.Close(); + } + + public override void Update() + { + //Reading output report instead of feature report, as the measurements are in the output report + _stream.Read(_rawData); + + _temperatures[0].Value = GetConvertedValue(QuadroDataIndexes.TEMP_1) / 100f; // Temp 1 + _temperatures[1].Value = GetConvertedValue(QuadroDataIndexes.TEMP_2) / 100f; // Temp 2 + _temperatures[2].Value = GetConvertedValue(QuadroDataIndexes.TEMP_3) / 100f; // Temp 3 + _temperatures[3].Value = GetConvertedValue(QuadroDataIndexes.TEMP_4) / 100f; // Temp 4 + + _voltages[0].Value = GetConvertedValue(QuadroDataIndexes.VOLTAGE) / 100f; // Input voltage + + _flows[0].Value = GetConvertedValue(QuadroDataIndexes.FLOW) / 10f; // Flow + + _voltages[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_1) / 100f; // Fan 1 voltage + _voltages[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_2) / 100f; // Fan 2 voltage + _voltages[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_3) / 100f; // Fan 3 voltage + _voltages[4].Value = GetConvertedValue(QuadroDataIndexes.FAN_VOLTAGE_4) / 100f; // Fan 4 voltage + + _currents[0].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_1) / 1000f; // Fan 1 current + _currents[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_2) / 1000f; // Fan 2 current + _currents[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_3) / 1000f; // Fan 3 current + _currents[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_CURRENT_4) / 1000f; // Fan 4 current + + _powers[0].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_1) / 100f; // Fan 1 power + _powers[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_2) / 100f; // Fan 2 power + _powers[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_3) / 100f; // Fan 3 power + _powers[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_POWER_4) / 100f; // Fan 4 power + + _rpmSensors[0].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_1); // Fan 1 speed + _rpmSensors[1].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_2); // Fan 2 speed + _rpmSensors[2].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_3); // Fan 3 speed + _rpmSensors[3].Value = GetConvertedValue(QuadroDataIndexes.FAN_SPEED_4); // Fan 4 speed + + } + + private sealed class QuadroDataIndexes + { + public const int FIRMWARE_VERSION = 13; + + public const int TEMP_1 = 52; + public const int TEMP_2 = 54; + public const int TEMP_3 = 56; + public const int TEMP_4 = 58; + + public const int VOLTAGE = 108; + + public const int FLOW = 110; + + public const int FAN_VOLTAGE_1 = 114; + public const int FAN_VOLTAGE_2 = 127; + public const int FAN_VOLTAGE_3 = 140; + public const int FAN_VOLTAGE_4 = 153; + + public const int FAN_CURRENT_1 = 116; + public const int FAN_CURRENT_2 = 129; + public const int FAN_CURRENT_3 = 142; + public const int FAN_CURRENT_4 = 155; + + public const int FAN_POWER_1 = 118; + public const int FAN_POWER_2 = 131; + public const int FAN_POWER_3 = 144; + public const int FAN_POWER_4 = 157; + + public const int FAN_SPEED_1 = 120; + public const int FAN_SPEED_2 = 133; + public const int FAN_SPEED_3 = 146; + public const int FAN_SPEED_4 = 159; + + } + + private ushort? GetConvertedValue(int index) + { + if (_rawData[index] == sbyte.MaxValue) + return null; + + return Convert.ToUInt16(_rawData[index + 1] | (_rawData[index] << 8)); + } +} diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/GridV3.cs b/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/GridV3.cs index 5eceb0e..018f68e 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/GridV3.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/GridV3.cs @@ -33,7 +33,7 @@ internal sealed class GridV3 : Hardware private readonly HidStream _stream; private readonly Sensor[] _voltages = new Sensor[FANS_COUNT]; - public GridV3(HidDevice dev, ISettings settings) : base("NZXT GRID+ V3", new Identifier(dev.DevicePath), settings) + public GridV3(HidDevice dev, ISettings settings) : base("NZXT GRID+ V3", new Identifier(dev), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV2.cs b/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV2.cs index ed81da0..4905527 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV2.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV2.cs @@ -25,7 +25,7 @@ internal sealed class KrakenV2 : Hardware private DateTime _lastUpdate = DateTime.MinValue; - public KrakenV2(HidDevice dev, ISettings settings) : base("Nzxt Kraken X", new Identifier(dev.DevicePath), settings) + public KrakenV2(HidDevice dev, ISettings settings) : base("Nzxt Kraken X", new Identifier(dev), settings) { _device = dev; diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV3.cs b/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV3.cs index d2b0293..e476144 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV3.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/Nzxt/KrakenV3.cs @@ -25,7 +25,7 @@ internal sealed class KrakenV3 : Hardware private volatile bool _controllingFans; private volatile bool _controllingPump; - public KrakenV3(HidDevice dev, ISettings settings) : base("Nzxt Kraken Z", new Identifier(dev.DevicePath), settings) + public KrakenV3(HidDevice dev, ISettings settings) : base("Nzxt Kraken Z", new Identifier(dev), settings) { switch (dev.ProductID) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Razer/RazerFanController.cs b/LibreHardwareMonitorLib/Hardware/Controller/Razer/RazerFanController.cs index 01d3302..2828a2a 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/Razer/RazerFanController.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/Razer/RazerFanController.cs @@ -29,7 +29,7 @@ internal sealed class RazerFanController : Hardware private readonly Sensor[] _pwmControls = new Sensor[CHANNEL_COUNT]; private readonly Sensor[] _rpmSensors = new Sensor[CHANNEL_COUNT]; - public RazerFanController(HidDevice dev, ISettings settings) : base("Razer PWM PC Fan Controller", new Identifier(dev.DevicePath), settings) + public RazerFanController(HidDevice dev, ISettings settings) : base("Razer PWM PC Fan Controller", new Identifier(dev), settings) { _device = dev; diff --git a/LibreHardwareMonitorLib/Hardware/Identifier.cs b/LibreHardwareMonitorLib/Hardware/Identifier.cs index 9d0eaa5..ab54b36 100644 --- a/LibreHardwareMonitorLib/Hardware/Identifier.cs +++ b/LibreHardwareMonitorLib/Hardware/Identifier.cs @@ -6,6 +6,7 @@ using System; using System.Text; +using HidSharp; namespace LibreHardwareMonitor.Hardware; @@ -49,6 +50,35 @@ public class Identifier : IComparable _identifier = s.ToString(); } + /// + /// Creates a new identifier instance based on the supplied . + /// If available the identifier will consist of the vendor-id, product-id and serial number of the HidDevice. + /// Alternatively a platform dependent identifier based on the usb device-path is generated. + /// + /// The this identifier will be created for. + public Identifier(HidDevice dev) + { + string[] identifiers; + try + { + identifiers = ["usbhid", dev.VendorID.ToString("X4"), dev.ProductID.ToString("X4"), dev.GetSerialNumber()]; + } + catch + { + identifiers = ["usbhid", dev.DevicePath]; + } + + CoerceIdentifiers(identifiers); + StringBuilder s = new(); + for (int i = 0; i < identifiers.Length; i++) + { + s.Append(Separator); + s.Append(identifiers[i]); + } + + _identifier = s.ToString(); + } + /// public int CompareTo(Identifier other) { @@ -65,8 +95,7 @@ public class Identifier : IComparable for (int i = 0; i < identifiers.Length; i++) { string s = identifiers[i]; - if (s.IndexOf(' ') >= 0) - identifiers[i] = s.Replace(' ', '-'); + identifiers[i] = Uri.EscapeDataString(identifiers[i]); } } @@ -123,4 +152,4 @@ public class Identifier : IComparable return id1.CompareTo(id2) > 0; } -} \ No newline at end of file +}