Dual CANbus monitor and instrumentation cluster
Dependencies: SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed
Fork of CANary by
main.cpp@3:3e879b043bc5, 2013-02-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |