Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Fri Feb 22 23:24:07 2013 +0000
Revision:
7:17bf9ceaf0aa
Parent:
5:ebf6fa994b78
Child:
8:67eed72f3e10
Added cellpair read (doesn't work)

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