chris' corner
Software, Stories and more
HomeSoftware › cDigiMaster
Wie hier beschrieben, ist die beim Digimaster SF-610 mitgelieferte Software zur Ansteuerung des Panels ziemlich dumm und verbraucht viel zu viele Ressourcen:

IndicatorSystem performance graph

Ich habe mich daher darangemacht, eine eigene Software zu schreiben, um die Lüfter- und Temperaturdaten auszulesen und die Systemdaten an das Panel zu schicken. Dabei wollte ich auch gleich gucken, ob statt der Bildschirmauflösung (die bei 'nem Server uninteressant ist) evtl. die IP-Adresse oder ähnliches angezeigt werden kann.

Dekompilieren der Original-Software (IndicatorSystem.exe)

Die mitgelieferte Software ist in Visual Basic geschrieben, dekompilieren hat aber nicht wirklich funktioniert - entweder ich hab keinen gescheiten Dekompiler gefunden, oder es ist bei VB einfach so, dass da viel Assembler rauskommt.

Mitsniffen der USB-Daten

Vielversprechender war dann das Mitsniffen der per USB übertragenen Daten vom und zum Panel. Das Panel meldet sich als Human Interface Device (HID) an, dadurch ist schon mal kein gesonderter Treiber notwendig.

Mit USBTrace von SysNucleus hab ich dann schnell gesehen, dass jeweils 8 Bytes an das Panel geschickt werden und dieses mit 8 Bytes antwortet. Recht einfach ist dies bei Datum und Uhrzeit zu erkennen:

Datum und Uhrzeit im USB-Sniffer

24 ist dabei der Code für Datum/Uhrzeit, danach folgen Jahr, Monat, Tag, Stunde, Minute als einzelne Bytes (lustigerweise ist das eine Hex-Darstellung; da es 16:43 ist, müsste da eigentlich 10 und 2B stehen), eine 0 als Füllzeichen und eine Checksumme.
Das Panel antwortet dann mit 24 0 0 0 0 0 0 und ner Checksumme, falls es geklappt hat.
Ähnlich einfach sind die anderen Übertragungen für Bildschirm-Auflösung, CPU-Frequenz, RAM und Festplatte zu erkennen.
Messwerte werden vom Panel mit einer leeren Übertragung (18 0 0 0 0 0 0 für Temp1 und Temp2) angefordert, dieses antwortet dann mit einer Nachricht, die die Temperaturen bzw. Lüftergeschwindigkeiten enthält.

Checksumme

Getüftelt habe ich am Algorithmus für die Checksumme. Die hängt von der Summe der ersten 7 Bytes ab, soviel war klar. Ein bisschen Gebastel mit Excel und nem Taschenrechner später bin ich dann draufgekommen, dass die mittleren 4 Bits invertiert werden, sprich "Summe XOR 00111100" liefert die Checksumme.

Ansteuern des Panels mit C#

Obwohl ein HID angeblich das am Einfachsten anzusteuernde USB-Gerät ist, gibt es kaum verständliche Beispiele mit C#-Code dafür im Netz.
Viele funktionieren noch dazu nicht mit x64, weil irgendwelche dubiosen Strukturen in den DLL-Aufrufen da eine andere Größe haben und man da erst mühsam die richtigen Größen reinpatchen muss, das Schreiben hat dann allerdings mit einigen Beispiel-Bibiotheken funktioniert. Nur die Antwort des Panels habe ich nie zurückbekommen.
Funktioniert hat es dann schließlich mit einer stark vereinfachten Klasse auf Basis von Jan Axelsons Code, die einen Report an das Gerät schickt und endlich auch einen Report als Antwort zurückbekommt.

Nun schnell noch über WMI die notwendigen Daten abfragen und umrechnen, fertig ist der erste Prototyp:

Screenshot hidtest.exe

Es werden hier noch keine Temperaturen / Lüfterdaten ausgelesen, und es wird auch noch die Bildschirmauflösung genommen (die krummen Werte kommen von der Remote Desktop-Verbindung), aber es funktioniert:

Foto vom eingebauten Panel

Die Performance des Prototyps ist (selbst bei sekündlicher Aktualisierung des Panels, was völliger Overkill ist) deutlich besser:

cDigiMaster performance graph

Der Speicherverbrauch ist allerdings etwas höher (23 MB statt 4 MB), das liegt aber an der .NET-Umgebung, dafür kann ich nichts :)

Update (2009-01-24):
Inzwischen habe ich einen Windows-Forms-Prototypen fertig, der schon mal die Messwerte anzeigt:
Screenshot cDigiWin V1

Downloads

Das Microsoft .NET Framework 3.5 oder besser wird benötigt.

  • Prototyp (hässliche Konsolenanwendung, nichts einstellbar, keine Messwerte): hidtest.zip
  • zweiter Prototyp (hässliche Windows-Anwendung, nichts einstellbar, aber Messwerte): cDigiWin.zip

ToDo

  • Test auf x86
  • Windows-Forms-Anwendung daraus machen, die im Hintergrund läuft und auch Messwerte anzeigt
  • Konfigurierbar machen, welches Laufwerk für die Festplatten-Platz-Anzeige verwendet wird
  • IP statt Auflösung darstellen (noch nicht wahlweise)
  • Benachrichtigung per E-Mail, wenn Temperatur zu hoch oder Lüfter zu langsam