Monitor für das Tasterprogramm

Dependents:   19_Taster_BSW_oo 19_Taster_a

Fork of monitor by Temp27

Revision:
8:99a94e782c8a
Parent:
7:f5bfddb84d63
Child:
9:7bd52cbe4782
--- a/monitor.cpp	Sun Sep 07 12:08:09 2014 +0000
+++ b/monitor.cpp	Sun May 10 17:55:42 2015 +0000
@@ -1,698 +1,656 @@
 
 #include <stdarg.h>
 #include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "mbed.h"
+#include "main.h"
 #include "monitor.h"
-#include "ConfigFile.h"
-#include "SDFileSystem.h"
-#include "FATDirHandle.h"
-#include "ventiel.h"
+#include "FreescaleIAP.h"
 
-extern SDFileSystem sd;                 // definiert in main
-extern Serial pc;                       // definiert in main
-extern Serial com;                      // definiert in main
-extern ventiel magnet;                  // definiert in main             
-extern Buffer <char> buf;               // definiert in main
-extern ConfigFile cfg;                  // definiert in main
-extern char value[BUFSIZ];              // definiert in main
-extern float soll_wert;                 // definiert in main
-extern float korr_wert;                 // definiert in main
-extern bool t_flag;                     // definiert in main
-extern bool f_flag;                     // definiert in main
-extern int drops;                       // definiert in main
-extern int tropfperiode;                // definiert in main
+extern "C" void mbed_reset();
 
-#define COMMAND_MAX    15
-#define COMMAND_LEN    7
-
-const char command[COMMAND_MAX][COMMAND_LEN] = {"CYCLE","DATE","DEL","DIR","DROPS","DUMP","FILL","GO","HELP","KORR","LIST","SET","SOLL","STOPP","TIME"};
-
-char buffer[100]; 
-
-// globale Variablen
-
-char com_line[COM_LINE_LEN];        // Aktuelle Eingabezeile 
-uint8_t ComLinePtr, ComLineTop;     // Cursor Position und Zeilenlänge
+extern MODSERIAL pc;
 
-uint8_t cr_flag;
-
-// uint16_t status[8];
+extern DigitalOut OUT1;      // nicht belegt
+extern DigitalOut OUT2;      // LED Rot
+extern DigitalOut OUT3;      // LED Grün
+extern DigitalOut OUT4;      // LED Gelb
+extern DigitalOut OUT5;      // Summer
+extern DigitalOut OUT6;      // Relais
 
-//-----------------------------------------------------------------------------
-// initialisierung
-
-void mon_init(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;
-      */
-}
+extern DigitalIn IN1;        // nicht belegt
+extern DigitalIn IN2;        // nicht belegt
+extern DigitalIn IN3;        // Signalstation, Öffner => null im Ruheezustand ?
+extern DigitalIn IN4;        // Sabotageschalter, nach Zeichnung müsste 1 der Ruhezustand sein => null ist Ruhezustand ?
+extern DigitalIn IN5;        // Notaus, Öffner gegen GND => 0 ist der Ruhezustand
+
+// test von variablen
+
+int i = 0;
+
+#define COMMAND_MAX    9
+#define COMMAND_LEN    7
+const char command[COMMAND_MAX][COMMAND_LEN] = {"DATE","DUMP","FLASH","HELP","IN","OUT","RESET","RGB","TIME"};
 
 //-----------------------------------------------------------------------------
 // destructor
 
-void parser (void)
+monitor::monitor(void)
 {
-  uint8_t i, ch, tch, top, bottom, len;
-  int8_t res;
+    uint8_t i;
+    
+    for (i = 0; i < COM_LINE_LEN; com_line[i++] = 0);
+    ComLinePtr = ComLineTop = 0;
+    cr_flag = false;        
+}
+
+//-------------------------------------------------------------------------------
+// _atoi
+//
+uint8_t monitor::_atoi(char c)
+{
+    if ((c >= '0') && (c <= '9')) return (c - '0');
+    if ((c >= 'a') && (c <= 'f')) return ((c - 'a') + 10);
+    if ((c >= 'A') && (c <= 'F')) return ((c - 'A') + 10);
+    return 0;
+}
+
+
+//-----------------------------------------------------------------------------
+// parser
 
-  // Zuerst wird der erste Buchstabe aus dem Eingabestring mit den ersten 
-  // Buchstaben aus der Befehlstabelle verglichen                         
+/*-------------------------------------------------------------------------*/
+/*                                                                         */
+/*  Synopsis    :  void parser (void)                                      */
+/*                                                                         */
+/*  Funktion    :                                                          */
+/*                                                                         */
+/*  Analysiert das Kommando und springt die entsprechende Routine aus der  */
+/*  Kommandotabelle an. Die Kommandos mssen in der Tabelle alphabetisch   */
+/*  sortiert sein. Der Index in der Kommandotabelle entspricht dem in der  */
+/*  Sprungtabelle. Die Suche nach dem Buchstaben beginnt beim Ersten mit-  */
+/*  tels der bin„ren Suche. Alle restlichen Zeichen werden durch String-   */
+/*  vergleiche nach der gleichen Methode ermittelt.                        */
+/*                                                                         */
+/*-------------------------------------------------------------------------*/
 
