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:
Tue Apr 16 03:28:55 2013 +0000
Parent:
76:fb6779d0963e
Child:
78:a383971fe02f
Child:
80:24f1793171e7
Commit message:
Fixed various bugs. Added proper overrun test.

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
--- a/main.cpp	Mon Apr 15 14:40:05 2013 +0000
+++ b/main.cpp	Tue Apr 16 03:28:55 2013 +0000
@@ -8,6 +8,7 @@
 // * Better graphical DTE display with historic efficiency information considered and displayed
 // * Add 50% charge option
 // * Tire Pressure Sensor display
+// * Fix bug in playback while connected to canbus (hangs)
 
 #include "mbed.h"
 #include "CAN.h"
@@ -49,7 +50,7 @@
 // gg - revStr is used in 2 places
 // gg - and is easy to edit here
 // gg - added ZeroSecTick and revStr
-char revStr[7] = "76"; // gg - fix rev number
+char revStr[7] = "77"; // gg - fix rev number
 
 bool logEn = false, logOpen = false; 
 bool yesBattLog = false ; // gg - Batt Log
@@ -126,15 +127,6 @@
     point lastTouch;
     float average;
 
-    can1.monitor(true); // set to snoop mode
-    can2.monitor(true); // set to snoop mode
-    can1.frequency(500000);
-    can2.frequency(500000);
-    can1SleepMode = 1;         // Turn on Monitor_only Mode
-    can2SleepMode = 1;         // Turn on Monitor_only Mode
-    can1.attach(&recieve1);
-    can2.attach(&recieve2);
-    
     tt.set_orientation(1);
     tt.background(Black);
     tt.set_display(2);       // select both displays
@@ -231,6 +223,16 @@
     // Read config file
     readConfig();
 
+    // Start monitors
+    can1.monitor(true); // set to snoop mode
+    can2.monitor(true); // set to snoop mode
+    can1.frequency(500000);
+    can2.frequency(500000);
+    can1SleepMode = 1;         // Turn on Monitor_only Mode
+    can2SleepMode = 1;         // Turn on Monitor_only Mode
+    can1.attach(&recieve1);
+    can2.attach(&recieve2);
+
     touched=false;
     secsNoTouch=2;
     while (true) {
@@ -273,12 +275,6 @@
                     spkr.beep(1000,0.25);
                     logEn=false;
                 } else {
-                    //moved overrun detection to the write code in utility.cpp
-                    //if (pointerSep>(maxBufLen*7/8)) { // Hi-water mark
-                    //    sprintf(sTemp,"Write buffer overrun.\n");
-                    //    logMsg(sTemp); // write buffer overrun
-                    //    spkr.beep(1000,0.25);
-                    //}
                     while (readPointer != writePointer) {
                         for (j = 0; j<13; j++){
                             fprintf(file,"%c",writeBuffer[readPointer][j]);
@@ -290,8 +286,11 @@
                 }
             } // if > 1/16 full, canbus has stopped, or logging stopped
             if (!logEn) {
+                sprintf(sTemp,"Stopping Can Log %s\n",fileName);
+                logMsg(sTemp); // stopping alc log file 
                 fclose(file);
                 logOpen=false;
+                pointerSep=0;
             }
         } // if logOpen
         if (canIdle&&userIdle&&!playbackEn) { // canbus idle --> sleep to save power
@@ -507,7 +506,7 @@
                             //------------------------------
                             case 11:
                                 if (dMode[whichTouched]==config1Screen){
-                                    repeatPoll = !repeatPoll&&logEn;
+                                    repeatPoll = !repeatPoll;
                                     if (repeatPoll) {
                                         autoPoll.attach(&autoPollISR,pollInt);
                                     } else {
--- a/utility.cpp	Mon Apr 15 14:40:05 2013 +0000
+++ b/utility.cpp	Tue Apr 16 03:28:55 2013 +0000
@@ -60,15 +60,15 @@
             for(i=5;i<13;i++){ // Is there a better way to do this? (writeBuffer[writePointer][i]=canRXmsg.data?)
                 writeBuffer[writePointer][i]=canRXmsg.data[i-5];
             }
+            if (++writePointer >= maxBufLen) {
+                writePointer = 0;
+                led3 = !led3;
+            }
             if (writePointer==readPointer) {
                 // Just overwrote an entry that hasn't been sent to thumbdrive
                 sprintf(sTemp,"Write buffer overrun.\n");
                 logMsg(sTemp); // write buffer overrun
-                spkr.beep(1000,0.25);
-            }
-            if (++writePointer >= maxBufLen) {
-                writePointer = 0;
-                led3 = !led3;
+                spkr.beep(500,0.25);
             }
         }
     }