From d66df3de7bb5fcafa4efe5f539736cd1f77bf700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= Date: Mon, 23 Aug 2010 20:00:06 +0000 Subject: [PATCH] Fixed a few problems with the Heatmaster. --- Hardware/Heatmaster/Heatmaster.cs | 78 +++++++++++--------- Hardware/Heatmaster/HeatmasterGroup.cs | 99 ++++++++++++++++---------- Properties/AssemblyVersion.cs | 4 +- 3 files changed, 108 insertions(+), 73 deletions(-) diff --git a/Hardware/Heatmaster/Heatmaster.cs b/Hardware/Heatmaster/Heatmaster.cs index 5971ad2..d453265 100644 --- a/Hardware/Heatmaster/Heatmaster.cs +++ b/Hardware/Heatmaster/Heatmaster.cs @@ -61,6 +61,8 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster { private bool available = false; + private StringBuilder buffer = new StringBuilder(); + private string ReadLine(int timeout) { int i = 0; StringBuilder builder = new StringBuilder(); @@ -82,7 +84,7 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster { private string ReadField(int device, char field) { serialPort.WriteLine("[0:" + device + "]R" + field); for (int i = 0; i < 5; i++) { - string s = ReadLine(100); + string s = ReadLine(200); Match match = Regex.Match(s, @"-\[0:" + device.ToString() + @"\]R" + Regex.Escape(field.ToString()) + ":(.*)"); if (match.Success) @@ -111,7 +113,7 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster { private bool WriteField(int device, char field, string value) { serialPort.WriteLine("[0:" + device + "]W" + field + ":" + value); for (int i = 0; i < 5; i++) { - string s = ReadLine(100); + string s = ReadLine(200); Match match = Regex.Match(s, @"-\[0:" + device.ToString() + @"\]W" + Regex.Escape(field.ToString()) + ":" + value); if (match.Success) @@ -222,42 +224,52 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster { get { return "Heatmaster"; } } + private void ProcessUpdateLine(string line) { + Match match = Regex.Match(line, @">\[0:(\d+)\]([0-9:\|-]+)"); + if (match.Success) { + int device; + if (int.TryParse(match.Groups[1].Value, out device)) { + foreach (string s in match.Groups[2].Value.Split('|')) { + string[] strings = s.Split(':'); + int[] ints = new int[strings.Length]; + for (int i = 0; i < ints.Length; i++) + ints[i] = int.Parse(strings[i]); + switch (device) { + case 32: + if (ints.Length == 3 && ints[0] <= fans.Length) { + fans[ints[0] - 1].Value = ints[1]; + controls[ints[0] - 1].Value = (100 / 255.0f) * ints[2]; + } + break; + case 48: + if (ints.Length == 2 && ints[0] <= temperatures.Length) + temperatures[ints[0] - 1].Value = 0.1f * ints[1]; + break; + case 64: + if (ints.Length == 3 && ints[0] <= flows.Length) + flows[ints[0] - 1].Value = 0.1f * ints[1]; + break; + case 80: + if (ints.Length == 2 && ints[0] <= relays.Length) + relays[ints[0] - 1].Value = 100 * ints[1]; + break; + } + } + } + } + } + public override void Update() { if (!available) return; while (serialPort.BytesToRead > 0) { - Match match = Regex.Match(ReadLine(0), @">\[0:(\d+)\]([0-9:\|-]+)"); - if (match.Success) { - int device; - if (int.TryParse(match.Groups[1].Value, out device)) { - foreach (string s in match.Groups[2].Value.Split('|')) { - string[] strings = s.Split(':'); - int[] ints = new int[strings.Length]; - for (int i = 0; i < ints.Length; i++) - ints[i] = int.Parse(strings[i]); - switch (device) { - case 32: - if (ints.Length == 3 && ints[0] <= fans.Length) { - fans[ints[0] - 1].Value = ints[1]; - controls[ints[0] - 1].Value = (100 / 255.0f) * ints[2]; - } - break; - case 48: - if (ints.Length == 2 && ints[0] <= temperatures.Length) - temperatures[ints[0] - 1].Value = 0.1f * ints[1]; - break; - case 64: - if (ints.Length == 3 && ints[0] <= flows.Length) - flows[ints[0] - 1].Value = 0.1f * ints[1]; - break; - case 80: - if (ints.Length == 2 && ints[0] <= relays.Length) - relays[ints[0] - 1].Value = 100 * ints[1]; - break; - } - } - } + byte b = (byte)serialPort.ReadByte(); + if (b == 0x0D) { + ProcessUpdateLine(buffer.ToString()); + buffer.Length = 0; + } else { + buffer.Append((char)b); } } } diff --git a/Hardware/Heatmaster/HeatmasterGroup.cs b/Hardware/Heatmaster/HeatmasterGroup.cs index 04a69fe..c31ab92 100644 --- a/Hardware/Heatmaster/HeatmasterGroup.cs +++ b/Hardware/Heatmaster/HeatmasterGroup.cs @@ -38,8 +38,10 @@ using System; using System.Collections.Generic; using System.IO.Ports; +using System.Security; using System.Text; using System.Threading; +using Microsoft.Win32; namespace OpenHardwareMonitor.Hardware.Heatmaster { internal class HeatmasterGroup : IGroup { @@ -63,11 +65,36 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster { Thread.Sleep(1); } throw new TimeoutException(); - } + } + + private static string[] GetRegistryPortNames() { + List result = new List(); + try { + RegistryKey key = Registry.LocalMachine.OpenSubKey( + @"SYSTEM\CurrentControlSet\Enum\USB\Vid_10c4&Pid_ea60&Mi_00"); + if (key != null) { + foreach (string subKeyName in key.GetSubKeyNames()) { + RegistryKey subKey = + key.OpenSubKey(subKeyName + "\\" + "Device Parameters"); + if (subKey != null) { + string name = subKey.GetValue("PortName") as string; + if (name != null) + result.Add((string)name); + } + } + } + } catch (SecurityException) { } + return result.ToArray(); + } public HeatmasterGroup(ISettings settings) { + + // No implementation for Heatmaster on Unix systems + int p = (int)System.Environment.OSVersion.Platform; + if ((p == 4) || (p == 128)) + return; - string[] portNames = SerialPort.GetPortNames(); + string[] portNames = GetRegistryPortNames(); for (int i = portNames.Length - 1; i >= 0; i--) { try { @@ -85,50 +112,46 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster { } if (serialPort.IsOpen) { - if (serialPort.CtsHolding) { - serialPort.DiscardInBuffer(); - serialPort.DiscardOutBuffer(); - serialPort.Write(new byte[] { 0xAA }, 0, 1); + serialPort.DiscardInBuffer(); + serialPort.DiscardOutBuffer(); + serialPort.Write(new byte[] { 0xAA }, 0, 1); - int j = 0; - while (serialPort.BytesToRead == 0 && j < 10) { - Thread.Sleep(20); - j++; + int j = 0; + while (serialPort.BytesToRead == 0 && j < 10) { + Thread.Sleep(20); + j++; + } + if (serialPort.BytesToRead > 0) { + bool flag = false; + while (serialPort.BytesToRead > 0 && !flag) { + flag |= (serialPort.ReadByte() == 0xAA); } - if (serialPort.BytesToRead > 0) { - bool flag = false; - while (serialPort.BytesToRead > 0 && !flag) { - flag |= (serialPort.ReadByte() == 0xAA); - } - if (flag) { - serialPort.WriteLine("[0:0]RH"); - try { - int k = 0; - int revision = 0; - while (k < 5) { - string line = ReadLine(serialPort, 100); - if (line.StartsWith("-[0:0]RH:")) { - int.TryParse(line.Substring(9), out revision); - break; - } - k++; + if (flag) { + serialPort.WriteLine("[0:0]RH"); + try { + int k = 0; + int revision = 0; + while (k < 5) { + string line = ReadLine(serialPort, 100); + if (line.StartsWith("-[0:0]RH:")) { + int.TryParse(line.Substring(9), out revision); + break; } - isValid = (revision == 770); - if (!isValid) { - report.Append("Status: Wrong Hardware Revision " + - revision.ToString()); - } - } catch (TimeoutException) { - report.AppendLine("Status: Timeout Reading Revision"); + k++; } - } else { - report.AppendLine("Status: Wrong Startflag"); + isValid = (revision == 770); + if (!isValid) { + report.Append("Status: Wrong Hardware Revision " + + revision.ToString()); + } + } catch (TimeoutException) { + report.AppendLine("Status: Timeout Reading Revision"); } } else { - report.AppendLine("Status: No Response"); + report.AppendLine("Status: Wrong Startflag"); } } else { - report.AppendLine("Status: Not Clear to Send"); + report.AppendLine("Status: No Response"); } serialPort.DiscardInBuffer(); serialPort.Close(); diff --git a/Properties/AssemblyVersion.cs b/Properties/AssemblyVersion.cs index 006ed75..9622b86 100644 --- a/Properties/AssemblyVersion.cs +++ b/Properties/AssemblyVersion.cs @@ -38,5 +38,5 @@ using System; using System.Reflection; -[assembly: AssemblyVersion("0.1.37.4")] -[assembly: AssemblyFileVersion("0.1.37.4")] +[assembly: AssemblyVersion("0.1.37.7")] +[assembly: AssemblyFileVersion("0.1.37.7")]