test fork

Dependencies:   SPI_TFTx2 SPI_TFTx2_ILI9341 TFT_fonts TOUCH_TFTx2 mbed

Fork of CANary_9341 by Tick Tock

Committer:
TickTock
Date:
Sun Feb 17 16:44:59 2013 +0000
Revision:
4:8d7759f4fe7a
Parent:
3:3e879b043bc5
Child:
5:ebf6fa994b78
Added configuration menu and sticky log screen

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 4:8d7759f4fe7a 1 //To Do:
TickTock 4:8d7759f4fe7a 2 // USB device detec
TickTock 4:8d7759f4fe7a 3 #include "CANary.h"
TickTock 2:71b1999a8ea5 4 // write and read the Mode Data
TickTock 2:71b1999a8ea5 5 LocalFileSystem local("local"); // test the local file system to write files
TickTock 2:71b1999a8ea5 6
TickTock 2:71b1999a8ea5 7 // to write to USB Flash Drives, or equivalent (SD card in Reader/Writer)
TickTock 2:71b1999a8ea5 8 MSCFileSystem fs("fs"); // to write to a USB Flash Drive
TickTock 2:71b1999a8ea5 9
TickTock 2:71b1999a8ea5 10 extern "C" void mbed_reset();
TickTock 0:1596b8644523 11
TickTock 1:9dcd70c32180 12 time_t seconds ;
TickTock 0:1596b8644523 13 Beep buzzer(p21);
TickTock 1:9dcd70c32180 14
TickTock 0:1596b8644523 15 Ticker ticker;
TickTock 1:9dcd70c32180 16 Timer timer;
TickTock 0:1596b8644523 17 DigitalOut led1(LED1);
TickTock 0:1596b8644523 18 DigitalOut led2(LED2);
TickTock 0:1596b8644523 19 DigitalOut led3(LED3);
TickTock 0:1596b8644523 20 DigitalOut led4(LED4);
TickTock 4:8d7759f4fe7a 21 PwmOut dled(p24);
TickTock 4:8d7759f4fe7a 22
TickTock 4:8d7759f4fe7a 23 InterruptIn touchpad(p17);
TickTock 4:8d7759f4fe7a 24
TickTock 1:9dcd70c32180 25 CAN can1(p9, p10); // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
TickTock 1:9dcd70c32180 26 DigitalOut can1_SleepMode(p8); // Use pin 8 to control the sleep mode of can1
TickTock 1:9dcd70c32180 27 CAN can2(p30, p29); // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
TickTock 1:9dcd70c32180 28 DigitalOut can2_SleepMode(p28); // Use pin 28 to control the sleep mode of can2
TickTock 2:71b1999a8ea5 29 bool logOpen = false;
TickTock 2:71b1999a8ea5 30 FILE *rfile;
TickTock 2:71b1999a8ea5 31 FILE *file;
TickTock 2:71b1999a8ea5 32 char fileName[35] = "" ;
TickTock 3:3e879b043bc5 33 char writeBuffer[maxBufLen][13]; // buffer for USB write
TickTock 3:3e879b043bc5 34 char indexLastMsg[0x800]={0}; // index table for last message
TickTock 3:3e879b043bc5 35 CANMessage lastMsg[100]; // table to store last message of eachtype
TickTock 3:3e879b043bc5 36 char ii = 0; // indexindex
TickTock 2:71b1999a8ea5 37 char c;
TickTock 2:71b1999a8ea5 38 volatile int writePointer = 0;
TickTock 4:8d7759f4fe7a 39 volatile int secsNoMsg = 0, secsNoTouch = 0;
TickTock 4:8d7759f4fe7a 40 volatile bool canIdle = false, userIdle = false;
TickTock 4:8d7759f4fe7a 41 point lastTouch;
TickTock 0:1596b8644523 42 char counter = 0;
TickTock 4:8d7759f4fe7a 43 int dMode[2] = {1,6}; //display mode
TickTock 4:8d7759f4fe7a 44 int sMode = 0; // setup mode
TickTock 4:8d7759f4fe7a 45 int lastDMode[2]; //last screen mode
TickTock 4:8d7759f4fe7a 46 int lastSMode = 0;
TickTock 4:8d7759f4fe7a 47 char displayLog[19][40];
TickTock 4:8d7759f4fe7a 48 int displayLoc = 0;
TickTock 1:9dcd70c32180 49
TickTock 1:9dcd70c32180 50 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 51
TickTock 2:71b1999a8ea5 52 extern "C" void RTC_IRQHandler() {
TickTock 2:71b1999a8ea5 53 timer.reset(); // zero ms at the-seconds-tic
TickTock 4:8d7759f4fe7a 54 canIdle=(++secsNoMsg>canTimeout);
TickTock 4:8d7759f4fe7a 55 userIdle=(++secsNoTouch>userTimeout);
TickTock 2:71b1999a8ea5 56 LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next
TickTock 1:9dcd70c32180 57 }
TickTock 1:9dcd70c32180 58
TickTock 2:71b1999a8ea5 59 extern "C" void RTC_Init (void) {
TickTock 2:71b1999a8ea5 60 LPC_RTC->ILR=0x00; // set up the RTC interrupts
TickTock 2:71b1999a8ea5 61 LPC_RTC->CIIR=0x01; // interrupts each second
TickTock 2:71b1999a8ea5 62 LPC_RTC->CCR = 0x01; // Clock enable
TickTock 2:71b1999a8ea5 63 //NVIC_SetPriority( RTC_IRQn, 10 );
TickTock 1:9dcd70c32180 64 NVIC_EnableIRQ( RTC_IRQn );
TickTock 1:9dcd70c32180 65 }
TickTock 1:9dcd70c32180 66
TickTock 2:71b1999a8ea5 67 unsigned short getTimeStamp() {
TickTock 2:71b1999a8ea5 68 int msec = timer.read_ms() ; // read ms from the timer
TickTock 2:71b1999a8ea5 69 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 70 int isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC
TickTock 2:71b1999a8ea5 71 return ((isecs<<10)+msec) ; // return the two byte time stamp
TickTock 2:71b1999a8ea5 72 }
TickTock 2:71b1999a8ea5 73
TickTock 3:3e879b043bc5 74 void printLast (){
TickTock 4:8d7759f4fe7a 75 int i;
TickTock 3:3e879b043bc5 76 CANMessage msg;
TickTock 3:3e879b043bc5 77 tt.locate(0,6);
TickTock 3:3e879b043bc5 78 tt.foreground(Red);
TickTock 4:8d7759f4fe7a 79 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 3:3e879b043bc5 80 for(i=0; i<19; i++){
TickTock 3:3e879b043bc5 81 msg = lastMsg[i+1];
TickTock 3:3e879b043bc5 82 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 3:3e879b043bc5 83 }
TickTock 4:8d7759f4fe7a 84 }
TickTock 4:8d7759f4fe7a 85
TickTock 4:8d7759f4fe7a 86 void printLog (){
TickTock 4:8d7759f4fe7a 87 int i;
TickTock 4:8d7759f4fe7a 88 tt.locate(0,6);
TickTock 4:8d7759f4fe7a 89 tt.foreground(Amber);
TickTock 4:8d7759f4fe7a 90 tt.cls();
TickTock 4:8d7759f4fe7a 91 for(i=0; i<19; i++){
TickTock 4:8d7759f4fe7a 92 printf("%s",displayLog[displayLoc]);
TickTock 4:8d7759f4fe7a 93 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 4:8d7759f4fe7a 94 }
TickTock 4:8d7759f4fe7a 95 }
TickTock 4:8d7759f4fe7a 96
TickTock 4:8d7759f4fe7a 97 void logMsg (char *msg) {
TickTock 4:8d7759f4fe7a 98 strcpy(displayLog[displayLoc],msg);
TickTock 4:8d7759f4fe7a 99 displayLoc=displayLoc>17?0:displayLoc+1;
TickTock 3:3e879b043bc5 100 }
TickTock 3:3e879b043bc5 101
TickTock 2:71b1999a8ea5 102 void logCan (char mtype, CANMessage canRXmsg) {
TickTock 2:71b1999a8ea5 103 unsigned short ts = getTimeStamp();
TickTock 2:71b1999a8ea5 104 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 105 if(canRXmsg.id>0) {
TickTock 2:71b1999a8ea5 106 writeBuffer[writePointer][0]=mtype;
TickTock 2:71b1999a8ea5 107 writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
TickTock 2:71b1999a8ea5 108 writeBuffer[writePointer][2]=ts&0xff;
TickTock 2:71b1999a8ea5 109 writeBuffer[writePointer][3]=canRXmsg.id&0xff;
TickTock 2:71b1999a8ea5 110 writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
TickTock 2:71b1999a8ea5 111 for (int i = 5; i<13; i++){
TickTock 2:71b1999a8ea5 112 writeBuffer[writePointer][i]=canRXmsg.data[i-5];
TickTock 2:71b1999a8ea5 113 }
TickTock 2:71b1999a8ea5 114 if (++writePointer >= maxBufLen) {
TickTock 2:71b1999a8ea5 115 writePointer = 0;
TickTock 2:71b1999a8ea5 116 led4 = !led4;
TickTock 2:71b1999a8ea5 117 }
TickTock 3:3e879b043bc5 118 if(indexLastMsg[canRXmsg.id]==0) { //Check if no entry
TickTock 3:3e879b043bc5 119 indexLastMsg[canRXmsg.id]=++ii; //Create entry if first message
TickTock 3:3e879b043bc5 120 if(ii>99) {
TickTock 3:3e879b043bc5 121 ii=0;
TickTock 3:3e879b043bc5 122 }
TickTock 3:3e879b043bc5 123 }
TickTock 3:3e879b043bc5 124 lastMsg[indexLastMsg[canRXmsg.id]]=canRXmsg; //Store in table
TickTock 1:9dcd70c32180 125 }
TickTock 1:9dcd70c32180 126 }
TickTock 0:1596b8644523 127
TickTock 2:71b1999a8ea5 128 void logTS () {
TickTock 2:71b1999a8ea5 129 CANMessage tsMsg;
TickTock 2:71b1999a8ea5 130 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 131 tsMsg.id=0xfff;
TickTock 2:71b1999a8ea5 132 tsMsg.len=0xf;
TickTock 2:71b1999a8ea5 133 tsMsg.data[0]=secs&0xff;
TickTock 2:71b1999a8ea5 134 tsMsg.data[1]=(secs>>8)&0xff;
TickTock 2:71b1999a8ea5 135 tsMsg.data[2]=(secs>>16)&0xff;
TickTock 2:71b1999a8ea5 136 tsMsg.data[3]=secs>>24;
TickTock 2:71b1999a8ea5 137 tsMsg.data[4]=0xff;
TickTock 2:71b1999a8ea5 138 tsMsg.data[5]=0xff;
TickTock 2:71b1999a8ea5 139 tsMsg.data[6]=0xff;
TickTock 2:71b1999a8ea5 140 tsMsg.data[7]=0xff;
TickTock 2:71b1999a8ea5 141 logCan(0,tsMsg);
TickTock 1:9dcd70c32180 142 }
TickTock 0:1596b8644523 143
TickTock 1:9dcd70c32180 144 void send1() {
TickTock 1:9dcd70c32180 145 static char counter = 0; // use for fake data
TickTock 1:9dcd70c32180 146
TickTock 1:9dcd70c32180 147 can1.write(CANMessage(0x350, &counter, 1));
TickTock 1:9dcd70c32180 148 counter++;
TickTock 1:9dcd70c32180 149 // test sending 3 quickly
TickTock 1:9dcd70c32180 150 //can1.write(CANMessage(0x351, &counter, 1));
TickTock 1:9dcd70c32180 151 //can1.write(CANMessage(0x352, &counter, 1));
TickTock 2:71b1999a8ea5 152 printf("Sending message %d \n",counter);
TickTock 1:9dcd70c32180 153
TickTock 0:1596b8644523 154 }
TickTock 0:1596b8644523 155
TickTock 0:1596b8644523 156
TickTock 0:1596b8644523 157 void recieve1() {
TickTock 2:71b1999a8ea5 158 CANMessage msg1;
TickTock 4:8d7759f4fe7a 159 secsNoMsg=0; // reset deadman switch
TickTock 0:1596b8644523 160 can1.read(msg1);
TickTock 2:71b1999a8ea5 161 //printf("Can1 rxd: %d\n", msg1.data[0]);
TickTock 2:71b1999a8ea5 162 if(logOpen)
TickTock 2:71b1999a8ea5 163 logCan(2, msg1);
TickTock 2:71b1999a8ea5 164 led1 = !led1;
TickTock 0:1596b8644523 165 }
TickTock 2:71b1999a8ea5 166
TickTock 0:1596b8644523 167 void recieve2() {
TickTock 2:71b1999a8ea5 168 CANMessage msg2;
TickTock 4:8d7759f4fe7a 169 secsNoMsg=0; // reset deadman switch
TickTock 0:1596b8644523 170 can2.read(msg2);
TickTock 2:71b1999a8ea5 171 //printf("Can2 rxd: %d\n", msg2.data[0]);
TickTock 2:71b1999a8ea5 172 if(logOpen)
TickTock 2:71b1999a8ea5 173 logCan(1, msg2);
TickTock 2:71b1999a8ea5 174 led2 = !led2;
TickTock 0:1596b8644523 175 }
TickTock 0:1596b8644523 176
TickTock 4:8d7759f4fe7a 177 void touched(){
TickTock 4:8d7759f4fe7a 178 LPC_GPIOINT->IO2IntClr = (LPC_GPIOINT->IO2IntStatR | LPC_GPIOINT->IO2IntStatF);
TickTock 4:8d7759f4fe7a 179 lastTouch = tt.get_touch();
TickTock 4:8d7759f4fe7a 180 lastTouch = tt.to_pixel(lastTouch); // convert to pixel pos
TickTock 4:8d7759f4fe7a 181 //printf("X=%d Y=%d\n",lastTouch.x,lastTouch.y);
TickTock 4:8d7759f4fe7a 182 /*if (lastTouch.x > tt.width()){
TickTock 4:8d7759f4fe7a 183 tt.set_display(1);
TickTock 4:8d7759f4fe7a 184 tt.fillcircle(lastTouch.x-tt.width(),lastTouch.y,10,Blue);
TickTock 4:8d7759f4fe7a 185 }else{
TickTock 4:8d7759f4fe7a 186 tt.set_display(0);
TickTock 4:8d7759f4fe7a 187 tt.fillcircle(lastTouch.x,lastTouch.y,10,Blue);
TickTock 4:8d7759f4fe7a 188 }*/
TickTock 4:8d7759f4fe7a 189 secsNoTouch = 0;
TickTock 4:8d7759f4fe7a 190 }
TickTock 4:8d7759f4fe7a 191
TickTock 4:8d7759f4fe7a 192 void updateDisplay(){
TickTock 4:8d7759f4fe7a 193 static int lastDisplayLoc = 0;
TickTock 4:8d7759f4fe7a 194 for (int i=0; i<2; i++){
TickTock 4:8d7759f4fe7a 195 tt.set_display(i);
TickTock 4:8d7759f4fe7a 196 switch (dMode[i]) {
TickTock 4:8d7759f4fe7a 197 case logMode:
TickTock 4:8d7759f4fe7a 198 tt.background(Black);
TickTock 4:8d7759f4fe7a 199 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)||(lastDisplayLoc!=displayLoc)){
TickTock 4:8d7759f4fe7a 200 printLog();
TickTock 4:8d7759f4fe7a 201 lastDisplayLoc=displayLoc;
TickTock 4:8d7759f4fe7a 202 }
TickTock 4:8d7759f4fe7a 203 break;
TickTock 4:8d7759f4fe7a 204 case dteMode:
TickTock 4:8d7759f4fe7a 205 tt.background(Black);
TickTock 4:8d7759f4fe7a 206 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)) tt.cls();
TickTock 4:8d7759f4fe7a 207 tt.fillrect(10,10,300,50,Blue);
TickTock 4:8d7759f4fe7a 208 break;
TickTock 4:8d7759f4fe7a 209 case brakeMode:
TickTock 4:8d7759f4fe7a 210 tt.background(Black);
TickTock 4:8d7759f4fe7a 211 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)) tt.cls();
TickTock 4:8d7759f4fe7a 212 tt.fillcircle(100,100,15,Red);
TickTock 4:8d7759f4fe7a 213 break;
TickTock 4:8d7759f4fe7a 214 case powerMode:
TickTock 4:8d7759f4fe7a 215 tt.background(Black);
TickTock 4:8d7759f4fe7a 216 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)) tt.cls();
TickTock 4:8d7759f4fe7a 217 tt.fillrect(10,10,300,50,Green);
TickTock 4:8d7759f4fe7a 218 break;
TickTock 4:8d7759f4fe7a 219 case controlMode:
TickTock 4:8d7759f4fe7a 220 tt.background(Black);
TickTock 4:8d7759f4fe7a 221 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)) tt.cls();
TickTock 4:8d7759f4fe7a 222 tt.fillcircle(100,100,15,Orange);
TickTock 4:8d7759f4fe7a 223 break;
TickTock 4:8d7759f4fe7a 224 case monitorMode:
TickTock 4:8d7759f4fe7a 225 tt.background(Yellow);
TickTock 4:8d7759f4fe7a 226 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)) tt.cls();
TickTock 4:8d7759f4fe7a 227 printLast();
TickTock 4:8d7759f4fe7a 228 break;
TickTock 4:8d7759f4fe7a 229 default:
TickTock 4:8d7759f4fe7a 230 tt.background(Black);
TickTock 4:8d7759f4fe7a 231 if(dMode[i]!=lastDMode[i]||(lastSMode>0&&sMode==0)) tt.cls();
TickTock 4:8d7759f4fe7a 232 break;
TickTock 4:8d7759f4fe7a 233 }
TickTock 4:8d7759f4fe7a 234 lastDMode[i]=dMode[i];
TickTock 4:8d7759f4fe7a 235 } // for (i=0; i<1; i++)
TickTock 4:8d7759f4fe7a 236
TickTock 4:8d7759f4fe7a 237 switch (sMode) {
TickTock 4:8d7759f4fe7a 238 case 1:
TickTock 4:8d7759f4fe7a 239 tt.set_display(2); // select both displays
TickTock 4:8d7759f4fe7a 240 tt.foreground(Yellow);
TickTock 4:8d7759f4fe7a 241 tt.background(DarkCyan);
TickTock 4:8d7759f4fe7a 242 tt.set_font((unsigned char*) Arial12x12);
TickTock 4:8d7759f4fe7a 243 tt.fillrect(btn31x1,btn11y1,btn31x2,btn11y2,DarkCyan);
TickTock 4:8d7759f4fe7a 244 tt.locate(btn31x1+5,btn11y1+5);
TickTock 4:8d7759f4fe7a 245 printf("<-Prev\n");
TickTock 4:8d7759f4fe7a 246 tt.fillrect(btn32x1,btn11y1,btn32x2,btn11y2,DarkCyan);
TickTock 4:8d7759f4fe7a 247 tt.fillrect(btn33x1,btn11y1,btn33x2,btn11y2,DarkCyan);
TickTock 4:8d7759f4fe7a 248 tt.locate(btn33x2-50,btn11y1+5);
TickTock 4:8d7759f4fe7a 249 printf("Next->\n");
TickTock 4:8d7759f4fe7a 250 tt.set_display(0);
TickTock 4:8d7759f4fe7a 251 tt.locate(btn32x1+15,btn11y1+5);
TickTock 4:8d7759f4fe7a 252 printf("Select %d\n",dMode[0]);
TickTock 4:8d7759f4fe7a 253 tt.set_display(1);
TickTock 4:8d7759f4fe7a 254 tt.locate(btn32x1+15,btn11y1+5);
TickTock 4:8d7759f4fe7a 255 printf("Select %d\n",dMode[1]);
TickTock 4:8d7759f4fe7a 256 tt.background(Black);
TickTock 4:8d7759f4fe7a 257 break;
TickTock 4:8d7759f4fe7a 258 default:
TickTock 4:8d7759f4fe7a 259 break;
TickTock 4:8d7759f4fe7a 260 }
TickTock 4:8d7759f4fe7a 261 lastSMode=sMode;
TickTock 4:8d7759f4fe7a 262 }
TickTock 4:8d7759f4fe7a 263
TickTock 0:1596b8644523 264 int main() {
TickTock 2:71b1999a8ea5 265 int readPointer=0;
TickTock 2:71b1999a8ea5 266 int fmon;
TickTock 2:71b1999a8ea5 267 int fday;
TickTock 2:71b1999a8ea5 268 int ftime;
TickTock 4:8d7759f4fe7a 269 char sTemp[40];
TickTock 2:71b1999a8ea5 270 unsigned long secs;
TickTock 2:71b1999a8ea5 271 bool bit = false;
TickTock 4:8d7759f4fe7a 272 int i,j;
TickTock 4:8d7759f4fe7a 273
TickTock 2:71b1999a8ea5 274 can1.frequency(500000);
TickTock 2:71b1999a8ea5 275 can2.frequency(500000);
TickTock 1:9dcd70c32180 276 //can1_SleepMode = 0; // Enable TX
TickTock 1:9dcd70c32180 277 //can2_SleepMode = 0; // Enable TX
TickTock 1:9dcd70c32180 278 can1_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 1:9dcd70c32180 279 can2_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 2:71b1999a8ea5 280 //ticker.attach(&send1, 0.5);
TickTock 4:8d7759f4fe7a 281 ticker.attach(&updateDisplay, 0.25); // Display messages
TickTock 0:1596b8644523 282 can1.attach(&recieve1);
TickTock 0:1596b8644523 283 can2.attach(&recieve2);
TickTock 4:8d7759f4fe7a 284
TickTock 3:3e879b043bc5 285 tt.set_orientation(1);
TickTock 3:3e879b043bc5 286 tt.set_font((unsigned char*) Arial12x12_prop); // select the font
TickTock 4:8d7759f4fe7a 287 tt.set_display(2); // select right display
TickTock 4:8d7759f4fe7a 288 tt.background(Black);
TickTock 3:3e879b043bc5 289 tt.cls();
TickTock 3:3e879b043bc5 290 tt.set_display(0); // select left display
TickTock 4:8d7759f4fe7a 291 tt.calibrate(); // calibrate the touch
TickTock 1:9dcd70c32180 292 tt.claim(stdout); // send stdout to the TFT display
TickTock 4:8d7759f4fe7a 293 touchpad.rise(&touched);
TickTock 4:8d7759f4fe7a 294 tt.wfi(); // enable interrupt on touch
TickTock 4:8d7759f4fe7a 295 dled = 1; // turn on display LED 80%
TickTock 2:71b1999a8ea5 296 timer.start() ;
TickTock 2:71b1999a8ea5 297 RTC_Init(); // start the RTC Interrupts that sync the timer
TickTock 1:9dcd70c32180 298 struct tm t; // pointer to a static tm structure
TickTock 1:9dcd70c32180 299
TickTock 1:9dcd70c32180 300 seconds = time(NULL);
TickTock 1:9dcd70c32180 301 t = *localtime(&seconds) ;
TickTock 2:71b1999a8ea5 302 strftime(sTemp, 32, "%a %m/%d/%Y %X", &t);
TickTock 3:3e879b043bc5 303 //tt.locate(0,0);
TickTock 3:3e879b043bc5 304 //printf("\nCurrent time : %s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 1:9dcd70c32180 305
TickTock 1:9dcd70c32180 306 // is it a date before 2012 ?
TickTock 1:9dcd70c32180 307 if ((t.tm_year + 1900) < 2012 ) {
TickTock 1:9dcd70c32180 308 // before 2012, so the RTC probably lost power
TickTock 1:9dcd70c32180 309 // So, set a near-recent date in 2012
TickTock 1:9dcd70c32180 310
TickTock 1:9dcd70c32180 311 // enter people-values here
TickTock 2:71b1999a8ea5 312 t.tm_year = 2013 ; // 28 May 2012
TickTock 2:71b1999a8ea5 313 t.tm_mon = 3 ; // 1 to 12
TickTock 2:71b1999a8ea5 314 t.tm_mday = 5;
TickTock 1:9dcd70c32180 315 t.tm_hour = 12; // 12:59:56 PM (after noon)
TickTock 1:9dcd70c32180 316 t.tm_min = 59;
TickTock 1:9dcd70c32180 317 t.tm_sec = 56;
TickTock 1:9dcd70c32180 318
TickTock 1:9dcd70c32180 319 // adjust for tm structure required values
TickTock 1:9dcd70c32180 320 t.tm_year = t.tm_year - 1900;
TickTock 1:9dcd70c32180 321 t.tm_mon = t.tm_mon - 1;
TickTock 1:9dcd70c32180 322
TickTock 1:9dcd70c32180 323 // set the RTC
TickTock 1:9dcd70c32180 324 set_time(mktime(&t));
TickTock 1:9dcd70c32180 325 seconds = time(NULL);
TickTock 1:9dcd70c32180 326
TickTock 1:9dcd70c32180 327 // printf("Set RTC to:\n" );
TickTock 1:9dcd70c32180 328 // strftime(sTemp, 32, "%a %m/%d/%Y %X", localtime(&seconds));
TickTock 1:9dcd70c32180 329 // printf("%s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 0:1596b8644523 330 }
TickTock 2:71b1999a8ea5 331 while (true) {
TickTock 4:8d7759f4fe7a 332 if (!logOpen) { // Open new file if one is not already open
TickTock 4:8d7759f4fe7a 333 seconds = time(NULL);
TickTock 4:8d7759f4fe7a 334 t = *localtime(&seconds) ;
TickTock 4:8d7759f4fe7a 335 strftime(fileName, 32, "/fs/%m%d%H%M.alc", &t); //mmddhhmm.alc
TickTock 2:71b1999a8ea5 336
TickTock 4:8d7759f4fe7a 337 tt.set_display(0); // select left display
TickTock 4:8d7759f4fe7a 338 tt.locate(0,0);
TickTock 4:8d7759f4fe7a 339 tt.foreground(Cyan); // set chars to Cyan
TickTock 4:8d7759f4fe7a 340 //printf("Using file %s\n",fileName);
TickTock 4:8d7759f4fe7a 341 sprintf(sTemp,"Using file %s\n",fileName);
TickTock 4:8d7759f4fe7a 342 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 343 file = fopen(fileName, "ab");
TickTock 4:8d7759f4fe7a 344
TickTock 4:8d7759f4fe7a 345 if(file==NULL){
TickTock 4:8d7759f4fe7a 346 sprintf(sTemp,"\nUnable to open %s\n\n\n\n",fileName);
TickTock 4:8d7759f4fe7a 347 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 348 } else {
TickTock 4:8d7759f4fe7a 349 logOpen = true;
TickTock 4:8d7759f4fe7a 350 readPointer=writePointer;
TickTock 4:8d7759f4fe7a 351 sprintf(sTemp,"Starting Can Log %s\n",fileName);
TickTock 4:8d7759f4fe7a 352 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 353 logTS();
TickTock 4:8d7759f4fe7a 354 fclose(file);
TickTock 4:8d7759f4fe7a 355 file = fopen("/fs/loglog.txt", "a");
TickTock 4:8d7759f4fe7a 356 fprintf(file,"%s\r\n",fileName);
TickTock 4:8d7759f4fe7a 357 fclose(file);
TickTock 4:8d7759f4fe7a 358 }
TickTock 4:8d7759f4fe7a 359 } else { // if (!logOpen)
TickTock 4:8d7759f4fe7a 360 if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen/2)||canIdle) {
TickTock 4:8d7759f4fe7a 361 // Dump buffer if > 1/2 full, canbus has stopped, or PB1 pressed
TickTock 4:8d7759f4fe7a 362 if (logOpen) {
TickTock 4:8d7759f4fe7a 363 file = fopen(fileName, "ab");
TickTock 4:8d7759f4fe7a 364 if (file == NULL) {
TickTock 4:8d7759f4fe7a 365 logOpen = false;
TickTock 4:8d7759f4fe7a 366 sprintf(sTemp,"Failed to append log file.\n\n");
TickTock 4:8d7759f4fe7a 367 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 368 } else {
TickTock 4:8d7759f4fe7a 369 while (readPointer != writePointer) {
TickTock 4:8d7759f4fe7a 370 for (j = 0; j<13; j++){
TickTock 4:8d7759f4fe7a 371 fprintf(file,"%c",writeBuffer[readPointer][j]);
TickTock 4:8d7759f4fe7a 372 }
TickTock 4:8d7759f4fe7a 373 if(++readPointer >= maxBufLen)
TickTock 4:8d7759f4fe7a 374 readPointer=0;
TickTock 4:8d7759f4fe7a 375 }
TickTock 4:8d7759f4fe7a 376 led3 = !led3;
TickTock 4:8d7759f4fe7a 377 fclose(file);
TickTock 4:8d7759f4fe7a 378 }
TickTock 4:8d7759f4fe7a 379 } // if (logOpen)
TickTock 4:8d7759f4fe7a 380 } // if > 1/2 full, canbus has stopped, or PB1 pressed
TickTock 4:8d7759f4fe7a 381 } // if logOpen
TickTock 4:8d7759f4fe7a 382 if (canIdle&&userIdle) { // canbus idle --> sleep to save power
TickTock 4:8d7759f4fe7a 383 if (logOpen){
TickTock 4:8d7759f4fe7a 384 // First take advantage of the idle time to clear some room
TickTock 4:8d7759f4fe7a 385 bit = false;
TickTock 4:8d7759f4fe7a 386 rfile = fopen("/fs/loglog.txt", "r");
TickTock 4:8d7759f4fe7a 387 file = fopen("/fs/loglog.new", "w");
TickTock 4:8d7759f4fe7a 388 while (!feof(rfile)) {
TickTock 4:8d7759f4fe7a 389 fscanf(rfile,"/fs/%2d%2d%4d.alc\r\n",&fmon,&fday,&ftime);
TickTock 4:8d7759f4fe7a 390 //if ((fmon<t.tm_mon)&&(fday<=t.tm_mday)){ // Delete all files more than 1 month old
TickTock 4:8d7759f4fe7a 391 if ((fmon < 12) || (t.tm_mon > 1)){
TickTock 4:8d7759f4fe7a 392 fday = fday + fmon*31; //crude - february will store 3 extra days of data
TickTock 4:8d7759f4fe7a 393 }
TickTock 4:8d7759f4fe7a 394 if ((fday+14)<(t.tm_mday+t.tm_mon*31)){ // Delete all files more than ~14 days old
TickTock 4:8d7759f4fe7a 395 bit=true;
TickTock 4:8d7759f4fe7a 396 sprintf(sTemp,"/fs/%02d%02d%04d.alc",fmon,fday,ftime);
TickTock 4:8d7759f4fe7a 397 if ((remove(sTemp)==NULL)) {
TickTock 4:8d7759f4fe7a 398 sprintf(sTemp,"Removed file %s\n",sTemp);
TickTock 4:8d7759f4fe7a 399 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 400 }
TickTock 4:8d7759f4fe7a 401 }else{
TickTock 4:8d7759f4fe7a 402 fprintf(file,"/fs/%02d%02d%04d.alc\r\n",fmon,fday,ftime);
TickTock 4:8d7759f4fe7a 403 }
TickTock 2:71b1999a8ea5 404 }
TickTock 4:8d7759f4fe7a 405 fclose (file);
TickTock 4:8d7759f4fe7a 406 fclose (rfile);
TickTock 4:8d7759f4fe7a 407 if (bit) {
TickTock 4:8d7759f4fe7a 408 remove ("/fs/loglog.txt");
TickTock 4:8d7759f4fe7a 409 //rename not working so do it the hard way
TickTock 4:8d7759f4fe7a 410 //rename ("/fs/loglog.new","/fs/loglog.txt");
TickTock 4:8d7759f4fe7a 411 rfile = fopen("/fs/loglog.new", "r");
TickTock 4:8d7759f4fe7a 412 file = fopen("/fs/loglog.txt", "w");
TickTock 2:71b1999a8ea5 413 while (!feof(rfile)) {
TickTock 4:8d7759f4fe7a 414 fscanf(rfile,"%s\r\n",&sTemp);
TickTock 4:8d7759f4fe7a 415 fprintf(file,"%s\r\n",sTemp);
TickTock 2:71b1999a8ea5 416 }
TickTock 2:71b1999a8ea5 417 fclose (file);
TickTock 2:71b1999a8ea5 418 fclose (rfile);
TickTock 4:8d7759f4fe7a 419 }
TickTock 4:8d7759f4fe7a 420 remove ("/fs/loglog.new");
TickTock 4:8d7759f4fe7a 421 wait(5); // wait a few seconds to ensure fsRAM is done
TickTock 4:8d7759f4fe7a 422 } // if (logOpen)
TickTock 4:8d7759f4fe7a 423 sprintf(sTemp,"Putting uC to sleep.\n");
TickTock 4:8d7759f4fe7a 424 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 425 //LPC_RTC->CIIR=0x00; // block RTC interrupts
TickTock 4:8d7759f4fe7a 426 led1=0;
TickTock 4:8d7759f4fe7a 427 led2=0;
TickTock 4:8d7759f4fe7a 428 led3=0;
TickTock 4:8d7759f4fe7a 429 led4=0;
TickTock 4:8d7759f4fe7a 430 dled=0; // turn off display
TickTock 4:8d7759f4fe7a 431 secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 4:8d7759f4fe7a 432 while (secsNoMsg>canTimeout && secsNoTouch>userTimeout) {
TickTock 4:8d7759f4fe7a 433 //DeepPowerDown();
TickTock 4:8d7759f4fe7a 434 tt.wfi(); //enable touchpad input
TickTock 4:8d7759f4fe7a 435 //__wfi(); // freeze CPU and wait for interrupt (from canbus or touch)
TickTock 4:8d7759f4fe7a 436 Sleep();
TickTock 4:8d7759f4fe7a 437 //DeepPowerDown();
TickTock 4:8d7759f4fe7a 438 }
TickTock 4:8d7759f4fe7a 439 canIdle=secsNoMsg>canTimeout;
TickTock 4:8d7759f4fe7a 440 userIdle=userIdle>userTimeout;
TickTock 4:8d7759f4fe7a 441 dled=1; // turn on display LED
TickTock 4:8d7759f4fe7a 442 sprintf(sTemp,"Waking uC.\n");
TickTock 4:8d7759f4fe7a 443 logMsg(sTemp);
TickTock 4:8d7759f4fe7a 444 if (time(NULL)>(secs+1800)) {
TickTock 4:8d7759f4fe7a 445 logOpen = false; // Start new file if asleep for more than 30 minutes
TickTock 4:8d7759f4fe7a 446 if (secsNoTouch>100) secsNoTouch = 100; // also mostly reset user Idle counter
TickTock 4:8d7759f4fe7a 447 } else { // insert timestamp on each wake
TickTock 4:8d7759f4fe7a 448 logTS();
TickTock 4:8d7759f4fe7a 449 }
TickTock 4:8d7759f4fe7a 450 //LPC_RTC->CIIR=0x01; // re-enable RTC interrupts
TickTock 4:8d7759f4fe7a 451 } // if idle
TickTock 4:8d7759f4fe7a 452
TickTock 4:8d7759f4fe7a 453 if (!userIdle) {
TickTock 4:8d7759f4fe7a 454 if (secsNoTouch<2) {// Recently touched
TickTock 4:8d7759f4fe7a 455 secsNoTouch +=2; // increment to prevent double touch
TickTock 4:8d7759f4fe7a 456 sMode=1;
TickTock 4:8d7759f4fe7a 457 if (lastTouch.x>320){
TickTock 4:8d7759f4fe7a 458 i=1;
TickTock 4:8d7759f4fe7a 459 lastTouch.x-=320;
TickTock 4:8d7759f4fe7a 460 } else {
TickTock 4:8d7759f4fe7a 461 i=0;
TickTock 4:8d7759f4fe7a 462 }
TickTock 4:8d7759f4fe7a 463 if (lastTouch.y>btn11y1 && lastTouch.y<btn11y2){
TickTock 4:8d7759f4fe7a 464 if (lastTouch.x>btn31x1 && lastTouch.x<btn31x2) {
TickTock 4:8d7759f4fe7a 465 dMode[i]=dMode[i]>0?dMode[i]-1:maxModes;
TickTock 4:8d7759f4fe7a 466 } else if (lastTouch.x>btn33x1 && lastTouch.x<btn33x2) {
TickTock 4:8d7759f4fe7a 467 dMode[i]=dMode[i]<maxModes?dMode[i]+1:0;
TickTock 2:71b1999a8ea5 468 }
TickTock 4:8d7759f4fe7a 469 } else {
TickTock 4:8d7759f4fe7a 470 sprintf(sTemp,"missed button\n");
TickTock 4:8d7759f4fe7a 471 logMsg(sTemp);
TickTock 2:71b1999a8ea5 472 }
TickTock 4:8d7759f4fe7a 473 }
TickTock 4:8d7759f4fe7a 474 } else { // userIdle
TickTock 4:8d7759f4fe7a 475 sMode=0;
TickTock 4:8d7759f4fe7a 476 }
TickTock 4:8d7759f4fe7a 477
TickTock 4:8d7759f4fe7a 478 wait(0.1); // We get >2K messages per second
TickTock 2:71b1999a8ea5 479 } //while (true)
TickTock 0:1596b8644523 480 }