Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller
Dependencies: SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed
Fork of CANary by
Diff: main.cpp
- Revision:
- 36:dbd39c315258
- Parent:
- 35:5acbd8a64a89
- Child:
- 37:fea2c1d52c5f
--- a/main.cpp Thu Mar 21 12:05:22 2013 +0000 +++ b/main.cpp Sat Mar 23 04:43:45 2013 +0000 @@ -32,7 +32,8 @@ time_t seconds ; -Ticker ticker; +Ticker autoPoll; +Ticker playback; Timer timer; DigitalOut led1(LED1); @@ -84,13 +85,21 @@ unsigned short pollInt = 300; // polling interval=5 minutes (until config file read) bool accOn = false; // Accessories on float scale12V = 16.2; // R1:R2 ratio +signed long kWh = 0; +unsigned long miles = 0; +float mpkWh = 0; float accV = 0; +bool playbackEn = false; +bool playbackOpen = false; +float playbackInt = 1; //read one message every 64 ms +bool step = false; +char data[8]; int main() { int readPointer=0; char sTemp[40]; unsigned long secs; - char i,j,display=0; + unsigned char i,j,display=0; point lastTouch; can1.monitor(true); // set to snoop mode @@ -223,7 +232,7 @@ logOpen=false; } } // if logOpen - if (canIdle&&userIdle) { // canbus idle --> sleep to save power + if (canIdle&&userIdle&&!playbackEn) { // canbus idle --> sleep to save power if (logOpen){ fclose(file); } // if (logOpen)*/ @@ -296,6 +305,12 @@ } else if (dMode[i]==config1Screen) { wait_ms(500); tt.calibrate(); + } else if (dMode[i]==config2Screen) { // slower + playbackInt *=2; + if(playbackEn){ + playback.detach(); + playback.attach(&playbackISR,playbackInt); + } } break; case 10: @@ -307,6 +322,13 @@ pollCP=true; } else if (dMode[i]==config1Screen) { mbed_reset(); + } else if (dMode[i]==config2Screen) { // pause/unpause + playbackEn=!playbackEn; + if(playbackEn){ + playback.attach(&playbackISR,playbackInt); + }else{ + playback.detach(); + } } break; case 20: @@ -318,6 +340,14 @@ logMsg(sTemp); saveConfig(); spkr.beep(2000,0.25); + } else if (dMode[i]==config2Screen) { // faster + if(playbackInt>.002){ + playbackInt/=2; + if(playbackEn){ + playback.detach(); + playback.attach(&playbackISR,playbackInt); + } + } } break; case 01: @@ -325,28 +355,58 @@ if (dMode[i]==config1Screen) { logEn = !logEn; if (!logEn) repeatPoll=false; - } else if (dMode[i]==config2Screen){ + } else if (dMode[i]==dateScreen){ dtMode=(dtMode<6)?dtMode+1:0; lastDMode[i]=99; } break; case 11: case 41: - if (dMode[i]==config1Screen) { + if (dMode[i]==config1Screen){ repeatPoll = !repeatPoll&&logEn; if (repeatPoll) { - ticker.attach(&tickerISR,pollInt); + autoPoll.attach(&autoPollISR,pollInt); } else { - ticker.detach(); + autoPoll.detach(); } - } else if (dMode[i]==config2Screen){ + } else if (dMode[i]==config2Screen) { + // Start/stop playback + if(!playbackOpen){ + if(!logOpen){ + file = fopen("/usb/playback.alc", "rb"); + if(file==NULL){ + sprintf(sTemp,"Unable to open /usb/playback.alc\n"); + logMsg(sTemp); + spkr.beep(1000,0.25); + } else { + playbackOpen = true; + sprintf(sTemp,"Starting playback\n"); + logMsg(sTemp); + 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); + } + } else { + playback.detach(); + fclose(file); + playbackOpen=false; + can1.attach(&recieve1);// Restore CAN data recieve + can2.attach(&recieve2); + lastDMode[i]=99; + } + playbackEn=false; + } else if (dMode[i]==dateScreen){ upDate(dtMode,true); lastDMode[i]=99; } break; case 21: case 51: - if (dMode[i]==config2Screen){ + if (dMode[i]==dateScreen){ upDate(dtMode,false); lastDMode[i]=99; } @@ -398,14 +458,42 @@ if(tick){ // Executes once a second accV=mon12V*scale12V; accOn=(accV>5)?true:false; - if(!accOn&&!logEn&&userIdle){ + if(!accOn&&!logEn&&userIdle&&!playbackEn){ dled = 0; // turn off display if car off and logging disabled and no user activity }else if(!headlights){ dled = ledHi; }else{ dled = ledLo; } + if(kWh>0){ + mpkWh=miles/kWh; + }else{ + mpkWh=99; + } + miles=0; + kWh=0; tick=false; } + + if(step){ // playback + if(playbackOpen&&playbackEn){ + //sprintf(sTemp,"step\n"); + //logMsg(sTemp); + for(i=0;i<200;i++){ + if(!feof(file)){ + //for (j = 0; j<5; j++){ + fscanf(file,"%5c",&writeBuffer[0][0]); + //} + fscanf(file,"%8c",&data[0]); + logCan(writeBuffer[0][0],CANMessage(0x7ff&((writeBuffer[0][4]<<8)+writeBuffer[0][3]), data, 8)); + }else{ + fclose(file); // restart + file = fopen("/usb/playback.alc", "rb"); + spkr.beep(2000,0.25); + } + } + } + step=false; + } } //while (true) } \ No newline at end of file