.

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");
    }
}