From 635da0cea5b81f7d6333fd1934bd630ca8ae6bda Mon Sep 17 00:00:00 2001 From: Daniel Varga Date: Thu, 22 Aug 2024 10:12:14 +0200 Subject: [PATCH] Fix System.ArgumentException: Invalid identifier on Linux (#1434) (#1435) --- .../Hardware/Controller/AeroCool/P7-H1.cs | 4 +- .../AquaComputer/AquastreamUltimate.cs | 32 +- .../Controller/AquaComputer/AquastreamXT.cs | 3 +- .../Controller/AquaComputer/D5Next.cs | 2 +- .../Controller/AquaComputer/Farbwerk.cs | 2 +- .../Hardware/Controller/AquaComputer/MPS.cs | 2 +- .../Hardware/Controller/AquaComputer/Octo.cs | 36 +- .../Controller/AquaComputer/Quadro.cs | 340 +++++++++--------- .../Controller/Razer/RazerFanController.cs | 2 +- 9 files changed, 215 insertions(+), 208 deletions(-) diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AeroCool/P7-H1.cs b/LibreHardwareMonitorLib/Hardware/Controller/AeroCool/P7-H1.cs index 2be3f88..6921bf3 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("aerocool", "p7h1", dev.GetSerialNumber().Replace(" ", "")), 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..7788e98 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamUltimate.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquastreamUltimate.cs @@ -4,6 +4,7 @@ // All Rights Reserved. using System; +using System.IO; using HidSharp; namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer; @@ -20,20 +21,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("aquacomputer", "asultimate", dev.GetSerialNumber().Replace(" ", "")), 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]); @@ -86,22 +87,29 @@ internal sealed class AquastreamUltimate : Hardware public override void Update() { // Reading output report instead of feature report, as the measurements are in the output report - _stream.Read(_rawData); + try + { + _stream.Read(_rawData); + } + catch (IOException) + { + return; + } - _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 +119,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..f45b432 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("aquacomputer", "asxt", dev.GetSerialNumber().Replace(" ", "")), settings) { if (dev.TryOpen(out _stream)) { @@ -129,7 +129,6 @@ 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..1684d60 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("aquacomputer", "d5next", dev.GetSerialNumber().Replace(" ", "")), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs index 3aaf087..f293541 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("aquacomputer", "farbwerk", dev.GetSerialNumber().Replace(" ", "")), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/MPS.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/MPS.cs index ea39fad..f1b946e 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("aquacomputer", "mps", dev.GetSerialNumber().Replace(" ", "")), settings) { if (dev.TryOpen(out _stream)) { diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs index 5acc104..02cf10d 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("aquacomputer", "octo", dev.GetSerialNumber().Replace(" ", "")), 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..c6a3319 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("aquacomputer", "quadro", dev.GetSerialNumber().Replace(" ", "")), 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/Razer/RazerFanController.cs b/LibreHardwareMonitorLib/Hardware/Controller/Razer/RazerFanController.cs index 01d3302..89bdcfd 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("razer", "pwmpcfancontroller", dev.GetSerialNumber().Replace(" ", "")), settings) { _device = dev;