Attempts to merge SPI_TFT2 & SPI_TFT_ILI9341

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 mbed

Fork of CANary by Tick Tock

Files at this revision

API Documentation at this revision

Comitter:
TickTock
Date:
Wed May 01 03:02:59 2013 +0000
Parent:
92:935adef49ea4
Child:
94:c3a14b3975d6
Commit message:
Merged in tested logCan reentry fix

Changed in this revision

displayModes.cpp Show annotated file Show diff for this revision Revisions of this file
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/displayModes.cpp	Mon Apr 22 02:27:37 2013 +0000
+++ b/displayModes.cpp	Wed May 01 03:02:59 2013 +0000
@@ -865,8 +865,16 @@
         tt.set_font((unsigned char*) SCProSB31x55);
         tt.foreground(Green);
         if (showMiles){
+            float miles = mpkWh[dtePeriod]*((float)(gids-5)*.075);
             tt.locate(160,8);
-            printf("%4.1f \n",mpkWh[dtePeriod]*((float)(gids-5)*.075));
+            // Right justify
+            if (miles>99.9){
+                printf("%4.1f \n",miles);
+            } else if (miles>9.9){
+                printf(" %3.1f \n",miles);
+            } else {
+                printf("  %2.1f \n",miles);
+            }
         } else {
             tt.locate(180,10);
             printf("%3.1f \n",mpkWh[dtePeriod]);
--- a/main.cpp	Mon Apr 22 02:27:37 2013 +0000
+++ b/main.cpp	Wed May 01 03:02:59 2013 +0000
@@ -51,7 +51,7 @@
 // gg - revStr is used in 2 places
 // gg - and is easy to edit here
 // gg - added ZeroSecTick and revStr
-char revStr[7] = "92";
+char revStr[7] = "93";
 
 bool debugMode = false;
 bool logEn = false, logOpen = false; 
@@ -145,8 +145,8 @@
     timer.start() ;
     RTC_Init(); // start the RTC Interrupts that sync the timer
     struct tm t; // pointer to a static tm structure
-    NVIC_SetPriority(TIMER3_IRQn, 1); //set ticker priority
-    NVIC_SetPriority(CAN_IRQn, 2); //higher than can (so RTC sync works)
+    NVIC_SetPriority(CAN_IRQn, 2); //set can priority just below RTC
+    NVIC_SetPriority(TIMER3_IRQn, 3); //set ticker priority just below can
 
     seconds = time(NULL);
     t = *localtime(&seconds) ;
@@ -160,11 +160,11 @@
     }
     t = *localtime(&seconds) ;
     strftime(sTemp, 32, "%a %m/%d/%Y %X\n", &t);
-    logMsg(sTemp); // record RTC
+    printMsg(sTemp); // record RTC
     
     // revision
     sprintf(sTemp,"CANary firmware rev%s\n", revStr); // gg - for Logging the revision
-    logMsg(sTemp); // revision
+    printMsg(sTemp); // revision
 
     // Look for new binary on thumbdrive
     // Can't make this work right now since USB doesn't attach the right timestamp (so new binary isn't loaded)
