MSCAN Updated
Fork of MSCAN by
CANComms.cpp@0:4bd0966a0718, 2013-02-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |