
.
Dependencies: SDHCFileSystem mbed
Revision 2:55b2357f0cf9, committed 2012-12-01
- Comitter:
- TickTock
- Date:
- Sat Dec 01 16:03:14 2012 +0000
- Parent:
- 1:dafb963c3c14
- Child:
- 3:51134a275609
- Commit message:
- Got speed up to 2ms send rate but still drop a few every second on sdwrite
Changed in this revision
--- a/DebounceIn.lib Thu Nov 29 12:18:37 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -DebounceIn#427f15966f54
--- a/TextLCD.lib Thu Nov 29 12:18:37 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -TextLCD#27620595ebc5
--- a/beep.lib Thu Nov 29 12:18:37 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/dreschpe/code/beep/#d8e14429a95f
--- a/main.cpp Thu Nov 29 12:18:37 2012 +0000 +++ b/main.cpp Sat Dec 01 16:03:14 2012 +0000 @@ -1,12 +1,8 @@ #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 @@ -85,12 +81,9 @@ void LogErr (char *message); time_t seconds ; -Beep buzzer(p21); DigitalIn CD(p17); -DebounceIn dbPB1( p20 ); -;DigitalIn PB1(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); @@ -98,174 +91,200 @@ DigitalOut led3(LED3); DigitalOut led4(LED4); CAN can1(p9, p10); // CAN1 uses pins 9 and 10 (rx, tx) and pin 27 (rs) +DigitalOut can1_SleepMode(p27); // Use pin 27 to control the sleep mode of can1 CAN can2(p30, p29); // CAN2 uses pins 30 and 29 (rx, tx) and pin 28 (rs) +DigitalOut can2_SleepMode(p28); // Use pin 28 to control the sleep mode of can2 bool logCreated = false; -char logMsg[64]; +char counter = 0; +FILE *file; +char fileName[32] = "" ; +char writeBuffer[512][13]; +int bufPointer = 0; -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"); - +extern "C" void RTC_IRQHandler() { + timer.reset() ; // zero ms at the-seconds-tick + file = fopen(fileName, "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]); + } else { + for (int i = 0; i<bufPointer; i++) { + for (int j = 0; j<13; j++){ + fprintf(file,"%c",writeBuffer[i][j]); + } + } fclose(file); } + bufPointer = 0; + LPC_RTC->ILR |= (1<<0); // turn on Low Bit - works +} + +extern "C" void RTC_Init (void) { + LPC_RTC->ILR=0x00; // set up the RTC interrupts + //LPC_RTC->CIIR=0x02; // interrupts each minute + LPC_RTC->CIIR=0x01; // interrupts each second + //LPC_RTC->CCR = 0x11; // use for interrupts every minute ???? + //LPC_RTC->CCR = 0x00; // Stop the RTC (apparently) + LPC_RTC->CCR = 0x01; // Start RTC (apparently use for interrupt every second) + // NVIC_SetPriority( RTC_IRQn, LOW_PR ); + NVIC_EnableIRQ( RTC_IRQn ); +} + +unsigned short getTimeStamp() { + int msec = timer.read_ms() ; // read ms from the timer + unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 + int isecs = secs%60 ; // modulo 60 for 0-59 seconds from RTC + return ((isecs<<10)+msec) ; // return the two byte time stamp } -void Log (char *message) -{ - FILE *file; - - if (!logCreated) { - file = fopen(LOGFILE, "w"); - logCreated = true; +void readLog (){ + unsigned char c; + int i=0; + char lastMsgNum=0; + char curMsgNum=0; + pc.printf("printing file\n"); + file = fopen(fileName, "r"); + if (file == NULL) { + pc.printf("no file found\n"); } - else - file = fopen(LOGFILE, "a"); + while (!feof(file)) { + c=fgetc(file); + pc.printf("%02x ",c); + if (i==5){ + curMsgNum=c; + } + if (++i>12) { + if (curMsgNum>(lastMsgNum+1)) { + pc.printf(" ***"); + } + lastMsgNum=curMsgNum; + pc.printf("\n"); + i=0; + } + } + pc.printf("\n\n"); + fclose(file); +} - if (file == NULL) { - if (logCreated) - logCreated = false; - return; +void logCan (char mtype, CANMessage canRXmsg) { + unsigned short ts = getTimeStamp(); + writeBuffer[bufPointer][0]=mtype; + writeBuffer[bufPointer][1]=ts>>8; + writeBuffer[bufPointer][2]=ts&0xff; + writeBuffer[bufPointer][3]=canRXmsg.id&0xff; + writeBuffer[bufPointer][4]=(canRXmsg.id>>8)+(canRXmsg.len<<4); + for (int i = 5; i<13; i++){ + writeBuffer[bufPointer][i]=canRXmsg.data[i-5]; } - else - { - fputs(message, file); - fclose(file); - } + bufPointer++; } 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)); - + /*can1.write(CANMessage(0x351, &counter, 1)); + counter++; + can1.write(CANMessage(0x352, &counter, 1)); + counter++;*/ } - void recieve1() { - static CANMessage msg1; - unsigned short msgTime; - - msgTime=getTimeStamp(); + CANMessage msg1; + unsigned short 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]); + //pc.printf("%sCan1 Message received: %d \n", upLine, msg1.data[0]); if(logCreated) { - if((PB1==0)||(CD==0)){ + if((PB1==0)||(CD==0)) { logCreated=false; pc.printf("Stopping log\n", counter); readLog(); - }else{ - logCan(msg1); + } else { + logCan(1, msg1); } } led2 = !led2; } + void recieve2() { - static CANMessage msg2; - unsigned short msgTime; - int milisec; - - msgTime=getTimeStamp(); - milisec=timer.read_ms(); - + CANMessage msg2; + unsigned short msgTime=getTimeStamp(); + static int lastMsg = 0; 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 (msg2.data[0]>(lastMsg+1)) { + pc.printf("%sCan2 Message %d missed! \n\n\n", upLine, msg2.data[0]-1); + } + lastMsg=msg2.data[0]; + //pc.printf("%sCan2 Message received: %d \n", upLine, msg2.data[0]); if(logCreated) { - if((PB1==0)||(CD==0)){ + if((PB1==0)||(CD==0)) { logCreated=false; pc.printf("Stopping log\n\n", counter); readLog(); - }else{ - logCan(msg2); + } else { + logCan(2, msg2); } } led3 = !led3; } int main() { - pc.baud(115200); // change serial interface to pc to 115200, 8N1 + pc.baud(460800); // change serial interface to pc to 115200, 8N1 + CANMessage tsMsg; can1.frequency(1000000); can2.frequency(1000000); - //can1_SleepMode = 0; // Enable TX - //can2_SleepMode = 0; // Enable TX + 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); + PB1.mode(PullUp) ; //Pushbutton 1 can1.attach(&recieve1); can2.attach(&recieve2); timer.start() ; - + RTC_Init(); // start the RTC Interrupts that sync the timer + wait(1.1); // give time to sync if(CD == 1) { - pc.printf("Starting Can Log\n\n\n\n"); - Log(""); - } - else { - pc.printf("No SDRAM Inserted.\n\n\n\n"); + int fileNum = 0; + sprintf(fileName,"/sd/canary%d.evc",fileNum); + file = fopen(fileName, "r"); + while ((file != NULL)&&(fileNum++<100)) { + fclose(file); + sprintf(fileName,"/sd/canary%d.evc",fileNum); + file = fopen(fileName, "r"); + } + + file = fopen(fileName, "wb"); + if(file==NULL){ + pc.printf("\nUnable to open canlog\n\n\n\n"); + } else { + logCreated = true; + pc.printf("\nStarting Can Log %s\n\n\n\n",fileName); + unsigned long secs = time(NULL); // seconds past 12:00:00 AM 1 Jan 1900 + tsMsg.id=0xfff; + tsMsg.len=0xf; + tsMsg.data[0]=secs&0xff; + tsMsg.data[1]=(secs>>0)&0xff; + tsMsg.data[2]=(secs>>16)&0xff; + tsMsg.data[3]=secs>>24; + tsMsg.data[4]=0xff; + tsMsg.data[5]=0xff; + tsMsg.data[6]=0xff; + tsMsg.data[7]=0xff; + logCan(0,tsMsg); //write full timestamp + fclose(file); + + } + } else { + pc.printf("\nNo SDRAM Inserted.\n\n\n\n"); } + + + //.02 logs all; .01 misses some when logging; + //.05 gets all when not logging;.02 misses some always + ticker.attach(&send1, .002); //start sending messages } \ No newline at end of file