diff --git a/LibreHardwareMonitor/UI/SensorNode.cs b/LibreHardwareMonitor/UI/SensorNode.cs index ca08026..c5c073e 100644 --- a/LibreHardwareMonitor/UI/SensorNode.cs +++ b/LibreHardwareMonitor/UI/SensorNode.cs @@ -88,7 +88,7 @@ namespace LibreHardwareMonitor.UI case SensorType.Load: Format = "{0:F1} %"; break; case SensorType.Temperature: Format = "{0:F1} °C"; break; case SensorType.Fan: Format = "{0:F0} RPM"; break; - case SensorType.Flow: Format = "{0:F0} L/h"; break; + case SensorType.Flow: Format = "{0:F1} L/h"; break; case SensorType.Control: Format = "{0:F1} %"; break; case SensorType.Level: Format = "{0:F1} %"; break; case SensorType.Power: Format = "{0:F1} W"; break; diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs index 55f133e..705e54b 100644 --- a/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs +++ b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/AquacomputerGroup.cs @@ -38,6 +38,16 @@ namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer _hardware.Add(device); break; } + case 0xf003: + { + var device = new MPS(dev, settings); + _report.AppendLine($"Device name: {productName}"); + _report.AppendLine($"Firmware version: {device.FirmwareVersion}"); + _report.AppendLine($"{device.Status}"); + _report.AppendLine(); + _hardware.Add(device); + break; + } default: { _report.AppendLine($"Unknown Hardware PID: {dev.Attributes.ProductHexId} Name: {productName}"); diff --git a/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/MPS.cs b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/MPS.cs new file mode 100644 index 0000000..954c580 --- /dev/null +++ b/LibreHardwareMonitorLib/Hardware/Controller/Aquacomputer/MPS.cs @@ -0,0 +1,108 @@ +// Mozilla Public License 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 HidLibrary; + +namespace LibreHardwareMonitor.Hardware.Controller.AquaComputer +{ + internal class MPS : Hardware + { + #region USB + private HidDevice _device; + private byte[] _rawData; + public UInt16 FirmwareVersion { get; private set; } + #endregion + + private readonly Sensor _pumpFlow; + private readonly Sensor[] _temperatures = new Sensor[2]; + + private const byte MPS_REPORT_ID = 0x2; + + private UInt16 _externalTemperature = 0; + + private sealed class MPSDataIndexes + { + public const int PumpFlow = 35; + public const int ExternalTemperature = 43; + public const int InternalWaterTemperature = 45; + } + + public MPS(HidDevice dev, ISettings settings) : base("MPS", new Identifier(dev.DevicePath), settings) + { + _device = dev; + + do + { + _device.ReadFeatureData(out _rawData, MPS_REPORT_ID); + } while (_rawData[0] != MPS_REPORT_ID); + + Name = $"MPS"; + FirmwareVersion = ExtractFirmwareVersion(); + + _temperatures[0] = new Sensor("External", 0, SensorType.Temperature, this, new ParameterDescription[0], settings); + ActivateSensor(_temperatures[0]); + _temperatures[1] = new Sensor("Internal Water", 1, SensorType.Temperature, this, new ParameterDescription[0], settings); + ActivateSensor(_temperatures[1]); + + _pumpFlow = new Sensor("Pump", 0, SensorType.Flow, this, new ParameterDescription[0], settings); + ActivateSensor(_pumpFlow); + } + + public override HardwareType HardwareType + { + get + { + return HardwareType.AquaComputer; + } + } + + public string Status + { + get + { + FirmwareVersion = ExtractFirmwareVersion(); + if (FirmwareVersion < 1012) + { + return $"Status: Untested Firmware Version {FirmwareVersion}! Please consider Updating to Version 1012"; + } + return "Status: OK"; + } + } + + public override void Close() + { + _device.CloseDevice(); + base.Close(); + } + + public override void Update() + { + _device.ReadFeatureData(out _rawData, MPS_REPORT_ID); + + if (_rawData[0] != MPS_REPORT_ID) + return; + + _pumpFlow.Value = BitConverter.ToUInt16(_rawData, MPSDataIndexes.PumpFlow) / 10f; + + _externalTemperature = BitConverter.ToUInt16(_rawData, MPSDataIndexes.ExternalTemperature); + //sensor reading returns Int16.MaxValue (32767), when not connected + if (_externalTemperature != Int16.MaxValue) + { + _temperatures[0].Value = _externalTemperature / 100f; + } + else + _temperatures[0].Value = null; + + _temperatures[1].Value = BitConverter.ToUInt16(_rawData, MPSDataIndexes.InternalWaterTemperature) / 100f; + + } + + private ushort ExtractFirmwareVersion() + { + return BitConverter.ToUInt16(_rawData, 3); + } + } +} diff --git a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj index f9f3582..617ab50 100644 --- a/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj +++ b/LibreHardwareMonitorLib/LibreHardwareMonitorLib.csproj @@ -33,6 +33,7 @@ +