.
Dependencies: SDHCFileSystem mbed
main.cpp
- Committer:
- TickTock
- Date:
- 2012-11-29
- Revision:
- 1:dafb963c3c14
- Parent:
- 0:1596b8644523
- Child:
- 2:55b2357f0cf9
File content as of revision 1:dafb963c3c14:
#include "mbed.h" #include "CAN.h" #include "TextLCD.h" #include "SDHCFileSystem.h" #include "DebounceIn.h" #include "beep.h" #define upLine "\033[1A" #define LOGFILE "/sd/canary.log" //CANcan.cpp //LEAF OBD //1: //2: //3: AVCAN-L White/Blue //4: //5: VSS Brown,White/Brown //6: CARCAN-H Green //7: //8: 12V-SW Orange,White/Orange //9: //10: //11: AVCAN-H Blue //12: EVCAN-L White/Grey //13: EVCAN-H Grey //14: CARCAN-L White/Green //15: //16: 12V-AON Red/Blue,Blue/Red //VP230 //1:D //2:GND //3:VCC //4:R //5:Vref //6:CANL //7:CANH //8:RS //LPC1768 //1: VSS //2: NC:VIN (4.5-9V supply) //3: NC:VB //4: NC:nR //5: SPI:MOSI --> 6:SDRAM:DI //6: SPI:MISO --> 2:SDRAM:DO //7: SPI:SCLK --> 4:SDRAM:SCLK //8: CS --> 7:SDRAM:CS //9: CAN1:RX --> 4:CAN1:R //10: CAN1:TX --> 1:CAN1:D //11: RS --> 4:LCD:RS //12: E --> 6:LCD:E //13: D4 --> 11:LCD:D4 //14: D5 --> 12:LCD:D5 //15: D6 --> 13:LCD:D6 //16: D7 --> 14:LCD:D7 //17: CD --> 1:SDRAM:CD //18: MON12V --> 4K to 12V, 1K to VSS (To be implemented) //19: PB2 //20: PB1 //21: Spkr+ //22: Spkr- (optional complimentary output for more volume) //23: NC:pwm //24: LEDBLU --> 18:LCD:BLU (only used for tri-color displays) //25: LEDGRN --> 17:LCD:GRN (only used for tri-color displays) //26: LEDRED --> 16:LCD:RED //27: CAN1:Sleep --> 8:CAN1:RS //28: CAN2:Sleep --> 8:CAN2:RS //29: CAN2:TX --> 1:CAN2:D //30: CAN2:RX --> 4:CAN2:R //31: NC:USB_D+ //32: NC:USB_D- //33: NC:Eth_TD+ //34: NC:Eth_TD- //35: NC:Eth_RD+ //36: NC:Eth_RD- //37: NC:IF+ //38: NC:IF- //39: NC:5Vout (only available when connected as USB device) //40: VCC3.3 extern bool LogCreated; void Log (char *message); void LogErr (char *message); time_t seconds ; Beep buzzer(p21); DigitalIn CD(p17); DebounceIn dbPB1( p20 ); ;DigitalIn PB1(p20); SDFileSystem sd(p5, p6, p7, p8, "sd" ); // SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name) TextLCD lcd(p11, p12, p13, p14, p15, p16); // rs, e, d0-d3 (RW to GND) Ticker ticker; Timer timer; DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); CAN can1(p9, p10); // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs) CAN can2(p30, p29); // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs) bool logCreated = false; char logMsg[64]; char counter = 0; //DigitalOut can1_SleepMode(p11); // Use pin 11 to control the sleep mode of can1 //DigitalOut can2_SleepMode(p28); // Use pin 28 to control the sleep mode of can2 Serial pc(USBTX, USBRX); // tx, rx default settings (9600 8N1) unsigned short getTimeStamp() {// from Gary's code int msec = timer.read_ms(); // not synchronized with RTC //unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 unsigned long secs = msec / 1000; int isecs = secs % 60; // modulo 60 for 0-59 seconds from RTC return ((isecs << 10) + (msec%1000)); // return the two byte time stamp } void readLog () { FILE *file; unsigned char c; int i=0; pc.printf("printing file\n"); file = fopen(LOGFILE, "r"); if (file == NULL) { pc.printf("no file found\n"); } while (!feof(file)) { c=fgetc(file); pc.printf("%02x ",c); if (++i>11) { pc.printf("\n"); i=0; } } pc.printf("\n"); pc.printf("\n"); fclose(file); } void logCan (CANMessage canRXmsg) { FILE *file; unsigned short ts; ts=getTimeStamp(); if (!logCreated) { file = fopen(LOGFILE, "w"); logCreated = true; } else file = fopen(LOGFILE, "a"); if (file == NULL) { if (logCreated) logCreated = false; return; } else { 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]); fclose(file); } } void Log (char *message) { FILE *file; if (!logCreated) { file = fopen(LOGFILE, "w"); logCreated = true; } else file = fopen(LOGFILE, "a"); if (file == NULL) { if (logCreated) logCreated = false; return; } else { fputs(message, file); fclose(file); } } void send1() { static char counter = 0; // use for fake data can1.write(CANMessage(0x350, &counter, 1)); counter++; // test sending 3 quickly //can1.write(CANMessage(0x351, &counter, 1)); //can1.write(CANMessage(0x352, &counter, 1)); } void recieve1() { static CANMessage msg1; unsigned short msgTime; msgTime=getTimeStamp(); can1.read(msg1); pc.printf("%sCan1 Message received: %d %x\n", upLine, msg1.data[0], msgTime); lcd.printf("Can1 rxd: %d\n", msg1.data[0]); if(logCreated) { if((PB1==0)||(CD==0)){ logCreated=false; pc.printf("Stopping log\n", counter); readLog(); }else{ logCan(msg1); } } led2 = !led2; } void recieve2() { static CANMessage msg2; unsigned short msgTime; int milisec; msgTime=getTimeStamp(); milisec=timer.read_ms(); can2.read(msg2); pc.printf("%sCan2 Message received: %d %04x %d \n", upLine, msg2.data[0],msgTime,milisec); ;lcd.printf("Can2 rxd: %d\n", msg2.data[0]); if(logCreated) { if((PB1==0)||(CD==0)){ logCreated=false; pc.printf("Stopping log\n\n", counter); readLog(); }else{ logCan(msg2); } } led3 = !led3; } int main() { pc.baud(115200); // change serial interface to pc to 115200, 8N1 can1.frequency(1000000); can2.frequency(1000000); //can1_SleepMode = 0; // Enable TX //can2_SleepMode = 0; // Enable TX //can1_SleepMode = 1; // Turn on Monitor_only Mode //can2_SleepMode = 1; // Turn on Monitor_only Mode CD.mode(PullUp) ; //SDRAM Chip Detect dbPB1.mode(PullUp) ; //Pushbutton 1 ticker.attach(&send1, 1.1); can1.attach(&recieve1); can2.attach(&recieve2); timer.start() ; if(CD == 1) { pc.printf("Starting Can Log\n\n\n\n"); Log(""); } else { pc.printf("No SDRAM Inserted.\n\n\n\n"); } }