FBRLogger final version

Dependencies:   EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed

main.cpp

Committer:
intrinseca
Date:
2013-02-19
Revision:
4:66928695da01
Parent:
3:32206cf84eb4
Child:
5:3c4f35ea3cd9

File content as of revision 4:66928695da01:

#include "SDHCFileSystem.h"
#include "CANComms.h"
#include "State.h"
#include <stdint.h>
#include <fstream>
#include <iomanip>
#include "pb.h"
#include "pb_encode.h"
#include "fbr.pb.h"

#define LOGGING_INTERVAL    0.1
#define ANALOG_SCALE        3.3

State car;
CANComms* can;

SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board

AnalogIn analogInputs[] = {p15, p16, p17, p18, p19, p20};

Ticker sample;

char logFileName[50];

void writeLog_string(const char *data);
void writeLog_data(const char *data, unsigned char length);

bool file_exists(const char * filename)
{
    if (FILE * file = fopen(filename, "r")) {
        fclose(file);
        return true;
    }
    return false;
}

static bool write_callback(pb_ostream_t *stream, const uint8_t *buf, size_t count)
{
    ostream* out = (ostream*)stream->state;
    out->write(reinterpret_cast<const char*>(buf), count);
    return out->bad();
}

void take_sample()
{
    ofstream out;
    telemetry_message telemetry;
    
    pb_ostream_t pb_out = {&write_callback, out, 1000, 0};
    uint8_t zero = 0;
    
    telemetry.rpm = car.rpm;
    telemetry.throttle_pos = car.throttle_pos;
    telemetry.manifold_pres = car.manifold_pres;
    telemetry.air_temp = car.air_temp;
    telemetry.coolant_temp = car.coolant_temp;
    telemetry.lambda = car.lambda;
    telemetry.speed = car.speed;
    telemetry.gear = car.gear;
    telemetry.oil_temp = car.oil_temp;
    telemetry.warnings = car.warnings;
    telemetry.voltage = car.voltage;
    
    telemetry.accel_x = analogInputs[4].read();
    telemetry.accel_y = analogInputs[5].read();
    
    pb_encode(&pb_out, telemetry_message_fields, &telemetry);
    pb_write(&pb_out, &zero, 1);
    
//    float value;
//
//    out.open(logFileName);
//
//    // Write the Analog Sensors
//
//    //Write the ECU data (in binary form)
//    out.write(reinterpret_cast<char*>(&car), sizeof(State));
//    
//    out << endl;
//    out.close();
}

int main()
{
    char logIndex = 0;

    printf("FBR CAN Data Logger\n");

    mkdir("/sd/fbr", 0777);

    do {
        sprintf(&logFileName[0], "/sd/fbr/log.%d", logIndex);
        logIndex++;
    } while(file_exists(&logFileName[0]));

    printf("Log File: %s\n", &logFileName[0]);

    printf("Listening Started\n");

    can = new CANComms(&car, true, LOGGING_INTERVAL);
    sample.attach(&take_sample, LOGGING_INTERVAL);

    while(true) {
        __wfi();
    }
}