Small project to display some OBD values from the Toyota GT86/ Subaru BRZ/ Scion FRS on an OLED display.
Dependencies: Adafruit_GFX MODSERIAL mbed-rtos mbed
IsoTpHandler.h
- Committer:
- chrta
- Date:
- 2014-04-22
- Revision:
- 0:6b1f6139fb25
- Child:
- 1:ca506b88b1d6
File content as of revision 0:6b1f6139fb25:
#ifndef ISO_TP_HANDLER #define ISO_TP_HANDLER #include "mbed.h" /** * http://en.wikipedia.org/wiki/ISO_15765-2 */ class IsoTpHandler { private: class State { public: virtual ~State() {} virtual void processInput(const CANMessage* message, IsoTpHandler* context) const = 0; virtual void onEnter(IsoTpHandler* context) const = 0; virtual void onLeave(IsoTpHandler* context) const = 0; }; /** * No special packet expected */ class IdleState : public State { public: IdleState(); virtual void processInput(const CANMessage* message, IsoTpHandler* context) const; virtual void onEnter(IsoTpHandler* context) const; virtual void onLeave(IsoTpHandler* context) const; }; /** * Expect packets of type "consecutive frame" */ class ConsequtiveTransferState : public State { public: ConsequtiveTransferState(); virtual void processInput(const CANMessage* message, IsoTpHandler* context) const; virtual void onEnter(IsoTpHandler* context) const; virtual void onLeave(IsoTpHandler* context) const; }; public: IsoTpHandler(CAN* canInterface); void processCanMessage(const CANMessage* message); void handle_decoded_packet(const uint8_t* data, uint16_t length); /** * * \param[in] data Always 6 bytes. */ void init_consequtive_reading(uint16_t messageSize, const uint8_t* data); uint8_t getExpectedIndex() const; void incrementExpectedIndex(); /** * \retval \c True if the state should be switched. * \retval \c False if the state not change. */ bool appendReceivedData(const uint8_t* data, uint8_t length); void setState(const State* state); static const IdleState idleState; static const ConsequtiveTransferState consequtiveTransferState; static bool isValidIsoTpPacket(const CANMessage* message); private: const State* m_state; CAN* m_canInterface; uint8_t m_messageBuffer[256]; uint16_t m_expectedMessageSize; uint16_t m_currentMessageSize; uint8_t m_expectedIndex; }; #endif //ISO_TP_HANDLER