@@ -172,11 +172,11 @@
     lastDMode[whichTouched]=99;//force refresh
     if (cfile!=NULL){ //found a new binary on the thumbdrive so copy it over
         sprintf(sTemp,"New binary found.\n");
-        logMsg(sTemp); // new binary
+        printMsg(sTemp); // new binary
         file = fopen("/local/CANary.bin", "wb");
         if (file==NULL){ //failed to open destination
             sprintf(sTemp,"Unable to open destination file.\n");
-            logMsg(sTemp); // cannot open CANary.bin
+            printMsg(sTemp); // cannot open CANary.bin
         } else {
             tt.set_display(2);
             tt.foreground(White);
@@ -214,10 +214,10 @@
         }
         fclose(cfile);
         sprintf(sTemp,"History Loaded.\n");
-        logMsg(sTemp); // History loaded
+        printMsg(sTemp); // History loaded
     } else { // create initial file
         sprintf(sTemp,"History not found.  Created.\n");
-        logMsg(sTemp); // history not found, created
+        printMsg(sTemp); // history not found, created
         for(i=0;i<39;i++){
             // Pre-load with 4 mpkWh @ 40 mph
             mph[i]=40*timeConstant[i];
@@ -251,24 +251,24 @@
                 t = *localtime(&seconds) ;
                 strftime(fileName, 32, "/usb/%m%d%H%M.alc", &t); //mmddhhmm.alc
                 //sprintf(sTemp,"Using file %s\n",fileName);
-                //logMsg(sTemp); // using alc file ...
+                //printMsg(sTemp); // using alc file ...
                 file = fopen(fileName, "ab");
                 lastDMode[whichTouched]=99;//force refresh
                 if(file==NULL){
                     sprintf(sTemp,"\nUnable to open %s\n\n\n\n",fileName);
-                    logMsg(sTemp); // cannot open alc file
+                    printMsg(sTemp); // cannot open alc file
                     logEn=false;
                     spkr.beep(1000,0.25);
                 } else {
                     logOpen = true;
                     readPointer=writePointer;
                     sprintf(sTemp,"Starting Can Log %s\n",fileName);
-                    logMsg(sTemp); // starting alc log file 
+                    printMsg(sTemp); // starting alc log file 
                     
                     logTS(); // Date Time at start
-                    logErrMsg("Starting"); // Log startup msg for testing
+                    logEvent("Starting"); // Log startup msg for testing
                     sprintf(sTemp,"Cr%s",revStr);
-                    logErrMsg(sTemp); // gg - log firmware version
+                    logEvent(sTemp); // gg - log firmware version
                     
                     spkr.beep(2000,0.25);
                 }
@@ -280,7 +280,7 @@
                 if (file == NULL) {
                     logOpen = false;
                     sprintf(sTemp,"Failed to append log file.\n");
-                    logMsg(sTemp); // failed to append 
+                    printMsg(sTemp); // failed to append 
                     spkr.beep(1000,0.25);
                     logEn=false;
                 } else {
@@ -297,7 +297,7 @@
             } // 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 
+                printMsg(sTemp); // stopping alc log file 
                 fclose(file);
                 logOpen=false;
                 pointerSep=0;
@@ -310,7 +310,7 @@
             seconds = time(NULL);
             t = *localtime(&seconds) ;
             strftime(sTemp, 40, "Sleeping: %a %m/%d/%Y %X\n", &t);
-            logMsg(sTemp); // sleeping date time
+            printMsg(sTemp); // sleeping date time
             updateDisplay(0); //Added for turbo3 who has a display override and wants to see the sleep message before going to sleep
             updateDisplay(1);
             //LPC_RTC->CIIR=0x00; // block RTC interrupts
@@ -333,13 +333,13 @@
             seconds = time(NULL);
             t = *localtime(&seconds) ;
             strftime(sTemp, 40, "Waking: %a %m/%d/%Y %X\n", &t);
-            logMsg(sTemp); // wakeup date time
+            printMsg(sTemp); // wakeup date time
             if (time(NULL)>(secs+1800)) {
                 logOpen = false; // Start new file if asleep for more than 30 minutes
                 if (secsNoTouch>100) secsNoTouch = 100; // also mostly reset user Idle counter
             } else if (logOpen){ // insert timestamp on each wake if logging enabled (disabled for now)
                 file = fopen(fileName, "ab");
-                logErrMsg("WakingUp"); // gg - use messeges
+                logEvent("WakingUp"); // gg - use messeges
                 logTS(); // Date-Time at wakeup
             }
         } // if idle
@@ -366,7 +366,7 @@
                 sMode = 1;
             }
             //sprintf(sTemp,"%d,%d ",lastTouch.x,lastTouch.y);
-            //logMsg(sTemp); // touch x,y - for debug
+            //printMsg(sTemp); // touch x,y - for debug
             touched = false; // clear interrupt flag
         }
         //---------------
@@ -380,7 +380,7 @@
                 secsNoTouch +=2; // increment to prevent double touch
                 sMode = 1;
                 //sprintf(sTemp,"button %d %d,%d %d\n",i,buttonX(lastTouch.x,3),buttonY(lastTouch.y,3),lastTouch.x);
-                //logMsg(sTemp); // button parms - for debug
+                //printMsg(sTemp); // button parms - for debug
                 switch (sMode) {
                     case 0: // no select
                         break;
@@ -457,7 +457,7 @@
                                     sMode=0;
                                 } else if (dMode[whichTouched]==config1Screen) {
                                     sprintf(sTemp,"Saving config file.\n");
-                                    logMsg(sTemp); // saving config
+                                    printMsg(sTemp); // saving config
                                     saveConfig();
                                     spkr.beep(2000,0.25);
                                 } else if (dMode[whichTouched]==playbackScreen) { // faster
@@ -487,7 +487,7 @@
                                     lastDMode[whichTouched ^ 1]=99; // repaint other screen (^ = XOR)
                                     
                                     //sprintf(sTemp,"Changed Skin to %d.\n");
-                                    //logMsg(sTemp); /// changed skin - for debug
+                                    //printMsg(sTemp); /// changed skin - for debug
                                     //saveConfig();
                                     //spkr.beep(2000,0.25);
                                     
@@ -539,21 +539,21 @@
                                             lastDMode[whichTouched]=99;//force refresh
                                             if(file==NULL){
                                                 sprintf(sTemp,"Unable to open /usb/playback.alc\n");
-                                                logMsg(sTemp); // no playback.alc
+                                                printMsg(sTemp); // no playback.alc
                                                 spkr.beep(1000,0.25);
                                             } else {
                                                 playbackOpen = true;
                                                 playbackEn=true;
                                                 playback.attach(&playbackISR,playbackInt);
                                                 sprintf(sTemp,"Starting playback\n");
-                                                logMsg(sTemp); // start playback
+                                                printMsg(sTemp); // 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");
-                                            logMsg(sTemp); // Must stop logging first
+                                            printMsg(sTemp); // Must stop logging first
                                         }
                                     } else {
                                         playback.detach();
@@ -676,6 +676,7 @@
         }
 
         if(tick){ // Executes once a second
+            headlights = (lastMsg[indexLastMsg[0x358]].data[1]&0x80)?true:false;  // headlight/turn signal indicator
             accV=floor(mon12V*scale12V*10+0.5)/10; //Round to nearest 10th
             accOn=(accV>5)?true:false;
             if(laccOn&&!accOn){ // Car turned off
@@ -691,7 +692,7 @@
             laccOn=accOn;
             if(!accOn&&!logEn&&userIdle&&!playbackEn){
                 //sprintf(sTemp,"Display Off %4.2f\n",accV);
-                //logMsg(sTemp); // display off - for debug
+                //printMsg(sTemp); // display off - for debug
                 
                 dled = 0; // turn off display if car off and logging disabled and no user activity
             }else if(!headlights){
--- a/utility.cpp	Mon Apr 22 02:27:37 2013 +0000
+++ b/utility.cpp	Wed May 01 03:02:59 2013 +0000
@@ -21,7 +21,7 @@
     NVIC_EnableIRQ( RTC_IRQn );
 }
 
-void logMsg (char *msg) {
+void printMsg (char *msg) {
     strcpy(displayLog[displayLoc],msg);
     displayLoc=displayLoc>17?0:displayLoc+1;
 }
@@ -137,7 +137,7 @@
                     if( nLost > 0 ) {
                         // We previously lost messages that did not get into the buffer
                         sprintf(sTemp,"-- Lost %d Messages.\n", nLost);
-                        logMsg(sTemp); // write buffer overrun
+                        printMsg(sTemp); // write buffer overrun
                         //spkr.beep(500,0.25);
                         
                         nLost = 0 ;
@@ -148,26 +148,30 @@
         }
     }else{ // not debugMode - keep code short
         if(logOpen){
-            if(canRXmsg.id>0) {
-                ts=getTimeStamp(); // only use
-                writeBuffer[writePointer][0]=mType;
-                writeBuffer[writePointer][1]=(ts&0xff00)>>8;
-                writeBuffer[writePointer][2]=(ts&0x00ff);
-                writeBuffer[writePointer][3]=canRXmsg.id&0xff;
-                writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
-                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(500,0.25);
-                }
+            NVIC_DisableIRQ(CAN_IRQn);  // Block interrupts until write pointer assigned
+            int localWritePointer = writePointer++; // create local copy to make logCan reentrant
+            // note that the static variables do not prevent safe reentry
+            // since they are only used for msgId<0x800 which will never interrupt
+            // another msgId<0x800 (both CANbusses are same priority)
+            if (writePointer >= maxBufLen) {
+                writePointer = 0;
+                led3 = !led3;
+            }
+            NVIC_EnableIRQ(CAN_IRQn);  // Unblock interrupts once local pointer set and global pointer incremented
+            ts=getTimeStamp();
+            writeBuffer[localWritePointer][0]=mType;
+            writeBuffer[localWritePointer][1]=(ts&0xff00)>>8;
+            writeBuffer[localWritePointer][2]=(ts&0x00ff);
+            writeBuffer[localWritePointer][3]=canRXmsg.id&0xff;
+            writeBuffer[localWritePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
+            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);
             }
         }
     }
@@ -184,7 +188,7 @@
                 if(ii==99) {
                     ii++; // step to 100 to log only one error
                     sprintf(sTemp,"MsgID buffer overrun.\n");
-                    logMsg(sTemp); // write buffer overrun
+                    printMsg(sTemp); // write buffer overrun
                 }
             }
         }
