[Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Ich vermute mal, der Datenaustausch lässt sich über Shared Memory realisieren, zumindest hab ich in deren Forum sowas gefunden. Ist nich wirklich schwer, ähnlich wie Dateien schreiben ;)
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Ich habe jetzt mal das Verzeichnis sowie das Verzeichnis unter AppData angeguckt. Dabei habe ich keine Config Dateien oder dergleichen gefunden. Ein Plugin ist somit unumgänglich.
In der Hilfe steht auch etwas von Shared Memory, allerdings nur ein defekter Link. :schief:
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Der HM lässt sich nicht direkt über den Display ansteuern.Keine Sorge das war eines der ersten dinge die ich versucht habe. Es besteht nur die möglichkeit sich die Daten via Programm abugreifen und dann mithilfe dessen über einen Plug in zu Hype weiterzureichen.
Bei der direkten Möglichkeit sind leiter Variablen mit im Spiel die sich schlecht beeinflussen lassen. Daher gehen wir den weg über das Programm denn so wird es wohl auch Alphacool tun wenn die mal den Display support freigeben würden. Aber das wird noch ne ganze weile dauern.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Bezüglich des Shared Memory habe ich im LCD Hype Forum etwas gefunden. (s.Anhang) Das ist ein C++ Quellcode mit den benötigten Anweisungen. Um das zu programmieren/ einzubinden fehlt es mir aber noch an den nötigen Fertigkeiten. Trotzdem werde ich mich noch einmal damit befassen.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Genauso wie ein fester Pfad (der unter allen x86 Windoofs nicht funzt ;))
Oder den Tempwert nur auf 99,9°C zu beschränken.
Was ist denn wenn der Wert einer Graka zB mal auf hundert geht. Dann schmiert dir dein Prog ab, oder du bist nahe dem Gefrierpunkt
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Bei 100°C GPU Temperatur hat man meiner Meinung nach andere Sorgen als ein Programm, dass einen falschen Messwert ausliest. :D Abstürtzen wird da nichts, es wird einfach eine Null ausgelesen.
Aber es besteht wie gesagt noch Verbesserungpotential. ;) Zuerst einmal ist es aber wichtig, dass alles funktioniert. Deshalb muss ich mir zunächst das Plugin ansehen.

Also wird die Datei bzw. deren Verzeichnis "Shared Memory Segment.cpp" einfach als normale Pfadangabe genutzt und ausgeführt? Dann übergebe ich die Variablen in das Shared Memory Segment, welches es in LCD Hype augibt?
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Das Projekt ist nur ein Beispiel. Was LCD Hype genau für Daten erwartet, müsste irgendwo im SDK bzw. in dessen Doku notiert sein.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Hoi,

also wie du vllt. schon festgestellt hast, ist es unter C extrem umständlich eine Datei einzulesen (schwierig nicht, nur umständlich und aufwendig). Vielleicht wäre eine Skriptsprache wie Python leichter, was die Stringverarbeitung angeht.

Das Problem bei deiner Lösung hat zcei ja angesprochen, du liest nur 2 Stellen und die Dezimale ein. Auch wenn die Temperatur vmtl. nie so hoch sein wird, sollte man es trotzdem gleich "richtig" implementieren.

Hab mich interessehalber mal hingehockt und selbst was zusammen gehackt:
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    FILE *fp = NULL;

    fp = fopen("test.txt", "r");
    if (!fp) {
        puts("Fehler beim Öffnen der Datei");
        return 1;
    }

    char date[11] = { 0 };
    char time[9] = { 0 };
    double temps[3];

    char buf[64];

    fgets(buf, 64, fp);
    char *token = NULL;
    int index = 0;
    
    token = strtok(buf, ";");
    do {
        switch (index) {
            case 0:
                strcpy(date, token);
                break;
            case 1:
                strcpy(time, token);
                break;
            case 2:
                break;
            case 3:
            case 4:
            case 5:
                *(strchr(token, ',')) = '.';
                temps[index-3] = atof(token);
                break; 
        }

        index++;
        token = strtok(NULL, ";");
    } while (token != NULL);
    printf("Datum: %s, Uhrzeit: %s\n", date, time);
    printf("Temp1: %e, Temp2: %e, Temp3: %e\n", temps[0], temps[1], temps[2]);

    fclose(fp);
}
Zuerst lese ich den gesamten String mittels fgets in ein Array ein. Danach zerteile ich den String mit der strtok-Funktion. Die einzelnen Teile speicher ich dann in verschiedene Variablen. Die index-Variable dient nur zum "Mitzählen" welcher Teil im Moment verarbeitet wird. Bei den Temperaturen muss man das "," im String zuerst durch einen "." ersetzen, sonst kann atof das nicht richtig einlesen.

Die Ausgabe der Temperaturen erfolgt grade noch in Exponentialschreibweise ("2.130000e+01"), aber das lässt sich mit den Formatierungsoptionen von printf auch lösen.

Gruß,
pyro

PS: Mit C kann man nicht wirklich objektorientiert programmieren, da typische OOP-"Features" wie Klassen, Vererbung, Polymorphie und Datenkapselung fehlen. Ist eher strukturiertes Programmieren.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Das sieht doch gut aus, ich werde es gleich mal ausprobieren. Momentan habe ich allerdings wenig Zeit für das Programm, weil nebenbei auch noch mein CaseCon in die Endphase geht.


Edit: Ich habe gerade den Code eingefügt und kompiliert und es funktioniert super. Jetzt muss nur noch der Pointer an die richtige Stelle gesetzt werden. Das müste doch mit fseek gehen?

P.S. Mit printf("%f", Double); wird die Zahl richig formatiert ausgegeben.
 
Zuletzt bearbeitet:
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Welchen Pointer willst du an welche Stelle setzen?
Den Filepointer?!
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Genau. In meiner Version muss der Pointer an die richtige Stelle (letzte Zeile, erster Messwert) gesetzt werden, dort werden dann die Zeichen eingelesen. Ich habe das gestern schon ausprobiert, aber es hat nicht wirklich funktioniert. Auch das Auslesen des ersten Messwertes habe ich nicht hinbekommen. Du liest ja nur die drei Tempertursensoren und nicht den internen Sensor aus.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Ah, ich dachte "Internal" ist irgendein "interner" Wert, der nicht weiter interessant ist :D
Den einzulesen ist aber gar nicht soo schwer, da muss man das ganze nur ein wenig erweitern.

In meiner Testdatei steht auch nur eine einzelne Zeile, deshalb hat das bei mir so gut funktioniert ;D
Wenn man die letzte Zeile auslesen will, würde ich einfach alle Zeilen auslesen und dann die Ausgelesenen Werte verwerfen (bis auf die letzte Zeile natürlich). Oder Zwischenspeichern und daraus einen netten Graphen malen oder so :D

Habs mal noch kurz eingebaut:
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
    FILE *fp = NULL;

    fp = fopen("test.txt", "r");
    if (!fp) {
        puts("Fehler beim Öffnen der Datei");
        return 1;
    }

    char date[11] = { 0 };
    char time[9] = { 0 };
    double temps[3];
    double internal;

    while (!feof(fp)) {
        char buf[64];

        fgets(buf, 64, fp);
        char *token = NULL;
        int index = 0;
        
        token = strtok(buf, ";");
        do {
            switch (index) {
                case 0:
                    strcpy(date, token);
                    break;
                case 1:
                    strcpy(time, token);
                    break;
                case 2:
                    *(strchr(token, ',')) = '.';
                    internal = atof(token);
                    break;
                case 3:
                case 4:
                case 5:
                    *(strchr(token, ',')) = '.';
                    temps[index-3] = atof(token);
                    break; 
            }

            index++;
            token = strtok(NULL, ";");
        } while (token != NULL);
    }
    printf("Datum: %s, Uhrzeit: %s\n", date, time);
    printf("Internal: %f, Temp1: %f, Temp2: %f, Temp3: %f\n", internal, temps[0], temps[1], temps[2]);

    fclose(fp);
}

Code:
pyro@exuma:~/Coding/C $ gcc -o test test.c
pyro@exuma:~/Coding/C $ cat test.txt
2010-12-02;18:34:01;34,4;21,3;21,3;20,0;-3276,8;-3276,8;
2010-12-02;18:34:01;34,5;21,3;21,3;20,0;-3276,8;-3276,8;
2010-12-02;18:34:01;34,6;21,3;21,3;20,0;-3276,8;-3276,8;
2010-12-02;18:34:01;34,7;21,3;21,3;20,0;-3276,8;-3276,8;
2010-12-02;18:34:01;34,8;21,3;21,3;20,0;-3276,8;-3276,8;
pyro@exuma:~/Coding/C $ ./test
Datum: 2010-12-02, Uhrzeit: 18:34:01
Internal: 34.800000, Temp1: 21.300000, Temp2: 21.300000, Temp3: 20.000000
pyro@exuma:~/Coding/C $
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Ok, das erscheint mir logisch. Ich habe aus double temps[3] nämlich double temps[4] gemacht, aber da wurde nur Müll ausgelesen. Eine Frage habe ich aber noch, wofür steht die Variable "buf"?
Ich werde den Code gleich noch anpassen, wobei es noch ein Problem gibt, und zwar funktionert Return 1 nicht, weil ich den Code in eine Lese-Funktion ausgelagert habe.
Wegen der Printf Formatierung habe ich mich auch noch ein bisschen schlau gemacht und es gibt eine ganz einfache Möglichkeit die Genauigkeit, also die Anzahl der Dezimalen, festzulegen. Das funktioniert mit beispielsweise %3.1f (drei Stellen, eine Dezimale).
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Hoi,

buf ist einfach nur eine temporäre Variable die als Schreibpuffer (engl. buffer, abgekürzt buf) dient. In die Variable wird der Inhalt der kompletten Zeile geschrieben, bevor er mittels strtok zerlegt wird.

Das return 1 funktioniert natürlich nicht in jeder Funktion, kommt halt auf den Rückgabetyp drauf an.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Ich habe das jetzt mal in das Program eingefügt und ausprobiert, allerdings stürtzt das Programm bei jedem Start ab.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Ich habe das jetzt mal in das Program eingefügt und ausprobiert, allerdings stürtzt das Programm bei jedem Start ab.

Klingt mir fast so als würde es den Ram vollschreiben. Was wiederum bedeuten würde das eine Schleife Falsch wäre.
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Klingt mir fast so als würde es den Ram vollschreiben. Was wiederum bedeuten würde das eine Schleife Falsch wäre.
Ich würde jetzt eher vermuten, dass ein Zugriff auf Speicher erfolgt, der einem net gehört...

Ich würde mal den Einsatz eines Debugger empfehlen, um die problematische Codestelle zu finden. Dann können wir weitersehen
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Also das Programm stürtzt direkt beim Start ab. Windows gibt die Fehlermeldung aus, dass das Programm nicht mehr funktioniere und nach einer Lösung gesucht werde.
Der Arbeitsspeicher wird dabei aber definitiv nicht vollgeschrieben oder dergleichen.

Kann man überhaupt eine while-Schleife und eine do-while-Schleife verschachteln? Bei der Version ohne Internal-Temperatur, war ja nur eine do-while-Schleife vorhanden und da lief alles.

Code:
[COLOR=Red]while (!feof(fp)) {        char buf[64];

        fgets(buf, 64, fp);
        char *token = NULL;
        int index = 0;
        
        token = strtok(buf, ";");
        [COLOR=Red]do {            switch (index) {
                case 0:
                    strcpy(date, token);
                    break;
                case 1:
                    strcpy(time, token);
                    break;
                case 2:
                    *(strchr(token, ',')) = '.';
                    internal = atof(token);
                    break;
                case 3:
                case 4:
                case 5:
                    *(strchr(token, ',')) = '.';
                    temps[index-3] = atof(token);
                    break; 
          [COLOR=Red]  [COLOR=Black]}
            index++;
            token = strtok(NULL, ";");
       [COLOR=Red] } while (token != NULL);[COLOR=Red]}
 
AW: [Projekt] Messdatenverarbeitung für den Alphacool Heatmaster

Nur mal eine dumme Regel die du in jeden guten Buch finden wirst. Was ist wenn Token NULL ist und du verwendest es? :ugly: Richtig, bummmmm Anwendung weg!

Gehe immer davon aus das Funktionen schief gehen können und verwende nichts was du nicht geprüft hast!

Edit:
Mach mal aus der do while eine while und wenn es das ist was ich denke löst du damit das Problem.

Edit die zweite:
Code:
while (!feof(fp)) 
{
    char buf[64];
    char *token = NULL;
    if(fgets(buf, 64, fp))
    {
        for(int index = 0;
            index <= 5 && (token = strtok(buf, ";")) != NULL;
            index++)
        {
            switch (index)
            {
            case 0:
                strcpy(date, token);
                break;
            case 1:
                strcpy(time, token);
                break;
            case 2:
                *(strchr(token, ',')) = '.';
                internal = atof(token);
                break;
            case 3:
            case 4:
            case 5:
                *(strchr(token, ',')) = '.';
                temps[index-3] = atof(token);
                break; 
            }
        }
    }
}
 
Zuletzt bearbeitet:
Zurück