MSCAN Updated

Dependents:   FBRLogger

Fork of MSCAN by Vesko Karadzhov

Committer:
intrinseca
Date:
Sun Feb 17 18:41:27 2013 +0000
Revision:
0:4bd0966a0718
Child:
1:a723bdf44e10
move CAN comms from FBRDash to library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
intrinseca 0:4bd0966a0718 1 #include "CANComms.h"
intrinseca 0:4bd0966a0718 2 #include "mbed.h"
intrinseca 0:4bd0966a0718 3 #include "State.h"
intrinseca 0:4bd0966a0718 4
intrinseca 0:4bd0966a0718 5 #include "MSCANHeader.h"
intrinseca 0:4bd0966a0718 6
intrinseca 0:4bd0966a0718 7 CANComms::CANComms(State* _values) : Comms(_values)
intrinseca 0:4bd0966a0718 8 {
intrinseca 0:4bd0966a0718 9 can = new CAN(p30, p29);
intrinseca 0:4bd0966a0718 10 can->frequency(500000);
intrinseca 0:4bd0966a0718 11
intrinseca 0:4bd0966a0718 12 pollTicker = new Ticker();
intrinseca 0:4bd0966a0718 13 readTicker = new Ticker();
intrinseca 0:4bd0966a0718 14
intrinseca 0:4bd0966a0718 15 pollTicker->attach(this, &CANComms::poll, 0.05);
intrinseca 0:4bd0966a0718 16 readTicker->attach(this, &CANComms::receive, 0.025);
intrinseca 0:4bd0966a0718 17 }
intrinseca 0:4bd0966a0718 18
intrinseca 0:4bd0966a0718 19 void CANComms::poll()
intrinseca 0:4bd0966a0718 20 {
intrinseca 0:4bd0966a0718 21 char i;
intrinseca 0:4bd0966a0718 22
intrinseca 0:4bd0966a0718 23 //start 6, 22
intrinseca 0:4bd0966a0718 24 //int ids[] = {0x00189838, 0x00589838};
intrinseca 0:4bd0966a0718 25
intrinseca 0:4bd0966a0718 26 short offsets[] = {6, 22};
intrinseca 0:4bd0966a0718 27
intrinseca 0:4bd0966a0718 28 MSCANHeader header(MSCAN_ID_MS, MSCAN_ID_DASH, MSCAN_REQ, MSCAN_BLOCK_OUTPC, 0);
intrinseca 0:4bd0966a0718 29
intrinseca 0:4bd0966a0718 30 for(i = 0; i < 2; i++)
intrinseca 0:4bd0966a0718 31 {
intrinseca 0:4bd0966a0718 32 header.var_offset = offsets[i];
intrinseca 0:4bd0966a0718 33 CANMessage msg(header.build(), 0, 3, CANData, CANExtended);
intrinseca 0:4bd0966a0718 34
intrinseca 0:4bd0966a0718 35 msg.data[0] = i; //Where to put the response - used when communicating between MS's to tell them where they wanted the data put
intrinseca 0:4bd0966a0718 36 msg.data[1] = 0; //Offset into the table specified in data[0]
intrinseca 0:4bd0966a0718 37 msg.data[2] = 8; //How many bytes of the source table we want
intrinseca 0:4bd0966a0718 38
intrinseca 0:4bd0966a0718 39 /*printf("Polling %d\n", i);*/
intrinseca 0:4bd0966a0718 40
intrinseca 0:4bd0966a0718 41 if(can->write(msg))
intrinseca 0:4bd0966a0718 42 {
intrinseca 0:4bd0966a0718 43
intrinseca 0:4bd0966a0718 44 }
intrinseca 0:4bd0966a0718 45 }
intrinseca 0:4bd0966a0718 46 }
intrinseca 0:4bd0966a0718 47
intrinseca 0:4bd0966a0718 48 void CANComms::send(char message)
intrinseca 0:4bd0966a0718 49 {
intrinseca 0:4bd0966a0718 50
intrinseca 0:4bd0966a0718 51 }
intrinseca 0:4bd0966a0718 52
intrinseca 0:4bd0966a0718 53 void CANComms::receive()
intrinseca 0:4bd0966a0718 54 {
intrinseca 0:4bd0966a0718 55 float tps;
intrinseca 0:4bd0966a0718 56 char block;
intrinseca 0:4bd0966a0718 57
intrinseca 0:4bd0966a0718 58 CANMessage msg;
intrinseca 0:4bd0966a0718 59 MSCANHeader header;
intrinseca 0:4bd0966a0718 60
intrinseca 0:4bd0966a0718 61 while(can->read(msg))
intrinseca 0:4bd0966a0718 62 {
intrinseca 0:4bd0966a0718 63 /*printf("CAN Message %08X %d %02X%02X%02X%02X%02X%02X%02X%02X\n", msg.id, msg.len,
intrinseca 0:4bd0966a0718 64 msg.data[0],
intrinseca 0:4bd0966a0718 65 msg.data[1],
intrinseca 0:4bd0966a0718 66 msg.data[2],
intrinseca 0:4bd0966a0718 67 msg.data[3],
intrinseca 0:4bd0966a0718 68 msg.data[4],
intrinseca 0:4bd0966a0718 69 msg.data[5],
intrinseca 0:4bd0966a0718 70 msg.data[6],
intrinseca 0:4bd0966a0718 71 msg.data[7]
intrinseca 0:4bd0966a0718 72 );*/
intrinseca 0:4bd0966a0718 73
intrinseca 0:4bd0966a0718 74 header.parse(msg.id);
intrinseca 0:4bd0966a0718 75
intrinseca 0:4bd0966a0718 76 //printf("Processing data, block %d\n", block);
intrinseca 0:4bd0966a0718 77
intrinseca 0:4bd0966a0718 78 if(header.var_blk == 0)
intrinseca 0:4bd0966a0718 79 {
intrinseca 0:4bd0966a0718 80 values->rpm = (msg.data[0] << 8) | msg.data[1];
intrinseca 0:4bd0966a0718 81 }
intrinseca 0:4bd0966a0718 82 else
intrinseca 0:4bd0966a0718 83 {
intrinseca 0:4bd0966a0718 84 values->coolant_temp = (((msg.data[0] << 8) | msg.data[1]) - 320.0) * 0.05555;
intrinseca 0:4bd0966a0718 85 values->throttle_pos = ((msg.data[2] << 8) | msg.data[3]) / 10.0;
intrinseca 0:4bd0966a0718 86 values->voltage = ((msg.data[4] << 8) | msg.data[5]) / 10.0;
intrinseca 0:4bd0966a0718 87 printf("TPS: %f\n", values->throttle_pos);
intrinseca 0:4bd0966a0718 88 }
intrinseca 0:4bd0966a0718 89
intrinseca 0:4bd0966a0718 90 //printf("Bat: %f\n", battery / 10.0);
intrinseca 0:4bd0966a0718 91 }
intrinseca 0:4bd0966a0718 92 }