Monitor für das Tasterprogramm
Dependents: 19_Taster_BSW_oo 19_Taster_a
Fork of monitor by
monitor.cpp
- Committer:
- rs27
- Date:
- 2014-07-26
- Revision:
- 0:f0fbbfdca478
- Child:
- 1:19313470f629
File content as of revision 0:f0fbbfdca478:
#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"); }