FBRLogger final version

Dependencies:   EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed

Committer:
intrinseca
Date:
Tue Feb 19 20:38:58 2013 +0000
Revision:
4:66928695da01
Parent:
3:32206cf84eb4
Child:
5:3c4f35ea3cd9
Add protobuf output

Who changed what in which revision?

UserRevisionLine numberNew contents of line
intrinseca 1:5f51069d5e09 1 #include "SDHCFileSystem.h"
intrinseca 2:2400fab06b33 2 #include "CANComms.h"
intrinseca 2:2400fab06b33 3 #include "State.h"
intrinseca 1:5f51069d5e09 4 #include <stdint.h>
intrinseca 3:32206cf84eb4 5 #include <fstream>
intrinseca 3:32206cf84eb4 6 #include <iomanip>
intrinseca 4:66928695da01 7 #include "pb.h"
intrinseca 4:66928695da01 8 #include "pb_encode.h"
intrinseca 4:66928695da01 9 #include "fbr.pb.h"
intrinseca 3:32206cf84eb4 10
intrinseca 3:32206cf84eb4 11 #define LOGGING_INTERVAL 0.1
intrinseca 3:32206cf84eb4 12 #define ANALOG_SCALE 3.3
intrinseca 1:5f51069d5e09 13
intrinseca 2:2400fab06b33 14 State car;
intrinseca 2:2400fab06b33 15 CANComms* can;
intrinseca 2:2400fab06b33 16
intrinseca 2:2400fab06b33 17 SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board
intrinseca 2:2400fab06b33 18
intrinseca 3:32206cf84eb4 19 AnalogIn analogInputs[] = {p15, p16, p17, p18, p19, p20};
intrinseca 2:2400fab06b33 20
intrinseca 2:2400fab06b33 21 Ticker sample;
intrinseca 1:5f51069d5e09 22
intrinseca 1:5f51069d5e09 23 char logFileName[50];
intrinseca 1:5f51069d5e09 24
intrinseca 1:5f51069d5e09 25 void writeLog_string(const char *data);
intrinseca 1:5f51069d5e09 26 void writeLog_data(const char *data, unsigned char length);
intrinseca 1:5f51069d5e09 27
intrinseca 1:5f51069d5e09 28 bool file_exists(const char * filename)
intrinseca 1:5f51069d5e09 29 {
intrinseca 3:32206cf84eb4 30 if (FILE * file = fopen(filename, "r")) {
intrinseca 1:5f51069d5e09 31 fclose(file);
intrinseca 1:5f51069d5e09 32 return true;
intrinseca 1:5f51069d5e09 33 }
intrinseca 1:5f51069d5e09 34 return false;
intrinseca 1:5f51069d5e09 35 }
intrinseca 1:5f51069d5e09 36
intrinseca 4:66928695da01 37 static bool write_callback(pb_ostream_t *stream, const uint8_t *buf, size_t count)
intrinseca 4:66928695da01 38 {
intrinseca 4:66928695da01 39 ostream* out = (ostream*)stream->state;
intrinseca 4:66928695da01 40 out->write(reinterpret_cast<const char*>(buf), count);
intrinseca 4:66928695da01 41 return out->bad();
intrinseca 4:66928695da01 42 }
intrinseca 4:66928695da01 43
intrinseca 2:2400fab06b33 44 void take_sample()
intrinseca 2:2400fab06b33 45 {
intrinseca 3:32206cf84eb4 46 ofstream out;
intrinseca 4:66928695da01 47 telemetry_message telemetry;
intrinseca 4:66928695da01 48
intrinseca 4:66928695da01 49 pb_ostream_t pb_out = {&write_callback, out, 1000, 0};
intrinseca 4:66928695da01 50 uint8_t zero = 0;
intrinseca 4:66928695da01 51
intrinseca 4:66928695da01 52 telemetry.rpm = car.rpm;
intrinseca 4:66928695da01 53 telemetry.throttle_pos = car.throttle_pos;
intrinseca 4:66928695da01 54 telemetry.manifold_pres = car.manifold_pres;
intrinseca 4:66928695da01 55 telemetry.air_temp = car.air_temp;
intrinseca 4:66928695da01 56 telemetry.coolant_temp = car.coolant_temp;
intrinseca 4:66928695da01 57 telemetry.lambda = car.lambda;
intrinseca 4:66928695da01 58 telemetry.speed = car.speed;
intrinseca 4:66928695da01 59 telemetry.gear = car.gear;
intrinseca 4:66928695da01 60 telemetry.oil_temp = car.oil_temp;
intrinseca 4:66928695da01 61 telemetry.warnings = car.warnings;
intrinseca 4:66928695da01 62 telemetry.voltage = car.voltage;
intrinseca 2:2400fab06b33 63
intrinseca 4:66928695da01 64 telemetry.accel_x = analogInputs[4].read();
intrinseca 4:66928695da01 65 telemetry.accel_y = analogInputs[5].read();
intrinseca 4:66928695da01 66
intrinseca 4:66928695da01 67 pb_encode(&pb_out, telemetry_message_fields, &telemetry);
intrinseca 4:66928695da01 68 pb_write(&pb_out, &zero, 1);
intrinseca 4:66928695da01 69
intrinseca 4:66928695da01 70 // float value;
intrinseca 4:66928695da01 71 //
intrinseca 4:66928695da01 72 // out.open(logFileName);
intrinseca 4:66928695da01 73 //
intrinseca 4:66928695da01 74 // // Write the Analog Sensors
intrinseca 4:66928695da01 75 //
intrinseca 4:66928695da01 76 // //Write the ECU data (in binary form)
intrinseca 4:66928695da01 77 // out.write(reinterpret_cast<char*>(&car), sizeof(State));
intrinseca 4:66928695da01 78 //
intrinseca 4:66928695da01 79 // out << endl;
intrinseca 4:66928695da01 80 // out.close();
intrinseca 2:2400fab06b33 81 }
intrinseca 2:2400fab06b33 82
intrinseca 3:32206cf84eb4 83 int main()
intrinseca 3:32206cf84eb4 84 {
intrinseca 1:5f51069d5e09 85 char logIndex = 0;
intrinseca 3:32206cf84eb4 86
intrinseca 1:5f51069d5e09 87 printf("FBR CAN Data Logger\n");
intrinseca 1:5f51069d5e09 88
intrinseca 2:2400fab06b33 89 mkdir("/sd/fbr", 0777);
intrinseca 3:32206cf84eb4 90
intrinseca 3:32206cf84eb4 91 do {
intrinseca 1:5f51069d5e09 92 sprintf(&logFileName[0], "/sd/fbr/log.%d", logIndex);
intrinseca 1:5f51069d5e09 93 logIndex++;
intrinseca 1:5f51069d5e09 94 } while(file_exists(&logFileName[0]));
intrinseca 3:32206cf84eb4 95
intrinseca 2:2400fab06b33 96 printf("Log File: %s\n", &logFileName[0]);
intrinseca 3:32206cf84eb4 97
intrinseca 1:5f51069d5e09 98 printf("Listening Started\n");
intrinseca 1:5f51069d5e09 99
intrinseca 3:32206cf84eb4 100 can = new CANComms(&car, true, LOGGING_INTERVAL);
intrinseca 3:32206cf84eb4 101 sample.attach(&take_sample, LOGGING_INTERVAL);
intrinseca 1:5f51069d5e09 102
intrinseca 3:32206cf84eb4 103 while(true) {
intrinseca 1:5f51069d5e09 104 __wfi();
intrinseca 1:5f51069d5e09 105 }
intrinseca 3:32206cf84eb4 106 }