#ifndef PRINTERSTATEMANAGER_H #define PRINTERSTATEMANAGER_H #pragma once #include #include #include "SysPara.h" enum class PrinterState { IDLE, // 空闲 SELF_CHECK, // 自检中 READY, // 就绪 PRINTING, // 打印中 STOPPING, // 停止中 ERROR, // 故障 POWER_OFF, // 关机中 NORMAL // 一种常规状态,表明机器运行中,true }; enum class PrinterEvent { PowerOn, SelfCheckDone, SelfCheckFailed, StartPrint, StopPrint, StopComplete, ErrorOccurred, ErrorCleared, PowerOff, PowerOffDone }; class PrinterStateManager : public QObject { Q_OBJECT public: static PrinterStateManager* instance(); // 绑定 sysPara(用于守卫条件) void bindSysPara(SysPara* para) { m_sysPara = para; } // ============ 状态查询 ============ PrinterState currentState() const { return m_currentState; } QString stateName() const; bool isState(PrinterState state) const { return m_currentState == state; } bool canStartPrint() const { return m_currentState == PrinterState::READY; } bool canStopPrint() const { return m_currentState == PrinterState::PRINTING; } // ============ 状态管理 ============ // 初始化状态(只在开机时调用一次) void initFromSysPara(); // 外部唯一接口:请求切换状态 void requestTransition(PrinterEvent event); signals: // 状态变化信号(外部监听执行具体业务) void sig_stateChanged(PrinterState newState, PrinterState oldState, QString reason); private: PrinterStateManager(); ~PrinterStateManager(); SysPara* m_sysPara = nullptr; static PrinterStateManager* s_instance; PrinterState m_currentState = PrinterState::IDLE; PrinterState m_previousState = PrinterState::IDLE; // 状态转移表 // 守卫条件函数类型 using GuardFunc = std::function; struct Transition { PrinterState fromState; PrinterEvent event; PrinterState toState; QString description; GuardFunc guard; }; QVector m_transitions; void initTransitions(); Transition* findTransition(PrinterEvent event); // 内部状态切换(不对外暴露) void setState(PrinterState newState, const QString& reason = ""); QString stateNameFromEnum(PrinterState state) const; // ============ 守卫条件函数 ============ // 检查回收槽是否已打开 bool guardReclaimTankOpen(); // 检查墨线是否已打开 bool guardInkSwintOpen(); // 检查是否无故障 bool guardNoError(); // 检查是否无墨水警告 bool guardNoInkWarn(); // 检查是否无溶剂警告 bool guardNoSolventWarn(); // 检查自检是否已完成 bool guardSelfCheckDone(); // 检查是否满足所有打印条件 bool guardCanStartPrint(); }; #endif // PRINTERSTATEMANAGER_H