FBRLogger final version
Dependencies: EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed
main.cpp@1:5f51069d5e09, 2013-02-10 (annotated)
- Committer:
- intrinseca
- Date:
- Sun Feb 10 13:19:37 2013 +0000
- Revision:
- 1:5f51069d5e09
- Parent:
- 0:6f69ea2839fa
- Child:
- 2:2400fab06b33
decode megasquirt messages
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
intrinseca | 1:5f51069d5e09 | 1 | #include "SDHCFileSystem.h" |
intrinseca | 1:5f51069d5e09 | 2 | #include <stdint.h> |
intrinseca | 1:5f51069d5e09 | 3 | |
intrinseca | 1:5f51069d5e09 | 4 | //SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board |
intrinseca | 1:5f51069d5e09 | 5 | CAN can1(p30, p29); //Needs to be CAN1 - SD takes CAN0 |
intrinseca | 1:5f51069d5e09 | 6 | |
intrinseca | 1:5f51069d5e09 | 7 | char logFileName[50]; |
intrinseca | 1:5f51069d5e09 | 8 | Timer messageTimer; |
intrinseca | 1:5f51069d5e09 | 9 | |
intrinseca | 1:5f51069d5e09 | 10 | void writeLog_string(const char *data); |
intrinseca | 1:5f51069d5e09 | 11 | void writeLog_data(const char *data, unsigned char length); |
intrinseca | 1:5f51069d5e09 | 12 | |
intrinseca | 1:5f51069d5e09 | 13 | Ticker canPoll; |
intrinseca | 1:5f51069d5e09 | 14 | |
intrinseca | 1:5f51069d5e09 | 15 | void can_interrupt() |
intrinseca | 1:5f51069d5e09 | 16 | { |
intrinseca | 1:5f51069d5e09 | 17 | int time; |
intrinseca | 1:5f51069d5e09 | 18 | |
intrinseca | 1:5f51069d5e09 | 19 | uint16_t tps; |
intrinseca | 1:5f51069d5e09 | 20 | uint16_t battery; |
intrinseca | 1:5f51069d5e09 | 21 | |
intrinseca | 1:5f51069d5e09 | 22 | CANMessage msg; |
intrinseca | 1:5f51069d5e09 | 23 | |
intrinseca | 1:5f51069d5e09 | 24 | time = messageTimer.read_us(); |
intrinseca | 1:5f51069d5e09 | 25 | |
intrinseca | 1:5f51069d5e09 | 26 | char logMessage[17]; |
intrinseca | 1:5f51069d5e09 | 27 | |
intrinseca | 1:5f51069d5e09 | 28 | while(can1.read(msg)) |
intrinseca | 1:5f51069d5e09 | 29 | { |
intrinseca | 1:5f51069d5e09 | 30 | printf("CAN Message %08X %d %02X%02X%02X%02X%02X%02X%02X%02X\n", msg.id, msg.len, |
intrinseca | 1:5f51069d5e09 | 31 | msg.data[0], |
intrinseca | 1:5f51069d5e09 | 32 | msg.data[1], |
intrinseca | 1:5f51069d5e09 | 33 | msg.data[2], |
intrinseca | 1:5f51069d5e09 | 34 | msg.data[3], |
intrinseca | 1:5f51069d5e09 | 35 | msg.data[4], |
intrinseca | 1:5f51069d5e09 | 36 | msg.data[5], |
intrinseca | 1:5f51069d5e09 | 37 | msg.data[6], |
intrinseca | 1:5f51069d5e09 | 38 | msg.data[7] |
intrinseca | 1:5f51069d5e09 | 39 | ); |
intrinseca | 1:5f51069d5e09 | 40 | |
intrinseca | 1:5f51069d5e09 | 41 | tps = (msg.data[0] << 8) | msg.data[1]; |
intrinseca | 1:5f51069d5e09 | 42 | battery = (msg.data[2] << 8) | msg.data[3]; |
intrinseca | 1:5f51069d5e09 | 43 | |
intrinseca | 1:5f51069d5e09 | 44 | printf("TPS: %f\n", tps / 10.0); |
intrinseca | 1:5f51069d5e09 | 45 | printf("Bat: %f\n", battery / 10.0); |
intrinseca | 1:5f51069d5e09 | 46 | //printf("Bat: %fV\n", (((int)msg.data[2] << 8) & (int)msg.data[3]) / 10.0); |
intrinseca | 1:5f51069d5e09 | 47 | |
intrinseca | 1:5f51069d5e09 | 48 | memcpy(&logMessage[0], &time, 4); |
intrinseca | 1:5f51069d5e09 | 49 | memcpy(&logMessage[4], &msg.id, 4); |
intrinseca | 1:5f51069d5e09 | 50 | memcpy(&logMessage[8], &msg.len, 1); |
intrinseca | 1:5f51069d5e09 | 51 | memcpy(&logMessage[9], &msg.data, 8); |
intrinseca | 1:5f51069d5e09 | 52 | |
intrinseca | 1:5f51069d5e09 | 53 | writeLog_data(&logMessage[0], sizeof(logMessage)); |
intrinseca | 1:5f51069d5e09 | 54 | } |
intrinseca | 1:5f51069d5e09 | 55 | } |
intrinseca | 1:5f51069d5e09 | 56 | |
intrinseca | 1:5f51069d5e09 | 57 | void poll_can() |
intrinseca | 1:5f51069d5e09 | 58 | { |
intrinseca | 1:5f51069d5e09 | 59 | //MS encodes most of the request params in the message ID. |
intrinseca | 1:5f51069d5e09 | 60 | //Alignment is weird because the ID really includes some non-data bits. MS worked round these, mBed just skips them |
intrinseca | 1:5f51069d5e09 | 61 | |
intrinseca | 1:5f51069d5e09 | 62 | //0-2 2 bits Spare on MSII |
intrinseca | 1:5f51069d5e09 | 63 | //3-6 4 bits Block to get data from. 7 = outpc, all the stuff that MS sends to the PC via serial |
intrinseca | 1:5f51069d5e09 | 64 | //7-10 4 bits To ID - 0 for MS |
intrinseca | 1:5f51069d5e09 | 65 | //11-14 4 bits From ID - Using 3 here for no good reason |
intrinseca | 1:5f51069d5e09 | 66 | //15-17 3 bits Message type. 1 to get data, response has 2 |
intrinseca | 1:5f51069d5e09 | 67 | //18-28 11 bits Offset into the block in bits 3-6. Look in the INI file for Tuner Studio to find these, |
intrinseca | 1:5f51069d5e09 | 68 | // [OutputChannels] section starting line 3036 |
intrinseca | 1:5f51069d5e09 | 69 | |
intrinseca | 1:5f51069d5e09 | 70 | CANMessage msg(0x00609838, 0, 3, CANData, CANExtended); |
intrinseca | 1:5f51069d5e09 | 71 | //CANMessage msg(); |
intrinseca | 1:5f51069d5e09 | 72 | |
intrinseca | 1:5f51069d5e09 | 73 | msg.data[0] = 0; //Where to put the response - used when communicating between MS's to tell them where they wanted the data put |
intrinseca | 1:5f51069d5e09 | 74 | msg.data[1] = 0; //Offset into the table specified in data[0] |
intrinseca | 1:5f51069d5e09 | 75 | msg.data[2] = 8; //How many bytes of the source table we want |
intrinseca | 1:5f51069d5e09 | 76 | |
intrinseca | 1:5f51069d5e09 | 77 | //CANMessage msg(0); |
intrinseca | 1:5f51069d5e09 | 78 | |
intrinseca | 1:5f51069d5e09 | 79 | if(can1.write(msg)) |
intrinseca | 1:5f51069d5e09 | 80 | { |
intrinseca | 1:5f51069d5e09 | 81 | printf("Polled\n"); |
intrinseca | 1:5f51069d5e09 | 82 | } |
intrinseca | 1:5f51069d5e09 | 83 | } |
intrinseca | 1:5f51069d5e09 | 84 | |
intrinseca | 1:5f51069d5e09 | 85 | void writeLog_string(const char *data) |
intrinseca | 1:5f51069d5e09 | 86 | { |
intrinseca | 1:5f51069d5e09 | 87 | writeLog_data(data, strlen(data)); |
intrinseca | 1:5f51069d5e09 | 88 | } |
intrinseca | 1:5f51069d5e09 | 89 | |
intrinseca | 1:5f51069d5e09 | 90 | void writeLog_data(const char *data, unsigned char length) |
intrinseca | 1:5f51069d5e09 | 91 | { |
intrinseca | 1:5f51069d5e09 | 92 | /*FILE *logFile; |
intrinseca | 1:5f51069d5e09 | 93 | |
intrinseca | 1:5f51069d5e09 | 94 | logFile = fopen(&logFileName[0], "a"); |
intrinseca | 1:5f51069d5e09 | 95 | |
intrinseca | 1:5f51069d5e09 | 96 | if(logFile == NULL) |
intrinseca | 1:5f51069d5e09 | 97 | { |
intrinseca | 1:5f51069d5e09 | 98 | error("Could not open file for write\n"); |
intrinseca | 1:5f51069d5e09 | 99 | } |
intrinseca | 1:5f51069d5e09 | 100 | |
intrinseca | 1:5f51069d5e09 | 101 | fwrite(data, 1, length, logFile); |
intrinseca | 1:5f51069d5e09 | 102 | |
intrinseca | 1:5f51069d5e09 | 103 | fclose(logFile);*/ |
intrinseca | 1:5f51069d5e09 | 104 | } |
intrinseca | 1:5f51069d5e09 | 105 | |
intrinseca | 1:5f51069d5e09 | 106 | bool file_exists(const char * filename) |
intrinseca | 1:5f51069d5e09 | 107 | { |
intrinseca | 1:5f51069d5e09 | 108 | if (FILE * file = fopen(filename, "r")) |
intrinseca | 1:5f51069d5e09 | 109 | { |
intrinseca | 1:5f51069d5e09 | 110 | fclose(file); |
intrinseca | 1:5f51069d5e09 | 111 | return true; |
intrinseca | 1:5f51069d5e09 | 112 | } |
intrinseca | 1:5f51069d5e09 | 113 | return false; |
intrinseca | 1:5f51069d5e09 | 114 | } |
intrinseca | 1:5f51069d5e09 | 115 | |
intrinseca | 1:5f51069d5e09 | 116 | int main() { |
intrinseca | 1:5f51069d5e09 | 117 | char logIndex = 0; |
intrinseca | 1:5f51069d5e09 | 118 | |
intrinseca | 1:5f51069d5e09 | 119 | printf("FBR CAN Data Logger\n"); |
intrinseca | 1:5f51069d5e09 | 120 | |
intrinseca | 1:5f51069d5e09 | 121 | /*mkdir("/sd/fbr", 0777); |
intrinseca | 1:5f51069d5e09 | 122 | |
intrinseca | 1:5f51069d5e09 | 123 | do |
intrinseca | 1:5f51069d5e09 | 124 | { |
intrinseca | 1:5f51069d5e09 | 125 | sprintf(&logFileName[0], "/sd/fbr/log.%d", logIndex); |
intrinseca | 1:5f51069d5e09 | 126 | logIndex++; |
intrinseca | 1:5f51069d5e09 | 127 | } while(file_exists(&logFileName[0])); |
intrinseca | 1:5f51069d5e09 | 128 | |
intrinseca | 1:5f51069d5e09 | 129 | printf("Log File: %s\n", &logFileName[0]);*/ |
intrinseca | 1:5f51069d5e09 | 130 | |
intrinseca | 1:5f51069d5e09 | 131 | printf("Listening Started\n"); |
intrinseca | 1:5f51069d5e09 | 132 | |
intrinseca | 1:5f51069d5e09 | 133 | messageTimer.start(); |
intrinseca | 1:5f51069d5e09 | 134 | |
intrinseca | 1:5f51069d5e09 | 135 | can1.frequency(500000); |
intrinseca | 1:5f51069d5e09 | 136 | can1.attach(&can_interrupt); |
intrinseca | 1:5f51069d5e09 | 137 | |
intrinseca | 1:5f51069d5e09 | 138 | canPoll.attach(&poll_can, 1.0); |
intrinseca | 1:5f51069d5e09 | 139 | |
intrinseca | 1:5f51069d5e09 | 140 | while(true) |
intrinseca | 1:5f51069d5e09 | 141 | { |
intrinseca | 1:5f51069d5e09 | 142 | __wfi(); |
intrinseca | 1:5f51069d5e09 | 143 | } |
intrinseca | 1:5f51069d5e09 | 144 | } |