@@ -205,35 +209,32 @@
         
         //-------------------
         //Miscellaneous on-recieve operations below
-        if((mType==2)&&(canRXmsg.id==0x358)){ // headlight/turn signal indicator
-            headlights = (canRXmsg.data[1]&0x80)?true:false;
-            
-        }else if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data?  Need to store all responses
+        if((mType==1)&&(canRXmsg.id==0x7bb)){ // is battery data?  Need to store all responses
             if(canRXmsg.data[0]<0x20){
                 if(canRXmsg.data[3]==2){//Group 2 = cellpair data
                     bdi=BatDataBaseG2; // index offset for CP data (uses 00 - 1C)
                     sprintf(sTemp,"  Getting cell pair data\n");
-                    logMsg(sTemp);
+                    printMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==4){//Group 4 = temperature data
                     bdi=BatDataBaseG4; // index offset for Temperature data (uses 20 - 22)
                     sprintf(sTemp,"  Getting temperature data\n");
-                    logMsg(sTemp);
+                    printMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==1){//Group 1 data
                     bdi=BatDataBaseG1; // index offset for Group 1 data (uses 20 - 22)
-                    sprintf(sTemp,"Getting Group 1 data\n");
-                    logMsg(sTemp);
+                    sprintf(sTemp,"  Getting Group 1 data\n");
+                    printMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==3){//Group 3 data
                     bdi=BatDataBaseG3; // index offset for Group 3 data (uses 20 - 22)
                     sprintf(sTemp,"  Getting Group 3 data\n");
-                    logMsg(sTemp);
+                    printMsg(sTemp);
                     
                 }else if(canRXmsg.data[3]==5){//Group 5 data
                     bdi=BatDataBaseG5; // index offset for Group 5 data (uses 20 - 22)
                     sprintf(sTemp,"  Getting Group 5 data\n");
-                    logMsg(sTemp);
+                    printMsg(sTemp);
                     
                 }else bdi=0xff; // ignore other messages (for now)
                 lasti=0;
@@ -307,7 +308,7 @@
     logCan(0,tsMsg); // Date-Time
 }
 
-void logErrMsg (char * errMsg) {
+void logEvent (char * errMsg) {
     // log CAN-Do 8-character Pseudo Message
     CANMessage tsMsg;
     tsMsg.id=0xffe; // pseudo Message to CAN-Do log
@@ -496,9 +497,9 @@
     cfile = fopen("/local/config.txt", "r");
     if (cfile==NULL){ // if doesn't exist --> create
         sprintf(sTemp,"No config file found.\n");
-        logMsg(sTemp); // no config file
+        printMsg(sTemp); // no config file
         sprintf(sTemp,"Calibrating touch screen.\n");
-        logMsg(sTemp); // calibrating
+        printMsg(sTemp); // 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.
@@ -542,10 +543,10 @@
         if(ff<4){//If not latest format, save as latest format
             saveConfig();
             sprintf(sTemp,"Config file format updated.\n");
-            logMsg(sTemp); // config forat updates
+            printMsg(sTemp); // config forat updates
         }
         sprintf(sTemp,"Config file loaded.\n");
-        logMsg(sTemp); // config file loaded
+        printMsg(sTemp); // config file loaded
     }
 }
 
--- a/utility.h	Mon Apr 22 02:27:37 2013 +0000
+++ b/utility.h	Wed May 01 03:02:59 2013 +0000
@@ -58,12 +58,12 @@
     void mbed_reset();
     void RTC_IRQHandler();
     void RTC_Init (void);    
-    void logMsg (char *msg);
+    void printMsg (char *msg);
     void touch_ISR();
     unsigned short getTimeStamp();
     void logCan (char mType, CANMessage canRXmsg);
     void logTS ();    
-    void logErrMsg (char * errMsg); // gg - messeges
+    void logEvent (char * errMsg); // gg - messeges
     //void sendCPreq();    
     //void sendTreq();    
     void sendReq();