MSCAN Updated
Fork of MSCAN by
Embed:
(wiki syntax)
Show/hide line numbers
CANComms.cpp
00001 #include "CANComms.h" 00002 #include "mbed.h" 00003 #include "State.h" 00004 00005 #include "MSCANHeader.h" 00006 00007 CANComms::CANComms(State* _values, bool transmit_poll, bool receive_poll, float poll_interval) : Comms(_values) 00008 { 00009 00010 00011 can = new CAN(p30, p29); 00012 can->frequency(500000); 00013 00014 pollTicker = new Ticker(); 00015 readTicker = new Ticker(); 00016 00017 if(transmit_poll) { 00018 pollTicker->attach(this, &CANComms::poll, 0.05); 00019 } 00020 if (receive_poll) { 00021 can->attach(this, &CANComms::receive); 00022 } 00023 } 00024 void CANComms::poll() 00025 { 00026 char i; 00027 00028 //start 6, 22 00029 //int ids[] = {0x00189838, 0x00589838}; 00030 00031 short offsets[] = {6, 22}; 00032 00033 MSCANHeader header(MSCAN_ID_MS, MSCAN_ID_DASH, MSCAN_REQ, MSCAN_BLOCK_OUTPC, 0); 00034 00035 for(i = 0; i < 2; i++) { 00036 header.var_offset = offsets[i]; 00037 CANMessage msg(header.build(), 0, 3, CANData, CANExtended); 00038 00039 msg.data[0] = i; //Where to put the response - used when communicating between MS's to tell them where they wanted the data put 00040 msg.data[1] = 0; //Offset into the table specified in data[0] 00041 msg.data[2] = 8; //How many bytes of the source table we want 00042 00043 /*printf("Polling %d\n", i);*/ 00044 00045 if(can->write(msg)) { 00046 00047 } 00048 } 00049 } 00050 00051 void CANComms::send(char message) 00052 { 00053 00054 } 00055 00056 void CANComms::receive() 00057 { 00058 CANMessage msg; 00059 MSCANHeader header; 00060 00061 while(can->read(msg)) { 00062 /*printf("CAN Message %08X %d %02X%02X%02X%02X%02X%02X%02X%02X\n", msg.id, msg.len, 00063 msg.data[0], 00064 msg.data[1], 00065 msg.data[2], 00066 msg.data[3], 00067 msg.data[4], 00068 msg.data[5], 00069 msg.data[6], 00070 msg.data[7] 00071 );*/ 00072 00073 header.parse(msg.id); 00074 00075 //printf("Processing data, block %d\n", block); 00076 if(header.from_id == MSCAN_ID_MS) { 00077 if(header.var_blk == 0) { 00078 values->rpm = (msg.data[0] << 8) | msg.data[1]; 00079 } else if(header.var_blk == 1) { 00080 values->manifold_pres = ((msg.data[2] << 8) | msg.data[3]) / 10.0; 00081 values->air_temp = (((msg.data[4] << 8) | msg.data[5]) - 320.0) * 0.05555; 00082 values->coolant_temp = (((msg.data[6] << 8) | msg.data[7]) - 320.0) * 0.05555; 00083 } else { 00084 values->throttle_pos = ((msg.data[2] << 8) | msg.data[3]) / 10.0; 00085 values->voltage = ((msg.data[4] << 8) | msg.data[5]) / 10.0; 00086 } 00087 } 00088 00089 //printf("Bat: %f\n", battery / 10.0); 00090 } 00091 }
Generated on Fri Jul 15 2022 10:47:42 by 1.7.2