FBRLogger final version
Dependencies: EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed
main.cpp
- Committer:
- intrinseca
- Date:
- 2013-02-10
- Revision:
- 1:5f51069d5e09
- Parent:
- 0:6f69ea2839fa
- Child:
- 2:2400fab06b33
File content as of revision 1:5f51069d5e09:
#include "SDHCFileSystem.h" #include <stdint.h> //SDFileSystem sd(p5, p6, p7, p8, "sd"); // the pinout on the mbed Cool Components workshop board CAN can1(p30, p29); //Needs to be CAN1 - SD takes CAN0 char logFileName[50]; Timer messageTimer; void writeLog_string(const char *data); void writeLog_data(const char *data, unsigned char length); Ticker canPoll; void can_interrupt() { int time; uint16_t tps; uint16_t battery; CANMessage msg; time = messageTimer.read_us(); char logMessage[17]; while(can1.read(msg)) { printf("CAN Message %08X %d %02X%02X%02X%02X%02X%02X%02X%02X\n", msg.id, msg.len, msg.data[0], msg.data[1], msg.data[2], msg.data[3], msg.data[4], msg.data[5], msg.data[6], msg.data[7] ); tps = (msg.data[0] << 8) | msg.data[1]; battery = (msg.data[2] << 8) | msg.data[3]; printf("TPS: %f\n", tps / 10.0); printf("Bat: %f\n", battery / 10.0); //printf("Bat: %fV\n", (((int)msg.data[2] << 8) & (int)msg.data[3]) / 10.0); memcpy(&logMessage[0], &time, 4); memcpy(&logMessage[4], &msg.id, 4); memcpy(&logMessage[8], &msg.len, 1); memcpy(&logMessage[9], &msg.data, 8); writeLog_data(&logMessage[0], sizeof(logMessage)); } } void poll_can() { //MS encodes most of the request params in the message ID. //Alignment is weird because the ID really includes some non-data bits. MS worked round these, mBed just skips them //0-2 2 bits Spare on MSII //3-6 4 bits Block to get data from. 7 = outpc, all the stuff that MS sends to the PC via serial //7-10 4 bits To ID - 0 for MS //11-14 4 bits From ID - Using 3 here for no good reason //15-17 3 bits Message type. 1 to get data, response has 2 //18-28 11 bits Offset into the block in bits 3-6. Look in the INI file for Tuner Studio to find these, // [OutputChannels] section starting line 3036 CANMessage msg(0x00609838, 0, 3, CANData, CANExtended); //CANMessage msg(); msg.data[0] = 0; //Where to put the response - used when communicating between MS's to tell them where they wanted the data put msg.data[1] = 0; //Offset into the table specified in data[0] msg.data[2] = 8; //How many bytes of the source table we want //CANMessage msg(0); if(can1.write(msg)) { printf("Polled\n"); } } void writeLog_string(const char *data) { writeLog_data(data, strlen(data)); } void writeLog_data(const char *data, unsigned char length) { /*FILE *logFile; logFile = fopen(&logFileName[0], "a"); if(logFile == NULL) { error("Could not open file for write\n"); } fwrite(data, 1, length, logFile); fclose(logFile);*/ } bool file_exists(const char * filename) { if (FILE * file = fopen(filename, "r")) { fclose(file); return true; } return false; } int main() { char logIndex = 0; printf("FBR CAN Data Logger\n"); /*mkdir("/sd/fbr", 0777); do { sprintf(&logFileName[0], "/sd/fbr/log.%d", logIndex); logIndex++; } while(file_exists(&logFileName[0])); printf("Log File: %s\n", &logFileName[0]);*/ printf("Listening Started\n"); messageTimer.start(); can1.frequency(500000); can1.attach(&can_interrupt); canPoll.attach(&poll_can, 1.0); while(true) { __wfi(); } }