/** * @file free_monitor_widget.h * @brief 定义自由寄存器监控控件 * @version 1.0.0 * @author suyu * @date 2026-08-22 */ #pragma once #include "domain/runtime_state.h" #include "services/plc_communication_gateway.h" #include #include namespace Ui { class FreeMonitorWidget; } class RegisterMonitorService; /** 自由监控 UI:地址列表属于当前会话,读写统一委托 RegisterMonitorService */ class FreeMonitorWidget final : public QWidget { Q_OBJECT public: /** 创建自由监控控件并绑定监控服务 */ explicit FreeMonitorWidget( RegisterMonitorService &service, QWidget *parent = nullptr); /** 释放 Designer 界面对象 */ ~FreeMonitorWidget() override; /** 根据当前模式和通信状态开启或关闭写入入口 */ void setWriteEnabled(bool enabled); /** 根据运行模式和 PLC 状态刷新所有监控值 */ void refreshValues(ApplicationMode mode, PlcConnectionState plc_state); /** 从服务重新加载当前会话中的地址列表 */ void reloadAddresses(); signals: /** 监控地址列表发生变化时发出 */ void monitorAddressesChanged(); /** 操作完成后发出可直接显示的消息 */ void operationMessage(const QString &message); private: /** 从输入框添加一个或多个监控地址 */ void addAddresses(); /** 删除当前选中的监控地址 */ void removeSelectedAddresses(); /** 清空当前会话中的监控地址 */ void clearAddresses(); /** 写入指定行中的寄存器值 */ void writeRow(int row); /** 根据当前权限刷新写入控件状态 */ void updateWriteControls(); /** 统一处理监控服务返回结果 */ void handleResult(const QString &action, bool succeeded, const std::string &message); /** Qt Designer 生成的界面对象 */ std::unique_ptr ui_; /** 寄存器监控服务,不由控件拥有 */ RegisterMonitorService &service_; /** 当前是否允许执行寄存器写入 */ bool write_enabled_ = false; };