Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: 19_Taster_BSW_oo 19_Taster_a
Fork of monitor by
monitor.cpp
- Committer:
- rs27
- Date:
- 2014-08-08
- Revision:
- 4:83dbae473d1f
- Parent:
- 3:254f7ffb9b32
- Child:
- 5:9c7606a0be99
File content as of revision 4:83dbae473d1f:
#include <stdarg.h>
#include <ctype.h>
#include "monitor.h"
#include "ConfigFile.h"
#include "SDFileSystem.h"
#include "FATDirHandle.h"
extern SDFileSystem sd; // definiert in main
extern Serial pc; // definiert in main
extern Serial com; // 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 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
#define COMMAND_MAX 14
#define COMMAND_LEN 7
const char command[COMMAND_MAX][COMMAND_LEN] = {"CYCLE","DATE","DEL","DIR","DROPS","DUMP","FILL","GO","HELP","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
uint8_t cr_flag;
// uint16_t status[8];
//-----------------------------------------------------------------------------
// 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;
*/
}
//-----------------------------------------------------------------------------
// destructor
void 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: 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: list(); break;
case 10: set(); break;
case 11: soll(); break;
case 12: stop(); break;
case 13: time(); break;
}
}
}
//-----------------------------------------------------------------------------
// eine Zeile aus dem Eingangsbuffer lesen
void 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 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 date(void)
{
pc.printf("\nin date");
}
//-----------------------------------------------------------------------------
// monitor Aufruf
void dump(void)
{
pc.printf("\nin dump");
}
//-----------------------------------------------------------------------------
// monitor Aufruf
void help(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 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");
}
//-----------------------------------------------------------------------------
// monitor Aufruf
void set(void)
{
int n;
char name[20], wert[20];
n = sscanf(&com_line[ComLinePtr],"%s %s",name,wert);
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 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);
switch (n)
{
case -1: pc.printf("\nAnzahl Tropfen = %d",drops);
break;
case 1:
cfg.setValue("drops", wert);
cfg.write("/sd/input.cfg");
drops = atoi(wert);
pc.printf("\nneue Anzahl der Tropfen = %d",drops);
break;
} // end switch
pc.printf("\n");
}
//-----------------------------------------------------------------------------
// monitor Aufruf go
// Wird die Heizung oder der Tropfenspender eingeschaltet.
void go(void)
{
char ch;
sscanf(&com_line[ComLinePtr],"%c",&ch);
switch (ch)
{
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;
case 'f':
case 'F':
cfg.setValue("f_flag", "1");
cfg.write("/sd/input.cfg");
f_flag = true;
com.putc('1');
pc.printf("\nTropfen freigeben");
break;
default: pc.printf("\nBefehl go kennt nur die Zeichen ?,t,T,f,F");
break;
} // end switch
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 '?':
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");
}