-  bottom = 0;                                        // untere Suchgrenze 
-  top = COMMAND_MAX;                                 // obere Suchgerenze 
-  ch = com_line[0];                            // hole erstes Suchzeichen
+void monitor::parser (char p_line[])
+{
+  char  ch, tch;
+    uint8_t i, top, bottom, len;
+  int res;
+
+    // die Eingabe in Großbuchstaben umwandeln                             
+
+  for (i = 0; !(com_line[i] == 0 || com_line[i] == ' '); i++)
+    com_line[i] = toupper (com_line[i]);
+
+  /* Zuerst wird der erste Buchstabe aus dem Eingabestring mit den ersten */
+  /* Buchstaben aus der Befehlstabelle verglichen                         */
+
+  bottom = 0;                                        /* untere Suchgrenze */
+  tch = 0;
+  top = COMMAND_MAX;                                 /* obere Suchgerenze */
+  ComLinePtr = 0;                       /* Parameterübergabe auf 0 setzen */
+  ch = p_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.
+    i = (top + bottom) >> 1;    /* suche in der Mitte des Feldes beginnen */
+    tch = (char) 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 
+    pc.printf("\nParser, Kommando nicht gefunden\n");
+    return;                              /* Kommando nicht gefunden wurde */
   }
   
-  // das erst Wort soll von den Übergabeparametern isoliert werden        
+  /* das erst Wort soll von den Übergabeparametern isoliert werden        */
   
-  for (i = 0; com_line[i] != ' ' &&  com_line[i] != 0; i++);
+  for (i = 0; p_line[i] != ' ' &&  p_line[i] != 0; i++);
   len = i;
 
   
   if (i == 0) return;
 
-  // die Übergabparameter ermitteln und in als Indexzeiger in            
-  // 'ComLinePtr' abspeichern                                            
+  /* die Übergabparameter ermitteln und in als Indexzeiger in            */
+  /* 'ComLinePtr' abspeichern                                            */
 
-  for ( ; com_line[i] == ' ' && com_line[i] != 0; i++);
+  for ( ; p_line[i] == ' ' && p_line[i] != 0; i++);
   ComLinePtr = i;
-  
-  // die binäre Suche nach den restlichen Zeichen wird hier fortgesetzt 
+
+
+   /* 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;
+    i = (top + bottom) >> 1;                 /* berechnen des Suchplatzes */
+    // pc.printf("\nVergleich [%d] com_line [%s] command [%s] Länge [%d]",i,com_line, &command[i][0],len);
+    res = strncmp(p_line, &command[i][0], len);
+    // pc.printf("\nErgebnis 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");
+    pc.printf("\nParser, Kommando nicht gefunden.\n");
   }
   else 
   {
-        pc.printf("\nAufruf von Funktion %d",i);
-        
-        switch(i)                       // Programmaufruf
-        {
-          case  0: cycle();         break;
-          case  1: date();          break;
-          case  2: del();           break;
-          case  3: dir();           break;
-          case  4: func_drops();    break;
-          case  5: dump();          break;
-          case  6: fill();          break;
-          case  7: go();            break;
-          case  8: help();          break;
-          case  9: korr();          break;
-          case 10: list();          break;
-          case 11: set();           break;
-          case 12: soll();          break;
-          case 13: stop();          break;
-          case 14: time();          break;
-        }                                   
+    // "DATE","DUMP","HELP","RESET","RGB","TIME"
+    // pc.printf("\nAufruf von Funktion %d",i);
+    switch (i)  // Programmaufruf
+    {
+            case  0:  mdate();          break;
+            case  1:  dump();           break;
+            case  2:  flash();          break;
+            case  3:  help();           break;
+            case  4:  in();             break;
+            case  5:  out();            break;
+            case  6:  soft_reset();     break;
+            case  7:  rgb();            break;
+            case  8:  mtime();          break;
+     }
+       
   }
 }
 
 
-
 //-----------------------------------------------------------------------------
 // eine Zeile aus dem Eingangsbuffer lesen 
   
