Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Thu Jul 04 05:27:15 2013 +0000
Branch:
Metric
Parent:
115:549410af477d
Child:
117:49883c779a74
Commit message:
Attempting to move buffer dump to ISR;

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
utility.cpp Show annotated file Show diff for this revision Revisions of this file
utility.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Thu Jul 04 00:09:28 2013 +0000
+++ b/main.cpp	Thu Jul 04 05:27:15 2013 +0000
@@ -24,7 +24,7 @@
 #include "displayModes.h"
 #include "TOUCH_TFTx2.h"
 
-char revStr[7] = "115"; // gg - revision string, max 6 characters
+char revStr[7] = "116"; // gg - revision string, max 6 characters
 
 FATFS USBdrive;
 LocalFileSystem local("local");
@@ -45,6 +45,8 @@
 DigitalOut led4(LED4);
 
 InterruptIn touchpad(p17);
+InterruptIn hwInt(p24);  // Assigning p24 as both input interrupt and
+DigitalOut swInt(p24);  // digital out to create a SW interrupt
 CAN can1(p9, p10);      // CAN1 (EV) uses pins 9 and 10 (rx, tx) and pin 8 (rs)
 DigitalOut can1SleepMode(p8);     // Use pin 8 to control the sleep mode of can2
 CAN can2(p30, p29);     // CAN2 (CAR) uses pins 30 and 29 (rx, tx) and pin 28 (rs)
@@ -110,7 +112,6 @@
 float accV = 0;
 bool playbackEn = false;
 bool playbackOpen = false;
-//float playbackInt = 0.05; //read messages every 50 ms
 float playbackInt = 0.005; //read messages every 5 ms
 bool step = false;
 char header[5];
@@ -150,15 +151,20 @@
     tt.cls();
     tt.claim(stdout);        // send stdout to the TFT display
     touchpad.rise(&touch_ISR);
+    hwInt.rise(&dumpBuffer);
     tt.wfi();               // enable interrupt on touch
     dled = 0.8; // turn on display LED 80%
-
+    swInt = 0;
     timer.start() ;
     RTC_Init(); // start the RTC Interrupts that sync the timer
     struct tm t; // pointer to a static tm structure
     NVIC_SetPriority(CAN_IRQn, 2); //set can priority just below RTC
-    NVIC_SetPriority(TIMER3_IRQn, 3); //set ticker priority just below can
-
+    NVIC_SetPriority(EINT0_IRQn, 3); //set hardware interrupt
+    NVIC_SetPriority(EINT1_IRQn, 3); //not sure which InterruptIn uses
+    NVIC_SetPriority(EINT2_IRQn, 3); //so set them all
+    NVIC_SetPriority(EINT3_IRQn, 3);
+    NVIC_SetPriority(TIMER3_IRQn, 4); //set ticker priority just below can
+   
     seconds = time(NULL);
     t = *localtime(&seconds) ;
     // is it a date before 2012 ?
@@ -176,8 +182,6 @@
     // revision
     sprintf(sTemp,"CANary firmware rev%s\n", revStr); // gg - for Logging the revision
     printMsg(sTemp); // revision
-    //sprintf(sTemp,"free clusters = %d\n", freeClusters);
-    //printMsg(sTemp); // revision
 
     secsNoMsg = 0;
 
@@ -191,11 +195,9 @@
             }
         }
         fclose(hfile);
