Innovate MTS to Megasquirt MSCAN

Dependencies:   CANnucleo mbed

Fork of CANnucleo_Hello by Zoltan Hudak

INNOVATE MTS SERIAL STREAM TO MEGASQUIRT MSCAN ANALOG

This was tested on the olimex olimexino-stm32. code comes with no warrenty, always confirm AFR readings at the device.

I haven't tested this on an ECU or with an LM2 yet this has all been done with simulations, so there may be real world bugs.

code was based off http://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/ mts datasheet http://www.innovatemotorsports.com/support/downloads/Seriallog-2.pdf MSCAN http://www.msextra.com/doc/pdf/Megasquirt_CAN_Broadcast.pdf

** PLEASE NOTE ** MSCAN has table and data offsets to choose what data it requires, this code hasn't implimented any of that so regardless of them it just sends lambda for the first analog value and the mts function value in the second

MTS Serial is RS232 not ttl so you will need an RS-232 Transceiver

Committer:
sordfish
Date:
Sun Dec 06 21:16:26 2015 +0000
Revision:
6:e977526d114f
Parent:
5:c6503b7ae971
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:c5e5d0df6f2a 1 /*
sordfish 6:e977526d114f 2 * INNOVATE MTS SERIAL STREAM TO MEGASQUIRT MSCAN ANALOG
sordfish 6:e977526d114f 3 *
sordfish 6:e977526d114f 4 * Written by Arran Short <sordfish2050@gmail.com>
sordfish 6:e977526d114f 5 *
sordfish 6:e977526d114f 6 * This was tested on the olimex olimexino-stm32.
sordfish 6:e977526d114f 7 * code comes with no warrenty, always confirm AFR readings at the device.
sordfish 6:e977526d114f 8 *
sordfish 6:e977526d114f 9 * code was based off http://developer.mbed.org/users/hudakz/code/CAN_Nucleo_Hello/
sordfish 6:e977526d114f 10 * mts datasheet http://www.innovatemotorsports.com/support/downloads/Seriallog-2.pdf
sordfish 6:e977526d114f 11 * MSCAN http://www.msextra.com/doc/pdf/Megasquirt_CAN_Broadcast.pdf
sordfish 6:e977526d114f 12 *
sordfish 6:e977526d114f 13 *
sordfish 6:e977526d114f 14 *
sordfish 6:e977526d114f 15 * ************ PLEASE NOTE ************
sordfish 6:e977526d114f 16 * MSCAN has table and data offsets to choose what data it requires,
sordfish 6:e977526d114f 17 * this code hasn't implimented any of that so regardless of them
sordfish 6:e977526d114f 18 * it just sends lambda for the first analog value and the mts function value in the second
sordfish 6:e977526d114f 19 *
sordfish 6:e977526d114f 20 *
sordfish 6:e977526d114f 21 * MTS Serial is RS232 not ttl so you will need an RS-232 Transceiver
sordfish 6:e977526d114f 22 *
sordfish 6:e977526d114f 23 */
hudakz 0:c5e5d0df6f2a 24
hudakz 0:c5e5d0df6f2a 25 #include "mbed.h"
hudakz 0:c5e5d0df6f2a 26 #include "CAN.h"
hudakz 0:c5e5d0df6f2a 27
sordfish 6:e977526d114f 28 Serial device(PA_9, PA_10);
sordfish 6:e977526d114f 29 Serial pc(SERIAL_TX, SERIAL_RX);
hudakz 0:c5e5d0df6f2a 30
sordfish 6:e977526d114f 31 DigitalOut led1(PA_5); // GREEN
sordfish 6:e977526d114f 32 DigitalOut led2(PA_1); // YELLOW
hudakz 0:c5e5d0df6f2a 33
sordfish 6:e977526d114f 34 CAN can(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name, Automatic recovery from bus-off state enabled by default
hudakz 0:c5e5d0df6f2a 35 CANMessage rxMsg;
hudakz 0:c5e5d0df6f2a 36 CANMessage txMsg;
sordfish 6:e977526d114f 37
sordfish 6:e977526d114f 38 uint16_t lambda;
sordfish 6:e977526d114f 39 uint8_t mtsfunction;
sordfish 6:e977526d114f 40
sordfish 6:e977526d114f 41 volatile bool CANmsgAvailable = false;
sordfish 6:e977526d114f 42 volatile bool LM1 = false;
sordfish 6:e977526d114f 43 volatile bool gotLambda = false;
sordfish 6:e977526d114f 44 volatile bool gotMscanreq = false;
sordfish 6:e977526d114f 45
sordfish 6:e977526d114f 46 uint8_t mycanid = 0x09; // this is the id set in tunerstudio
sordfish 6:e977526d114f 47
sordfish 6:e977526d114f 48 uint8_t offset = 0;
sordfish 6:e977526d114f 49 uint8_t msgtype = 0;
sordfish 6:e977526d114f 50 uint8_t fromid = 0;
sordfish 6:e977526d114f 51 uint8_t toid = 0;
sordfish 6:e977526d114f 52 uint8_t table = 0;
sordfish 6:e977526d114f 53
sordfish 6:e977526d114f 54 uint8_t myvarblk; // these three bytes are the location of where the MS cpu wants the data to be sent,
sordfish 6:e977526d114f 55 uint16_t myvaroff; // MS doesnt have any error checking so make sure these values are correct.
sordfish 6:e977526d114f 56 uint8_t varbyt; //
sordfish 6:e977526d114f 57
sordfish 6:e977526d114f 58 char rxSerial[8];
sordfish 6:e977526d114f 59 char header[2];
sordfish 6:e977526d114f 60 char txData[8];
sordfish 6:e977526d114f 61
sordfish 6:e977526d114f 62
sordfish 6:e977526d114f 63 // macros ripped from arduino
sordfish 6:e977526d114f 64 #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
sordfish 6:e977526d114f 65 #define bitSet(value, bit) ((value) |= (1UL << (bit)))
sordfish 6:e977526d114f 66 #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
sordfish 6:e977526d114f 67 #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
hudakz 0:c5e5d0df6f2a 68
hudakz 0:c5e5d0df6f2a 69 /**
hudakz 0:c5e5d0df6f2a 70 * @brief 'CAN receive-complete' interrup handler.
hudakz 0:c5e5d0df6f2a 71 * @note Called on arrival of new CAN message.
hudakz 0:c5e5d0df6f2a 72 * Keep it as short as possible.
hudakz 0:c5e5d0df6f2a 73 * @param
hudakz 0:c5e5d0df6f2a 74 * @retval
hudakz 0:c5e5d0df6f2a 75 */
sordfish 6:e977526d114f 76 void onCanMsgReceived() {
sordfish 6:e977526d114f 77 CANmsgAvailable = true;
sordfish 6:e977526d114f 78 }
sordfish 6:e977526d114f 79
sordfish 6:e977526d114f 80 /**
sordfish 6:e977526d114f 81 * @brief 'process sub packet'
sordfish 6:e977526d114f 82 * @note Called when main loop detects a matching Innovate MTS header
sordfish 6:e977526d114f 83 * it then detects if its legacy or new protocol, then strips afr data from stream, TODO: Need to add mts inputs and 2nd o2 sensor to mscan messages
sordfish 6:e977526d114f 84 * @param
sordfish 6:e977526d114f 85 * @retval
sordfish 6:e977526d114f 86 */
sordfish 6:e977526d114f 87 void processsubpacket() {
sordfish 6:e977526d114f 88
sordfish 6:e977526d114f 89 led2 = !led2;
sordfish 6:e977526d114f 90
sordfish 6:e977526d114f 91 if ( bitRead(rxSerial[2], 6) == 1 && bitRead(rxSerial[2], 1) == 1 && bitRead(rxSerial[3], 7) == 0) {
sordfish 6:e977526d114f 92 LM1 = false;
sordfish 6:e977526d114f 93 //pc.printf("not LM1\n");
sordfish 6:e977526d114f 94 }
sordfish 6:e977526d114f 95 if ( bitRead(rxSerial[2], 7) == 1 && bitRead(rxSerial[2], 1) == 0 && bitRead(rxSerial[3], 7) == 0) {
sordfish 6:e977526d114f 96 LM1 = true;
sordfish 6:e977526d114f 97 //pc.printf("is LM1\n");
sordfish 6:e977526d114f 98 }
sordfish 6:e977526d114f 99
sordfish 6:e977526d114f 100 mtsfunction = 0;
sordfish 6:e977526d114f 101
sordfish 6:e977526d114f 102 bitWrite(mtsfunction, 2, bitRead(rxSerial[2], 4));
sordfish 6:e977526d114f 103 bitWrite(mtsfunction, 1, bitRead(rxSerial[2], 3));
sordfish 6:e977526d114f 104 bitWrite(mtsfunction, 0, bitRead(rxSerial[2], 2));
sordfish 6:e977526d114f 105
sordfish 6:e977526d114f 106 pc.printf("function is "+mtsfunction+"\r\n");
sordfish 6:e977526d114f 107
sordfish 6:e977526d114f 108 if (mtsfunction == 0) { //function 0 mean good data.
sordfish 6:e977526d114f 109
sordfish 6:e977526d114f 110 lambda = rxSerial[4] << 6;
sordfish 6:e977526d114f 111 lambda = lambda + rxSerial[5];
sordfish 6:e977526d114f 112
sordfish 6:e977526d114f 113 gotLambda = true;
sordfish 6:e977526d114f 114 } else {
sordfish 6:e977526d114f 115 //turn off serial led
sordfish 6:e977526d114f 116 led2 = 0;
sordfish 6:e977526d114f 117 }
sordfish 6:e977526d114f 118
sordfish 6:e977526d114f 119 }//processsubpacket()
sordfish 6:e977526d114f 120
sordfish 6:e977526d114f 121 /**
sordfish 6:e977526d114f 122 * @brief 'ms can id'
sordfish 6:e977526d114f 123 * @note Called when can message has been received
sordfish 6:e977526d114f 124 * it then converts data into human readable names
sordfish 6:e977526d114f 125 * @param
sordfish 6:e977526d114f 126 * @retval
sordfish 6:e977526d114f 127 */
sordfish 6:e977526d114f 128 void mscanid() {
sordfish 6:e977526d114f 129
sordfish 6:e977526d114f 130 offset = rxMsg.id >> 18;
sordfish 6:e977526d114f 131 msgtype = (rxMsg.id << 14) >> 29;
sordfish 6:e977526d114f 132 fromid = (rxMsg.id << 17) >> 28;
sordfish 6:e977526d114f 133 toid = (rxMsg.id << 21) >> 28;
sordfish 6:e977526d114f 134 table = (((rxMsg.id << 29) >> 31) << 5) + ((rxMsg.id << 25) >> 28);
sordfish 6:e977526d114f 135
hudakz 0:c5e5d0df6f2a 136 }
hudakz 0:c5e5d0df6f2a 137
hudakz 0:c5e5d0df6f2a 138 /**
sordfish 6:e977526d114f 139 * @brief 'mscan tx header'
sordfish 6:e977526d114f 140 * @note Called when mscan message has been processed
sordfish 6:e977526d114f 141 * and a responce needs to be generated from serial data
sordfish 6:e977526d114f 142 * @param
sordfish 6:e977526d114f 143 * @retval
sordfish 6:e977526d114f 144 */
sordfish 6:e977526d114f 145 void mscantxheader(uint8_t messagetype, uint8_t sendtoid) { // makes an mscan header, byte is for message type
sordfish 6:e977526d114f 146
sordfish 6:e977526d114f 147 switch (messagetype) {
sordfish 6:e977526d114f 148 case 0:
sordfish 6:e977526d114f 149 // command
sordfish 6:e977526d114f 150 break;
sordfish 6:e977526d114f 151 case 1:
sordfish 6:e977526d114f 152 // request
sordfish 6:e977526d114f 153 break;
sordfish 6:e977526d114f 154 case 2:
sordfish 6:e977526d114f 155 // response
sordfish 6:e977526d114f 156 txMsg.clear();
sordfish 6:e977526d114f 157 txMsg.type = CANData;
sordfish 6:e977526d114f 158 txMsg.format = CANExtended;
sordfish 6:e977526d114f 159
sordfish 6:e977526d114f 160 bitWrite(txMsg.len, 3, bitRead(varbyt, 3));
sordfish 6:e977526d114f 161 bitWrite(txMsg.len, 2, bitRead(varbyt, 2));
sordfish 6:e977526d114f 162 bitWrite(txMsg.len, 1, bitRead(varbyt, 1));
sordfish 6:e977526d114f 163 bitWrite(txMsg.len, 0, bitRead(varbyt, 0));
sordfish 6:e977526d114f 164
sordfish 6:e977526d114f 165 //offset
sordfish 6:e977526d114f 166 bitWrite(txMsg.id, 28, bitRead(myvaroff, 10));
sordfish 6:e977526d114f 167 bitWrite(txMsg.id, 27, bitRead(myvaroff, 9));
sordfish 6:e977526d114f 168 bitWrite(txMsg.id, 26, bitRead(myvaroff, 8));
sordfish 6:e977526d114f 169 bitWrite(txMsg.id, 25, bitRead(myvaroff, 7));
sordfish 6:e977526d114f 170 bitWrite(txMsg.id, 24, bitRead(myvaroff, 6));
sordfish 6:e977526d114f 171 bitWrite(txMsg.id, 23, bitRead(myvaroff, 5));
sordfish 6:e977526d114f 172 bitWrite(txMsg.id, 22, bitRead(myvaroff, 4));
sordfish 6:e977526d114f 173 bitWrite(txMsg.id, 21, bitRead(myvaroff, 3));
sordfish 6:e977526d114f 174 bitWrite(txMsg.id, 20, bitRead(myvaroff, 2));
sordfish 6:e977526d114f 175 bitWrite(txMsg.id, 19, bitRead(myvaroff, 1));
sordfish 6:e977526d114f 176 bitWrite(txMsg.id, 18, bitRead(myvaroff, 0));
sordfish 6:e977526d114f 177 //message type = responce
sordfish 6:e977526d114f 178 bitWrite(txMsg.id, 17, 0);
sordfish 6:e977526d114f 179 bitWrite(txMsg.id, 16, 1);
sordfish 6:e977526d114f 180 bitWrite(txMsg.id, 15, 0);
sordfish 6:e977526d114f 181 //from id
sordfish 6:e977526d114f 182 bitWrite(txMsg.id, 14, bitRead(mycanid, 3));
sordfish 6:e977526d114f 183 bitWrite(txMsg.id, 13, bitRead(mycanid, 2));
sordfish 6:e977526d114f 184 bitWrite(txMsg.id, 12, bitRead(mycanid, 1));
sordfish 6:e977526d114f 185 bitWrite(txMsg.id, 11, bitRead(mycanid, 0));
sordfish 6:e977526d114f 186 //to id
sordfish 6:e977526d114f 187 bitWrite(txMsg.id, 10, bitRead(sendtoid, 3));
sordfish 6:e977526d114f 188 bitWrite(txMsg.id, 9, bitRead(sendtoid, 2));
sordfish 6:e977526d114f 189 bitWrite(txMsg.id, 8, bitRead(sendtoid, 1));
sordfish 6:e977526d114f 190 bitWrite(txMsg.id, 7, bitRead(sendtoid, 0));
sordfish 6:e977526d114f 191 //var block
sordfish 6:e977526d114f 192 bitWrite(txMsg.id, 6, bitRead(myvarblk, 3));
sordfish 6:e977526d114f 193 bitWrite(txMsg.id, 5, bitRead(myvarblk, 2));
sordfish 6:e977526d114f 194 bitWrite(txMsg.id, 4, bitRead(myvarblk, 1));
sordfish 6:e977526d114f 195 bitWrite(txMsg.id, 3, bitRead(myvarblk, 0));
sordfish 6:e977526d114f 196 //spares
sordfish 6:e977526d114f 197 bitWrite(txMsg.id, 2, bitRead(myvarblk, 4));
sordfish 6:e977526d114f 198 bitWrite(txMsg.id, 1, 0);
sordfish 6:e977526d114f 199 bitWrite(txMsg.id, 0, 0);
sordfish 6:e977526d114f 200
sordfish 6:e977526d114f 201 txMsg.data[0] = lambda >> 8;
sordfish 6:e977526d114f 202 txMsg.data[1] = lambda;
sordfish 6:e977526d114f 203 txMsg.data[2] = 0x00;
sordfish 6:e977526d114f 204 txMsg.data[3] = mtsfunction;
sordfish 6:e977526d114f 205 txMsg.data[4] = 0x00;
sordfish 6:e977526d114f 206 txMsg.data[5] = 0x00; // 2 Spare channels, could add values from shield or other sensors.
sordfish 6:e977526d114f 207 txMsg.data[6] = 0x00; //
sordfish 6:e977526d114f 208 txMsg.data[7] = 0x00;
sordfish 6:e977526d114f 209
sordfish 6:e977526d114f 210 break;
sordfish 6:e977526d114f 211 case 3:
sordfish 6:e977526d114f 212 // xsub
sordfish 6:e977526d114f 213 break;
sordfish 6:e977526d114f 214 case 4:
sordfish 6:e977526d114f 215 // burn
sordfish 6:e977526d114f 216 break;
sordfish 6:e977526d114f 217 }
sordfish 6:e977526d114f 218 pc.printf("Tx Message id is: %d \r\n", txMsg.id);
sordfish 6:e977526d114f 219 gotMscanreq = true;
sordfish 6:e977526d114f 220
sordfish 6:e977526d114f 221 }
sordfish 6:e977526d114f 222
sordfish 6:e977526d114f 223
sordfish 6:e977526d114f 224 void mscanrxdata() {
sordfish 6:e977526d114f 225
sordfish 6:e977526d114f 226 if (msgtype == 1 ) { //message is a request
sordfish 6:e977526d114f 227
sordfish 6:e977526d114f 228 myvarblk = rxMsg.data[0];
sordfish 6:e977526d114f 229 pc.printf("message is a request\r\n");
sordfish 6:e977526d114f 230
sordfish 6:e977526d114f 231 bitWrite(myvaroff, 10, bitRead(rxMsg.data[1], 7));
sordfish 6:e977526d114f 232 bitWrite(myvaroff, 9, bitRead(rxMsg.data[1], 6));
sordfish 6:e977526d114f 233 bitWrite(myvaroff, 8, bitRead(rxMsg.data[1], 5));
sordfish 6:e977526d114f 234 bitWrite(myvaroff, 7, bitRead(rxMsg.data[1], 4));
sordfish 6:e977526d114f 235 bitWrite(myvaroff, 6, bitRead(rxMsg.data[1], 3));
sordfish 6:e977526d114f 236 bitWrite(myvaroff, 5, bitRead(rxMsg.data[1], 2));
sordfish 6:e977526d114f 237 bitWrite(myvaroff, 4, bitRead(rxMsg.data[1], 1));
sordfish 6:e977526d114f 238 bitWrite(myvaroff, 3, bitRead(rxMsg.data[1], 0));
sordfish 6:e977526d114f 239 bitWrite(myvaroff, 2, bitRead(rxMsg.data[2], 7));
sordfish 6:e977526d114f 240 bitWrite(myvaroff, 1, bitRead(rxMsg.data[2], 6));
sordfish 6:e977526d114f 241 bitWrite(myvaroff, 0, bitRead(rxMsg.data[2], 5));
sordfish 6:e977526d114f 242
sordfish 6:e977526d114f 243 varbyt = rxMsg.data[2] << 3 >> 3;
sordfish 6:e977526d114f 244
sordfish 6:e977526d114f 245 //megasquirt ecu has requested some data, details of what data it wants is provided in the header. TODO - add a function say what data it wants.
sordfish 6:e977526d114f 246 // we need to generate some data to send back, this is done with mscantxheader
sordfish 6:e977526d114f 247 mscantxheader(0x02, fromid);
sordfish 6:e977526d114f 248 }
sordfish 6:e977526d114f 249 }//mscanrxdata()
sordfish 6:e977526d114f 250
sordfish 6:e977526d114f 251
sordfish 6:e977526d114f 252 void flushSerialBuffer(void) {
sordfish 6:e977526d114f 253 //pc.printf("flushing..\r\n");
sordfish 6:e977526d114f 254 char char1 = 0;
sordfish 6:e977526d114f 255 while (device.readable()) {
sordfish 6:e977526d114f 256 char1 = device.getc();
sordfish 6:e977526d114f 257 }
sordfish 6:e977526d114f 258 return;
sordfish 6:e977526d114f 259 }
sordfish 6:e977526d114f 260
sordfish 6:e977526d114f 261 void testcantx(void) {
sordfish 6:e977526d114f 262 txMsg.clear(); // clear Tx message storage
sordfish 6:e977526d114f 263 txMsg.type = CANData;
sordfish 6:e977526d114f 264 txMsg.format = CANExtended;
sordfish 6:e977526d114f 265 txMsg.len = 0x03;
sordfish 6:e977526d114f 266 txMsg.id = 0x1FFD487C;
sordfish 6:e977526d114f 267 txMsg.data[0] = 0x01;
sordfish 6:e977526d114f 268 txMsg.data[1] = 0x02;
sordfish 6:e977526d114f 269 txMsg.data[2] = 0x03;
sordfish 6:e977526d114f 270 can.write(txMsg);
sordfish 6:e977526d114f 271 pc.printf("test CAN message sent\r\n");
sordfish 6:e977526d114f 272
sordfish 6:e977526d114f 273 }
sordfish 6:e977526d114f 274
sordfish 6:e977526d114f 275
sordfish 6:e977526d114f 276 /**
hudakz 0:c5e5d0df6f2a 277 * @brief Main
hudakz 0:c5e5d0df6f2a 278 * @note
hudakz 0:c5e5d0df6f2a 279 * @param
hudakz 0:c5e5d0df6f2a 280 * @retval
sordfish 6:e977526d114f 281 */
hudakz 0:c5e5d0df6f2a 282 int main() {
sordfish 6:e977526d114f 283 device.baud(19200); // set bit rate to 19200, this is the baudrate of innovate mts
sordfish 6:e977526d114f 284 device.format(8,SerialBase::None,1);
sordfish 6:e977526d114f 285 can.frequency(500000); // set bit rate to 500k
sordfish 6:e977526d114f 286 can.attach(&onCanMsgReceived, CAN::RxIrq); // attach 'CAN receive-complete' interrupt handler
sordfish 6:e977526d114f 287 can.filter(mycanid << 7, 0x780, CANExtended);
sordfish 6:e977526d114f 288 //testcantx();
sordfish 6:e977526d114f 289
sordfish 6:e977526d114f 290 while (1) { //loop forever
sordfish 6:e977526d114f 291 led1 = 1;
sordfish 6:e977526d114f 292
sordfish 6:e977526d114f 293 if ( gotLambda && gotMscanreq ) { //send reply to megasquirt when we get data from mts serial and we have mscan frame ready.
sordfish 6:e977526d114f 294 pc.printf("ready to send\r\n");
sordfish 6:e977526d114f 295 led2 = !led2;
sordfish 6:e977526d114f 296 pc.printf("can tx id is: %d \r\n", txMsg.id);
sordfish 6:e977526d114f 297 pc.printf("can tx type is: %d \r\n", txMsg.type);
sordfish 6:e977526d114f 298 pc.printf("can tx format is: %d \r\n", txMsg.format);
sordfish 6:e977526d114f 299 pc.printf("can tx len is: %d \r\n", txMsg.len);
sordfish 6:e977526d114f 300 pc.printf("can tx data 0 is: %d \r\n", txMsg.data[0]);
sordfish 6:e977526d114f 301 pc.printf("can tx data 1 is: %d \r\n", txMsg.data[1]);
sordfish 6:e977526d114f 302 pc.printf("can tx data 2 is: %d \r\n", txMsg.data[2]);
sordfish 6:e977526d114f 303 pc.printf("can tx data 3 is: %d \r\n", txMsg.data[3]);
sordfish 6:e977526d114f 304 pc.printf("can tx data 4 is: %d \r\n", txMsg.data[4]);
sordfish 6:e977526d114f 305 pc.printf("can tx data 5 is: %d \r\n", txMsg.data[5]);
sordfish 6:e977526d114f 306 pc.printf("can tx data 6 is: %d \r\n", txMsg.data[6]);
sordfish 6:e977526d114f 307 pc.printf("can tx data 7 is: %d \r\n", txMsg.data[7]);
sordfish 6:e977526d114f 308 can.write(txMsg);
sordfish 6:e977526d114f 309 pc.printf("CAN message sent\r\n");
sordfish 6:e977526d114f 310 //gotLambda = false;
sordfish 6:e977526d114f 311 gotMscanreq = false;
sordfish 6:e977526d114f 312
hudakz 0:c5e5d0df6f2a 313 }
sordfish 6:e977526d114f 314
sordfish 6:e977526d114f 315 if(CANmsgAvailable) { //check if interupt has set the flag for avaliable messages
sordfish 6:e977526d114f 316 //led2 = !led2;
sordfish 6:e977526d114f 317 CANmsgAvailable = false; // reset flag for next use
sordfish 6:e977526d114f 318 can.read(rxMsg); // read message into Rx message storage
sordfish 6:e977526d114f 319 mscanid();
sordfish 6:e977526d114f 320 mscanrxdata();
sordfish 6:e977526d114f 321 //led2 = 0;
hudakz 0:c5e5d0df6f2a 322 }
sordfish 6:e977526d114f 323
sordfish 6:e977526d114f 324 while (device.readable()) { // checks if there has been and messages from serial port
sordfish 6:e977526d114f 325 for (int x=0; x < 8; x++){
sordfish 6:e977526d114f 326 rxSerial[x] = device.getc();
sordfish 6:e977526d114f 327 if ( x==0 ) {
sordfish 6:e977526d114f 328 if ( (rxSerial[0] & 0xA2) == 0xA2 ){
sordfish 6:e977526d114f 329 //led1 = 1;
sordfish 6:e977526d114f 330 } else {
sordfish 6:e977526d114f 331 x=0;
sordfish 6:e977526d114f 332 pc.printf("serial data reset\r\n");
sordfish 6:e977526d114f 333 }
sordfish 6:e977526d114f 334 }
sordfish 6:e977526d114f 335 }
sordfish 6:e977526d114f 336
sordfish 6:e977526d114f 337 header[0] = (rxSerial[0] & 0xA2);
sordfish 6:e977526d114f 338 header[1] = (rxSerial[1] & 0x80);
sordfish 6:e977526d114f 339
sordfish 6:e977526d114f 340 if ( header[0] == 0xA2 && header[1] == 0x80) {
sordfish 6:e977526d114f 341 processsubpacket();
sordfish 6:e977526d114f 342 }
sordfish 6:e977526d114f 343 flushSerialBuffer();
hudakz 0:c5e5d0df6f2a 344 }
sordfish 6:e977526d114f 345 led1 = 0;
hudakz 0:c5e5d0df6f2a 346 }
hudakz 0:c5e5d0df6f2a 347
sordfish 6:e977526d114f 348 }//main
hudakz 0:c5e5d0df6f2a 349