Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Tue Feb 12 04:08:05 2013 +0000
Revision:
3:3e879b043bc5
Parent:
2:71b1999a8ea5
Child:
4:8d7759f4fe7a
Added raw can message monitor display

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