.

Dependencies:   SDHCFileSystem mbed

Committer:
TickTock
Date:
Tue Dec 04 04:20:24 2012 +0000
Revision:
7:281df0ba57d0
Parent:
6:594d9717e609
Child:
8:6872945e8e91
Successfully captured EV & CAN logs from car.  Buffer appears to overflow, though (LED4 blinks faster than LED3)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
TickTock 0:1596b8644523 1 #include "mbed.h"
TickTock 0:1596b8644523 2 #include "CAN.h"
TickTock 1:dafb963c3c14 3 #include "SDHCFileSystem.h"
TickTock 0:1596b8644523 4
TickTock 1:dafb963c3c14 5 #define upLine "\033[1A"
TickTock 4:fb373a391155 6 #define maxBufLen 2048
TickTock 1:dafb963c3c14 7
TickTock 1:dafb963c3c14 8 //CANcan.cpp
TickTock 1:dafb963c3c14 9
TickTock 1:dafb963c3c14 10 //LEAF OBD
TickTock 7:281df0ba57d0 11 //1:
TickTock 1:dafb963c3c14 12 //2:
TickTock 1:dafb963c3c14 13 //3: AVCAN-L White/Blue
TickTock 7:281df0ba57d0 14 //4:
TickTock 1:dafb963c3c14 15 //5: VSS Brown,White/Brown
TickTock 7:281df0ba57d0 16 //6: CARCAN-H Green --> VP230b:7
TickTock 1:dafb963c3c14 17 //7:
TickTock 1:dafb963c3c14 18 //8: 12V-SW Orange,White/Orange
TickTock 1:dafb963c3c14 19 //9:
TickTock 1:dafb963c3c14 20 //10:
TickTock 1:dafb963c3c14 21 //11: AVCAN-H Blue
TickTock 7:281df0ba57d0 22 //12: EVCAN-L White/Grey --> VP230a:6
TickTock 7:281df0ba57d0 23 //13: EVCAN-H Grey --> VP230a:7
TickTock 7:281df0ba57d0 24 //14: CARCAN-L White/Green --> VP230b:6
TickTock 7:281df0ba57d0 25 //15: 6V
TickTock 7:281df0ba57d0 26 //16: 12V-AON Red/Blue,Blue/Red ----|<---- LPC1768:2
TickTock 7:281df0ba57d0 27 //note 1: pins 4 & 5 longer
TickTock 7:281df0ba57d0 28 //note 2: pins 12 & 13 next to key
TickTock 7:281df0ba57d0 29 //note 3: pins 1 & 9 on right side looking into male connector with key on bottom
TickTock 1:dafb963c3c14 30
TickTock 0:1596b8644523 31 //VP230
TickTock 1:dafb963c3c14 32 //1:D
TickTock 1:dafb963c3c14 33 //2:GND
TickTock 1:dafb963c3c14 34 //3:VCC
TickTock 1:dafb963c3c14 35 //4:R
TickTock 1:dafb963c3c14 36 //5:Vref
TickTock 7:281df0ba57d0 37 //6:CANL --> OBD:12,14
TickTock 7:281df0ba57d0 38 //7:CANH --> OBD:13,6
TickTock 7:281df0ba57d0 39 //8:RS --> LPC1768:27,28
TickTock 0:1596b8644523 40
TickTock 0:1596b8644523 41 //LPC1768
TickTock 7:281df0ba57d0 42 //1: VSS 6V
TickTock 7:281df0ba57d0 43 //2: NC:VIN (4.5-9V supply) ---->|---- OBD:16
TickTock 0:1596b8644523 44 //3: NC:VB
TickTock 0:1596b8644523 45 //4: NC:nR
TickTock 0:1596b8644523 46 //5: SPI:MOSI --> 6:SDRAM:DI
TickTock 0:1596b8644523 47 //6: SPI:MISO --> 2:SDRAM:DO
TickTock 0:1596b8644523 48 //7: SPI:SCLK --> 4:SDRAM:SCLK
TickTock 0:1596b8644523 49 //8: CS --> 7:SDRAM:CS
TickTock 1:dafb963c3c14 50 //9: CAN1:RX --> 4:CAN1:R
TickTock 1:dafb963c3c14 51 //10: CAN1:TX --> 1:CAN1:D
TickTock 0:1596b8644523 52 //11: RS --> 4:LCD:RS
TickTock 0:1596b8644523 53 //12: E --> 6:LCD:E
TickTock 0:1596b8644523 54 //13: D4 --> 11:LCD:D4
TickTock 0:1596b8644523 55 //14: D5 --> 12:LCD:D5
TickTock 0:1596b8644523 56 //15: D6 --> 13:LCD:D6
TickTock 0:1596b8644523 57 //16: D7 --> 14:LCD:D7
TickTock 0:1596b8644523 58 //17: CD --> 1:SDRAM:CD
TickTock 1:dafb963c3c14 59 //18: MON12V --> 4K to 12V, 1K to VSS (To be implemented)
TickTock 0:1596b8644523 60 //19: PB2
TickTock 0:1596b8644523 61 //20: PB1
TickTock 0:1596b8644523 62 //21: Spkr+
TickTock 1:dafb963c3c14 63 //22: Spkr- (optional complimentary output for more volume)
TickTock 0:1596b8644523 64 //23: NC:pwm
TickTock 1:dafb963c3c14 65 //24: LEDBLU --> 18:LCD:BLU (only used for tri-color displays)
TickTock 1:dafb963c3c14 66 //25: LEDGRN --> 17:LCD:GRN (only used for tri-color displays)
TickTock 1:dafb963c3c14 67 //26: LEDRED --> 16:LCD:RED
TickTock 0:1596b8644523 68 //27: CAN1:Sleep --> 8:CAN1:RS
TickTock 0:1596b8644523 69 //28: CAN2:Sleep --> 8:CAN2:RS
TickTock 1:dafb963c3c14 70 //29: CAN2:TX --> 1:CAN2:D
TickTock 1:dafb963c3c14 71 //30: CAN2:RX --> 4:CAN2:R
TickTock 0:1596b8644523 72 //31: NC:USB_D+
TickTock 0:1596b8644523 73 //32: NC:USB_D-
TickTock 0:1596b8644523 74 //33: NC:Eth_TD+
TickTock 0:1596b8644523 75 //34: NC:Eth_TD-
TickTock 0:1596b8644523 76 //35: NC:Eth_RD+
TickTock 0:1596b8644523 77 //36: NC:Eth_RD-
TickTock 0:1596b8644523 78 //37: NC:IF+
TickTock 0:1596b8644523 79 //38: NC:IF-
TickTock 1:dafb963c3c14 80 //39: NC:5Vout (only available when connected as USB device)
TickTock 0:1596b8644523 81 //40: VCC3.3
TickTock 0:1596b8644523 82
TickTock 1:dafb963c3c14 83 void Log (char *message);
TickTock 1:dafb963c3c14 84 void LogErr (char *message);
TickTock 6:594d9717e609 85 extern "C" void mbed_reset();
TickTock 1:dafb963c3c14 86
TickTock 1:dafb963c3c14 87 time_t seconds ;
TickTock 1:dafb963c3c14 88 DigitalIn CD(p17);
TickTock 2:55b2357f0cf9 89 DigitalIn PB1( p20 );
TickTock 1:dafb963c3c14 90 SDFileSystem sd(p5, p6, p7, p8, "sd" ); // SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
TickTock 7:281df0ba57d0 91 //Ticker ticker1;
TickTock 7:281df0ba57d0 92 //Ticker ticker2;
TickTock 1:dafb963c3c14 93 Timer timer;
TickTock 0:1596b8644523 94 DigitalOut led1(LED1);
TickTock 0:1596b8644523 95 DigitalOut led2(LED2);
TickTock 0:1596b8644523 96 DigitalOut led3(LED3);
TickTock 0:1596b8644523 97 DigitalOut led4(LED4);
TickTock 1:dafb963c3c14 98 CAN can1(p9, p10); // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
TickTock 2:55b2357f0cf9 99 DigitalOut can1_SleepMode(p27); // Use pin 27 to control the sleep mode of can1
TickTock 1:dafb963c3c14 100 CAN can2(p30, p29); // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
TickTock 2:55b2357f0cf9 101 DigitalOut can2_SleepMode(p28); // Use pin 28 to control the sleep mode of can2
TickTock 3:51134a275609 102 bool logOpen = false;
TickTock 2:55b2357f0cf9 103 FILE *file;
TickTock 2:55b2357f0cf9 104 char fileName[32] = "" ;
TickTock 4:fb373a391155 105 char writeBuffer[maxBufLen][13];
TickTock 2:55b2357f0cf9 106 int bufPointer = 0;
TickTock 0:1596b8644523 107
TickTock 0:1596b8644523 108 Serial pc(USBTX, USBRX); // tx, rx default settings (9600 8N1)
TickTock 0:1596b8644523 109
TickTock 2:55b2357f0cf9 110 extern "C" void RTC_IRQHandler() {
TickTock 4:fb373a391155 111 static int i=0;
TickTock 2:55b2357f0cf9 112 timer.reset() ; // zero ms at the-seconds-tick
TickTock 4:fb373a391155 113 if (logOpen) {
TickTock 4:fb373a391155 114 file = fopen(fileName, "ab");
TickTock 3:51134a275609 115 if (file == NULL) {
TickTock 3:51134a275609 116 logOpen = false;
TickTock 4:fb373a391155 117 pc.printf("Failed to append log file.\n\n");
TickTock 3:51134a275609 118 } else {
TickTock 4:fb373a391155 119 while (i != bufPointer) {
TickTock 3:51134a275609 120 for (int j = 0; j<13; j++){
TickTock 3:51134a275609 121 fprintf(file,"%c",writeBuffer[i][j]);
TickTock 3:51134a275609 122 }
TickTock 4:fb373a391155 123 if(++i >= maxBufLen)
TickTock 4:fb373a391155 124 i=0;
TickTock 2:55b2357f0cf9 125 }
TickTock 3:51134a275609 126 led3 = !led3;
TickTock 3:51134a275609 127 fclose(file);
TickTock 2:55b2357f0cf9 128 }
TickTock 1:dafb963c3c14 129 }
TickTock 4:fb373a391155 130
TickTock 2:55b2357f0cf9 131 LPC_RTC->ILR |= (1<<0); // turn on Low Bit - works
TickTock 2:55b2357f0cf9 132 }
TickTock 2:55b2357f0cf9 133
TickTock 2:55b2357f0cf9 134 extern "C" void RTC_Init (void) {
TickTock 2:55b2357f0cf9 135 LPC_RTC->ILR=0x00; // set up the RTC interrupts
TickTock 2:55b2357f0cf9 136 //LPC_RTC->CIIR=0x02; // interrupts each minute
TickTock 2:55b2357f0cf9 137 LPC_RTC->CIIR=0x01; // interrupts each second
TickTock 2:55b2357f0cf9 138 //LPC_RTC->CCR = 0x11; // use for interrupts every minute ????
TickTock 2:55b2357f0cf9 139 //LPC_RTC->CCR = 0x00; // Stop the RTC (apparently)
TickTock 2:55b2357f0cf9 140 LPC_RTC->CCR = 0x01; // Start RTC (apparently use for interrupt every second)
TickTock 3:51134a275609 141 NVIC_SetPriority( RTC_IRQn, 10 );
TickTock 2:55b2357f0cf9 142 NVIC_EnableIRQ( RTC_IRQn );
TickTock 2:55b2357f0cf9 143 }
TickTock 2:55b2357f0cf9 144
TickTock 2:55b2357f0cf9 145 unsigned short getTimeStamp() {
TickTock 2:55b2357f0cf9 146 int msec = timer.read_ms() ; // read ms from the timer
TickTock 2:55b2357f0cf9 147 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 2:55b2357f0cf9 148 int isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC
TickTock 2:55b2357f0cf9 149 return ((isecs<<10)+msec) ; // return the two byte time stamp
TickTock 1:dafb963c3c14 150 }
TickTock 1:dafb963c3c14 151
TickTock 2:55b2357f0cf9 152 void readLog (){
TickTock 2:55b2357f0cf9 153 unsigned char c;
TickTock 2:55b2357f0cf9 154 int i=0;
TickTock 3:51134a275609 155 char lastMsgNum[]={0,0};
TickTock 3:51134a275609 156 char curMsgNum[]={0,0};
TickTock 3:51134a275609 157 char canNum=0;
TickTock 2:55b2357f0cf9 158 pc.printf("printing file\n");
TickTock 2:55b2357f0cf9 159 file = fopen(fileName, "r");
TickTock 2:55b2357f0cf9 160 if (file == NULL) {
TickTock 2:55b2357f0cf9 161 pc.printf("no file found\n");
TickTock 1:dafb963c3c14 162 }
TickTock 2:55b2357f0cf9 163 while (!feof(file)) {
TickTock 2:55b2357f0cf9 164 c=fgetc(file);
TickTock 2:55b2357f0cf9 165 pc.printf("%02x ",c);
TickTock 3:51134a275609 166 if (i==0){
TickTock 3:51134a275609 167 canNum=c;
TickTock 3:51134a275609 168 }else if (i==5){
TickTock 3:51134a275609 169 curMsgNum[canNum]=c;
TickTock 2:55b2357f0cf9 170 }
TickTock 2:55b2357f0cf9 171 if (++i>12) {
TickTock 3:51134a275609 172 if (curMsgNum[canNum]>(lastMsgNum[canNum]+1)) {
TickTock 2:55b2357f0cf9 173 pc.printf(" ***");
TickTock 2:55b2357f0cf9 174 }
TickTock 3:51134a275609 175 lastMsgNum[canNum]=curMsgNum[canNum];
TickTock 2:55b2357f0cf9 176 pc.printf("\n");
TickTock 2:55b2357f0cf9 177 i=0;
TickTock 2:55b2357f0cf9 178 }
TickTock 2:55b2357f0cf9 179 }
TickTock 4:fb373a391155 180 pc.printf("\n\n\n\n");
TickTock 2:55b2357f0cf9 181 fclose(file);
TickTock 2:55b2357f0cf9 182 }
TickTock 1:dafb963c3c14 183
TickTock 2:55b2357f0cf9 184 void logCan (char mtype, CANMessage canRXmsg) {
TickTock 2:55b2357f0cf9 185 unsigned short ts = getTimeStamp();
TickTock 2:55b2357f0cf9 186 writeBuffer[bufPointer][0]=mtype;
TickTock 2:55b2357f0cf9 187 writeBuffer[bufPointer][1]=ts>>8;
TickTock 2:55b2357f0cf9 188 writeBuffer[bufPointer][2]=ts&0xff;
TickTock 2:55b2357f0cf9 189 writeBuffer[bufPointer][3]=canRXmsg.id&0xff;
TickTock 2:55b2357f0cf9 190 writeBuffer[bufPointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4);
TickTock 2:55b2357f0cf9 191 for (int i = 5; i<13; i++){
TickTock 2:55b2357f0cf9 192 writeBuffer[bufPointer][i]=canRXmsg.data[i-5];
TickTock 0:1596b8644523 193 }
TickTock 4:fb373a391155 194 if (++bufPointer >= maxBufLen) {
TickTock 4:fb373a391155 195 bufPointer = 0;
TickTock 4:fb373a391155 196 led4 = !led4;
TickTock 4:fb373a391155 197 }
TickTock 1:dafb963c3c14 198 }
TickTock 0:1596b8644523 199
TickTock 1:dafb963c3c14 200 void send1() {
TickTock 1:dafb963c3c14 201 static char counter = 0; // use for fake data
TickTock 1:dafb963c3c14 202 can1.write(CANMessage(0x350, &counter, 1));
TickTock 1:dafb963c3c14 203 counter++;
TickTock 4:fb373a391155 204 can1.write(CANMessage(0x351, &counter, 1));
TickTock 2:55b2357f0cf9 205 counter++;
TickTock 4:fb373a391155 206 can1.write(CANMessage(0x352, &counter, 1));
TickTock 4:fb373a391155 207 counter++;
TickTock 3:51134a275609 208 }
TickTock 3:51134a275609 209
TickTock 3:51134a275609 210 void send2() {
TickTock 3:51134a275609 211 static char counter = 0; // use for fake data
TickTock 3:51134a275609 212 can2.write(CANMessage(0x351, &counter, 1));
TickTock 3:51134a275609 213 counter++;
TickTock 4:fb373a391155 214 can2.write(CANMessage(0x351, &counter, 1));
TickTock 3:51134a275609 215 counter++;
TickTock 3:51134a275609 216 can2.write(CANMessage(0x352, &counter, 1));
TickTock 4:fb373a391155 217 counter++;
TickTock 0:1596b8644523 218 }
TickTock 0:1596b8644523 219
TickTock 0:1596b8644523 220 void recieve1() {
TickTock 2:55b2357f0cf9 221 CANMessage msg1;
TickTock 2:55b2357f0cf9 222 unsigned short msgTime=getTimeStamp();
TickTock 3:51134a275609 223 static int lastMsg1 = 0;
TickTock 0:1596b8644523 224 can1.read(msg1);
TickTock 3:51134a275609 225 if (msg1.id!=0x000) {
TickTock 3:51134a275609 226 if (msg1.data[0]>(lastMsg1+1)) {
TickTock 3:51134a275609 227 pc.printf("%sCan1 Message %d missed! \n", upLine, lastMsg1+1);
TickTock 1:dafb963c3c14 228 }
TickTock 3:51134a275609 229 lastMsg1=msg1.data[0];
TickTock 3:51134a275609 230 if(logOpen) {
TickTock 4:fb373a391155 231 logCan(1, msg1);
TickTock 3:51134a275609 232 }
TickTock 3:51134a275609 233 led1 = !led1;
TickTock 1:dafb963c3c14 234 }
TickTock 0:1596b8644523 235 }
TickTock 2:55b2357f0cf9 236
TickTock 0:1596b8644523 237 void recieve2() {
TickTock 2:55b2357f0cf9 238 CANMessage msg2;
TickTock 2:55b2357f0cf9 239 unsigned short msgTime=getTimeStamp();
TickTock 3:51134a275609 240 static int lastMsg2 = 0;
TickTock 0:1596b8644523 241 can2.read(msg2);
TickTock 3:51134a275609 242 if (msg2.id!=0x000) {
TickTock 3:51134a275609 243 if (msg2.data[0]>(lastMsg2+1)) {
TickTock 3:51134a275609 244 pc.printf("%sCan2 Message %d missed! \n", upLine, lastMsg2+1);
TickTock 3:51134a275609 245 }
TickTock 3:51134a275609 246 lastMsg2=msg2.data[0];
TickTock 3:51134a275609 247 if(logOpen) {
TickTock 4:fb373a391155 248 logCan(2, msg2);
TickTock 3:51134a275609 249 }
TickTock 3:51134a275609 250 led2 = !led2;
TickTock 2:55b2357f0cf9 251 }
TickTock 0:1596b8644523 252 }
TickTock 0:1596b8644523 253
TickTock 0:1596b8644523 254 int main() {
TickTock 2:55b2357f0cf9 255 pc.baud(460800); // change serial interface to pc to 115200, 8N1
TickTock 2:55b2357f0cf9 256 CANMessage tsMsg;
TickTock 7:281df0ba57d0 257 can1.frequency(500000);
TickTock 7:281df0ba57d0 258 can2.frequency(500000);
TickTock 7:281df0ba57d0 259 //can1_SleepMode = 0; // Enable TX
TickTock 7:281df0ba57d0 260 //can2_SleepMode = 0; // Enable TX
TickTock 7:281df0ba57d0 261 can1_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 7:281df0ba57d0 262 can2_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 0:1596b8644523 263 CD.mode(PullUp) ; //SDRAM Chip Detect
TickTock 2:55b2357f0cf9 264 PB1.mode(PullUp) ; //Pushbutton 1
TickTock 0:1596b8644523 265 can1.attach(&recieve1);
TickTock 0:1596b8644523 266 can2.attach(&recieve2);
TickTock 1:dafb963c3c14 267
TickTock 1:dafb963c3c14 268 timer.start() ;
TickTock 2:55b2357f0cf9 269 RTC_Init(); // start the RTC Interrupts that sync the timer
TickTock 2:55b2357f0cf9 270 wait(1.1); // give time to sync
TickTock 1:dafb963c3c14 271
TickTock 6:594d9717e609 272 while (true) {
TickTock 6:594d9717e609 273 if(CD == 1) {
TickTock 6:594d9717e609 274 int fileNum = 0;
TickTock 2:55b2357f0cf9 275 sprintf(fileName,"/sd/canary%d.evc",fileNum);
TickTock 2:55b2357f0cf9 276 file = fopen(fileName, "r");
TickTock 6:594d9717e609 277 while ((file != NULL)&&(fileNum++<100)) {
TickTock 6:594d9717e609 278 fclose(file);
TickTock 6:594d9717e609 279 sprintf(fileName,"/sd/canary%d.evc",fileNum);
TickTock 6:594d9717e609 280 file = fopen(fileName, "r");
TickTock 6:594d9717e609 281 }
TickTock 6:594d9717e609 282
TickTock 6:594d9717e609 283 file = fopen(fileName, "wb");
TickTock 6:594d9717e609 284 if(file==NULL){
TickTock 6:594d9717e609 285 pc.printf("\nUnable to open canlog\n\n\n\n");
TickTock 6:594d9717e609 286 mbed_reset();
TickTock 6:594d9717e609 287 } else {
TickTock 6:594d9717e609 288 logOpen = true;
TickTock 6:594d9717e609 289 pc.printf("\nStarting Can Log %s\n\n\n\n",fileName);
TickTock 6:594d9717e609 290 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 6:594d9717e609 291 tsMsg.id=0xfff;
TickTock 6:594d9717e609 292 tsMsg.len=0xf;
TickTock 6:594d9717e609 293 tsMsg.data[0]=secs&0xff;
TickTock 6:594d9717e609 294 tsMsg.data[1]=(secs>>0)&0xff;
TickTock 6:594d9717e609 295 tsMsg.data[2]=(secs>>16)&0xff;
TickTock 6:594d9717e609 296 tsMsg.data[3]=secs>>24;
TickTock 6:594d9717e609 297 tsMsg.data[4]=0xff;
TickTock 6:594d9717e609 298 tsMsg.data[5]=0xff;
TickTock 6:594d9717e609 299 tsMsg.data[6]=0xff;
TickTock 6:594d9717e609 300 tsMsg.data[7]=0xff;
TickTock 6:594d9717e609 301 logCan(0,tsMsg); //write full timestamp
TickTock 6:594d9717e609 302 fclose(file);
TickTock 6:594d9717e609 303 }
TickTock 7:281df0ba57d0 304 //ticker1.attach(&send1, .0052); //start sending messages
TickTock 7:281df0ba57d0 305 //ticker2.attach(&send2, .0051); //start sending messages
TickTock 6:594d9717e609 306
TickTock 6:594d9717e609 307 while ((PB1==1)&&(CD==1)){
TickTock 6:594d9717e609 308 wait(0.25); // Keep logging until button pushed or SDRAM removed
TickTock 6:594d9717e609 309 }
TickTock 7:281df0ba57d0 310 //ticker1.detach();
TickTock 7:281df0ba57d0 311 //ticker2.detach();
TickTock 6:594d9717e609 312 logOpen=false;
TickTock 6:594d9717e609 313 pc.printf("Stopping log\n\n");
TickTock 6:594d9717e609 314 wait(1);
TickTock 6:594d9717e609 315 if (CD==1)
TickTock 6:594d9717e609 316 readLog();
TickTock 2:55b2357f0cf9 317 } else {
TickTock 6:594d9717e609 318 pc.printf("\nNo SDRAM Inserted.\n\n\n\n");
TickTock 2:55b2357f0cf9 319 }
TickTock 6:594d9717e609 320 wait(1);
TickTock 0:1596b8644523 321 }
TickTock 0:1596b8644523 322 }