-        sprintf(sTemp,"History Loaded.\n");
-        printMsg(sTemp); // History loaded
+        printMsg("History Loaded.\n"); // History loaded
     } else { // create initial file
-        sprintf(sTemp,"History not found.  Created.\n");
-        printMsg(sTemp); // history not found, created
+        printMsg("History not found.  Created.\n"); // history not found, created
         for(i=0;i<39;i++){
             // Pre-load with 4 mpkWh @ 40 mph
             mph[i]=40*timeConstant[i];
@@ -252,34 +254,14 @@
                 }
             }//logging enabled and USB detected
         } else { // if (logOpen)
-            pointerSep=(writePointer+maxBufLen-readPointer)%maxBufLen;
-            if (pointerSep>(maxBufLen/16)||canIdle||!logEn) {
-                // Dump buffer if > 1/16 full or canbus has stopped
-                //if (&efile == NULL) {
-                if (efr != FR_OK) {
-                    logOpen = false;
-                    sprintf(sTemp,"Failed to append log file.\n");
-                    printMsg(sTemp); // failed to append 
-                    spkr.beep(3000,0.25);
-                    spkr.beep(1500,0.25);
-                    spkr.beep(750,0.25);
-                    spkr.beep(375,0.25);
-                    logEn=false;
-                } else {
-                    while (readPointer != writePointer) {
-                        efr=f_write(&efile,&writeBuffer[readPointer][0],13,&bytesRW);
-                        if(++readPointer >= maxBufLen){
-                            readPointer=0;
-                            led4 = !led4;
-                        }
-                    }
-                }
-            } // if > 1/16 full, canbus has stopped, or logging stopped
+            if (canIdle||!logEn) {
+                swInt=1; //trigger buffer dump ISR
+            } // if canbus has stopped, or logging stopped
             if (!logEn) {
+                logOpen=false;
                 sprintf(sTemp,"Stopping Can Log %s\n",fileName);
                 printMsg(sTemp); // stopping alc log file 
                 f_close(&efile);
-                logOpen=false;
                 pointerSep=0;
                 led4=false;
             }
@@ -448,8 +430,7 @@
                                     dMode[whichTouched] = effScreen ; // GoTo EFF Screen
                                     sMode=0;
                                 } else if (dMode[whichTouched]==configScreen) {
-                                    sprintf(sTemp,"Saving config file.\n");
-                                    printMsg(sTemp); // saving config
+                                    printMsg("Saving config file.\n"); // saving config
                                     saveConfig();
                                     spkr.beep(2000,0.25);
                                 } else if (dMode[whichTouched]==playbackScreen) { // faster
@@ -520,22 +501,19 @@
                                             efr = f_open(&efile,"playback.alc",FA_READ|FA_OPEN_EXISTING);
                                             lastDMode[whichTouched]=99;//force refresh
                                             if(efr != FR_OK){
-                                                sprintf(sTemp,"Unable to open /usb/playback.alc\n");
-                                                printMsg(sTemp); // no playback.alc
+                                                printMsg("Unable to open /usb/playback.alc\n"); // no playback.alc
                                                 spkr.beep(1000,0.25);
                                             } else {
                                                 playbackOpen = true;
                                                 playbackEn=true;
                                                 playback.attach(&playbackISR,playbackInt);
-                                                sprintf(sTemp,"Starting playback\n");
-                                                printMsg(sTemp); // start playback
+                                                printMsg("Starting playback\n"); // start playback
                                                 spkr.beep(2000,0.25);
                                                 can1.attach(&doNothing);// Stop recieving CAN data
                                                 can2.attach(&doNothing);
                                             }
                                         } else {
-                                            sprintf(sTemp,"Must stop logging first\n");
-                                            printMsg(sTemp); // Must stop logging first
+                                            printMsg("Must stop logging first\n"); // Must stop logging first
                                         }
                                     } else {
                                         playback.detach();
--- a/utility.cpp	Thu Jul 04 00:09:28 2013 +0000
+++ b/utility.cpp	Thu Jul 04 05:27:15 2013 +0000
@@ -83,9 +83,6 @@
                     
                     // overlay the last message with a "Lost0002" comment
                     writeBuffer[tempWritePointer][0]=0;
-                    // leave the ts of the overlaid message
-                    //writeBuffer[tempWritePointer][1]=(ts&0xff00)>>8; // Time Stamp (2 bytes_
-                    //writeBuffer[tempWritePointer][2]=(ts&0x00ff);
                     // force the MsgID to an Event Message 
                     writeBuffer[tempWritePointer][3]=0xfe; // MsgID, low byte
                     writeBuffer[tempWritePointer][4]=0xff; // Len nibble, and MsgID high nibble
@@ -165,12 +162,11 @@
             for(i=5;i<13;i++){ // Is there a better way to do this? (writeBuffer[localWritePointer][5]=canRXmsg.data?)
                 writeBuffer[localWritePointer][i]=canRXmsg.data[i-5];
             }
-            if (writePointer==readPointer) {
-                // Just caught up to read pointer
-                sprintf(sTemp,"Write buffer overrun.\n");
-                printMsg(sTemp); // write buffer overrun
-                spkr.beep(500,0.25);
-            }
+            //if (localWritePointer==readPointer) { //Just caught up to read pointer
+            //    printMsg("Write buffer overrun.\n");
+            //    spkr.beep(500,0.125);
+            //}
+            swInt=1; // trigger buffer dump
         }
     }
 
@@ -185,8 +181,7 @@
                 // the ii array is full, more than 100 MsgIDs found
                 if(ii==99) {
                     ii++; // step to 100 to log only one error
-                    sprintf(sTemp,"MsgID buffer overrun.\n");
-                    printMsg(sTemp); // write buffer overrun
+                    printMsg("MsgID buffer overrun.\n"); // write buffer overrun
                 }
             }
         }
