From 351bdf81f9b73ff9599bdf69368dfe816d11bfbc Mon Sep 17 00:00:00 2001 From: Byons Date: Mon, 3 Aug 2026 17:35:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=80=E6=9C=BA=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E5=A2=A8=E6=B0=B4=E4=B9=9F=E8=BF=9B=E8=87=AA=E6=A3=80?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B=E4=B8=BA=E7=8A=B6=E6=80=81?= =?UTF-8?q?label=E6=B7=BB=E5=8A=A0=E9=95=BF=E6=96=87=E6=9C=AC=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InkJetPrinter.cpp | 140 +++++++++++++++++++++++++++++--------------- InkJetPrinter.h | 11 ++++ Log/logger.cpp | 4 +- MainInstruction.cpp | 3 + mainwidget.cpp | 110 +++++++++++++++++++++++++++++++++- mainwidget.h | 22 +++++-- 6 files changed, 236 insertions(+), 54 deletions(-) diff --git a/InkJetPrinter.cpp b/InkJetPrinter.cpp index 64606ff..eab4edc 100644 --- a/InkJetPrinter.cpp +++ b/InkJetPrinter.cpp @@ -271,6 +271,8 @@ void InkJetPrinter::init() sysPara->status.machineMac = m_MainInstruction->dlgInputAddr->jd.addr; sysPara->para.rfidCountDown = 5; + connect(this, &InkJetPrinter::pipingStatusChanged, this, &InkJetPrinter::checkStatusAndStartGearPump, Qt::QueuedConnection); + timer = new QTimer(); connect(timer, SIGNAL(timeout()), this, SLOT(timerHandler())); timer->start(10); @@ -634,9 +636,7 @@ void InkJetPrinter::timerHandler(void){ static int tempFlag=0; static int save_weeknum = 0; - static bool gearPumpRunFlag = false; static bool ControledSwitchFlag = false; - static bool gearPumpStartFlag = false; static bool delay3s; bool InkSwintFlag = false,lastInkSwintFlag = false; static float gearPumpRunNormalValue = 0.0; @@ -689,22 +689,30 @@ void InkJetPrinter::timerHandler(void){ pulse_300ms = (sysPara->status.delay100ms%3) == 0; //1秒3次,并非精确的300ms pulse_200ms = (sysPara->status.delay100ms%2) == 0; } - if(pulse_300ms) tempFlag=1; - if((sysPara->status.delay10ms%3) == 0) //读取状态后再检測 - { - if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒 - { - if(sysPara->para.gearPumpEnable) { - // 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速 - if(sysPara->para.gearPumpValue != 0) { - sysPara->para.gearPumpValue = 0; - u = 0.0f; - sysPara->devOp->WriteMoterPump(); - } - gearPumpStartFlag = true; - } - } - } + + // static QElapsedTimer *timer_3s_elapsed = nullptr; + // if(timer_3s_elapsed == nullptr) { + // timer_3s_elapsed = new QElapsedTimer(); + // timer_3s_elapsed->start(); + // } + + // if(timer_3s_elapsed->elapsed() >= 3000) //读取状态后再检測 + // { + // if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) && !gearPumpRunFlag && !sysPara->status.isPumpValveControledByHand)//刚启动前3秒 + // { + // if(sysPara->para.gearPumpEnable) { + // // 确保开机时控制字从 0 开始,让 pressureAdj 软启动从 0 爬坡,避免突变到高转速 + // if(sysPara->para.gearPumpValue != 0) { + // sysPara->para.gearPumpValue = 0; + // u = 0.0f; + // sysPara->devOp->WriteMoterPump(); + // } + // gearPumpStartFlag = true; + // } + // } + + // timer_3s_elapsed->restart(); + // } if(pushButtonStartFlag && sysPara->status.selfCheckDone) { @@ -765,10 +773,10 @@ void InkJetPrinter::timerHandler(void){ if(count_3s == 3) { count_3s = 0; -// ui->tabMainWindow->setRunStatus(tr("压力泄漏或压力传感器故障!")); + m_MainWidget->setRunStatus(tr("压力泄漏或压力传感器故障!")); sysPara->status.gearPumpRunStopFlag = true; gearPumpRunNormalFlag = false; -// LogInfo::setRunStatusText(tr("运行中压力泄漏,停齿轮泵!")); + LogInfo::setRunStatusText(tr("运行中压力泄漏,停齿轮泵!")); } } } @@ -779,23 +787,10 @@ void InkJetPrinter::timerHandler(void){ } if(sysPara->para.gearPumpEnable && (sysPara->status.gearPumpRunSpeed < 100) && test_flag){ if(test_flag % 2) -// ui->tabMainWindow->on_pushButtonReclaimTankClose_pressed(); + m_MainWidget->on_m_LeftBtn_clicked(); test_flag = 0; } if(pulse_1s) { - // 回收泵模式切换时重置软启动和泄漏保护学习状态 - if(m_lastReclaimMode != sysPara->para.flagOfReclaimPumEnable) - { - m_lastReclaimMode = sysPara->para.flagOfReclaimPumEnable; - gearPumpRunNormalFlag = false; - gearPumpRunNormalValue = 0.0f; - m_rampDone = false; - m_adjSkip = 0; - m_lastPressure = 0; - m_stableCount = 0; - for(int i = 0; i < 10; i++) m_pressureBuf[i] = 0; - m_bufIdx = 0; - } if(sysPara->status.selfCheckDone && sysPara->para.gearPumpEnable && sysPara->para.flagOfReclaimPumEnable) checkPressureControl(); if((QTime::currentTime()>=QTime(00,00,00))&&(QTime::currentTime()<=QTime(00,00,02))&&sysPara->para.Reciclar){ @@ -842,7 +837,7 @@ void InkJetPrinter::timerHandler(void){ if(gearPumpStartFlag) { pulse_3s ++; - if(pulse_3s == 3) + if(pulse_3s == 6) { pulse_3s = 0; gearPumpRunFlag = true; @@ -1087,16 +1082,21 @@ void InkJetPrinter::timerHandler(void){ if (!sysPara->status.airPushing || m_MainWidget->m_2sFlag) { autoControlValvePump(); } - static qint32 adjDbgCnt = 0; - if(pulse_100ms && ++adjDbgCnt % 50 == 0){ - // 调整压力算法时用这个追踪 - // qDebug()<<"[adjCond] gearPumpEnable="<para.gearPumpEnable - // <<" isPumpValveControledByHand="<status.isPumpValveControledByHand - // <<" ControledSwitchFlag="<setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); } // ui->tabMainWindow->setRunStatus(tr("缺少墨水,喷码机不能正常工作!")); } @@ -1437,6 +1438,46 @@ void InkJetPrinter::timerHandler(void){ } +void InkJetPrinter::checkStatusAndStartGearPump() +{ + // 使用 QElapsedTimer 去抖:要求条件连续保持 >= 2000ms + if(!sysPara) + return; + + bool cond = !(sysPara->status.statWarn & WARN_STATUS_INK_WARN) + && !gearPumpRunFlag + && !sysPara->status.isPumpValveControledByHand + && sysPara->para.gearPumpEnable; + + if (cond) { + // 若尚未开始计时,启动计时 + if (!m_pipingClearSince.isValid()) { + m_pipingClearSince.start(); + return; + } + + // 若计时已到达阈值,再次确认条件并执行启动动作 + if (m_pipingClearSince.elapsed() >= 2000) { + if (!(sysPara->status.statWarn & WARN_STATUS_INK_WARN) + && !gearPumpRunFlag + && !sysPara->status.isPumpValveControledByHand) { + if (sysPara->para.gearPumpValue != 0) { + sysPara->para.gearPumpValue = 0; + u = 0.0f; + sysPara->devOp->WriteMoterPump(); + } + gearPumpStartFlag = true; // 设置标记位,让 timerHandler 启动齿轮泵 + } + m_pipingClearSince.invalidate(); + } + } else { + // 条件不满足,取消计时 + if (m_pipingClearSince.isValid()) + m_pipingClearSince.invalidate(); + } +} + + // 以下槽函数逻辑完全不变 void InkJetPrinter::getTestPrintWidgetButtonClickedSlot(int index) { @@ -1905,6 +1946,9 @@ void InkJetPrinter::saveSTM32Status(unsigned char *data){ else target[i]=data[4+i]; } + // Always emit pipingStatusChanged so checkStatusAndStartGearPump can perform debounce + emit pipingStatusChanged(); + // emit showReclaimTankstatus(sysPara->status.reclaimTankstatus); // emit showMotorIsen(sysPara->status.MOTOR_ISEN,sysPara->status.AD_FIXED); } @@ -2825,8 +2869,7 @@ void InkJetPrinter::warningHandler(int type){ if (dateTimeDiff > 60*60*24*2) { sysPara->RFIDPara.inkCardTimeOut = true; } - if (!sysPara->RFIDPara.inkCardTimeOut) - inkTime = 48- dateTimeDiff/60/60; + inkTime = sysPara->RFIDPara.inkCardTimeOut ? 49 : (48 - dateTimeDiff/60/60); } if(sysPara->RFIDPara.inkCardTimeOut && flagOfWarning){ if(++sysPara->status.showInkWarningNumber >= INTERVAL_AFTER48H){ @@ -3082,6 +3125,9 @@ void InkJetPrinter::handleWarnInk() } if(sysPara->status.inkWarningCnt >= DETECT_WARNING_TIME){ + + // TO RFIDManager + sysPara->para.flagOfInkWarning = true; manager_rfid->setInkCardFirstPrompt(true); QString strCurDateTime = QDateTime::currentDateTime().toString("yyMMddhhmmss"); diff --git a/InkJetPrinter.h b/InkJetPrinter.h index f2efb8c..301525d 100644 --- a/InkJetPrinter.h +++ b/InkJetPrinter.h @@ -30,6 +30,8 @@ #include "DateVarSet.h" #include "CounterVarSet.h" +#include + #include "QBarCode.h" #include "dlgQrCode.h" @@ -220,11 +222,14 @@ private slots: // 保养警告 void slt_warningMaintenance(); + + void checkStatusAndStartGearPump(); signals: void maintenanceShow(); void printStatusChanged(bool isPrinting); + void pipingStatusChanged(); protected: void showEvent(QShowEvent* e) override; @@ -255,4 +260,10 @@ private: int m_bufIdx = 0; // pressureAdj 滑动平均写入索引 bool m_lastByHand = false; // 上一帧手动控制标志(边沿检测用) bool m_lastReclaimMode = false; // 上一帧回收泵模式(边沿检测用) + + // 去抖(管路/墨水警告清除)——使用 QElapsedTimer 实现连续 2s 无警告判断 + QElapsedTimer m_pipingClearSince; + + bool gearPumpRunFlag = false; + bool gearPumpStartFlag = false; }; diff --git a/Log/logger.cpp b/Log/logger.cpp index 37d3a1f..c2578aa 100644 --- a/Log/logger.cpp +++ b/Log/logger.cpp @@ -203,9 +203,9 @@ void Logger::log(const QtMsgType type, const QString& message, const QString &fi LogMessage* logMessage=new LogMessage(type,message,logVars.localData(),file,function,line); - #ifndef BNS_DEBUG + // #ifndef BNS_DEBUG std::cout << qPrintable(logMessage->toString(msgFormat,"hh:mm:ss.zzz")) << std::flush; - #endif + // #endif if (bufferSize>0) { diff --git a/MainInstruction.cpp b/MainInstruction.cpp index bbd6205..deea59e 100644 --- a/MainInstruction.cpp +++ b/MainInstruction.cpp @@ -153,6 +153,8 @@ void MainInstruction::ondialogAuthorizationAccepted(){ sysPara->RFIDPara.inkCardTimeOut = false; sysPara->RFIDPara.solventCardTimeOut = false; sysPara->RFIDPara.needMaintenance = false; + sysPara->RFIDPara.needInkCard = false; + sysPara->RFIDPara.needSolventCard = false; QDate curDate = QDate::currentDate(); int curdate = curDate.toString("yyMMdd").toInt(); sysPara->RFIDPara.maintenanceDate = curdate; // 维护日期 @@ -163,6 +165,7 @@ void MainInstruction::ondialogAuthorizationAccepted(){ sysPara->para.solventWarnDate = 0; sysPara->para.solventWarnTime = 0; sysPara->saveParaToFile(); + sysPara->saveRFIDPara(); #endif } else if( dlgInputAddr->checkSupperJm(authString)) diff --git a/mainwidget.cpp b/mainwidget.cpp index 182d72c..ca3d959 100644 --- a/mainwidget.cpp +++ b/mainwidget.cpp @@ -34,6 +34,8 @@ #include "scene/PicCounterItem.h" #include #include +#include +#include extern MyInputMethod *myInputMethod; unsigned char test_flag,open_close; @@ -102,6 +104,15 @@ MainWidget::MainWidget(QWidget* parent) m_reclaimOpenBtnFlashTimer = new QTimer(this); connect(m_reclaimOpenBtnFlashTimer, &QTimer::timeout, this, &MainWidget::onReclaimOpenBtnFlashTimerTimeout); m_reclaimOpenBtnFlashTimer->setInterval(500); + + m_nozzleStateMarqueeTimer = new QTimer(this); + m_nozzleStateMarqueeTimer->setInterval(30); + connect(m_nozzleStateMarqueeTimer, &QTimer::timeout, this, &MainWidget::onNozzleStateMarqueeTimeout); + + if (ui.lb_nozzleState) { + ui.lb_nozzleState->installEventFilter(this); + ui.lb_nozzleState->setText(" "); + } } MainWidget::~MainWidget() @@ -391,7 +402,104 @@ void MainWidget::setRunStatus(QString str) return; } - ui.lb_nozzleState->setText(str); + updateNozzleStateMarquee(str); +} + +void MainWidget::stopNozzleStateMarquee() +{ + if (m_nozzleStateMarqueeTimer && m_nozzleStateMarqueeTimer->isActive()) { + m_nozzleStateMarqueeTimer->stop(); + } + m_nozzleStateFullText.clear(); + m_nozzleStateMarqueeOffsetPx = 0; + m_nozzleStateMarqueeTextWidth = 0; + m_nozzleStateMarqueeGapPx = 0; + m_nozzleStateMarqueeEnabled = false; + if (ui.lb_nozzleState) { + ui.lb_nozzleState->setText(QString()); + ui.lb_nozzleState->update(); + } +} + +void MainWidget::updateNozzleStateMarquee(const QString& str) +{ + if (!ui.lb_nozzleState) + return; + + QString text = str; + if (text.isEmpty()) { + stopNozzleStateMarquee(); + ui.lb_nozzleState->setText(text); + return; + } + + QFontMetrics fm(ui.lb_nozzleState->font()); + const int labelWidth = ui.lb_nozzleState->contentsRect().width(); + if (labelWidth <= 0 || fm.horizontalAdvance(text) <= labelWidth) { + stopNozzleStateMarquee(); + ui.lb_nozzleState->setText(text); + return; + } + + // 长文本循环滚动,按像素偏移绘制 + m_nozzleStateFullText = text; + m_nozzleStateMarqueeTextWidth = fm.horizontalAdvance(text); + m_nozzleStateMarqueeGapPx = qMax(20, labelWidth / 2); + m_nozzleStateMarqueeOffsetPx = 0; + m_nozzleStateMarqueeEnabled = true; + ui.lb_nozzleState->setText(QString()); + ui.lb_nozzleState->update(); + + if (!m_nozzleStateMarqueeTimer->isActive()) { + m_nozzleStateMarqueeTimer->start(); + } +} + +void MainWidget::onNozzleStateMarqueeTimeout() +{ + if (!m_nozzleStateMarqueeEnabled || !ui.lb_nozzleState) { + return; + } + + const int labelWidth = ui.lb_nozzleState->contentsRect().width(); + if (labelWidth <= 0 || m_nozzleStateMarqueeTextWidth <= 0) { + stopNozzleStateMarquee(); + return; + } + + const int totalWidth = m_nozzleStateMarqueeTextWidth + m_nozzleStateMarqueeGapPx; + m_nozzleStateMarqueeOffsetPx += 1; + if (m_nozzleStateMarqueeOffsetPx >= totalWidth) { + m_nozzleStateMarqueeOffsetPx = 0; + } + + ui.lb_nozzleState->update(); +} + +bool MainWidget::eventFilter(QObject *watched, QEvent *event) +{ + if (watched == ui.lb_nozzleState && m_nozzleStateMarqueeEnabled) { + if (event->type() == QEvent::Paint) { + QPainter painter(ui.lb_nozzleState); + painter.setRenderHint(QPainter::TextAntialiasing, true); + + const QRect rect = ui.lb_nozzleState->contentsRect(); + painter.fillRect(rect, ui.lb_nozzleState->palette().window()); + painter.setPen(ui.lb_nozzleState->palette().color(QPalette::WindowText)); + painter.setFont(ui.lb_nozzleState->font()); + + const QFontMetrics fm(ui.lb_nozzleState->font()); + const int baseline = (rect.height() + fm.ascent() - fm.descent()) / 2; + const int startX = rect.left() - m_nozzleStateMarqueeOffsetPx; + const int textY = rect.top() + baseline; + + painter.drawText(startX, textY, m_nozzleStateFullText); + painter.drawText(startX + m_nozzleStateMarqueeTextWidth + m_nozzleStateMarqueeGapPx, textY, m_nozzleStateFullText); + return true; + } + } + + return QWidget::eventFilter(watched, event); } /* 生成字模数据 */ diff --git a/mainwidget.h b/mainwidget.h index b197a5a..4c05937 100644 --- a/mainwidget.h +++ b/mainwidget.h @@ -187,6 +187,11 @@ public slots: void onLabelFaultRusumePressed(); void UpdateUIVersion(); + + void on_m_RightBtn_clicked(); + + void on_m_LeftBtn_clicked(); + private: void init(); // void SendPrintDataToFpga(unsigned char); @@ -194,20 +199,27 @@ private: void initSheet(); + void updateNozzleStateMarquee(const QString& str); + void stopNozzleStateMarquee(); + bool eventFilter(QObject *watched, QEvent *event) override; + bool m_reclaimFlashState = false; QTimer* m_reclaimOpenBtnFlashTimer = nullptr; + QTimer* m_nozzleStateMarqueeTimer = nullptr; + QString m_nozzleStateFullText; + int m_nozzleStateMarqueeOffsetPx = 0; + int m_nozzleStateMarqueeTextWidth = 0; + int m_nozzleStateMarqueeGapPx = 0; + bool m_nozzleStateMarqueeEnabled = false; + // 高亮切换 void changeHighLight(bool isStart); private slots: void airPushingProcess(); void buttonClickedSlot(); - void on_m_RightBtn_clicked(); - - void on_m_LeftBtn_clicked(); - void on_m_ManageBtn_clicked(); void slt_setNum(); @@ -216,6 +228,8 @@ private slots: void onReclaimOpenBtnFlashTimerTimeout(); + void onNozzleStateMarqueeTimeout(); + signals: void sendButtonClickedSignal(int index); void setDisableAll();