Dual CANbus monitor and instrumentation cluster supporting ILI9341 display controller

Dependencies:   SPI_TFTx2_ILI9341 TOUCH_TFTx2_ILI9341 TFT_fonts mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Sat Feb 23 05:25:35 2013 +0000
Revision:
9:c7857e87dd07
Parent:
8:67eed72f3e10
Child:
10:ebc6326d9bd6
battery temp added to cp display

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