#include "mainwidget.h" #include #include #include #include "Public.h" #include #include #include #include #include #include #include #include #include #include #include "DevOp.h" #include "Public.h" #include "scene/picscene.h" #include #include "MyInputMethod.h" #include #include #include #include #include "VerBVersion.h" #include #include #include "scene/PicDateItem.h" #include "scene/PicScheduleShiftItem.h" #include "scene/piccodeitem.h" #include #include extern MyInputMethod *myInputMethod; unsigned char test_flag,open_close; #pragma execution_character_set("utf-8") MainWidget::MainWidget(QWidget* parent) : QWidget(parent) { // 加载UI文件 ui.setupUi(this); if (sysPara == nullptr) { sysPara = SysPara::ins(); } // 关联成员变量到UI控件 m_EditBtn = ui.m_EditBtn; m_AddBtn = ui.m_AddBtn; m_MainBtn = ui.m_MainBtn; m_ManageBtn = ui.m_ManageBtn; m_MsgBtn = ui.m_MsgBtn; // m_TextEdit = ui.m_TextEdit; m_PrintDisplay = ui.widgetPrintTextDisplay; m_CloseBtn = ui.m_CloseBtn; m_StopBtn = ui.m_StopBtn; m_StartBtn = ui.m_StartBtn; // m_ToolBtn = ui.m_ToolBtn; m_RightBtn = ui.m_RightBtn; m_LeftBtn = ui.m_LeftBtn; m_PrintDisplay->update(); pushButtonFlag = true; m_2sFlag = false; // 初始化信号槽连接 init(); m_fileManageWidget = new FileManageWidget(); // ui.labelRunStatus->setWordWrap(true); ui.sub3->installEventFilter(this); ui.fra_state->installEventFilter(this); ui.labelTotalProductCnt->hide(); ui.lb_counter->hide(); changeHighLight(false); enablePrintButton(false); QWidget* viewport = ui.scrollArea->viewport(); // 捕获鼠标左键拖动手势(桌面端) QScroller::grabGesture(viewport, QScroller::LeftMouseButtonGesture); // 如需同时支持触摸屏,可加上触屏手势 QScroller::grabGesture(viewport, QScroller::TouchGesture); QScroller* scroller = QScroller::scroller(viewport); QScrollerProperties properties = scroller->scrollerProperties(); // 启用惯性滚动 properties.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.7); // 防止过小的移动被误判为拖拽 properties.setScrollMetric(QScrollerProperties::DragStartDistance, 0.002); scroller->setScrollerProperties(properties); scroller->grabGesture(ui.scrollArea->viewport(), QScroller::LeftMouseButtonGesture); } MainWidget::~MainWidget() { delete m_fileManageWidget; } void MainWidget::init() { airPushTimer = new QTimer(this); connect(airPushTimer, SIGNAL(timeout()), this, SLOT(airPushingProcess())); timerPowerOff = new QTimer(this); connect(timerPowerOff,SIGNAL(timeout()),this,SLOT(sendPowerOffCmd())); // 信号槽连接 connect(m_EditBtn, &QPushButton::clicked, this, &MainWidget::buttonClickedSlot); connect(m_AddBtn, &QPushButton::clicked, this, &MainWidget::buttonClickedSlot); connect(m_CloseBtn, &QPushButton::clicked, this, &MainWidget::buttonClickedSlot); connect(m_MainBtn,&QPushButton::clicked,this,&MainWidget::buttonClickedSlot); connect(m_MsgBtn,&QPushButton::clicked,this,&MainWidget::buttonClickedSlot); if (!m_setNumDlg){ m_setNumDlg = new SetNumDlg(this); } connect(m_setNumDlg, &SetNumDlg::sig_setNum, this, &MainWidget::slt_setNum); } void MainWidget::buttonClickedSlot() { QPushButton* btn = qobject_cast(sender()); if (btn == m_EditBtn) { emit sendButtonClickedSignal(1); } else if (btn == m_AddBtn) { emit sendButtonClickedSignal(2); } else if (btn == m_CloseBtn) { // emit sendButtonClickedSignal(3); _on_pushButtonPowerOff_pressed(true); } else if(btn == m_MainBtn){ emit sendButtonClickedSignal(4); } else if(btn == m_MsgBtn){ emit sendButtonClickedSignal(5); } } QStringList stringListRecive; void MySleep(unsigned int msec); void MySleep(unsigned int msec) { QTime dieTime = QTime::currentTime().addMSecs(msec); while( QTime::currentTime() < dieTime ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } void MainWidget::bindTxTEdit(QTextEdit* textEdit){ m_textEdit = textEdit; } void MainWidget::bindPicScene(PicScene* pPicScene){ this->pPicScene = pPicScene; } void MainWidget::_on_pushButtonPowerOff_pressed(bool notice) { if(!sysPara) return; // 回收槽检查 if(sysPara->status.currReclaimTankPos != 0) { QMessageBox::StandardButton ret = QMessageBox::Ok; if(notice) { ret = QMessageBox::warning(this, tr("警告"), tr("回收槽未关,是否关闭回收槽后关机!"), QMessageBox::Ok | QMessageBox::Cancel); } if (!notice || ret == QMessageBox::Ok) { system((char *)((QString("mkdir %1").arg(TESTDIR)).toLatin1().data())); system((char *)((QString("cp %1/*.bin %2/. ").arg(PARA_ROOT_DIR).arg(TESTDIR)).toLatin1().data())); //先备份UP* sysPara->status.reclaimCloseCnt=10; //on_pushButtonStopPrint_pressed(); on_m_StopBtn_clicked(); on_m_LeftBtn_clicked(); //on_pushButtonReclaimTankClose_pressed(); sysPara->status.powerOffAppending = true; enableReclaimCtrlButton(false); //所有的按钮全部屏蔽 } } else { QMessageBox::StandardButton ret = QMessageBox::Ok; if(notice) { ret = QMessageBox::warning(this, tr("警告"), tr("是否确认关机?"), QMessageBox::Ok | QMessageBox::Cancel); } if (!notice || ret == QMessageBox::Ok){ sysPara->status.powerOffAppending = true; checkForPowerOff(); } } } /* * 关机前务必保存参数 * */ void MainWidget::checkForPowerOff(){ if(sysPara->status.powerOffAppending){ if(!sysPara->status.selfCheckDone) sysPara->status.selfCheckDone = true; this->setDisabled(true); emit setDisableAll(); ////////关机时提高转速和回收泵压力,粘度泵和循环阀///// quint16 gearPumpValue_backup = sysPara->para.gearPumpValue; int reclaimPumpPWMWidth_backup = sysPara->para.reclaimPumpPWMWidth;; if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN)) { if(!TEST_MODE && sysPara->para.flagOfReclaimPumEnable){ for(int i=25;i>21;i--) { if(i == 25){ sysPara->status.isPumpValveControledByHand = true; //停止自动 sysPara->devOp->controlInkValve(true); sysPara->devOp->controlInkValvePWM(true); sysPara->devOp->controlReclaimPump(true,true); sysPara->devOp->controlViscosityPump(true); sysPara->devOp->controlCycleValve(true); sysPara->para.gearPumpValue = 0; sysPara->devOp->WriteMoterPump(); } if(i == 22){ sysPara->devOp->controlInkValve(false); sysPara->devOp->controlInkValvePWM(false); } this->setRunStatus(tr("正在准备关机,请等待%1秒...").arg(i*2)); MySleep(2000); } } sysPara->devOp->controlReclaimTankOpen(true); sysPara->status.isPumpValveControledByHand = true; //停止自动 if(sysPara->para.gearPumpEnable ){ if(!sysPara->para.flagOfReclaimPumEnable){ sysPara->para.gearPumpValue = 360; sysPara->devOp->WriteMoterPump(); } else{ sysPara->devOp->controlReclaimPump(true,false); sysPara->para.gearPumpValue = 0; sysPara->devOp->WriteMoterPump(); } } else{ sysPara->para.reclaimPumpPWMWidth = 95; sysPara->devOp->controlReclaimPump(true,true); } if(!sysPara->devOp->isViscosityPumpOpen()) sysPara->devOp->controlViscosityPump(true); sysPara->devOp->controlCycleValve(true); sysPara->devOp->controlInkValve(false); //关供墨 sysPara->devOp->controlInkValvePWM(false); //关供墨 if(!TEST_MODE){ for(int i=14;i>7;i--) { if(i==13) sysPara->devOp->controlReclaimTankOpen(false); this->setRunStatus(tr("正在准备关机,请等待%1秒...").arg(i*3)); MySleep(3000); } } if(!sysPara->status.lostCommuFlag){ sysPara->para.calandar_and_dat.cnt1CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt(); sysPara->para.calandar_and_dat.cnt2CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue,16).toInt(); sysPara->para.Counter3.cnt3CurrValue = QString::number(sysPara->status.Status_Counter3.cnt3CurrValue,16).toInt(); updateTotalCnt(0); sysPara->saveParaToFile(); // 关机前将相关配置保存 } sysPara->status.powerOffAppending = false; if(!TEST_MODE){ for(int i=7;i>0;i--) { if(i == 3) sysPara->devOp->controlReclaimTankClose(true); if(i == 2){ sysPara->devOp->controlViscosityPump(false); sysPara->devOp->controlCycleValve(false); sysPara->devOp->controlReclaimPump(false,false); sysPara->para.gearPumpValue = 0; sysPara->devOp->WriteMoterPump(); } this->setRunStatus(tr("正在准备关机,请等待%1秒...").arg(i*3)); MySleep(3000); } } } emit CloseJd(); sysPara->para.gearPumpValue=gearPumpValue_backup; sysPara->para.reclaimPumpPWMWidth = reclaimPumpPWMWidth_backup; sysPara->devOp->controlCompressPump(false); setRunStatus(tr("准备关机...")); sysPara->para.totalProductCnt +=sysPara->status.totalProductCnt; sysPara->devOp->clearProductCnt(3 | 0x10);//总产器计数器立即清零 sysPara->para.ReadFileErrorCnt=0; sysPara->para.PowerOnErrorCnt=0; if(sysPara->para.isCntSaveStateValue) { sysPara->para.cnt1CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt(); sysPara->para.cnt2CurrValue = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue,16).toInt(); sysPara->para.cnt3CurrValue = QString::number(sysPara->status.Status_Counter3.cnt3CurrValue,16).toInt(); } updateTotalCnt(0); sysPara->saveParaToFile(); // 关机前将相关配置保存 sysPara->saveRFIDPara(); system("sync");//缓存同步 timerPowerOff->start(1000); } } static int numOfPowerOffCMD = 0; void MainWidget::sendPowerOffCmd(){ if(++numOfPowerOffCMD == 6){ sysPara->devOp->color_flag = 2; setRunStatus(tr("关机失败!!!")); timerPowerOff->stop(); numOfPowerOffCMD = 0; return; } sysPara->devOp->powerOff(); } void MainWidget::powerOffConfirmed(){ timerPowerOff->stop(); QProcess process; process.startDetached("poweroff"); qApp->exit(0); } void MainWidget::PreviewPressed(){ qDebug()<<"PreviewPressed"; // qDebug()<toHtml(); sysPara->para.EditMode = TXTFILE; int coldot=0; if(sysPara){ previewFlag=1; sysPara->status.currPrintRow = 0; sysPara->status.variNum = 0; sysPara->status.QRvariNum = 0; sysPara->status.ExpiryVarNum=0; unsigned char *dat; bool MaxCol4000; if(sysPara->status.flagOfNo67FPGA) MaxCol4000 = true; else MaxCol4000 = false; if(MaxCol4000){ dat =sysPara->status.printDat_Normal; memset(dat,0,sizeof(sysPara->status.printDat_Normal)); }else{ dat =sysPara->status.printDat; memset(dat,0,sizeof(sysPara->status.printDat)); } // qDebug()<<"Preview:"; //////////////////////////////////////////////////////在这里清变量参数 sysPara->status.ExpiryVarNum=0; sysPara->status.CurrDateVariNum = 0; sysPara->status.classVariNum = 0; sysPara->print.ExpiryVar.startColPos = 0; sysPara->print.ExpiryVar.endRowPos = 0; sysPara->print.ExpiryVar.letterSpace =0; sysPara->print.CurDateVar.startColPos = 0; sysPara->print.CurDateVar.endRowPos = 0; sysPara->print.CurDateVar.letterSpace = 0; ///////////////////////////////////////////////////////////////// if(sysPara->para.EditMode==PICFILE) { // ui->PicWidgetDisp->getPrintDat (dat,0,sysPara); // ui->PicWidgetDisp->readVar (sysPara,0); // qDebug ()<<"v-n1:"<status.variNum<<"v-nLeter1:"<status.vars[0].letterSpace<<"v-nLeter2:"<status.vars[1].letterSpace<<"v-nLeter3:"<status.vars[2].letterSpace; // sysPara->status.variNum=ui->PicWidgetDisp->getVarNum (); // sysPara->status.currPrintCol=ui->PicWidgetDisp->getWidth (); // sysPara->status.currPrintRow=ui->PicWidgetDisp->getPicRealHeight(); // ui->PicWidgetDisp->getCharRamData(sysPara); //qDebug()<<"H0:"<PicWidgetDisp->getHeight()<PicWidgetDisp->getPicRealHeight(); } // end of PICFILE else if(sysPara->para.EditMode==TXTFILE)// TXTFLE { sysPara->status.addSpace = sysPara->para.checkSpace; ontextEdittextChanged(); coldot = (int)m_textEdit->document()->size().width(); if(coldot > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)) { coldot = (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide); QMessageBox::warning(this, tr("警告"), tr("最多支持的列数目为:%1请减小信息长度.").arg((MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide))); } int maxPicHeight = MAX_PRINT_ROW_NUM + 12; QSize size(coldot,maxPicHeight); sysPara->status.currPrintRow =0; sysPara->status.currPrintCol = coldot + ( sysPara->status.addSpace?coldot:0) ; //checkSpace QImage image(size,QImage::Format_ARGB32); image.fill(0x00ffffff);//填充白色 //image.fill(0x00f0f000);//填充白色 QPainter painter(&image); //image.save("./printImage.jpg"); m_textEdit->document()->drawContents (&painter, image.rect()); /*将text写到pic*/ image.save("./printImage.bmp"); //ui->widgetPrintTextDisplay int firstRow = maxPicHeight; /*--------------------------------------------------------------------------*/ for(int j = 0; j < maxPicHeight; j++){ //计算首行位置 for(int i = 0; i < coldot; i++){ QRgb rgb = image.pixel(i,j); if(rgb !=0x00ffffff )//& 0xff000000) { //qDebug()<maxPicHeight)?maxPicHeight:lastRow; sysPara->status.ExpiryVarNum=0; sysPara->status.CurrDateVariNum = 0; sysPara->status.classVariNum = 0; sysPara->print.ExpiryVar.startColPos = 0; sysPara->print.ExpiryVar.endRowPos = 0; sysPara->print.ExpiryVar.letterSpace =0; sysPara->print.CurDateVar.startColPos = 0; sysPara->print.CurDateVar.endRowPos = 0; sysPara->print.CurDateVar.letterSpace = 0; //接下来就是要把打印到数据data填充以及确认变量的个数,变量对应的开始列和结束行 for(int j = 0; j < lastRow - firstRow; j++){ // Y for(int i = 0; i < coldot; i++){ // QRgb rgb = image.pixel(i,j + firstRow); if(rgb&0x80000000) { //判断alpha,rgb<0xFFE0E0E0->过滤偏白背景 //if((rgb & 0xffffff) == 0xff0000) {j=40; break;} if((rgb & 0xf0f0ff) == 0xf0f000){ //处理变量, 查找左下角,因为同一行的左下角是对齐的 看起来这个颜色是黄色 bool foundvar=0; if(j>0){ QRgb r_rgb = image.pixel(i,j + firstRow+1); if((r_rgb & 0xf0f0ff) != 0xf0f000 ){foundvar =1;} //QRgb r_rgb = image.pixel(i,j + firstRow-1);if((r_rgb & 0xf0f0ff) == 0xf0f000 )foundvar =0; } if(foundvar){ if(sysPara->status.variNum < MAX_VARI_NUM){ sysPara->status.vars[sysPara->status.variNum].startColPos = i+(sysPara->status.addSpace?i:0); sysPara->status.vars[sysPara->status.variNum].endRowPos = j; if(varLastRowstatus.variNum ++;TempVarNum++; i+=5; //qDebug()<<"VARr:"<status.QRvariNum>=4)continue; if((rgb & 0x00ffff0) == 0x00ff10) { //MDT sysPara->print.QRvars[sysPara->status.QRvariNum].type=MDT; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0); sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1; if(varLastRowstatus.QRvariNum++; } else if((rgb & 0x00ffff0) == 0x00ff20) { //QR //qDebug()<<"FLAG:"<print.QRvars[sysPara->status.QRvariNum].type=QR; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0); sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1; //qDebug()<<"qr start row:"<print.QRvars[sysPara->status.QRvariNum].startColPos; //qDebug()<<"qr end row:"<print.QRvars[sysPara->status.QRvariNum].endRowPos; if(varLastRowstatus.QRvariNum++; } else if((rgb & 0x00fffff0) == 0x00ff30) { //BAR sysPara->print.QRvars[sysPara->status.QRvariNum].type=BAR; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0); sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1; if(varLastRowstatus.QRvariNum++; } if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4; } //else if((rgb & 0xfffff0)==0xff00f0) else if((rgb & 0x00ffffff)==EXPIRY_VARI_RECONISE) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 bool foundExVar=0; if(j>0){ QRgb r_rgb = image.pixel(i,j + firstRow+1); if((r_rgb & 0x00ffffff) != EXPIRY_VARI_RECONISE ){foundExVar =1;} } if(foundExVar) { qDebug()<<"expiryVar:"; //if(sysPara->status.ExpiryVarNum <3) { sysPara->print.ExpiryVar.startColPos = i+(sysPara->status.addSpace?i:0); sysPara->print.ExpiryVar.endRowPos = j; if(varLastRowstatus.ExpiryVarNum == 0) sysPara->status.ExpiryVarNum ++; i+=10; } //else TempVarNum++; //dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点 } } else if((rgb & 0xfffff0)==0xff0cf0) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 //qDebug()<<"before found CurDateVar:"<0){ QRgb r_rgb = image.pixel(i,j + firstRow+1); if((r_rgb & 0xfffff0) != 0xff0cf0 ){foundExVar =1;} } if(foundExVar) { // qDebug()<<"found CurDateVar:"; //if(sysPara->status.ExpiryVarNum <2) { sysPara->print.CurDateVar.startColPos = i+(sysPara->status.addSpace?i:0); sysPara->print.CurDateVar.endRowPos = j; if(varLastRowstatus.CurrDateVariNum == 0) sysPara->status.CurrDateVariNum ++; i+=10; } //else TempVarNum++; //dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点 } } //else if((rgb & 0xffffff)==0x0032c8) else if((rgb & 0x0000ff)>0x0000c0 && (rgb & 0x00ff00)>0x002F00 && (rgb & 0x00ff0000)==0x00000000) { //qDebug()<<"before found class:"<status.classVariNum <3) { EXPIRYVAR_t *currCLass = &sysPara->print.ClassVari ; currCLass->startColPos = i+(sysPara->status.addSpace?i:0); if (currCLass->startColPos>1) currCLass->startColPos = currCLass->startColPos - 1; currCLass->endRowPos = j; if(varLastRowstatus.classVariNum == 0) sysPara->status.classVariNum ++; i+=5; } } } else { //Y = 0.299*R' + 0.587*G' + 0.114*B int y = (((rgb&0xff)*299 + ((rgb>>8)&0xff)*587 + ((rgb>>16)&0xff)*114))/1000; if(y < 125 ) { dat[MAX_PRINT_ROW_BYTE_NUM*(i+(sysPara->status.addSpace?i:0)) + j/8] |= 1 << (j%8); //画黑点 if((j+1) > sysPara->status.currPrintRow) { sysPara->status.currPrintRow = j+1; //qDebug()<<"dddd currPrintRow:"<< sysPara->status.currPrintRow; } } } }/*判断alpha end*/ } } // var //qDebug() <<"VarNum"<8){ setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!")); strTitle= tr("变量数大于8个,某些变量将不起作用!!!"); strTitle.append("\r\n"); strTitle.append(tr("请减少信息中的变量(或计数器)数量.")); QMessageBox::warning(this, tr("警告"),strTitle,QMessageBox::Ok); } //qDebug()<status.vars[0].startRowPos<status.vars[0].endRowPos<< sysPara->status.currPrintRow; // ==============查找QRV, DMTV,BARV 变量 MAX_QVARI_NUM //qDebug()<<"qrvar"<status.QRvariNum; searchQrVar(); //if(sysPara->status.ExpiryVarNum) searchExpiryVar(); //ui->widgetPrintTextDisplay->update(); //=============== if(sysPara->status.variNum){ // /*--------------------------------提取变量------------------------------------------*/ QString pattern = ""; QRegExp rx(pattern); QString textHtml = m_textEdit->toHtml(); int from = 0; int varNum = 0; // 正常变量 while(from < textHtml.size() && from != -1) { from = textHtml.indexOf(rx,from);//返回匹配到到起始地址 bool ok; if(from != -1){//找到匹配的 from ++; if(varNum < sysPara->status.variNum){ sysPara->status.vars[varNum].digitalNum = rx.cap(3).toInt(&ok);//第二个匹配,数字到个数 sysPara->status.vars[varNum].bold = (sysPara->status.vars[varNum].digitalNum%100) == 75; if(sysPara->status.vars[varNum].bold) sysPara->status.vars[varNum].digitalNum = sysPara->status.vars[varNum].digitalNum/100; sysPara->status.vars[varNum].type = rx.cap(2).toInt(&ok);//第一个匹配 sysPara->status.vars[varNum].width = rx.cap(4).toInt(&ok)*(sysPara->status.addSpace?2:1); sysPara->status.vars[varNum].height = rx.cap(5).toInt(&ok); //qDebug() <status.vars[varNum].startRowPos // << "endRowPos" << sysPara->status.vars[varNum].endRowPos // <<"Height"<status.vars[varNum].height; //sysPara->status.vars[varNum].endRowPos = sysPara->status.vars[varNum].startRowPos + sysPara->status.vars[varNum].height-1; sysPara->status.vars[varNum].startRowPos = sysPara->status.vars[varNum].endRowPos - sysPara->status.vars[varNum].height+1; if(sysPara->status.vars[varNum].startRowPos<0)sysPara->status.vars[varNum].startRowPos=0; //sysPara->status.vars[varNum].startRowPos = sysPara->status.vars[varNum].endRowPos - sysPara->status.vars[varNum].height+(sysPara->status.vars[varNum].height==15||sysPara->status.vars[varNum].height==16?0:1); // qDebug()<<"Hei:"<status.vars[varNum].height; /*-----------------------------------------------------------------------------------------*/ int t_x_start_pos = sysPara->status.vars[varNum].startColPos; int t_x_end_pos = t_x_start_pos + sysPara->status.vars[varNum].width ; if(t_x_end_pos > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)) t_x_end_pos = (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide); int t_y_start_pos = sysPara->status.vars[varNum].startRowPos; int t_y_end_pos = sysPara->status.vars[varNum].endRowPos+1 ; if(t_y_start_pos < 0) t_y_start_pos = 0; for(int i = t_x_start_pos; i < t_x_end_pos; i++){ for(int j = t_y_start_pos; j < t_y_end_pos; j++){ dat[MAX_PRINT_ROW_BYTE_NUM*(i+(sysPara->status.addSpace?0:0)) + j/8] &= ~(1 << (j%8)); //将画点取消掉 } } sysPara->status.vars[varNum].height = rx.cap(5).toInt(&ok)-1; if(sysPara->status.vars[varNum].height>16 ){ if(sysPara->status.vars[varNum].height==24) ; else { if(sysPara->status.vars[varNum].startRowPos) { sysPara->status.vars[varNum].endRowPos--; sysPara->status.vars[varNum].startRowPos--; } } } if(sysPara->status.vars[varNum].type == RANDOMNUM) { //qDebug()<<"RAND:"<status.vars[varNum].type<< sysPara->status.vars[varNum].digitalNum; sysPara->status.RandomDigitNum = sysPara->status.vars[varNum].digitalNum; } if(sysPara->status.vars[varNum].type >59 && sysPara->status.vars[varNum].type<70) { sysPara->status.vars[varNum].endRowPos = sysPara->status.vars[varNum].endRowPos-3; sysPara->status.vars[varNum].startRowPos = sysPara->status.vars[varNum].startRowPos-3; } /*-----------------------------------------------------------------------------------------*/ int pixelSize = Public::derivePixelSizeFromHeight(sysPara->status.vars[varNum].height); //qDebug()<<"MainWindows"<status.vars[varNum].height<status.vars[varNum].letterSpace = 0; if(sysPara->status.vars[varNum].digitalNum){ //算出letterspace QFont font; //font.setFamily(Public::getFontFamily(pixelSize)); font.setFamily(Public::getFontFamily(pixelSize,sysPara->status.vars[varNum].type )); // 20160812 //pixelSize==7? font.setFamily(ui->textEditOption->getLabelFontFamily()->text()):font.setFamily(Public::getFontFamily(pixelSize, 0)); font.setPixelSize(pixelSize); font.setWeight(sysPara->status.vars[varNum].bold?QFont::Bold:QFont::Normal); //font.setLetterSpacing(QFont::AbsoluteSpacing,sysPara->para.textEditCharSpace); QFontMetrics fontMetrics(font); int charWidth = (fontMetrics.width("0123456789"))/10 ; sysPara->status.vars[varNum].letterSpace = sysPara->para.textEditCharSpace; //sysPara->status.vars[varNum].width/sysPara->status.vars[varNum].digitalNum/(sysPara->status.addSpace?2:1) - charWidth; } if(varNum<7) varNum ++; } else { qDebug() << tr("warning,界面上有变量未显示完全"); } } } } //if(sysPara->status.variNum) qDebug()<< sysPara->status.vars[0].startColPos<status.vars[0].endRowPos ; /*--------------------------------------------------------------------------*/ generateCharRamData(); /*---------------------------------------------------------------------------*/ //sysPara->status.currPrintRow ++;//总的行数,从1~n,而不是从0~n, //if(sysPara->status.currPrintRow>39)sysPara->status.currPrintRow=39; if(sysPara->status.currPrintRow>MAX_PRINT_ROW_NUM-1) sysPara->status.currPrintRow=MAX_PRINT_ROW_NUM-1; bool found=0; lastRow = sysPara->status.currPrintRow; //qDebug()<<"lastRow:"<status.currPrintRow; j >2 ; j--){ //计算首行位置 for(int i = 0; i < coldot; i++){ if(dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] & (1 << (j%8))){ lastRow = j+1; found=1;//qDebug()<<"fOUND:"<status.currPrintRow; break; } } if(found) break; } if(lastRow>MAX_PRINT_ROW_NUM-1)lastRow =MAX_PRINT_ROW_NUM-1; if(lastRow20 &&lastRow<=25) lastRow =24; sysPara->status.currPrintRow =lastRow; //sysPara->status.currPrintRow = (lastRow > varLastRow) ? lastRow : varLastRow; //配合賴工省点打印少行問题 //qDebug()<<"lastRow:"<status.currPrintRow; if(sysPara->status.specialVarPrint.SpecialVarEnable) { sysPara->devOp->fpgaWr(0xa4b0,(unsigned char *)&sysPara->status.specialVarPrint,sizeof(SpecialVarPrint)); // Send specialVarPrint 20240716 } } // end of TxtMode //qDebug() << "varnum:"<status.variNum; // 交替打印 // sysPara->status.currAlterPrintRow = sysPara->status.currPrintRow/2; #ifdef _2DCODE_ if(sysPara->status.QRvariNum) { // onUpdateDispQRCode(1); } #endif //if(sysPara->status.currPrintRow==11) sysPara->status.currPrintRow=12; int wmax = sysPara->status.currPrintRow; sysPara->status.currAlterPrintRow = sysPara->status.currPrintRow/2; if(sysPara->para.alterPrint.enable<1) sysPara->para.AlterMode=0; else { if(sysPara->para.AlterMode==0)sysPara->para.AlterMode=1; wmax = sysPara->status.currAlterPrintRow; } /*-------------------------------切换到显示窗口-----------------------------------*/ if(sysPara->status.addSpace) m_PrintDisplay->setDisplaySize(sysPara->status.currPrintCol/2,sysPara->status.currPrintRow); else m_PrintDisplay->setDisplaySize(sysPara->status.currPrintCol,sysPara->status.currPrintRow); m_PrintDisplay->setDisplaySize(sysPara->status.currPrintCol,sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow); // ui->stackedWidgetText->setCurrentWidget(ui->pagePrintTextDisplay); // ui->stackedWidgetOption->setCurrentWidget(ui->pageOption); // ui->labelTextWidthHeight->setText(tr("[ %1行 x %2列 ]").arg(wmax).arg(sysPara->status.currPrintCol)); m_PrintDisplay->update(); //qDebug()<<"3"<status.currPrintRow; } previewFlag=0; } void MainWidget::ontextEdittextChanged() { // bool MaxCol4000; // if(sysPara->status.flagOfNo67FPGA) // MaxCol4000 = true; // else // MaxCol4000 = false; // QSizeF size = ui->textEdit->document()->size(); // sysPara->status.textEditTotalCol = size.width(); // ui->labelTextWidthHeight->setText(tr("[ %1行 x %2列 ]").arg(size.height()).arg(size.width())); // if(size.width() > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)){ // myInputMethod->getInputMethod()->on_Key_Backspace_released(); // MySleep(300); // } // if(size.width() == 0) // { //在通过关标选择文本然后删除的时候,不会调用cursorPosition事件 // onTextEditCursorPositionChanged(); // } // if(0 10) // { // numOfTextChange = 0; // emit autoUpdateFontWidthByMainWindow((const unsigned int)size.width()); // } } void MainWidget::setRunStatus(QString str){ ui.lb_nozzleState->setText(str); } int MainWidget::searchQrVar(){ int varNum = 0; if( sysPara->status.QRvariNum){ QString pattern = ""; // 1 type ,2 name,3 width,4 height //

