Monitor für das Tasterprogramm
Dependents: 19_Taster_BSW_oo 19_Taster_a
Fork of monitor by
Diff: monitor.cpp
- Revision:
- 0:f0fbbfdca478
- Child:
- 1:19313470f629
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/monitor.cpp Sat Jul 26 07:27:20 2014 +0000 @@ -0,0 +1,255 @@ + +#include <stdarg.h> +#include <ctype.h> +#include "monitor.h" + +extern Serial pc; +extern Buffer <char> buf; + +#define COMMAND_MAX 5 +#define COMMAND_LEN 7 +const char command[COMMAND_MAX][COMMAND_LEN] = {"DATE","DUMP","HELP","SET","TIME"}; + +//----------------------------------------------------------------------------- +// destructor + +monitor::monitor(void) +{ + uint8_t i; + + for (i = 0; i < COM_LINE_LEN; com_line[i++] = 0); + ComLinePtr = ComLineTop = 0; + cr_flag = false; + + // 0 Kanal ist daktiv + // 1 Rohdaten ausgeben + // 2 Temperaturwert in Float Darstellung + + status[0] = 2; // Temperaturwerte ausgeben + status[1] = 0; + status[2] = 0; + status[3] = 0; + status[4] = 0; + status[5] = 0; + status[6] = 0; + status[7] = 0; + +} + +//----------------------------------------------------------------------------- +// destructor + +void monitor::parser (void) +{ + uint8_t i, ch, tch, top, bottom, len; + int8_t res; + + // Zuerst wird der erste Buchstabe aus dem Eingabestring mit den ersten + // Buchstaben aus der Befehlstabelle verglichen + + bottom = 0; // untere Suchgrenze + top = COMMAND_MAX; // obere Suchgerenze + ch = com_line[0]; // hole erstes Suchzeichen + + do + { + i = (top + bottom) >> 1; // suche in der Mitte des Feldes beginnen + tch = command [i][0]; // Vergleichszeichen laden + if (tch == ch) break; // Zeichen gefunden + if (tch > ch) top = i; // nach unten suchen + else bottom = i; // nach oben suchen + if (bottom != 0 && top == bottom + 1) break; // kein Buchstabe gef. + + } while (i > 0 && i < COMMAND_MAX - 1); + + if (tch != ch) + { + pc.printf("\nParser Kommando nicht gefunden\n"); + return; // Kommando nicht gefunden wurde + } + + // das erst Wort soll von den Übergabeparametern isoliert werden + + for (i = 0; com_line[i] != ' ' && com_line[i] != 0; i++); + len = i; + + + if (i == 0) return; + + // die Übergabparameter ermitteln und in als Indexzeiger in + // 'ComLinePtr' abspeichern + + for ( ; com_line[i] == ' ' && com_line[i] != 0; i++); + ComLinePtr = i; + + // die binäre Suche nach den restlichen Zeichen wird hier fortgesetzt + + do + { + i = (top + bottom) >> 1; // berechnen des Suchplatzes + //printf_P (PSTR("\n\rVergleich 1 com_line = [%s] und Länge = [%d]"),com_line,len); + //strcpy_P (temp, &command[i][0]); + //printf_P (PSTR("\n\rVergleich 2 command[i] = [%s] und Index = [%d]"),temp,i); + res = strncmp(com_line, &command[i][0], len); + //printf_P (PSTR("\n\rVergleich 3 res = [%d]"),res); + if (res == 0) break; // Zeichen gefunden + if (res > 0) + bottom = i; // nach unten suchen + else + top = i; // nach oben suchen + if (bottom != 0 && top == bottom + 1) break; + + } while (i > 0 && i < COMMAND_MAX - 1); + + + if (res) + { + pc.printf("\nParser Kommando nicht gefunden.\n"); + } + else + { + pc.printf("\nAufruf von Funktion %d",i); + + switch(i) // Programmaufruf + { + case 0: date(); break; + case 1: dump(); break; + case 2: help(); break; + case 3: set(); break; + case 4: time(); break; + } + } +} + + + +//----------------------------------------------------------------------------- +// eine Zeile aus dem Eingangsbuffer lesen + +void monitor::get_line(void) +{ + char ch; + uint8_t i; + + get_ch(); + if (cr_flag) // Neue Eingabezeile + { + if (com_line[0] != 0) + { + // uart_puts(com_line); // zum Testen => später wird der parcer aufgerufen + // Zeichenkette in Großbuchstaben umwandeln + + // printf_P (PSTR("\n monitor ")); + for (i = 0; com_line[i] != 0; i++) + { + ch = com_line[i]; + ch = toupper(ch); // Nur Großbuchstaben + com_line[i] = ch; + // pc.printf(("\n[%02x] %c"),ch,ch); + if (ch == ' ') i = COM_LINE_LEN; + } + // pc.printf(("\n")); + parser(); // Parcer wird aufgerufen + } + + for (i=0; i < COM_LINE_LEN; com_line[i++] = 0); + ComLinePtr = ComLineTop = 0; + cr_flag = 0; + } +} + +//----------------------------------------------------------------------------- +// eine Zeichen aus dem Eingangsbuffer lesen + +void monitor::get_ch (void) +{ + char ch; + + if (!buf.available()) return; // kein Zeichen vorhanden + + ch = buf.get(); // hole das Zeichen + // printf("mon_line: %c %02x\n",ch,ch); // nur zum Test + + switch(ch) + { + case '\r': // CARRIAGE RETURN + cr_flag = true; + break; + + case '\n': // LF empfangen + cr_flag = true; + break; + + default: // Normales Zeichen + if (~iscntrl(ch)) + { + com_line[ComLinePtr] = ch; // Zeichen einfuegen + ComLinePtr++; + } + break; + + } // Ende SWITCH + + if (ComLinePtr >= 80) cr_flag = 1; // Zeilenüberlauf ? + +} + +//----------------------------------------------------------------------------- +// monitor Aufruf + +void monitor::date(void) +{ + pc.printf("\nin date"); +} + +//----------------------------------------------------------------------------- +// monitor Aufruf + +void monitor::dump(void) +{ + pc.printf("\nin dump"); +} + +//----------------------------------------------------------------------------- +// monitor Aufruf + +void monitor::help(void) +{ + pc.printf("\n -- help ------------------------"); + pc.printf("\n set index [val] Sensor auswaehlen"); + pc.printf("\n"); +} + +//----------------------------------------------------------------------------- +// monitor Aufruf + +void monitor::set(void) +{ + int n, pos, val; + + n = sscanf(&com_line[ComLinePtr],"%d %d",&pos,&val); + + switch (n) + { + case -1: pc.printf("\nbitte index [wert] angeben"); + pc.printf("\n Index >> Sonsor 0 bis 7"); + pc.printf("\n wert >> 0 = inaktiv, 1 = Rohwerte, 2 = errechneter Wert"); + break; + + case 1: pc.printf("\nread status[%d] = %d",pos,status[pos]); + break; + + case 2: status[pos] = val; + pc.printf("\nset status[%d] = %d",pos,status[pos]); + break; + } // end switch +} + +//----------------------------------------------------------------------------- +// monitor Aufruf + +void monitor::time(void) +{ + pc.printf("\nin timer"); +} +