Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Sat Feb 23 04:10:51 2013 +0000
Revision:
8:67eed72f3e10
Parent:
7:17bf9ceaf0aa
Child:
9:c7857e87dd07
cellpair display working

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