FBRLogger final version

Dependencies:   EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed

Committer:
intrinseca
Date:
Tue Feb 19 21:37:32 2013 +0000
Revision:
5:3c4f35ea3cd9
Parent:
4:66928695da01
Child:
6:9d9e7c9adc7c
Scale the Accelerometer values

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