Measure system

Dependencies:   EthernetNetIf mbed RF12B

Revision:
0:8d62137f7ff4
Child:
1:b26ab2467b1a
--- /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);
+}