.

Dependencies:   SDHCFileSystem mbed

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Tue Dec 04 19:49:26 2012 +0000
Parent:
8:6872945e8e91
Child:
10:663bff0a6144
Commit message:
moved dump out of RTC ISR. builds clean

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Tue Dec 04 19:06:41 2012 +0000
+++ b/main.cpp	Tue Dec 04 19:49:26 2012 +0000
@@ -91,8 +91,8 @@
 extern "C" void mbed_reset();
 
 time_t seconds ;
-DigitalIn  CD(p17); 
-DigitalIn  PB1( p20 );
+DigitalIn CD(p17); 
+DigitalIn PB1( p20 );
 SDFileSystem sd(p5, p6, p7, p8, "sd" ); // SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
 //Ticker ticker1;
 //Ticker ticker2;
@@ -109,39 +109,14 @@
 FILE *file;
 char fileName[32] = "" ;
 char writeBuffer[maxBufLen][13];
-int bufPointer = 0;
-
+int writePointer = 0;
+int secsIdle = canTimeout;
+bool canActive = false;
 Serial pc(USBTX, USBRX); // tx, rx   default settings (9600 8N1)
 
 extern "C" void RTC_IRQHandler() {
-    static int i=0;
-    static int secsIdle=0;
-    timer.reset(); // zero ms at the-seconds-tick
-    if(i==bufPointer){ // no canbus messages logges
-        if (++secsIdle>canTimeout) { // canbus idle --> sleep to save power
-            __wfi();
-        }
-    } else {
-        if (logOpen) {
-            file = fopen(fileName, "ab");
-            if (file == NULL) {
-                logOpen = false;
-                pc.printf("Failed to append log file.\n\n");
-            } else {
-                while (i != bufPointer) {
-                    for (int j = 0; j<13; j++){
-                        fprintf(file,"%c",writeBuffer[i][j]);
-                    }
-                    if(++i >= maxBufLen)
-                        i=0;
-                }
-                led3 = !led3;
-                fclose(file);
-            }
-        }
-        i=bufPointer;
-        secsIdle=0;
-    }
+    timer.reset(); // zero ms at the-seconds-tic
+    canActive=(++secsIdle<canTimeout);
     LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next
 }
 
@@ -150,7 +125,7 @@
     //LPC_RTC->CIIR=0x02; // interrupts each minute
     LPC_RTC->CIIR=0x01; // interrupts each second
     LPC_RTC->CCR = 0x01;  // Clock enable
-    NVIC_SetPriority( RTC_IRQn, 10 );
+    //NVIC_SetPriority( RTC_IRQn, 10 );
     NVIC_EnableIRQ( RTC_IRQn );
 }
 
@@ -195,44 +170,25 @@
 
 void logCan (char mtype, CANMessage canRXmsg) {
     unsigned short ts = getTimeStamp();
-    writeBuffer[bufPointer][0]=mtype;
-    writeBuffer[bufPointer][1]=ts>>8;
-    writeBuffer[bufPointer][2]=ts&0xff;
-    writeBuffer[bufPointer][3]=canRXmsg.id&0xff;
-    writeBuffer[bufPointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
+    writeBuffer[writePointer][0]=mtype;
+    writeBuffer[writePointer][1]=ts>>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[bufPointer][i]=canRXmsg.data[i-5];
+        writeBuffer[writePointer][i]=canRXmsg.data[i-5];
     }
-    if (++bufPointer >= maxBufLen) {
-        bufPointer = 0;
+    if (++writePointer >= maxBufLen) {
+        writePointer = 0;
         led4 = !led4;
     }
 }
 
-/*void send1() {
-    static char counter = 0; // use for fake data
-    can1.write(CANMessage(0x350, &counter, 1));
-    counter++;
-    can1.write(CANMessage(0x351, &counter, 1));
-    counter++;
-    can1.write(CANMessage(0x352, &counter, 1));
-    counter++;
-}
-
-void send2() {
-    static char counter = 0; // use for fake data
-    can2.write(CANMessage(0x351, &counter, 1));
-    counter++;
-    can2.write(CANMessage(0x351, &counter, 1));
-    counter++;
-    can2.write(CANMessage(0x352, &counter, 1));
-    counter++;
-}*/
-
 void recieve1() {
     CANMessage msg1;
     unsigned short msgTime=getTimeStamp();
     static int lastMsg1 = 0;
+    secsIdle=0; // reset deadman switch
     can1.read(msg1);
     if (msg1.id!=0x000) {
         if (msg1.data[0]>(lastMsg1+1)) {
@@ -250,6 +206,7 @@
     CANMessage msg2;
     unsigned short msgTime=getTimeStamp();
     static int lastMsg2 = 0;
+    secsIdle=0; // reset deadman switch
     can2.read(msg2);
     if (msg2.id!=0x000) {
         if (msg2.data[0]>(lastMsg2+1)) {
@@ -264,6 +221,7 @@
 }
 
 int main() {
+    int readPointer=0;
     pc.baud(460800);        // change serial interface to pc to 115200, 8N1
     CANMessage tsMsg;
     can1.frequency(500000);
@@ -298,6 +256,7 @@
                 mbed_reset();
             } else {
                 logOpen = true;
+                readPointer=writePointer;
                 pc.printf("\nStarting Can Log %s\n\n\n\n",fileName);
                 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
                 tsMsg.id=0xfff;
@@ -313,22 +272,43 @@
                 logCan(0,tsMsg); //write full timestamp
                 fclose(file);
             }
-            //ticker1.attach(&send1, .0052); //start sending messages
-            //ticker2.attach(&send2, .0051); //start sending messages
-            
-            while ((PB1==1)&&(CD==1)){
+
+            do {
+                if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen/2)||!canActive||(PB1==0)) {
+                    if (logOpen) {
+                        file = fopen(fileName, "ab");
+                        if (file == NULL) {
+                            logOpen = false;
+                            pc.printf("Failed to append log file.\n\n");
+                        } else {
+                            while (readPointer != writePointer) {
+                                for (int j = 0; j<13; j++){
+                                    fprintf(file,"%c",writeBuffer[readPointer][j]);
+                                }
+                                if(++readPointer >= maxBufLen)
+                                    readPointer=0;
+                            }
+                            led3 = !led3;
+                            fclose(file);
+                        }
+                    }
+                }
+                if (!canActive) { // canbus idle --> sleep to save power
+                    LPC_RTC->CIIR=0x00; // block RTC interrupts
+                    __wfi(); // freeze until can activity
+                    LPC_RTC->CIIR=0x01; // interrupts each second
+                }
                 wait(0.25); // Keep logging until button pushed or SDRAM removed
-            }
-            //ticker1.detach();
-            //ticker2.detach();
+            } while ((PB1==1)&&(CD==1)&&canActive); // keep going until button or SDram removed
+
             logOpen=false;
             pc.printf("Stopping log\n\n");
-            wait(1);
             if (CD==1)
                 readLog();
         } else {
             pc.printf("\nNo SDRAM Inserted.\n\n\n\n");
         }
         wait(1);
-    }
-}
\ No newline at end of file
+    } //while (true)
+}
+