Fixed a few problems with the Heatmaster.

This commit is contained in:
Michael Möller
2010-08-23 20:00:06 +00:00
parent 4c704e26bb
commit d66df3de7b
3 changed files with 108 additions and 73 deletions

View File

@@ -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,12 +224,8 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster {
get { return "Heatmaster"; }
}
public override void Update() {
if (!available)
return;
while (serialPort.BytesToRead > 0) {
Match match = Regex.Match(ReadLine(0), @">\[0:(\d+)\]([0-9:\|-]+)");
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)) {
@@ -260,6 +258,20 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster {
}
}
}
public override void Update() {
if (!available)
return;
while (serialPort.BytesToRead > 0) {
byte b = (byte)serialPort.ReadByte();
if (b == 0x0D) {
ProcessUpdateLine(buffer.ToString());
buffer.Length = 0;
} else {
buffer.Append((char)b);
}
}
}
public override string GetReport() {

View File

@@ -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 {
@@ -65,9 +67,34 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster {
throw new TimeoutException();
}
private static string[] GetRegistryPortNames() {
List<string> result = new List<string>();
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) {
string[] portNames = SerialPort.GetPortNames();
// No implementation for Heatmaster on Unix systems
int p = (int)System.Environment.OSVersion.Platform;
if ((p == 4) || (p == 128))
return;
string[] portNames = GetRegistryPortNames();
for (int i = portNames.Length - 1; i >= 0; i--) {
try {
@@ -85,7 +112,6 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster {
}
if (serialPort.IsOpen) {
if (serialPort.CtsHolding) {
serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer();
serialPort.Write(new byte[] { 0xAA }, 0, 1);
@@ -127,9 +153,6 @@ namespace OpenHardwareMonitor.Hardware.Heatmaster {
} else {
report.AppendLine("Status: No Response");
}
} else {
report.AppendLine("Status: Not Clear to Send");
}
serialPort.DiscardInBuffer();
serialPort.Close();
serialPort.Dispose();

View File

@@ -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")]