Gabor Feher
/
BMWE90-InstrumentCluster
Making a BMW E90 instrument cluster alive for demonstration purposes
T15Msg.cpp
- Committer:
- gume
- Date:
- 2017-03-07
- Revision:
- 0:830e074c92d5
File content as of revision 0:830e074c92d5:
#include "T15Msg.h" T15Msg::T15Msg () { counter1 = 0; counter2 = 0; enginerun = false; ignition = false; clutch = false; enginestate = 0; statecounter = 0; sstart = false; sstop = false; updateData(); } void T15Msg::updateState() { switch (enginestate) { case 1: statecounter++; if (sstart && statecounter > 1) { enginestate = 2; statecounter = 0; ignition = true; updateData(4); } if (sstop && statecounter > 24) { enginestate = 0; statecounter = 0; updateData(0xc); sstop = false; } break; case 2: enginestate = 6; statecounter = 0; updateData(9); break; case 6: statecounter++; if (ignition) { if (statecounter > 8) { enginestate = 9; statecounter = 0; updateData(0xd); } } else { if (statecounter == 3) { enginerun = false; updateData(); } else if (statecounter > 3) { enginestate = 5; statecounter = 0; updateData(7); } } break; case 9: statecounter++; if (statecounter == 3) { ignition = false; enginerun = true; updateData(); } if (statecounter > 28) { enginestate = 8; updateData(8); sstart = false; } break; case 4: enginestate = 6; statecounter = 0; updateData(0); break; case 5: statecounter++; if (statecounter > 1) { enginestate = 1; statecounter = 0; updateData(); } break; } } void T15Msg::updateData(char resetc1) { if (enginerun) { data[0] = 0x45; } else { if (ignition) data[0] = 0x55; else data[0] = 0x41; } data[1] = 0x42; if (clutch) data[2] = 0x61; else data[2] = 0x21; if (enginestate == 2 || enginestate == 6) data[2] |= 0x8; data[3] = enginestate << 4 | 0xf; if (resetc1 < 0x10) counter1 = resetc1; } bool T15Msg::sendMessage(CAN *can) { data[4] = counter1 << 4 | counter2; bool ok = can->write(CANMessage(0x130, data, 5)); //bool ok = can->write(0x130, (char*) data, 5); counter1 = (counter1 + 1) & 0x0f; if (counter1 == 6) counter1++; counter2 = (counter2 + 1) & 0x0f; if (counter2 == 0xf) counter2 = 0; if (enginestate != 0 && enginestate != 8) { updateState(); } return ok; } bool T15Msg::start() { if (enginestate == 8) return false; if (sstart || sstop) return false; enginestate = 1; statecounter = 0; sstart = true; updateData(4); return true; } bool T15Msg::stop() { if (enginestate == 0) return false; if (sstart || sstop) return false; enginestate = 4; statecounter = 0; sstop = true; updateData(5); return true; }