/** * @file runtime_panel_controller.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 #include #include class AlarmService; class HmiEditorService; class HmiEditorWidget; class HmiNavigationService; class HmiRuntimeService; class LogicEditorService; class LogicEditorWidget; class QLabel; class ProjectService; class RegisterMonitorService; class RuntimeModeService; class RuntimeMonitorWidget; class RuntimeMonitorWindow; class QTimer; class QWidget; /** 组织运行监控窗口、刷新定时器和本地逻辑执行器反馈 */ class RuntimePanelController final { public: /** 向状态栏报告一条带超时的消息 */ using StatusReporter = std::function; /** 向输出面板报告一条消息 */ using OutputReporter = std::function; /** 请求上层退出当前运行态 */ using RuntimeExitRequester = std::function; /** 创建运行面板控制器并注入运行模式、编辑器和监控窗口依赖 */ RuntimePanelController( QWidget &parent, RuntimeModeService &runtime_mode_service, ProjectService &project_service, HmiEditorService &hmi_editor_service, HmiRuntimeService &hmi_runtime_service, LogicEditorService &logic_editor_service, HmiNavigationService &hmi_navigation_service, AlarmService &alarm_service, RegisterMonitorService ®ister_monitor_service, HmiEditorWidget &hmi_editor_widget, LogicEditorWidget &logic_editor_widget, QLabel &executor_status_label, std::function current_logic_id, std::function select_logic, std::function show_logic_properties, StatusReporter status_reporter, OutputReporter output_reporter, RuntimeExitRequester runtime_exit_requester); /** 停止刷新并释放控制器拥有的运行监控窗口 */ ~RuntimePanelController(); /** 连接运行监控相关信号并完成初始配置 */ void configure(); /** 配置专用用户运行版的精简控制栏行为 */ void configureUserRuntimeMode( bool enabled, std::function mode_requester, std::function plc_configuration_requester, std::function plc_disconnect_requester); /** 创建或复用唯一监控窗口,并把当前工程投影到运行态 */ void enterRuntime( const std::string &page_id, const std::string &logic_id, ApplicationMode mode, PlcConnectionState plc_state); /** 停止刷新并隐藏监控窗口,离线服务的停止由运行模式服务负责 */ void leaveRuntime(ApplicationMode mode, PlcConnectionState plc_state); /** 应用退出时关闭运行监控窗口并停止相关刷新 */ void closeForApplicationExit(); /** 根据当前模式的本地执行器状态刷新运行界面 */ void updateSimulationUi(bool report_fault); /** 返回当前唯一的运行监控控件 */ RuntimeMonitorWidget *runtimeMonitorWidget() const; private: /** 处理运行刷新定时器到期事件 */ void handleRuntimeTimer(); /** 处理离线或真机只读轨迹执行器状态变化 */ void handleSimulationStateChanged(); /** 处理一次离线扫描完成事件 */ void handleScanCompleted(); /** 主窗口父对象,不由控制器拥有 */ QWidget &parent_; /** 运行模式服务,不由控制器拥有 */ RuntimeModeService &runtime_mode_service_; /** 工程服务,不由控制器拥有 */ ProjectService &project_service_; /** HMI 编辑服务,不由控制器拥有 */ HmiEditorService &hmi_editor_service_; /** HMI 运行服务,不由控制器拥有 */ HmiRuntimeService &hmi_runtime_service_; /** 梯形图编辑服务,不由控制器拥有 */ LogicEditorService &logic_editor_service_; /** HMI 页面导航服务,不由控制器拥有 */ HmiNavigationService &hmi_navigation_service_; /** 报警服务,不由控制器拥有 */ AlarmService &alarm_service_; /** 寄存器监控服务,不由控制器拥有 */ RegisterMonitorService ®ister_monitor_service_; /** 主窗口中的 HMI 编辑器,不由控制器拥有 */ HmiEditorWidget &hmi_editor_widget_; /** 主窗口中的梯形图编辑器,不由控制器拥有 */ LogicEditorWidget &logic_editor_widget_; /** 显示当前本地执行器状态的标签 */ QLabel &executor_status_label_; /** 获取当前控制逻辑标识的回调 */ std::function current_logic_id_; /** 切换当前控制逻辑的回调 */ std::function select_logic_; /** 显示控制逻辑属性的回调 */ std::function show_logic_properties_; /** 向状态栏报告消息的回调 */ StatusReporter status_reporter_; /** 向输出面板报告消息的回调 */ OutputReporter output_reporter_; /** 请求主窗口退出运行态的回调 */ RuntimeExitRequester runtime_exit_requester_; /** 唯一的运行监控顶层窗口 */ std::unique_ptr runtime_monitor_window_; /** 运行监控窗口中的主控件,窗口拥有它 */ RuntimeMonitorWidget *runtime_monitor_widget_ = nullptr; /** 定时刷新运行监控数据的计时器 */ QTimer *runtime_refresh_timer_ = nullptr; /** 当前是否已经进入运行监控会话 */ bool runtime_session_active_ = false; std::function mode_requester_; std::function plc_configuration_requester_; std::function plc_disconnect_requester_; };