147 lines
3.8 KiB
C++
147 lines
3.8 KiB
C++
#ifndef PRINTERSTATEMANAGER_H
|
|
#define PRINTERSTATEMANAGER_H
|
|
|
|
#include <QObject>
|
|
#include <QTimer>
|
|
#include <QVector>
|
|
#include "SysPara.h"
|
|
|
|
enum class PrinterState {
|
|
IDLE, // 空闲
|
|
SELF_CHECK, // 自检完成
|
|
READY, // 就绪
|
|
PRINTING, // 打印中
|
|
STOPPING, // 停止中
|
|
ERROR, // 故障
|
|
POWER_OFF, // 关机中
|
|
NORMAL // 一种常规状态,表明机器运行中,true
|
|
};
|
|
|
|
enum class PrinterEvent {
|
|
PowerOn,
|
|
SelfCheckDone,
|
|
SelfCheckFailed,
|
|
ReSelfCheck,
|
|
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);
|
|
|
|
// 检查状态
|
|
void checkReadyState();
|
|
signals:
|
|
// 状态变化信号(外部监听执行具体业务)
|
|
void sig_stateChanged(PrinterState newState, PrinterState oldState, QString reason);
|
|
|
|
//使能开始和停止打印按钮
|
|
void sig_enableStartPrint(bool);
|
|
void sig_enableStopPrint(bool);
|
|
//使能开关回收槽
|
|
void sig_enableOpenTank(bool);
|
|
void sig_enableCloseTank(bool);
|
|
|
|
// 更新回收槽状态
|
|
void sig_updateReclaimStatus();
|
|
|
|
// 收回收槽
|
|
void sig_closeTank();
|
|
// 提示信息
|
|
void sig_infoMsg(QString);
|
|
|
|
// 墨水告警
|
|
void sig_infoBox(QString);
|
|
|
|
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<bool()>;
|
|
|
|
struct Transition {
|
|
PrinterState fromState;
|
|
PrinterEvent event;
|
|
PrinterState toState;
|
|
QString description;
|
|
GuardFunc guard;
|
|
};
|
|
|
|
QVector<Transition> m_transitions;
|
|
|
|
// 记录上一次回收槽状态
|
|
unsigned char lastState = 0;
|
|
|
|
void initTransitions();
|
|
Transition* findTransition(PrinterEvent event);
|
|
|
|
// 内部状态切换(不对外暴露)
|
|
void setState(PrinterState newState, const QString& reason = "");
|
|
|
|
QString stateNameFromEnum(PrinterState state) const;
|
|
|
|
// ============ guard 守卫条件函数 ============
|
|
// 检查回收槽是否已打开
|
|
bool guardReclaimTankOpen();
|
|
|
|
// 检查墨线是否已打开
|
|
bool guardInkSwintOpen();
|
|
|
|
// 检查是否无故障
|
|
bool guardNoError();
|
|
|
|
// 检查是否无墨水警告 true:正常
|
|
bool guardNoInkWarn();
|
|
|
|
// 检查是否无溶剂警告 true:正常
|
|
bool guardNoSolventWarn();
|
|
|
|
// 检查自检是否已完成
|
|
bool guardSelfCheckDone();
|
|
|
|
// 检查是否满足所有打印条件
|
|
bool guardCanStartPrint();
|
|
|
|
private:
|
|
QTimer* m_updateUITimer = NULL; //更新按钮UI
|
|
QTimer* m_canReadyTimer = NULL; //回收槽到底后检查是否满足打印条件
|
|
void initTimer();
|
|
private slots:
|
|
void slt_timeoutUI();
|
|
void slt_timeoutReady();
|
|
};
|
|
#endif // PRINTERSTATEMANAGER_H
|