Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Wed Feb 27 03:47:06 2013 +0000
Revision:
11:e9d155aad4e2
Parent:
10:ebc6326d9bd6
Child:
12:8e42d7ba8468
Fixed bug in CanSleepMode definition

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 7:17bf9ceaf0aa 1 #include "CANary.h"
TickTock 4:8d7759f4fe7a 2 //To Do:
TickTock 5:ebf6fa994b78 3 // USB device detect
TickTock 5:ebf6fa994b78 4 // config file on local fs
TickTock 5:ebf6fa994b78 5 // user programmable message decode
TickTock 5:ebf6fa994b78 6 // brake trainer
TickTock 2:71b1999a8ea5 7 // write and read the Mode Data
TickTock 7:17bf9ceaf0aa 8 LocalFileSystem local("local");
TickTock 2:71b1999a8ea5 9
TickTock 2:71b1999a8ea5 10 // to write to USB Flash Drives, or equivalent (SD card in Reader/Writer)
TickTock 2:71b1999a8ea5 11 MSCFileSystem fs("fs"); // to write to a USB Flash Drive
TickTock 2:71b1999a8ea5 12
TickTock 2:71b1999a8ea5 13 extern "C" void mbed_reset();
TickTock 0:1596b8644523 14
TickTock 1:9dcd70c32180 15 time_t seconds ;
TickTock 7:17bf9ceaf0aa 16 Beep spkr(p21);
TickTock 1:9dcd70c32180 17
TickTock 0:1596b8644523 18 Ticker ticker;
TickTock 1:9dcd70c32180 19 Timer timer;
TickTock 0:1596b8644523 20 DigitalOut led1(LED1);
TickTock 0:1596b8644523 21 DigitalOut led2(LED2);
TickTock 0:1596b8644523 22 DigitalOut led3(LED3);
TickTock 0:1596b8644523 23 DigitalOut led4(LED4);
TickTock 4:8d7759f4fe7a 24 PwmOut dled(p24);
TickTock 4:8d7759f4fe7a 25
TickTock 4:8d7759f4fe7a 26 InterruptIn touchpad(p17);
TickTock 10:ebc6326d9bd6 27 CAN can1(p9, p10); // CAN2 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
TickTock 11:e9d155aad4e2 28 DigitalOut can1SleepMode(p8); // Use pin 8 to control the sleep mode of can2
TickTock 10:ebc6326d9bd6 29 CAN can2(p30, p29); // CAN1 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
TickTock 11:e9d155aad4e2 30 DigitalOut can2SleepMode(p28); // Use pin 28 to control the sleep mode of can1
TickTock 11:e9d155aad4e2 31
TickTock 7:17bf9ceaf0aa 32 bool logEn = true,logOpen = false;
TickTock 2:71b1999a8ea5 33 FILE *rfile;
TickTock 2:71b1999a8ea5 34 FILE *file;
TickTock 2:71b1999a8ea5 35 char fileName[35] = "" ;
TickTock 3:3e879b043bc5 36 char writeBuffer[maxBufLen][13]; // buffer for USB write
TickTock 3:3e879b043bc5 37 char indexLastMsg[0x800]={0}; // index table for last message
TickTock 3:3e879b043bc5 38 CANMessage lastMsg[100]; // table to store last message of eachtype
TickTock 9:c7857e87dd07 39 unsigned char battData[256]={0};
TickTock 7:17bf9ceaf0aa 40 unsigned char msgChanged[100]; // inidcates which bytes changed
TickTock 2:71b1999a8ea5 41 char c;
TickTock 2:71b1999a8ea5 42 volatile int writePointer = 0;
TickTock 4:8d7759f4fe7a 43 volatile int secsNoMsg = 0, secsNoTouch = 0;
TickTock 4:8d7759f4fe7a 44 volatile bool canIdle = false, userIdle = false;
TickTock 7:17bf9ceaf0aa 45 bool getXY=0; //flag to read touchscreen
TickTock 0:1596b8644523 46 char counter = 0;
TickTock 10:ebc6326d9bd6 47 unsigned char dMode[2] = {7,2}; //display mode
TickTock 7:17bf9ceaf0aa 48 unsigned char sMode = 0; // setup mode
TickTock 8:67eed72f3e10 49 unsigned char lastDMode[2] = {0,0}; //last screen mode
TickTock 8:67eed72f3e10 50 char displayLog[20][40];
TickTock 7:17bf9ceaf0aa 51 unsigned char displayLoc = 0;
TickTock 7:17bf9ceaf0aa 52 unsigned char indexOffset = 1;
TickTock 10:ebc6326d9bd6 53 bool showCP = false;
TickTock 1:9dcd70c32180 54
TickTock 1:9dcd70c32180 55 TOUCH_TFTx2 tt(p16, p17, p19, p20, p11, p12, p13, p6, p7, p5, "TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs0, cs1, reset
TickTock 1:9dcd70c32180 56
TickTock 2:71b1999a8ea5 57 extern "C" void RTC_IRQHandler() {
TickTock 2:71b1999a8ea5 58 timer.reset(); // zero ms at the-seconds-tic
TickTock 4:8d7759f4fe7a 59 canIdle=(++secsNoMsg>canTimeout);
TickTock 4:8d7759f4fe7a 60 userIdle=(++secsNoTouch>userTimeout);
TickTock 2:71b1999a8ea5 61 LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next
TickTock 1:9dcd70c32180 62 }
TickTock 1:9dcd70c32180 63
TickTock 2:71b1999a8ea5 64 extern "C" void RTC_Init (void) {
TickTock 2:71b1999a8ea5 65 LPC_RTC->ILR=0x00; // set up the RTC interrupts
TickTock 2:71b1999a8ea5 66 LPC_RTC->CIIR=0x01; // interrupts each second
TickTock 2:71b1999a8ea5 67 LPC_RTC->CCR = 0x01; // Clock enable
TickTock 2:71b1999a8ea5 68 //NVIC_SetPriority( RTC_IRQn, 10 );
TickTock 1:9dcd70c32180 69 NVIC_EnableIRQ( RTC_IRQn );
TickTock 1:9dcd70c32180 70 }
TickTock 1:9dcd70c32180 71
TickTock 8:67eed72f3e10 72 void logMsg (char *msg) {
TickTock 8:67eed72f3e10 73 strcpy(displayLog[displayLoc],msg);
TickTock 8:67eed72f3e10 74 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 8:67eed72f3e10 75 }
TickTock 8:67eed72f3e10 76
TickTock 7:17bf9ceaf0aa 77 void touched(){
TickTock 7:17bf9ceaf0aa 78 LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF);
TickTock 7:17bf9ceaf0aa 79 secsNoTouch = 0;
TickTock 7:17bf9ceaf0aa 80 getXY=true;
TickTock 7:17bf9ceaf0aa 81 }
TickTock 7:17bf9ceaf0aa 82
TickTock 2:71b1999a8ea5 83 unsigned short getTimeStamp() {
TickTock 7:17bf9ceaf0aa 84 unsigned short msec = timer.read_ms() ; // read ms from the timer
TickTock 2:71b1999a8ea5 85 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 7:17bf9ceaf0aa 86 unsigned short isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC
TickTock 2:71b1999a8ea5 87 return ((isecs<<10)+msec) ; // return the two byte time stamp
TickTock 2:71b1999a8ea5 88 }
TickTock 7:17bf9ceaf0aa 89
TickTock 8:67eed72f3e10 90 void logCan (char mType, CANMessage canRXmsg) {
TickTock 9:c7857e87dd07 91 char sTemp[40];
TickTock 2:71b1999a8ea5 92 unsigned short ts = getTimeStamp();
TickTock 2:71b1999a8ea5 93 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 8:67eed72f3e10 94 static unsigned char ii = 0, lasti = 0; // indexindex
TickTock 7:17bf9ceaf0aa 95 unsigned char changed,i;
TickTock 9:c7857e87dd07 96 static unsigned char bdi;
TickTock 7:17bf9ceaf0aa 97 if(logOpen){
TickTock 7:17bf9ceaf0aa 98 if(canRXmsg.id>0) {
TickTock 8:67eed72f3e10 99 writeBuffer[writePointer][0]=mType;
TickTock 7:17bf9ceaf0aa 100 writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
TickTock 7:17bf9ceaf0aa 101 writeBuffer[writePointer][2]=ts&0xff;
TickTock 7:17bf9ceaf0aa 102 writeBuffer[writePointer][3]=canRXmsg.id&0xff;
TickTock 7:17bf9ceaf0aa 103 writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
TickTock 7:17bf9ceaf0aa 104 for(i=5;i<13;i++){
TickTock 7:17bf9ceaf0aa 105 writeBuffer[writePointer][i]=canRXmsg.data[i-5];
TickTock 7:17bf9ceaf0aa 106 }
TickTock 7:17bf9ceaf0aa 107 if (++writePointer >= maxBufLen) {
TickTock 7:17bf9ceaf0aa 108 writePointer = 0;
TickTock 7:17bf9ceaf0aa 109 led3 = !led3;
TickTock 3:3e879b043bc5 110 }
TickTock 3:3e879b043bc5 111 }
TickTock 7:17bf9ceaf0aa 112 }//if logOpen
TickTock 7:17bf9ceaf0aa 113 if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry
TickTock 7:17bf9ceaf0aa 114 ii=ii<99?ii+1:0;
TickTock 7:17bf9ceaf0aa 115 indexLastMsg[canRXmsg.id]=ii; //Create entry if first message
TickTock 7:17bf9ceaf0aa 116 }
TickTock 7:17bf9ceaf0aa 117 if(dMode[0]==changedMode||dMode[1]==changedMode){
TickTock 7:17bf9ceaf0aa 118 changed=msgChanged[indexLastMsg[canRXmsg.id]];
TickTock 7:17bf9ceaf0aa 119 for(i=0;i<8;i++){
TickTock 7:17bf9ceaf0aa 120 if(lastMsg[indexLastMsg[canRXmsg.id]].data[i]!=canRXmsg.data[i]){
TickTock 7:17bf9ceaf0aa 121 changed |= 1<<i;
TickTock 7:17bf9ceaf0aa 122 }
TickTock 7:17bf9ceaf0aa 123 }
TickTock 7:17bf9ceaf0aa 124 msgChanged[indexLastMsg[canRXmsg.id]]=changed;
TickTock 1:9dcd70c32180 125 }
TickTock 7:17bf9ceaf0aa 126 lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table
TickTock 8:67eed72f3e10 127 if(mType==1&&canRXmsg.id==0x7bb){ // is battery data? Need to store all responses
TickTock 8:67eed72f3e10 128 if(canRXmsg.data[0]<0x20){
TickTock 9:c7857e87dd07 129 if(canRXmsg.data[3]==2){//cellpair data
TickTock 9:c7857e87dd07 130 bdi=0;
TickTock 9:c7857e87dd07 131 sprintf(sTemp,"Getting cell pair data\n");
TickTock 9:c7857e87dd07 132 logMsg(sTemp);
TickTock 9:c7857e87dd07 133 }else if(canRXmsg.data[3]==4){//temperature data
TickTock 9:c7857e87dd07 134 bdi=0x20;
TickTock 9:c7857e87dd07 135 sprintf(sTemp,"Getting temperature data\n");
TickTock 9:c7857e87dd07 136 logMsg(sTemp);
TickTock 9:c7857e87dd07 137 }else bdi=0;
TickTock 8:67eed72f3e10 138 lasti=0;
TickTock 7:17bf9ceaf0aa 139 }
TickTock 8:67eed72f3e10 140 i=canRXmsg.data[0]&0x0f; //lower nibble of D0 is index
TickTock 8:67eed72f3e10 141 if(lasti>i){ //detect rolloever and offset index appropriately
TickTock 8:67eed72f3e10 142 bdi=0x10;
TickTock 7:17bf9ceaf0aa 143 }
TickTock 8:67eed72f3e10 144 lasti=i; //remember the msb to detect rollover next time around
TickTock 7:17bf9ceaf0aa 145 i+=bdi;
TickTock 7:17bf9ceaf0aa 146 i*=7;
TickTock 9:c7857e87dd07 147 if(i<0xfa){
TickTock 7:17bf9ceaf0aa 148 battData[i+0]=canRXmsg.data[1];
TickTock 7:17bf9ceaf0aa 149 battData[i+1]=canRXmsg.data[2];
TickTock 7:17bf9ceaf0aa 150 battData[i+2]=canRXmsg.data[3];
TickTock 7:17bf9ceaf0aa 151 battData[i+3]=canRXmsg.data[4];
TickTock 7:17bf9ceaf0aa 152 battData[i+4]=canRXmsg.data[5];
TickTock 7:17bf9ceaf0aa 153 battData[i+5]=canRXmsg.data[6];
TickTock 7:17bf9ceaf0aa 154 battData[i+6]=canRXmsg.data[7];
TickTock 7:17bf9ceaf0aa 155 }
TickTock 7:17bf9ceaf0aa 156 }//if 0x7bb
TickTock 1:9dcd70c32180 157 }
TickTock 0:1596b8644523 158
TickTock 2:71b1999a8ea5 159 void logTS () {
TickTock 2:71b1999a8ea5 160 CANMessage tsMsg;
TickTock 2:71b1999a8ea5 161 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 162 tsMsg.id=0xfff;
TickTock 2:71b1999a8ea5 163 tsMsg.len=0xf;
TickTock 2:71b1999a8ea5 164 tsMsg.data[0]=secs&0xff;
TickTock 2:71b1999a8ea5 165 tsMsg.data[1]=(secs>>8)&0xff;
TickTock 2:71b1999a8ea5 166 tsMsg.data[2]=(secs>>16)&0xff;
TickTock 2:71b1999a8ea5 167 tsMsg.data[3]=secs>>24;
TickTock 2:71b1999a8ea5 168 tsMsg.data[4]=0xff;
TickTock 2:71b1999a8ea5 169 tsMsg.data[5]=0xff;
TickTock 2:71b1999a8ea5 170 tsMsg.data[6]=0xff;
TickTock 2:71b1999a8ea5 171 tsMsg.data[7]=0xff;
TickTock 2:71b1999a8ea5 172 logCan(0,tsMsg);
TickTock 1:9dcd70c32180 173 }
TickTock 0:1596b8644523 174
TickTock 7:17bf9ceaf0aa 175 void sendCPreq() {
TickTock 8:67eed72f3e10 176 char i;
TickTock 7:17bf9ceaf0aa 177 char data[8] = {0x02, 0x21, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff};
TickTock 9:c7857e87dd07 178 can1.monitor(false); // set to active mode
TickTock 9:c7857e87dd07 179 can1SleepMode = 0; // enable TX
TickTock 9:c7857e87dd07 180 can1.write(CANMessage(0x79b, data, 8));
TickTock 7:17bf9ceaf0aa 181 data[0]=0x30; //change to request next line message
TickTock 7:17bf9ceaf0aa 182 data[1]=0x01;
TickTock 7:17bf9ceaf0aa 183 data[2]=0x00;
TickTock 8:67eed72f3e10 184 for(i=0;i<64;i++){
TickTock 7:17bf9ceaf0aa 185 wait_ms(16); //wait 16ms
TickTock 9:c7857e87dd07 186 can1.write(CANMessage(0x79b, data, 8));
TickTock 7:17bf9ceaf0aa 187 }
TickTock 9:c7857e87dd07 188 can1SleepMode = 1; // disable TX
TickTock 9:c7857e87dd07 189 can1.monitor(true); // set to snoop mode
TickTock 8:67eed72f3e10 190 }
TickTock 8:67eed72f3e10 191
TickTock 8:67eed72f3e10 192 void sendTreq() {
TickTock 8:67eed72f3e10 193 char i;
TickTock 8:67eed72f3e10 194 char data[8] = {0x02, 0x21, 0x04, 0xff, 0xff, 0xff, 0xff, 0xff};
TickTock 9:c7857e87dd07 195 can1.monitor(false); // set to active mode
TickTock 9:c7857e87dd07 196 can1SleepMode = 0; // enable TX
TickTock 9:c7857e87dd07 197 can1.write(CANMessage(0x79b, data, 8));
TickTock 8:67eed72f3e10 198 data[0]=0x30; //change to request next line message
TickTock 8:67eed72f3e10 199 data[1]=0x01;
TickTock 8:67eed72f3e10 200 data[2]=0x00;
TickTock 8:67eed72f3e10 201 for(i=0;i<8;i++){
TickTock 8:67eed72f3e10 202 wait_ms(16); //wait 16ms
TickTock 9:c7857e87dd07 203 can1.write(CANMessage(0x79b, data, 8));
TickTock 8:67eed72f3e10 204 }
TickTock 9:c7857e87dd07 205 can1SleepMode = 1; // disable TX
TickTock 9:c7857e87dd07 206 can1.monitor(true); // set to snoop mode
TickTock 0:1596b8644523 207 }
TickTock 0:1596b8644523 208
TickTock 0:1596b8644523 209 void recieve1() {
TickTock 2:71b1999a8ea5 210 CANMessage msg1;
TickTock 4:8d7759f4fe7a 211 secsNoMsg=0; // reset deadman switch
TickTock 0:1596b8644523 212 can1.read(msg1);
TickTock 9:c7857e87dd07 213 logCan(1, msg1);
TickTock 2:71b1999a8ea5 214 led1 = !led1;
TickTock 0:1596b8644523 215 }
TickTock 2:71b1999a8ea5 216
TickTock 0:1596b8644523 217 void recieve2() {
TickTock 2:71b1999a8ea5 218 CANMessage msg2;
TickTock 4:8d7759f4fe7a 219 secsNoMsg=0; // reset deadman switch
TickTock 0:1596b8644523 220 can2.read(msg2);
TickTock 9:c7857e87dd07 221 logCan(2, msg2);
TickTock 2:71b1999a8ea5 222 led2 = !led2;
TickTock 0:1596b8644523 223 }
TickTock 0:1596b8644523 224
TickTock 5:ebf6fa994b78 225 void printLast (bool force){
TickTock 5:ebf6fa994b78 226 CANMessage msg;
TickTock 5:ebf6fa994b78 227 tt.locate(0,6);
TickTock 5:ebf6fa994b78 228 tt.foreground(Red);
TickTock 5:ebf6fa994b78 229 tt.background(Yellow);
TickTock 5:ebf6fa994b78 230 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 5:ebf6fa994b78 231 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 5:ebf6fa994b78 232 for(int i=0; i<19; i++){
TickTock 5:ebf6fa994b78 233 msg = lastMsg[i+indexOffset];
TickTock 5:ebf6fa994b78 234 printf("%03x : %02x %02x %02x %02x %02x %02x %02x %02x \n",msg.id,msg.data[0],msg.data[1],msg.data[2],msg.data[3],msg.data[4],msg.data[5],msg.data[6],msg.data[7]);
TickTock 5:ebf6fa994b78 235 }
TickTock 5:ebf6fa994b78 236 }
TickTock 5:ebf6fa994b78 237
TickTock 7:17bf9ceaf0aa 238 void printChanged (bool force){
TickTock 7:17bf9ceaf0aa 239 CANMessage msg;
TickTock 7:17bf9ceaf0aa 240 unsigned char i,j;
TickTock 7:17bf9ceaf0aa 241 tt.locate(0,6);
TickTock 7:17bf9ceaf0aa 242 tt.foreground(Red);
TickTock 7:17bf9ceaf0aa 243 tt.background(Yellow);
TickTock 7:17bf9ceaf0aa 244 if(force) tt.cls(); // Just clear screen if forced - always update display
TickTock 7:17bf9ceaf0aa 245 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 7:17bf9ceaf0aa 246 i=0;
TickTock 7:17bf9ceaf0aa 247 j=indexOffset;
TickTock 7:17bf9ceaf0aa 248 do{
TickTock 7:17bf9ceaf0aa 249 j=j<99?j+1:j;
TickTock 7:17bf9ceaf0aa 250 if(msgChanged[j]>0){
TickTock 7:17bf9ceaf0aa 251 msg = lastMsg[j];
TickTock 7:17bf9ceaf0aa 252 printf("%03x : %02x %02x %02x %02x %02x %02x %02x %02x \n",msg.id,msg.data[0],msg.data[1],msg.data[2],msg.data[3],msg.data[4],msg.data[5],msg.data[6],msg.data[7]);
TickTock 7:17bf9ceaf0aa 253 i++;
TickTock 7:17bf9ceaf0aa 254 }// if changed
TickTock 7:17bf9ceaf0aa 255 }while(i<19&&j<99);
TickTock 7:17bf9ceaf0aa 256 }
TickTock 7:17bf9ceaf0aa 257
TickTock 5:ebf6fa994b78 258 void printLog (bool force){
TickTock 7:17bf9ceaf0aa 259 static unsigned char lastDisplayLoc = 0;
TickTock 5:ebf6fa994b78 260 if(force||displayLoc!=lastDisplayLoc){ //only update if changed
TickTock 5:ebf6fa994b78 261 tt.foreground(Amber);
TickTock 5:ebf6fa994b78 262 tt.background(Black);
TickTock 5:ebf6fa994b78 263 tt.cls();
TickTock 5:ebf6fa994b78 264 tt.locate(0,6);
TickTock 5:ebf6fa994b78 265 tt.set_font((unsigned char*) Arial12x12);
TickTock 5:ebf6fa994b78 266 for(int i=0; i<19; i++){
TickTock 5:ebf6fa994b78 267 printf("%s",displayLog[displayLoc]);
TickTock 5:ebf6fa994b78 268 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 5:ebf6fa994b78 269 }
TickTock 5:ebf6fa994b78 270 }
TickTock 5:ebf6fa994b78 271 lastDisplayLoc=displayLoc;
TickTock 5:ebf6fa994b78 272 }
TickTock 5:ebf6fa994b78 273
TickTock 8:67eed72f3e10 274 void printDTE (bool force){
TickTock 7:17bf9ceaf0aa 275 unsigned short gids, SOC, packV;
TickTock 7:17bf9ceaf0aa 276 static unsigned short lgids=0, lSOC=0, lpackV=0;
TickTock 5:ebf6fa994b78 277 CANMessage msg;
TickTock 5:ebf6fa994b78 278
TickTock 5:ebf6fa994b78 279 msg = lastMsg[indexLastMsg[0x5bc]]; //Get gids
TickTock 5:ebf6fa994b78 280 gids = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 5:ebf6fa994b78 281 msg = lastMsg[indexLastMsg[0x55b]]; //Get SOC
TickTock 5:ebf6fa994b78 282 SOC = (msg.data[0]<<2)+(msg.data[1]>>6);
TickTock 5:ebf6fa994b78 283 msg = lastMsg[indexLastMsg[0x1db]]; //Get pack volts
TickTock 5:ebf6fa994b78 284 packV = (msg.data[2]<<2)+(msg.data[3]>>6);
TickTock 5:ebf6fa994b78 285
TickTock 5:ebf6fa994b78 286 tt.background(Navy);
TickTock 5:ebf6fa994b78 287 if(force) tt.cls();
TickTock 5:ebf6fa994b78 288 if(force||gids!=lgids){
TickTock 5:ebf6fa994b78 289 tt.foreground(Amber);
TickTock 5:ebf6fa994b78 290 tt.set_font((unsigned char*) Arial28x28);
TickTock 5:ebf6fa994b78 291 tt.locate(10,10);
TickTock 5:ebf6fa994b78 292 printf("%4d gids\n",gids);
TickTock 5:ebf6fa994b78 293 tt.locate(10,200);
TickTock 5:ebf6fa994b78 294 printf("%4.1f kWh\n",(float)gids*0.08);
TickTock 5:ebf6fa994b78 295 tt.set_font((unsigned char*) SCProSB31x55);
TickTock 8:67eed72f3e10 296 //tt.set_font((unsigned char*) Neu42x35);
TickTock 5:ebf6fa994b78 297 tt.foreground(Green);
TickTock 5:ebf6fa994b78 298 tt.locate(60,96);
TickTock 5:ebf6fa994b78 299 printf("%4.1f mi\n",(float)gids*0.33); // Approx for now
TickTock 5:ebf6fa994b78 300 lgids=gids;
TickTock 5:ebf6fa994b78 301 }
TickTock 5:ebf6fa994b78 302 if(force||SOC!=lSOC){
TickTock 5:ebf6fa994b78 303 tt.foreground(Amber);
TickTock 5:ebf6fa994b78 304 tt.set_font((unsigned char*) Arial28x28);
TickTock 5:ebf6fa994b78 305 tt.locate(200,10);
TickTock 5:ebf6fa994b78 306 printf("%4.1f%s\n",(float)SOC/10,"%");
TickTock 5:ebf6fa994b78 307 lSOC=SOC;
TickTock 5:ebf6fa994b78 308 }
TickTock 5:ebf6fa994b78 309 if(force||packV!=lpackV){
TickTock 5:ebf6fa994b78 310 tt.foreground(Amber);
TickTock 5:ebf6fa994b78 311 tt.set_font((unsigned char*) Arial28x28);
TickTock 5:ebf6fa994b78 312 tt.locate(200,200);
TickTock 5:ebf6fa994b78 313 printf("%4.1fV\n",(float)packV/2);
TickTock 5:ebf6fa994b78 314 lpackV=packV;
TickTock 5:ebf6fa994b78 315 }
TickTock 5:ebf6fa994b78 316 }
TickTock 5:ebf6fa994b78 317
TickTock 5:ebf6fa994b78 318 void braking (bool force, bool prdata){
TickTock 5:ebf6fa994b78 319 unsigned short targetBraking, regenBraking, speed;
TickTock 5:ebf6fa994b78 320 static unsigned short maxTarget = 0, maxRegen = 0, tarDivReg = 0;
TickTock 5:ebf6fa994b78 321 short rpm;
TickTock 5:ebf6fa994b78 322 unsigned long temp;
TickTock 5:ebf6fa994b78 323 static unsigned char lastPressure[4] = {200,200,200,200};
TickTock 5:ebf6fa994b78 324 unsigned char i,r,t;
TickTock 5:ebf6fa994b78 325 static unsigned char lr, lt;
TickTock 5:ebf6fa994b78 326 CANMessage msg;
TickTock 5:ebf6fa994b78 327
TickTock 5:ebf6fa994b78 328 msg = lastMsg[indexLastMsg[0x1cb]]; //Get Target and Regen
TickTock 5:ebf6fa994b78 329 regenBraking = (msg.data[0]<<3)+(msg.data[1]>>5);
TickTock 5:ebf6fa994b78 330 targetBraking = (msg.data[2]<<3)+(msg.data[3]>>5);
TickTock 5:ebf6fa994b78 331 if (targetBraking>maxTarget) maxTarget=targetBraking;
TickTock 5:ebf6fa994b78 332 if (regenBraking>maxRegen) maxRegen=regenBraking;
TickTock 5:ebf6fa994b78 333 if (regenBraking>50) {
TickTock 5:ebf6fa994b78 334 temp = 1000*targetBraking;
TickTock 5:ebf6fa994b78 335 temp /= regenBraking;
TickTock 5:ebf6fa994b78 336 if (temp>tarDivReg) tarDivReg=temp;
TickTock 5:ebf6fa994b78 337 }
TickTock 5:ebf6fa994b78 338 msg = lastMsg[indexLastMsg[0x176]]; //Get rpms - not sure what this is but scales to mph with .0725
TickTock 5:ebf6fa994b78 339 rpm = ((short)msg.data[0]<<8)+msg.data[1];
TickTock 5:ebf6fa994b78 340 speed =rpm>0?rpm>>3:-rpm>>3; //Take absolute to get speed; div8
TickTock 5:ebf6fa994b78 341 msg = lastMsg[indexLastMsg[0x1ca]]; //Get brake pressure
TickTock 5:ebf6fa994b78 342
TickTock 5:ebf6fa994b78 343 tt.background(Navy);
TickTock 5:ebf6fa994b78 344 if (force) {
TickTock 5:ebf6fa994b78 345 tt.cls();
TickTock 5:ebf6fa994b78 346 tt.rect(0,111,170,239,White);
TickTock 5:ebf6fa994b78 347 tt.line(0,207,170,207,White);
TickTock 5:ebf6fa994b78 348 tt.line(0,175,170,175,White);
TickTock 5:ebf6fa994b78 349 tt.line(0,143,170,143,White);
TickTock 5:ebf6fa994b78 350 lastPressure[0] = 200;
TickTock 5:ebf6fa994b78 351 lastPressure[1] = 200;
TickTock 5:ebf6fa994b78 352 lastPressure[2] = 200;
TickTock 5:ebf6fa994b78 353 lastPressure[3] = 200;
TickTock 5:ebf6fa994b78 354 }
TickTock 5:ebf6fa994b78 355 // plot bar graph for each wheel pressure
TickTock 5:ebf6fa994b78 356 for (i=0; i<4; i++){
TickTock 5:ebf6fa994b78 357 if (msg.data[i]<239) {
TickTock 5:ebf6fa994b78 358 if (msg.data[i]>lastPressure[i]){
TickTock 5:ebf6fa994b78 359 tt.fillrect(10+40*i,239-msg.data[i],40+40*i,239,Red);
TickTock 5:ebf6fa994b78 360 } else if (msg.data[i]<lastPressure[i]) {
TickTock 5:ebf6fa994b78 361 tt.fillrect(10+40*i,238-lastPressure[i],40+40*i,238-msg.data[i],Navy);
TickTock 5:ebf6fa994b78 362 }
TickTock 5:ebf6fa994b78 363 lastPressure[i]=msg.data[i];
TickTock 5:ebf6fa994b78 364 }
TickTock 5:ebf6fa994b78 365 }
TickTock 5:ebf6fa994b78 366
TickTock 5:ebf6fa994b78 367 if(targetBraking>50){
TickTock 5:ebf6fa994b78 368 targetBraking *= speed;
TickTock 5:ebf6fa994b78 369 regenBraking *= speed;
TickTock 5:ebf6fa994b78 370 temp = 200*targetBraking/maxTarget;
TickTock 5:ebf6fa994b78 371 t = (char) temp;
TickTock 5:ebf6fa994b78 372 temp = 200*regenBraking*tarDivReg/maxTarget;
TickTock 5:ebf6fa994b78 373 r = (char) temp;
TickTock 5:ebf6fa994b78 374 if(lr!=r&&prdata){
TickTock 5:ebf6fa994b78 375 tt.foreground(Amber);
TickTock 5:ebf6fa994b78 376 tt.set_font((unsigned char*) Arial28x28);
TickTock 5:ebf6fa994b78 377 tt.locate(100,50);
TickTock 5:ebf6fa994b78 378 printf("%d %d \n",regenBraking,maxRegen);
TickTock 5:ebf6fa994b78 379 tt.locate(100,90);
TickTock 5:ebf6fa994b78 380 printf("%3.1f (%3.1f%s) \n",(float)tarDivReg/1000,(float)regenBraking*tarDivReg/targetBraking/1000,"%");
TickTock 5:ebf6fa994b78 381 }
TickTock 5:ebf6fa994b78 382 if(lt!=t&&prdata){
TickTock 5:ebf6fa994b78 383 tt.foreground(Amber);
TickTock 5:ebf6fa994b78 384 tt.set_font((unsigned char*) Arial28x28);
TickTock 5:ebf6fa994b78 385 tt.locate(100,10);
TickTock 5:ebf6fa994b78 386 printf("%d %d \n",targetBraking,maxTarget);
TickTock 5:ebf6fa994b78 387 }
TickTock 5:ebf6fa994b78 388 if((lr!=r||lt!=t)&&!prdata){
TickTock 7:17bf9ceaf0aa 389 if(r<lr)
TickTock 7:17bf9ceaf0aa 390 tt.fillrect(200,239-lr,300,239-r,Red);
TickTock 7:17bf9ceaf0aa 391 else
TickTock 7:17bf9ceaf0aa 392 tt.fillrect(200,239-r,300,239,Green);
TickTock 7:17bf9ceaf0aa 393 if(t<lt)
TickTock 7:17bf9ceaf0aa 394 tt.fillrect(200,239-lt,300,239-t,Navy);
TickTock 7:17bf9ceaf0aa 395 else
TickTock 7:17bf9ceaf0aa 396 tt.fillrect(200,239-t,300,238-r,Red);
TickTock 5:ebf6fa994b78 397 lt=t;
TickTock 5:ebf6fa994b78 398 lr=r;
TickTock 5:ebf6fa994b78 399 }
TickTock 5:ebf6fa994b78 400 }
TickTock 5:ebf6fa994b78 401 }
TickTock 5:ebf6fa994b78 402
TickTock 7:17bf9ceaf0aa 403 void cpData(bool force){
TickTock 10:ebc6326d9bd6 404 short unsigned max, min, jv, i, bd;
TickTock 10:ebc6326d9bd6 405 unsigned avg;
TickTock 10:ebc6326d9bd6 406 if(force){
TickTock 10:ebc6326d9bd6 407 tt.foreground(White);
TickTock 11:e9d155aad4e2 408 tt.background(Navy);
TickTock 10:ebc6326d9bd6 409 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 10:ebc6326d9bd6 410 max=0;
TickTock 10:ebc6326d9bd6 411 min=9999;
TickTock 10:ebc6326d9bd6 412 avg=0;
TickTock 10:ebc6326d9bd6 413 for(i=0; i<96; i++){
TickTock 10:ebc6326d9bd6 414 bd=(battData[i*2+3]<<8)+battData[i*2+4];
TickTock 10:ebc6326d9bd6 415 avg+=bd;
TickTock 10:ebc6326d9bd6 416 if(bd>max) max=bd;
TickTock 10:ebc6326d9bd6 417 if(bd<min) min=bd;
TickTock 10:ebc6326d9bd6 418 }
TickTock 10:ebc6326d9bd6 419 avg /= 96;
TickTock 10:ebc6326d9bd6 420 jv=avg-(max-avg)*2.5;
TickTock 10:ebc6326d9bd6 421 tt.cls();
TickTock 10:ebc6326d9bd6 422 tt.locate(0,6);
TickTock 11:e9d155aad4e2 423 printf(" MAX MIN AVG CVLI T1 T2 T3 T4\n %04d %04d %04d %04d %02dC %02dC %02dC %02dC\n\n",max,min,avg,jv,battData[224+5],battData[224+8],battData[224+11],battData[224+14]);
TickTock 10:ebc6326d9bd6 424 tt.locate(0,36);
TickTock 10:ebc6326d9bd6 425 for(i=0; i<16; i++){
TickTock 10:ebc6326d9bd6 426 printf("%02d-%02d : %04d %04d %04d %04d %04d %04d\n",i*6+1,i*6+6,(battData[i*12+3]<<8)+battData[i*12+4],(battData[i*12+5]<<8)+battData[i*12+6],(battData[i*12+7]<<8)+battData[i*12+8],(battData[i*12+9]<<8)+battData[i*12+10],(battData[i*12+11]<<8)+battData[i*12+12],(battData[i*12+13]<<8)+battData[i*12+14]);
TickTock 10:ebc6326d9bd6 427 }
TickTock 11:e9d155aad4e2 428 tt.rect(8+0*41,16,40+0*41,28,Green);
TickTock 11:e9d155aad4e2 429 tt.rect(8+1*41,16,40+1*41,28,Yellow);
TickTock 11:e9d155aad4e2 430 //tt.rect(8+2*41,16,40+2*41,28,White);
TickTock 11:e9d155aad4e2 431 tt.rect(8+3*41,16,40+3*41,28,Red);
TickTock 10:ebc6326d9bd6 432 for(i=0; i<96; i++){
TickTock 10:ebc6326d9bd6 433 bd=(battData[i*2+3]<<8)+battData[i*2+4];
TickTock 10:ebc6326d9bd6 434 if(bd>0){
TickTock 10:ebc6326d9bd6 435 if(bd==max) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Green);
TickTock 11:e9d155aad4e2 436 //if(bd==avg) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,White);
TickTock 10:ebc6326d9bd6 437 if(bd==min) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Yellow);
TickTock 10:ebc6326d9bd6 438 if(bd<jv) tt.rect(58+(i%6)*41,34+(int)(i/6)*12,90+(i%6)*41,46+(int)(i/6)*12,Red);
TickTock 10:ebc6326d9bd6 439 }
TickTock 10:ebc6326d9bd6 440 }
TickTock 10:ebc6326d9bd6 441 showCP=false;
TickTock 7:17bf9ceaf0aa 442 }
TickTock 7:17bf9ceaf0aa 443 }
TickTock 7:17bf9ceaf0aa 444
TickTock 7:17bf9ceaf0aa 445 void updateDisplay(char display){
TickTock 5:ebf6fa994b78 446 bool changed;
TickTock 8:67eed72f3e10 447 changed = dMode[display]!=lastDMode[display];
TickTock 7:17bf9ceaf0aa 448 tt.set_display(display);
TickTock 7:17bf9ceaf0aa 449 switch (dMode[display]) {
TickTock 7:17bf9ceaf0aa 450 case logMode:
TickTock 7:17bf9ceaf0aa 451 printLog(changed);
TickTock 7:17bf9ceaf0aa 452 break;
TickTock 7:17bf9ceaf0aa 453 case dteMode:
TickTock 8:67eed72f3e10 454 printDTE(changed);
TickTock 7:17bf9ceaf0aa 455 break;
TickTock 7:17bf9ceaf0aa 456 case brakeMode:
TickTock 7:17bf9ceaf0aa 457 braking(changed,true);
TickTock 7:17bf9ceaf0aa 458 break;
TickTock 7:17bf9ceaf0aa 459 case powerMode:
TickTock 7:17bf9ceaf0aa 460 braking(changed,false);
TickTock 7:17bf9ceaf0aa 461 break;
TickTock 7:17bf9ceaf0aa 462 case monitorMode:
TickTock 7:17bf9ceaf0aa 463 printLast(changed);
TickTock 7:17bf9ceaf0aa 464 break;
TickTock 7:17bf9ceaf0aa 465 case changedMode:
TickTock 7:17bf9ceaf0aa 466 printChanged(changed);
TickTock 7:17bf9ceaf0aa 467 break;
TickTock 7:17bf9ceaf0aa 468 case cpMode:
TickTock 10:ebc6326d9bd6 469 cpData(changed||showCP);
TickTock 7:17bf9ceaf0aa 470 break;
TickTock 7:17bf9ceaf0aa 471 default:
TickTock 7:17bf9ceaf0aa 472 tt.background(Black);
TickTock 8:67eed72f3e10 473 tt.cls();
TickTock 7:17bf9ceaf0aa 474 break;
TickTock 7:17bf9ceaf0aa 475 }
TickTock 7:17bf9ceaf0aa 476 lastDMode[display]=dMode[display];
TickTock 4:8d7759f4fe7a 477
TickTock 4:8d7759f4fe7a 478 switch (sMode) {
TickTock 4:8d7759f4fe7a 479 case 1:
TickTock 4:8d7759f4fe7a 480 tt.foreground(Yellow);
TickTock 4:8d7759f4fe7a 481 tt.background(DarkCyan);
TickTock 4:8d7759f4fe7a 482 tt.set_font((unsigned char*) Arial12x12);
TickTock 4:8d7759f4fe7a 483 tt.fillrect(btn31x1,btn11y1,btn31x2,btn11y2,DarkCyan);
TickTock 4:8d7759f4fe7a 484 tt.locate(btn31x1+5,btn11y1+5);
TickTock 4:8d7759f4fe7a 485 printf("<-Prev\n");
TickTock 4:8d7759f4fe7a 486 tt.fillrect(btn32x1,btn11y1,btn32x2,btn11y2,DarkCyan);
TickTock 4:8d7759f4fe7a 487 tt.fillrect(btn33x1,btn11y1,btn33x2,btn11y2,DarkCyan);
TickTock 4:8d7759f4fe7a 488 tt.locate(btn33x2-50,btn11y1+5);
TickTock 4:8d7759f4fe7a 489 printf("Next->\n");
TickTock 4:8d7759f4fe7a 490 tt.set_display(0);
TickTock 4:8d7759f4fe7a 491 tt.locate(btn32x1+15,btn11y1+5);
TickTock 4:8d7759f4fe7a 492 printf("Select %d\n",dMode[0]);
TickTock 4:8d7759f4fe7a 493 tt.set_display(1);
TickTock 4:8d7759f4fe7a 494 tt.locate(btn32x1+15,btn11y1+5);
TickTock 4:8d7759f4fe7a 495 printf("Select %d\n",dMode[1]);
TickTock 4:8d7759f4fe7a 496 tt.background(Black);
TickTock 4:8d7759f4fe7a 497 break;
TickTock 4:8d7759f4fe7a 498 default:
TickTock 4:8d7759f4fe7a 499 break;
TickTock 4:8d7759f4fe7a 500 }
TickTock 4:8d7759f4fe7a 501 }
TickTock 4:8d7759f4fe7a 502
TickTock 0:1596b8644523 503 int main() {
TickTock 2:71b1999a8ea5 504 int readPointer=0;
TickTock 4:8d7759f4fe7a 505 char sTemp[40];
TickTock 2:71b1999a8ea5 506 unsigned long secs;
TickTock 7:17bf9ceaf0aa 507 char i,j,display=0;
TickTock 7:17bf9ceaf0aa 508 point lastTouch;
TickTock 7:17bf9ceaf0aa 509
TickTock 8:67eed72f3e10 510 can1.monitor(true); // set to snoop mode
TickTock 8:67eed72f3e10 511 can2.monitor(true); // set to snoop mode
TickTock 2:71b1999a8ea5 512 can1.frequency(500000);
TickTock 2:71b1999a8ea5 513 can2.frequency(500000);
TickTock 7:17bf9ceaf0aa 514 can1SleepMode = 1; // Turn on Monitor_only Mode
TickTock 7:17bf9ceaf0aa 515 can2SleepMode = 1; // Turn on Monitor_only Mode
TickTock 0:1596b8644523 516 can1.attach(&recieve1);
TickTock 0:1596b8644523 517 can2.attach(&recieve2);
TickTock 4:8d7759f4fe7a 518
TickTock 3:3e879b043bc5 519 tt.set_orientation(1);
TickTock 3:3e879b043bc5 520 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 4:8d7759f4fe7a 521 tt.set_display(2); // select right display
TickTock 4:8d7759f4fe7a 522 tt.background(Black);
TickTock 3:3e879b043bc5 523 tt.cls();
TickTock 3:3e879b043bc5 524 tt.set_display(0); // select left display
TickTock 4:8d7759f4fe7a 525 tt.calibrate(); // calibrate the touch
TickTock 1:9dcd70c32180 526 tt.claim(stdout); // send stdout to the TFT display
TickTock 4:8d7759f4fe7a 527 touchpad.rise(&touched);
TickTock 4:8d7759f4fe7a 528 tt.wfi(); // enable interrupt on touch
TickTock 7:17bf9ceaf0aa 529 dled = 0.8; // turn on display LED 80%
TickTock 2:71b1999a8ea5 530 timer.start() ;
TickTock 2:71b1999a8ea5 531 RTC_Init(); // start the RTC Interrupts that sync the timer
TickTock 1:9dcd70c32180 532 struct tm t; // pointer to a static tm structure
TickTock 7:17bf9ceaf0aa 533 //NVIC_SetPriority(TIMER3_IRQn, 1); //set ticker priority
TickTock 7:17bf9ceaf0aa 534 //NVIC_SetPriority(CAN_IRQn, 2); //higher than can (so RTC sync works)
TickTock 1:9dcd70c32180 535 seconds = time(NULL);
TickTock 1:9dcd70c32180 536 t = *localtime(&seconds) ;
TickTock 2:71b1999a8ea5 537 strftime(sTemp, 32, "%a %m/%d/%Y %X", &t);
TickTock 3:3e879b043bc5 538 //tt.locate(0,0);
TickTock 3:3e879b043bc5 539 //printf("\nCurrent time : %s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 1:9dcd70c32180 540
TickTock 1:9dcd70c32180 541 // is it a date before 2012 ?
TickTock 1:9dcd70c32180 542 if ((t.tm_year + 1900) < 2012 ) {
TickTock 1:9dcd70c32180 543 // before 2012, so the RTC probably lost power
TickTock 1:9dcd70c32180 544 // So, set a near-recent date in 2012
TickTock 1:9dcd70c32180 545
TickTock 1:9dcd70c32180 546 // enter people-values here
TickTock 2:71b1999a8ea5 547 t.tm_year = 2013 ; // 28 May 2012
TickTock 2:71b1999a8ea5 548 t.tm_mon = 3 ; // 1 to 12
TickTock 2:71b1999a8ea5 549 t.tm_mday = 5;
TickTock 1:9dcd70c32180 550 t.tm_hour = 12; // 12:59:56 PM (after noon)
TickTock 1:9dcd70c32180 551 t.tm_min = 59;
TickTock 1:9dcd70c32180 552 t.tm_sec = 56;
TickTock 1:9dcd70c32180 553
TickTock 1:9dcd70c32180 554 // adjust for tm structure required values
TickTock 1:9dcd70c32180 555 t.tm_year = t.tm_year - 1900;
TickTock 1:9dcd70c32180 556 t.tm_mon = t.tm_mon - 1;
TickTock 1:9dcd70c32180 557
TickTock 1:9dcd70c32180 558 // set the RTC
TickTock 1:9dcd70c32180 559 set_time(mktime(&t));
TickTock 1:9dcd70c32180 560 seconds = time(NULL);
TickTock 1:9dcd70c32180 561
TickTock 1:9dcd70c32180 562 // printf("Set RTC to:\n" );
TickTock 1:9dcd70c32180 563 // strftime(sTemp, 32, "%a %m/%d/%Y %X", localtime(&seconds));
TickTock 1:9dcd70c32180 564 // printf("%s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 0:1596b8644523 565 }
TickTock 2:71b1999a8ea5 566 while (true) {
TickTock 4:8d7759f4fe7a 567 if (!logOpen) { // Open new file if one is not already open
TickTock 7:17bf9ceaf0aa 568 if(logEn){ //logging enable
TickTock 7:17bf9ceaf0aa 569 seconds = time(NULL);
TickTock 7:17bf9ceaf0aa 570 t = *localtime(&seconds) ;
TickTock 7:17bf9ceaf0aa 571 strftime(fileName, 32, "/fs/%m%d%H%M.alc", &t); //mmddhhmm.alc
TickTock 7:17bf9ceaf0aa 572 sprintf(sTemp,"Using file %s\n",fileName);
TickTock 4:8d7759f4fe7a 573 logMsg(sTemp);
TickTock 7:17bf9ceaf0aa 574 file = fopen(fileName, "ab");
TickTock 7:17bf9ceaf0aa 575
TickTock 7:17bf9ceaf0aa 576 if(file==NULL){
TickTock 7:17bf9ceaf0aa 577 sprintf(sTemp,"\nUnable to open %s\n\n\n\n",fileName);
TickTock 7:17bf9ceaf0aa 578 logMsg(sTemp);
TickTock 7:17bf9ceaf0aa 579 logEn=false;
TickTock 7:17bf9ceaf0aa 580 spkr.beep(1000,0.2);
TickTock 7:17bf9ceaf0aa 581 } else {
TickTock 7:17bf9ceaf0aa 582 logOpen = true;
TickTock 7:17bf9ceaf0aa 583 readPointer=writePointer;
TickTock 7:17bf9ceaf0aa 584 sprintf(sTemp,"Starting Can Log %s\n",fileName);
TickTock 7:17bf9ceaf0aa 585 logMsg(sTemp);
TickTock 7:17bf9ceaf0aa 586 logTS();
TickTock 7:17bf9ceaf0aa 587 spkr.beep(2000,0.2);
TickTock 7:17bf9ceaf0aa 588 }
TickTock 7:17bf9ceaf0aa 589 }//logging enabled
TickTock 4:8d7759f4fe7a 590 } else { // if (!logOpen)
TickTock 7:17bf9ceaf0aa 591 if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen/16)||canIdle) {
TickTock 7:17bf9ceaf0aa 592 // Dump buffer if > 1/16 full or canbus has stopped
TickTock 7:17bf9ceaf0aa 593 if (file == NULL) {
TickTock 7:17bf9ceaf0aa 594 logOpen = false;
TickTock 7:17bf9ceaf0aa 595 sprintf(sTemp,"Failed to append log file.\n\n");
TickTock 7:17bf9ceaf0aa 596 spkr.beep(1000,0.2);
TickTock 7:17bf9ceaf0aa 597 logMsg(sTemp);
TickTock 7:17bf9ceaf0aa 598 logEn=false;
TickTock 7:17bf9ceaf0aa 599 } else {
TickTock 7:17bf9ceaf0aa 600 while (readPointer != writePointer) {
TickTock 7:17bf9ceaf0aa 601 for (j = 0; j<13; j++){
TickTock 7:17bf9ceaf0aa 602 fprintf(file,"%c",writeBuffer[readPointer][j]);
TickTock 4:8d7759f4fe7a 603 }
TickTock 7:17bf9ceaf0aa 604 if(++readPointer >= maxBufLen)
TickTock 7:17bf9ceaf0aa 605 readPointer=0;
TickTock 4:8d7759f4fe7a 606 }
TickTock 7:17bf9ceaf0aa 607 led4 = !led4;
TickTock 7:17bf9ceaf0aa 608 }
TickTock 7:17bf9ceaf0aa 609 } // if > 1/16 full, canbus has stopped, or PB1 pressed
TickTock 4:8d7759f4fe7a 610 } // if logOpen
TickTock 4:8d7759f4fe7a 611 if (canIdle&&userIdle) { // canbus idle --> sleep to save power
TickTock 4:8d7759f4fe7a 612 if (logOpen){
TickTock 7:17bf9ceaf0aa 613 fclose(file);
TickTock 7:17bf9ceaf0aa 614 } // if (logOpen)*/
TickTock 4:8d7759f4fe7a 615 sprintf(sTemp,"Putting uC to sleep.\n");
TickTock 4:8d7759f4fe7a 616 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 617 //LPC_RTC->CIIR=0x00; // block RTC interrupts
TickTock 4:8d7759f4fe7a 618 led1=0;
TickTock 4:8d7759f4fe7a 619 led2=0;
TickTock 4:8d7759f4fe7a 620 led3=0;
TickTock 4:8d7759f4fe7a 621 led4=0;
TickTock 4:8d7759f4fe7a 622 dled=0; // turn off display
TickTock 4:8d7759f4fe7a 623 secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 4:8d7759f4fe7a 624 while (secsNoMsg>canTimeout && secsNoTouch>userTimeout) {
TickTock 4:8d7759f4fe7a 625 //DeepPowerDown();
TickTock 4:8d7759f4fe7a 626 tt.wfi(); //enable touchpad input
TickTock 7:17bf9ceaf0aa 627 __wfi(); // freeze CPU and wait for interrupt (from canbus or touch)
TickTock 7:17bf9ceaf0aa 628 //Sleep();
TickTock 4:8d7759f4fe7a 629 //DeepPowerDown();
TickTock 4:8d7759f4fe7a 630 }
TickTock 4:8d7759f4fe7a 631 canIdle=secsNoMsg>canTimeout;
TickTock 4:8d7759f4fe7a 632 userIdle=userIdle>userTimeout;
TickTock 7:17bf9ceaf0aa 633 dled=0.8; // turn on display LED
TickTock 4:8d7759f4fe7a 634 sprintf(sTemp,"Waking uC.\n");
TickTock 4:8d7759f4fe7a 635 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 636 if (time(NULL)>(secs+1800)) {
TickTock 4:8d7759f4fe7a 637 logOpen = false; // Start new file if asleep for more than 30 minutes
TickTock 4:8d7759f4fe7a 638 if (secsNoTouch>100) secsNoTouch = 100; // also mostly reset user Idle counter
TickTock 7:17bf9ceaf0aa 639 } else if (false){ // insert timestamp on each wake if logging enabled (disabled for now)
TickTock 7:17bf9ceaf0aa 640 file = fopen(fileName, "ab");
TickTock 4:8d7759f4fe7a 641 logTS();
TickTock 4:8d7759f4fe7a 642 }
TickTock 4:8d7759f4fe7a 643 } // if idle
TickTock 4:8d7759f4fe7a 644
TickTock 7:17bf9ceaf0aa 645 if(getXY){
TickTock 7:17bf9ceaf0aa 646 lastTouch = tt.get_touch();
TickTock 7:17bf9ceaf0aa 647 lastTouch = tt.to_pixel(lastTouch); // convert to pixel pos
TickTock 7:17bf9ceaf0aa 648 getXY = false; // clear interrupt flag
TickTock 7:17bf9ceaf0aa 649 }
TickTock 4:8d7759f4fe7a 650 if (!userIdle) {
TickTock 4:8d7759f4fe7a 651 if (secsNoTouch<2) {// Recently touched
TickTock 4:8d7759f4fe7a 652 secsNoTouch +=2; // increment to prevent double touch
TickTock 4:8d7759f4fe7a 653 if (lastTouch.x>320){
TickTock 4:8d7759f4fe7a 654 i=1;
TickTock 4:8d7759f4fe7a 655 lastTouch.x-=320;
TickTock 4:8d7759f4fe7a 656 } else {
TickTock 4:8d7759f4fe7a 657 i=0;
TickTock 4:8d7759f4fe7a 658 }
TickTock 7:17bf9ceaf0aa 659 if (lastTouch.y>btn11y1 && lastTouch.y<btn11y2) {
TickTock 5:ebf6fa994b78 660 if(sMode==1){
TickTock 5:ebf6fa994b78 661 if (lastTouch.x>btn31x1 && lastTouch.x<btn31x2) {
TickTock 5:ebf6fa994b78 662 dMode[i]=dMode[i]>0?dMode[i]-1:maxModes;
TickTock 5:ebf6fa994b78 663 } else if (lastTouch.x>btn32x1 && lastTouch.x<btn32x2) {
TickTock 5:ebf6fa994b78 664 secsNoTouch = userTimeout; // immediately exit config mode
TickTock 5:ebf6fa994b78 665 } else if (lastTouch.x>btn33x1 && lastTouch.x<btn33x2) {
TickTock 5:ebf6fa994b78 666 dMode[i]=dMode[i]<maxModes?dMode[i]+1:0;
TickTock 5:ebf6fa994b78 667 }
TickTock 5:ebf6fa994b78 668 } else sMode=1;
TickTock 5:ebf6fa994b78 669 } else {
TickTock 7:17bf9ceaf0aa 670 if (dMode[i]==monitorMode||dMode[i]==changedMode) {
TickTock 7:17bf9ceaf0aa 671 if (lastTouch.x>btn31x1 && lastTouch.x<btn31x2) {
TickTock 5:ebf6fa994b78 672 indexOffset=indexOffset>4?indexOffset-4:1;
TickTock 7:17bf9ceaf0aa 673 } else if (lastTouch.x>btn32x1 && lastTouch.x<btn32x2) {
TickTock 7:17bf9ceaf0aa 674 for(j=0;j<100;j++) msgChanged[j]=0; // clear changed data
TickTock 7:17bf9ceaf0aa 675 lastDMode[i]=99;//force refresh
TickTock 7:17bf9ceaf0aa 676 } else if (lastTouch.x>btn33x1 && lastTouch.x<btn33x2) {
TickTock 5:ebf6fa994b78 677 indexOffset=indexOffset<77?indexOffset+4:80;
TickTock 7:17bf9ceaf0aa 678 }
TickTock 7:17bf9ceaf0aa 679 } else if (dMode[i]==cpMode) {
TickTock 8:67eed72f3e10 680 if (lastTouch.x>btn32x1 && lastTouch.x<btn32x2){
TickTock 9:c7857e87dd07 681 sendCPreq(); // send cellpair data request.
TickTock 9:c7857e87dd07 682 wait_ms(16);
TickTock 9:c7857e87dd07 683 sendTreq(); //send temperature request
TickTock 10:ebc6326d9bd6 684 wait_ms(16);
TickTock 10:ebc6326d9bd6 685 showCP=true;
TickTock 8:67eed72f3e10 686 }
TickTock 2:71b1999a8ea5 687 }
TickTock 8:67eed72f3e10 688 } //top of screen
TickTock 4:8d7759f4fe7a 689 }
TickTock 4:8d7759f4fe7a 690 } else { // userIdle
TickTock 8:67eed72f3e10 691 if(sMode==1){
TickTock 8:67eed72f3e10 692 sMode=0;
TickTock 8:67eed72f3e10 693 lastDMode[0]=99;
TickTock 8:67eed72f3e10 694 lastDMode[1]=99;
TickTock 8:67eed72f3e10 695 }
TickTock 4:8d7759f4fe7a 696 }
TickTock 7:17bf9ceaf0aa 697 display=display<1?display+1:0; // toggle display
TickTock 7:17bf9ceaf0aa 698 updateDisplay(display);
TickTock 7:17bf9ceaf0aa 699 //wait(0.1); // We get >2K messages per second
TickTock 2:71b1999a8ea5 700 } //while (true)
TickTock 0:1596b8644523 701 }