Dependencies:   ChaNFSSD mbed BMP085 SHT2x

Revision:
3:844fbe607dae
Parent:
2:f546aaa0e1d5
Child:
4:879b8dcfee15
--- a/main.cpp	Mon Jan 23 15:04:58 2012 +0000
+++ b/main.cpp	Sun Jan 29 14:06:48 2012 +0000
@@ -3,6 +3,11 @@
  * ソースコードそのもののライセンスは、各ソースコードのライセンスに沿って公開します。
  * 2012-1-4 Toshihisa T
  */
+
+//#define _I2C_TEST
+#define HAVE_TOGGLE_SW
+#define HAVE_MICROSD
+
 #include "mbed.h"
 #include "NMEA_parse.h"
 #include "SDFileSystem.h"
@@ -16,9 +21,6 @@
 
 using namespace libT;
 
-//#define _CO2_TEST
-//#define _I2C_TEST
-
 #define _USE_FS_NAME "sd"
 
 Serial debug(USBTX,USBRX);
@@ -36,8 +38,21 @@
 SHT2x sht25(p9,p10);
 AD7994 ad7994(p9,p10);
 TextLCD_20X4 lcd(p15, p16, p17, p18, p19, p20); // rs, e, d4-d7
+#ifdef  HAVE_TOGGLE_SW  /* { */
+DigitalIn toggleSW(p22);
+int toggleSW_scan = 0;
+int toggleSW_pre  = -1;
+#endif  /* } */
+int toggleSW_now  = 0;
+Ticker tick;
 
 SDFileSystem sd(p5, p6, p7, p8, _USE_FS_NAME);
+int avaiableSD = -1;
+unsigned short logNextCount = 0;
+FILE *csvFP = NULL;
+FILE *gpsFP = NULL;
+int logSW = 0;
+DigitalOut logled(LED3);
 
 DigitalOut myled(LED1);
 
@@ -51,35 +66,36 @@
     gps_pps_led = ((pps_count+=1) & 1) ? 1 : 0;
 }
 
-void logFile_Init()
-{
+void logFile_Init() {
     DIR *d;
     struct dirent *p;
+    unsigned short countCandidate;
+    char *endptr;
 
+    avaiableSD = 0;
     d = opendir("/" _USE_FS_NAME);
     if ( d != NULL ) {
         while ( (p = readdir(d)) != NULL ) {
             debug.printf("FILE - %s\x0d\x0a", p->d_name);
+            if (strlen(p->d_name) == (sizeof("ENVxxxxx.CSV")-1)) {
+                if (    ((p->d_name[0] == 'E') || (p->d_name[0] == 'e'))
+                        && ((p->d_name[1] == 'N') || (p->d_name[1] == 'n'))
+                        && ((p->d_name[2] == 'V') || (p->d_name[2] == 'v'))) {
+                }
+                countCandidate = (unsigned short)strtoul(&(p->d_name[3]),&endptr,10);
+                if (strcasecmp(endptr,".CSV") == 0) {
+                    if (countCandidate > logNextCount) {
+                        logNextCount = countCandidate;
+                    }
+                }
+            }
         }
         closedir(d);
+        logNextCount++;
+        avaiableSD = 1;
     }
 }
 
-void FileWriteTest()
-{
-    FILE *fp;
-    char *logname = "/" _USE_FS_NAME "/MBEDLOG.TXT";
-
-    debug.printf("FileWriteTest() open(%s) :", logname);
-    fp = fopen(logname,"a+w");
-    if(fp == NULL){
-        printf("NG\n");
-        return;
-    }
-    printf("OK\n");
-    fprintf(fp,"ENV Logger \"V1\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\x0d\x0a");
-    fclose(fp);
-}
 
 int CO2_Read(unsigned short *val)
 {
@@ -173,7 +189,66 @@
             }
         }
     }
