diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquaComputerGroup.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquaComputerGroup.cs index 482fa11..5159584 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquaComputerGroup.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/AquaComputerGroup.cs @@ -85,6 +85,15 @@ public class AquaComputerGroup : IGroup _report.AppendLine(); _hardware.Add(farbwerk); break; + + case 0xF010: + var farbwerk360 = new Farbwerk360(dev, settings); + _report.AppendLine($"Device name: {productName}"); + _report.AppendLine($"Firmware version: {farbwerk360.FirmwareVersion}"); + _report.AppendLine($"{farbwerk360.Status}"); + _report.AppendLine(); + _hardware.Add(farbwerk360); + break; case 0xF012: var highflownext = new HighFlowNext(dev, settings); diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs index dfef6bd..d6b9074 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk.cs @@ -19,40 +19,40 @@ internal sealed class Farbwerk : Hardware private const int COLORS_OFFSET = 40; private const int TEMPERATURE_COUNT = 4; + private const int TEMP_SENSOR_DISCONNECTED = 32767; private const int COLOR_COUNT = 4; private const int COLOR_VALUE_COUNT = COLOR_COUNT * 3; - + private readonly HidDevice _device; private readonly byte[] _rawData = new byte[140]; - private readonly HidStream _stream; + 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), settings) { - if (dev.TryOpen(out _stream)) + _device = dev; + + for (int i = 0; i < _temperatures.Length; i++) { - for (int i = 0; i < _temperatures.Length; i++) - { - _temperatures[i] = new Sensor($"Sensor {i + 1}", i, SensorType.Temperature, this, settings); - ActivateSensor(_temperatures[i]); - } - - for (int i = 0; i < _colors.Length; i++) - { - int control = (i / 3) + 1; - string color = (i % 3) switch - { - 0 => "Red", - 1 => "Green", - 2 => "Blue", - _ => "Invalid" - }; - _colors[i] = new Sensor($"Controller {control} {color}", COLOR_COUNT + i, SensorType.Level, this, settings); - ActivateSensor(_colors[i]); - } - - Update(); + _temperatures[i] = new Sensor($"Temperature #{i + 1}", i, SensorType.Temperature, this, settings); + ActivateSensor(_temperatures[i]); } + + for (int i = 0; i < _colors.Length; i++) + { + int control = (i / 3) + 1; + string color = (i % 3) switch + { + 0 => "Red", + 1 => "Green", + 2 => "Blue", + _ => "Invalid" + }; + _colors[i] = new Sensor($"Controller {control} {color}", COLOR_COUNT + i, SensorType.Level, this, settings); + ActivateSensor(_colors[i]); + } + + Update(); } public ushort FirmwareVersion { get; private set; } @@ -82,34 +82,40 @@ internal sealed class Farbwerk : Hardware public override void Close() { - _stream.Close(); - base.Close(); } public override void Update() { - int length = _stream.Read(_rawData); + if (_device.TryOpen(out HidStream stream)) { + int length = stream.Read(_rawData); - if (length != _rawData.Length || _rawData[0] != 0x1) - { - return; - } - - FirmwareVersion = Convert.ToUInt16(_rawData[21] << 8 | _rawData[22]); - - int offset = HEADER_SIZE + SENSOR_OFFSET; - for (int i = 0; i < _temperatures.Length; i++) - { - _temperatures[i].Value = (_rawData[offset] << 8 | _rawData[offset + 1]) / 100.0f; - offset += 2; - } - - offset = HEADER_SIZE + COLORS_OFFSET; - for (int i = 0; i < _colors.Length; i++) - { - _colors[i].Value = (_rawData[offset] << 8 | _rawData[offset + 1]) / 81.90f; - offset += 2; + if (length != _rawData.Length || _rawData[0] != 0x1) + { + return; + } + + FirmwareVersion = Convert.ToUInt16(_rawData[21] << 8 | _rawData[22]); + + int offset = HEADER_SIZE + SENSOR_OFFSET; + foreach (Sensor temp in _temperatures) + { + temp.Value = (_rawData[offset] << 8 | _rawData[offset + 1]) / 100.0f; + + if (temp.Value == (TEMP_SENSOR_DISCONNECTED / 100.0f)) { + DeactivateSensor(temp); + } + + offset += 2; + } + + offset = HEADER_SIZE + COLORS_OFFSET; + foreach (Sensor color in _colors) + { + color.Value = (_rawData[offset] << 8 | _rawData[offset + 1]) / 81.90f; + offset += 2; + } } + } } diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk360.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk360.cs new file mode 100644 index 0000000..62b2b2e --- /dev/null +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Farbwerk360.cs @@ -0,0 +1,120 @@ +// 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; +//TODO: +//Implement set RGB Controls + +internal sealed class Farbwerk360 : Hardware +{ + private const int FEATURE_ID = 3; + + private const int HEADER_SIZE = 30; + private const int SENSOR_OFFSET = 20; + private const int COLORS_OFFSET = 43; + + private const int TEMPERATURE_COUNT = 4; + private const int TEMP_SENSOR_DISCONNECTED = 32767; + private const int COLOR_COUNT = 4; + private const int COLOR_VALUE_COUNT = COLOR_COUNT * 3; + private readonly HidDevice _device; + private readonly byte[] _rawData = new byte[140]; + private readonly Sensor[] _temperatures = new Sensor[TEMPERATURE_COUNT]; + private readonly Sensor[] _colors = new Sensor[COLOR_VALUE_COUNT]; + + public Farbwerk360(HidDevice dev, ISettings settings) : base("Farbwerk 360", new Identifier(dev), settings) + { + _device = dev; + + for (int i = 0; i < _temperatures.Length; i++) + { + _temperatures[i] = new Sensor($"Temperature #{i + 1}", i, SensorType.Temperature, this, settings); + ActivateSensor(_temperatures[i]); + } + + for (int i = 0; i < _colors.Length; i++) + { + int control = (i / 3) + 1; + string color = (i % 3) switch + { + 0 => "Red", + 1 => "Green", + 2 => "Blue", + _ => "Invalid" + }; + _colors[i] = new Sensor($"Controller {control} {color}", COLOR_COUNT + i, SensorType.Level, this, settings); + ActivateSensor(_colors[i]); + } + + Update(); + } + + public ushort FirmwareVersion { get; private set; } + + public override HardwareType HardwareType + { + get { return HardwareType.EmbeddedController; } + } + + public string Status + { + get + { + if (_rawData[0] != 0x1) + { + return $"Status: Invalid header {_rawData[0]}"; + } + + if (FirmwareVersion < 1009) + { + return $"Status: Untested Firmware Version {FirmwareVersion}! Please consider Updating to Version 1009"; + } + + return "Status: OK"; + } + } + + public override void Close() + { + base.Close(); + } + + public override void Update() + { + if (_device.TryOpen(out HidStream stream)) { + int length = stream.Read(_rawData); + + if (length != _rawData.Length || _rawData[0] != 0x1) + { + return; + } + + FirmwareVersion = Convert.ToUInt16(_rawData[21] << 8 | _rawData[22]); + + int offset = HEADER_SIZE + SENSOR_OFFSET; + foreach (Sensor temp in _temperatures) + { + temp.Value = (_rawData[offset] << 8 | _rawData[offset + 1]) / 100.0f; + + if (temp.Value == (TEMP_SENSOR_DISCONNECTED / 100.0f)) { + DeactivateSensor(temp); + } + + offset += 2; + } + + offset = HEADER_SIZE + COLORS_OFFSET; + foreach (Sensor color in _colors) + { + color.Value = (_rawData[offset] << 8 | _rawData[offset + 1]) / 81.90f; + offset += 2; + } + } + + } +} diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs index 0eac4b8..f93dcee 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Octo.cs @@ -31,14 +31,14 @@ internal sealed class Octo : Hardware // 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]); } @@ -49,21 +49,21 @@ internal sealed class Octo : Hardware // Initialize the 8 fan voltage sensors for (int i = 1; i < 9; i++) { - _voltages[i] = new Sensor($"Fan {i}", i, SensorType.Voltage, this, Array.Empty(), settings); + _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]); } } diff --git a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs index 13f37e4..305f57b 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/AquaComputer/Quadro.cs @@ -33,7 +33,7 @@ internal sealed class Quadro : Hardware // 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]); } @@ -48,28 +48,28 @@ internal sealed class Quadro : Hardware // 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); + _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); + _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); + _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); + _rpmSensors[i] = new Sensor($"Fan #{i + 1}", i, SensorType.Fan, this, Array.Empty(), settings); ActivateSensor(_rpmSensors[i]); }