FBRLogger final version
Dependencies: EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed
main.cpp@6:9d9e7c9adc7c, 2013-02-19 (annotated)
- Committer:
- intrinseca
- Date:
- Tue Feb 19 22:00:37 2013 +0000
- Revision:
- 6:9d9e7c9adc7c
- Parent:
- 5:3c4f35ea3cd9
- Child:
- 8:99cca8c964e6
Change to official SD card library and update mbed library to latest version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
intrinseca | 6:9d9e7c9adc7c | 1 | #include "SDFileSystem.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 | } |