monitor
Dependents: 09_PT1000 10_PT1000 11_PT1000
monitor.cpp
- Committer:
- rs27
- Date:
- 2014-07-28
- Revision:
- 1:19313470f629
- Parent:
- 0:f0fbbfdca478
File content as of revision 1:19313470f629:
#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 Buffer <char> buf; // definiert in main
extern ConfigFile cfg; // definiert in main
extern char value[BUFSIZ]; // definiert in main
#define COMMAND_MAX 9
#define COMMAND_LEN 7
const char command[COMMAND_MAX][COMMAND_LEN] = {"DATE","DEL","DIR","DUMP","FILL","HELP","LIST","SET","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: date(); break;
case 1: del(); break;
case 2: dir(); break;
case 3: dump(); break;
case 4: fill(); break;
case 5: help(); break;
case 6: list(); break;
case 7: set(); break;
case 8: 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 set index [val] Sensor auswaehlen");
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
}
//-----------------------------------------------------------------------------
// 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");
}