-void get_line(void)
+void monitor::get_line(void)
 {
-    char ch;
-    uint8_t i;
-     
-    get_ch();
-    if (cr_flag)                            // Neue Eingabezeile  
+  // char ch;
+  uint8_t i;
+   
+  get_ch();
+  if (cr_flag)                            // Neue Eingabezeile  
+  {
+    if (com_line[0] != 0)
     {
-        if (com_line[0] != 0)
-        {
-            // uart_puts(com_line);         // zum Testen => später wird der parcer aufgerufen
-            // Zeichenkette in Großbuchstaben umwandeln
+      // uart_puts(com_line);           // zum Testen => später wird der parcer aufgerufen
+      parser(&com_line[0]);                                   // Parcer wird aufgerufen
+    }
 
-            // 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;
-    }     
+    for (i=0; i < COM_LINE_LEN; com_line[i++] = 0);
+    ComLinePtr = ComLineTop = 0;                         
+    cr_flag = 0;                                   // Parcer wird aufgerufen
+  }    
 }
 
 //-----------------------------------------------------------------------------
 // eine Zeichen aus dem Eingangsbuffer lesen 
 
-void get_ch (void)
+void monitor::get_ch (void)
 {
-    char ch;
+  char ch;
   
-    if (!buf.available()) return;               // kein Zeichen vorhanden 
+  if (!pc.readable()) return;                 // kein Zeichen vorhanden 
      
-    ch = buf.get();                             // hole das Zeichen  
+    ch = pc.getc();                             // hole das Zeichen  
     // printf("mon_line: %c %02x\n",ch,ch);     // nur zum Test
-  
+
     switch(ch) 
     {
         case '\r':     // CARRIAGE RETURN  
-            cr_flag = true;
-            break;
+                cr_flag = true;
+                break;
 
         case '\n':      // LF empfangen
-            cr_flag = true;
-            break;
+                cr_flag = true;
+                break;
 
         default:                                 // Normales Zeichen  
-            if (~iscntrl(ch)) 
-            {
-                com_line[ComLinePtr] = ch;       // Zeichen einfuegen 
-                ComLinePtr++;
-            }
-            break;
+                if (~iscntrl(ch)) 
+                {
+                    com_line[ComLinePtr] = ch;       // Zeichen einfuegen 
+                    ComLinePtr++;
+                }
+                break;
 
     }   // Ende SWITCH
-    
-    if (ComLinePtr >= 80) cr_flag = 1;           // Zeilenüberlauf ?  
+
+    if (ComLinePtr >= 80) cr_flag = 1;           // Zeilenüberlauf ?  
     
 }
 
 //-----------------------------------------------------------------------------
 // monitor Aufruf
 
-void date(void)
+void monitor::mdate(void)
 {
-  pc.printf("\nin date");
+  int day, month, year, n; 
+  
+    n = 0;
+    day = 0;
+    month = 0;
+    year = 0;
+
+    n = sscanf(&com_line[ComLinePtr],"%d %d %d",&day, &month, &year);
+
+    // seconds = time(NULL);
+
+    struct tm t, *tp;
+    time_t seconds = time(NULL);
+    tp = localtime(&seconds);
+    t = *tp;    
+    
+    switch (n)
+    {
+        case -1 :  // keine Zeichenübergabe
+        case  0 :  // keine Zeichenübergabe
+
+                        pc.printf("\ndate %02d.%02d.%04d",t.tm_mday, t.tm_mon + 1, t.tm_year + 1900);
+                        break;
+
+        case 1 :   // day
+        case 2 :   // month
+        case 3 :   // year
+                    
+                        if (day > 31) day = 31;
+                        if (day < 1) day = 1;
+
+                        if (month > 12) month = 12;
+                        if (month < 0) month = 0;
+                    
+                        if (year > 2053) year = 2053;
+                        if (year < 2013) year = 2013;
+                    
+                        // setup time structure for Wed, 11 April 2013 5:00:00
+                        // t.tm_sec = sek;          // 0-59
+                        // t.tm_min = min;          // 0-59
+                        // t.tm_hour = std;         // 0-23
+                        t.tm_mday = day;            // 1-31
+                        t.tm_mon = (month - 1);   // 0-11 >> prüfen warum 0 bis 11 ???
+                        t.tm_year = (year - 1900); // year since 1900
+
+                        // Set RTC time today
+                        set_time(mktime(&t));       
+            
+                        pc.printf("\nnew date %02d.%02d.%04d",t.tm_mday, t.tm_mon+1, t.tm_year + 1900);
+                        break;
+  }  // end while 
+
 }
 
