Dual CANbus monitor and instrumentation cluster

Dependencies:   SPI_TFTx2 TFT_fonts TOUCH_TFTx2 beep mbed

Fork of CANary by Tick Tock

Committer:
TickTock
Date:
Sun Feb 03 18:16:53 2013 +0000
Revision:
1:9dcd70c32180
Parent:
0:1596b8644523
Child:
2:71b1999a8ea5
compiles

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 0:1596b8644523 3 #include "log.h"
TickTock 0:1596b8644523 4 #include "beep.h"
TickTock 1:9dcd70c32180 5 #include "MSCFileSystem.h"
TickTock 1:9dcd70c32180 6 #include "SPI_TFTx2.h"
TickTock 1:9dcd70c32180 7 #include "Arial12x12.h"
TickTock 1:9dcd70c32180 8 #include "Arial28x28.h"
TickTock 1:9dcd70c32180 9 #include "TOUCH_TFTx2.h"
TickTock 1:9dcd70c32180 10 #define upLine "\033[1A"
TickTock 1:9dcd70c32180 11
TickTock 1:9dcd70c32180 12 //CANary.cpp
TickTock 1:9dcd70c32180 13
TickTock 1:9dcd70c32180 14 //LEAF OBD
TickTock 1:9dcd70c32180 15 //1:
TickTock 1:9dcd70c32180 16 //2:
TickTock 1:9dcd70c32180 17 //3: AVCAN-L White/Blue
TickTock 1:9dcd70c32180 18 //4:
TickTock 1:9dcd70c32180 19 //5: VSS Brown,White/Brown
TickTock 1:9dcd70c32180 20 //6: CARCAN-H Green
TickTock 1:9dcd70c32180 21 //7:
TickTock 1:9dcd70c32180 22 //8: 12V-SW Orange,White/Orange
TickTock 1:9dcd70c32180 23 //9:
TickTock 1:9dcd70c32180 24 //10:
TickTock 1:9dcd70c32180 25 //11: AVCAN-H Blue
TickTock 1:9dcd70c32180 26 //12: EVCAN-L White/Grey
TickTock 1:9dcd70c32180 27 //13: EVCAN-H Grey
TickTock 1:9dcd70c32180 28 //14: CARCAN-L White/Green
TickTock 1:9dcd70c32180 29 //15:
TickTock 1:9dcd70c32180 30 //16: 12V-AON Red/Blue,Blue/Red
TickTock 0:1596b8644523 31
TickTock 0:1596b8644523 32 //VP230
TickTock 1:9dcd70c32180 33 //1:D
TickTock 1:9dcd70c32180 34 //2:GND
TickTock 1:9dcd70c32180 35 //3:VCC
TickTock 1:9dcd70c32180 36 //4:R
TickTock 1:9dcd70c32180 37 //5:Vref
TickTock 1:9dcd70c32180 38 //6:CANL
TickTock 1:9dcd70c32180 39 //7:CANH
TickTock 1:9dcd70c32180 40 //8:RS
TickTock 0:1596b8644523 41
TickTock 0:1596b8644523 42 //LPC1768
TickTock 0:1596b8644523 43 //1: VSS
TickTock 1:9dcd70c32180 44 //2: NC:VIN (4.5-9V supply)
TickTock 0:1596b8644523 45 //3: NC:VB
TickTock 0:1596b8644523 46 //4: NC:nR
TickTock 1:9dcd70c32180 47 //5: SPI:CS0
TickTock 1:9dcd70c32180 48 //6: SPI:CS1
TickTock 1:9dcd70c32180 49 //7: SPI:Reset
TickTock 1:9dcd70c32180 50 //8: CAN1:Sleep --> 8:CAN1:RS
TickTock 1:9dcd70c32180 51 //9: CAN1:RX --> 4:CAN1:R
TickTock 1:9dcd70c32180 52 //10: CAN1:TX --> 1:CAN1:D
TickTock 1:9dcd70c32180 53 //11: SPI:MOSI
TickTock 1:9dcd70c32180 54 //12: SPI:MISO
TickTock 1:9dcd70c32180 55 //13: SPI:SCLK
TickTock 1:9dcd70c32180 56 //14: NC:Ain
TickTock 1:9dcd70c32180 57 //15: MON12V --> 4K to 12V, 1K to VSS (To be implemented)
TickTock 1:9dcd70c32180 58 //16: TOUCH_X+
TickTock 1:9dcd70c32180 59 //17: TOUCH_X-
TickTock 1:9dcd70c32180 60 //18: NC:Aout
TickTock 1:9dcd70c32180 61 //19: TOUCH_Y+
TickTock 1:9dcd70c32180 62 //20: TOUCH_Y-
TickTock 0:1596b8644523 63 //21: Spkr+
TickTock 1:9dcd70c32180 64 //22: Spkr- (optional complimentary output for more volume)
TickTock 0:1596b8644523 65 //23: NC:pwm
TickTock 1:9dcd70c32180 66 //24: LED
TickTock 0:1596b8644523 67 //25: NC:pwm
TickTock 0:1596b8644523 68 //26: NC:pwm
TickTock 1:9dcd70c32180 69 //27: NC
TickTock 0:1596b8644523 70 //28: CAN2:Sleep --> 8:CAN2:RS
TickTock 1:9dcd70c32180 71 //29: CAN2:TX --> 1:CAN2:D
TickTock 1:9dcd70c32180 72 //30: CAN2:RX --> 4:CAN2:R
TickTock 1:9dcd70c32180 73 //31: USB_D+
TickTock 1:9dcd70c32180 74 //32: USB_D-
TickTock 0:1596b8644523 75 //33: NC:Eth_TD+
TickTock 0:1596b8644523 76 //34: NC:Eth_TD-
TickTock 0:1596b8644523 77 //35: NC:Eth_RD+
TickTock 0:1596b8644523 78 //36: NC:Eth_RD-
TickTock 0:1596b8644523 79 //37: NC:IF+
TickTock 0:1596b8644523 80 //38: NC:IF-
TickTock 1:9dcd70c32180 81 //39: NC:5Vout (only available when connected as USB device)
TickTock 0:1596b8644523 82 //40: VCC3.3
TickTock 0:1596b8644523 83
TickTock 1:9dcd70c32180 84 time_t seconds ;
TickTock 0:1596b8644523 85 Beep buzzer(p21);
TickTock 1:9dcd70c32180 86
TickTock 0:1596b8644523 87 Ticker ticker;
TickTock 1:9dcd70c32180 88 Timer timer;
TickTock 0:1596b8644523 89 DigitalOut led1(LED1);
TickTock 0:1596b8644523 90 DigitalOut led2(LED2);
TickTock 0:1596b8644523 91 DigitalOut led3(LED3);
TickTock 0:1596b8644523 92 DigitalOut led4(LED4);
TickTock 1:9dcd70c32180 93 CAN can1(p9, p10); // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs)
TickTock 1:9dcd70c32180 94 DigitalOut can1_SleepMode(p8); // Use pin 8 to control the sleep mode of can1
TickTock 1:9dcd70c32180 95 CAN can2(p30, p29); // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs)
TickTock 1:9dcd70c32180 96 DigitalOut can2_SleepMode(p28); // Use pin 28 to control the sleep mode of can2
TickTock 1:9dcd70c32180 97 bool logCreated = false;
TickTock 0:1596b8644523 98 char logMsg[64];
TickTock 0:1596b8644523 99
TickTock 0:1596b8644523 100 char counter = 0;
TickTock 1:9dcd70c32180 101
TickTock 1:9dcd70c32180 102 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 103
TickTock 1:9dcd70c32180 104 unsigned short getTimeStamp() {// from Gary's code
TickTock 1:9dcd70c32180 105
TickTock 1:9dcd70c32180 106 //-----------
TickTock 1:9dcd70c32180 107 // read ms from the timer
TickTock 1:9dcd70c32180 108 int msec = timer.read_ms() ;
TickTock 1:9dcd70c32180 109
TickTock 1:9dcd70c32180 110 // quickly, read Date and Time (to seconds) from the RTC
TickTock 1:9dcd70c32180 111 unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900
TickTock 1:9dcd70c32180 112
TickTock 1:9dcd70c32180 113 //-----------
TickTock 1:9dcd70c32180 114 if ( msec > 999 ) msec = 999 ;
TickTock 1:9dcd70c32180 115 int isecs = secs % 60 ; // modulo 60 for 0-59 seconds from RTC
TickTock 1:9dcd70c32180 116
TickTock 1:9dcd70c32180 117 return ( ( isecs << 10 ) + msec ) ; // return the two byte time stamp
TickTock 1:9dcd70c32180 118 }
TickTock 1:9dcd70c32180 119
TickTock 1:9dcd70c32180 120 extern "C" void RTC_IRQHandler()
TickTock 1:9dcd70c32180 121 {
TickTock 1:9dcd70c32180 122
TickTock 1:9dcd70c32180 123 timer.reset() ; // zero ms at the-seconds-tick
TickTock 1:9dcd70c32180 124
TickTock 1:9dcd70c32180 125 }
TickTock 1:9dcd70c32180 126
TickTock 1:9dcd70c32180 127 extern "C" void RTC_Init (void)
TickTock 1:9dcd70c32180 128 {
TickTock 1:9dcd70c32180 129
TickTock 1:9dcd70c32180 130 // set up the RTC interrupts
TickTock 1:9dcd70c32180 131 LPC_RTC->ILR=0x00;
TickTock 1:9dcd70c32180 132
TickTock 1:9dcd70c32180 133 //LPC_RTC->CIIR=0x02; // interrupts each minute - verified
TickTock 1:9dcd70c32180 134 LPC_RTC->CIIR=0x01; // interrupts each second - verified
TickTock 1:9dcd70c32180 135
TickTock 1:9dcd70c32180 136 //LPC_RTC->CCR = 0x11; // use for interrupts every minute ????
TickTock 1:9dcd70c32180 137 //LPC_RTC->CCR = 0x00; // Stop the RTC (apparently)
TickTock 1:9dcd70c32180 138 LPC_RTC->CCR = 0x01; // Start RTC (apparently use for interrupt every second)
TickTock 1:9dcd70c32180 139
TickTock 1:9dcd70c32180 140 // NVIC_SetPriority( RTC_IRQn, LOW_PR );
TickTock 1:9dcd70c32180 141 NVIC_EnableIRQ( RTC_IRQn );
TickTock 1:9dcd70c32180 142 }
TickTock 1:9dcd70c32180 143
TickTock 1:9dcd70c32180 144 void readLog ()
TickTock 1:9dcd70c32180 145 {
TickTock 1:9dcd70c32180 146 FILE *rfile;
TickTock 1:9dcd70c32180 147 unsigned char c;
TickTock 1:9dcd70c32180 148 int i=0;
TickTock 1:9dcd70c32180 149 printf("printing file\n");
TickTock 1:9dcd70c32180 150 rfile = fopen(LOGFILE, "r");
TickTock 1:9dcd70c32180 151 if (rfile == NULL) {
TickTock 1:9dcd70c32180 152 printf("no file found\n");
TickTock 1:9dcd70c32180 153 }
TickTock 1:9dcd70c32180 154 while (!feof(rfile))
TickTock 1:9dcd70c32180 155 {
TickTock 1:9dcd70c32180 156 c=fgetc(rfile);
TickTock 1:9dcd70c32180 157 printf("%02x ",c);
TickTock 1:9dcd70c32180 158 if (++i>11)
TickTock 1:9dcd70c32180 159 {
TickTock 1:9dcd70c32180 160 printf("\n");
TickTock 1:9dcd70c32180 161 i=0;
TickTock 1:9dcd70c32180 162 }
TickTock 1:9dcd70c32180 163 }
TickTock 1:9dcd70c32180 164 fclose(rfile);
TickTock 1:9dcd70c32180 165 }
TickTock 1:9dcd70c32180 166
TickTock 1:9dcd70c32180 167 void logCan (CANMessage canRXmsg)
TickTock 1:9dcd70c32180 168 {
TickTock 1:9dcd70c32180 169 FILE *file;
TickTock 1:9dcd70c32180 170
TickTock 1:9dcd70c32180 171 unsigned short ts;
TickTock 1:9dcd70c32180 172
TickTock 1:9dcd70c32180 173 ts=getTimeStamp();
TickTock 1:9dcd70c32180 174
TickTock 1:9dcd70c32180 175 if (!logCreated) {
TickTock 1:9dcd70c32180 176 file = fopen(LOGFILE, "w");
TickTock 1:9dcd70c32180 177 logCreated = true;
TickTock 1:9dcd70c32180 178 }
TickTock 1:9dcd70c32180 179 else
TickTock 1:9dcd70c32180 180 file = fopen(LOGFILE, "a");
TickTock 1:9dcd70c32180 181
TickTock 1:9dcd70c32180 182 if (file == NULL) {
TickTock 1:9dcd70c32180 183 if (logCreated)
TickTock 1:9dcd70c32180 184 logCreated = false;
TickTock 1:9dcd70c32180 185 return;
TickTock 1:9dcd70c32180 186 }
TickTock 1:9dcd70c32180 187 else
TickTock 1:9dcd70c32180 188 {
TickTock 1:9dcd70c32180 189 fprintf(file,"%c%c%c%c%c%c%c%c%c%c%c%c",ts>>8,ts&0xff,canRXmsg.id&0xff,(canRXmsg.id>>8)+(canRXmsg.len<<4),canRXmsg.data[0],canRXmsg.data[1],canRXmsg.data[2],canRXmsg.data[3],canRXmsg.data[4],canRXmsg.data[5],canRXmsg.data[6],canRXmsg.data[7]);
TickTock 1:9dcd70c32180 190 fclose(file);
TickTock 1:9dcd70c32180 191 }
TickTock 1:9dcd70c32180 192 }
TickTock 0:1596b8644523 193
TickTock 0:1596b8644523 194 void Log (char *message)
TickTock 0:1596b8644523 195 {
TickTock 0:1596b8644523 196 FILE *file;
TickTock 0:1596b8644523 197
TickTock 1:9dcd70c32180 198 if (!logCreated) {
TickTock 0:1596b8644523 199 file = fopen(LOGFILE, "w");
TickTock 1:9dcd70c32180 200 logCreated = true;
TickTock 0:1596b8644523 201 }
TickTock 0:1596b8644523 202 else
TickTock 0:1596b8644523 203 file = fopen(LOGFILE, "a");
TickTock 0:1596b8644523 204
TickTock 0:1596b8644523 205 if (file == NULL) {
TickTock 1:9dcd70c32180 206 if (logCreated)
TickTock 1:9dcd70c32180 207 logCreated = false;
TickTock 0:1596b8644523 208 return;
TickTock 0:1596b8644523 209 }
TickTock 0:1596b8644523 210 else
TickTock 0:1596b8644523 211 {
TickTock 0:1596b8644523 212 fputs(message, file);
TickTock 0:1596b8644523 213 fclose(file);
TickTock 0:1596b8644523 214 }
TickTock 1:9dcd70c32180 215 }
TickTock 0:1596b8644523 216
TickTock 1:9dcd70c32180 217 void send1() {
TickTock 1:9dcd70c32180 218 static char counter = 0; // use for fake data
TickTock 1:9dcd70c32180 219
TickTock 1:9dcd70c32180 220 can1.write(CANMessage(0x350, &counter, 1));
TickTock 1:9dcd70c32180 221 counter++;
TickTock 1:9dcd70c32180 222 // test sending 3 quickly
TickTock 1:9dcd70c32180 223 //can1.write(CANMessage(0x351, &counter, 1));
TickTock 1:9dcd70c32180 224 //can1.write(CANMessage(0x352, &counter, 1));
TickTock 1:9dcd70c32180 225
TickTock 0:1596b8644523 226 }
TickTock 0:1596b8644523 227
TickTock 0:1596b8644523 228
TickTock 0:1596b8644523 229 void recieve1() {
TickTock 0:1596b8644523 230 static CANMessage msg1;
TickTock 1:9dcd70c32180 231 unsigned short msgTime;
TickTock 1:9dcd70c32180 232
TickTock 1:9dcd70c32180 233 msgTime=getTimeStamp();
TickTock 0:1596b8644523 234 can1.read(msg1);
TickTock 1:9dcd70c32180 235 printf("%sCan1 Message received: %d %x\n", upLine, msg1.data[0], msgTime);
TickTock 1:9dcd70c32180 236 printf("Can1 rxd: %d\n", msg1.data[0]);
TickTock 1:9dcd70c32180 237 if(logCreated) {
TickTock 1:9dcd70c32180 238 logCan(msg1);
TickTock 1:9dcd70c32180 239 }
TickTock 0:1596b8644523 240 led2 = !led2;
TickTock 0:1596b8644523 241 }
TickTock 0:1596b8644523 242 void recieve2() {
TickTock 0:1596b8644523 243 static CANMessage msg2;
TickTock 1:9dcd70c32180 244 unsigned short msgTime;
TickTock 1:9dcd70c32180 245
TickTock 1:9dcd70c32180 246 msgTime=getTimeStamp();
TickTock 0:1596b8644523 247 can2.read(msg2);
TickTock 1:9dcd70c32180 248 printf("%sCan2 Message received: %d %x\n", upLine, msg2.data[0],msgTime);
TickTock 1:9dcd70c32180 249 printf("Can2 rxd: %d\n", msg2.data[0]);
TickTock 1:9dcd70c32180 250 if(logCreated) {
TickTock 1:9dcd70c32180 251 logCan(msg2);
TickTock 1:9dcd70c32180 252 }
TickTock 1:9dcd70c32180 253
TickTock 0:1596b8644523 254 led3 = !led3;
TickTock 0:1596b8644523 255 }
TickTock 0:1596b8644523 256
TickTock 0:1596b8644523 257 int main() {
TickTock 1:9dcd70c32180 258 can1.frequency(1000000);
TickTock 1:9dcd70c32180 259 can2.frequency(1000000);
TickTock 1:9dcd70c32180 260 //can1_SleepMode = 0; // Enable TX
TickTock 1:9dcd70c32180 261 //can2_SleepMode = 0; // Enable TX
TickTock 1:9dcd70c32180 262 can1_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 1:9dcd70c32180 263 can2_SleepMode = 1; // Turn on Monitor_only Mode
TickTock 1:9dcd70c32180 264 ticker.attach(&send1, 0.25);
TickTock 0:1596b8644523 265 can1.attach(&recieve1);
TickTock 0:1596b8644523 266 can2.attach(&recieve2);
TickTock 1:9dcd70c32180 267 unsigned int dsel = 1; // select right display
TickTock 1:9dcd70c32180 268 tt.set_display(2); // select both displays
TickTock 1:9dcd70c32180 269 tt.background(Black); // set background to black
TickTock 1:9dcd70c32180 270 tt.foreground(White); // set chars to white
TickTock 1:9dcd70c32180 271 tt.cls(); // clear the screen
TickTock 1:9dcd70c32180 272 tt.set_font((unsigned char*) Arial12x12); // select the font
TickTock 1:9dcd70c32180 273 tt.set_orientation(1);
TickTock 1:9dcd70c32180 274 tt.set_display(dsel); // select display
TickTock 1:9dcd70c32180 275
TickTock 1:9dcd70c32180 276 tt.calibrate(); // calibrate the touch
TickTock 1:9dcd70c32180 277 tt.locate(0,0);
TickTock 1:9dcd70c32180 278 tt.claim(stdout); // send stdout to the TFT display
TickTock 1:9dcd70c32180 279
TickTock 1:9dcd70c32180 280 struct tm t; // pointer to a static tm structure
TickTock 1:9dcd70c32180 281
TickTock 1:9dcd70c32180 282 seconds = time(NULL);
TickTock 1:9dcd70c32180 283 t = *localtime(&seconds) ;
TickTock 1:9dcd70c32180 284
TickTock 1:9dcd70c32180 285 // is it a date before 2012 ?
TickTock 1:9dcd70c32180 286 if ((t.tm_year + 1900) < 2012 ) {
TickTock 1:9dcd70c32180 287 // before 2012, so the RTC probably lost power
TickTock 1:9dcd70c32180 288 // So, set a near-recent date in 2012
TickTock 1:9dcd70c32180 289
TickTock 1:9dcd70c32180 290 // enter people-values here
TickTock 1:9dcd70c32180 291 t.tm_year = 2012 ; // 28 May 2012
TickTock 1:9dcd70c32180 292 t.tm_mon = 6 ; // 1 to 12
TickTock 1:9dcd70c32180 293 t.tm_mday = 1;
TickTock 1:9dcd70c32180 294 t.tm_hour = 12; // 12:59:56 PM (after noon)
TickTock 1:9dcd70c32180 295 t.tm_min = 59;
TickTock 1:9dcd70c32180 296 t.tm_sec = 56;
TickTock 1:9dcd70c32180 297
TickTock 1:9dcd70c32180 298 // adjust for tm structure required values
TickTock 1:9dcd70c32180 299 t.tm_year = t.tm_year - 1900;
TickTock 1:9dcd70c32180 300 t.tm_mon = t.tm_mon - 1;
TickTock 1:9dcd70c32180 301
TickTock 1:9dcd70c32180 302 // set the RTC
TickTock 1:9dcd70c32180 303 set_time(mktime(&t));
TickTock 1:9dcd70c32180 304 seconds = time(NULL);
TickTock 1:9dcd70c32180 305
TickTock 1:9dcd70c32180 306 // printf("Set RTC to:\n" );
TickTock 1:9dcd70c32180 307 // strftime(sTemp, 32, "%a %m/%d/%Y %X", localtime(&seconds));
TickTock 1:9dcd70c32180 308 // printf("%s\n", sTemp); // DAY MM/DD/YYYY HH:MM:SS
TickTock 0:1596b8644523 309 }
TickTock 0:1596b8644523 310 }