#pragma once #include "domain/register_monitor_model.h" #include "domain/register_repository.h" #include #include #include #include // 自由监控列表编辑的失败分类 enum class RegisterMonitorError { None, InvalidAddress, RangeOverflow, LimitExceeded, NoChange }; // 监控列表编辑结果;affectedCount 表示本次受影响的地址数量 struct RegisterMonitorResult { bool succeeded = false; RegisterMonitorError error = RegisterMonitorError::None; std::string message; int affectedCount = 0; }; // 自由监控写入结果;底层 RegisterError 会原样保留 struct RegisterMonitorWriteResult { bool succeeded = false; RegisterError error = RegisterError::Unavailable; std::string message; }; // 编排监控模型和寄存器仓库,地址列表属于当前会话 class RegisterMonitorService { public: explicit RegisterMonitorService(RegisterRepository &repository); // 从起始地址连续添加 count 个同区域地址 RegisterMonitorResult addRange(const std::string &start_address, int count); // 删除一批地址并通知 UI 刷新轮询集合 RegisterMonitorResult remove(const std::vector &addresses); // 清空监控列表 RegisterMonitorResult clear(); // 对单个 M 地址写位 RegisterMonitorWriteResult writeBit(const RegisterAddress &address, bool value); // 对单个 D 地址写字 RegisterMonitorWriteResult writeWord( const RegisterAddress &address, std::int16_t value); const std::vector &addresses() const; std::vector values(bool communication_fault) const; void setAddressesChangedCallback(std::function callback); private: RegisterRepository &repository_; RegisterMonitorModel model_; std::function addresses_changed_callback_; };