xref: /openbmc/phosphor-modbus/rtu/modbus/modbus_commands.hpp (revision 9695bd284570b51677c11529103929c8e51da6b6)
1 #pragma once
2 
3 #include "modbus_message.hpp"
4 
5 #include <vector>
6 
7 namespace phosphor::modbus::rtu
8 {
9 
10 static constexpr uint8_t ReadHoldingRegistersFunctionCode = 0x03;
11 
12 class ReadHoldingRegistersRequest : public Message
13 {
14   public:
15     ReadHoldingRegistersRequest() = delete;
16     ReadHoldingRegistersRequest(const ReadHoldingRegistersRequest&) = delete;
17     ReadHoldingRegistersRequest& operator=(const ReadHoldingRegistersRequest&) =
18         delete;
19     ReadHoldingRegistersRequest(ReadHoldingRegistersRequest&&) = delete;
20     ReadHoldingRegistersRequest& operator=(ReadHoldingRegistersRequest&&) =
21         delete;
22 
23     explicit ReadHoldingRegistersRequest(
24         uint8_t deviceAddress, uint16_t registerOffset, uint16_t registerCount);
25 
26     auto encode() -> void;
27 
28   private:
29     static constexpr uint8_t commandCode = ReadHoldingRegistersFunctionCode;
30     const uint8_t deviceAddress;
31     const uint16_t registerOffset;
32     const uint16_t registerCount;
33 };
34 
35 class Response : public Message
36 {
37   public:
38     auto decode() -> void;
39 };
40 
41 class ReadHoldingRegistersResponse : public Response
42 {
43   public:
44     ReadHoldingRegistersResponse() = delete;
45     ReadHoldingRegistersResponse(const ReadHoldingRegistersResponse&) = delete;
46     ReadHoldingRegistersResponse& operator=(
47         const ReadHoldingRegistersResponse&) = delete;
48     ReadHoldingRegistersResponse(ReadHoldingRegistersResponse&&) = delete;
49     ReadHoldingRegistersResponse& operator=(ReadHoldingRegistersResponse&&) =
50         delete;
51 
52     explicit ReadHoldingRegistersResponse(uint8_t deviceAddress,
53                                           std::vector<uint16_t>& registers);
54 
55     auto decode() -> void;
56 
57   private:
58     static constexpr uint8_t expectedCommandCode =
59         ReadHoldingRegistersFunctionCode;
60     const uint8_t expectedDeviceAddress;
61     // The returned response is stored in the registers vector
62     std::vector<uint16_t>& registers;
63 };
64 
65 } // namespace phosphor::modbus::rtu
66