Monitor für das Tasterprogramm
Dependents: 19_Taster_BSW_oo 19_Taster_a
Fork of monitor by
monitor.cpp@0:f0fbbfdca478, 2014-07-26 (annotated)
- Committer:
- rs27
- Date:
- Sat Jul 26 07:27:20 2014 +0000
- Revision:
- 0:f0fbbfdca478
- Child:
- 1:19313470f629
monitor
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
rs27 | 0:f0fbbfdca478 | 1 | |
rs27 | 0:f0fbbfdca478 | 2 | #include <stdarg.h> |
rs27 | 0:f0fbbfdca478 | 3 | #include <ctype.h> |
rs27 | 0:f0fbbfdca478 | 4 | #include "monitor.h" |
rs27 | 0:f0fbbfdca478 | 5 | |
rs27 | 0:f0fbbfdca478 | 6 | extern Serial pc; |
rs27 | 0:f0fbbfdca478 | 7 | extern Buffer <char> buf; |
rs27 | 0:f0fbbfdca478 | 8 | |
rs27 | 0:f0fbbfdca478 | 9 | #define COMMAND_MAX 5 |
rs27 | 0:f0fbbfdca478 | 10 | #define COMMAND_LEN 7 |
rs27 | 0:f0fbbfdca478 | 11 | const char command[COMMAND_MAX][COMMAND_LEN] = {"DATE","DUMP","HELP","SET","TIME"}; |
rs27 | 0:f0fbbfdca478 | 12 | |
rs27 | 0:f0fbbfdca478 | 13 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 14 | // destructor |
rs27 | 0:f0fbbfdca478 | 15 | |
rs27 | 0:f0fbbfdca478 | 16 | monitor::monitor(void) |
rs27 | 0:f0fbbfdca478 | 17 | { |
rs27 | 0:f0fbbfdca478 | 18 | uint8_t i; |
rs27 | 0:f0fbbfdca478 | 19 | |
rs27 | 0:f0fbbfdca478 | 20 | for (i = 0; i < COM_LINE_LEN; com_line[i++] = 0); |
rs27 | 0:f0fbbfdca478 | 21 | ComLinePtr = ComLineTop = 0; |
rs27 | 0:f0fbbfdca478 | 22 | cr_flag = false; |
rs27 | 0:f0fbbfdca478 | 23 | |
rs27 | 0:f0fbbfdca478 | 24 | // 0 Kanal ist daktiv |
rs27 | 0:f0fbbfdca478 | 25 | // 1 Rohdaten ausgeben |
rs27 | 0:f0fbbfdca478 | 26 | // 2 Temperaturwert in Float Darstellung |
rs27 | 0:f0fbbfdca478 | 27 | |
rs27 | 0:f0fbbfdca478 | 28 | status[0] = 2; // Temperaturwerte ausgeben |
rs27 | 0:f0fbbfdca478 | 29 | status[1] = 0; |
rs27 | 0:f0fbbfdca478 | 30 | status[2] = 0; |
rs27 | 0:f0fbbfdca478 | 31 | status[3] = 0; |
rs27 | 0:f0fbbfdca478 | 32 | status[4] = 0; |
rs27 | 0:f0fbbfdca478 | 33 | status[5] = 0; |
rs27 | 0:f0fbbfdca478 | 34 | status[6] = 0; |
rs27 | 0:f0fbbfdca478 | 35 | status[7] = 0; |
rs27 | 0:f0fbbfdca478 | 36 | |
rs27 | 0:f0fbbfdca478 | 37 | } |
rs27 | 0:f0fbbfdca478 | 38 | |
rs27 | 0:f0fbbfdca478 | 39 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 40 | // destructor |
rs27 | 0:f0fbbfdca478 | 41 | |
rs27 | 0:f0fbbfdca478 | 42 | void monitor::parser (void) |
rs27 | 0:f0fbbfdca478 | 43 | { |
rs27 | 0:f0fbbfdca478 | 44 | uint8_t i, ch, tch, top, bottom, len; |
rs27 | 0:f0fbbfdca478 | 45 | int8_t res; |
rs27 | 0:f0fbbfdca478 | 46 | |
rs27 | 0:f0fbbfdca478 | 47 | // Zuerst wird der erste Buchstabe aus dem Eingabestring mit den ersten |
rs27 | 0:f0fbbfdca478 | 48 | // Buchstaben aus der Befehlstabelle verglichen |
rs27 | 0:f0fbbfdca478 | 49 | |
rs27 | 0:f0fbbfdca478 | 50 | bottom = 0; // untere Suchgrenze |
rs27 | 0:f0fbbfdca478 | 51 | top = COMMAND_MAX; // obere Suchgerenze |
rs27 | 0:f0fbbfdca478 | 52 | ch = com_line[0]; // hole erstes Suchzeichen |
rs27 | 0:f0fbbfdca478 | 53 | |
rs27 | 0:f0fbbfdca478 | 54 | do |
rs27 | 0:f0fbbfdca478 | 55 | { |
rs27 | 0:f0fbbfdca478 | 56 | i = (top + bottom) >> 1; // suche in der Mitte des Feldes beginnen |
rs27 | 0:f0fbbfdca478 | 57 | tch = command [i][0]; // Vergleichszeichen laden |
rs27 | 0:f0fbbfdca478 | 58 | if (tch == ch) break; // Zeichen gefunden |
rs27 | 0:f0fbbfdca478 | 59 | if (tch > ch) top = i; // nach unten suchen |
rs27 | 0:f0fbbfdca478 | 60 | else bottom = i; // nach oben suchen |
rs27 | 0:f0fbbfdca478 | 61 | if (bottom != 0 && top == bottom + 1) break; // kein Buchstabe gef. |
rs27 | 0:f0fbbfdca478 | 62 | |
rs27 | 0:f0fbbfdca478 | 63 | } while (i > 0 && i < COMMAND_MAX - 1); |
rs27 | 0:f0fbbfdca478 | 64 | |
rs27 | 0:f0fbbfdca478 | 65 | if (tch != ch) |
rs27 | 0:f0fbbfdca478 | 66 | { |
rs27 | 0:f0fbbfdca478 | 67 | pc.printf("\nParser Kommando nicht gefunden\n"); |
rs27 | 0:f0fbbfdca478 | 68 | return; // Kommando nicht gefunden wurde |
rs27 | 0:f0fbbfdca478 | 69 | } |
rs27 | 0:f0fbbfdca478 | 70 | |
rs27 | 0:f0fbbfdca478 | 71 | // das erst Wort soll von den Übergabeparametern isoliert werden |
rs27 | 0:f0fbbfdca478 | 72 | |
rs27 | 0:f0fbbfdca478 | 73 | for (i = 0; com_line[i] != ' ' && com_line[i] != 0; i++); |
rs27 | 0:f0fbbfdca478 | 74 | len = i; |
rs27 | 0:f0fbbfdca478 | 75 | |
rs27 | 0:f0fbbfdca478 | 76 | |
rs27 | 0:f0fbbfdca478 | 77 | if (i == 0) return; |
rs27 | 0:f0fbbfdca478 | 78 | |
rs27 | 0:f0fbbfdca478 | 79 | // die Übergabparameter ermitteln und in als Indexzeiger in |
rs27 | 0:f0fbbfdca478 | 80 | // 'ComLinePtr' abspeichern |
rs27 | 0:f0fbbfdca478 | 81 | |
rs27 | 0:f0fbbfdca478 | 82 | for ( ; com_line[i] == ' ' && com_line[i] != 0; i++); |
rs27 | 0:f0fbbfdca478 | 83 | ComLinePtr = i; |
rs27 | 0:f0fbbfdca478 | 84 | |
rs27 | 0:f0fbbfdca478 | 85 | // die binäre Suche nach den restlichen Zeichen wird hier fortgesetzt |
rs27 | 0:f0fbbfdca478 | 86 | |
rs27 | 0:f0fbbfdca478 | 87 | do |
rs27 | 0:f0fbbfdca478 | 88 | { |
rs27 | 0:f0fbbfdca478 | 89 | i = (top + bottom) >> 1; // berechnen des Suchplatzes |
rs27 | 0:f0fbbfdca478 | 90 | //printf_P (PSTR("\n\rVergleich 1 com_line = [%s] und Länge = [%d]"),com_line,len); |
rs27 | 0:f0fbbfdca478 | 91 | //strcpy_P (temp, &command[i][0]); |
rs27 | 0:f0fbbfdca478 | 92 | //printf_P (PSTR("\n\rVergleich 2 command[i] = [%s] und Index = [%d]"),temp,i); |
rs27 | 0:f0fbbfdca478 | 93 | res = strncmp(com_line, &command[i][0], len); |
rs27 | 0:f0fbbfdca478 | 94 | //printf_P (PSTR("\n\rVergleich 3 res = [%d]"),res); |
rs27 | 0:f0fbbfdca478 | 95 | if (res == 0) break; // Zeichen gefunden |
rs27 | 0:f0fbbfdca478 | 96 | if (res > 0) |
rs27 | 0:f0fbbfdca478 | 97 | bottom = i; // nach unten suchen |
rs27 | 0:f0fbbfdca478 | 98 | else |
rs27 | 0:f0fbbfdca478 | 99 | top = i; // nach oben suchen |
rs27 | 0:f0fbbfdca478 | 100 | if (bottom != 0 && top == bottom + 1) break; |
rs27 | 0:f0fbbfdca478 | 101 | |
rs27 | 0:f0fbbfdca478 | 102 | } while (i > 0 && i < COMMAND_MAX - 1); |
rs27 | 0:f0fbbfdca478 | 103 | |
rs27 | 0:f0fbbfdca478 | 104 | |
rs27 | 0:f0fbbfdca478 | 105 | if (res) |
rs27 | 0:f0fbbfdca478 | 106 | { |
rs27 | 0:f0fbbfdca478 | 107 | pc.printf("\nParser Kommando nicht gefunden.\n"); |
rs27 | 0:f0fbbfdca478 | 108 | } |
rs27 | 0:f0fbbfdca478 | 109 | else |
rs27 | 0:f0fbbfdca478 | 110 | { |
rs27 | 0:f0fbbfdca478 | 111 | pc.printf("\nAufruf von Funktion %d",i); |
rs27 | 0:f0fbbfdca478 | 112 | |
rs27 | 0:f0fbbfdca478 | 113 | switch(i) // Programmaufruf |
rs27 | 0:f0fbbfdca478 | 114 | { |
rs27 | 0:f0fbbfdca478 | 115 | case 0: date(); break; |
rs27 | 0:f0fbbfdca478 | 116 | case 1: dump(); break; |
rs27 | 0:f0fbbfdca478 | 117 | case 2: help(); break; |
rs27 | 0:f0fbbfdca478 | 118 | case 3: set(); break; |
rs27 | 0:f0fbbfdca478 | 119 | case 4: time(); break; |
rs27 | 0:f0fbbfdca478 | 120 | } |
rs27 | 0:f0fbbfdca478 | 121 | } |
rs27 | 0:f0fbbfdca478 | 122 | } |
rs27 | 0:f0fbbfdca478 | 123 | |
rs27 | 0:f0fbbfdca478 | 124 | |
rs27 | 0:f0fbbfdca478 | 125 | |
rs27 | 0:f0fbbfdca478 | 126 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 127 | // eine Zeile aus dem Eingangsbuffer lesen |
rs27 | 0:f0fbbfdca478 | 128 | |
rs27 | 0:f0fbbfdca478 | 129 | void monitor::get_line(void) |
rs27 | 0:f0fbbfdca478 | 130 | { |
rs27 | 0:f0fbbfdca478 | 131 | char ch; |
rs27 | 0:f0fbbfdca478 | 132 | uint8_t i; |
rs27 | 0:f0fbbfdca478 | 133 | |
rs27 | 0:f0fbbfdca478 | 134 | get_ch(); |
rs27 | 0:f0fbbfdca478 | 135 | if (cr_flag) // Neue Eingabezeile |
rs27 | 0:f0fbbfdca478 | 136 | { |
rs27 | 0:f0fbbfdca478 | 137 | if (com_line[0] != 0) |
rs27 | 0:f0fbbfdca478 | 138 | { |
rs27 | 0:f0fbbfdca478 | 139 | // uart_puts(com_line); // zum Testen => später wird der parcer aufgerufen |
rs27 | 0:f0fbbfdca478 | 140 | // Zeichenkette in Großbuchstaben umwandeln |
rs27 | 0:f0fbbfdca478 | 141 | |
rs27 | 0:f0fbbfdca478 | 142 | // printf_P (PSTR("\n monitor ")); |
rs27 | 0:f0fbbfdca478 | 143 | for (i = 0; com_line[i] != 0; i++) |
rs27 | 0:f0fbbfdca478 | 144 | { |
rs27 | 0:f0fbbfdca478 | 145 | ch = com_line[i]; |
rs27 | 0:f0fbbfdca478 | 146 | ch = toupper(ch); // Nur Großbuchstaben |
rs27 | 0:f0fbbfdca478 | 147 | com_line[i] = ch; |
rs27 | 0:f0fbbfdca478 | 148 | // pc.printf(("\n[%02x] %c"),ch,ch); |
rs27 | 0:f0fbbfdca478 | 149 | if (ch == ' ') i = COM_LINE_LEN; |
rs27 | 0:f0fbbfdca478 | 150 | } |
rs27 | 0:f0fbbfdca478 | 151 | // pc.printf(("\n")); |
rs27 | 0:f0fbbfdca478 | 152 | parser(); // Parcer wird aufgerufen |
rs27 | 0:f0fbbfdca478 | 153 | } |
rs27 | 0:f0fbbfdca478 | 154 | |
rs27 | 0:f0fbbfdca478 | 155 | for (i=0; i < COM_LINE_LEN; com_line[i++] = 0); |
rs27 | 0:f0fbbfdca478 | 156 | ComLinePtr = ComLineTop = 0; |
rs27 | 0:f0fbbfdca478 | 157 | cr_flag = 0; |
rs27 | 0:f0fbbfdca478 | 158 | } |
rs27 | 0:f0fbbfdca478 | 159 | } |
rs27 | 0:f0fbbfdca478 | 160 | |
rs27 | 0:f0fbbfdca478 | 161 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 162 | // eine Zeichen aus dem Eingangsbuffer lesen |
rs27 | 0:f0fbbfdca478 | 163 | |
rs27 | 0:f0fbbfdca478 | 164 | void monitor::get_ch (void) |
rs27 | 0:f0fbbfdca478 | 165 | { |
rs27 | 0:f0fbbfdca478 | 166 | char ch; |
rs27 | 0:f0fbbfdca478 | 167 | |
rs27 | 0:f0fbbfdca478 | 168 | if (!buf.available()) return; // kein Zeichen vorhanden |
rs27 | 0:f0fbbfdca478 | 169 | |
rs27 | 0:f0fbbfdca478 | 170 | ch = buf.get(); // hole das Zeichen |
rs27 | 0:f0fbbfdca478 | 171 | // printf("mon_line: %c %02x\n",ch,ch); // nur zum Test |
rs27 | 0:f0fbbfdca478 | 172 | |
rs27 | 0:f0fbbfdca478 | 173 | switch(ch) |
rs27 | 0:f0fbbfdca478 | 174 | { |
rs27 | 0:f0fbbfdca478 | 175 | case '\r': // CARRIAGE RETURN |
rs27 | 0:f0fbbfdca478 | 176 | cr_flag = true; |
rs27 | 0:f0fbbfdca478 | 177 | break; |
rs27 | 0:f0fbbfdca478 | 178 | |
rs27 | 0:f0fbbfdca478 | 179 | case '\n': // LF empfangen |
rs27 | 0:f0fbbfdca478 | 180 | cr_flag = true; |
rs27 | 0:f0fbbfdca478 | 181 | break; |
rs27 | 0:f0fbbfdca478 | 182 | |
rs27 | 0:f0fbbfdca478 | 183 | default: // Normales Zeichen |
rs27 | 0:f0fbbfdca478 | 184 | if (~iscntrl(ch)) |
rs27 | 0:f0fbbfdca478 | 185 | { |
rs27 | 0:f0fbbfdca478 | 186 | com_line[ComLinePtr] = ch; // Zeichen einfuegen |
rs27 | 0:f0fbbfdca478 | 187 | ComLinePtr++; |
rs27 | 0:f0fbbfdca478 | 188 | } |
rs27 | 0:f0fbbfdca478 | 189 | break; |
rs27 | 0:f0fbbfdca478 | 190 | |
rs27 | 0:f0fbbfdca478 | 191 | } // Ende SWITCH |
rs27 | 0:f0fbbfdca478 | 192 | |
rs27 | 0:f0fbbfdca478 | 193 | if (ComLinePtr >= 80) cr_flag = 1; // Zeilenüberlauf ? |
rs27 | 0:f0fbbfdca478 | 194 | |
rs27 | 0:f0fbbfdca478 | 195 | } |
rs27 | 0:f0fbbfdca478 | 196 | |
rs27 | 0:f0fbbfdca478 | 197 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 198 | // monitor Aufruf |
rs27 | 0:f0fbbfdca478 | 199 | |
rs27 | 0:f0fbbfdca478 | 200 | void monitor::date(void) |
rs27 | 0:f0fbbfdca478 | 201 | { |
rs27 | 0:f0fbbfdca478 | 202 | pc.printf("\nin date"); |
rs27 | 0:f0fbbfdca478 | 203 | } |
rs27 | 0:f0fbbfdca478 | 204 | |
rs27 | 0:f0fbbfdca478 | 205 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 206 | // monitor Aufruf |
rs27 | 0:f0fbbfdca478 | 207 | |
rs27 | 0:f0fbbfdca478 | 208 | void monitor::dump(void) |
rs27 | 0:f0fbbfdca478 | 209 | { |
rs27 | 0:f0fbbfdca478 | 210 | pc.printf("\nin dump"); |
rs27 | 0:f0fbbfdca478 | 211 | } |
rs27 | 0:f0fbbfdca478 | 212 | |
rs27 | 0:f0fbbfdca478 | 213 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 214 | // monitor Aufruf |
rs27 | 0:f0fbbfdca478 | 215 | |
rs27 | 0:f0fbbfdca478 | 216 | void monitor::help(void) |
rs27 | 0:f0fbbfdca478 | 217 | { |
rs27 | 0:f0fbbfdca478 | 218 | pc.printf("\n -- help ------------------------"); |
rs27 | 0:f0fbbfdca478 | 219 | pc.printf("\n set index [val] Sensor auswaehlen"); |
rs27 | 0:f0fbbfdca478 | 220 | pc.printf("\n"); |
rs27 | 0:f0fbbfdca478 | 221 | } |
rs27 | 0:f0fbbfdca478 | 222 | |
rs27 | 0:f0fbbfdca478 | 223 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 224 | // monitor Aufruf |
rs27 | 0:f0fbbfdca478 | 225 | |
rs27 | 0:f0fbbfdca478 | 226 | void monitor::set(void) |
rs27 | 0:f0fbbfdca478 | 227 | { |
rs27 | 0:f0fbbfdca478 | 228 | int n, pos, val; |
rs27 | 0:f0fbbfdca478 | 229 | |
rs27 | 0:f0fbbfdca478 | 230 | n = sscanf(&com_line[ComLinePtr],"%d %d",&pos,&val); |
rs27 | 0:f0fbbfdca478 | 231 | |
rs27 | 0:f0fbbfdca478 | 232 | switch (n) |
rs27 | 0:f0fbbfdca478 | 233 | { |
rs27 | 0:f0fbbfdca478 | 234 | case -1: pc.printf("\nbitte index [wert] angeben"); |
rs27 | 0:f0fbbfdca478 | 235 | pc.printf("\n Index >> Sonsor 0 bis 7"); |
rs27 | 0:f0fbbfdca478 | 236 | pc.printf("\n wert >> 0 = inaktiv, 1 = Rohwerte, 2 = errechneter Wert"); |
rs27 | 0:f0fbbfdca478 | 237 | break; |
rs27 | 0:f0fbbfdca478 | 238 | |
rs27 | 0:f0fbbfdca478 | 239 | case 1: pc.printf("\nread status[%d] = %d",pos,status[pos]); |
rs27 | 0:f0fbbfdca478 | 240 | break; |
rs27 | 0:f0fbbfdca478 | 241 | |
rs27 | 0:f0fbbfdca478 | 242 | case 2: status[pos] = val; |
rs27 | 0:f0fbbfdca478 | 243 | pc.printf("\nset status[%d] = %d",pos,status[pos]); |
rs27 | 0:f0fbbfdca478 | 244 | break; |
rs27 | 0:f0fbbfdca478 | 245 | } // end switch |
rs27 | 0:f0fbbfdca478 | 246 | } |
rs27 | 0:f0fbbfdca478 | 247 | |
rs27 | 0:f0fbbfdca478 | 248 | //----------------------------------------------------------------------------- |
rs27 | 0:f0fbbfdca478 | 249 | // monitor Aufruf |
rs27 | 0:f0fbbfdca478 | 250 | |
rs27 | 0:f0fbbfdca478 | 251 | void monitor::time(void) |
rs27 | 0:f0fbbfdca478 | 252 | { |
rs27 | 0:f0fbbfdca478 | 253 | pc.printf("\nin timer"); |
rs27 | 0:f0fbbfdca478 | 254 | } |
rs27 | 0:f0fbbfdca478 | 255 |