.

Dependencies:   SDHCFileSystem mbed

Revision:
22:605c2f33b340
Parent:
21:a45a999d6da3
Child:
23:7e6a9684f647
--- a/main.cpp	Mon Dec 24 05:24:25 2012 +0000
+++ b/main.cpp	Sun Jan 27 20:14:11 2013 +0000
@@ -111,7 +111,7 @@
 char writeBuffer[maxBufLen][13];
 char c;
 volatile int writePointer = 0;
-volatile int secsIdle = canTimeout;
+volatile int secsIdle = 0;
 volatile bool canIdle = false;
 Serial pc(USBTX, USBRX);
 
@@ -171,17 +171,19 @@
 void logCan (char mtype, CANMessage canRXmsg) {
     unsigned short ts = getTimeStamp();
     unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
-    writeBuffer[writePointer][0]=mtype;
-    writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
-    writeBuffer[writePointer][2]=ts&0xff;
-    writeBuffer[writePointer][3]=canRXmsg.id&0xff;
-    writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
-    for (int i = 5; i<13; i++){
-        writeBuffer[writePointer][i]=canRXmsg.data[i-5];
-    }
-    if (++writePointer >= maxBufLen) {
-        writePointer = 0;
-        led4 = !led4;
+    if(canRXmsg.id>0) {
+        writeBuffer[writePointer][0]=mtype;
+        writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
+        writeBuffer[writePointer][2]=ts&0xff;
+        writeBuffer[writePointer][3]=canRXmsg.id&0xff;
+        writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
+        for (int i = 5; i<13; i++){
+            writeBuffer[writePointer][i]=canRXmsg.data[i-5];
+        }
+        if (++writePointer >= maxBufLen) {
+            writePointer = 0;
+            led4 = !led4;
+        }
     }
 }
 
@@ -205,7 +207,7 @@
     secsIdle=0; // reset deadman switch
     can1.read(msg1);
     if(logOpen)
-        logCan(1, msg1);
+        logCan(2, msg1);
     led1 = !led1;
 }
 
@@ -214,7 +216,7 @@
     secsIdle=0; // reset deadman switch
     can2.read(msg2);
     if(logOpen)
-        logCan(2, msg2);
+        logCan(1, msg2);
     led2 = !led2;
 }
 
@@ -225,6 +227,7 @@
     int ftime;
     char sTemp[35];
     unsigned long secs;
+    bool bit = false;
     pc.baud(460800);        // change serial interface to pc to 450800, 8N1
     can1.frequency(500000);
     can2.frequency(500000);
@@ -284,19 +287,11 @@
         strftime(sTemp, 32, "%a %m/%d/%Y %X", localtime(&seconds));
         pc.printf("%s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
     }
-    /*if (t.tm_year < 10) {//for test - delete
-        t.tm_year = 2012-1900;//delete
-        set_time(mktime(&t));//delete
-        seconds = time(NULL);//delete
-    }
-    t.tm_mon=(t.tm_mon+1)%12; //for test - delete
-    t.tm_mday=(t.tm_mday+1)%30; //for test - delete
-    set_time(mktime(&t));//delete
-    seconds = time(NULL);//delete*/
     
     while (true) {
         if(CD == 1) {
             if (!logOpen) { // Open new file if one is not already open
+                seconds = time(NULL);
                 t = *localtime(&seconds) ;
                 strftime(fileName, 32, "/sd/%m%d%H%M.alc", &t); //mmddhhmm.alc
 
@@ -340,34 +335,43 @@
                 } // if > 1/2 full, canbus has stopped, or PB1 pressed
                 if (canIdle) { // canbus idle --> sleep to save power
                     // First take advantage of the idle time to clear some room
-                    // Delete all files more than 1 month old
+                    
+                    bit = false;
                     rfile = fopen("/sd/loglog.txt", "r");
                     file = fopen("/sd/loglog.new", "w");
                     while (!feof(rfile)) {
                         fscanf(rfile,"/sd/%2d%2d%4d.alc\r\n",&fmon,&fday,&ftime);
-                        if ((fmon<t.tm_mon)&&(fday<=t.tm_mday)){
+                        //if ((fmon<t.tm_mon)&&(fday<=t.tm_mday)){ // Delete all files more than 1 month old
+                        if ((fmon < 12) || (t.tm_mon > 1)){
+                            fday = fday + fmon*31; //crude - february will store 3 extra days of data
+                        }
+                        if ((fday+14)<(t.tm_mday+t.tm_mon*31)){ // Delete all files more than ~14 days old
+                            bit=true;
                             sprintf(sTemp,"/sd/%02d%02d%04d.alc",fmon,fday,ftime);
-                            if ((remove(sTemp)==NULL))
+                            if ((remove(sTemp)==NULL)) {
                                 pc.printf("Removed file %s\n",sTemp);
+                            }
                         }else{
                             fprintf(file,"/sd/%02d%02d%04d.alc\r\n",fmon,fday,ftime);
                         }
                     }
-
                     fclose (file);
                     fclose (rfile);
-                    remove ("/sd/loglog.txt");
-                    //rename not working so do it the hard way
-                    //rename ("/sd/loglog.new","/sd/loglog.txt");
-                    rfile = fopen("/sd/loglog.new", "r");
-                    file = fopen("/sd/loglog.txt", "w");
-                    while (!feof(rfile)) {
-                        fscanf(rfile,"%s\r\n",&sTemp);
-                        fprintf(file,"%s\r\n",sTemp);
+                    if (bit) {
+                        remove ("/sd/loglog.txt");
+                        //rename not working so do it the hard way
+                        //rename ("/sd/loglog.new","/sd/loglog.txt");
+                        rfile = fopen("/sd/loglog.new", "r");
+                        file = fopen("/sd/loglog.txt", "w");
+                        while (!feof(rfile)) {
+                            fscanf(rfile,"%s\r\n",&sTemp);
+                            fprintf(file,"%s\r\n",sTemp);
+                        }
+                        fclose (file);
+                        fclose (rfile);
                     }
-                    fclose (file);
-                    fclose (rfile);
-                    remove ("/sd/loglog.new");
+                    remove ("/sd/loglog.new");                    
+                    wait(5); // wait a few seconds to ensure SDRAM is done
 
                     pc.printf("Putting uC to sleep.\n");
                     //LPC_RTC->CIIR=0x00; // block RTC interrupts
@@ -376,9 +380,12 @@
                     led3=0;
                     led4=0;
                     secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
-                    while (secsIdle>canTimeout)
+                    while (secsIdle>canTimeout) {
                         //DeepPowerDown();
                         __wfi(); // freeze CPU and wait for interrupt (from canbus)
+                    }
+                    canIdle=false;
+                    pc.printf("Waking uC.\n");
                     if (time(NULL)>(secs+1800)) {
                         logOpen = false; // Start new file if asleep for more than 30 minutes
                     } else { // insert timestamp on each wake