hlp:状态机初版,统一管理回收槽状态,启动和停止打印时的状态
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include "PrinterStateManager.h"
|
||||
#include "PrinterStateManager.h"
|
||||
#include <QDebug>
|
||||
#include "LogInfo.h"
|
||||
|
||||
PrinterStateManager* PrinterStateManager::s_instance = nullptr;
|
||||
|
||||
@@ -15,17 +16,37 @@ PrinterStateManager::PrinterStateManager()
|
||||
{
|
||||
initTransitions();
|
||||
m_currentState = PrinterState::IDLE;
|
||||
initTimer();
|
||||
}
|
||||
|
||||
PrinterStateManager::~PrinterStateManager()
|
||||
{
|
||||
if (m_updateUITimer) {
|
||||
m_updateUITimer->stop();
|
||||
m_updateUITimer->deleteLater();
|
||||
m_updateUITimer = NULL;
|
||||
}
|
||||
if (m_sysPara) {
|
||||
m_sysPara = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void PrinterStateManager::initTimer()
|
||||
{
|
||||
if (m_updateUITimer == NULL) {
|
||||
m_updateUITimer = new QTimer();
|
||||
connect(m_updateUITimer, &QTimer::timeout, this,
|
||||
&PrinterStateManager::slt_timeout);
|
||||
m_updateUITimer->setInterval(50);
|
||||
m_updateUITimer->setSingleShot(true);
|
||||
}
|
||||
}
|
||||
|
||||
QString PrinterStateManager::stateName() const
|
||||
{
|
||||
switch (m_currentState) {
|
||||
case PrinterState::IDLE: return "空闲";
|
||||
case PrinterState::SELF_CHECK: return "自检中";
|
||||
case PrinterState::SELF_CHECK: return "自检完成";
|
||||
case PrinterState::READY: return "就绪";
|
||||
case PrinterState::PRINTING: return "打印中";
|
||||
case PrinterState::STOPPING: return "停止中";
|
||||
@@ -38,7 +59,7 @@ QString PrinterStateManager::stateName() const
|
||||
// ============ 初始化状态(开机时调用一次) ============
|
||||
void PrinterStateManager::initFromSysPara()
|
||||
{
|
||||
setState(PrinterState::SELF_CHECK, "Init from sysPara");
|
||||
setState(PrinterState::IDLE, "Init from sysPara");
|
||||
}
|
||||
|
||||
// ============ 状态转移表 ============
|
||||
@@ -49,9 +70,13 @@ void PrinterStateManager::initTransitions()
|
||||
{PrinterState::IDLE, PrinterEvent::PowerOn,
|
||||
PrinterState::SELF_CHECK, "IDLE → SELF_CHECK", nullptr},
|
||||
{PrinterState::SELF_CHECK, PrinterEvent::SelfCheckDone,
|
||||
PrinterState::READY, "SELF_CHECK → READY", nullptr},
|
||||
PrinterState::READY, "SELF_CHECK → READY",
|
||||
[this]() -> bool { return guardReclaimTankOpen(); }},
|
||||
{PrinterState::SELF_CHECK, PrinterEvent::SelfCheckFailed,
|
||||
PrinterState::ERROR, "SELF_CHECK → ERROR", nullptr},
|
||||
// 注意,逆清洗和关回收槽时,需要把状态重新切换回自检
|
||||
{PrinterState::READY, PrinterEvent::ReSelfCheck,
|
||||
PrinterState::SELF_CHECK, "READY → SELF_CHECK", nullptr},
|
||||
|
||||
// 打印流程
|
||||
{PrinterState::READY, PrinterEvent::StartPrint,
|
||||
@@ -101,8 +126,9 @@ PrinterStateManager::Transition* PrinterStateManager::findTransition(PrinterEven
|
||||
// ============ 请求切换状态(外部唯一接口) ============
|
||||
void PrinterStateManager::requestTransition(PrinterEvent event)
|
||||
{
|
||||
qDebug() << "Request event:" << static_cast<int>(event)
|
||||
<< "Current:" << stateName();
|
||||
LogInfo::setRunStatusText(QString("Transition %1:%2")
|
||||
.arg(stateName())
|
||||
.arg(m_sysPara->status.reclaimTankstatus));
|
||||
|
||||
Transition* trans = findTransition(event);
|
||||
if (!trans) {
|
||||
@@ -123,11 +149,51 @@ void PrinterStateManager::requestTransition(PrinterEvent event)
|
||||
setState(trans->toState, trans->description);
|
||||
}
|
||||
|
||||
static int f = 0;
|
||||
void PrinterStateManager::checkReadyState()
|
||||
{
|
||||
// 自检完成后,随时检查能否进入READY状态
|
||||
if (m_currentState == PrinterState::SELF_CHECK) {
|
||||
if (m_sysPara) {
|
||||
if (f ++ > 50) {
|
||||
f = 0;
|
||||
LogInfo::setRunStatusText
|
||||
(QString("%3:%1---airPushing:%2")
|
||||
.arg(m_sysPara->status.reclaimTankstatus)
|
||||
.arg(m_sysPara->status.airPushing)
|
||||
.arg(stateName()));
|
||||
}
|
||||
|
||||
if (m_sysPara->status.airPushing) {
|
||||
emit sig_enableOpenTank(false);
|
||||
emit sig_enableCloseTank(false);
|
||||
return;
|
||||
}
|
||||
|
||||
switch (m_sysPara->status.reclaimTankstatus) {
|
||||
case 5:
|
||||
setState(PrinterState::READY, "READY");
|
||||
break;
|
||||
default:
|
||||
// 回收槽状态变化后就更新一次
|
||||
if (lastState != m_sysPara->status.reclaimTankstatus
|
||||
&& m_sysPara->status.reclaimTankstatus != 0) {
|
||||
if (m_updateUITimer && !m_updateUITimer->isActive()) {
|
||||
m_updateUITimer->start();
|
||||
}
|
||||
lastState = m_sysPara->status.reclaimTankstatus;
|
||||
emit sig_updateReclaimStatus();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ============ 内部状态切换 ============
|
||||
void PrinterStateManager::setState(PrinterState newState, const QString& reason)
|
||||
{
|
||||
if (m_currentState == newState) {
|
||||
qDebug() << "State already:" << stateName();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -136,8 +202,12 @@ void PrinterStateManager::setState(PrinterState newState, const QString& reason)
|
||||
|
||||
qDebug() << "State changed:" << stateName() << "Reason:" << reason;
|
||||
|
||||
if (m_updateUITimer && !m_updateUITimer->isActive())
|
||||
m_updateUITimer->start();
|
||||
|
||||
// 发送信号通知外部
|
||||
emit sig_stateChanged(newState, m_previousState, reason);
|
||||
emit sig_updateReclaimStatus();
|
||||
}
|
||||
|
||||
// ============ 辅助函数 ============
|
||||
@@ -157,21 +227,30 @@ QString PrinterStateManager::stateNameFromEnum(PrinterState state) const
|
||||
|
||||
// ============ 守卫条件函数 ============
|
||||
|
||||
static char times = 0;
|
||||
bool PrinterStateManager::guardReclaimTankOpen()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
return m_sysPara->status.reclainTankReachEnd == true;
|
||||
if (times ++ > 50) {
|
||||
times = 0;
|
||||
LogInfo::setRunStatusText(QString("guardReclaimTankOpen:%1").arg(m_sysPara->status.reclainTankReachEnd));
|
||||
LogInfo::setRunStatusText(QString("reclaimTankstatus:%1").arg(m_sysPara->status.reclaimTankstatus));
|
||||
}
|
||||
|
||||
return m_sysPara->status.reclainTankReachEnd || (m_sysPara->status.reclaimTankstatus == 5);
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardInkSwintOpen()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
LogInfo::setRunStatusText("guardInkSwintOpen:" + !(m_sysPara->status.statWarn & WARN_STATUS_INK_SWINT));
|
||||
return !(m_sysPara->status.statWarn & WARN_STATUS_INK_SWINT);
|
||||
}
|
||||
|
||||
bool PrinterStateManager::guardNoError()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
LogInfo::setRunStatusText("guardNoError:" + (m_sysPara->status.statWarn == 0));
|
||||
return m_sysPara->status.statWarn == 0;
|
||||
}
|
||||
|
||||
@@ -190,6 +269,7 @@ bool PrinterStateManager::guardNoSolventWarn()
|
||||
bool PrinterStateManager::guardSelfCheckDone()
|
||||
{
|
||||
if (!m_sysPara) return false;
|
||||
LogInfo::setRunStatusText("guardSelfCheckDone:" + m_sysPara->status.selfCheckDone);
|
||||
return m_sysPara->status.selfCheckDone == true;
|
||||
}
|
||||
|
||||
@@ -201,3 +281,64 @@ bool PrinterStateManager::guardCanStartPrint()
|
||||
return guardReclaimTankOpen() && guardInkSwintOpen() &&
|
||||
guardNoError() && guardSelfCheckDone();
|
||||
}
|
||||
|
||||
void PrinterStateManager::slt_timeout()
|
||||
{
|
||||
if (m_sysPara) {
|
||||
LogInfo::setRunStatusText(QString("slt_timeout ENTER:%1--state:%2--airPushing:%3")
|
||||
.arg(stateName())
|
||||
.arg(m_sysPara->status.reclaimTankstatus)
|
||||
.arg(m_sysPara->status.airPushing));
|
||||
|
||||
switch (m_sysPara->status.reclaimTankstatus) {
|
||||
case 1: // 开
|
||||
emit sig_enableOpenTank(false);
|
||||
emit sig_enableCloseTank(true);
|
||||
break;
|
||||
case 2: // 关
|
||||
emit sig_enableOpenTank(true);
|
||||
emit sig_enableCloseTank(false);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
break;
|
||||
case 5: // 开完成
|
||||
// emit sig_enableStartPrint(true);
|
||||
// emit sig_enableStopPrint(true);
|
||||
emit sig_enableOpenTank(false);
|
||||
emit sig_enableCloseTank(true);
|
||||
break;
|
||||
case 6: // 6关完成
|
||||
emit sig_enableOpenTank(true);
|
||||
emit sig_enableCloseTank(false);
|
||||
break;
|
||||
case 0x10: // 故障
|
||||
emit sig_enableStartPrint(false);
|
||||
emit sig_enableStopPrint(false);
|
||||
emit sig_enableOpenTank(false);
|
||||
emit sig_enableCloseTank(true);
|
||||
break;
|
||||
case 0x11: // 卡住,关闭
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// STATE
|
||||
switch (m_currentState) {
|
||||
case PrinterState::SELF_CHECK:
|
||||
emit sig_enableStartPrint(false);
|
||||
emit sig_enableStopPrint(false);
|
||||
break;
|
||||
// 需要确认开完成时,状态是否一定是READY,然后避免重复操作 TODO
|
||||
case PrinterState::READY:
|
||||
emit sig_enableStartPrint(true);
|
||||
emit sig_enableStopPrint(true);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// 避免发出太多信号
|
||||
if (m_updateUITimer) m_updateUITimer->stop();
|
||||
}
|
||||
|
||||
@@ -2,12 +2,13 @@
|
||||
#define PRINTERSTATEMANAGER_H
|
||||
|
||||
#include <QObject>
|
||||
#include <QTimer>
|
||||
#include <QVector>
|
||||
#include "SysPara.h"
|
||||
|
||||
enum class PrinterState {
|
||||
IDLE, // 空闲
|
||||
SELF_CHECK, // 自检中
|
||||
SELF_CHECK, // 自检完成
|
||||
READY, // 就绪
|
||||
PRINTING, // 打印中
|
||||
STOPPING, // 停止中
|
||||
@@ -20,6 +21,7 @@ enum class PrinterEvent {
|
||||
PowerOn,
|
||||
SelfCheckDone,
|
||||
SelfCheckFailed,
|
||||
ReSelfCheck,
|
||||
StartPrint,
|
||||
StopPrint,
|
||||
StopComplete,
|
||||
@@ -52,10 +54,21 @@ public:
|
||||
// 外部唯一接口:请求切换状态
|
||||
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();
|
||||
private:
|
||||
PrinterStateManager();
|
||||
~PrinterStateManager();
|
||||
@@ -66,6 +79,9 @@ private:
|
||||
PrinterState m_currentState = PrinterState::IDLE;
|
||||
PrinterState m_previousState = PrinterState::IDLE;
|
||||
|
||||
QTimer* m_updateUITimer = NULL;
|
||||
void initTimer();
|
||||
|
||||
// 状态转移表
|
||||
// 守卫条件函数类型
|
||||
using GuardFunc = std::function<bool()>;
|
||||
@@ -80,6 +96,9 @@ private:
|
||||
|
||||
QVector<Transition> m_transitions;
|
||||
|
||||
// 记录上一次回收槽状态
|
||||
unsigned char lastState = 0;
|
||||
|
||||
void initTransitions();
|
||||
Transition* findTransition(PrinterEvent event);
|
||||
|
||||
@@ -88,7 +107,7 @@ private:
|
||||
|
||||
QString stateNameFromEnum(PrinterState state) const;
|
||||
|
||||
// ============ 守卫条件函数 ============
|
||||
// ============ guard 守卫条件函数 ============
|
||||
// 检查回收槽是否已打开
|
||||
bool guardReclaimTankOpen();
|
||||
|
||||
@@ -110,5 +129,7 @@ private:
|
||||
// 检查是否满足所有打印条件
|
||||
bool guardCanStartPrint();
|
||||
|
||||
private slots:
|
||||
void slt_timeout();
|
||||
};
|
||||
#endif // PRINTERSTATEMANAGER_H
|
||||
|
||||
Reference in New Issue
Block a user