-    return -1;
+}
+
+unsigned long tickCount = 0;
+unsigned long hzCount = 0;
+unsigned long hzCount_tmp = 0;
+unsigned long logTickCount = 0;
+void tickHandler()
+{
+    logTickCount++;
+    tickCount++;
+    hzCount_tmp++;
+    if(hzCount_tmp >= 50){
+        hzCount_tmp = 0;
+        hzCount++;
+    }
+#ifdef  HAVE_TOGGLE_SW  /* { */
+    int nowRead;
+    nowRead = toggleSW.read();
+    if(nowRead != toggleSW_pre){
+        toggleSW_pre = nowRead;
+        toggleSW_scan = 0;
+    } else {
+        toggleSW_scan++;
+        if(toggleSW_scan >= 3){
+            toggleSW_now = toggleSW_pre;
+            toggleSW_scan = 0;
+        }
+    }
+#endif
+}
+
+void logCheckProc()
+{
+    if((logSW == 0) && (toggleSW_now != 0)){
+        if(csvFP != NULL){
+            fclose(csvFP);
+            csvFP = NULL;
+            if(gpsFP != NULL){
+                fclose(gpsFP);
+                gpsFP = NULL;
+            }
+            logled = 0; /* No logging */
+            logNextCount++;
+        } else {
+            char name[64];
+            sprintf(name,"/%s/ENV%05d.CSV",_USE_FS_NAME,logNextCount);
+            csvFP = fopen(name,"w+b");
+            sprintf(name,"/%s/ENV%05d.GPS",_USE_FS_NAME,logNextCount);
+            gpsFP = fopen(name,"w+b");
+            if((csvFP != NULL) && (gpsFP != NULL)){
+                logled = 1; /* logging */
+                logTickCount = 100;
+            } else {
+                if(csvFP) fclose(csvFP);
+                if(gpsFP) fclose(gpsFP);
+                logled = 0; /* Cannot start logging */
+            }
+        }
+    }
+    logSW = toggleSW_now;
 }
 
 unsigned char wbuf[1024];
@@ -181,33 +256,53 @@
 
 int main() {
     int ret = 0;
-    float p, t;
+    float p, t1;
+    float h, t2;
     int temp;
     unsigned short CO2_val;
     unsigned long scanCount = 0;
-    FILE *fp;
-    char *logname = "/" _USE_FS_NAME "/ENVLOG.TXT";
     char c;
     unsigned long UBXCount = 0;
  
+    tick.attach_us(&tickHandler,(10*1000));
+ 
     debug.format(8,Serial::None,1);
     debug.baud(115200);
-    debug.printf("ENV Logger \"V0.5\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n");
+    debug.printf("ENV Logger \"V0.7\" Start (BUILD:[" __DATE__ "/" __TIME__ "])\n");
 
     debug.printf("LCD Display\n");
 
     //lcd.cls();
     lcd.locate(0,0);
-    lcd.printf("ENV Logger \"V0.5\"");
+    lcd.printf("ENV Logger \"V0.7\"");
 
     lcd.locate(0,1);
     lcd.printf("WAKE UP I/O...");
     wait(5.0);
  
+#ifdef HAVE_MICROSD
+    lcd.locate(0,2);
+    lcd.printf("CHECK MicroSD:");
+    logFile_Init();
+#endif
+    lcd.locate(0,2);
+    switch(avaiableSD){
+        case 0:
+            lcd.printf("CHECK MicroSD:NG");
+            break;
+        case 1:
+            lcd.printf("CHECK MicroSD:OK");
+            break;
+        default:
+            lcd.printf("CHECK MicroSD:DO\'NT USE");
+            break;
+    }
+    wait(1.0);
+ 
     //logFile_Init();
     //FileWriteTest();
 
-    lcd.locate(0,1);
+    lcd.locate(0,3);
     lcd.printf("SETTING GPS...");
 
     UBXPacket.cjobst = 0;
@@ -257,35 +352,35 @@
        }
     }
     UBXPacket.cjobst = 0;
-    lcd.locate(0,1);
+    lcd.locate(0,3);
     lcd.printf("SETTING GPS...Done.");
 
-#if 0
-    debug.printf("open(%s) :", logname);
-    if((fp = fopen(logname,"a+w")) == NULL){
-        printf("NG\n");
-    } else {
-        printf("OK\n");
-    }
-    widx = 0;
-#endif
-
 //  ad7994.Start();
 
     CO2.format(8,Serial::None,1);
     CO2.baud(9600);
     CO2.recvStart();
 
