.

Dependencies:   SDHCFileSystem mbed

Files at this revision

API Documentation at this revision

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

DebounceIn.lib Show diff for this revision Revisions of this file
TextLCD.lib Show diff for this revision Revisions of this file
beep.lib Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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