#pragma once #include #include #include #include "itransport.hpp" #include "data_format.hpp" class Controller { public: explicit Controller(std::unique_ptr transport); // lifecycle void poll(); bool connect(const char* host, std::uint16_t port); void disconnect(); bool is_connected() const; // raw register bool read_register(std::uint16_t addr, std::uint16_t& value); bool write_register(std::uint16_t addr, std::uint16_t value); bool read_raw(std::uint16_t addr, std::uint16_t count, std::vector& out); // 32-bit bool read_int32(std::uint16_t addr, std::int32_t& value, const DataFormat& fmt); bool write_int32(std::uint16_t addr, std::int32_t value, const DataFormat& fmt); bool read_uint32(std::uint16_t addr, std::uint32_t& value, const DataFormat& fmt); bool write_uint32(std::uint16_t addr, std::uint32_t value, const DataFormat& fmt); // float / double bool read_float(std::uint16_t addr, float& value, const DataFormat& fmt); bool write_float(std::uint16_t addr, float value, const DataFormat& fmt); bool read_double(std::uint16_t addr, double& value, const DataFormat& fmt); bool write_double(std::uint16_t addr, double value, const DataFormat& fmt); // 64-bit bool read_int64(std::uint16_t addr, std::int64_t& value, const DataFormat& fmt); bool write_int64(std::uint16_t addr, std::int64_t value, const DataFormat& fmt); bool read_uint64(std::uint16_t addr, std::uint64_t& value, const DataFormat& fmt); bool write_uint64(std::uint16_t addr, std::uint64_t value, const DataFormat& fmt); private: std::unique_ptr transport_; };