MSCAN Updated

Dependents:   FBRLogger

Fork of MSCAN by Vesko Karadzhov

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CANComms.cpp Source File

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 }