.

Dependencies:   SDHCFileSystem mbed

main.cpp

Committer:
TickTock
Date:
2012-12-04
Revision:
7:281df0ba57d0
Parent:
6:594d9717e609
Child:
8:6872945e8e91

File content as of revision 7:281df0ba57d0:

#include "mbed.h"
#include "CAN.h"
#include "SDHCFileSystem.h"

#define upLine "\033[1A"
#define maxBufLen 2048

//CANcan.cpp

//LEAF OBD
//1:                
//2:
//3:    AVCAN-L     White/Blue
//4:   
//5:    VSS         Brown,White/Brown
//6:    CARCAN-H    Green                   --> VP230b:7
//7:
//8:    12V-SW      Orange,White/Orange
//9:
//10:
//11:   AVCAN-H     Blue
//12:   EVCAN-L     White/Grey              --> VP230a:6
//13:   EVCAN-H     Grey                    --> VP230a:7
//14:   CARCAN-L    White/Green             --> VP230b:6
//15:                                     6V
//16:   12V-AON     Red/Blue,Blue/Red ----|<---- LPC1768:2
//note 1: pins 4 & 5 longer
//note 2: pins 12 & 13 next to key
//note 3: pins 1 & 9 on right side looking into male connector with key on bottom

//VP230
//1:D   
//2:GND 
//3:VCC 
//4:R   
//5:Vref
//6:CANL        --> OBD:12,14
//7:CANH        --> OBD:13,6
//8:RS          --> LPC1768:27,28

//LPC1768
//1:    VSS                             6V
//2:        NC:VIN  (4.5-9V supply) ---->|---- OBD:16
//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

void Log (char *message);
void LogErr (char *message);
extern "C" void mbed_reset();

time_t seconds ;
DigitalIn  CD(p17); 
DigitalIn  PB1( p20 );
SDFileSystem sd(p5, p6, p7, p8, "sd" ); // SDFileSystem::SDFileSystem(PinName mosi, PinName miso, PinName sclk, PinName cs, const char* name)
//Ticker ticker1;
//Ticker ticker2;
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)
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 logOpen = false;
FILE *file;
char fileName[32] = "" ;
char writeBuffer[maxBufLen][13];
int bufPointer = 0;

Serial pc(USBTX, USBRX); // tx, rx   default settings (9600 8N1)

extern "C" void RTC_IRQHandler() {
    static int i=0;
    timer.reset() ; // zero ms at the-seconds-tick
    if (logOpen) {
        file = fopen(fileName, "ab");
        if (file == NULL) {
            logOpen = false;
            pc.printf("Failed to append log file.\n\n");
        } else {
            while (i != bufPointer) {
                for (int j = 0; j<13; j++){
                    fprintf(file,"%c",writeBuffer[i][j]);
                }
                if(++i >= maxBufLen)
                    i=0;
            }
            led3 = !led3;
            fclose(file);
        }
    }

    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, 10 );
    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 readLog (){
    unsigned char c;
    int i=0;
    char lastMsgNum[]={0,0};
    char curMsgNum[]={0,0};
    char canNum=0;
    pc.printf("printing file\n");
    file = fopen(fileName, "r");
    if (file == NULL) {
        pc.printf("no file found\n");
    }
    while (!feof(file)) {
        c=fgetc(file);
        pc.printf("%02x ",c);
        if (i==0){
            canNum=c;
        }else if (i==5){
            curMsgNum[canNum]=c;
        }
        if (++i>12) {
            if (curMsgNum[canNum]>(lastMsgNum[canNum]+1)) {
                pc.printf(" ***");
            }
            lastMsgNum[canNum]=curMsgNum[canNum];
            pc.printf("\n");
            i=0;
        }
    }
    pc.printf("\n\n\n\n");
    fclose(file);
}

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];
    }
    if (++bufPointer >= maxBufLen) {
        bufPointer = 0;
        led4 = !led4;
    }
}

void send1() {
    static char counter = 0; // use for fake data
    can1.write(CANMessage(0x350, &counter, 1));
    counter++;
    can1.write(CANMessage(0x351, &counter, 1));
    counter++;
    can1.write(CANMessage(0x352, &counter, 1));
    counter++;
}

void send2() {
    static char counter = 0; // use for fake data
    can2.write(CANMessage(0x351, &counter, 1));
    counter++;
    can2.write(CANMessage(0x351, &counter, 1));
    counter++;
    can2.write(CANMessage(0x352, &counter, 1));
    counter++;
}

void recieve1() {
    CANMessage msg1;
    unsigned short msgTime=getTimeStamp();
    static int lastMsg1 = 0;
    can1.read(msg1);
    if (msg1.id!=0x000) {
        if (msg1.data[0]>(lastMsg1+1)) {
            pc.printf("%sCan1 Message %d missed!    \n", upLine, lastMsg1+1);
        }
        lastMsg1=msg1.data[0];
        if(logOpen) {
            logCan(1, msg1);
        }
        led1 = !led1;
    }
}

void recieve2() {
    CANMessage msg2;
    unsigned short msgTime=getTimeStamp();
    static int lastMsg2 = 0;
    can2.read(msg2);
    if (msg2.id!=0x000) {
        if (msg2.data[0]>(lastMsg2+1)) {
            pc.printf("%sCan2 Message %d missed!    \n", upLine, lastMsg2+1);
        }
        lastMsg2=msg2.data[0];
        if(logOpen) {
            logCan(2, msg2);
        }
        led2 = !led2;
    }
}

int main() {
    pc.baud(460800);        // change serial interface to pc to 115200, 8N1
    CANMessage tsMsg;
    can1.frequency(500000);
    can2.frequency(500000);
    //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
    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

    while (true) {
        if(CD == 1) {
            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");
                mbed_reset();
            } else {
                logOpen = 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);
            }
            //ticker1.attach(&send1, .0052); //start sending messages
            //ticker2.attach(&send2, .0051); //start sending messages
            
            while ((PB1==1)&&(CD==1)){
                wait(0.25); // Keep logging until button pushed or SDRAM removed
            }
            //ticker1.detach();
            //ticker2.detach();
            logOpen=false;
            pc.printf("Stopping log\n\n");
            wait(1);
            if (CD==1)
                readLog();
        } else {
            pc.printf("\nNo SDRAM Inserted.\n\n\n\n");
        }
        wait(1);
    }
}