hlp:新建文件,内容从左下角开始,使用状态机,报警内容在自检和关机时不爆红提示
This commit is contained in:
@@ -0,0 +1,204 @@
|
||||
#include "PrinterStateManager.h"
|
||||
#include <QDebug>
|
||||
|
||||
PrinterStateManager* PrinterStateManager::s_instance = nullptr;
|
||||
|
||||
PrinterStateManager* PrinterStateManager::instance()
|
||||
{
|
||||
if (!s_instance) {
|
||||
s_instance = new PrinterStateManager();
|
||||
}
|
||||
return s_instance;
|
||||
}
|
||||
|
||||
PrinterStateManager::PrinterStateManager()
|
||||
{
|
||||
initTransitions();
|
||||
m_currentState = PrinterState::IDLE;
|
||||
}
|
||||
|
||||
PrinterStateManager::~PrinterStateManager()
|
||||
{
|
||||
}
|
||||
|
||||
QString PrinterStateManager::stateName() const
|
||||
{
|
||||
switch (m_currentState) {
|
||||
case PrinterState::IDLE: return "空闲";
|
||||
case PrinterState::SELF_CHECK: return "自检中";
|
||||
case PrinterState::READY: return "就绪";
|
||||
case PrinterState::PRINTING: return "打印中";
|
||||
case PrinterState::STOPPING: return "停止中";
|
||||
case PrinterState::ERROR: return "故障";
|
||||
case PrinterState::POWER_OFF: return "关机中";
|
||||
default: return "未知";
|
||||
}
|
||||
}
|
||||
|
||||
// ============ 初始化状态(开机时调用一次) ============
|
||||
void PrinterStateManager::initFromSysPara()
|
||||
{
|
||||
setState(PrinterState::SELF_CHECK, "Init from sysPara");
|
||||
}
|
||||
|
||||
// ============ 状态转移表 ============
|
||||
void PrinterStateManager::initTransitions()
|
||||
{
|
||||
m_transitions = {
|
||||
// 开机流程
|
||||
{PrinterState::IDLE, PrinterEvent::PowerOn,
|
||||
PrinterState::SELF_CHECK, "IDLE → SELF_CHECK", nullptr},
|
||||
{PrinterState::SELF_CHECK, PrinterEvent::SelfCheckDone,
|
||||
PrinterState::READY, "SELF_CHECK → READY", nullptr},
|
||||
{PrinterState::SELF_CHECK, PrinterEvent::SelfCheckFailed,
|
||||
PrinterState::ERROR, "SELF_CHECK → ERROR", nullptr},
|
||||
|
||||
// 打印流程
|
||||
{PrinterState::READY, PrinterEvent::StartPrint,
|
||||
PrinterState::PRINTING, "READY → PRINTING",
|
||||
[this]() -> bool { return guardCanStartPrint(); }},
|
||||
|
||||
{PrinterState::PRINTING, PrinterEvent::StopPrint,
|
||||
PrinterState::STOPPING, "PRINTING → STOPPING", nullptr},
|
||||
{PrinterState::STOPPING, PrinterEvent::StopComplete,
|
||||
PrinterState::READY, "STOPPING → READY", nullptr},
|
||||
|
||||
// 错误处理
|
||||
{PrinterState::READY, PrinterEvent::ErrorOccurred,
|
||||
PrinterState::ERROR, "READY → ERROR", nullptr},
|
||||
{PrinterState::PRINTING, PrinterEvent::ErrorOccurred,
|
||||
PrinterState::ERROR, "PRINTING → ERROR", nullptr},
|
||||
{PrinterState::STOPPING, PrinterEvent::ErrorOccurred,
|
||||
PrinterState::ERROR, "STOPPING → ERROR", nullptr},
|
||||
{PrinterState::ERROR, PrinterEvent::ErrorCleared,
|
||||
PrinterState::READY, "ERROR → READY", nullptr},
|
||||
|
||||
// 关机
|
||||
{PrinterState::READY, PrinterEvent::PowerOff,
|
||||
PrinterState::POWER_OFF, "READY → POWER_OFF", nullptr},
|
||||
{PrinterState::PRINTING, PrinterEvent::PowerOff,
|
||||
PrinterState::POWER_OFF, "PRINTING → POWER_OFF", nullptr},
|
||||
{PrinterState::STOPPING, PrinterEvent::PowerOff,
|
||||
PrinterState::POWER_OFF, "STOPPING → POWER_OFF", nullptr},
|
||||
{PrinterState::ERROR, PrinterEvent::PowerOff,
|
||||
PrinterState::POWER_OFF, "ERROR → POWER_OFF", nullptr},
|
||||
{PrinterState::POWER_OFF, PrinterEvent::PowerOffDone,
|
||||
PrinterState::IDLE, "POWER_OFF → IDLE", nullptr},
|
||||
};
|
||||
}
|
||||
|
||||
// ============ 查找转移 ============
|
||||
PrinterStateManager::Transition* PrinterStateManager::findTransition(PrinterEvent event)
|
||||
{
|
||||
for (Transition& trans : m_transitions) {
|
||||
if (trans.fromState == m_currentState && trans.event == event) {
|
||||
return &trans;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// ============ 请求切换状态(外部唯一接口) ============
|
||||
void PrinterStateManager::requestTransition(PrinterEvent event)
|
||||
{
|
||||
qDebug() << "Request event:" << static_cast<int>(event)
|
||||
<< "Current:" << stateName();
|
||||
|
||||
m_currentState = PrinterState::READY;
|
||||
Transition* trans = findTransition(event);
|
||||
if (!trans) {
|
||||
qDebug() << "Invalid transition, ignored";
|
||||
return;
|
||||
}
|
||||
|
||||
// 检查守卫条件
|
||||
if (trans->guard) {
|
||||
bool result = trans->guard();
|
||||
if (!result) {
|
||||
qDebug() << "Guard condition failed for:" << trans->description;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 执行状态切换(内部管理)
|
||||
setState(trans->toState, trans->description);
|
||||
}
|
||||
|
||||
// ============ 内部状态切换 ============
|
||||
void PrinterStateManager::setState(PrinterState newState, const QString& reason)
|
||||
{
|
||||
if (m_currentState == newState) {
|
||||
qDebug() << "State already:" << stateName();
|
||||
return;
|
||||
}
|
||||
|
||||
m_previousState = m_currentState;
|
||||
m_currentState = newState;
|
||||
|
||||
qDebug() << "State changed:" << stateName() << "Reason:" << reason;
|
||||
|
||||
// 发送信号通知外部
|
||||
emit sig_stateChanged(newState, m_previousState, reason);
|
||||
}
|
||||
|
||||
// ============ 辅助函数 ============
|
||||
QString PrinterStateManager::stateNameFromEnum(PrinterState state) const
|
||||
{
|
||||
switch (state) {
|
||||
case PrinterState::IDLE: return "IDLE";
|
||||
case PrinterState::SELF_CHECK: return "SELF_CHECK";
|
||||
case PrinterState::READY: return "READY";
|
||||
case PrinterState::PRINTING: return "PRINTING";
|
||||
case PrinterState::STOPPING: return "STOPPING";
|
||||
case PrinterState::ERROR: return "ERROR";
|
||||
case PrinterState::POWER_OFF: return "POWER_OFF";
|
||||
default: return "UNKNOWN";
|
||||
}
|
||||
}
|
||||
|
||||
// ============ 守卫条件函数 ============
|
||||
|
||||
bool PrinterStateManager::guardReclaimTankOpen()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return m_sysPara->status.reclainTankReachEnd == true;
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardInkSwintOpen()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return !(m_sysPara->status.statWarn & WARN_STATUS_INK_SWINT);
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardNoError()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return m_sysPara->status.statWarn == 0;
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardNoInkWarn()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return !(m_sysPara->status.statWarn & WARN_STATUS_INK_WARN);
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardNoSolventWarn()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return !(m_sysPara->status.statWarn & WARN_STATUS_SOLV_WARN);
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardSelfCheckDone()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return m_sysPara->status.selfCheckDone == true;
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardCanStartPrint()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
|
||||
// 自检完成,开回收槽,开墨线,无异常报错
|
||||
return guardReclaimTankOpen() && guardInkSwintOpen() &&
|
||||
guardNoError() && guardSelfCheckDone();
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
#ifndef PRINTERSTATEMANAGER_H
|
||||
#define PRINTERSTATEMANAGER_H
|
||||
#pragma once
|
||||
#include <QObject>
|
||||
#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,
|
||||
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<bool()>;
|
||||
|
||||
struct Transition {
|
||||
PrinterState fromState;
|
||||
PrinterEvent event;
|
||||
PrinterState toState;
|
||||
QString description;
|
||||
GuardFunc guard;
|
||||
};
|
||||
|
||||
QVector<Transition> 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
|
||||
Reference in New Issue
Block a user