|
- #pragma once
-
- namespace integrated_platform::domain {
-
- // 应用当前运行模式
- enum class ApplicationMode
- {
- Editing, // 编辑工程状态
- OfflineRunning, // 离线仿真运行状态
- OnlineRunning // 真机联机运行状态
- };
-
- // 当前运行模式对应的能力策略
- struct ModePolicy
- {
- // 是否允许编辑工程
- bool allowsProjectEditing = false;
- // 是否使用虚拟寄存器
- bool usesVirtualRegisters = false;
- // 是否使用 PLC 寄存器
- bool usesPlcRegisters = false;
- // 是否运行软件逻辑执行器
- bool runsLogicExecutor = false;
- // 是否要求进入真机前完成 PLC 初次读取
- bool requiresInitialPlcRead = false;
- };
-
- // 根据运行模式返回对应的能力策略
- constexpr ModePolicy policyForMode(ApplicationMode mode)
- {
- switch (mode)
- {
- case ApplicationMode::Editing:
- {
- return {true, false, false, false, false};
- }
- case ApplicationMode::OfflineRunning:
- {
- return {false, true, false, true, false};
- }
- case ApplicationMode::OnlineRunning:
- {
- return {false, false, true, false, true};
- }
- default:
- {
- return {};
- }
- }
- }
-
- // 模式切换失败原因
- enum class ModeTransitionError
- {
- None, // 切换成功
- AlreadyInRequestedMode, // 已经处于目标模式
- MustReturnToEditing, // 必须先返回编辑态
- InitialPlcReadRequired // 进入真机态前必须完成 PLC 初次读取
- };
-
- // 模式切换操作结果
- struct ModeTransitionResult
- {
- // 是否切换成功
- bool succeeded = false;
- // 切换失败原因
- ModeTransitionError error = ModeTransitionError::None;
- };
-
- class RuntimeState
- {
- public:
- // 获取当前运行模式
- ApplicationMode mode() const;
- // 获取当前模式能力策略
- ModePolicy policy() const;
-
- // 返回编辑态
- ModeTransitionResult enterEditing();
- // 进入离线仿真运行态
- ModeTransitionResult enterOfflineRunning();
-
- /**
- * @brief 尝试进入真机联机运行态
- * @param initial_plc_read_completed 是否已成功完成 PLC 初次读取并建立有效缓存
- * @return 模式切换结果
- */
- ModeTransitionResult enterOnlineRunning(bool initial_plc_read_completed);
-
- private:
- // 当前运行模式 初始为编辑态
- ApplicationMode mode_ = ApplicationMode::Editing;
- };
-
- } // namespace integrated_platform::domain
|