test code megasquirt and digole lcd

Dependencies:   FatFileSystem mbed

main.cpp

Committer:
jpnovak
Date:
2015-11-27
Revision:
0:7ea8f0d27a4f

File content as of revision 0:7ea8f0d27a4f:

//Code Designed to display run-time variables from a Megasquirt Fuel Injection controller.
//This is the base code to load variables and print to DigoleSerialDisp and write them to a file.  File format is .FRD for import into EFI Analytics tuner Studio

#include "mbed.h"
//#include "TextDigoleSerialDisp.h"
#include "SDFileSystem.h"
#include "SerialBuffered.h"
//#include "LIS302.h"


//SD Card pin assignment
SDFileSystem sd(p11, p12, p13, p14, "sd");//DI, D0, SCK, CS

AnalogIn SDenable(p20);//define SD card switch
DigitalOut myled1(LED1);//define LED
Serial loggerSerial(USBTX, USBRX);
Timer t;

LocalFileSystem local("local");



//Serial usb(USBTX, USBRX); //define USB connection pins
SerialBuffered megasquirt(120, p28, p27);  // that 128 is the size of the read buffer it will make for you

Serial DigoleSerialDisp(p9, p10);//UART DigoleSerialDisp(PinName TX, PinName RX);

DigitalOut usb_activity(LED1); //define USB activity
DigitalOut megasquirt_activity(LED2); //define Megasquirt activity
unsigned char      tmp_data[16];
unsigned char       buf[120];
int tmp;
float Time;
long float SecL; //get secoonds
long float        PW;//get pulseWidth1
long float        PW2; //get pulseWidth2
int        RPM; //get Rpm
float DutyCycle; //Injector Duty Cycle
float DutyCycle2; //Injector Bank2 Duty  Cycle
long float        SparkAdv; //get advance
float        squirt; //get squirt
float        Engine; //get squirt
float       afrtgt1; //get AFR target - Table 1
float        afrtgt2; //get AFR target - Table 2
float        wbo2_en1; //get WideBand Valid1
float        wbo2_en2; //get WideBand Valid2
long float       barometer; //get Barometer
long float        MAP; //get manifold absolute pressure MAP
long float        MAT; //get manifold absolute temperature (MAT)
long float      CLT; //get coolant temperature (CLT)
long float        TP; //get Throttle Position Sensor (TPS)
long float        vBatt; //get BAttery Voltage
long float        AFR; //get Realtime AFR for VE1
long float        AFR2; //get Realtime AFR for VE2
long float        knock; //get Knock Threshold Value
long float       Gego; //get egoCorrrection1 amount %
long float        Gego2; //get egoCorrrection2 amount %
long float       Gair; //get air correction (G_air)
long float        Gwarmup; //get Warmup Enrichment
long float        TPSacc; //get accel enrichment (ms)
long float        TPScut; //get TPS based fuel cut %
long float       Gbaro; //get baroCorrection %
long float       Gammae; //get gammaEnrich %
long float        veCurr1; //get Current VE value Table 1
long float        veCurr2; //get Current VE value Table 2
long float        IAC; //get IAC Step %
long float        ColdAdv; //get Cold Ignition Advance
long float       tpsDOT;    //get Rate of Change TPS
long float        mapDOT;  //get Rate of Change MAP
long float        Dwell; //get Ignition Dwell
long float        maf; //get MAF - Mass Air Flow
long float       fuelload; //get MAP/TPS Blend %
long float        Ethanol; //get fuel load percent alchohol
char                portstatus; //get Spare Port Status
char        knockRetard; //get Knock timing retard (deg)
long float        EAEFuelCorr; //get EAE Fuel correction
long float        egoV; //get egoV
long float        egoV2; //get egoV2
char        status1; //get Status1
char        status2; //get Status2
char        status3; //get Status3
char        status4; //get Status4
long float        looptime; //get looptime
char        status5; //get Status5
long float        tpsADC; //get tpsADC
long float        fuelload2; //get fuelload2
long float        ignload; //get ignload
long float        ignload2; //get ignload2
char        syncstatus; //get Sync-Status (0 - sync-error, 1 - syncstatus)
float        deltaT; //get deltaT
long float        wallfuel; //get wallfuel

int runtime;


