Monitor für das Tasterprogramm
Dependents: 19_Taster_BSW_oo 19_Taster_a
Fork of monitor by
Diff: monitor.cpp
- 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 mssen 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"); -} - -