FBRLogger final version

Dependencies:   EthernetInterface MSCAN Nanopb SDFileSystem mbed-rtos mbed

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?

UserRevisionLine numberNew 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 }