/* * Video On Demand Samples * * Copyright (C) 2015 Microchip Technology Germany II GmbH & Co. KG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * You may also obtain this software under a propriety license from Microchip. * Please contact Microchip for further information. * */ /*----------------------------------------------------------*/ /*! \file * \brief This file contains the CMostMsg class. */ /*----------------------------------------------------------*/ #ifndef MOSTMSG_H #define MOSTMSG_H #include #include #include /*----------------------------------------------------------*/ /*! * \brief class holding a MOST message, it support serializing and deserializing * \note Serialize-Protocol is:
* p[0] = 0x49 (Start)
* p[1] = 0x72 (Start)
* p[2] = 0x16 (Start)
* p[3] = 0x25 (Start)
* p[4] = FBlock Identifier
* p[5] = Instance Identifier
* p[6] = Function Identifier << 8
* p[7] = Function Identifier << 0
* p[8] = OP Type
* p[9] = 0x0 (Reserved)
* p[10] = 0x0 (Reserved)
* p[11] = 0x0 (Reserved)
* p[12] = Payload Length << 24
* p[13] = Payload Length << 16
* p[14] = Payload Length << 8
* p[15] = Payload Length << 0
* p[16] = Header CRC32(p[0] - p[15]) << 24
* p[17] = Header CRC32(p[0] - p[15]) << 16
* p[18] = Header CRC32(p[0] - p[15]) << 8
* p[19] = Header CRC32(p[0] - p[15]) << 0
* p[20] - p[n] = Payload
* p[n+1] = Payload CRC32(p[20] - p[n]) << 24
* p[n+2] = Payload CRC32(p[20] - p[n]) << 16
* p[n+3] = Payload CRC32(p[20] - p[n]) << 8
* p[n+4] = Payload CRC32(p[20] - p[n]) << 0
*/ /*----------------------------------------------------------*/ class CMostMsg { private: bool m_nIsValid; int32_t m_nRefCount; uint32_t m_nFBlock; uint32_t m_nFunc; uint32_t m_nInst; uint8_t m_nOpType; uint32_t m_nPayloadLen; uint8_t *m_Payload; uint32_t m_nParsePos; uint32_t m_nHeaderCrc; uint32_t m_nPayloadCrc; uint8_t m_zHeader[16]; protected: /*----------------------------------------------------------*/ /*! \brief Default Destructor */ /*----------------------------------------------------------*/ virtual ~CMostMsg(); public: static const uint8_t OP_SET = 0x0; static const uint8_t OP_GET = 0x1; static const uint8_t OP_SETGET = 0x2; static const uint8_t OP_INC = 0x3; static const uint8_t OP_DEC = 0x4; static const uint8_t OP_GETINTERFACE = 0x5; static const uint8_t OP_STATUS = 0xC; static const uint8_t OP_INTERFACE = 0xE; static const uint8_t OP_ERROR = 0xF; static const uint8_t OP_START = 0x0; static const uint8_t OP_ABORT = 0x1; static const uint8_t OP_STARTRESULT = 0x2; static const uint8_t OP_STARTRESULTACK = 0x6; static const uint8_t OP_ABORTACK = 0x7; static const uint8_t OP_STARTACK = 0x8; static const uint8_t OP_ERRORACK = 0x9; static const uint8_t OP_PROCESSINGACK = 0xA; static const uint8_t OP_PROCESSING = 0xB; static const uint8_t OP_RESULT = 0xC; static const uint8_t OP_RESULTACK = 0xD; static const uint8_t OP_REPORTS = 0x9; /*----------------------------------------------------------*/ /*! \brief constructs a new message, which is initial not valid. * \note It has to fed by the Parse method until IsValid method reports true. */ /*----------------------------------------------------------*/ CMostMsg(); /*----------------------------------------------------------*/ /*! \brief constructs a new message which is fully set up and valid * \param nFBlock - The MOST Function Block Identifier * \param nInst - The MOST Function Block Instance Identifier * \param nFunc - The MOST Function Block Function Identifier * \param nPayloadLen - The amount of bytes stored in Payload * \param Payload - The pointer to the payload byte array. */ /*----------------------------------------------------------*/ CMostMsg( uint32_t nFBlock, uint32_t nInst, uint32_t nFunc, uint8_t nOpType, uint32_t nPayloadLen, const uint8_t *Payload ); /*----------------------------------------------------------*/ /*! \brief Increments the reference counter */ /*----------------------------------------------------------*/ void AddReference(); /*----------------------------------------------------------*/ /*! \brief Decrements the reference counter, if the value reaches 0, this object destroys it self. */ /*----------------------------------------------------------*/ void RemoveReference(); /*----------------------------------------------------------*/ /*! \brief Fills out an empty CMostMsg (created with default constructor) * \return true, if parsing was valid. false, parser error, no way to continue. * \note Check with IsValid method if parsing is finished. */ /*----------------------------------------------------------*/ bool Parse( uint8_t receivedByte ); /*----------------------------------------------------------*/ /*! \brief serializes a message to an byte array * \note The byte array will be created inside this method and has to be freed after usage! * \return The bytes used inside the given buffer. */ /*----------------------------------------------------------*/ uint32_t ToByteArray( uint8_t **ppBuffer ); bool IsValid(); uint32_t GetFBlock(); uint32_t GetFunc(); uint32_t GetInst(); uint8_t GetOpType(); uint8_t *GetPayload(); uint32_t GetPayloadLen(); }; #endif //MOSTMSG_H