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