Dual CANbus monitor and instrumentation cluster
Dependencies: SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
Revision 116:5cd72bae7c12, committed 2013-07-04
- 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
--- 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