-//-----------------------------------------------------------------------------
-// monitor Aufruf
-
-void dump(void)
+void monitor::flash()
 {
-  pc.printf("\nin dump");
+  int n, address, val;
+  uint8_t _val;
+  
+  address = 0;
+  val = 0;
+  char *p;
+  
+  n = sscanf(&com_line[ComLinePtr],"%d %d", &address, &val);
+  
+  // Abfrage der Eingabe
+  
+  if ((n == -1) || (n == 0))
+  {
+    pc.printf("\nder letzte Speicherblock wird fuer Variablen verwendet");  
+    pc.printf("\n flash adr [value]");
+    pc.printf("\n   adr     ist die Adresse im ausgewaehlten Block");
+    pc.printf("\n   value   ist der Wert der als INT abgespeichert wird"); 
+    pc.printf("\n   bei der Adresse -1 wird der flash Speicher geloescht");
+    pc.printf("\n");
+  }
+  
+  if (n == 1)
+  {
+    if (address == -1)
+    {
+      address = 0x1fc00;
+      //Erase sectors of 4096 bytes
+      pc.printf("\nflash erace");
+      erase_sector(address);
+      return;  
+    }
+    
+    address += 0x1fc00;
+    p = (char*)address;
+    pc.printf("\nflash data = %d oder 0x%02x",*p);  
+  } 
+  
+  if (n == 2)
+  {
+    address += 0x1fc00;
+    _val = (uint8_t) val;
+    if (program_flash(address, (char*)&_val, 4) != 0) {// 1 bytes 
+        pc.printf("\nData Write Error!");   
+    } else {
+        pc.printf("\nData Write Success!");  
+    }   
+  }    
 }
 
 //-----------------------------------------------------------------------------
 // monitor Aufruf
 
-void help(void)
+void monitor::dump(void)
 {
-  pc.printf("\n -- help ------------------------");
-  pc.printf("\n go [?,f,F,t,Tl] aktivieren der Heizung oder der Tropfen");
-  pc.printf("\n stop [?,f,F,t,Tl] deaktivieren der Heizung oder der Tropfen");
-  pc.printf("\n set index [val] Sensor auswaehlen");
-  pc.printf("\n soll[val] Sollwertvorgabe fuer den Temperaturfuehler");
-  pc.printf("\n korr[val] Korrekturwert fuer den Temperaturfuehler");
-  pc.printf("\n cycle [val] Zeiteinheit fuer die Messung der Tropfen");
-  pc.printf("\n drops [val] Anzahl der Tropfen pro Zeiteinheit");
-  pc.printf("\n");
-  pc.printf("\n -- files ------------------------");
-  pc.printf("\n dir  >> Dateien anzeigen");  
-  pc.printf("\n list name >> den Inhalte einer Datei anzeigen"); 
-  pc.printf("\n del name >> eine Datei loeschen"); 
-  pc.printf("\n fill name [zeilen] >> eine Datei anlegen und fuellen");        
-  pc.printf("\n");
+    char c, szBuf[17];
+    //uint16_t lOutLen;
+    unsigned int lSize, n;
+    unsigned long adr;
+
+    char *p;
+
+
+    adr = 0x1fc00; // letzter Block
+    lSize = 100;
+
+    n = sscanf((char *)&com_line[ComLinePtr],"%lx %u",&adr, &lSize);
+
+    pc.printf( "\ndump from 0x%08X for %d bytes", adr, lSize );
+
+    p   = (char *)adr;
+
+    for ( int i = 0; i < lSize; i++, p++, n++ ) 
+    {
+        if ( !(i % 16) )
+        {
+            if (i > 0) pc.printf(" %s",szBuf);
+                             
+            for (n = 0; n < 16; n++) szBuf[n] = ' ';
+            szBuf[16] = 0; // nullterminierter String
+    
+            n = 0;
+
+            pc.printf( "\r\n  0x%08X :", (unsigned int)p );
+        }
+        
+        c = *p;
+    if ((c >= 0x30) && (c <= 128))szBuf[n] = c;
+    else szBuf[n] = '.';
+        
+    pc.printf( " %02x", c ); 
+  }
+
+  pc.printf( "\r\n" );
+
+}
+
+
+//-----------------------------------------------------------------------------
+// monitor Aufruf
+
+void monitor::help(void)
+{
+    pc.printf("\n -- help ------------------------");
+    pc.printf("\n date  dd mm jjjj >> Datum abfragen / setzen");
+    pc.printf("\n dump  Speicherbereich ausgeben");
+    pc.printf("\n flash Speicherbereich letzter Block fuer Variablen");
+    pc.printf("\n in    Lesen und Anzeigen der digitalen Eingaenge");
+    pc.printf("\n out [x] [y] [t] Schalten der Ausgaenge ");
+    pc.printf("\n rgb   Testen der LED's ");
+    pc.printf("\n reset Soft Reset ausfuehren ");
+    pc.printf("\n time  hh mm ss >> Zeit abfragen / setzen");
+    pc.printf("\n");      
 }
 
 //-----------------------------------------------------------------------------
 // monitor Aufruf
 
