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