@@ -212,36 +207,31 @@
                 if(canRXmsg.data[3]==1){//Group 1 data
                     bdi=BatDataBaseG1; // index offset for Group 1 data (uses 20 - 22)
                     if(debugMode){
-                        sprintf(sTemp,"  Getting Group 1 data\n");
-                        printMsg(sTemp);
+                        printMsg("  Getting Group 1 data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==2){//Group 2 = cellpair data
                     bdi=BatDataBaseG2; // index offset for CP data (uses 00 - 1C)
                     if(debugMode){
-                        sprintf(sTemp,"  Getting cell pair data\n");
-                        printMsg(sTemp);
+                        printMsg("  Getting cell pair data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==3){//Group 3 data
                     bdi=BatDataBaseG3; // index offset for Group 3 data (uses 20 - 22)
                     if(debugMode){
-                        sprintf(sTemp,"  Getting Group 3 data\n");
-                        printMsg(sTemp);
+                        printMsg("  Getting Group 3 data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==4){//Group 4 = temperature data
                     bdi=BatDataBaseG4; // index offset for Temperature data (uses 20 - 22)
                     if(debugMode){
-                        sprintf(sTemp,"  Getting temperature data\n");
-                        printMsg(sTemp);
+                        printMsg("  Getting temperature data\n");
                     }
                     
                 }else if(canRXmsg.data[3]==5){//Group 5 data
                     bdi=BatDataBaseG5; // index offset for Group 5 data (uses 20 - 22)
                     if(debugMode){
-                        sprintf(sTemp,"  Getting Group 5 data\n");
-                        printMsg(sTemp);
+                        printMsg("  Getting Group 5 data\n");
                     }
                     
                 }else bdi=0xff; // ignore other messages (for now)
@@ -400,9 +390,6 @@
 }
 
 void autoPollISR(){
-    //char sTemp[40]; // just for debug
-    //sprintf(sTemp,"Requesting cp data\n"); // just for debug
-    //printMsg(sTemp); // just for debug
     reqMsgCnt = 0; //reset message counter
     msgReq.attach(&sendReq,0.015);
 }
@@ -483,13 +470,10 @@
 void readConfig(){
     FILE *cfile;
     int ff;
-    char sTemp[40];
     cfile = fopen("/local/config.txt", "r");
     if (cfile==NULL){ // if doesn't exist --> create
-        sprintf(sTemp,"No config file found.\n");
-        printMsg(sTemp); // no config file
-        sprintf(sTemp,"Calibrating touch screen.\n");
-        printMsg(sTemp); // calibrating
+        printMsg("No config file found.\n"); // no config file
+        printMsg("Calibrating touch screen.\n"); // calibrating
         //tt.setcal(5570, 34030, 80, 108, 33700, 5780, 82, 108, 32500);// bypass calibration using my values
         tt.calibrate();   // run touchscreen calibration routine
         // NOTE: calibrates screen 1 first, then screen 0.
@@ -537,11 +521,9 @@
         fclose(cfile);
         if(ff<4){//If not latest format, save as latest format
             saveConfig();
-            sprintf(sTemp,"Config file format updated.\n");
-            printMsg(sTemp); // config forat updates
+            printMsg("Config file format updated.\n"); // config forat updates
         }
-        sprintf(sTemp,"Config file loaded.\n");
-        printMsg(sTemp); // config file loaded
+        printMsg("Config file loaded.\n"); // config file loaded
     }
 }
 
@@ -813,3 +795,32 @@
     }
     return(usbEn);
 }
+
+void dumpBuffer(void){
+    int localWritePointer=writePointer;
+    //NVIC_DisableIRQ(EINT0_IRQn);
+    //NVIC_DisableIRQ(EINT1_IRQn);
+    //NVIC_DisableIRQ(EINT2_IRQn);
+    //NVIC_DisableIRQ(EINT3_IRQn);
+    while (readPointer != localWritePointer) {
+        FRESULT efr=f_write(&efile,&writeBuffer[readPointer][0],13,&bytesRW);
+        if (efr != FR_OK) {
+            logOpen = false;
+            printMsg("Failed to append log file.\n"); // failed to append 
+            spkr.beep(3000,0.25);
+            spkr.beep(1500,0.25);
+            spkr.beep(750,0.25);
+            spkr.beep(375,0.25);
+            logEn=false;
+        }
+        if(++readPointer >= maxBufLen){
+            readPointer=0;
+            led4 = !led4;
+        }
+    }
+    swInt=0;
+    //NVIC_EnableIRQ(EINT0_IRQn);
+    //NVIC_EnableIRQ(EINT1_IRQn);
+    //NVIC_EnableIRQ(EINT2_IRQn);
+    //NVIC_EnableIRQ(EINT3_IRQn);
+}
\ No newline at end of file
--- a/utility.h	Thu Jul 04 00:09:28 2013 +0000
+++ b/utility.h	Thu Jul 04 05:27:15 2013 +0000
@@ -16,6 +16,7 @@
 extern char displayLog[20][40];
 extern unsigned char displayLoc;
 extern bool touched;
+extern bool logEn;
 extern bool logOpen;
 extern bool logCP; // Turbo3
 extern bool yesBattLog ; // gg - Batt Log
@@ -27,15 +28,14 @@
 extern char indexLastMsg[0x800];
 extern unsigned char dMode[2];
 extern unsigned char msgChanged[100];
-
-//extern unsigned char battData[256]; // 
+extern FIL efile;
+extern unsigned int bytesRW;
 extern unsigned char battData[BatDataBufMax]; // BatDataBufMax
 
 extern CANMessage lastMsg[100];
 extern CAN can1,can2;
 extern unsigned int fwCount;
-extern DigitalOut can1SleepMode,can2SleepMode;
-//extern bool pollCP;
+extern DigitalOut can1SleepMode,can2SleepMode,swInt;
 extern bool tick;
 extern bool ZeroSecTick;
 extern bool headlights;
@@ -91,6 +91,7 @@
     void tripLog(); // Turbo3
     void updateFirmware(); // LM - Update firmware off USB
     bool detectUSB();
+    void dumpBuffer();
 }
 
 //LEAF OBD