monitor
Fork of mon by
Diff: mon.cpp
- Revision:
- 1:bf1028d27a23
- Parent:
- 0:401f3ae5ab50
- Child:
- 2:512482b7f8c6
--- a/mon.cpp Sat Jan 03 15:24:48 2015 +0000 +++ b/mon.cpp Fri Feb 05 14:40:00 2016 +0000 @@ -1,46 +1,29 @@ //--------------------------------------------------------------------------- // Modul...: MON.CPP -// Chip....: KL25Z +// Chip....: iox.mini // //--------------------------------------------------------------------------- // Author..: Reinhold Schäfer -// Date....: 2014.06.08 +// Date....: 2016.01.23 // http....: //www.microsps.net //--------------------------------------------------------------------------- #include <stdarg.h> #include <ctype.h> #include "mbed.h" #include "mon.h" -#include "com.h" -#include "menu.h" #include "MODSERIAL.h" -#include "SDFileSystem.h" -#include "FATDirHandle.h" -#include "FATFileSystem.h" -#include "myTextLCD.h" #include "timer0.h" +#include "rs_485.h" extern MODSERIAL pc; // definiert in main -extern SDFileSystem sd; -extern PwmOut lcd_kontrast; // definiert in main -extern timer0 down_timer; // Timer für Zeitsteuerung -extern menu menu_var; -extern TextLCD lcd; - -// Taster für die Eingabe -extern DigitalIn S1; -extern DigitalIn S2; -extern DigitalIn S3; -extern DigitalIn S4; -extern DigitalIn S5; - -Timer t; +extern timer0 down_timer; // Timer für Zeitsteuerung, definiert in main +extern rs_485 RS485_BUS; // RS385 Schnittstelle für den H-Bus, definiert in main -#define COMMAND_MAX 12 +#define COMMAND_MAX 5 #define COMMAND_LEN 7 - -const char command[COMMAND_MAX][COMMAND_LEN] = {"CLCD","DATE","DEL","DIR","DUMP","FILL","HELP","LIST","MENU","RN","SET","TIME"}; + // "DUMP","HELP","SET","TIME"}; +const char command[COMMAND_MAX][COMMAND_LEN] = {"DUMP","HELP","SEND","SET","TIME"}; //----------------------------------------------------------------------------- // constructor @@ -51,9 +34,6 @@ for (i = 0; i < MON_LINE_LEN; mon_line[i++] = 0); MonLinePtr = 0; - - tasten = 0; - tasten_old = 0; } //--------------------------------------------------------------------------- @@ -139,22 +119,15 @@ { pc.printf("\nAufruf von Funktion %d",i); - // "CLCD","DATE","DEL","DIR","DUMP","FILL","HELP","LIST","SET","TIME"}; + // "CLCD","DUMP","HELP","SET","TIME"}; switch(i) // Programmaufruf { - case 0: clcd(); break; - case 1: date(); break; - case 2: del(); break; - case 3: dir(); break; - case 4: dump(); break; - case 5: fill(); break; - case 6: help(); break; - case 7: list(); break; - case 8: read_menu(); break; - case 9: rename(); break; - case 10: set(); break; - case 11: time(); break; + case 0: dump(); break; + case 1: help(); break; + case 2: send(); break; + case 3: set(); break; + case 4: time(); break; } } } @@ -263,35 +236,8 @@ void monitor::dump(void) { pc.printf("\nin dump"); -} - -//----------------------------------------------------------------------------- -// monitor Aufruf clcd contrast lcd - -void monitor::clcd (void) -{ - int n, val; - - n = sscanf(&mon_line[MonLinePtr],"%d",&val); - - switch (n) - { - case -1: +} - pc.printf("\n bitte Wert angeben"); - pc.printf("\n Wert >> 0 bis 100"); - pc.printf("\n default Wert = 30"); - break; - - case 1: //status[pos] = val; - if (val < 0) val = 0; - if (val > 100) val = 100; - lcd_kontrast.pulsewidth_us(val); // Kontrastwert setzen - pc.printf("\n LCD Kontrast = %d",val); - break; - } // end switch - -} //----------------------------------------------------------------------------- // monitor Aufruf help @@ -299,20 +245,55 @@ { pc.printf("\n -- help ------------------------"); pc.printf("\n clcd val >> lcd Kontrast"); + pc.printf("\n send [val] [val] [val] ... >> ein Telegramm senden"); pc.printf("\n set index [val] >> Sensor auswaehlen"); pc.printf("\n time [std min sek tag monat jahr]"); 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 rn name name >> eine Datei umbenennen"); - pc.printf("\n menu testen der menu Funktion"); pc.printf("\n"); } //----------------------------------------------------------------------------- +// monitor Aufruf send +// sendet ein Telegramm über die RS485 Schnittstelle +// Die Telegramm sind hier auf 10 Zeichen begrenzt +// +void monitor::send(void) +{ + int n, pos0, pos[10]; + uint8_t data[10]; + // 0 1 2 3 4 5 6 7 8 9 + n = sscanf(&mon_line[MonLinePtr],"%x %x %x %x %x %x %x %x %x %x",&pos[0],&pos[1],&pos[2],&pos[3],&pos[4],&pos[5],&pos[6],&pos[7],&pos[8],&pos[9]); + + switch (n) + { + case -1: + case 0: + pc.printf("\nbitte Werte fuer das Telegramm eingeben"); + pc.printf("\n send ADR ZIEL LEN [DATA] "); + break; + + default: + // Telegramm zusammenstellen und ausgeben + for (int i = 0; i < 10; i++) + { + if (i <= n) + { + data[i] = (uint8_t) pos[i]; + } + else + { + data[i] = 0; + } + } + + RS485_BUS.write(data); + + break; + + } // end switch +} + +//----------------------------------------------------------------------------- // monitor Aufruf set void monitor::set(void) @@ -338,14 +319,6 @@ } //----------------------------------------------------------------------------- -// monitor Aufruf date - -void monitor::date(void) -{ - pc.printf("\nin date"); -} - -//----------------------------------------------------------------------------- // monitor Aufruf time void monitor::time(void) @@ -401,6 +374,7 @@ if (year < 2000) year = 2000; buffer[5] = (uint8_t)(year - 1900); + down_timer.Set_t((uint8_t *)buffer); strftime(buffer, 40, "%a, %d.%m.%Y %H:%M:%S", localtime(&down_timer.seconds)); @@ -409,358 +383,3 @@ } } -//----------------------------------------------------------------------------- -// monitor Aufruf dir -// -// weiter Infos siehe auch -// http://elm-chan.org/fsw/ff/00index_e.html -// -void monitor::dir(void) -{ - - long size; - float f_size; - int i, len; - - 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 - - len = strlen(p->d_name); - for (i = len; i < 16; i++) pc.printf("%c",' '); - - if (size < 1024) - { - sprintf(buffer," %ld bytes ",size); - } - else - { - if (size > 1048576) - { - f_size = size / 1048576.0; - sprintf(buffer," %0.3f MB ",f_size); - - } - else - { - f_size = size / 1024.0; - sprintf(buffer," %0.3f kB ",f_size); - } - } - - pc.printf("%s",buffer); - - len = strlen(buffer); - for (i = len; i < 16; i++) pc.printf("%c",' '); - - // fno.fdate = (WORD)(((year - 1980) * 512U) | month * 32U | mday); - // fno.ftime = (WORD)(hour * 2048U | min * 32U | sec / 2U); - - unsigned long fdate = p->fdate; - unsigned long ftime = p->ftime; - - pc.printf("%02d:",(ftime>>11)); // Stunden - pc.printf("%02d:",((ftime & 0x000007E0)>>5)); // Minuten - pc.printf("%02d ",((ftime & 0x0000001F)*2)); // Sekunden - - pc.printf("%02d.",(fdate & 0x0000001F)); // Tag - pc.printf("%02d.",((fdate & 0x000001E0)>>5)); // Monat - pc.printf("%04d ",((fdate>>9)+1980)); // Monat - - -// 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 = %0.3f GB",frs/1073741824.0); - - pc.printf("\ndone\n"); -} - -//----------------------------------------------------------------------------- -// monitor Aufruf list - -void monitor::list(void) -{ - char dname[25]; - - sscanf(&mon_line[MonLinePtr],"%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 (fgets(buffer, 64, fp)) - { - pc.printf("> %s", buffer); - } - - fclose(fp); - pc.printf("\ndone\n"); -} - -//----------------------------------------------------------------------------- -// monitor Aufruf del - -void monitor::del(void) -{ - char dname[25]; - - sscanf(&mon_line[MonLinePtr],"%s",dname); - sprintf(buffer,"/sd/%s",dname); - pc.printf("\ndelete file %s",buffer); - remove(buffer); - //int res = sd.re_name("/sd/test1","/sd/test1.txt"); - pc.printf("\ndone"); -} - -//----------------------------------------------------------------------------- -// monitor Aufruf fill - -void monitor::fill(void) -{ - char dname[25]; - int n = 20; - - sscanf(&mon_line[MonLinePtr],"%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"); -} - -//----------------------------------------------------------------------------- -// monitor Aufruf rename - -void monitor::rename(void) -{ - // char str1[20]; // neuer Dateiname - // char str2[25]; // neuer Dateiname - // char str3[20]; // alter Dateiname - // char str4[25]; // alter Dateiname - int ch; - - pc.printf("\nrename "); - sscanf(&mon_line[MonLinePtr],"%s %s",str3,str1); - sprintf(str4,"/sd/%s",str3); - pc.printf("%s ",str4); - FILE *fpold = fopen(str4, "r"); // src file - sprintf(str2,"/sd/%s",str1); - pc.printf("%s \n",str2); - FILE *fpnew = fopen(str2, "w"); // dest file - - while (1) // Copy src to dest - { - ch = fgetc(fpold); // until src EOF read. - if (ch == EOF) break; - fputc(ch, fpnew); - } - - fclose(fpnew); - fclose(fpold); - - fpnew = fopen(str2, "r"); // Reopen dest to insure - if(fpnew == NULL) // that it was created. - { - pc.printf("\nerror\n"); // Return Error. - } - else - { - fclose(fpnew); - remove(str4); // Remove original file. - pc.printf("\ndone\n"); // Return Success. - } -} - -//----------------------------------------------------------------------------- -// wird für die Abfrage der Tasten verwendet - -uint8_t monitor::taste(void) -{ - tasten_old = tasten; - - while(1) - { - if (S1 == 0) tasten |= 0x01; else tasten &= ~0x01; - if (S2 == 0) tasten |= 0x02; else tasten &= ~0x02; - if (S3 == 0) tasten |= 0x04; else tasten &= ~0x04; - if (S4 == 0) tasten |= 0x08; else tasten &= ~0x08; - if (S5 == 0) tasten |= 0x10; else tasten &= ~0x10; - - if (tasten != tasten_old) - { - break; - } - com_line(); // in dieser Schleife läuft der Buffer sonst über - } - return tasten; -} - -//----------------------------------------------------------------------------- -// monitor Aufruf menu - -void monitor::read_menu(void) -{ - uint8_t flag; - int anf, len, len_neu, end, index; - - char ch; - int n = 1, pos, a; - int wert; - - t.reset(); - t.start(); - - n = sscanf(&mon_line[MonLinePtr],"%s %s %s %s",str1,str2,str3,str4); - - if (n == 1) - { - pos = atoi(str1); - if (menu_var.getValue(pos,str2,str3,str4)) - { - pc.printf("\nmenu: %d; %s; %s; %s",pos,str2,str3,str4); - } - } - - t.stop(); - - lcd.set_lcd_flag(false); - - lcd.cls(); // LCD löschen - - wert = 555; - - //wert = atoi(str4); - sprintf(str4," %d",wert); - - end = 8; - len = strlen(str4); // drei Zeichen - anf = end - len; // position des erstes Zeichens in der Anzeige - index = len; // letzte Stelle im String - index--; // null zählt als das erste Zeichen - - while(1) - { - // Wert auf der Anzeige ausgeben und ändern - - sprintf(str4," %d",wert); - - len_neu = strlen(str4); // drei Zeichen - anf = end - len_neu; // Position bestimmen - index += (len_neu - len); - len = len_neu; - if (index < 0) index = 0; - lcd.print_LCD(str4,1,anf); - - ch = str4[index]; - - // Cursor setzen - a = lcd.address(anf + index,1); - lcd.writeCommand(a); - lcd.writeCommand(0x0F); // Curor einschalten - - pc.printf("\n[%s], anf %d, end %d, index %d",str4, anf, end, index); - - flag = taste(); - pc.printf("\ntaste %02x wert %d",flag,wert); - - switch (flag) - { - case 0x01: // left - if (index > 0) - { - index--; - } - break; - - case 0x02: // down - if( ch > '0') - { - ch--; - str4[index] = ch; - } - break; - - case 0x04: // up - if ((ch >= '0') && (ch < '9')) - { - ch++; - str4[index] = ch; - } - - if (ch == ' ') - { - ch = '1'; - str4[index] = ch; - } - - break; - - case 0x08: // rigth - if (index < len) - { - index++; - } - break; - - } // end while - - wert = atoi(str4); - if (flag == 0x10) break; - } - - // die alten Daten wieder anzeigen - lcd.writeCommand(0x0C); // Cursor ausschalten - wait_us(40); - - lcd.writeALL(); - lcd.set_lcd_flag(true); - - pc.printf("\ndone %f us\n",t.read()); // Return Success. - -}