xref: /openbmc/phosphor-modbus/rtu/modbus/modbus_message.hpp (revision 9695bd284570b51677c11529103929c8e51da6b6)
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