unsigned char data_out;
int n;
int row;
int column;
int i;
char MSII_288Header[] = {0x46,0x52,0x44,0x00,0x00,0x00,0x00,0x01,0x4b,0x61,0xf1,0x63,0x4d,0x53,0x49,0x49,0x20,0x52,0x65,0x76,0x20,0x32,0x2e,0x38,0x38,0x30,0x30,0x30,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x70};//file header
char MSIIExtraHeader[] = {0x46,0x52,0x44,0x00,0x00,0x00,0x00,0x01,0x4b,0x6a,0xf3,0xa8,0x4d,0x53,0x32,0x45,0x78,0x74,0x72,0x61,0x20,0x52,0x65,0x6c,0x20,0x32,0x2e,0x31,0x2e,0x31,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x00,0x91};
char parse_header[] = {0x01,0x00};//data header


/*DigoleSerialDisp 2x20 parallel code pin assignment*/
//TextDigoleSerialDisp DigoleSerialDisp(p21, p22, p23, p24, p25, p26, p30, 20, 2); // (rs, rw, e, d0, d1, d2, d3, n_column, n_rows)
//define file write
//AnalogIn file_writeenable(p20);//define SD card switch


//enter main loop
int main() {


  DigoleSerialDisp.baud(9600);//set Digole Serial Baud Rate
//    unsigned char tmp;
//    unsigned char data_in;

/////Startup Screen////////////
DigoleSerialDisp.printf("CL\r");//clear screen
//DigoleSerialDisp.init_Display();
//DigitalOut myled(LED1);
DigoleSerialDisp.printf("  DashView V2.1  ");
wait(3);
DigoleSerialDisp.printf("CL\r");//clear screen
DigoleSerialDisp.printf("SD3\r\n");//set rotation 0=0deg,1=90deg,2=180deg,3=270deg
DigoleSerialDisp.printf("TRT");//offset Line 1 in housing
DigoleSerialDisp.printf("SF3\rTT Have a great drive\r\n");
DigoleSerialDisp.printf("TRT");//next line

////////////End Startup Screen//////////
    megasquirt.baud(115200); //define MEgasquirt serial speed
    loggerSerial.baud(115200); //define USB connection speed
/*
//file header setup
    FILE *fp = fopen("/sd/datalog.csv", "a");
    //print header for MS.csv file
    fprintf(fp, "MSII Rev 2.88000, \nTime,SecL,RPM,MAP,TP,vBatt,AFR,MAT,CLT,Engine,Gego,Gair,Gwarm,Gbaro,Gammae,TPSacc,PW,DutyCycle,PW2,DutyCycle2,SparkAdv,ColdAdv,Dwell,tpsDOT,mapDOT,IAC,deltaT,Ethanol%,\n");

    fclose(fp);
*/
    t.start();

    while (1) {

//        char c = loggerSerial.getc();
        //temporary call function using keyboard - in future will trigger automatically.
//        if ((c == 'a'))
//       {
        //DigoleSerialDisp.printf(" "); //print space for data output format
        //poll serial device for data stream (a,0,6) to (request, return, confirm)
        megasquirt.putc(97);//send 97 for run parameters, 83 for board revision, 81 code for revision number
        wait(0.005);
        megasquirt.putc(0);
        wait(0.005);
        megasquirt.putc(6);
        int actuallyRead = megasquirt.readBytes( buf, 112); // where 112 is the number of bytes you are expecting


//decodeMS();

        Time = t.read();

//void decodeMS() {

//get seconds
        tmp = buf[0];
        tmp = tmp << 8;
        SecL = tmp | buf[1];
        //MSseconds = MSseconds/256;
//get pulseWidth1
        tmp = buf[2];
        tmp = tmp << 8;
        tmp = tmp | buf[3];
        PW = tmp*0.000666;


//get pulseWidth2
        tmp = buf[4];
        tmp = tmp << 8;
        tmp = tmp | buf[5];
        PW2 = tmp*0.000666;
//get Rpm
        tmp = buf[6];
        tmp = tmp << 8;
        RPM = tmp | buf[7];

//Calculate DutyCycle
        DutyCycle = (PW * (RPM / 60)) / 10;

//Calculate DutyCycle2
        DutyCycle2 = (PW2 * (RPM / 60)) / 10;


//get advance
        tmp = buf[8];
        tmp = tmp << 8;
        tmp = tmp | buf[9];
        SparkAdv = tmp/10;
//get squirt
        squirt = buf[10];
//get engine
        Engine = buf[11];
//get AFR target - Table 1
        afrtgt1 = buf[12]*10;

//get AFR target - Table 2
        afrtgt2 = buf[13]*10;
//get WideBand Valid1
        wbo2_en1 = buf[14];
//get WideBand Valid2
        wbo2_en2 = buf[15];
//get Barometer
        tmp = buf[16];
        tmp = tmp << 8;
        tmp = tmp | buf[17];
        barometer = tmp/10;

//get manifold absolute pressure MAP
        tmp = buf[18];
        tmp = tmp << 8;
        MAP = tmp | buf[19];
        MAP = MAP/10;
//get manifold absolute temperature (MAT)
        tmp = buf[20];
        tmp = tmp << 8;
        MAT = tmp | buf[21];
       MAT = MAT/10; ///for Farenheit
        MAT = 0.555*(MAT - 32); //for Celcius
//get coolant temperature (CLT)
        tmp = buf[22];
        tmp = tmp << 8;
        CLT = tmp | buf[23];
        CLT = CLT/10;
        CLT = 0.555*(CLT - 32); //for Celcius
//get Throttle Position Sensor (TPS)
        tmp = buf[24];
        tmp = tmp << 8;
        TP = tmp | buf[25];
        TP = TP / 10;
//get BAttery Voltage
        tmp = buf[26];
        tmp = tmp << 8;
        vBatt = tmp | buf[27];
        vBatt = vBatt /10,
//get Realtime AFR for VE1
                tmp = buf[28];
        tmp = tmp  << 8;
        AFR = tmp | buf[29];
        AFR = AFR /10;
//get Realtime AFR for VE2
        tmp = buf[30];
        tmp  = tmp << 8;
        AFR2 = tmp  | buf[31];
        AFR2 = AFR2 / 10;


//get Knock Threshold Value
        tmp = buf[32];
        tmp = tmp << 8;
        knock = tmp | buf[33];
        knock = knock /10;
//get egoCorrrection1 amount %
        tmp = buf[34];
        tmp  = tmp  << 8;
        Gego = tmp | buf[35];
//get egoCorrrection2 amount %
        tmp = buf[36];
        tmp = tmp << 8;
        Gego2 = tmp | buf[37];
//get air correction (G_air)
        tmp = buf[38];
        tmp  = tmp << 8;
        Gair = tmp | buf[39];
//get Warmup Enrichment
        tmp = buf[40];
        tmp = tmp << 8;
        Gwarmup = tmp | buf[41];

//get accel enrichment (ms)
        tmp = buf[42];
        tmp = tmp << 8;
        TPSacc = tmp | buf[43];
        TPSacc = TPSacc/10;
//get TPS based fuel cut %
        tmp = buf[44];
        tmp = tmp << 8;
        TPScut = tmp | buf[45];
//get baroCorrection %
        tmp = buf[46];
        tmp = tmp << 8;
        Gbaro = tmp | buf[47];
//get gammaEnrich %
        tmp = buf[48];
        tmp = tmp << 8;
        Gammae = tmp | buf[49];

//get Current VE value Table 1
        tmp = buf[50];
        tmp  = tmp << 8;
        veCurr1 = tmp | buf[51];
        veCurr1 = veCurr1/10;
//get Current VE value Table 2
        tmp = buf[52];
        tmp  = tmp  << 8;
        veCurr2 = tmp  | buf[53];
        veCurr2 = veCurr2/10;
//get IAC Step %
        tmp = buf[54];
        tmp = tmp << 8;
        IAC = tmp | buf[55];
//get Cold Ignition Advance
        tmp = buf[56];
        tmp = tmp << 8;
        ColdAdv = tmp | buf[57];
        ColdAdv = ColdAdv/10;
//get Rate of Change TPS
        tmp = buf[58];
        tmp = tmp << 8;
        tpsDOT = tmp | buf[59];
        tpsDOT = tpsDOT/10;
//get Rate of Change MAP
        tmp = buf[60];
        tmp = tmp << 8;
        mapDOT = tmp | buf[67];
//get Ignition Dwell
        tmp = buf[62];
        tmp = tmp  << 8;
        Dwell = tmp | buf[63];
        Dwell = Dwell*0.6666;
//get MAF - Mass Air Flow
        tmp = buf[64];
        tmp = tmp << 8;
        maf = tmp | buf[65];
//get MAP/TPS Blend %
        tmp = buf[66];
        tmp = tmp << 8;
        fuelload = tmp | buf[67];
        fuelload = fuelload/10;
//get fuel load percent alchohol
        tmp = buf[68];
        tmp = tmp  << 8;
        Ethanol = tmp  | buf[69];

//get Spare Port Status
        portstatus = buf[70];
//get Knock timing retard (deg)
        knockRetard = buf[71];
        knockRetard = knockRetard/10;
//get EAE Fuel correction
        tmp = buf[72];
        tmp = tmp << 8;
        EAEFuelCorr  = tmp  | buf[73];

//get egoV
        tmp = buf[74];
        tmp = tmp  << 8;
        egoV = tmp  | buf[75];
        egoV = egoV/100;
//get egoV2
        tmp = buf[76];
        tmp = tmp << 8;
        egoV2 = tmp | buf[77];
        egoV2 = egoV2/100;
//get Status1
        status1 = buf[78];
//get Status2
        status2 = buf[79];
//get Status3
        status3 = buf[80];
//get Status4
        status4 = buf[81];
//get looptime
        tmp = buf[82];
        tmp = tmp << 8;
        looptime = tmp | buf[83];
        looptime = looptime*0.6667;
//get Status5
        status5 = buf[84];
//get tpsADC
        tmp = buf[85];
        tmp = tmp << 8;
        tpsADC = tmp | buf[86];
//get fuelload2
        tmp  = buf[87];
        tmp  = tmp  << 8;
        fuelload2 = tmp | buf[88];
//get ignload
        tmp = buf[89];
        tmp = tmp << 8;
        ignload = tmp | buf[90];
        ignload = ignload/100;
//get ignload2
        tmp = buf[91];
        tmp = tmp << 8;
        ignload2 = tmp  | buf[92];
        ignload2 = ignload2/100;
//get Sync-Status (0 - sync-error, 1 - syncstatus)
        syncstatus = buf[104];

//get deltaT
        tmp = buf[106];
        tmp = tmp  << 8;
        deltaT = tmp | buf[107];
//get wallfuel
        tmp = buf[110];
        tmp = tmp << 8;
        wallfuel = tmp  | buf[111];

///Display Parameters to DigoleSerialDisp///////////  
DigoleSerialDisp.printf("SF3\r\n");
DigoleSerialDisp.printf("SD3\r\n");//set rotation 0=0deg,1=90deg,2=180deg,3=270deg
DigoleSerialDisp.printf("TRT");//offset Line 1 in housing

        //DigoleSerialDisp.locate(0,1);
        DigoleSerialDisp.printf("TT Volt=%4.1f \r\nTRT TT AFR =%4.1f\r\n TRT TT MAT= %3.0f C\r\nTRT TT CLT= %3.0f C\r\nTRT",vBatt,AFR,MAT,CLT);
        DigoleSerialDisp.printf("TRT");//next line

        //DigoleSerialDisp.locate(0,0);
        //DigoleSerialDisp.printf("TT AFR =%4.1f\r\n", AFR);
        //DigoleSerialDisp.printf("TRT");//next line



//get manifold absolute temperature (MAT)
 /*
        //DigoleSerialDisp.locate(10,1);
        DigoleSerialDisp.printf("TT MAT= %3.0f C\r\n", MAT);
        DigoleSerialDisp.printf("TRT");//next line
        
//get Clt
       // CLT = 0.5555*(CLT - 32); //for Celcius  
        //DigoleSerialDisp.locate(10,0);
        DigoleSerialDisp.printf("TT CLT= %3.0f C\r\n", CLT);
        DigoleSerialDisp.printf("TRT");//next line
 */       
        DigoleSerialDisp.printf("CL\r");//clear screen

/*
////////////////////////write to SD Card////////////////////////////////
        if (SDenable > 0.5) //switch enable
        {
            myled1 = 1;
            FILE *fp = fopen("/sd/datalog.csv", "a");
            fprintf(fp, "%8.3f, %4f, %i, %4.1f, %3f, %4.1f, %4.1f, %5.1f, %5.1f, %f, %f, %f, %f, %f, %f, %f, %f, %4.1f, %f, %4.1f, %f, %f, %f, %f, %f, %f, %f, %i, \n", Time, SecL, RPM, MAP, TP, vBatt, AFR, MAT, CLT, Engine, Gego, Gair, Gwarmup, Gbaro, Gammae, TPSacc, PW, DutyCycle,  PW2, DutyCycle2, SparkAdv, ColdAdv, Dwell, tpsDOT, mapDOT, IAC, deltaT, Ethanol);
            fclose(fp);
        } else {
            myled1 = 0;
        }
*/
    }
}

//exit main loop