+    //Clear Screen.
+    lcd.locate(0,0); lcd.printf("%20s"," ");
+    lcd.locate(0,1); lcd.printf("%20s"," ");
+    lcd.locate(0,2); lcd.printf("%20s"," ");
+    lcd.locate(0,3); lcd.printf("%20s"," ");
+
     while(1) {
         //lcd.cls();
         //lcd.locate(0,0);
         //lcd.printf("SCAN:%-10ld",scanCount);
+        lcd.locate(0,0);
+        lcd.printf("%d ",toggleSW_now);
+
+        logCheckProc();
 
         while(gps.readable()) {
             c = gps.getc();
             if(UBXPacket_Parse(&UBXPacket,c) == 100){
                 UBXCount++;
-                lcd.locate(0,0);
+                lcd.locate(2,0);
                 lcd.printf("UBX Recv:%-10ld",UBXCount);
                 debug.printf("%ld : GET UBX Packet (Class=0x%02X,ID=0x%02X,LEN=%d)\n",
                             scanCount,
@@ -294,31 +389,31 @@
                             UBXPacket.len );
                 UBXPacket.cjobst = 0;
             }
-            //if(fp != NULL){
-            //    wbuf[widx] = c;
-            //    widx++;
-            //    if(widx >= sizeof(wbuf)){
-            //        fwrite(&wbuf,sizeof(wbuf[0]),widx,fp);
-            //        widx = 0;
-            //    }
-            //}
+            if(gpsFP != NULL){
+                wbuf[widx] = c;
+                widx++;
+                if(widx >= sizeof(wbuf)){
+                    fwrite(&wbuf,sizeof(wbuf[0]),widx,gpsFP);
+                    widx = 0;
+                }
+            }
         }
 
         if(1){
             bmp085.update();
             p = bmp085.get_pressure();
-            t = bmp085.get_temperature();
+            t1 = bmp085.get_temperature();
             lcd.locate(0,1);
-            lcd.printf("%-8.2fhPa %-6.2fC", p, t);
+            lcd.printf("%-8.2fhPa %-6.2fC", p, t1);
         }
 
         if(1){
             sht25.SHT2x_MeasurePoll(TEMP,&temp);
-            p = sht25.SHT2x_CalcTemperatureC(temp);
+            t2 = sht25.SHT2x_CalcTemperatureC(temp);
             sht25.SHT2x_MeasurePoll(HUMIDITY,&temp);
-            t = sht25.SHT2x_CalcRH(temp);
+            h = sht25.SHT2x_CalcRH(temp);
             lcd.locate(0,2);
-            lcd.printf("%-6.2fC %-6.2fRH", p, t);
+            lcd.printf("%-6.2fC %-6.2fRH", t2, h);
             //sht25.SHT2x_SoftReset();
         }
 
@@ -334,6 +429,13 @@
             lcd.printf("CO2:NG(%d)  \n",ret);
         }
 
+        if(csvFP){
+            if(logTickCount >= 100){
+                fprintf(csvFP,"%-8.2f,hPa,%-6.2f,C,%-6.2f,C,%-6.2f,RH,%5d.%1d,ppm\x0d\x0a", p, t1, t2, h,CO2_val/10,CO2_val%10);
+                logTickCount = 0;
+            }
+        }
+
 #if 0
         ad7994.update();
         lcd.locate(0,3);
@@ -341,17 +443,24 @@
                      ad7994.readChn(0),
                      ad7994.readChn(1));
 #endif
-
-        myled = 1;
-        wait(0.5);
-        myled = 0;
-        wait(0.5);
-
+        myled = (hzCount & 1);
         scanCount++;
+        wait(0.1);
     }
 }
 
 /*
+ * 2012-1-29 V0.7
+ * ログ機能の追加。スイッチを押すとログのON/OFFが出来る。
+ * ログ収集中は、mbed LED3 が点灯する。
+ */
+/*
+ * 2012-1-29 V0.6
+ * 1) スキャンカウントの変更。今までは1秒周期だったが、
+ *    100ミリ秒周期でセンサーデータを得るようにした。
+ * 2) モーメンタリSW対応。
+ */
+/*
  * 2012-1-23 V0.5
  * U-Blox,気圧センサー,温度センサー,CO2センサーの値を表示するようにした。
  * U-Blox は受信できたパケット数を表示する。