-void set(void)
+void monitor::mtime(void)
 {
-    
-    int n;
-    char name[20], wert[20];
-
-    n = sscanf(&com_line[ComLinePtr],"%s %s",name,wert);
+    int std,min,sek, n;
     
-    switch (n)
-    {
-      case -1: pc.printf("\n list config file");
-              
-              cfg.read("/sd/input.cfg");
-              
-              pc.printf("\n Index >> Sonsor 0 bis 7");
-              pc.printf("\n wert  >> 0 = inaktiv, 1 = Rohwerte, 2 = errechneter Wert");
-              break;
-      
-      case 1: pc.printf("\n list config value");
-              
-              cfg.read("/sd/input.cfg");
-              
-              if (cfg.getValue(name, &value[0], sizeof(value))) 
-              {
-                pc.printf("\n'%s'='%s'", name, value);
-              }
-              break;
-              
-      case 2: pc.printf("\n'%s' = '%s'",name,wert);
-               
-              cfg.setValue(name, wert);
-              cfg.write("/sd/input.cfg");
-              
-              break;
-     } // end switch
-    pc.printf("\n");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf soll
-// mit diesem Befehl wird der Sollwert für den Temperaturfühler vorgegeben
-
-void soll(void)
-{
-    
-    int n;
-    char wert[20];
-
-    n = sscanf(&com_line[ComLinePtr],"%s",wert);
-    
-    switch (n)
-    {
-      case -1:  pc.printf("\nSollwert = %f",soll_wert);
-                break;
-        
-      case 1:   
-               
-                cfg.setValue("soll", wert);
-                cfg.write("/sd/input.cfg");
-                
-                soll_wert = atof(wert);
-                
-                pc.printf("\nneuer Sollwert = %f",soll_wert);
-                
-                break;
-                
-     } // end switch
-    pc.printf("\n");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf korr
-// mit diesem Befehl wird der Sollwert für den Temperaturfühler vorgegeben
+    std = 0;
+    min = 0;
+    sek = 0;
 
-void korr(void)
-{
-    
-    int n;
-    char wert[20];
-
-    n = sscanf(&com_line[ComLinePtr],"%s",wert);
+    n = sscanf(&com_line[ComLinePtr],"%d %d %d",&std, &min, &sek);
     
-    switch (n)
-    {
-      case -1:  pc.printf("\nKorrekturwert = %f",korr_wert);
-                break;
-        
-      case 1:   
-               
-                cfg.setValue("korr", wert);
-                cfg.write("/sd/input.cfg");
-                
-                korr_wert = atof(wert);
-                
-                pc.printf("\nneuer Korrekturwert = %f",korr_wert);
-                
-                break;
-                
-     } // end switch
-    pc.printf("\n");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf cycle
-// mit diesem Befehl wird die Zeit in Sekunden vorgegeben, in der die Tropfenzahl
-// ausgewertet wird
-
-void cycle(void)
-{
-    int n;
-    char wert[20];
-
-    n = sscanf(&com_line[ComLinePtr],"%s",wert);
-    
-    switch (n)
-    {
-      case -1:  pc.printf("\nZeit der Messung = %d Sekunden",tropfperiode);
-                break;
-        
-      case 1:   
-               
-                cfg.setValue("cycle", wert);
-                cfg.write("/sd/input.cfg");
-                
-                tropfperiode = atoi(wert);
-                
-                pc.printf("\nneue Zeit der Messung = %d Sekunden",tropfperiode);
-                
-                break;
-                
-     } // end switch
-     
-     pc.printf("\n");
-}
-
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf drops
-// mit diesem Befehl wird die Anzahl der Tropfen pro Zeiteinheit vorgegeben
-
-void func_drops(void)
-{
-    
-    int n;
-    char wert[20];
-
-    n = sscanf(&com_line[ComLinePtr],"%s",wert);
+    struct tm t, *tp;
+    time_t seconds = time(NULL);
+    tp = localtime(&seconds);
+    t = *tp;    
     
     switch (n)
     {
-      case -1:  pc.printf("\nAnzahl Tropfen = %d",drops);
+        case -1 :  // keine Zeichenübergabe
+        case  0 :  // keine Zeichenübergabe
+
+                pc.printf("\ntime %02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
                 break;
-        
-      case 1:   
-                cfg.setValue("drops", wert);
-                cfg.write("/sd/input.cfg");
+            
+        case 1 :   // std
+        case 2 :   // min
+        case 3 :   // sek
+                    
+    
+                if (sek > 59) sek = 59;
+                if (sek < 0) sek = 0;
+
+                if (min > 59) min = 59;
+                if (min < 0) min = 0;
                 
-                drops = atoi(wert);
-                
-                pc.printf("\nneue Anzahl der Tropfen = %d",drops);
-                
-                break;
+                if (std > 23) std = 23;
+                if (std < 0) std = 0;
                 
-     } // end switch
-    pc.printf("\n");
+              // setup time structure for Wed, 11 April 2013 5:00:00
+                t.tm_sec = sek;    // 0-59
+                t.tm_min = min;    // 0-59
+                t.tm_hour = std;   // 0-23
+                // t.tm_mday = 23;   // 1-31
+                // t.tm_mon = 6;     // 0-11
+                // t.tm_year = 113;  // year since 1900
+    
+                // Set RTC time today
+                set_time(mktime(&t));
+        
+                pc.printf("\nnew time %02d:%02d:%02d", t.tm_hour, t.tm_min, t.tm_sec);
+                break;
+  }
 }
-//-----------------------------------------------------------------------------
-// monitor Aufruf go
-// Wird die Heizung oder der Tropfenspender eingeschaltet.
+
+//------------------------------------------------------------------------
+// ein RESET ausführen
+
+void monitor::soft_reset(void)
+{
+    pc.printf("\nauf WDT Reset warten");
+    // mbed_reset();
+    while(1);           // auf watchdog warten
+}
+
+//------------------------------------------------------------------------
+// die LED's testen
+//
+// DigitalOut OUT2;      // LED Rot
+// DigitalOut OUT3;      // LED Grün
+// DigitalOut OUT4;      // LED Gelb
+//
 
-void go(void)
+void monitor::rgb(void)
 {
-    char ch;
+  bool out2, out3, out4;
+  
+  pc.printf("\nLED TEST");
+  out2 = OUT2;
+  out3 = OUT3;
+  out4 = OUT4;
+  
+  OUT2 = LED_AUS;
+  OUT3 = LED_EIN;
+  OUT4 = LED_AUS;
+  
+  pc.printf("\n gruene LED an");
+  wait(1);
 
-    sscanf(&com_line[ComLinePtr],"%c",&ch);
-    
-    switch (ch)
-    {
+  OUT2 = LED_AUS;
+  OUT3 = LED_AUS;
+  OUT4 = LED_EIN;
+  
+  pc.printf("\n gelbe LED an");
+  wait(1);
+  
+  OUT2 = LED_EIN;
+  OUT3 = LED_AUS;
+  OUT4 = LED_AUS;
+  
+  pc.printf("\n rote LED an");
+  wait(1);
+  
+  OUT2 = out2;
+  OUT3 = out3;
+  OUT4 = out4;
+      
+}
+
+//------------------------------------------------------------------------
+// die Ausgänge 1 bis 5 ansteuern ( für eine Sekunge aktiv schalten
+//
+// DigitalOut OUT1;      // nicht belegt    lo aktiv
+// DigitalOut OUT2;      // LED Rot         lo aktiv
+// DigitalOut OUT3;      // LED Grün        lo aktiv
+// DigitalOut OUT4;      // LED Gelb        lo aktiv
+// DigitalOut OUT5;      // Summer          hi aktiv
+// DigitalOut OUT6;      // Relais          lo aktiv
+// 
+
 
-      case '1': magnet.set(0); break;
-      case '2': magnet.set(1); break;
-      case '3': magnet.set(2); break;
-      case '4': magnet.set(3); break;
-      case '5': magnet.set(4); break;
-      case '6': magnet.set(5); break;
-      case '7': magnet.set(6); break;
-      case '8': magnet.set(7); break;
-      case '9': magnet.set(8); break;
-          
-      case '?':
-                if (t_flag) pc.printf("Temperatur aktiv");
-                else        pc.printf("Temperatur inaktiv");
-                
-                if (f_flag) pc.printf("Tropfen freigeschaltet");
-                else        pc.printf("Tropfen gesperrt");                
-                
-                break;  
-      case 't':   
-      case 'T':         
-                cfg.setValue("t_flag", "1");
-                cfg.write("/sd/input.cfg");
-                
-                t_flag = true;
-                pc.printf("\nTemperatursteuerung ist aktiv");
-                
-                break;
+void monitor::out(void)
+{
+  int n, x, y;
+  bool out;
+  float w_zeit;
+  
+  x = 1;
+  y = 0;
+  w_zeit = 10;
+  
+  n = sscanf(&com_line[ComLinePtr],"%d %d %f", &x, &y, &w_zeit);
+  
+  // Abfrage der Eingabe
+  
+  if ((n == -1) || (n == 0))
+  {
+    pc.printf("\ntest der digitalen Ausgaenge");  
+    pc.printf("\n out x y t");
+    pc.printf("\n     x ist die Nummer des Ausgangs 1 bis 5");
+    pc.printf("\n     y ist der Schaltzustand 0 oder 1"); 
+    pc.printf("\n     t ist die Zeit in Sekunden 0 bis 1000"); 
+    pc.printf("\n");
+    pc.printf("\n Ausgang 1 (nicht belegt) = %d",(uint8_t)OUT1);
+    pc.printf("\n Ausgang 2 (LED rot     ) = %d",(uint8_t)OUT2);
+    pc.printf("\n Ausgang 3 (LED gruen   ) = %d",(uint8_t)OUT3);
+    pc.printf("\n Ausgang 4 (LED gelb    ) = %d",(uint8_t)OUT4);
+    pc.printf("\n Ausgang 5 (Summer      ) = %d",(uint8_t)OUT5);
+    pc.printf("\n Ausgang 6 (Relais      ) = %d",(uint8_t)OUT6);
+  }  
+
+  // Auswerten auf gültige Eingaben
+  if (!((x > 0) && (x <=6)))
+  {
+      pc.printf("\nFuer x bitte nur Werte von 1 bis 6 eingeben   [x = %d]\n",x);
+      return;
+  } 
+    
+
+  if (!((y == 0) || (y == 1)))
+  {
+      pc.printf("\nFuer y bitte nur Werte von 0 oder 1 eingeben   [y = %d]",y);
+      return; 
+  } 
+
+      
+  if ((w_zeit <= 0) || (w_zeit > 1000))
+  {
+      pc.printf("\nFuer w_zeit bitte nur Werte von 0 oder 1000 eingeben   [w_zeit = %f]",w_zeit);
+      return;       
+  }
+  
+  // Ausgänge schalten
  
-      case 'f':   
-      case 'F':         
-                cfg.setValue("f_flag", "1");
-                cfg.write("/sd/input.cfg");
-                
-                f_flag = true;
-                //com.putc('1');
-                magnet.set(0);
-                pc.printf("\nTropfen freigeben");
-                
-                break;
-                      
-       default: pc.printf("\nBefehl go kennt nur die Zeichen ?,t,T,f,F");
-                break;
-                               
-     } // end switch
+  switch(x)
+  {
+    case 1:
+            pc.printf("\n OOU1 auf %d schalten, Wartezeit %0.1f",y,w_zeit);
+            out = OUT1;
+            OUT1 = (bool)y;
+            wait(w_zeit);
+            OUT1 = out;
+            break;
+    case 2:
+            pc.printf("\n OOU2 auf %d schalten, Wartezeit %0.1f",y,w_zeit);
+            out = OUT2;
+            OUT2 = (bool)y;
+            wait(w_zeit);
+            OUT2 = out;            
+            break;    
+    case 3:
+            pc.printf("\n OOU3 auf %d schalten, Wartezeit %0.1f",y,w_zeit);
+            out = OUT3;
+            OUT3 = (bool)y;
+            wait(w_zeit);
+            OUT3 = out; 
+            break;    
+    case 4:
+            pc.printf("\n OOU4 auf %d schalten, Wartezeit %0.1f",y,w_zeit);
+            out = OUT4;
+            OUT4 = (bool)y;
+            wait(w_zeit);
+            OUT4 = out;
+            break;    
+    case 5:
+            pc.printf("\n OOU5 auf %d schalten, Wartezeit %0.1f",y,w_zeit);
+            out = OUT5;
+            OUT5 = (bool)y;
+            wait(w_zeit);
+            OUT5 = out;            
+            break;    
+    case 6:   
+            pc.printf("\n Relais auf %d schalten, Wartezeit %0.1f",y,w_zeit);
+            out = OUT6;
+            OUT6 = (bool)y;
+            wait(w_zeit);
+            OUT6 = out;            
+            break;      
+  } // end switch        
+
+
+  pc.printf("\n done \n");
+      
+}
+
+//------------------------------------------------------------------------
+// Lesen und Anzeigen der Eingänge
+// 
+//  DigitalIn IN1;        // nicht belegt
+//  DigitalIn IN2;        // nicht belegt
+//  DigitalIn IN3;        // Signalstation, Öffner => null im Ruheezustand ?
+//  DigitalIn IN4;        // Sabotageschalter, nach Zeichnung müsste 1 der Ruhezustand sein => null ist Ruhezustand ?
+//  DigitalIn IN5;        // Notaus, Öffner gegen GND => 0 ist der Ruhezustand
+//
+
+void monitor::in(void)
+{
+    pc.printf("\nLesen und Anzeigen der digitalen Eingaenge");  
+    pc.printf("\n");
+    pc.printf("\n Eingang 1 (nicht belegt     ) = %d Schaltpegel 24V    offener Eingang  = 0",(uint8_t)IN1);    
+    pc.printf("\n Eingang 2 (nicht belegt     ) = %d Schaltpegel 24V    offener Eingang  = 0",(uint8_t)IN2);
+    pc.printf("\n Eingang 3 (Signalstation    ) = %d Schaltpegel 24V    offener Eingang  = 0",(uint8_t)IN3);
+    pc.printf("\n Eingang 4 (Sabotageschalter ) = %d schaltet gegen GND offener Eingang  = 1",(uint8_t)IN4);
+    pc.printf("\n Eingang 5 (Notaus           ) = %d schaltet gegen GND offener Eingang  = 1",(uint8_t)IN5);
     pc.printf("\n");
 }
 
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf stop
-// Wird die Heizung oder der Tropfenspender ausgeschaltet.
-
-void stop(void)
-{
-    char ch;
-
-    sscanf(&com_line[ComLinePtr],"%c",&ch);
-    
-    switch (ch)
-    {
-
-      case '1': magnet.reset(0); break;
-      case '2': magnet.reset(1); break;
-      case '3': magnet.reset(2); break;
-      case '4': magnet.reset(3); break;
-      case '5': magnet.reset(4); break;
-      case '6': magnet.reset(5); break;
-      case '7': magnet.reset(6); break;
-      case '8': magnet.reset(7); break;
-      case '9': magnet.reset(8); break;
-      
-      case '?':
-                if (t_flag) pc.printf("Temperatur aktiviert");
-                else        pc.printf("Temperatur deaktiviert");
-                
-                if (f_flag) pc.printf("Tropfen freigeschaltet");
-                else        pc.printf("Tropfen gesperrt");                
-                
-                break;  
-      case 't':   
-      case 'T':         
-                cfg.setValue("t_flag", "0");
-                cfg.write("/sd/input.cfg");
-                
-                t_flag = false;
-                pc.printf("\nTemperatursteuerung ist deaktiviert");
-                
-                break;
- 
-      case 'f':   
-      case 'F':         
-                cfg.setValue("f_flag", "0");
-                cfg.write("/sd/input.cfg");
-                
-                f_flag = false;
-                com.putc('9');
-                pc.printf("\nTropfen gesperrt");
-                
-                break;
-                      
-       default:  
-                pc.printf("\nBefehl stop kennt nur die Zeichen ?,t,T,f,F '%c' %x", ch, ch);
-                break;
-                               
-     } // end switch
-     
-     pc.printf("\n");
-}
-//-----------------------------------------------------------------------------
-// monitor Aufruf
-
-void time(void)
-{
-  pc.printf("\nin timer");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf dir
-//
-// weiter Infos siehe auch
-// http://elm-chan.org/fsw/ff/00index_e.html
-//
-void dir(void)
-{
-    long size;
-
-    DIR *d;
-    struct dirent *p;
-
-    d = opendir("/sd");
-    if (d != NULL) 
-    {
-        while ((p = readdir(d)) != NULL) 
-        {
-            sprintf(buffer,"/sd/%s",p->d_name);
-            pc.printf("\n %s", p->d_name);
-            FILE * f = fopen(buffer, "r");
-            fseek(f, 0, SEEK_END); // seek to end of file
-            size = ftell(f);       // get current file pointer
-            pc.printf("    %ld bytes ",size);            
-
-            time_t fattime = get_fattime();
-            strftime(buffer, 40, "%a,%d %m %Y.%H:%M:%S", localtime(&fattime));
-            pc.printf(" %s ", buffer);
-
-            fclose(f);
-        }
-        
-    }
-    else 
-    {
-        pc.printf("\nCould not open directory!\n");
-    }
-    closedir(d);
-    
- 
-    FATFS* fs;
-    DWORD fre_clust;
-    f_getfree("0:",&fre_clust,&fs);
-    const float frs = float(fs->csize)*float(fs->free_clust)
-    #if _MAX_SS != 512
-        *(fs->ssize);
-    #else
-        *512;
-    #endif
-    pc.printf("\n\nfree space = %f GB",frs/1073741824.0);
-
-    pc.printf("\ndone\n");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf list
-
-void list(void)
-{
-    char dname[25];
-    int ch;
-      
-    sscanf(&com_line[ComLinePtr],"%s",dname);
-    sprintf(buffer,"/sd/%s",dname);
-    pc.printf("\nlist, file %s \n",buffer);
-    FILE * fp = fopen(buffer, "r");
-    if(fp == NULL) 
-    {
-        pc.printf("\nCould not open file for read\n\r");
-        return;
-    }
-    
-    // mit fgets werden die Zeile einzeln gelesen, wenn die Länge < 64 Zeichen ist
-
-    while (1)                     // list src to pc  
-    {
-        ch = fgetc(fp);           // until src EOF read. 
-        if (ch == EOF) break;
-        pc.putc(ch);  
-    }
-    
-    fclose(fp);
-            
-    pc.printf("\ndone\n");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf del
-
-void del(void)
-{
-    char dname[25];
-    char buffer[40];
-    
-    sscanf(&com_line[ComLinePtr],"%s",dname);
-    sprintf(buffer,"/sd/%s",dname);
-    pc.printf("\ndelete file %s",buffer);
-    remove(buffer);
-    pc.printf("\ndone");
-}
-
-//-----------------------------------------------------------------------------
-// monitor Aufruf fill
-
-void fill(void)
-{
-    char dname[25];
-    char buffer[40];
-    int n = 20;
-    
-    sscanf(&com_line[ComLinePtr],"%s %d",dname,&n);
-    sprintf(buffer,"/sd/%s",dname);
-    pc.printf("\nfill file %s \n",buffer);
-    FILE *fp = fopen(buffer, "w");
-    if(fp == NULL) 
-    {
-        pc.printf("Could not open file for write\n");
-    }
-    for (int i = 0; i<n; i++)
-    {
-        fprintf(fp, "\nschreibe eine Zeile %d ",i);
-    }
-    fclose(fp); 
-    pc.printf("\ndone\n");
-}
-
-