MSCAN Updated
Fork of MSCAN by
CANComms.cpp@6:c857749f9c0c, 2013-03-06 (annotated)
- Committer:
- veskokaradzhov
- Date:
- Wed Mar 06 17:33:14 2013 +0000
- Revision:
- 6:c857749f9c0c
- Parent:
- 5:55a074984183
c
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 | |
veskokaradzhov | 6:c857749f9c0c | 7 | CANComms::CANComms(State* _values, bool transmit_poll, bool receive_poll, float poll_interval) : Comms(_values) |
intrinseca | 0:4bd0966a0718 | 8 | { |
veskokaradzhov | 6:c857749f9c0c | 9 | |
veskokaradzhov | 6:c857749f9c0c | 10 | |
intrinseca | 0:4bd0966a0718 | 11 | can = new CAN(p30, p29); |
intrinseca | 0:4bd0966a0718 | 12 | can->frequency(500000); |
intrinseca | 5:55a074984183 | 13 | |
intrinseca | 0:4bd0966a0718 | 14 | pollTicker = new Ticker(); |
intrinseca | 0:4bd0966a0718 | 15 | readTicker = new Ticker(); |
intrinseca | 5:55a074984183 | 16 | |
veskokaradzhov | 6:c857749f9c0c | 17 | if(transmit_poll) { |
intrinseca | 5:55a074984183 | 18 | pollTicker->attach(this, &CANComms::poll, 0.05); |
intrinseca | 5:55a074984183 | 19 | } |
veskokaradzhov | 6:c857749f9c0c | 20 | if (receive_poll) { |
veskokaradzhov | 6:c857749f9c0c | 21 | can->attach(this, &CANComms::receive); |
veskokaradzhov | 6:c857749f9c0c | 22 | } |
intrinseca | 0:4bd0966a0718 | 23 | } |
intrinseca | 0:4bd0966a0718 | 24 | void CANComms::poll() |
intrinseca | 0:4bd0966a0718 | 25 | { |
intrinseca | 0:4bd0966a0718 | 26 | char i; |
intrinseca | 0:4bd0966a0718 | 27 | |
intrinseca | 0:4bd0966a0718 | 28 | //start 6, 22 |
intrinseca | 0:4bd0966a0718 | 29 | //int ids[] = {0x00189838, 0x00589838}; |
intrinseca | 0:4bd0966a0718 | 30 | |
intrinseca | 5:55a074984183 | 31 | short offsets[] = {6, 22}; |
intrinseca | 5:55a074984183 | 32 | |
intrinseca | 0:4bd0966a0718 | 33 | MSCANHeader header(MSCAN_ID_MS, MSCAN_ID_DASH, MSCAN_REQ, MSCAN_BLOCK_OUTPC, 0); |
intrinseca | 0:4bd0966a0718 | 34 | |
intrinseca | 5:55a074984183 | 35 | for(i = 0; i < 2; i++) { |
intrinseca | 0:4bd0966a0718 | 36 | header.var_offset = offsets[i]; |
intrinseca | 0:4bd0966a0718 | 37 | CANMessage msg(header.build(), 0, 3, CANData, CANExtended); |
intrinseca | 5:55a074984183 | 38 | |
intrinseca | 0:4bd0966a0718 | 39 | 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 | 40 | msg.data[1] = 0; //Offset into the table specified in data[0] |
intrinseca | 0:4bd0966a0718 | 41 | msg.data[2] = 8; //How many bytes of the source table we want |
intrinseca | 5:55a074984183 | 42 | |
intrinseca | 0:4bd0966a0718 | 43 | /*printf("Polling %d\n", i);*/ |
intrinseca | 5:55a074984183 | 44 | |
intrinseca | 5:55a074984183 | 45 | if(can->write(msg)) { |
intrinseca | 5:55a074984183 | 46 | |
intrinseca | 0:4bd0966a0718 | 47 | } |
intrinseca | 0:4bd0966a0718 | 48 | } |
intrinseca | 0:4bd0966a0718 | 49 | } |
intrinseca | 0:4bd0966a0718 | 50 | |
intrinseca | 0:4bd0966a0718 | 51 | void CANComms::send(char message) |
intrinseca | 0:4bd0966a0718 | 52 | { |
intrinseca | 5:55a074984183 | 53 | |
intrinseca | 0:4bd0966a0718 | 54 | } |
intrinseca | 0:4bd0966a0718 | 55 | |
intrinseca | 0:4bd0966a0718 | 56 | void CANComms::receive() |
intrinseca | 5:55a074984183 | 57 | { |
intrinseca | 0:4bd0966a0718 | 58 | CANMessage msg; |
intrinseca | 0:4bd0966a0718 | 59 | MSCANHeader header; |
intrinseca | 0:4bd0966a0718 | 60 | |
intrinseca | 5:55a074984183 | 61 | while(can->read(msg)) { |
intrinseca | 5:55a074984183 | 62 | /*printf("CAN Message %08X %d %02X%02X%02X%02X%02X%02X%02X%02X\n", msg.id, msg.len, |
intrinseca | 5:55a074984183 | 63 | msg.data[0], |
intrinseca | 0:4bd0966a0718 | 64 | msg.data[1], |
intrinseca | 0:4bd0966a0718 | 65 | msg.data[2], |
intrinseca | 0:4bd0966a0718 | 66 | msg.data[3], |
intrinseca | 0:4bd0966a0718 | 67 | msg.data[4], |
intrinseca | 0:4bd0966a0718 | 68 | msg.data[5], |
intrinseca | 0:4bd0966a0718 | 69 | msg.data[6], |
intrinseca | 0:4bd0966a0718 | 70 | msg.data[7] |
intrinseca | 0:4bd0966a0718 | 71 | );*/ |
intrinseca | 5:55a074984183 | 72 | |
intrinseca | 0:4bd0966a0718 | 73 | header.parse(msg.id); |
intrinseca | 5:55a074984183 | 74 | |
intrinseca | 0:4bd0966a0718 | 75 | //printf("Processing data, block %d\n", block); |
intrinseca | 5:55a074984183 | 76 | if(header.from_id == MSCAN_ID_MS) { |
intrinseca | 5:55a074984183 | 77 | if(header.var_blk == 0) { |
intrinseca | 5:55a074984183 | 78 | values->rpm = (msg.data[0] << 8) | msg.data[1]; |
intrinseca | 5:55a074984183 | 79 | } else if(header.var_blk == 1) { |
intrinseca | 5:55a074984183 | 80 | values->manifold_pres = ((msg.data[2] << 8) | msg.data[3]) / 10.0; |
intrinseca | 5:55a074984183 | 81 | values->air_temp = (((msg.data[4] << 8) | msg.data[5]) - 320.0) * 0.05555; |
intrinseca | 5:55a074984183 | 82 | values->coolant_temp = (((msg.data[6] << 8) | msg.data[7]) - 320.0) * 0.05555; |
intrinseca | 5:55a074984183 | 83 | } else { |
intrinseca | 5:55a074984183 | 84 | values->throttle_pos = ((msg.data[2] << 8) | msg.data[3]) / 10.0; |
intrinseca | 5:55a074984183 | 85 | values->voltage = ((msg.data[4] << 8) | msg.data[5]) / 10.0; |
intrinseca | 5:55a074984183 | 86 | } |
intrinseca | 0:4bd0966a0718 | 87 | } |
intrinseca | 5:55a074984183 | 88 | |
intrinseca | 0:4bd0966a0718 | 89 | //printf("Bat: %f\n", battery / 10.0); |
intrinseca | 0:4bd0966a0718 | 90 | } |
intrinseca | 0:4bd0966a0718 | 91 | } |