Monitor für das Tasterprogramm

Dependents:   19_Taster_BSW_oo 19_Taster_a

Fork of monitor by Temp27

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");
+}
+