Measure system
Dependencies: EthernetNetIf mbed RF12B
Diff: MeasureSystem.cpp
- Revision:
- 0:8d62137f7ff4
- Child:
- 1:b26ab2467b1a
diff -r 000000000000 -r 8d62137f7ff4 MeasureSystem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MeasureSystem.cpp Thu Mar 03 08:45:49 2011 +0000 @@ -0,0 +1,448 @@ +#define MEASURE_C + + +#include "EthernetNetIf.h" +#include "HTTPServer.h" +#include "SDFileSystem.h" +#include "TextLCD.h" +#include "DS1820.h" +#include "MeasureSystem.h" +#include "NTPClient.h" +#include "WatchDog.h" +#include "HTTPClient.h" + +//--------------Objects and vars------------------ +EthernetNetIf *eth; +HTTPServer svr; +NTPClient ntp; + +Serial pc(USBTX, USBRX); // Serial debug usb port +DigitalIn dhcpOn(p30); +DigitalOut led1(LED1, "led1"); +DigitalOut led2(LED2, "led2"); +DigitalOut led3(LED3, "led3"); +DigitalOut led4(LED4, "led4"); +LocalFileSystem local("local"); //Internal flash +SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board +TextLCD lcd(p21, p23, p24, p25, p26, p27, TextLCD::LCD20x4 ); //Char lcd +watchdog wdog(15); // WDT 15 seconds + +const int MAX_PROBES = 2; +#define LOGGER_FILE "/sd/syslog/log.txt" +#define STATUS_FILE "/local/status.dat" +#define CONFIG_FILE "/local/config.txt" +#define SOURCE_FILE "/sd/index.htm" +#define TARGET_FILE "/local/index.htm" +#define COPY_BLOCK_SIZE 2048 +DS1820* probe[MAX_PROBES]; //Temp sensors + +//------status flags----------------- +int devices_found=0; +static string wanIP; +static string localIP; +int logging; +int fileindex; +bool getIPfromDHCP; +int interval; +int ipConfig[4]; +int maskConfig[4]; +int gatewayConfig[4]; +int dnsConfig[4]; +//---------------------MAIN----------------------- +int main() { + pc.baud(921600); + HandlerActive = false; + //-----------------LCD test------------------- + printf("\r\n\r\n<----------------------------------------------->"); + printf("\r\n<System Startup>\r\n"); + lcd.cls(); + lcd.printf("LCD Init.......Done\n"); + wait(0.2); + + //----------------SD.card test---------------- + printf("<SD card init>\r\n"); + lcd.printf("SDcard Init...."); + mkdir("/sd/syslog", 0777); + FILE *fp = fopen(LOGGER_FILE, "a+"); + if (fp == NULL) { + error("Could not open file for write\r\n"); + } + else + { + fprintf(fp, "<-------------------->\r\n"); + fclose(fp); + tempstring ="SYSTEM STARTUP";LogWrite(tempstring); + } + lcd.printf("Done\n"); + + + wdog.feed(); + //----------------DS1820 init----------------- + printf("<DS1820 init>\r\n"); + lcd.printf("Init sensors."); + InitDS1820(); + lcd.printf(".Done\n"); + + wdog.feed(); + //--------------Read config.txt--------------- + LoadConfig(); + //---------------Network init----------------- + lcd.printf("Network Init..."); + printf("<Network Init>\r\n"); + /* + char mac[6]; + mbed_mac_address(mac); + for (int i=0; i<6;i++) { + printf("%02X ", mac[i]); + } + printf("\n"); + */ + if (getIPfromDHCP) { + eth = new EthernetNetIf(); + } else { + eth = new EthernetNetIf( + IpAddr(ipConfig[0],ipConfig[1],ipConfig[2],ipConfig[3]), //IP Address + IpAddr(maskConfig[0],maskConfig[1],maskConfig[2],maskConfig[3]), //Network Mask + IpAddr(gatewayConfig[0],gatewayConfig[1],gatewayConfig[2],gatewayConfig[3]), //Gateway + IpAddr(dnsConfig[0],dnsConfig[1],dnsConfig[2],dnsConfig[3]) //DNS + ); + } + EthernetErr ethErr = eth->setup(10000); + if (ethErr) { + printf("Error %d in setup.\r\n", ethErr); + lcd.printf("Error"); + } + + sprintf(buf,"%d.%d.%d.%d", + eth->getIp()[0], eth->getIp()[1], eth->getIp()[2], eth->getIp()[3]); + localIP = string(buf); + + printf("Setup OK\r\n"); + lcd.printf("Done\n"); + wdog.feed(); + + //-----------------WAN check--------------------------- + + wait(1); + printf("<WAN Connection Check>\r\n"); + lcd.cls(); + lcd.printf("Internet conn.."); + GetMyIP(); + if (wanIP!="none") { + lcd.printf("Done\n"); + printf("OK: %s\r\n",wanIP.c_str()); + + } else { + lcd.printf("Fail\n"); + printf("No connection\r\n"); + } + wdog.feed(); + //-----------------RTC INIT------------------------ + + lcd.printf("RTClock Init..."); + printf("<RTC Init>\r\n"); + + if (wanIP!="none") { + UpdateTime(); + strftime(buf,sizeof(buf), "%A %m/%d/%Y %H:%M:%S\n", localtime(&ctTime)); + printf("Time is now : %s JST\r\n", buf); + lcd.printf("Done\n"); + } else { + printf("Cannot connect NTP Server!!\r\n"); + lcd.printf("Fail\n"); + } + + wdog.feed(); + + //-------Init index.htm in local filesystem--------- + lcd.printf("Loading config."); + LoadStatus(); + IndexInit(); + lcd.printf("Done\n"); + wdog.feed(); + //-----------------Welcome message------------------ + wait(2); + lcd.cls(); + lcd.printf("Welcome to mbed. \nMeasure system.\n"); + lcd.printf("IP: %s\n",localIP.c_str()); + //--------------HTTP SERVER------------------------- + + FSHandler::mount("/local", "/"); //Mount /wwww path on web root path + FSHandler::mount("/sd", "/extern"); //Mount /wwww path on web root path + svr.addHandler<FSHandler>("/files");// this does not see the subdirectory + svr.addHandler<FSHandler>("/"); //Default handler + svr.addHandler<SimpleHandler>("/com"); //Com hander + svr.bind(80); + + printf("<INIT DONE... Server running>\r\n"); + ctTime = time(NULL); + ctTime += (clockoffset*3600); +strftime(buf,sizeof(buf), "%Y/%m/%d %H:%M:%S", localtime(&ctTime)); + tempstring =""; + tempstring += buf;LogWrite(tempstring); + tempstring ="SYSTEM READY";LogWrite(tempstring); + Timer tm; + tm.start(); + //Listen indefinitely + int counter =0; + + //-------------------MAIN LOOP-------------------- + while (true) { + Net::poll(); // Network listen + + if (tm.read()>1) { + counter = (counter++)%3600; //Timer counter loop + + led1=!led1; //Show that we are alive 1 sec timed + if (logging==1) + { + led4 =!led1; + } + else + { + led4 = 0; + } + UpdateLCD(counter); //Refress LCD + + if (wanIP=="none" & (counter%30)==0) { //If no network detected aat startup then try to connect every 30 sec + GetMyIP(); + if (wanIP!="none") { + IndexInit() ; + UpdateTime(); + } + } + + wdog.feed(); + tm.start(); + } + + } + + +} + + +//---------------------------Functions-------------------------- + +void InitDS1820() { + + int i; +// Initialize the probe array to DS1820 objects + for (i = 0; i < MAX_PROBES; i++) + probe[i] = new DS1820(p29); +// Initialize global state variables + probe[0]->search_ROM_setup(); +// Loop to find all devices on the data line + while (probe[devices_found]->search_ROM() and devices_found<MAX_PROBES-1) + devices_found++; +// If maximum number of probes are found, + // bump the counter to include the last array entry + if (probe[devices_found]->ROM[0] != 0xFF) + devices_found++; + + if (devices_found==0) + printf("No devices found"); + else { + + probe[0]->convert_temperature(DS1820::all_devices); + for (i=0; i<devices_found; i++) { + printf("%3.1f \r\n",probe[i]->temperature('c')); + } + } + + lcd.printf("%d",devices_found); +} + +//-------------------Get WAN IP adress------------------------- +void GetMyIP() { + HTTPClient http; + HTTPText txt; + HTTPResult r = http.get("http://www.whatismyip.com/automation/n09230945NL.asp", &txt); + if (r==HTTP_OK) { + wanIP = txt.gets(); + } else { + wanIP="none"; + } +} + +//-----------------Create Index HTM in local------------------- +void IndexInit() { + FILE *fs_src; + FILE *fs_tgt; + char buffer[ COPY_BLOCK_SIZE ]; + + printf( "file copier started.\r\n" ); + printf( " source:%s >>> target:%s\r\n", SOURCE_FILE, TARGET_FILE ); + + if ( NULL == (fs_src = fopen( SOURCE_FILE, "rb" )) ) { + error( "couldn't open source file" ); + } + if ( NULL == (fs_tgt = fopen( TARGET_FILE, "wb" )) ) { + error( "couldn't open target file" ); + } + + /* + while ( size = fread( s, sizeof( char ), COPY_BLOCK_SIZE, fs_src ) ) + { + fwrite( s, sizeof( char ), size, fs_tgt ); + total += size; + + led1 = (0x1 << progress_ind++ % 4); + + printf( " %d bytes copied\r", total ); + } + */ + string temp; + char token[] = "ServerAddress"; + while (fgets(buffer, COPY_BLOCK_SIZE, fs_src)) { + + temp = string(buffer); + int j=0; + for (int i=0;i<COPY_BLOCK_SIZE;i++) { + if (buffer[i]==token[j]) { + j++; + } else { + j=0; + } + + if (j==12) break; + + if (buffer[i]==0) { + break; + } + } + + if (j==12) { //Change to find string element search by char. + if (wanIP!="none") { + + temp = wanIP; + } else { + temp =localIP; + } + fprintf(fs_tgt," <param name=\"ServerAddress\" value=\"%s\">",temp.c_str()); + } else { + fprintf(fs_tgt,"%s",temp.c_str()); + } + } + + led1 = 0xF; + + fclose( fs_src ); + fclose( fs_tgt ); + + printf( "done\r\n" ); +} + +//------------Update lcd------------------------------ +bool IPshowflag = false; +void UpdateLCD(int counter) { + if (counter%4==0) { + lcd.locate(0,2); + lcd.locate(0,2); + if (wanIP!="none") { + if (IPshowflag) { + lcd.printf("IP: %s ", localIP.c_str()); + } else { + lcd.printf("IP: %s ", wanIP.c_str()); + } + IPshowflag = !IPshowflag; + } else { + //DO nothing only one ip address is shown + } + } + + if (counter%1==0) { //Every sec + lcd.locate(0,3); + ctTime = time(NULL); + ctTime += (clockoffset*3600); + strftime(buf,sizeof(buf), "%Y/%m/%d %H:%M:%S", localtime(&ctTime)); + lcd.printf("%s", buf); + } + + +} + +//----------------Update time--------------------- +void UpdateTime() { + time_t ctTime; + ctTime = time(NULL); + Host server(IpAddr(), 123, "0.hu.pool.ntp.org"); + ntp.setTime(server); + ctTime = time(NULL); + ctTime += (clockoffset*3600); //set jst time +} + +//---------------Load config---------------------- +void LoadConfig() { + FILE *fs_src; + char buffer[ 100 ]; + int linecounter = 0; + fs_src = fopen( CONFIG_FILE, "rb" ); + while (fgets(buffer, 100, fs_src)) { + linecounter++; + + switch (linecounter) { + case 2 : + sscanf(buffer,"%d.%d.%d.%d",&ipConfig[0],&ipConfig[1],&ipConfig[2],&ipConfig[3]); + break; + case 4 : + sscanf(buffer,"%d.%d.%d.%d",&maskConfig[0],&maskConfig[1],&maskConfig[2],&maskConfig[3]); + break; + case 6 : + sscanf(buffer,"%d.%d.%d.%d",&gatewayConfig[0],&gatewayConfig[1],&gatewayConfig[2],&gatewayConfig[3]); + break; + case 8 : + sscanf(buffer,"%d.%d.%d.%d",&dnsConfig[0],&dnsConfig[1],&dnsConfig[2],&dnsConfig[3]); + break; + case 10: + if (buffer[0]=='t' | buffer[0]=='T') getIPfromDHCP= true; + else getIPfromDHCP = false; + break; + case 13: + sscanf(buffer,"%d",&interval); + break; + case 15: + sscanf(buffer,"%d",&clockoffset); + break; + } + + } + + fclose( fs_src ); +} + +//---------------Load status-------------------------- +void LoadStatus() +{ + FILE *fs_src; + char buffer[ 100 ]; + int linecounter = 0; + fs_src = fopen( STATUS_FILE, "rb" ); + while (fgets(buffer, 100, fs_src)) { + linecounter++; + + switch (linecounter) { + case 1: + sscanf(buffer,"%d",&logging); + break; + case 2: + sscanf(buffer,"%d",&fileindex); + break; + } + + } + + fclose( fs_src ); + +} + + //---------------Log writer----------------------------- +void LogWrite(string stringin) +{ + FILE *fp = fopen(LOGGER_FILE, "a"); + if (fp == NULL) { + error("Could not open file for write\r\n"); + } + fprintf(fp,"%s\r\n",stringin.c_str()); + fclose(fp); +}