1*9695bd28SJagpal Singh Gill #pragma once 2*9695bd28SJagpal Singh Gill 3*9695bd28SJagpal Singh Gill #include <array> 4*9695bd28SJagpal Singh Gill #include <cstddef> 5*9695bd28SJagpal Singh Gill #include <cstdint> 6*9695bd28SJagpal Singh Gill #include <string> 7*9695bd28SJagpal Singh Gill #include <vector> 8*9695bd28SJagpal Singh Gill 9*9695bd28SJagpal Singh Gill namespace phosphor::modbus::rtu 10*9695bd28SJagpal Singh Gill { 11*9695bd28SJagpal Singh Gill 12*9695bd28SJagpal Singh Gill class Message 13*9695bd28SJagpal Singh Gill { 14*9695bd28SJagpal Singh Gill public: 15*9695bd28SJagpal Singh Gill static constexpr auto maxADUSize = 256; 16*9695bd28SJagpal Singh Gill std::array<uint8_t, maxADUSize> raw{}; 17*9695bd28SJagpal Singh Gill size_t len = 0; 18*9695bd28SJagpal Singh Gill 19*9695bd28SJagpal Singh Gill // Push to the end of raw message 20*9695bd28SJagpal Singh Gill Message& operator<<(uint8_t d); 21*9695bd28SJagpal Singh Gill Message& operator<<(uint16_t d); 22*9695bd28SJagpal Singh Gill Message& operator<<(uint32_t d); 23*9695bd28SJagpal Singh Gill 24*9695bd28SJagpal Singh Gill // Pop from the end of raw message 25*9695bd28SJagpal Singh Gill Message& operator>>(uint8_t& d); 26*9695bd28SJagpal Singh Gill Message& operator>>(uint16_t& d); 27*9695bd28SJagpal Singh Gill Message& operator>>(uint32_t& d); 28*9695bd28SJagpal Singh Gill 29*9695bd28SJagpal Singh Gill Message() = default; 30*9695bd28SJagpal Singh Gill Message(const Message&) = delete; 31*9695bd28SJagpal Singh Gill Message& operator=(const Message&) = delete; 32*9695bd28SJagpal Singh Gill 33*9695bd28SJagpal Singh Gill uint8_t& address = raw[0]; 34*9695bd28SJagpal Singh Gill uint8_t& functionCode = raw[1]; 35*9695bd28SJagpal Singh Gill 36*9695bd28SJagpal Singh Gill protected: 37*9695bd28SJagpal Singh Gill auto appendCRC() -> void; 38*9695bd28SJagpal Singh Gill auto validate() -> void; 39*9695bd28SJagpal Singh Gill auto verifyValue(const std::string& name, uint32_t currentValue, 40*9695bd28SJagpal Singh Gill uint32_t expectedValue) -> void; 41*9695bd28SJagpal Singh Gill 42*9695bd28SJagpal Singh Gill template <typename T> operator >>(std::vector<T> & d)43*9695bd28SJagpal Singh Gill Message& operator>>(std::vector<T>& d) 44*9695bd28SJagpal Singh Gill { 45*9695bd28SJagpal Singh Gill for (auto it = d.rbegin(); it != d.rend(); it++) 46*9695bd28SJagpal Singh Gill { 47*9695bd28SJagpal Singh Gill *this >> *it; 48*9695bd28SJagpal Singh Gill } 49*9695bd28SJagpal Singh Gill return *this; 50*9695bd28SJagpal Singh Gill } 51*9695bd28SJagpal Singh Gill 52*9695bd28SJagpal Singh Gill private: 53*9695bd28SJagpal Singh Gill auto generateCRC() -> uint16_t; 54*9695bd28SJagpal Singh Gill begin()55*9695bd28SJagpal Singh Gill constexpr auto begin() noexcept 56*9695bd28SJagpal Singh Gill { 57*9695bd28SJagpal Singh Gill return raw.begin(); 58*9695bd28SJagpal Singh Gill } end()59*9695bd28SJagpal Singh Gill auto end() noexcept 60*9695bd28SJagpal Singh Gill { 61*9695bd28SJagpal Singh Gill return raw.begin() + len; 62*9695bd28SJagpal Singh Gill } 63*9695bd28SJagpal Singh Gill }; 64*9695bd28SJagpal Singh Gill 65*9695bd28SJagpal Singh Gill } // namespace phosphor::modbus::rtu 66