hlp:状态机初版,统一管理回收槽状态,启动和停止打印时的状态

This commit is contained in:
kite_lucs
2026-09-16 16:53:19 +08:00
parent 5a187c359b
commit af37661b74
7 changed files with 373 additions and 416 deletions
+87 -181
View File
@@ -311,7 +311,7 @@ void InkJetPrinter::showEvent(QShowEvent *e)
fpgaReadyTimer = nullptr;
}
else {
qDebug() << "FPGA not connected yet.";
// qDebug() << "FPGA not connected yet.";
}
});
@@ -789,7 +789,7 @@ void InkJetPrinter::timerHandler(void){
checkPressureControl();
if((QTime::currentTime()>=QTime(00,00,00))&&(QTime::currentTime()<=QTime(00,00,02))&&sysPara->para.Reciclar){
if(m_MainWidget->getCurrPrintStatus() != 1){
if(sysPara->status.isPrinting == false){
m_MainWidget->_on_pushButtonPowerOff_pressed(false);
LogInfo::setRunStatusText(tr("定时开机循环完成,准备关机"));
}
@@ -889,29 +889,6 @@ void InkJetPrinter::timerHandler(void){
sysPara->devOp->readFgaStatus();
}
/**************桂澳增加超速提示*****************************/
static int logCtrl = 0;
if((sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER || sysPara->para.eleEyeTriggerSynPrintEn)
&& sysPara->status.lesslen_warn == 1){ //置1表示超速了
if(logCtrl++ % 500 == 0){
// LogInfo::setRunStatusText(tr("速度过快,请检查是否漏喷!!!"));
qDebug()<<"速度过快,请检查是否漏喷!!!";
}
/*if(msgBox1->isHidden()){ //桂澳的超速提示先保留
msgBox1->setText(tr("速度过快,请检查是否漏喷!!!"));
msgBox1->show();
LogInfo::setRunStatusText(tr("速度过快,请检查是否漏喷!!!"));
qDebug()<<"速度过快,请检查是否漏喷!!!";
}*/
sysPara->devOp->controlRedLight(true);
sysPara->devOp->controlGreenLight(false);
}
else{
// if(!msgBox1->isHidden())
// sysPara->devOp->controlRedLight(false);
}
sysPara->status.gearPumpRunSpeed = (PulseCnt * 60 * 1000) / (500 * 2);
if(!sysPara->para.gearPumpEnable)
sysPara->status.PRESSURE *= 5; //响应群众号召,数值放大五倍
@@ -923,7 +900,7 @@ void InkJetPrinter::timerHandler(void){
if(sysPara->status.delay10ms%5 == 0)
{//复位发送打印数据
if((m_MainWidget->getCurrPrintStatus() == 1)&&sysPara->para.ResetSendData)
if(sysPara->status.isPrinting && sysPara->para.ResetSendData)
{
static bool oneTimeFlag = false;
if(sysPara->status.productCnt== 0 && (oneTimeFlag==false))//计米复位发送打印数据
@@ -950,7 +927,6 @@ void InkJetPrinter::timerHandler(void){
lastProductCount = sysPara->status.productCnt;
if(vartypeR != 0){ //更新替换变量的值
// LogInfo::setRunStatusText("vartypeR");
MySleep(100);
m_MainWidget->onPreviewScene();
m_MainWidget->SendPrintDataToFpga(0);
@@ -969,15 +945,6 @@ void InkJetPrinter::timerHandler(void){
}
if (!updateAreas.isEmpty() && m_StackedWidget->currentWidget() == m_MainWidget) {
// // 统计追踪更新频率
// static QElapsedTimer bnsTimer;
// static int toogleCount = 0;
// ++toogleCount;
// if(toogleCount > 10) {
// auto elapsed = bnsTimer.restart();
// qDebug() << (QString("timeHandler avg elapsed: %1 s").arg(elapsed / qreal(toogleCount) / 1000.0));
// toogleCount = 0;
// }
m_MainWidget->updatePrintDisplayLabel();
}
@@ -1032,11 +999,10 @@ void InkJetPrinter::timerHandler(void){
if(sysPara->status.selfCheckCnt >= MAX_SELF_CHECK_CNT)
#endif
{
sysPara->status.selfCheckDone = true;
// 通过状态管理器发送事件,在 onStateChanged 中更新 sysPara
// if (m_stateManager && m_stateManager->isState(PrinterState::SELF_CHECK)) {
// m_stateManager->requestTransition(PrinterEvent::SelfCheckDone);
// }
if (m_stateManager && m_stateManager->isState(PrinterState::IDLE)) {
m_stateManager->requestTransition(PrinterEvent::PowerOn);
}
// 自检完成后管道恢复正常阻力,重置软启动让压力重新平稳收敛
// 不清零 u,从当前控制字开始,避免突变
@@ -1049,29 +1015,15 @@ void InkJetPrinter::timerHandler(void){
for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0;
m_bufIdx = 0;
m_MainWidget->setReclaimOpenBtnStatus(true);
m_MainWidget->setReclaimCloseBtnStatus(false);
sysPara->devOp->mainInkCtrl();
sysPara->status.canRunAirPushing = true;
// 自检完成后,关闭高电压,不知道为什么,有时候开机自检都有高压
sysPara->devOp->highVoltageCtrl(0);
m_MainWidget->on_m_StopBtn_clicked();
LogInfo::setRunStatusText(tr("自检完成!!!"));
m_MainWidget->setRunStatus(tr("自检完成!!!"));
qDebug()<<"自检完成!!!";
if(sysPara->para.Reciclar)
test_flag = 1;
}
else {
if((sysPara->status.selfCheckCnt % 200) == 0)
m_MainWidget->setReclaimOpenBtnStatus(false);
m_MainWidget->setReclaimCloseBtnStatus(false);
}
}
else{
@@ -1228,6 +1180,9 @@ void InkJetPrinter::timerHandler(void){
if(pulse_100ms && sysPara->status.selfCheckDone){
detectAndcontrolReclaimTank(); //控制回收槽
if (m_stateManager) {
m_stateManager->checkReadyState();
}
}
/*---------------------------------处理警告--------------------------------------------*/
@@ -1838,63 +1793,69 @@ void InkJetPrinter::initStateManager()
m_stateManager = PrinterStateManager::instance();
// 连接状态变化信号 DirectConnection:确保相关状态实时更新
// connect(m_stateManager, &PrinterStateManager::sig_stateChanged,
// this, &InkJetPrinter::slt_stateChanged, Qt::DirectConnection);
connect(m_stateManager, &PrinterStateManager::sig_stateChanged,
this, &InkJetPrinter::slt_stateChanged, Qt::DirectConnection);
// 使能开始打印、停止打印、开回收槽、关回收槽按钮
connect(m_stateManager, &PrinterStateManager::sig_enableStartPrint,
this, &InkJetPrinter::slt_enableStartPrint, Qt::DirectConnection);
connect(m_stateManager, &PrinterStateManager::sig_enableStopPrint,
this, &InkJetPrinter::slt_enableStopPrint, Qt::DirectConnection);
connect(m_stateManager, &PrinterStateManager::sig_enableOpenTank,
this, &InkJetPrinter::slt_enableOpenTank, Qt::DirectConnection);
connect(m_stateManager, &PrinterStateManager::sig_enableCloseTank,
this, &InkJetPrinter::slt_enableCloseTank, Qt::DirectConnection);
// 更新回收槽状态
connect(m_stateManager, &PrinterStateManager::sig_updateReclaimStatus,
this, [=](){m_MainWidget->updateReclaimStatus();});
// ============ 开机时重置状态 ============
m_stateManager->initFromSysPara();
sysPara->status.selfCheckDone = false; // 自检是否完成
sysPara->status.isPrinting = false; // 是否正在打印
sysPara->status.powerOffAppending = false; // 是否正在关机
// 发送 PowerOn 事件进入自检状态
// if (!sysPara->status.selfCheckDone) {
// m_stateManager->requestTransition(PrinterEvent::PowerOn);
// }
// initStateTimer();
}
void InkJetPrinter::initStateTimer()
{
// ============ 测试定时器 ============
m_testTimer = new QTimer(this);
connect(m_testTimer, &QTimer::timeout, this, &InkJetPrinter::slt_stateTest);
m_testTimer->start(3000); // 3秒切换一次
sysPara->status.powerOffAppending = false; // 是否正在关机
m_stateManager->bindSysPara(sysPara);
}
void InkJetPrinter::handleSelfCheck()
{
sysPara->status.selfCheckDone = false;
sysPara->status.selfCheckCnt = 0;
m_MainWidget->enablePrintButton(false);
// 自检完成,非打印状态,回收槽放下后使能打印按钮
if (!sysPara->status.selfCheckDone) {
sysPara->status.selfCheckDone = true;
LogInfo::setRunStatusText(tr("自检完成!!!"));
m_MainWidget->setRunStatus(tr("自检完成!!!"));
}
}
void InkJetPrinter::handleReady()
{
// 自检完成,非打印状态,回收槽放下后使能打印按钮
sysPara->status.selfCheckDone = true;
sysPara->status.isPrinting = false;
if(sysPara->status.reclaimTankstatus == 5) {
m_MainWidget->enablePrintButton(true);
} else {
m_MainWidget->enablePrintButton(false);
}
// MySleep(50);
// m_MainWidget->updateReclaimStatus();
}
void InkJetPrinter::handleStartPrint()
{
sysPara->status.isPrinting = true;
sysPara->status.waitHightVolOff = 0;
sysPara->status.lastSynColDelay = -1; //目的是为了清空原来的数据
sysPara->devOp->highVoltageCtrl(1);
sysPara->devOp->setHighVoltageAmplitudetoSTM32();
sysPara->status.waitHightVolOff = 0;
sysPara->devOp->printCtrl(PRINT_CTRL_START);
// MySleep(50);
// m_MainWidget->updateReclaimStatus();
}
void InkJetPrinter::handleStopPrint()
{
sysPara->status.isPrinting = false;
// LogInfo::setRunStatusText("Stop print...");
sysPara->devOp->printCtrl2(1);
sysPara->devOp->printCtrl( PRINT_CTRL_STOP);
sysPara->status.waitHightVolOff = 1;
sysPara->saveParaToFile(); // 将相关配置保存
// 停止完毕后再进入就绪状态,允许开始打印
m_stateManager->requestTransition(PrinterEvent::StopComplete);
// MySleep(50);
// m_MainWidget->updateReclaimStatus();
}
void InkJetPrinter::handlePowerOff()
@@ -1903,101 +1864,40 @@ void InkJetPrinter::handlePowerOff()
m_MainWidget->checkForPowerOff();
}
void InkJetPrinter::slt_stateTest()
{
if (!m_stateManager) return;
PrinterState currentState = m_stateManager->currentState();
qDebug() << "=== Test Step:" << m_testStep << "Current:" << m_stateManager->stateName();
// 根据当前状态发送不同的事件
switch (currentState) {
case PrinterState::IDLE:
// IDLE → SELF_CHECK
qDebug() << "▶ Send: PowerOn";
m_stateManager->requestTransition(PrinterEvent::PowerOn);
break;
case PrinterState::SELF_CHECK:
// SELF_CHECK → READY
qDebug() << "▶ Send: SelfCheckDone";
m_stateManager->requestTransition(PrinterEvent::SelfCheckDone);
break;
case PrinterState::READY:
// READY → PRINTING
qDebug() << "▶ Send: StartPrint";
m_stateManager->requestTransition(PrinterEvent::StartPrint);
break;
case PrinterState::PRINTING:
// PRINTING → STOPPING → READY(两步完成)
if (m_testStep % 2 == 0) {
qDebug() << "▶ Send: StopPrint";
m_stateManager->requestTransition(PrinterEvent::StopPrint);
} else {
qDebug() << "▶ Send: StopComplete";
m_stateManager->requestTransition(PrinterEvent::StopComplete);
}
break;
case PrinterState::STOPPING:
// STOPPING → READY
qDebug() << "▶ Send: StopComplete";
m_stateManager->requestTransition(PrinterEvent::StopComplete);
break;
case PrinterState::ERROR:
// ERROR → READY
qDebug() << "▶ Send: ErrorCleared";
m_stateManager->requestTransition(PrinterEvent::ErrorCleared);
break;
case PrinterState::POWER_OFF:
// POWER_OFF → IDLE
qDebug() << "▶ Send: PowerOffDone";
m_stateManager->requestTransition(PrinterEvent::PowerOffDone);
break;
default:
break;
}
m_testStep++;
}
// ============ 状态机槽函数 ============
void InkJetPrinter::slt_stateChanged(PrinterState newState, PrinterState oldState, QString reason)
{
qDebug() << "State:" << m_stateManager->stateName() << "Reason:" << reason;
Q_UNUSED(oldState)
LogInfo::setRunStatusText(reason);
// ============ 统一更新 sysPara 状态 ============
switch (newState) {
case PrinterState::SELF_CHECK:
// 进入自检状态
// 进入自检完成状态
handleSelfCheck();
LogInfo::setRunStatusText("SELF_CHECK_DONE");
break;
case PrinterState::READY:
// 进入就绪状态
handleReady();
LogInfo::setRunStatusText("READY");
break;
case PrinterState::PRINTING:
// 进入打印状态
handleStartPrint();
LogInfo::setRunStatusText("PRINTING");
break;
case PrinterState::STOPPING:
// 进入停止状态
handleStopPrint();
LogInfo::setRunStatusText("STOPPING");
break;
case PrinterState::ERROR:
// 进入故障状态
// m_MainWidget->setRunStatus("故障!请检查");
// m_MainWidget->enablePrintButton(false);
break;
case PrinterState::POWER_OFF:
@@ -2008,9 +1908,27 @@ void InkJetPrinter::slt_stateChanged(PrinterState newState, PrinterState oldStat
default:
break;
}
}
// 保存参数
//sysPara->saveParaToFile();
void InkJetPrinter::slt_enableStartPrint(bool able)
{
m_MainWidget->enabeleStartBtn(able);
}
void InkJetPrinter::slt_enableStopPrint(bool able)
{
m_MainWidget->enabeleStopBtn(able);
}
// 排气过程中不使能
void InkJetPrinter::slt_enableOpenTank(bool able)
{
m_MainWidget->setReclaimOpenBtnStatus(able);
}
void InkJetPrinter::slt_enableCloseTank(bool able)
{
m_MainWidget->setReclaimCloseBtnStatus(able);
}
/*************************FPGA通过串口读取状态赋值给status-start******************************************/
@@ -2768,60 +2686,47 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){
if(sysPara->devOp->isReclaimTankOpenEnable())
sysPara->devOp->controlReclaimTankOpen(false); //到头,关闭
sysPara->status.reclainTankReachEnd = true;
m_MainWidget->setRunStatus(tr("回收槽到头"));
m_MainWidget->setReclaimStatus(true, 100);
m_MainWidget->enablePrintButton(true); //仅仅在此时能使能打印按钮
sysPara->devOp->highVoltageCtrl(0);
m_MainWidget->setRunStatus(tr("回收槽到头"));
sysPara->devOp->highVoltageCtrl(0);
m_MainWidget->stopFlashReclaimOpenBtn();
m_MainWidget->stopFlashReclaimOpenBtn();
// emit reclaimTankOpenDone();
/*回收槽开关时间校正*/
sysPara->para.reclaimTankTime =( sysPara->status.currReclaimTankPos>120 )? sysPara->status.currReclaimTankPos/10-1:12;
m_SystemSetting->updateReclaimTime( sysPara->para.reclaimTankTime );
/*回收槽开关时间校正*/
sysPara->para.reclaimTankTime =( sysPara->status.currReclaimTankPos>120 )? sysPara->status.currReclaimTankPos/10-1:12;
m_SystemSetting->updateReclaimTime( sysPara->para.reclaimTankTime );
qDebug()<<"reclaimTankOpenDone currReclaimTankPos:"<<sysPara->status.currReclaimTankPos;
qDebug()<<"reclaimTankOpenDone curr_reclaimTankTime:"<<sysPara->status.curr_reclaimTankTime;
LogInfo::setRunStatusText("reclaimTankOpenDone currReclaimTankPos:"+QString::number(sysPara->status.currReclaimTankPos));
LogInfo::setRunStatusText("reclaimTankOpenDone currReclaimTankPos:"+QString::number(sysPara->status.currReclaimTankPos));
}
else if(sysPara->status.reclaimTankstatus == 0x11 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作
{
sysPara->devOp->controlReclaimTankOpen(false); //卡住,关闭
m_MainWidget->stopFlashReclaimOpenBtn();
// ui->tabMainWindow->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误"));
// ui->tabMainWindow->setRunStatus(tr("回收槽卡住或者回收槽开关时间设置错误"));
}
else if(sysPara->status.reclaimTankstatus == 1 || sysPara->status.reclaimTankstatus == 2)//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作
{
auto recliamTime = (sysPara->para.reclaimTankTime != 0 ? sysPara->para.reclaimTankTime : 15.0f) * 10.0f;
int rate = qBound(0, 100, int((sysPara->status.currReclaimTankPos / recliamTime) * 100));
// auto recliamTime = (sysPara->para.reclaimTankTime != 0 ? sysPara->para.reclaimTankTime : 15.0f) * 10.0f;
// int rate = qBound(0, 100, int((sysPara->status.currReclaimTankPos / recliamTime) * 100));
// 不知道为什么会有rate为0,且 sysPara->status.reclaimTankstatus == 2 ,也就是 关的状态。 回收槽位置在0处,而状态却是 关 ,很奇怪
if(sysPara->status.reclaimTankstatus != 2 && rate != 0) {
m_MainWidget->setReclaimStatus(sysPara->status.reclaimTankstatus == 1, rate);
if(sysPara->status.reclaimTankstatus != 2) {
#ifdef BNS_DEBUG
#ifdef BNS_DEBUG
if(rate == 100) {
m_MainWidget->enablePrintButton(true);
m_MainWidget->stopFlashReclaimOpenBtn();
sysPara->status.reclaimTankstatus = 5;
}
#endif
#endif
}
m_MainWidget->setReclaimOpenBtnStatus(sysPara->status.reclaimTankstatus == 2);
m_MainWidget->setReclaimCloseBtnStatus(sysPara->status.reclaimTankstatus == 1);
sysPara->status.reclaimBlockedCnt = 0;
}
else if(sysPara->status.reclaimTankstatus == 6 )//7 故障,6 关完成,5开完成,4 保持, 3 停止, 2 关, 1 开,0-无操作
{
if(sysPara->devOp->isReclaimTankCloseEnable())
sysPara->devOp->controlReclaimTankClose(false); //到头,关闭
m_MainWidget->setReclaimStatus(false, 0);
m_MainWidget->stopFlashReclaimOpenBtn();
//sysPara->status.currReclaimTankPos = 0; //将回收槽的时间置为零
// emit reclaimTankCloseDone();
sysPara->status.lastRecycleWarn = 0;
sysPara->status.HVFaultCloseEn=0;
sysPara->status.reclainCloseAppending=false;
@@ -2839,6 +2744,7 @@ void InkJetPrinter::detectAndcontrolReclaimTank(){
m_MainWidget->setReclaimCloseBtnStatus(true);
LogInfo::setRunStatusText("Reclaim tank hold on "+QString::number(sysPara->status.currReclaimTankPos));
}
}
void InkJetPrinter::viscosity_timerHandler()