blob: 117408b1130d1d0d64f978d7f92c0fc1d36f61c8 [file] [log] [blame]
#pragma once
#include "modbus_message.hpp"
#include <vector>
namespace phosphor::modbus::rtu
{
static constexpr uint8_t ReadHoldingRegistersFunctionCode = 0x03;
class ReadHoldingRegistersRequest : public Message
{
public:
ReadHoldingRegistersRequest() = delete;
ReadHoldingRegistersRequest(const ReadHoldingRegistersRequest&) = delete;
ReadHoldingRegistersRequest& operator=(const ReadHoldingRegistersRequest&) =
delete;
ReadHoldingRegistersRequest(ReadHoldingRegistersRequest&&) = delete;
ReadHoldingRegistersRequest& operator=(ReadHoldingRegistersRequest&&) =
delete;
explicit ReadHoldingRegistersRequest(
uint8_t deviceAddress, uint16_t registerOffset, uint16_t registerCount);
auto encode() -> void;
private:
static constexpr uint8_t commandCode = ReadHoldingRegistersFunctionCode;
const uint8_t deviceAddress;
const uint16_t registerOffset;
const uint16_t registerCount;
};
class Response : public Message
{
public:
auto decode() -> void;
};
class ReadHoldingRegistersResponse : public Response
{
public:
ReadHoldingRegistersResponse() = delete;
ReadHoldingRegistersResponse(const ReadHoldingRegistersResponse&) = delete;
ReadHoldingRegistersResponse& operator=(
const ReadHoldingRegistersResponse&) = delete;
ReadHoldingRegistersResponse(ReadHoldingRegistersResponse&&) = delete;
ReadHoldingRegistersResponse& operator=(ReadHoldingRegistersResponse&&) =
delete;
explicit ReadHoldingRegistersResponse(uint8_t deviceAddress,
std::vector<uint16_t>& registers);
auto decode() -> void;
private:
static constexpr uint8_t expectedCommandCode =
ReadHoldingRegistersFunctionCode;
const uint8_t expectedDeviceAddress;
// The returned response is stored in the registers vector
std::vector<uint16_t>& registers;
};
} // namespace phosphor::modbus::rtu