Monitor für das Tasterprogramm

Dependents:   19_Taster_BSW_oo 19_Taster_a

Fork of monitor by Temp27

Committer:
rs27
Date:
Sat Jul 26 07:27:20 2014 +0000
Revision:
0:f0fbbfdca478
Child:
1:19313470f629
monitor

Who changed what in which revision?

UserRevisionLine numberNew 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