MSCAN Updated

Dependents:   FBRLogger

Fork of MSCAN by Vesko Karadzhov

Committer:
veskokaradzhov
Date:
Wed Mar 06 17:33:14 2013 +0000
Revision:
6:c857749f9c0c
Parent:
5:55a074984183
c

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