< // QRegExp rx(pattern); //QString textHtml = ui->textEdit->toHtml(); ///////////// QTextEdit textEdit ; for(int i=0;istatus.QRvariNum;i++) { if(sysPara->print.QRvars[i].type==0){ textEdit.insertHtml(QString("") .arg(9).arg(sysPara->para.qrOption.height).arg(sysPara->para.qrOption.width)); //插入索引后 } else if(sysPara->print.QRvars[i].type==1){ textEdit.insertHtml(QString("") .arg(10).arg(sysPara->para.qrOption.height).arg(sysPara->para.qrOption.width)); //插入索引后 } else if(sysPara->print.QRvars[i].type==2){ textEdit.insertHtml(QString("") .arg(11).arg(sysPara->para.qrOption.height).arg(sysPara->para.qrOption.width)); //插入索引后 } } QString textHtml = textEdit.toHtml(); //////////// int from = 0; // int xx =textHtml.size(); while(from < textHtml.size() && from != -1){ from = textHtml.indexOf(rx,from); bool ok; //qDebug()<=9 && (sysPara->print.QRvars[varNum].type ==type-9)) { //sysPara->print.QRvars[varNum].type = type-9; sysPara->para.qrOption.type = type-9; sysPara->para.qrOption.width=sysPara->print.QRvars[varNum].width = rx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; sysPara->para.qrOption.height =sysPara->print.QRvars[varNum].height = rx.cap(4).toInt(&ok); sysPara->print.QRvars[varNum].startRowPos = sysPara->print.QRvars[varNum].endRowPos-sysPara->print.QRvars[varNum].height; varNum++; //break; } } } } } return varNum; } int MainWidget::searchExpiryVar() { int varNum = 0; if( sysPara->status.ExpiryVarNum || sysPara->status.CurrDateVariNum || sysPara->status.classVariNum) { QString pattern = ""; // 1 type ,2 name,3 width,4 height //

