FBRLogger final version
Dependencies: EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed
main.cpp@4:66928695da01, 2013-02-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |