Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Mon Feb 11 02:22:04 2013 +0000
Revision:
2:71b1999a8ea5
Parent:
1:9dcd70c32180
Child:
3:3e879b043bc5
Logging to USB working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 1:9dcd70c32180 1 //CANary.cpp
TickTock 1:9dcd70c32180 2
TickTock 1:9dcd70c32180 3 //LEAF OBD
TickTock 1:9dcd70c32180 4 //1:
TickTock 1:9dcd70c32180 5 //2:
TickTock 1:9dcd70c32180 6 //3: AVCAN-L White/Blue
TickTock 1:9dcd70c32180 7 //4:
TickTock 1:9dcd70c32180 8 //5: VSS Brown,White/Brown
TickTock 1:9dcd70c32180 9 //6: CARCAN-H Green
TickTock 1:9dcd70c32180 10 //7:
TickTock 1:9dcd70c32180 11 //8: 12V-SW Orange,White/Orange
TickTock 1:9dcd70c32180 12 //9:
TickTock 1:9dcd70c32180 13 //10:
TickTock 1:9dcd70c32180 14 //11: AVCAN-H Blue
TickTock 1:9dcd70c32180 15 //12: EVCAN-L White/Grey
TickTock 1:9dcd70c32180 16 //13: EVCAN-H Grey
TickTock 1:9dcd70c32180 17 //14: CARCAN-L White/Green
TickTock 1:9dcd70c32180 18 //15:
TickTock 1:9dcd70c32180 19 //16: 12V-AON Red/Blue,Blue/Red
TickTock 0:1596b8644523 20
TickTock 0:1596b8644523 21 //VP230
TickTock 1:9dcd70c32180 22 //1:D
TickTock 1:9dcd70c32180 23 //2:GND
TickTock 1:9dcd70c32180 24 //3:VCC
TickTock 1:9dcd70c32180 25 //4:R
TickTock 1:9dcd70c32180 26 //5:Vref
TickTock 1:9dcd70c32180 27 //6:CANL
TickTock 1:9dcd70c32180 28 //7:CANH
TickTock 1:9dcd70c32180 29 //8:RS
TickTock 0:1596b8644523 30
TickTock 0:1596b8644523 31 //LPC1768
TickTock 0:1596b8644523 32 //1: VSS
TickTock 1:9dcd70c32180 33 //2: NC:VIN (4.5-9V supply)
TickTock 0:1596b8644523 34 //3: NC:VB
TickTock 0:1596b8644523 35 //4: NC:nR
TickTock 1:9dcd70c32180 36 //5: SPI:CS0
TickTock 1:9dcd70c32180 37 //6: SPI:CS1
TickTock 1:9dcd70c32180 38 //7: SPI:Reset
TickTock 1:9dcd70c32180 39 //8: CAN1:Sleep --> 8:CAN1:RS
TickTock 1:9dcd70c32180 40 //9: CAN1:RX --> 4:CAN1:R
TickTock 1:9dcd70c32180 41 //10: CAN1:TX --> 1:CAN1:D
TickTock 1:9dcd70c32180 42 //11: SPI:MOSI
TickTock 1:9dcd70c32180 43 //12: SPI:MISO
TickTock 1:9dcd70c32180 44 //13: SPI:SCLK
TickTock 1:9dcd70c32180 45 //14: NC:Ain
TickTock 1:9dcd70c32180 46 //15: MON12V --> 4K to 12V, 1K to VSS (To be implemented)
TickTock 1:9dcd70c32180 47 //16: TOUCH_X+
TickTock 1:9dcd70c32180 48 //17: TOUCH_X-
TickTock 1:9dcd70c32180 49 //18: NC:Aout
TickTock 1:9dcd70c32180 50 //19: TOUCH_Y+
TickTock 1:9dcd70c32180 51 //20: TOUCH_Y-
TickTock 0:1596b8644523 52 //21: Spkr+
TickTock 1:9dcd70c32180 53 //22: Spkr- (optional complimentary output for more volume)
TickTock 0:1596b8644523 54 //23: NC:pwm
TickTock 1:9dcd70c32180 55 //24: LED
TickTock 0:1596b8644523 56 //25: NC:pwm
TickTock 0:1596b8644523 57 //26: NC:pwm
TickTock 1:9dcd70c32180 58 //27: NC
TickTock 0:1596b8644523 59 //28: CAN2:Sleep --> 8:CAN2:RS
TickTock 1:9dcd70c32180 60 //29: CAN2:TX --> 1:CAN2:D
TickTock 1:9dcd70c32180 61 //30: CAN2:RX --> 4:CAN2:R
TickTock 1:9dcd70c32180 62 //31: USB_D+
TickTock 1:9dcd70c32180 63 //32: USB_D-
TickTock 0:1596b8644523 64 //33: NC:Eth_TD+
TickTock 0:1596b8644523 65 //34: NC:Eth_TD-
TickTock 0:1596b8644523 66 //35: NC:Eth_RD+
TickTock 0:1596b8644523 67 //36: NC:Eth_RD-
TickTock 0:1596b8644523 68 //37: NC:IF+
TickTock 0:1596b8644523 69 //38: NC:IF-
TickTock 1:9dcd70c32180 70 //39: NC:5Vout (only available when connected as USB device)
TickTock 0:1596b8644523 71 //40: VCC3.3
TickTock 2:71b1999a8ea5 72 #include "mbed.h"
TickTock 2:71b1999a8ea5 73 #include "CAN.h"
TickTock 2:71b1999a8ea5 74 #include "beep.h"
TickTock 2:71b1999a8ea5 75 #include "MSCFileSystem.h"
TickTock 2:71b1999a8ea5 76 #include "SPI_TFTx2.h"
TickTock 2:71b1999a8ea5 77 #include "Arial12x12.h"
TickTock 2:71b1999a8ea5 78 #include "Arial28x28.h"
TickTock 2:71b1999a8ea5 79 #include "TOUCH_TFTx2.h"
TickTock 2:71b1999a8ea5 80 #define upLine "\033[1A"
TickTock 2:71b1999a8ea5 81 #define maxBufLen 2048
TickTock 2:71b1999a8ea5 82 #define canTimeout 5
TickTock 2:71b1999a8ea5 83
TickTock 2:71b1999a8ea5 84 // write and read the Mode Data
TickTock 2:71b1999a8ea5 85 LocalFileSystem local("local"); // test the local file system to write files
TickTock 2:71b1999a8ea5 86
TickTock 2:71b1999a8ea5 87 // to write to USB Flash Drives, or equivalent (SD card in Reader/Writer)
TickTock 2:71b1999a8ea5 88 MSCFileSystem fs("fs"); // to write to a USB Flash Drive
TickTock 2:71b1999a8ea5 89
TickTock 2:71b1999a8ea5 90 void Log (char *message);
TickTock 2:71b1999a8ea5 91 void LogErr (char *message);
TickTock 2:71b1999a8ea5 92 extern "C" void mbed_reset();
TickTock 0:1596b8644523 93
TickTock 1:9dcd70c32180 94 time_t seconds ;
TickTock 0:1596b8644523 95 Beep buzzer(p21);
TickTock 1:9dcd70c32180 96
TickTock 0:1596b8644523 97 Ticker ticker;
TickTock 1:9dcd70c32180 98 Timer timer;
TickTock 0:1596b8644523 99 DigitalOut led1(LED1);
TickTock 0:1596b8644523 100 DigitalOut led2(LED2);
TickTock 0:1596b8644523 101 DigitalOut led3(LED3);
TickTock 0:1596b8644523 102 DigitalOut led4(LED4);
TickTock 1:9dcd70c32180 103 CAN can1(p9, p10); // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
TickTock 1:9dcd70c32180 104 DigitalOut can1_SleepMode(p8); // Use pin 8 to control the sleep mode of can1
TickTock 1:9dcd70c32180 105 CAN can2(p30, p29); // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
TickTock 1:9dcd70c32180 106 DigitalOut can2_SleepMode(p28); // Use pin 28 to control the sleep mode of can2
TickTock 2:71b1999a8ea5 107 bool logOpen = false;
TickTock 2:71b1999a8ea5 108 FILE *rfile;
TickTock 2:71b1999a8ea5 109 FILE *file;
TickTock 2:71b1999a8ea5 110 char fileName[35] = "" ;
TickTock 2:71b1999a8ea5 111 char writeBuffer[maxBufLen][13];
TickTock 2:71b1999a8ea5 112 char c;
TickTock 2:71b1999a8ea5 113 volatile int writePointer = 0;
TickTock 2:71b1999a8ea5 114 volatile int secsIdle = 0;
TickTock 2:71b1999a8ea5 115 volatile bool canIdle = false;
TickTock 0:1596b8644523 116
TickTock 0:1596b8644523 117 char counter = 0;
TickTock 1:9dcd70c32180 118
TickTock 1:9dcd70c32180 119 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 120
TickTock 2:71b1999a8ea5 121 extern "C" void RTC_IRQHandler() {
TickTock 2:71b1999a8ea5 122 timer.reset(); // zero ms at the-seconds-tic
TickTock 2:71b1999a8ea5 123 canIdle=(++secsIdle>canTimeout);
TickTock 2:71b1999a8ea5 124 LPC_RTC->ILR |= (1<<0); // clear interrupt to prepare for next
TickTock 1:9dcd70c32180 125 }
TickTock 1:9dcd70c32180 126
TickTock 2:71b1999a8ea5 127 extern "C" void RTC_Init (void) {
TickTock 2:71b1999a8ea5 128 LPC_RTC->ILR=0x00; // set up the RTC interrupts
TickTock 2:71b1999a8ea5 129 LPC_RTC->CIIR=0x01; // interrupts each second
TickTock 2:71b1999a8ea5 130 LPC_RTC->CCR = 0x01; // Clock enable
TickTock 2:71b1999a8ea5 131 //NVIC_SetPriority( RTC_IRQn, 10 );
TickTock 1:9dcd70c32180 132 NVIC_EnableIRQ( RTC_IRQn );
TickTock 1:9dcd70c32180 133 }
TickTock 1:9dcd70c32180 134
TickTock 2:71b1999a8ea5 135 unsigned short getTimeStamp() {
TickTock 2:71b1999a8ea5 136 int msec = timer.read_ms() ; // read ms from the timer
TickTock 2:71b1999a8ea5 137 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 138 int isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC
TickTock 2:71b1999a8ea5 139 return ((isecs<<10)+msec) ; // return the two byte time stamp
TickTock 2:71b1999a8ea5 140 }
TickTock 2:71b1999a8ea5 141
TickTock 2:71b1999a8ea5 142 void readLog (){
TickTock 1:9dcd70c32180 143 unsigned char c;
TickTock 1:9dcd70c32180 144 int i=0;
TickTock 2:71b1999a8ea5 145 char lastMsgNum[]={0,0};
TickTock 2:71b1999a8ea5 146 char curMsgNum[]={0,0};
TickTock 2:71b1999a8ea5 147 char canNum=0;
TickTock 1:9dcd70c32180 148 printf("printing file\n");
TickTock 2:71b1999a8ea5 149 file = fopen(fileName, "r");
TickTock 2:71b1999a8ea5 150 if (file == NULL) {
TickTock 1:9dcd70c32180 151 printf("no file found\n");
TickTock 2:71b1999a8ea5 152 }
TickTock 2:71b1999a8ea5 153 while (!feof(file)) {
TickTock 2:71b1999a8ea5 154 c=fgetc(file);
TickTock 2:71b1999a8ea5 155 printf("%02x ",c);
TickTock 2:71b1999a8ea5 156 if (i==0){
TickTock 2:71b1999a8ea5 157 canNum=c;
TickTock 2:71b1999a8ea5 158 }else if (i==5){
TickTock 2:71b1999a8ea5 159 curMsgNum[canNum]=c;
TickTock 1:9dcd70c32180 160 }
TickTock 2:71b1999a8ea5 161 if (++i>12) {
TickTock 2:71b1999a8ea5 162 if (curMsgNum[canNum]>(lastMsgNum[canNum]+1)) {
TickTock 2:71b1999a8ea5 163 printf(" ***");
TickTock 2:71b1999a8ea5 164 }
TickTock 2:71b1999a8ea5 165 lastMsgNum[canNum]=curMsgNum[canNum];
TickTock 1:9dcd70c32180 166 printf("\n");
TickTock 1:9dcd70c32180 167 i=0;
TickTock 1:9dcd70c32180 168 }
TickTock 2:71b1999a8ea5 169 }
TickTock 2:71b1999a8ea5 170 printf("\n\n");
TickTock 2:71b1999a8ea5 171 fclose(file);
TickTock 1:9dcd70c32180 172 }
TickTock 1:9dcd70c32180 173
TickTock 2:71b1999a8ea5 174 void logCan (char mtype, CANMessage canRXmsg) {
TickTock 2:71b1999a8ea5 175 unsigned short ts = getTimeStamp();
TickTock 2:71b1999a8ea5 176 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 177 if(canRXmsg.id>0) {
TickTock 2:71b1999a8ea5 178 writeBuffer[writePointer][0]=mtype;
TickTock 2:71b1999a8ea5 179 writeBuffer[writePointer][1]=((secs%60)<<2)+((ts&0x300)>>8);
TickTock 2:71b1999a8ea5 180 writeBuffer[writePointer][2]=ts&0xff;
TickTock 2:71b1999a8ea5 181 writeBuffer[writePointer][3]=canRXmsg.id&0xff;
TickTock 2:71b1999a8ea5 182 writeBuffer[writePointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
TickTock 2:71b1999a8ea5 183 for (int i = 5; i<13; i++){
TickTock 2:71b1999a8ea5 184 writeBuffer[writePointer][i]=canRXmsg.data[i-5];
TickTock 2:71b1999a8ea5 185 }
TickTock 2:71b1999a8ea5 186 if (++writePointer >= maxBufLen) {
TickTock 2:71b1999a8ea5 187 writePointer = 0;
TickTock 2:71b1999a8ea5 188 led4 = !led4;
TickTock 2:71b1999a8ea5 189 }
TickTock 1:9dcd70c32180 190 }
TickTock 1:9dcd70c32180 191 }
TickTock 0:1596b8644523 192
TickTock 2:71b1999a8ea5 193 void logTS () {
TickTock 2:71b1999a8ea5 194 CANMessage tsMsg;
TickTock 2:71b1999a8ea5 195 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 196 tsMsg.id=0xfff;
TickTock 2:71b1999a8ea5 197 tsMsg.len=0xf;
TickTock 2:71b1999a8ea5 198 tsMsg.data[0]=secs&0xff;
TickTock 2:71b1999a8ea5 199 tsMsg.data[1]=(secs>>8)&0xff;
TickTock 2:71b1999a8ea5 200 tsMsg.data[2]=(secs>>16)&0xff;
TickTock 2:71b1999a8ea5 201 tsMsg.data[3]=secs>>24;
TickTock 2:71b1999a8ea5 202 tsMsg.data[4]=0xff;
TickTock 2:71b1999a8ea5 203 tsMsg.data[5]=0xff;
TickTock 2:71b1999a8ea5 204 tsMsg.data[6]=0xff;
TickTock 2:71b1999a8ea5 205 tsMsg.data[7]=0xff;
TickTock 2:71b1999a8ea5 206 logCan(0,tsMsg);
TickTock 1:9dcd70c32180 207 }
TickTock 0:1596b8644523 208
TickTock 1:9dcd70c32180 209 void send1() {
TickTock 1:9dcd70c32180 210 static char counter = 0; // use for fake data
TickTock 1:9dcd70c32180 211
TickTock 1:9dcd70c32180 212 can1.write(CANMessage(0x350, &counter, 1));
TickTock 1:9dcd70c32180 213 counter++;
TickTock 1:9dcd70c32180 214 // test sending 3 quickly
TickTock 1:9dcd70c32180 215 //can1.write(CANMessage(0x351, &counter, 1));
TickTock 1:9dcd70c32180 216 //can1.write(CANMessage(0x352, &counter, 1));
TickTock 2:71b1999a8ea5 217 printf("Sending message %d \n",counter);
TickTock 1:9dcd70c32180 218
TickTock 0:1596b8644523 219 }
TickTock 0:1596b8644523 220
TickTock 0:1596b8644523 221
TickTock 0:1596b8644523 222 void recieve1() {
TickTock 2:71b1999a8ea5 223 CANMessage msg1;
TickTock 2:71b1999a8ea5 224 secsIdle=0; // reset deadman switch
TickTock 0:1596b8644523 225 can1.read(msg1);
TickTock 2:71b1999a8ea5 226 //printf("Can1 rxd: %d\n", msg1.data[0]);
TickTock 2:71b1999a8ea5 227 if(logOpen)
TickTock 2:71b1999a8ea5 228 logCan(2, msg1);
TickTock 2:71b1999a8ea5 229 led1 = !led1;
TickTock 0:1596b8644523 230 }
TickTock 2:71b1999a8ea5 231
TickTock 0:1596b8644523 232 void recieve2() {
TickTock 2:71b1999a8ea5 233 CANMessage msg2;
TickTock 2:71b1999a8ea5 234 secsIdle=0; // reset deadman switch
TickTock 0:1596b8644523 235 can2.read(msg2);
TickTock 2:71b1999a8ea5 236 //printf("Can2 rxd: %d\n", msg2.data[0]);
TickTock 2:71b1999a8ea5 237 if(logOpen)
TickTock 2:71b1999a8ea5 238 logCan(1, msg2);
TickTock 2:71b1999a8ea5 239 led2 = !led2;
TickTock 0:1596b8644523 240 }
TickTock 0:1596b8644523 241
TickTock 0:1596b8644523 242 int main() {
TickTock 2:71b1999a8ea5 243 int readPointer=0;
TickTock 2:71b1999a8ea5 244 int fmon;
TickTock 2:71b1999a8ea5 245 int fday;
TickTock 2:71b1999a8ea5 246 int ftime;
TickTock 2:71b1999a8ea5 247 char sTemp[35];
TickTock 2:71b1999a8ea5 248 unsigned long secs;
TickTock 2:71b1999a8ea5 249 bool bit = false;
TickTock 2:71b1999a8ea5 250 can1.frequency(500000);
TickTock 2:71b1999a8ea5 251 can2.frequency(500000);
TickTock 1:9dcd70c32180 252 //can1_SleepMode = 0; // Enable TX
TickTock 1:9dcd70c32180 253 //can2_SleepMode = 0; // Enable TX
TickTock 1:9dcd70c32180 254 can1_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 1:9dcd70c32180 255 can2_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 2:71b1999a8ea5 256 //ticker.attach(&send1, 0.5);
TickTock 0:1596b8644523 257 can1.attach(&recieve1);
TickTock 0:1596b8644523 258 can2.attach(&recieve2);
TickTock 1:9dcd70c32180 259 tt.set_display(2); // select both displays
TickTock 1:9dcd70c32180 260 tt.background(Black); // set background to black
TickTock 1:9dcd70c32180 261 tt.foreground(White); // set chars to white
TickTock 1:9dcd70c32180 262 tt.cls(); // clear the screen
TickTock 1:9dcd70c32180 263 tt.set_font((unsigned char*) Arial12x12); // select the font
TickTock 1:9dcd70c32180 264 tt.set_orientation(1);
TickTock 2:71b1999a8ea5 265 tt.set_display(1); // select left display
TickTock 1:9dcd70c32180 266
TickTock 2:71b1999a8ea5 267 //tt.calibrate(); // calibrate the touch
TickTock 1:9dcd70c32180 268 tt.claim(stdout); // send stdout to the TFT display
TickTock 2:71b1999a8ea5 269 timer.start() ;
TickTock 2:71b1999a8ea5 270 RTC_Init(); // start the RTC Interrupts that sync the timer
TickTock 1:9dcd70c32180 271 struct tm t; // pointer to a static tm structure
TickTock 1:9dcd70c32180 272
TickTock 1:9dcd70c32180 273 seconds = time(NULL);
TickTock 1:9dcd70c32180 274 t = *localtime(&seconds) ;
TickTock 2:71b1999a8ea5 275 strftime(sTemp, 32, "%a %m/%d/%Y %X", &t);
TickTock 2:71b1999a8ea5 276 tt.locate(0,0);
TickTock 2:71b1999a8ea5 277 printf("\nCurrent time : %s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 2:71b1999a8ea5 278 tt.set_display(1); // select right display
TickTock 2:71b1999a8ea5 279 tt.locate(0,0);
TickTock 1:9dcd70c32180 280
TickTock 1:9dcd70c32180 281 // is it a date before 2012 ?
TickTock 1:9dcd70c32180 282 if ((t.tm_year + 1900) < 2012 ) {
TickTock 1:9dcd70c32180 283 // before 2012, so the RTC probably lost power
TickTock 1:9dcd70c32180 284 // So, set a near-recent date in 2012
TickTock 1:9dcd70c32180 285
TickTock 1:9dcd70c32180 286 // enter people-values here
TickTock 2:71b1999a8ea5 287 t.tm_year = 2013 ; // 28 May 2012
TickTock 2:71b1999a8ea5 288 t.tm_mon = 3 ; // 1 to 12
TickTock 2:71b1999a8ea5 289 t.tm_mday = 5;
TickTock 1:9dcd70c32180 290 t.tm_hour = 12; // 12:59:56 PM (after noon)
TickTock 1:9dcd70c32180 291 t.tm_min = 59;
TickTock 1:9dcd70c32180 292 t.tm_sec = 56;
TickTock 1:9dcd70c32180 293
TickTock 1:9dcd70c32180 294 // adjust for tm structure required values
TickTock 1:9dcd70c32180 295 t.tm_year = t.tm_year - 1900;
TickTock 1:9dcd70c32180 296 t.tm_mon = t.tm_mon - 1;
TickTock 1:9dcd70c32180 297
TickTock 1:9dcd70c32180 298 // set the RTC
TickTock 1:9dcd70c32180 299 set_time(mktime(&t));
TickTock 1:9dcd70c32180 300 seconds = time(NULL);
TickTock 1:9dcd70c32180 301
TickTock 1:9dcd70c32180 302 // printf("Set RTC to:\n" );
TickTock 1:9dcd70c32180 303 // strftime(sTemp, 32, "%a %m/%d/%Y %X", localtime(&seconds));
TickTock 1:9dcd70c32180 304 // printf("%s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 0:1596b8644523 305 }
TickTock 2:71b1999a8ea5 306 while (true) {
TickTock 2:71b1999a8ea5 307 if(1 == 1) {
TickTock 2:71b1999a8ea5 308 if (!logOpen) { // Open new file if one is not already open
TickTock 2:71b1999a8ea5 309 seconds = time(NULL);
TickTock 2:71b1999a8ea5 310 t = *localtime(&seconds) ;
TickTock 2:71b1999a8ea5 311 strftime(fileName, 32, "/fs/%m%d%H%M.alc", &t); //mmddhhmm.alc
TickTock 2:71b1999a8ea5 312
TickTock 2:71b1999a8ea5 313 printf("Using file %s\n",fileName);
TickTock 2:71b1999a8ea5 314 file = fopen(fileName, "ab");
TickTock 2:71b1999a8ea5 315
TickTock 2:71b1999a8ea5 316 if(file==NULL){
TickTock 2:71b1999a8ea5 317 printf("\nUnable to open %s\n\n\n\n",fileName);
TickTock 2:71b1999a8ea5 318 wait(10);
TickTock 2:71b1999a8ea5 319 mbed_reset();
TickTock 2:71b1999a8ea5 320 } else {
TickTock 2:71b1999a8ea5 321 logOpen = true;
TickTock 2:71b1999a8ea5 322 readPointer=writePointer;
TickTock 2:71b1999a8ea5 323 printf("\nStarting Can Log %s\n",fileName);
TickTock 2:71b1999a8ea5 324 logTS();
TickTock 2:71b1999a8ea5 325 fclose(file);
TickTock 2:71b1999a8ea5 326 file = fopen("/fs/loglog.txt", "a");
TickTock 2:71b1999a8ea5 327 fprintf(file,"%s\r\n",fileName);
TickTock 2:71b1999a8ea5 328 fclose(file);
TickTock 2:71b1999a8ea5 329 }
TickTock 2:71b1999a8ea5 330 } // if (!logOpen)
TickTock 2:71b1999a8ea5 331 do {
TickTock 2:71b1999a8ea5 332 if (((writePointer+maxBufLen-readPointer)%maxBufLen)>(maxBufLen/2)||canIdle) {
TickTock 2:71b1999a8ea5 333 // Dump buffer if > 1/2 full, canbus has stopped, or PB1 pressed
TickTock 2:71b1999a8ea5 334 if (logOpen) {
TickTock 2:71b1999a8ea5 335 file = fopen(fileName, "ab");
TickTock 2:71b1999a8ea5 336 if (file == NULL) {
TickTock 2:71b1999a8ea5 337 logOpen = false;
TickTock 2:71b1999a8ea5 338 printf("Failed to append log file.\n\n");
TickTock 2:71b1999a8ea5 339 } else {
TickTock 2:71b1999a8ea5 340 while (readPointer != writePointer) {
TickTock 2:71b1999a8ea5 341 for (int j = 0; j<13; j++){
TickTock 2:71b1999a8ea5 342 fprintf(file,"%c",writeBuffer[readPointer][j]);
TickTock 2:71b1999a8ea5 343 }
TickTock 2:71b1999a8ea5 344 if(++readPointer >= maxBufLen)
TickTock 2:71b1999a8ea5 345 readPointer=0;
TickTock 2:71b1999a8ea5 346 }
TickTock 2:71b1999a8ea5 347 led3 = !led3;
TickTock 2:71b1999a8ea5 348 fclose(file);
TickTock 2:71b1999a8ea5 349 }
TickTock 2:71b1999a8ea5 350 } // if (logOpen)
TickTock 2:71b1999a8ea5 351 } // if > 1/2 full, canbus has stopped, or PB1 pressed
TickTock 2:71b1999a8ea5 352 if (canIdle) { // canbus idle --> sleep to save power
TickTock 2:71b1999a8ea5 353 // First take advantage of the idle time to clear some room
TickTock 2:71b1999a8ea5 354
TickTock 2:71b1999a8ea5 355 bit = false;
TickTock 2:71b1999a8ea5 356 rfile = fopen("/fs/loglog.txt", "r");
TickTock 2:71b1999a8ea5 357 file = fopen("/fs/loglog.new", "w");
TickTock 2:71b1999a8ea5 358 while (!feof(rfile)) {
TickTock 2:71b1999a8ea5 359 fscanf(rfile,"/fs/%2d%2d%4d.alc\r\n",&fmon,&fday,&ftime);
TickTock 2:71b1999a8ea5 360 //if ((fmon<t.tm_mon)&&(fday<=t.tm_mday)){ // Delete all files more than 1 month old
TickTock 2:71b1999a8ea5 361 if ((fmon < 12) || (t.tm_mon > 1)){
TickTock 2:71b1999a8ea5 362 fday = fday + fmon*31; //crude - february will store 3 extra days of data
TickTock 2:71b1999a8ea5 363 }
TickTock 2:71b1999a8ea5 364 if ((fday+14)<(t.tm_mday+t.tm_mon*31)){ // Delete all files more than ~14 days old
TickTock 2:71b1999a8ea5 365 bit=true;
TickTock 2:71b1999a8ea5 366 sprintf(sTemp,"/fs/%02d%02d%04d.alc",fmon,fday,ftime);
TickTock 2:71b1999a8ea5 367 if ((remove(sTemp)==NULL)) {
TickTock 2:71b1999a8ea5 368 printf("Removed file %s\n",sTemp);
TickTock 2:71b1999a8ea5 369 }
TickTock 2:71b1999a8ea5 370 }else{
TickTock 2:71b1999a8ea5 371 fprintf(file,"/fs/%02d%02d%04d.alc\r\n",fmon,fday,ftime);
TickTock 2:71b1999a8ea5 372 }
TickTock 2:71b1999a8ea5 373 }
TickTock 2:71b1999a8ea5 374 fclose (file);
TickTock 2:71b1999a8ea5 375 fclose (rfile);
TickTock 2:71b1999a8ea5 376 if (bit) {
TickTock 2:71b1999a8ea5 377 remove ("/fs/loglog.txt");
TickTock 2:71b1999a8ea5 378 //rename not working so do it the hard way
TickTock 2:71b1999a8ea5 379 //rename ("/fs/loglog.new","/fs/loglog.txt");
TickTock 2:71b1999a8ea5 380 rfile = fopen("/fs/loglog.new", "r");
TickTock 2:71b1999a8ea5 381 file = fopen("/fs/loglog.txt", "w");
TickTock 2:71b1999a8ea5 382 while (!feof(rfile)) {
TickTock 2:71b1999a8ea5 383 fscanf(rfile,"%s\r\n",&sTemp);
TickTock 2:71b1999a8ea5 384 fprintf(file,"%s\r\n",sTemp);
TickTock 2:71b1999a8ea5 385 }
TickTock 2:71b1999a8ea5 386 fclose (file);
TickTock 2:71b1999a8ea5 387 fclose (rfile);
TickTock 2:71b1999a8ea5 388 }
TickTock 2:71b1999a8ea5 389 remove ("/fs/loglog.new");
TickTock 2:71b1999a8ea5 390 wait(5); // wait a few seconds to ensure fsRAM is done
TickTock 2:71b1999a8ea5 391
TickTock 2:71b1999a8ea5 392 printf("Putting uC to sleep.\n");
TickTock 2:71b1999a8ea5 393 //LPC_RTC->CIIR=0x00; // block RTC interrupts
TickTock 2:71b1999a8ea5 394 led1=0;
TickTock 2:71b1999a8ea5 395 led2=0;
TickTock 2:71b1999a8ea5 396 led3=0;
TickTock 2:71b1999a8ea5 397 led4=0;
TickTock 2:71b1999a8ea5 398 secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:71b1999a8ea5 399 while (secsIdle>canTimeout) {
TickTock 2:71b1999a8ea5 400 //DeepPowerDown();
TickTock 2:71b1999a8ea5 401 __wfi(); // freeze CPU and wait for interrupt (from canbus)
TickTock 2:71b1999a8ea5 402 }
TickTock 2:71b1999a8ea5 403 canIdle=false;
TickTock 2:71b1999a8ea5 404 printf("Waking uC.\n");
TickTock 2:71b1999a8ea5 405 if (time(NULL)>(secs+1800)) {
TickTock 2:71b1999a8ea5 406 logOpen = false; // Start new file if asleep for more than 30 minutes
TickTock 2:71b1999a8ea5 407 } else { // insert timestamp on each wake
TickTock 2:71b1999a8ea5 408 logTS();
TickTock 2:71b1999a8ea5 409 }
TickTock 2:71b1999a8ea5 410 //LPC_RTC->CIIR=0x01; // re-enable RTC interrupts
TickTock 2:71b1999a8ea5 411 }
TickTock 2:71b1999a8ea5 412 wait(0.2); // We get >2K messages per second
TickTock 2:71b1999a8ea5 413 } while (logOpen); // keep going until button or fsram removed
TickTock 2:71b1999a8ea5 414 } else {
TickTock 2:71b1999a8ea5 415 printf("\nNo fUSB Inserted.\n\n");
TickTock 2:71b1999a8ea5 416 logOpen=false;
TickTock 2:71b1999a8ea5 417 led1=!led1;
TickTock 2:71b1999a8ea5 418 led2=led1;
TickTock 2:71b1999a8ea5 419 led3=led1;
TickTock 2:71b1999a8ea5 420 led4=led1;
TickTock 2:71b1999a8ea5 421 wait(5);
TickTock 2:71b1999a8ea5 422 } //if (CD==1)
TickTock 2:71b1999a8ea5 423 } //while (true)
TickTock 0:1596b8644523 424 }