< // QRegExp rx(pattern); QString textHtml = m_textEdit->toHtml(); int from = 0; // int xx =textHtml.size(); sysPara->print.ExpiryVar.type = 0; sysPara->print.CurDateVar.type = 0; //sysPara->print.CurDateVar[1].type = 0; sysPara->print.ClassVari.type = 0; while(from < textHtml.size() && from != -1){ from = textHtml.indexOf(rx,from); bool ok; //qDebug()<print.ExpiryVar.type = type; sysPara->print.ExpiryVar.width = rx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; sysPara->print.ExpiryVar.height = rx.cap(4).toInt(&ok); //sysPara->print.ExpiryVar.startRowPos = sysPara->print.ExpiryVar.endRowPos-sysPara->print.ExpiryVar.height; sysPara->print.ExpiryVar.startRowPos = sysPara->print.ExpiryVar.endRowPos-(sysPara->print.ExpiryVar.height-1); if(sysPara->print.ExpiryVar.startRowPos < 0) { sysPara->print.ExpiryVar.startRowPos = 0; } if(rx.cap(2).contains("75")) { sysPara->print.ExpiryVar.bold = 1; } else { sysPara->print.ExpiryVar.bold = 0; } // 直接更新有效期,并退出? ExpiryDotUpdate(1); varNum++; } else if(type == CURDATE || type==CURDATE + 10 || type==CURDATE + 20 || type==CURDATE + 30) { sysPara->print.CurDateVar.type = type; sysPara->print.CurDateVar.width = rx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; sysPara->print.CurDateVar.height = rx.cap(4).toInt(&ok); sysPara->print.CurDateVar.startRowPos = sysPara->print.CurDateVar.endRowPos-(sysPara->print.CurDateVar.height-1); if(sysPara->print.CurDateVar.startRowPos < 0) { sysPara->print.CurDateVar.startRowPos = 0; } if(rx.cap(2).contains("875")) { //qDebug()<<"bold"; sysPara->print.CurDateVar.bold = 1; } else { //qDebug()<<"normal"; sysPara->print.CurDateVar.bold = 0; } //sysPara->print.CurDateVar.startRowPos = sysPara->print.CurDateVar.endRowPos-(sysPara->print.CurDateVar.height-1); //qDebug()<<"CurDateVar:startRowPos"<print.CurDateVar.startRowPos<<" height"<print.CurDateVar.height; // 生产日期即当前日期 ExpiryDotUpdate(2); varNum++; } else if(type == CURCLASS) { //qDebug()<<"CURCLASS:"<print.ClassVari ; currClass->type = type; currClass->width = rx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; currClass->height = rx.cap(4).toInt(&ok); currClass->startRowPos = currClass->endRowPos-currClass->height-1; if(rx.cap(2).contains("875")) { //qDebug()<<"bold"; currClass->bold = 1; } else { //qDebug()<<"normal"; currClass->bold = 0; } //sysPara->print.CurDateVar.startRowPos = sysPara->print.CurDateVar.endRowPos-(sysPara->print.CurDateVar.height-1); //qDebug()<<"CurDateVar:startRowPos"<print.CurDateVar.startRowPos<<" height"<print.CurDateVar.height; // 生产日期即当前日期 ExpiryDotUpdate(3); varNum++; } } else if(varNum>=3) break; } //break; //if(varNum>sysPara->status.ExpiryVarNum)break; } } return varNum; } /* 生成字模数据 */ void MainWidget::generateCharRamData() { if(!sysPara->status.variNum) return; QTextEdit textEdit; textEdit.document()->setDocumentMargin(0); textEdit.setLineWrapMode(QTextEdit::NoWrap); int ramAddress = 0; int i; qDebug()<<"sysPara->status.variNum:"<status.variNum; for( i = 0; i < sysPara->status.variNum; i++){ vars_t *p_var = &sysPara->status.vars[i]; p_var->bassAddr = -1; if(p_var->original){ //清除原来的记录 if(p_var->dat){ free(p_var->dat); } p_var->original = false; } int j; int width; if(p_var->bassAddr == -1){ if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide) width = (p_var->digitalNum)?(13*(p_var->width/p_var->digitalNum)):12; else width = (p_var->digitalNum)?(10*(p_var->width/p_var->digitalNum)):12; int width2 = width;//+(sysPara->status.addSpace?width:0); int height = Public::derivePixelSizeFromHeight(p_var->height); textEdit.clear(); int DPI = textEdit.logicalDpiX(); DPI = DPI?DPI:1; //Pixel = DPI * Point / 72 if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){ textEdit.insertHtml(QString("0123456789.m ") .arg(Public::getFontFamily(height,p_var->type)) // 20160812 增加横向字体 p_var->type <9 正常, p_var->type 20~28 左横 p_var->type 40~48 右横 .arg(height*96/DPI).arg(p_var->bold?600:400)); //600表示加粗,400表示普通 }else{ textEdit.insertHtml(QString("0123456789") // .arg(p_var->bold?ui->textEditOption->getFamilyName(height):(Public::getFontFamily(height,p_var->type))) // 20160812 增加横向字体 p_var->type <9 正常, p_var->type 20~28 左横 p_var->type 40~48 右横 .arg(Public::getFontFamily(height,p_var->type)) .arg(height*96/DPI)); } QFont font = textEdit.font(); font.setLetterSpacing(QFont::AbsoluteSpacing,p_var->letterSpace); textEdit.setFont(font); qDebug() << "Generate char, letter space: " << p_var->letterSpace << "font height: " << height; int imgHeight = height + 12; QSize size(width,imgHeight); QImage image(size,QImage::Format_ARGB32); image.fill(0x00ffffff); QPainter painter(&image); textEdit.show(); //如果不显示,似乎不会绘制 textEdit.document()->drawContents (&painter, image.rect()); /*将text写到pic*/ QString fileName = "/home/plg/doc/002.html"; QTextDocumentWriter writer(fileName); bool success = writer.write(textEdit.document()); textEdit.hide(); image.save(QString::number(i) + "varRam.png"); // 找到最下面的行 int lastValidRow = 0; for(int k = imgHeight - 1; k >= 0 ; k--){ for(int j = 0; j < width; j ++){ QRgb rgb = image.pixel(j,k); if(rgb&0xff000000){ lastValidRow = k + 1; break; } } if(lastValidRow != 0) break; } qDebug()<<"lastValidRow"<endRowPos<< p_var->startRowPos; int rowDiff = p_var->endRowPos - p_var->startRowPos; int firstValidRow = 0; // 变量的第一行所处的行地址 int firstValidRowDiff;// 看起来和上面的参数一样 qDebug()<<"rowDiff"<= rowDiff){ firstValidRow = lastValidRow - rowDiff; firstValidRowDiff = firstValidRow; } else { firstValidRow = 0; firstValidRowDiff = lastValidRow > rowDiff; } firstValidRow = firstValidRow >= 0?firstValidRow:0; //纠正 int rowByteNum = rowDiff/8 + ((rowDiff%8)?1:0); // 一列占用字节数 unsigned char *dat = (unsigned char *)calloc(width2,rowByteNum); for(int k = firstValidRow; k < lastValidRow; k++){ for(int j = 0; j < width; j ++){ QRgb rgb = image.pixel(j,k); int currRow = k - firstValidRowDiff; if(((rgb >> 24)&0xff) > 0x80){ // 判断是否有效的像素点 dat[rowByteNum*(j+(sysPara->status.addSpace?j:0) )+ currRow/8] |= (1<<(currRow%8)); } else{ } } } p_var->bassAddr = ramAddress; p_var->datHeight = height; p_var->datWidth = width2; p_var->rowByteNum = rowByteNum; p_var->dat = dat; p_var->original = true; p_var->currVal = -1; //相当于初始化 ramAddress += rowByteNum * width2; } } } void MainWidget::ExpiryDotUpdate(char Mode) { //更新有效期 QTextEdit textEdit; //textEdit.document()->setDocumentMargin(0); textEdit.setLineWrapMode(QTextEdit::NoWrap); int height,width; //QDate curDate=QDate::currentDate(); EXPIRYVAR_t *p_var;//=(Mode==1)?&sysPara->print.ExpiryVar:&sysPara->print.CurDateVar; if(sysPara->status.flagOfAdjustWidth_1){ sysPara->print.ExpiryVar.splitMode = sysPara->status.splitMode_Adjust_1; sysPara->status.flagOfAdjustWidth_1 = false; } if(sysPara->status.flagOfAdjustWidth_2){ sysPara->print.CurDateVar.splitMode = sysPara->status.splitMode_Adjust_2; sysPara->status.flagOfAdjustWidth_2 = false; } if(Mode==1) { qDebug()<<"Mode==1"; if(sysPara->status.ExpiryVarNum == 0) { return; } p_var = &sysPara->print.ExpiryVar; QDate expiryDate=QDate::currentDate().addDays(sysPara->para.ExpiryDay); sysPara->print.ExpiryVar.year = expiryDate.year(); sysPara->print.ExpiryVar.month = expiryDate.month(); sysPara->print.ExpiryVar.day = expiryDate.day(); r_ExpiryDay = sysPara->para.ExpiryDay; } else if(Mode==2) { p_var = &sysPara->print.CurDateVar; if(sysPara->status.CurrDateVariNum == 0) { return; } } else if(Mode==3) { p_var = &sysPara->print.ClassVari; qDebug()<<"Mode==3"; if(sysPara->status.classVariNum == 0) { return; } } else return; { textEdit.clear(); height = p_var->height; width = p_var->width; QString str; QHash dateFormat; dateFormat.insert(0,"yyyy-MM-dd"); dateFormat.insert(1,"yyyy/MM/dd"); dateFormat.insert(2,"yyyyMMdd"); dateFormat.insert(3,"yyyy年MM月dd日"); dateFormat.insert(4,"yyyy-MM-dd hh:mm"); dateFormat.insert(5,"yyyy/MM/dd hh:mm"); dateFormat.insert(6,"yyyyMMddhhmm"); dateFormat.insert(7,"yyyy年MM月dd日 hh:mm"); dateFormat.insert(8,"hh:mm"); dateFormat.insert(9,"ddhhmm"); dateFormat.insert(10,"dd MM yy"); dateFormat.insert(11,"dd/MM/yy"); dateFormat.insert(12,"dd/MM/yyyy"); dateFormat.insert(13,"dd-MM-yy"); dateFormat.insert(14,"dd-MM-yyyy"); /*****轮班变量功能 start******/ /*00:00-08:00 08:00-16:00 16:00-00:00 */ QTime current_time =QTime::currentTime(); int hour = current_time.hour(); QString DateTime; if(Mode==1) { DateTime = QDateTime::currentDateTime().addDays(sysPara->para.ExpiryDay).toString(dateFormat.value(sysPara->print.ExpiryVar.splitMode)); } else if(Mode==2 ) { DateTime = QDateTime::currentDateTime().toString(dateFormat.value(p_var->splitMode)); } else if (Mode == 3) { if(hour >= 0 && hour <8) { dateFormat.insert(15,"A"); DateTime = "A"; } else if(hour >= 8 && hour < 16) { dateFormat.insert(15,"B"); DateTime = "B"; } else if(hour >= 16) { dateFormat.insert(15,"C"); DateTime = "C"; } } /*****轮班变量功能 end******/ int DPI = textEdit.logicalDpiX(); DPI = DPI?DPI:1; //Pixel = DPI * Point / 72 if(p_var->bold) { textEdit.insertHtml(QString("%4") .arg(Public::getFontFamily(height-1,p_var->type)) // 20160812 增加横向字体 p_var->type <9 正常, p_var->type 20~28 左横 p_var->type 40~48 右横 .arg(height*72/DPI-1) .arg(600) .arg(DateTime) ); //600表示加粗,400表示普通 } else { textEdit.insertHtml(QString("%4") .arg(Public::getFontFamily(height,p_var->type)) // 20160812 增加横向字体 p_var->type <9 正常, p_var->type 20~28 左横 p_var->type 40~48 右横 .arg(height*72/DPI) .arg(400) .arg(DateTime) // .arg("x") ); //600表示加粗,400表示普通 } QFont font = textEdit.font(); font.setLetterSpacing(QFont::AbsoluteSpacing,sysPara->para.textEditCharSpace ); textEdit.setFont(font); int imgHeight = height + 12; bool MaxCol4000; if(sysPara->status.flagOfNo67FPGA) MaxCol4000 = true; else MaxCol4000 = false; if(imgHeight> MAX_PRINT_ROW_NUM+12) imgHeight = MAX_PRINT_ROW_NUM+12; if(width> (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)) width = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide; QSize size(width+2,imgHeight); QImage image(size,QImage::Format_ARGB32); image.fill(0x00ffffff); QPainter painter(&image); textEdit.show(); //如果不显示,似乎不会绘制 textEdit.document()->drawContents (&painter, image.rect()); /*将text写到pic*/ textEdit.hide(); image.save("./Expiry.bmp"); int lastValidRow = 0; for(int k = imgHeight - 1; k >= 0 ; k--){ for(int j = 0; j < width+1; j ++){ QRgb rgb = image.pixel(j,k); if(rgb&0xff000000){ lastValidRow = k + 1; break; } } if(lastValidRow != 0) { break; } } int rowDiff = p_var->endRowPos - p_var->startRowPos; int firstValidRow=0; int firstValidRowDiff; if(lastValidRow >= rowDiff) { firstValidRow = lastValidRow - rowDiff; firstValidRowDiff = firstValidRow; } else { firstValidRow = 0; firstValidRowDiff = lastValidRow > rowDiff; } firstValidRow = firstValidRow >= 0?firstValidRow:0; //纠正 str="";//s2=""; int wStart=p_var->startColPos; int hStart= p_var->startRowPos; unsigned char *dat; if(MaxCol4000){ dat =sysPara->status.printDat_Normal; }else{ dat =sysPara->status.printDat; } for(int j = 2; j < width+1; j ++) { unsigned char c=0; hStart= p_var->startRowPos; c=dat[(wStart)*5+(hStart)/8]; for(int k = firstValidRow; k <= lastValidRow; k++) { QRgb rgb = image.pixel(j,k); if(((rgb >> 24)&0xff) > 0x80) { c |= (1 << (hStart%8)); } else { c &= ~(1 << (hStart%8)); } if(hStart%8==7) { dat[(wStart)*5+(hStart)/8]=c; c=dat[(wStart)*5+(hStart+1)/8]; } hStart++; } dat[(wStart)*5+(hStart)/8]=c; wStart++; } } } bool MainWidget::dateTimeItemsDotUpdate() { if(!pPicScene) { return false; } int totalOfProcessedDots = 0; int totalOfDatetimeNumber = 0; int nbInvaliedDatetimePreview = 0; int nbClipDatetimePreview = 0; bool isUpdate = false; auto items = pPicScene->items(); for(auto i : items) { PicTextItem* item = dynamic_cast(i); if(!item) continue; if(item->sourceType() != SourceType::DATETIME && item->sourceType() != SourceType::SCHEDULE_SHIFT && item->sourceType() != SourceType::CODE) continue; if(item->sourceType() == SourceType::DATETIME) { auto dateTimeItem = dynamic_cast(item); if(!dateTimeItem) continue; auto b = dateTimeItem->updateDatetimeStr(); isUpdate |= b; if(!b) continue; } if(item->sourceType() == SourceType::SCHEDULE_SHIFT) { auto scheduleShiftItem = dynamic_cast(item); if(!scheduleShiftItem) continue; auto b = scheduleShiftItem->updateScheduleName(); isUpdate |= b; if(!b) continue; } if(item->sourceType() == SourceType::CODE) { auto codeItem = dynamic_cast(item); if(!codeItem) continue; QVector counterValus{sysPara->para.cnt1CurrValue, sysPara->para.cnt2CurrValue}; auto b = codeItem->updateVariants(counterValus); isUpdate |= b; if(!b) continue; } QImage img = item->preview(); if(img.isNull()) { ++nbInvaliedDatetimePreview; continue; } auto sceneRect = pPicScene->sceneRect(); auto boundingRect = pPicScene->itemsBoundingRect(); QRectF itemRect(item->pos() - boundingRect.topLeft(), img.size()); totalOfDatetimeNumber++; // 裁剪item位置, 确保item位于场景内 // 如果item超出了场景范围,则裁剪img并更新itemRect,只显示场景内的部分 QRectF intersectRect = itemRect.intersected(sceneRect); if(!intersectRect.isEmpty() && intersectRect != itemRect) { // 计算裁剪区域在原图中的偏移 int cropX = qMax(0, (int)(intersectRect.left() - itemRect.left())); int cropY = qMax(0, (int)(intersectRect.top() - itemRect.top())); int cropWidth = (int)intersectRect.width(); int cropHeight = (int)intersectRect.height(); // 裁剪图像 img = img.copy(cropX, cropY, cropWidth, cropHeight); // 更新itemRect为裁剪后的区域 itemRect = intersectRect; ++nbClipDatetimePreview; } totalOfProcessedDots += imageToPrintData(img, (int)itemRect.left(), (int)itemRect.top()); } return isUpdate; } int MainWidget::imageToPrintData(QImage &image, int startX, int startY) { int totalOfProcessedDots = 0; if(image.isNull()) return 0; unsigned char *dat = sysPara->status.flagOfNo67FPGA ? sysPara->status.printDat_Normal : sysPara->status.printDat; int width = image.width(); int height = image.height(); int wStart = startX; for(int j = 0; j < width; j++) { unsigned char c = 0; int hStart = startY; c = dat[(wStart)*5 + (hStart)/8]; for(int k = 0; k < height; k++) { QRgb rgb = image.pixel(j, k); if(((rgb >> 24) & 0xff) > 0x80) { c |= (1 << (hStart % 8)); } else { c &= ~(1 << (hStart % 8)); } if(hStart % 8 == 7) { dat[(wStart)*5 + (hStart)/8] = c; c = dat[(wStart)*5 + (hStart + 1)/8]; ++totalOfProcessedDots; } hStart++; } dat[(wStart)*5 + (hStart)/8] = c; wStart++; totalOfProcessedDots++; } return totalOfProcessedDots; } void MainWidget::enableReclaimCtrlButton(bool enable){ m_RightBtn->setEnabled(enable); m_LeftBtn->setEnabled(enable); } void MainWidget::enablePrintButton(bool enable){ m_StartBtn->setEnabled(enable); m_StopBtn->setEnabled(enable); } void MainWidget::updateTotalCnt(int en) { // No50 USEING //sysPara->para.totalProductCnt += (sysPara->status.productCnt>sysPara->status.lastProductCnt)?sysPara->status.productCnt-sysPara->status.lastProductCnt: // (sysPara->status.productCnt>=0&&sysPara->status.productCnt<20)?sysPara->status.productCnt:0; //if(en) sysPara->para.totalProductCnt=0; //sysPara->para.totalProductCnt = sysPara->status.totalProductCnt; // No51版本改进 sysPara->status.lastProductCnt = sysPara->status.productCnt; ui.labelProductCnt->setText(QString::number(sysPara->status.productCnt)); // ui.labelTotalProductCnt->setText(QString::number( sysPara->para.totalProductCnt+sysPara->status.totalProductCnt)); // 20260410 总数栏改为预设数值栏 if (m_setNumDlg->getIsSet() && m_setNumDlg->getNum() > 0 && ui.labelProductCnt->text() == ui.labelTotalProductCnt->text()) { on_m_StopBtn_clicked(); } } void MainWidget::on_m_StartBtn_clicked() { if(sysPara->status.isPrinting){ qDebug("Mainwindow: Printing 开始打印"); }else{ qDebug("Mainwindow: Non printing 开始打印"); } static int fileCount = 0; fileCount++; if(fileCount > 5) { fileCount = 1; } if(sysPara){ bool MaxCol4000; if(sysPara->status.flagOfNo67FPGA) MaxCol4000 = true; else MaxCol4000 = false; test_flag = 0; /******2020/2/29*****/ if(sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER) //同步模式下,判断喷印间隔是否设置合理 { QSizeF size = m_textEdit->document()->size(); float stroke,print_len_min; stroke = sysPara->para.printColDelay/sysPara->para.synPulseNumPerMm; print_len_min = stroke * size.width(); if(print_len_min > sysPara->para.synTriggerPrintLenMm && !sysPara->para.charWidthSetEnable) { // QMessageBox::information(this,tr("错误"),tr("喷印间隔过短,应高于%1!").arg(print_len_min)); // return; } } /******2020/2/29 end*****/ if(!SIMULATE_PRINTING_MODE){ if (!sysPara->status.reclainTankReachEnd) { return; } if((sysPara->status.statWarn & WARN_STATUS_HDINT)){ QMessageBox::information(this,tr("错误"),tr("喷头盖未关,请先关喷头盖!")); return ; } if((sysPara->status.statWarn & WARN_STATUS_INK_SWINT)){ QMessageBox::information(this,tr("错误"),tr("墨线未开,请先开墨线开关!")); return ; } } sysPara->devOp->highVoltageCtrl(1); sysPara->devOp->setHighVoltageAmplitudetoSTM32(); sysPara->status.waitHightVolOff = 0; // if(!printintFlag)setRunStatus(tr("正在加高压...")); // 复位计数器 if(sysPara->status.FileChangeRestCntFlag){ if(sysPara->para.ResetAllProductCntEn) { sysPara->devOp->clearProductCnt(3 | 0x10); // [3]总产品计数器清零FPGA sysPara->para.totalProductCnt=0; } else if(sysPara->para.ResetProductCntEn) { sysPara->devOp->clearProductCnt(3); } sysPara->status.FileChangeRestCntFlag=0; sysPara->saveParaToFile(); } if(sysPara->para.EditMode == TXTFILE||sysPara->para.EditMode== PICFILE) PreviewPressed(); //生成打印数据,确定变量的位置和对应生成字模 else if(sysPara->para.EditMode == SCENE) onPreviewScene(); if(sysPara->status.currPrintCol > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)){ QMessageBox::critical(0,tr("错误"),tr("当前总列数 %1 ,支持的总列数为 %2,请减少打印串的长度").arg(sysPara->status.currPrintCol).arg((MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide))); return ; } if(!((sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER) ||((sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL ||sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE) && sysPara->para.eleEyeTriggerSynPrintEn)) ) { int dotNumPerCol = sysPara->status.currPrintRow*(1 + sysPara->para.printRowDelay) + sysPara->para.printColDelay; long printTmUs = 1.0f*dotNumPerCol*(1 + sysPara->para.charBold)*sysPara->status.currPrintCol*(2*sysPara->para.divideRatio)/(FPGA_SYS_HZ/1000000); if((printTmUs/1000 + 3) > (sysPara->para.printDelayMs) && (sysPara->para.timeTriggerPrintMode == TIME_TRIGGER_PRINT_MODE_HEAD_TO_HEAD) && (sysPara->para.printTriggerMode == PRINT_TRIGGER_TIME ) ) // 在电眼方式下,是否需要判呢? { QMessageBox::critical(0,tr("错误"),tr("打印耗时 %1ms ,触发间隔 :%2ms ,触发间隔至少应当大于打印耗时3ms").arg(printTmUs/1000).arg(sysPara->para.printDelayMs)); return ; } } sysPara->status.isPrinting=false; SendPrintDataToFpga(0); // 0--正常打印,1--打印交替部分信息1; 2--打印交替部分信息2, /*-------------------------------------------------------------------*/ // ui->labelSynColDelay->setText(""); sysPara->status.lastSynColDelay = -1; //目的是为了清空原来的数据 /*---------------------------------开关回收槽------------------------------*/ enableReclaimCtrlButton(false); updatePrintDisplayLabel(); // 20170717 移动此,以观察条形码打印异常问题。 if(!startPrintingFlag) { sysPara->devOp->printCtrl(PRINT_CTRL_START); printintFlag = true; } startPrintingFlag = true;sysPara->status.isPrinting=true; // 高亮切换 changeHighLight(true); } } void MainWidget::on_m_StopBtn_clicked() { if(sysPara->status.isPrinting){ qDebug("Mainwindow: Printing 停止打印"); }else{ qDebug("Mainwindow: Non printing 停止打印"); } if(sysPara){ if (!sysPara->status.reclainTankReachEnd && !SIMULATE_PRINTING_MODE) { return; } // sysPara->status.flagOfAbnormalStatus = false; sysPara->status.isPrinting=false; sysPara->devOp->printCtrl2(1); sysPara->devOp->printCtrl( PRINT_CTRL_STOP);//:PRINT_CTRL_STOPSYNCNT // LogInfo::setRunStatusText(tr("停止打印")); enableReclaimCtrlButton(true); printintFlag = false; startPrintingFlag = false; updatePrintDisplayLabel(); sysPara->status. waitHightVolOff = 1; sysPara->saveParaToFile(); // 将相关配置保存 if(sysPara->status.RandomBackCnt>5 && (sysPara->status.RandomNum>0)) { QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("提示"), tr("随机码文本将展出到U盘,请插入U盘"), QMessageBox::Ok | QMessageBox::Cancel); if (ret == QMessageBox::Ok){ // LogInfo::setRunStatusText("正在导出随机码文件到U盘......"); sysPara->devOp->RandTxtBakup(0); //备份到U盘 // LogInfo::setRunStatusText("随机码文件导出完成."); } } // 高亮切换 changeHighLight(false); } } unsigned char blankDat1[BLANK_COL_NUM*MAX_PRINT_ROW_BYTE_NUM]={0}; void MainWidget::SendPrintDataToFpga(unsigned char alterEnable) { if(!sysPara) return ; // fileChange=false; sysPara->devOp->writeFpgaPrintPara(1); /*务必放在最后一步*/ sysPara->devOp->writeFpgaVariCtrl(); sysPara->devOp->fpgaWr(0,blankDat1,sizeof(blankDat1));//...所加的空白偏移地址 // 交替打印处理 unsigned char *dat; size_t sizeofdat; bool MaxCol4000; if(sysPara->status.flagOfNo67FPGA) MaxCol4000 = true; else MaxCol4000 = false; if(MaxCol4000){ dat =sysPara->status.printDat_Normal; sizeofdat = sizeof(sysPara->status.printDat_Normal); }else{ dat =sysPara->status.printDat; sizeofdat = sizeof(sysPara->status.printDat); } if(sysPara->status.currPrintCol* MAX_PRINT_ROW_BYTE_NUM <= 20000) sysPara->devOp->fpgaWr(sizeof(blankDat1),dat, sysPara->status.currPrintCol* MAX_PRINT_ROW_BYTE_NUM); else sysPara->devOp->fpgaWrD2(sizeof(blankDat1),dat, sysPara->status.currPrintCol* MAX_PRINT_ROW_BYTE_NUM); static QElapsedTimer bnsTimer; static uint64_t nbRestartCount = 0; ++nbRestartCount; if(nbRestartCount >= 10) { auto elapsed = bnsTimer.restart(); qDebug() << (QString("SendPrintDataToFpga avg elapsed: %1 s").arg(elapsed / qreal(nbRestartCount) / 1000.0)); nbRestartCount = 0; } } int MainWidget::getCurrPrintStatus() { int printStatus; if (startPrintingFlag ) { if(printintFlag) { printStatus = 1; // 正在打印 } else { printStatus = 2; // 暂停喷印 } } else { printStatus = 3; // 停止打印 } return printStatus; } void MainWidget::setReclaimStatus(bool isOpen, int rate) { if (!sysPara->devOp->isReclaimTankOpenEnable()) { QString str = isOpen? tr("停止开启") : tr("停止关闭"); setRunStatus(str); return; }; if (isOpen) { QString str = rate == 100? tr("喷嘴已开启"):tr("喷嘴开启中"); ui.lb_RightBtn->setText(str); ui.lb_LeftBtn->setText(tr("喷嘴关闭")); } else { QString str = rate == 0? tr("喷嘴已关闭"):tr("喷嘴关闭中"); ui.lb_LeftBtn->setText(str); ui.lb_RightBtn->setText(tr("喷嘴开启")); } } static int mainInkPumpCtrlStatus = 0; static int mainInkPumpCtrlCnt = 0; //100ms 为单位 void MainWidget::airPushingProcess() { if(sysPara){ if (sysPara->status.airPushing) { // 执行排气 7 秒 setRunStatus(tr("正在排气...")); ++sysPara->status.airPushingOnTime; if(sysPara->status.airPushingOnTime >= 50) { static int delayCount = 0; ++delayCount; m_2sFlag = true; //sysPara->devOp->controlInkValve(false); //关供墨阀 if(delayCount >= 40) { m_2sFlag = false; } if(delayCount >= 60) { delayCount = 0; airPushTimer->stop(); sysPara->devOp->controlViscosityPump(false); reclaimTanOpen(); //qDebug()<< "start stop"; sysPara->status.airPushingDone = 1; sysPara->status.airPushing = 0; sysPara->status.airPushingOnTime = 0; } return; } if (sysPara->status.airPushingOnTime%10 >= 5) { sysPara->devOp->controlCycleValve(true); } else { sysPara->devOp->controlCycleValve(false); } if (mainInkPumpCtrlStatus == 0) { if(++mainInkPumpCtrlCnt > 15) { //100ms 为单位, 时间到关闭 sysPara->devOp->controlMainInkPump(false); sysPara->devOp->mainInkCtrl(); mainInkPumpCtrlStatus = 1; mainInkPumpCtrlCnt = 0; } } else if (mainInkPumpCtrlStatus == 1) { //100ms 为单位, 时间到开启 sysPara->devOp->controlMainInkPump(true); sysPara->devOp->mainInkCtrl(); mainInkPumpCtrlStatus = 2; } else if (mainInkPumpCtrlStatus == 2) { if(++mainInkPumpCtrlCnt>7) { sysPara->devOp->controlMainInkPump(false); sysPara->devOp->mainInkCtrl(); mainInkPumpCtrlStatus = 3; mainInkPumpCtrlCnt = 0; } } else if (mainInkPumpCtrlStatus == 3) { if(++mainInkPumpCtrlCnt>8) { sysPara->devOp->controlMainInkPump(true); sysPara->devOp->mainInkCtrl(); mainInkPumpCtrlStatus = 4; mainInkPumpCtrlCnt = 0; } } else if (mainInkPumpCtrlStatus == 4) { if(++mainInkPumpCtrlCnt>8) { sysPara->devOp->controlMainInkPump(false); sysPara->devOp->mainInkCtrl(); mainInkPumpCtrlStatus = 3; mainInkPumpCtrlCnt = 0; } } } } } void MainWidget::reclaimTanOpen() { // 还原当前模式 if (sysPara->status.airPushing) { sysPara->status.isPumpValveControledByHand = sysPara->status.byHandStore; } sysPara->status.isPumpValveControledByHand = false; sysPara->devOp->mainInkCtrl(); sysPara->devOp->controlReclaimTankClose(false);//开回收槽之前先让关回收槽停止 MySleep(1000); sysPara->devOp->controlReclaimTankOpen(!sysPara->devOp->isReclaimTankOpenEnable()); sysPara->devOp->highVoltageCtrl(0); /*回收槽动作的时候务必关高压*/ // sysPara->status.reclaimTankstatus = 1; // setRunStatus(sysPara->devOp->isReclaimTankOpenEnable()?tr("正在打开回收槽..."):tr("停止打开")); setReclaimStatus(true, 0); if (!sysPara->para.reclaimTankTime) { // LogInfo::setRunStatusText(tr("警告!回收槽开关时间未设置!")); } else { } sysPara->status.currReclaimOperationCnt = 0; sysPara->status.reclainTankReachEnd = false; sysPara->status.reclainOpenAppending = true; sysPara->status.reclainCloseAppending = false; sysPara->status.reclaimBlockedCnt = 0; sysPara->status.canRunAirPushing = false; if (sysPara->status.reclainTankReachEnd) enablePrintButton(SIMULATE_PRINTING_MODE); } void MainWidget::initSheet() { // 仅当前按钮生效 QString startBtnSheet = R"( QPushButton { background-color: #1e8449; color: black; border-radius: 5px; } QPushButton:disabled { background-color: #bdc3c7; /* 灰色背景 */ color: #7f8c8d; /* 灰色文字 */ border: 1px solid #95a5a6; /* 灰色边框 */ } )"; ui.m_StartBtn->setStyleSheet(startBtnSheet); QString stopBtnSheet = R"( QPushButton { background-color: #e74c3c; color: black; border-radius: 5px; } QPushButton:disabled { background-color: #bdc3c7; /* 灰色背景 */ color: #7f8c8d; /* 灰色文字 */ border: 1px solid #95a5a6; /* 灰色边框 */ } )"; ui.m_StopBtn->setStyleSheet(stopBtnSheet); QString btnSheet = R"( QPushButton:disabled { background-color: #bdc3c7; /* 灰色背景 */ color: #7f8c8d; /* 灰色文字 */ border: 1px solid #95a5a6; /* 灰色边框 */ } )"; ui.m_RightBtn->setStyleSheet(btnSheet); ui.m_LeftBtn->setStyleSheet(btnSheet); QString lbSheet = R"( QLabel { border: 1px solid #95a5a6; /* 灰色边框 */ } )"; ui.lb_LeftBtn->setStyleSheet(lbSheet); ui.lb_RightBtn->setStyleSheet(lbSheet); } void MainWidget::changeHighLight(bool isStart) { initSheet(); if (isStart) { QString highlightStyle = R"( QPushButton { background-color: #27ae60; color: black; border-radius: 5px; border: 3px solid #f39c12; box-shadow: 0 0 8px rgba(231, 76, 60, 0.6); } QPushButton:disabled { background-color: #bdc3c7; /* 灰色背景 */ color: #7f8c8d; /* 灰色文字 */ border: 1px solid #95a5a6; /* 灰色边框 */ } )"; m_StartBtn->setStyleSheet(highlightStyle); } else { QString highlightStyle = R"( QPushButton { background-color: #f07167; color: black; border-radius: 5px; border: 3px solid #f39c12; box-shadow: 0 0 8px rgba(231, 76, 60, 0.6); } QPushButton:disabled { background-color: #bdc3c7; /* 灰色背景 */ color: #7f8c8d; /* 灰色文字 */ border: 1px solid #95a5a6; /* 灰色边框 */ } )"; m_StopBtn->setStyleSheet(highlightStyle); } } void MainWidget::on_m_RightBtn_clicked() { if(sysPara){ if (!sysPara->status.reclaimTankBlockedAppending) { if (sysPara->status.canRunAirPushing && (sysPara->status.currReclaimTankPos == 0)) { //2019/10/24 当回收槽未在顶的位置,不需要排气 // Pos == 0 回收槽关闭的情况下才可以执行排气; 先执行排气后开回收槽 if (!sysPara->status.airPushing) { //排气:打印、暂停打印置灰 enablePrintButton(false); sysPara->status.byHandStore = sysPara->status.isPumpValveControledByHand; sysPara->status.isPumpValveControledByHand = true; sysPara->devOp->mainInkCtrl(); sysPara->devOp->controlCycleValve(true); sysPara->devOp->controlViscosityPump(false);//关粘度泵 sysPara->devOp->controlMainInkPump(true);//主墨泵敞开 sysPara->devOp->mainInkCtrl(); sysPara->devOp->controlReclaimPump(true, false); // 回收泵开 sysPara->devOp->controlInkValve(true); //墨水阀 sysPara->devOp->controlInkValvePWM(true); //墨水阀 //qDebug()<< "start airpushings"; sysPara->status.airPushing = 1; sysPara->status.airPushingDone = 0; sysPara->status.airPushingOnTime = 0; airPushTimer->start(100); // 100ms } } else reclaimTanOpen(); } else if(sysPara->status.reclaimTankBlockedAppending) { sysPara->status.reclaimTankBlockedAppending = false; QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("警告"), tr("回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置?"), QMessageBox::Ok | QMessageBox::Cancel); if (ret == QMessageBox::Ok){ sysPara->para.reclaimTankTime = sysPara->status.currReclaimTankPos/10; // onReclainTankPositionChanged(sysPara->para.reclaimTankTime * 10); } } } } void MainWidget::on_m_LeftBtn_clicked() { if(sysPara){ if(sysPara->status.reclaimTankBlockedAppending){ sysPara->status.reclaimTankBlockedAppending = false; QMessageBox::StandardButton ret; ret = QMessageBox::warning(this, tr("警告"), tr("回收槽之前发生阻塞或回收槽时间设置错误,是否强制将当前位置设为到顶位置?"), QMessageBox::Ok | QMessageBox::Cancel); if (ret == QMessageBox::Ok){ sysPara->status.currReclaimTankPos = 0; // onReclainTankPositionChanged(0); } } sysPara->devOp->controlReclaimTankClose(!sysPara->devOp->isReclaimTankCloseEnable()); enablePrintButton(SIMULATE_PRINTING_MODE); sysPara->devOp->highVoltageCtrl(0); // sysPara->status.reclaimTankstatus = 2; // setRunStatus(sysPara->devOp->isReclaimTankCloseEnable()?tr("正在关闭回收槽..."):tr("停止关闭")); setReclaimStatus(false, 100); if(!sysPara->para.reclaimTankTime){ // LogInfo::setRunStatusText(tr("警告!回收槽开关时间未设置!")); } sysPara->status.currReclaimOperationCnt = 0; sysPara->status.reclainTankReachEnd = false; sysPara->status.reclainOpenAppending = false; sysPara->status.reclainCloseAppending = true; sysPara->status.reclaimBlockedCnt = 0; enablePrintButton(false); } } void MainWidget::on_m_ManageBtn_clicked() { #if defined(ARCH_X86) m_fileManageWidget->show(); #else m_fileManageWidget->showFullScreen(); #endif } void MainWidget::slt_setNum() { // 预设值 if(m_setNumDlg->getIsSet()) { unsigned int num = m_setNumDlg->getNum(); ui.labelTotalProductCnt->setText(QString::number(num)); ui.labelTotalProductCnt->show(); ui.lb_counter->show(); } else { ui.labelTotalProductCnt->hide(); ui.lb_counter->hide(); } // 当前值 if (m_setNumDlg->getIsSetCur()) { unsigned int curNum = m_setNumDlg->getCurNum(); ui.labelProductCnt->setText(QString::number(curNum)); } } static int oldSizeFpga = -1; static int oldsizeSTM32 = -1; static int reclaimTankDelay = 0; void MainWidget::updateSysStatusToUI(){ //100ms if(sysPara){ RefreshStatusLight(); if(sysPara->status.lastProductCnt != sysPara->status.productCnt){ //产品计数 updateTotalCnt(0); } if(sysPara->status.ExpiryDispUpdate >0 ) { sysPara->status.ExpiryDispUpdate--; m_PrintDisplay->update();// 2018.5.25 } /*--------------------------------------------------------------------------*/ //if(sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER && printintFlag){ //同步器速度 if(( (sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER) ||(((sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL) ||(sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE) )&& sysPara->para.eleEyeTriggerSynPrintEn) ) )//&&printintFlag { if(sysPara->para.synPulseNumPerMm) { unsigned int tmp = ((unsigned int) sysPara->status.synPulseCntPer1s ) & 0xffffff; unsigned int mm = tmp /sysPara->para.synPulseNumPerMm * 60; // 1min总脉冲/毫米脉冲数 = 1min走过的距离mm数 int dotNum = sysPara->para.divideRatio?(FPGA_SYS_HZ/(sysPara->para.divideRatio*2)):0;// 1s时间内墨点数 (即晶振频率 64000) int colNum = sysPara->para.dotNumPerCol?dotNum/sysPara->para.dotNumPerCol:0; // 第列可用墨点数 = 1s时间内墨点数/ 列需要墨点数 int pulseNum = colNum*sysPara->para.synNumPerCol/(1<<8); //synNumPerCol是被放大后的值 int maxMM = 0; if(!sysPara->para.charWidthSetEnable) { if( (sysPara->status.currPrintRow != 0) && (sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER) /*&& (sysPara->para.currPrintMode == FAST_PRINT || sysPara->para.currPrintMode == STANDARD_PRINT) */){ maxMM = calculateMaxSpeed(pulseNum); maxMM = maxMM *60; if(sysPara->para.alterPrint.enable) { maxMM = maxMM * 2; } } else { maxMM = (pulseNum/sysPara->para.synPulseNumPerMm) * 60;// 列的最大间距 // qDebug()<< "[Info] OLD COUNT mm" << maxMM; } } else { int pulsePS = getMaxSpeedCalcPara();//No67 maxMM = (pulsePS/sysPara->para.synPulseNumPerMm) * 60;// 列的最大间距 } // ui->labelSynRate->setText(tr("%1.%2[%3.%4]米/分").arg(mm/1000).arg(mm%1000,3,10,QLatin1Char('0')) // .arg(maxMM/1000).arg(maxMM%1000,3,10,QLatin1Char('0'))); // 20260414 ui.lb_curSpeed->setText(tr("%1.%2").arg(mm/1000).arg(mm%1000,3,10,QLatin1Char('0'))); ui.lb_maxSpeed->setText(tr("%1.%2").arg(maxMM/1000).arg(maxMM%1000,3,10,QLatin1Char('0'))); } else { ui.lb_curSpeed->setText("0"); ui.lb_maxSpeed->setText("0"); } // else // ui->labelSynRate->setText(""); sysPara->status.lastSynPulseCntPer1s = sysPara->status.synPulseCntPer1s; } else { ui.lb_curSpeed->setText("0"); ui.lb_maxSpeed->setText("0"); } // else // ui->labelSynRate->setText(""); /*--------------------------------------------------------------------------*/ if(sysPara->status.lastSynColDelay != sysPara->status.synColDelay){ // if(sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER) if((sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER) ||((sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_VOLTATE_LEVEL ||sysPara->para.printTriggerMode == PRINT_TRIGGER_ELEC_EYE_EDGE) && sysPara->para.eleEyeTriggerSynPrintEn)) // ui->labelSynColDelay->setText(tr("列延时:%1点").arg(sysPara->status.synColDelay)); sysPara->status.lastSynColDelay = sysPara->status.synColDelay; } /*--------------------------------------------------------------------------*/ static int i=0; i++; if(sysPara->status.stm32Verion == 0){ if(i % 10 == 0){ sysPara->devOp->readSTM32Version(); } } if(sysPara->status.stm32Time == 0){ if(i % 10 == 0){ sysPara->devOp->readSTM32Time(); } } if(sysPara->status.fpgaVersionNum == 0){ //因为进入系统就会进主界面,马上就会将版本号读出 if(i % 10 == 0){ sysPara->devOp->readFpgaVersionNum(); sysPara->devOp->readbuilDat(); } // ui->labelFpgaVersionNum->setText(QString("%1/F%2.%3.%4").arg(SOFTWARE_VER_NUM).arg(0).arg(0).arg(0) ); } else{ static bool logflag5 = true; unsigned int num = sysPara->status.fpgaVersionNum & 0xf000; if(num != 0x1000 && num != 0x6000 && num != 0x2000 && num != 0x8000 && logflag5){ //未读取到版本号 sysPara->status.fpgaVersionNum = 0; } else if(logflag5){ // emit readFPGAVersionReady(); logflag5 = false; sysPara->devOp->writeFpgaPrintPara(true); QString ARM_Version; ARM_Version.sprintf("%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); // ui->labelFpgaVersionNum->setText(QString("A%1/F%2.%3.%4").arg(ARM_Version).arg(sysPara->status.fpgaVersionNum >> 12) // .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff) ); QString versionStr = QString("A%1/F%2.%3.%4").arg(ARM_Version).arg(sysPara->status.fpgaVersionNum >> 12) .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff); emit showVserionInfo(versionStr); } } static bool logflag6 = false; if(!logflag6){ if(sysPara->status.fpgaVersionNum !=0 && sysPara->status.stm32Verion != 0){ UpdateUIVersion(); logflag6 = true; } } bool found_CNT1 = false; bool found_CNT2 = false; bool found_CNT3 = false; bool found_CNT4 = false; /*--------------------------------------------------------------------------*/ // if(sysPara->status.variNum && (ui->stackedWidgetText->currentWidget() == ui->pagePrintTextDisplay)){ if(sysPara->status.variNum){ bool updatePrintTextDisplayFlag = false; for(int i = 0; i < sysPara->status.variNum; i++){ int val = 0; switch( Public::getType(sysPara->status.vars[i].type)) { case CALANDAR_YEAR:val = sysPara->status.calandar_and_dat.year;break; case CALANDAR_MONTH:val = sysPara->status.calandar_and_dat.month;break; case CALANDAR_DAY:val = sysPara->status.calandar_and_dat.day;break; case CALANDAR_WEEK:val = sysPara->status.calandar_and_dat.week;break; case CALANDAR_HOUR:val = sysPara->status.calandar_and_dat.hour;break; case CALANDAR_MINUTE:val = sysPara->status.calandar_and_dat.minute;break; case CALANDAR_SECOND:val = sysPara->status.calandar_and_dat.second;break; case CALANDAR_CNT1:val = QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt();found_CNT1=true;break; case CALANDAR_CNT2:val = QString::number(sysPara->status.calandar_and_dat.cnt2CurrValue,16).toInt();found_CNT2=true;break; case CALANDAR_CNT3:val = QString::number(sysPara->status.Status_Counter3.cnt3CurrValue,16).toInt();found_CNT3=true;break; case CALANDAR_CNT4:val = QString::number(sysPara->para.cnt4CurrValue,10).toInt();found_CNT4=true;break; case RANDOMNUM : val = QString::number( sysPara->status.calandar_and_dat.RandomValue1, 16).toInt(); break; case CALANDAR_XDAY:val = sysPara->status.XXXDay;break; case EXPIRYDATE: break; default:qDebug() << "error,unknown variable type:" << sysPara->status.vars[i].type; } if(sysPara->status.vars[i].currVal != val) //{ updatePrintTextDisplayFlag = true; sysPara->status.vars[i].currVal = val; //} } if(updatePrintTextDisplayFlag) //减少不必要的刷新动作 { m_PrintDisplay->updateSysStatusToUI(); } } // emit setCNT1Select(found_CNT1); // emit setCNT2Select(found_CNT2); // emit setCNT3Select(found_CNT3); if(sysPara->para.isEnableGetDataButton) { // ui->pushButtonGetData->setEnabled(true); } else { // ui->pushButtonGetData->setEnabled(false); } if(TEST_MODE) enablePrintButton(true); // ui->label_size->setText(tr("%1/%2/%3").arg(sysPara->status.sizeFPGA).arg(sysPara->status.sizequeueFPGA).arg(sysPara->status.sizeSTM32)); if(oldSizeFpga != sysPara->status.sizeFPGA){ oldSizeFpga = sysPara->status.sizeFPGA; } if(oldsizeSTM32 != sysPara->status.sizeSTM32){ oldsizeSTM32 = sysPara->status.sizeSTM32; } /*if(sysPara->status.reclaimTankstatus == 6){ sysPara->status.flagOfRebootEnable = true; reclaimTankDelay = 0; } if(sysPara->status.flagOfRebootEnable && sysPara->status.reclaimTankstatus != 0 && sysPara->status.reclaimTankstatus != 6 && sysPara->status.reclaimTankstatus != 3){ sysPara->status.flagOfRebootEnable = false; }*/ if(sysPara->status.currReclaimTankPos <= 5) sysPara->status.flagOfRebootEnable = true; else sysPara->status.flagOfRebootEnable = false; if(sysPara->status.flagOfRebootEnable || TEST_MODE){ // ui->pushButton_Reboot->setEnabled(true); }else{ // ui->pushButton_Reboot->setEnabled(false); } if(sysPara->RFIDPara.inkCardTimeOut || sysPara->RFIDPara.solventCardTimeOut || sysPara->RFIDPara.needMaintenance) m_RightBtn->setEnabled(false); else if(sysPara->status.selfCheckDone == 1) { m_RightBtn->setEnabled(true); } } } bool MainWidget::checkRed(AlarmStatus &status) { if (status.highVoltageFault == DEV_STATUS_RED) { m_stateStr = tr("高压故障"); return true; } if (status.chargeFault == DEV_STATUS_RED) { m_stateStr = tr("相位故障"); return true; } if (status.viscosityWarn == DEV_STATUS_RED) { m_stateStr = tr("粘度故障"); return true; } if (status.recycleWarn == DEV_STATUS_RED) { m_stateStr = tr("回收故障"); return true; } if (status.solveLevelWarn == DEV_STATUS_RED) { m_stateStr = tr("溶液液位"); return true; } if (status.inkWaterLevel == DEV_STATUS_RED) { m_stateStr = tr("墨水液位"); return true; } if (status.inkLeak == DEV_STATUS_RED) { m_stateStr = tr("墨水缸满"); return true; } if (status.inkSwint == DEV_STATUS_RED) { m_stateStr = tr("墨线开关"); return true; } return false; } bool MainWidget::checkYellow(AlarmStatus &status) { if (status.highVoltageFault == DEV_STATUS_YELLOW) { m_stateStr = tr("高压故障"); return true; } if (status.chargeFault == DEV_STATUS_YELLOW) { m_stateStr = tr("相位故障"); return true; } if (status.viscosityWarn == DEV_STATUS_YELLOW) { m_stateStr = tr("粘度故障"); return true; } if (status.recycleWarn == DEV_STATUS_YELLOW) { m_stateStr = tr("回收故障"); return true; } if (status.solveLevelWarn == DEV_STATUS_YELLOW) { m_stateStr = tr("溶液液位"); return true; } if (status.inkWaterLevel == DEV_STATUS_YELLOW) { m_stateStr = tr("墨水液位"); return true; } if (status.inkLeak == DEV_STATUS_YELLOW) { m_stateStr = tr("墨水缸满"); return true; } if (status.inkSwint == DEV_STATUS_YELLOW) { m_stateStr = tr("墨线开关"); return true; } return false; } void MainWidget::updateGeneralState(AlarmStatus status) { // 有红则红,全绿则绿,红>黄>绿 // 检查从后往前判断,因为取最后一个状态QString bool isRed = checkRed(status); if (isRed) { m_stateColor = DEV_STATUS_RED; } else { bool isYellow = checkYellow(status); if (isYellow) { m_stateColor = DEV_STATUS_YELLOW; } else { m_stateColor = DEV_STATUS_GREEN; m_stateStr= tr("正常"); } } if (m_stateColor == DEV_STATUS_GREEN) { ui.fra_state->setStyleSheet("background-color: #ccffcc;"); } else if (m_stateColor == DEV_STATUS_RED) { ui.fra_state->setStyleSheet("background-color: #ff6b6b;"); } else { ui.fra_state->setStyleSheet("background-color: #ffd93c;"); } ui.lb_generalState->setText(m_stateStr); } int MainWidget::calculateMaxSpeed(int backup) { float stroke; int valid_array; int rongdian = 0; int mm; int oscfreq = 0; // QSizeF size = ui->textEdit->document()->size(); switch (sysPara->para.oscillatoFreq) { case CRYS_64K: oscfreq = 64000; break; case CRYS_76K: oscfreq = 76000; break; case CRYS_96K: oscfreq = 96000; break; case CRYS_128K: oscfreq = 128000; break; default: break; } stroke = sysPara->para.printColDelay/sysPara->para.synPulseNumPerMm; rongdian = sysPara->status.currPrintRow * (float)sysPara->para.reducedPixelNumRatio/100; valid_array = sysPara->status.currPrintRow - rongdian; switch (sysPara->para.currPrintMode) { case FAST_PRINT: mm = (float)(stroke * oscfreq /(sysPara->status.currPrintRow +1)); break; case STANDARD_PRINT: mm = (float)( (stroke * oscfreq) / (valid_array * 2)); break; case SLOW_PRINT_ONE: mm = (float)( (stroke * oscfreq) / (valid_array * 3)); break; case SLOW_PRINT_TWO: mm = (float)( (stroke * oscfreq) / (valid_array * 4)); break; case SLOW_PRINT_THR: mm = (float)( (stroke * oscfreq) / (valid_array * 5)); break; case SLOW_PRINT_FOR: mm = (float)( (stroke * oscfreq) / (valid_array * 6)); break; case SLOW_PRINT_FIV: mm = (float)( (stroke * oscfreq) / (valid_array * 7)); break; case SLOW_PRINT_SIX: mm = (float)( (stroke * oscfreq) / (valid_array * 8)); break; case SLOW_PRINT_SEV: mm = (float)( (stroke * oscfreq) / (valid_array * 9)); break; case SLOW_PRINT_EIG: mm = (float)( (stroke * oscfreq) / (valid_array * 10)); break; case SLOW_PRINT_NIE: mm = (float)( (stroke * oscfreq) / (valid_array * 11)); break; default: mm = backup/sysPara->para.synPulseNumPerMm; break; } return mm; } int MainWidget::getMaxSpeedCalcPara(){ sysPara->para.printRowDelay = sysPara->para.currPrintMode; if(sysPara->status.isPrinting == false) sysPara->status.pixNumPerCol = sysPara->status.currPrintRow; else sysPara->status.currPrintRow = sysPara->status.pixNumPerCol; sysPara->para.pixNumPerCol = sysPara->status.pixNumPerCol; sysPara->para.reducedPixelNum = sysPara->para.reducedPixelNumRatio*sysPara->para.pixNumPerCol/100; int dotNumPerCol = (sysPara->para.pixNumPerCol- sysPara->para.lineEndAdjustPointCnt)*(sysPara->para.printRowDelay + 1) + (sysPara->para.lineEndAdjustPointCnt)*(sysPara->para.lineEndAdjustPointDelay + 1); dotNumPerCol = sysPara->para.pixNumPerCol? ((dotNumPerCol*(sysPara->para.pixNumPerCol - sysPara->para.reducedPixelNum))/sysPara->para.pixNumPerCol):1; // sysPara->para.dotNumPerCol += sysPara->para.printColDelay; dotNumPerCol =( sysPara->para.alterPrint.enable)? dotNumPerCol/2:dotNumPerCol; int dotNum = sysPara->para.divideRatio?(FPGA_SYS_HZ/(sysPara->para.divideRatio*2)):0;// 1s时间内墨点数 (即晶振频率 64000) int colNum = dotNumPerCol?dotNum/dotNumPerCol:0; // 第列可用墨点数 = 1s时间内墨点数/ 列需要墨点数 int pulseNum = colNum*sysPara->para.synNumPerCol/(1<<8); //synNumPerCol是被放大后的值 return pulseNum; } void MainWidget::onPreviewScene() { sysPara->para.EditMode = SCENE; pPicScene->clearSelection(); QSize size(pPicScene->itemsBoundingRect().width(),pPicScene->itemsBoundingRect().height()); if(size.isEmpty()) { //场景为空时,渲染空场景并刷新界面 handleEmptySize(); return; } QImage image(size,QImage::Format_ARGB32); image.fill(0x00ffffff);//填充白色 //image.save("./printScene.jpg");//图片 QPainter painter(&image); pPicScene->render(&painter,QRectF(),pPicScene->itemsBoundingRect()); int coldot=0; if(sysPara){ bool MaxCol4000; if(sysPara->status.flagOfNo67FPGA) MaxCol4000 = true; else MaxCol4000 = false; previewFlag=1; sysPara->status.currPrintRow = 0; sysPara->status.variNum = 0; sysPara->status.QRvariNum = 0; unsigned char *dat; if(MaxCol4000){ dat =sysPara->status.printDat_Normal; memset(dat,0,sizeof(sysPara->status.printDat_Normal)); }else{ dat =sysPara->status.printDat; memset(dat,0,sizeof(sysPara->status.printDat)); } //qDebug()<<"Preview:"; { sysPara->status.addSpace = sysPara->para.checkSpace; coldot = (int)m_textEdit->document()->size().width(); coldot = pPicScene->itemsBoundingRect().width(); if(coldot > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)) coldot = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide; int maxPicHeight = MAX_PRINT_ROW_NUM + 12; QSize size(coldot,maxPicHeight); sysPara->status.currPrintRow =0; sysPara->status.currPrintCol = coldot + ( sysPara->status.addSpace?coldot:0) ; //checkSpace QImage image(size,QImage::Format_ARGB32); image.fill(0x00ffffff);//填充白色 QPainter painter(&image); QRectF validRectF(pPicScene->itemsBoundingRect().x(),pPicScene->itemsBoundingRect().y(),coldot,maxPicHeight); pPicScene->render(&painter,QRectF(),validRectF); int firstRow = 0; int lastRow = firstRow + MAX_PRINT_ROW_NUM; int TempVarNum=0; int varLastRow=0; lastRow = (lastRow>maxPicHeight)?maxPicHeight:lastRow; //接下来就是要把打印到数据data填充以及确认变量的个数,变量对应的开始列和结束行 for(int j = 0; j < lastRow - firstRow; j++){ // Y for(int i = 0; i < coldot; i++){ // QRgb rgb = image.pixel(i,j + firstRow); if(rgb&0x80000000){ //判断alpha if((rgb & 0xf0f0ff) == 0xf0f000){ //处理变量, 查找左下角,因为同一行的左下角是对齐的 看起来这个颜色是黄色 bool foundvar=0; if(j>0){ QRgb r_rgb = image.pixel(i,j + firstRow+1); if((r_rgb & 0xf0f0ff) != 0xf0f000 ){foundvar =1;} //QRgb r_rgb = image.pixel(i,j + firstRow-1);if((r_rgb & 0xf0f0ff) == 0xf0f000 )foundvar =0; } if(foundvar){ if(sysPara->status.variNum < MAX_VARI_NUM){ sysPara->status.vars[sysPara->status.variNum].startColPos = i+(sysPara->status.addSpace?i:0); sysPara->status.vars[sysPara->status.variNum].endRowPos = j; //if(varLastRowstatus.variNum ++;TempVarNum++; //i+=5;//scene 每一行可能都包含变量 //qDebug()<<"VARr:"<status.QRvariNum>=4)continue; if((rgb & 0x00ffff0) == 0x00ff10) { //MDT sysPara->print.QRvars[sysPara->status.QRvariNum].type=MDT; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0); sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1; if(varLastRowstatus.QRvariNum++; } else if((rgb & 0x00ffff0) == 0x00ff20) { //QR sysPara->print.QRvars[sysPara->status.QRvariNum].type=QR; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0); sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1; if(varLastRowstatus.QRvariNum++; } else if((rgb & 0x00fffff0) == 0x00ff30) { //BAR sysPara->print.QRvars[sysPara->status.QRvariNum].type=BAR; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0); sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1; if(varLastRowstatus.QRvariNum++; } if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4; } else if((rgb & 0x00ffffff)==EXPIRY_VARI_RECONISE) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 bool foundExVar=0; if(j>0){ QRgb r_rgb = image.pixel(i,j + firstRow+1); if((r_rgb & 0x00ffffff) != EXPIRY_VARI_RECONISE ){foundExVar =1;} } if(foundExVar) { if(sysPara->status.ExpiryVarNum <2) { sysPara->print.ExpiryVar.startColPos = i+(sysPara->status.addSpace?i:0); sysPara->print.ExpiryVar.endRowPos = j; if(varLastRowstatus.ExpiryVarNum ++; i+=5; } //else TempVarNum++; //dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点 } } else if((rgb & 0xfffff0)==0xff0cf0) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 bool foundExVar=0; if(j>0){ QRgb r_rgb = image.pixel(i,j + firstRow+1); if((r_rgb & 0xfffff0) != 0xff0cf0 ){foundExVar =1;} } if(foundExVar) { if(sysPara->status.ExpiryVarNum <2) { sysPara->print.CurDateVar.startColPos = i+(sysPara->status.addSpace?i:0); sysPara->print.CurDateVar.endRowPos = j; if(varLastRowstatus.CurrDateVariNum ++; i+=5; } //else TempVarNum++; //dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点 } } else if((rgb & 0xffffff)==0xff00ff) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 { if(sysPara->status.classVariNum <3) { EXPIRYVAR_t *currCLass = &sysPara->print.ClassVari ; currCLass->day = QDateTime::currentDateTime().date().day(); currCLass->startColPos = i+(sysPara->status.addSpace?i:0); currCLass->endRowPos = j; if(varLastRowstatus.classVariNum ++; i+=5; } } } else { //Y = 0.299*R' + 0.587*G' + 0.114*B //非变量 int y = (((rgb&0xff)*299 + ((rgb>>8)&0xff)*587 + ((rgb>>16)&0xff)*114))/1000; //qDebug()<<"y:"<status.addSpace?i:0)) + j/8] |= 1 << (j%8); //画黑点 if((j+1) > sysPara->status.currPrintRow) { sysPara->status.currPrintRow = j+1; //qDebug()<<"dddd currPrintRow:"<< sysPara->status.currPrintRow; } } } }/*判断alpha end*/ } } if(TempVarNum>MAX_VARI_NUM){ setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!")); strTitle= tr("变量数大于8个,某些变量将不起作用!!!"); strTitle.append("\r\n"); strTitle.append(tr("请减少信息中的变量(或计数器)数量.")); QMessageBox::warning(this, tr("警告"),strTitle,QMessageBox::Ok); } searchQrVar(); sysPara->status.variNum = 0; sysPara->status.ExpiryVarNum = 0; sysPara->print.ExpiryVar.startColPos = 0; sysPara->print.ExpiryVar.endRowPos = 0; sysPara->print.ExpiryVar.letterSpace =0; sysPara->print.CurDateVar.startColPos = 0; sysPara->print.CurDateVar.endRowPos = 0; sysPara->print.CurDateVar.letterSpace = 0; sysPara->status.CurrDateVariNum = 0; sysPara->status.QRvariNum=0;//lch add int myvariNum=0; int expiryVarNum = 0; QList items = pPicScene->items(); foreach (QGraphicsItem *item, items) { PicTextItem *picText = qgraphicsitem_cast(item); bool ok; int textvariNum=0; int textColdot=0; textColdot = picText->boundingRect().width(); if(textColdot > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)) textColdot = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide; int maxTextHeight = MAX_PRINT_ROW_NUM + 12; QSize textSize(textColdot, maxTextHeight); QImage textImage(textSize,QImage::Format_ARGB32); textImage.fill(0x00ffffff);//填充白色 //image.fill(0x00f0f000);//填充白色 QPainter textPainter(&textImage); //textImage.save("./textImage.jpg"); //QRectF validtextRectF(picText->pos().x(),picText->pos().y(),textColdot,maxTextHeight); QRectF validtextRectF(picText->pos().x(),picText->pos().y(),textColdot,picText->document()->size().height()); pPicScene->render(&textPainter,QRectF(),validtextRectF); //qDebug()<<"validtextRectF:"<pos().x() - pPicScene->itemsBoundingRect().x(); textItemPosY = picText->pos().y() - pPicScene->itemsBoundingRect().y(); //接下来就是要把打印到数据data填充以及确认变量的个数,变量对应的开始列和结束行 for(int j = 0; j < textLastRow - textFirstRow; j++){ // Y for(int i = 0; i < textColdot; i++){ // QRgb rgb = textImage.pixel(i,j + textFirstRow); if((rgb&0x80000000)){ //判断alpha if((rgb & 0xf0f0ff) == 0xf0f000){ //处理变量, 查找左下角,因为同一行的左下角是对齐的 看起来这个颜色是黄色 bool textfoundvar = 0; if(j>0){ QRgb r_rgb = textImage.pixel(i,j + textFirstRow+1); if((r_rgb & 0xf0f0ff) != 0xf0f000 ) { textfoundvar =1; } } if(textfoundvar){ //qDebug()<<"general variable"; if(sysPara->status.variNum < MAX_VARI_NUM){ sysPara->status.vars[sysPara->status.variNum].startColPos = i+(sysPara->status.addSpace?i:0)+textItemPosX; sysPara->status.vars[sysPara->status.variNum].endRowPos = j+textItemPosY; //qDebug()<<"sysPara->status.variNum:"<status.variNum; //qDebug()<<"startColPos:"<status.vars[sysPara->status.variNum].startColPos; //qDebug()<<"endRowPos:"<status.vars[sysPara->status.variNum].endRowPos; if(varLastRowstatus.variNum ++; textvariNum++; i+=5;//scene 每一行可能都包含变量 //qDebug()<<"VARr:"<itemAt(i,j+firstRow); //picText_var[i]= (PicTextItem*) gItem; //picText_var_hash.insert(picText_var[i],i); } else { textvariNum++; } } } else if( ((rgb & 0xfffff0) == 0x00ff10) || ((rgb & 0xfffff0) == 0x00ff20) ||((rgb & 0xfffff0) == 0x00ff30) ){ // 0xff00ff01(DMT) 0xff00ff02(QR) 0xff00ff03(BAR) //qDebug()<<"FLAG:"<status.QRvariNum>=4)continue; if((rgb & 0x00ffff0) == 0x00ff10) { //MDT sysPara->print.QRvars[sysPara->status.QRvariNum].type=MDT; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0)+textItemPosX; sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1+textItemPosY; if(varLastRowstatus.QRvariNum++; } else if((rgb & 0x00ffff0) == 0x00ff20) { //QR sysPara->print.QRvars[sysPara->status.QRvariNum].type=QR; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0)+textItemPosX; sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1+textItemPosY; if(varLastRowstatus.QRvariNum++; } else if((rgb & 0x00fffff0) == 0x00ff30) { //BAR sysPara->print.QRvars[sysPara->status.QRvariNum].type=BAR; sysPara->print.QRvars[sysPara->status.QRvariNum].countEn=1; sysPara->print.QRvars[sysPara->status.QRvariNum].Counter=sysPara->status.productCnt; sysPara->print.QRvars[sysPara->status.QRvariNum].startColPos=i+(sysPara->status.addSpace?i:0)+textItemPosX; sysPara->print.QRvars[sysPara->status.QRvariNum].endRowPos=j+1+textItemPosY; if(varLastRowstatus.QRvariNum++; } if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4; } //else if((rgb & 0xfffff0)==0xff00f0) else if((rgb & 0x0000ffff)==EXPIRY_VARI_RECONISE) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 //qDebug()<<"found EXPIRY_VARI_RECONISE"; bool foundExVar=0; if(j>0){ QRgb r_rgb = textImage.pixel(i,j + firstRow+1); if(((r_rgb & 0x0000ffff) != EXPIRY_VARI_RECONISE )){foundExVar =1;} } if(foundExVar) { //if(sysPara->status.ExpiryVarNum <2) { //if(sysPara->print.ExpiryVar.endRowPos==0) if(sysPara->status.ExpiryVarNum == 0) { sysPara->status.ExpiryVarNum ++; } sysPara->print.ExpiryVar.startColPos = i+(sysPara->status.addSpace?i:0)+textItemPosX; sysPara->print.ExpiryVar.endRowPos = j+textItemPosY; if(varLastRowprint.ExpiryVar.endRowPos:"<print.ExpiryVar.endRowPos; } //else TempVarNum++; //dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点 } } else if((rgb & 0xfffff0)==0xff0cf0) { // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的 bool foundExVar=0; if(j>0){ QRgb r_rgb = textImage.pixel(i,j + firstRow+1); if((r_rgb & 0xfffff0) != 0xff0cf0 ){foundExVar =1;} } if(foundExVar) { //qDebug()<<"found CurDateVar"; //if(sysPara->status.ExpiryVarNum <2) { //if(sysPara->print.CurDateVar.endRowPos==0) if(sysPara->status.CurrDateVariNum == 0) { sysPara->status.CurrDateVariNum ++; //setRunStatus(QString("CurrDateVariNum(%1)").arg(sysPara->status.CurrDateVariNum)); } sysPara->print.CurDateVar.startColPos = i+(sysPara->status.addSpace?i:0)+textItemPosX; sysPara->print.CurDateVar.endRowPos = j + textItemPosY; //qDebug()<<"CurDateVar ixj:"<print.CurDateVar.endRowPos:"<print.CurDateVar.endRowPos; if(varLastRow sysPara->status.currPrintRow) { sysPara->status.currPrintRow = j+textItemPosY; // qDebug()<<"sysPara->status.currPrintRow:"<status.currPrintRow; } }/*判断alpha end*/ } } //qDebug()<<"ExpiryVarNum:"<status.ExpiryVarNum; //===================一般变量===================== //myvariNum = 0; QString textVariPattern = ""; QRegExp textrx(textVariPattern); QString textHtml = picText->toHtml(); int from = 0; //int myvariNum=0; while(from < textHtml.size() && from != -1){ from = textHtml.indexOf(textrx,from); if(from != -1){//找到匹配的 //qDebug()<<"found variable"; from ++; //if(myvariNum < textvariNum) if(myvariNum < sysPara->status.variNum) { sysPara->status.vars[myvariNum].digitalNum = textrx.cap(3).toInt(&ok);//第二个匹配,数字到个数 sysPara->status.vars[myvariNum].bold = (sysPara->status.vars[myvariNum].digitalNum%100) == 75; if(sysPara->status.vars[myvariNum].bold) sysPara->status.vars[myvariNum].digitalNum = sysPara->status.vars[myvariNum].digitalNum/100; sysPara->status.vars[myvariNum].type = textrx.cap(2).toInt(&ok);//第一个匹配 sysPara->status.vars[myvariNum].width = textrx.cap(4).toInt(&ok)*(sysPara->status.addSpace?2:1); sysPara->status.vars[myvariNum].height = textrx.cap(5).toInt(&ok); //qDebug()<<"myvariNum endRowPos:"<status.vars[myvariNum].endRowPos; //qDebug()<<"myvariNum height:"<status.vars[myvariNum].height; sysPara->status.vars[myvariNum].startRowPos = sysPara->status.vars[myvariNum].endRowPos - sysPara->status.vars[myvariNum].height+1; //sysPara->status.vars[myvariNum].startRowPos = sysPara->status.vars[myvariNum].endRowPos - sysPara->status.vars[myvariNum].height; //qDebug()<<"start row:"<status.vars[myvariNum].startRowPos; if(sysPara->status.vars[myvariNum].startRowPos<0) sysPara->status.vars[myvariNum].startRowPos=0; int item_x_start_pos = sysPara->status.vars[myvariNum].startColPos; int item_x_end_pos = item_x_start_pos + sysPara->status.vars[myvariNum].width ; if(item_x_end_pos > (MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide)) item_x_end_pos = MaxCol4000?MAX_PRINT_COL_NUM_Normal:MAX_PRINT_COL_NUM_Wide; int item_y_start_pos = sysPara->status.vars[myvariNum].startRowPos; int item_y_end_pos = sysPara->status.vars[myvariNum].endRowPos+1 ; if(item_y_start_pos < 0) item_y_start_pos = 0; for(int i = item_x_start_pos; i < item_x_end_pos; i++){ for(int j = item_y_start_pos; j < item_y_end_pos; j++){ dat[MAX_PRINT_ROW_BYTE_NUM*(i+(sysPara->status.addSpace?0:0)) + j/8] &= ~(1 << (j%8)); //将画点取消掉 } } sysPara->status.vars[myvariNum].height = textrx.cap(5).toInt(&ok)-1; if(sysPara->status.vars[myvariNum].height>16 ){ if(sysPara->status.vars[myvariNum].height==24) ; else { if(sysPara->status.vars[myvariNum].startRowPos) { sysPara->status.vars[myvariNum].endRowPos--; sysPara->status.vars[myvariNum].startRowPos--; } } } if(sysPara->status.vars[myvariNum].type == RANDOMNUM) { //qDebug()<<"RAND:"<status.vars[myvariNum].type<< sysPara->status.vars[myvariNum].digitalNum; sysPara->status.RandomDigitNum = sysPara->status.vars[myvariNum].digitalNum; } int pixelSize = Public::derivePixelSizeFromHeight(sysPara->status.vars[myvariNum].height); //qDebug()<<"MainWindows"<status.vars[myvariNum].height<status.vars[myvariNum].letterSpace = 0; if(sysPara->status.vars[myvariNum].digitalNum){ //算出letterspace QFont font; //font.setFamily(Public::getFontFamily(pixelSize)); font.setFamily(Public::getFontFamily(pixelSize,sysPara->status.vars[myvariNum].type )); // 20160812 //pixelSize==7? font.setFamily(ui->textEditOption->getLabelFontFamily()->text()):font.setFamily(Public::getFontFamily(pixelSize, 0)); font.setPixelSize(pixelSize); font.setWeight(sysPara->status.vars[myvariNum].bold?QFont::Bold:QFont::Normal); //font.setLetterSpacing(QFont::AbsoluteSpacing,sysPara->para.textEditCharSpace); QFontMetrics fontMetrics(font); int charWidth = (fontMetrics.width("0123456789"))/10 ; // sysPara->status.vars[myvariNum].letterSpace = sysPara->para.textEditCharSpace; sysPara->status.vars[myvariNum].letterSpace = picText->letterSpace(); //sysPara->status.vars[myvariNum].letterSpace = //sysPara->status.vars[myvariNum].width/sysPara->status.vars[myvariNum].digitalNum/(sysPara->status.addSpace?2:1) - charWidth; } myvariNum++; } } } //==========================一般变量结束======================= //=========================有效期/生产日期变量 开始================== //qDebug()<<"sysPara->status.ExpiryVarNum"; if(sysPara->status.ExpiryVarNum || sysPara->status.CurrDateVariNum) { QString expiryPattern = ""; // 1 type ,2 name,3 width,4 height //

QRegExp expiryRx(expiryPattern); QString expiryHtml = picText->toHtml(); int from = 0; while(from < expiryHtml.size() && from != -1){ from = expiryHtml.indexOf(expiryRx,from); bool ok; //qDebug()<print.ExpiryVar.endRowPos:"<print.ExpiryVar.endRowPos; sysPara->print.ExpiryVar.type = type; sysPara->print.ExpiryVar.width = expiryRx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; sysPara->print.ExpiryVar.height = expiryRx.cap(4).toInt(&ok); //sysPara->print.ExpiryVar.startRowPos = sysPara->print.ExpiryVar.endRowPos-sysPara->print.ExpiryVar.height; sysPara->print.ExpiryVar.startRowPos = sysPara->print.ExpiryVar.endRowPos-(sysPara->print.ExpiryVar.height-1); qDebug()<<"endRow:"<print.ExpiryVar.endRowPos; qDebug()<<"startRow:"<print.ExpiryVar.startRowPos; qDebug()<<"height:"<print.ExpiryVar.height; if(expiryRx.cap(2).contains("875")) { //qDebug()<<"ExpiryVar:Bold"; sysPara->print.ExpiryVar.bold = 1; } else { //qDebug()<<"ExpiryVar:normal"; sysPara->print.ExpiryVar.bold = 0; } // 直接更新有效期,并退出? ExpiryDotUpdate(1); expiryVarNum++; } else if(type==CURDATE || type==CURDATE + 10 || type==CURDATE + 20) { //currDate //qDebug()<<"CurDateVar:"<print.CurDateVar.type = type; sysPara->print.CurDateVar.width = expiryRx.cap(3).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ; sysPara->print.CurDateVar.height = expiryRx.cap(4).toInt(&ok); //sysPara->print.CurDateVar.startRowPos = sysPara->print.CurDateVar.endRowPos-sysPara->print.CurDateVar.height; sysPara->print.CurDateVar.startRowPos = sysPara->print.CurDateVar.endRowPos-(sysPara->print.CurDateVar.height-1); //qDebug()<<"CurDateVar:startRowPos"<print.CurDateVar.startRowPos<<" height"<print.CurDateVar.height; // 生产日期即当前日期 if(expiryRx.cap(2).contains("875")) { //qDebug()<<"CurDateVar:Bold"; sysPara->print.CurDateVar.bold = 1; } else { //qDebug()<<"CurDateVar:normal"; sysPara->print.CurDateVar.bold = 0; } ExpiryDotUpdate(2); expiryVarNum++; } } else break; } } } //=========================有效期/生产日期变量 结束================== } /*--------------------------------------------------------------------------*/ generateCharRamData(); if(sysPara->status.currPrintRow>MAX_PRINT_ROW_NUM-1)sysPara->status.currPrintRow=MAX_PRINT_ROW_NUM-1; bool found=0; lastRow = sysPara->status.currPrintRow; //qDebug()<<"lastRow:"<status.currPrintRow; j >2 ; j--){ //计算首行位置 for(int i = 0; i < coldot; i++){ if(dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] & (1 << (j%8))){ lastRow = j+1; found=1;//qDebug()<<"fOUND:"<status.currPrintRow; break; } } if(found) break; } if(lastRow>MAX_PRINT_ROW_NUM-1)lastRow = MAX_PRINT_ROW_NUM-1; if(lastRowstatus.currPrintRow =lastRow; } if(sysPara->status.QRvariNum) { // onUpdateDispQRCode(1); } int wmax = sysPara->status.currPrintRow; sysPara->status.currAlterPrintRow = sysPara->status.currPrintRow/2; if(sysPara->para.alterPrint.enable<1) sysPara->para.AlterMode=0; else { if(sysPara->para.AlterMode==0)sysPara->para.AlterMode=1; wmax = sysPara->status.currAlterPrintRow; } /*-------------------------------切换到显示窗口-----------------------------------*/ qDebug() << "currPrintCol: " << sysPara->status.currPrintCol; auto rows = sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow; rows = std::max(rows, (m_PrintDisplay->parentWidget()->height() / m_PrintDisplay->currScaleRatio())); auto cols = sysPara->status.currPrintCol; cols = std::max(cols, (m_PrintDisplay->parentWidget()->width() / m_PrintDisplay->currScaleRatio())); m_PrintDisplay->setDisplaySize(cols, rows); // ui->stackedWidgetText->setCurrentWidget(ui->pagePrintTextDisplay); // ui->stackedWidgetOption->setCurrentWidget(ui->pageOption); // ui->labelTextWidthHeight->setText(tr("[ %1行 x %2列 ]").arg(wmax).arg(sysPara->status.currPrintCol)); m_PrintDisplay->update(); } previewFlag=0; } void MainWidget::handleEmptySize() { // 初始化空场景的尺寸(默认适配打印最大尺寸,避免界面空白) bool MaxCol4000 = sysPara->status.flagOfNo67FPGA ? true : false; QSize emptySize(MaxCol4000 ? MAX_PRINT_COL_NUM_Normal : MAX_PRINT_COL_NUM_Wide, MAX_PRINT_ROW_NUM); QImage emptyImage(emptySize, QImage::Format_ARGB32); emptyImage.fill(0x00ffffff); // 填充白色背景,与正常场景渲染一致 QPainter emptyPainter(&emptyImage); pPicScene->render(&emptyPainter, QRectF(), QRectF(0, 0, emptySize.width(), emptySize.height())); // 初始化打印参数,避免空场景导致的参数异常 previewFlag = 1; sysPara->status.currPrintRow = 0; sysPara->status.currPrintCol = emptySize.width(); sysPara->status.variNum = 0; sysPara->status.QRvariNum = 0; sysPara->status.ExpiryVarNum = 0; sysPara->status.CurrDateVariNum = 0; sysPara->status.classVariNum = 0; // 清空打印数据缓冲区 unsigned char *dat = MaxCol4000 ? sysPara->status.printDat_Normal : sysPara->status.printDat; memset(dat, 0, MaxCol4000 ? sizeof(sysPara->status.printDat_Normal) : sizeof(sysPara->status.printDat)); // 刷新预览显示,显示空场景(白色背景) auto rows = sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow; rows = std::max(rows, (m_PrintDisplay->parentWidget()->height() / m_PrintDisplay->currScaleRatio())); m_PrintDisplay->setDisplaySize(m_PrintDisplay->parentWidget()->width() / m_PrintDisplay->currScaleRatio(), rows); m_PrintDisplay->update(); previewFlag = 0; return; } void MainWidget::updatePrintDisplayLabel() { m_PrintDisplay->update(); } void MainWidget::RefreshStatusLight(){//100ms if(sysPara){ static int hdint = 0; static int reclainTankReachEnd = 0; if((!(sysPara->status.statWarn & WARN_STATUS_HDINT)) && (hdint == 0)) { //喷头盖由开变关 // 检查回收槽是否到底,到底才能打印 if (sysPara->status.reclainTankReachEnd) { sysPara->devOp->highVoltageCtrl(sysPara->para.HighVoltageAmplitude); enablePrintButton(true); } else { enablePrintButton(false); } } hdint = !(sysPara->status.statWarn & WARN_STATUS_HDINT); if(sysPara->status.reclainTankReachEnd && reclainTankReachEnd == 0) { //开回收槽到底 if (!(sysPara->status.statWarn & WARN_STATUS_HDINT)) { //喷头盖是关闭的状态 sysPara->devOp->highVoltageCtrl(sysPara->para.HighVoltageAmplitude); } } reclainTankReachEnd = sysPara->status.reclainTankReachEnd; if(sysPara->status.lastStatWarn != sysPara->status.statWarn || flagOfClearHighVltageWarnning){ if(!(sysPara->status.statWarn & WARN_STATUS_INK_SWINT)){//墨线开关 // ui->labelStatusInkSwint->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.inkSwint = DEV_STATUS_GREEN; } else { // ui->labelStatusInkSwint->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.inkSwint = DEV_STATUS_RED; } if(!(sysPara->status.statWarn & WARN_STATUS_SUMP_WARN)){ //液位渗漏,高电平警告 // ui->labelStatusInkLeak->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.inkLeak = DEV_STATUS_GREEN; } else { // ui->labelStatusInkLeak->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.inkLeak = DEV_STATUS_RED; strTitle = tr("墨水缸满报警"); if(sysPara->devOp->isMixValveOpen()) { sysPara->devOp->controlMixValve(false); //关掉混合阀 } } if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN)){ // ui->labelStatusInkWaterLevel->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.inkWaterLevel = DEV_STATUS_GREEN; } else { // ui->labelStatusInkWaterLevel->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.inkWaterLevel = DEV_STATUS_RED; strTitle = tr("墨水液位报警"); } if(!(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN)){ // ui->labelStatusSolvLevelWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.solveLevelWarn = DEV_STATUS_GREEN; } else { // ui->labelStatusSolvLevelWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.solveLevelWarn = DEV_STATUS_RED; strTitle = tr("溶剂液位报警"); } if(!(sysPara->status.statWarn & WARN_STATUS_RECYCLE_FAULT) ){ // ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.recycleWarn = DEV_STATUS_GREEN; } else { // ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.recycleWarn = DEV_STATUS_RED; } //static int HVfaultCnt=0; if(!(sysPara->status.statWarn & WARN_STATUS_POWER_MON)){ if(!sysPara->status.lastHighVoltageFault) { flagOfClearHighVltageWarnning = false; // ui->labelStatusHighVoltageFault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.highVoltageFault = DEV_STATUS_GREEN; } // HVfaultCnt=0; //sysPara->status.HVFaultCloseEn=0; } else { // ui->labelStatusHighVoltageFault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.highVoltageFault = DEV_STATUS_RED; if(startPrintingFlag && printintFlag){ //已经在打印,则暂停打印 2013-9-15高压报警停止充电 // on_pushButtonPausePrint_pressed(); on_m_StopBtn_clicked(); LogInfo::setRunStatusText(tr("高压故障,暂停打印")); setRunStatus(tr("高压故障,暂停打印")); strTitle = tr("高压故障,暂停打印."); sysPara->status.lastHighVoltageFault = true; } if((sysPara->status.currReclaimTankPos != 0) && sysPara->para.HVFaultCloseEn ) { //HVfaultCnt++; // 高压故障关回收槽 if(sysPara->status.HVFaultCloseEn==0){ sysPara->status.reclaimTankBlockedAppending=0; sysPara->status.reclaimCloseCnt=100; // on_pushButtonReclaimTankClose_pressed(); on_m_LeftBtn_clicked(); sysPara->status.reclaimTankBlockedAppending=1; LogInfo::setRunStatusText(tr("高压故障,关回收槽")); setRunStatus(tr("高压故障,关回收槽和墨线")); } sysPara->status.HVFaultCloseEn=1; } } } /*-----------------------------------------------------------------------------------*/ sysPara->status.lastStatWarn = sysPara->status.statWarn; if(sysPara->status.lastViscosityFault != sysPara->status.viscosityFault){ if(sysPara->status.viscosityFault==0){ // ui->labelStatusViscosityWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.viscosityWarn = DEV_STATUS_GREEN; } else { if(sysPara->status.viscosityFault==1){ // ui->labelStatusViscosityWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); alarmStatus.viscosityWarn = DEV_STATUS_RED; } else if(sysPara->status.viscosityFault==2) { // ui->labelStatusViscosityWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMYellow.PNG"))); alarmStatus.viscosityWarn = DEV_STATUS_YELLOW; } } } sysPara->status.lastViscosityFault = sysPara->status.viscosityFault; /*-----------------------------------------------------------------------------------*/ if(!(sysPara->status.statWarn & WARN_STATUS_RECYCLE_FAULT)){ //20140211 nie if(sysPara->status.RecycleWarnCnt) alarmStatus.recycleWarn = DEV_STATUS_GREEN; // ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); sysPara->status.RecycleWarnCnt = 0; sysPara->status.lastRecycleWarn = 0; } else { if(!sysPara->status.lastRecycleWarn && !sysPara->status.isPumpValveControledByHand && sysPara->status.selfCheckDone) { if(sysPara->status.RecycleWarnCnt > RECYCLE_WARN_DELAY) { sysPara->status.lastRecycleWarn = RECYCLE_WARN_DELAY;//5s alarmStatus.recycleWarn = DEV_STATUS_RED; // ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG"))); sysPara->status.reclaimCloseCnt=100; if(sysPara->para.RecycleWarnAction) { if((sysPara->status.currReclaimTankPos != 0) && !sysPara->devOp->isReclaimTankCloseEnable()){ // on_pushButtonStopPrint_pressed(); on_m_StopBtn_clicked(); // on_pushButtonReclaimTankClose_pressed(); on_m_LeftBtn_clicked(); LogInfo::setRunStatusText(tr("回收故障,关闭回收槽,关墨线")); setRunStatus(tr("回收故障,关闭回收槽,关墨线")); } } else setRunStatus(tr("回收故障.")); } else { sysPara->status.RecycleWarnCnt ++ ; alarmStatus.recycleWarn = DEV_STATUS_YELLOW; // ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMYellow.PNG"))); if(sysPara->status.RecycleWarnCnt%10==9) LogInfo::setRunStatusText(tr("回收异常,墨线可能偏离.(%1)").arg(sysPara->status.RecycleWarnCnt)); } } else if(sysPara->status.lastRecycleWarn)sysPara->status.lastRecycleWarn--; } // if(startPrintingFlag ){ // if(printintFlag) // setRunStatus(tr("正在喷印...")); // else // setRunStatus(tr("暂停喷印...")); // } // 20160620 新增主界面显示:压力,粘度,隔膜位置,晶振电压数,相位 alarmStatus.pressValue = QString("%1/%2").arg(sysPara->status.PRESSURE).arg(sysPara->para.pressure); alarmStatus.visoValue = QString("%1/%2").arg(sysPara->status.viscosity).arg(sysPara->para.viscosity); if(sysPara->para.gearPumpEnable) { alarmStatus.gearPumpRunSpeed = QString("%1").arg(sysPara->status.gearPumpRunSpeed); } alarmStatus.highVol = QString::number(sysPara->status.HV_DETOUT) + "/" + QString::number(sysPara->para.maxHighVoltageDAC); alarmStatus.dataSize = QString("%1/%2/%3").arg(sysPara->status.sizeFPGA).arg(sysPara->status.sizequeueFPGA).arg(sysPara->status.sizeSTM32); } } bool MainWidget::updatePhaseIndicatorLight(){ if(sysPara==0) return 0; /*------------------------------------------喷头盖未关或回收槽未全部打开的时候不报相位故障-------------------------------------------------*/ if((!sysPara->status.flight_tm_error && !sysPara->status.detect_phase_error) || (sysPara->status.statWarn & WARN_STATUS_HDINT) || !sysPara->status.reclainTankReachEnd){ //故障后必须等手动按故障恢复才会继续 if(!sysPara->para.suspendAfterPhaseFault && !sysPara->para.powerOffAfterPhaseFault){ if(sysPara->status.lastPhaseFault){ sysPara->status.lastPhaseFault = 0; // ui->labelStatusChargefault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.chargeFault = DEV_STATUS_GREEN; } } sysPara->status.phaseErrorCnt = 0; } else { if(sysPara->status.phaseErrorCnt < 10) sysPara->status.phaseErrorCnt ++ ; else { if(!sysPara->status.lastPhaseFault){ alarmStatus.chargeFault = DEV_STATUS_RED; sysPara->status.lastPhaseFault = 1; if(sysPara->status.flight_tm_error) { LogInfo::setRunStatusText(tr("相位故障:飞行时间错误!")); } if(sysPara->status.detect_phase_error) { LogInfo::setRunStatusText(tr("相位故障:相位检测错误!")); } } if(sysPara->para.powerOffAfterPhaseFault ){ if(!sysPara->status.powerOffAfterPhaseFaultAppending){ sysPara->status.powerOffAfterPhaseFaultAppending = 1; _on_pushButtonPowerOff_pressed(false); LogInfo::setRunStatusText(tr("相位故障,准备关机")); setRunStatus(tr("相位故障,准备关机")); strTitle = tr("相位故障,准备关机"); } } else if(sysPara->para.suspendAfterPhaseFault){ if(sysPara->para.stopCounterMeterAfterFault){ if(startPrintingFlag && printintFlag){ //已经在打印,则暂停打印 // on_pushButtonPausePrint_pressed(); on_m_StopBtn_clicked(); LogInfo::setRunStatusText(tr("相位故障,暂停打印")); setRunStatus(tr("相位故障,暂停打印")); strTitle = tr("相位故障,暂停打印"); } } else if(!sysPara->status.DACDisable){ sysPara->devOp->printCtrl(PRINT_CTRL_DAC_DISABLE); sysPara->status.DACDisable = true; LogInfo::setRunStatusText(tr("相位故障,屏蔽DAC输出")); setRunStatus(tr("相位故障,屏蔽充电")); strTitle = tr("相位故障,屏蔽充电"); } } } } return sysPara->status.lastPhaseFault; } bool MainWidget::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseButtonDblClick) { //双击事件,设置总数xxx,打印该数量后停止 if (watched == ui.sub3 || watched == ui.labelProductCnt) { if (m_setNumDlg) { m_setNumDlg->show(); return true; } } } if (event->type() == QEvent::MouseButtonDblClick) { if (watched == ui.fra_state || ui.lb_generalState) { LogInfoCtrl::instance()->emitSigShow(); return true; } } return false; } void MainWidget::onLabelFaultRusumePressed(){ if(sysPara){ sysPara->status.flagOfSpeedAlarm = false; sysPara->status.mainInkPumpError = false; sysPara->status.mainInkPumpRunTmCnt = 0; sysPara->status.compressPumpError = false; sysPara->status.compressPumpRunTmCnt = 0; sysPara->devOp->resumeFault(); ui.lb_nozzleState->clear(); sysPara->status.beeperOnFlag = false; sysPara->devOp->controlBeeper(false); sysPara->status.heaterONTimeCnt = 0; //加热块计数清零 // ui->labelStatusChargefault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG"))); alarmStatus.chargeFault = DEV_STATUS_GREEN; sysPara->status.DACDisable = false; sysPara->status.lastPhaseFault = 0; sysPara->status.phaseErrorCnt = 0; if(sysPara->status.lastHighVoltageFault && !(sysPara->status.statWarn & WARN_STATUS_POWER_MON)){ sysPara->status.lastHighVoltageFault = false; flagOfClearHighVltageWarnning = true; } if(sysPara->status.gearPumpRunStopFlag && pushButtonFlag) { emit repeatInitedPid(); sysPara->status.gearPumpRunStopFlag = false;//齿轮泵报警恢复 } if((sysPara->devOp->color_flag == 2) ||(sysPara->devOp->color_flag == 1)) { sysPara->devOp->color_flag = 3; sysPara->devOp->controlYellowLight(false); sysPara->devOp->controlRedLight(false); } sysPara->status.visocityValueOverflowNum = 0; if(sysPara->status.visocityValueOverflowNum>=MAX_ALLOW_VISICOSITY_OVERFLOW_NUM) // sysPara->status.viscosityFault = 0; sysPara->status.powerOffAfterPhaseFaultAppending = 0; sysPara->status.lastwarmInkPump = 0; sysPara->status.RecycleWarnCnt =0; sysPara->status.lastRecycleWarn =0 ; sysPara->status.powerOffAfterInkOrSOLVEmptyAppending=0; //sysPara->status.lastStatWarn=0; // 机器报故障后,点击故障恢复按钮,再点击打印按钮,“正在喷印中…”字符未立即显示出来,需等待大约10秒才会出现。 //LogInfo::setRunStatusText(tr("故障恢复")); sysPara->status.RecycleWarnCnt=0; sysPara->status.HVFaultCloseEn=0; if(sysPara->status.flagOfPressureFault){ sysPara->status.flagOfPressureFault = false; sysPara->status.isPumpValveControledByHand = false; sysPara->devOp->mainInkCtrl(); emit clearPressureFault(); } if(printintFlag) { sysPara->devOp->highVoltageCtrl(sysPara->para.HighVoltageAmplitude); } } } extern int baudRateValue; void MainWidget::UpdateUIVersion(){ int fpgaType = sysPara->status.fpgaVersionNum>>12; QString fpgaVersion; if(sysPara->status.build_dat.builTime != 0) { fpgaVersion = QString::number(sysPara->status.build_dat.builTime); } else if(fpgaType == 6 || fpgaType == 8){ fpgaVersion = "72"; }else if(fpgaType == 1 || fpgaType == 2){ fpgaVersion = "67"; } fpgaVersion = fpgaVersion + QString("_F%1.%2.%3").arg(sysPara->status.fpgaVersionNum >> 12) .arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff); QString STM32Ver = QString("S:%1.%2.%3_B%4").arg((sysPara->status.stm32Verion>>16)&0x7F) .arg((sysPara->status.stm32Verion>>8) & 0xFF).arg(sysPara->status.stm32Verion&0xFF).arg(baudRateValue); QString VernonBach; VernonBach.sprintf("A%d.%d.%02d%s%s", UP_PRINTER_MAJOR_VER, UP_PRINTER_MINOR_VER,UP_PRINTER_RIVISION_VER,SUB_VERSION,SUB_RFID); QString Mac = QString::number(sysPara->status.machineMac); LogInfo::setRunStatusText(QString("Mac:%1").arg(Mac)); LogInfo::showVerionInformation(Mac,VernonBach,fpgaVersion,STM32Ver); }