Files
VX5-DiaphragmPump/mainwindow.cpp
T

4615 lines
198 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
*
*
*2013-9-15高压报警停止充电
*/
/*
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this, tr("警告"),
tr("是否初始化产品计数?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok){
updateTotalCnt(0);
sysPara->devOp->clearProductCnt(1);
sysPara->saveParaToFile();
}
*/
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "InputMethod.h"
#include <QVBoxLayout>
#include <InputMethod.h>
#include <QKeyEvent>
#include <QTextCodec>
#include <QTextEdit>
#include <QFont>
#include <TextEditOption.h>
#include <QDesktopWidget>
#include <DevOp.h>
#ifndef Q_OS_WIN
#include <sys/reboot.h>
#else
#define reboot(a,...) (0 == 0)
#endif
#include <QPainter>
#include <QImage>
#include <QRgb>
#include <QDebug>
#include <QScrollBar>
#include <QFontMetrics>
#include <QChar>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include "DevOp.h"
#include "Public.h"
#include "LogInfo.h"
#include "QBarCode.h"
#include "scene/picscene.h"
#include <QGraphicsItem>
#include "MyInputMethod.h"
#include <QTextBlockFormat>
#include "VerBVersion.h"
//#define SAVEWHENPREVIEW // 预览时先保存
#include <string>
#include <iostream>
#include <cstring>
#define MDTFLAG 0xff00FF10
#define QRFLAG 0xff00FF20
#define BARFLAG 0xff00FF30
// 统一使用相同的掩码和比较值
#define COLOR_MASK 0x00FFFFF0 // 忽略 Alpha 通道
// 定义比较用的 RGB 值
#define MDT_RGB 0x00FF10
#define QR_RGB 0x00FF20
#define BAR_RGB 0x00FF30
#define MMVAR 1
#define MAX_ALLOW_VISICOSITY_OVERFLOW_NUM 120 //连续超那么多次,会被认为粘度故障
#define EXPIRY_VARI_RECONISE 0x0000FF
#define RECICLARNUMBER 22
int firstGetFpgaVersionNumFlag=0;
static int weekendPowerOff = 0;
unsigned char test_flag,open_close;
extern QFile PrintDatafile;
extern MyInputMethod *myInputMethod;
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); //不使用布局
//ui->textEdit->verticalScrollBar()->setStyleSheet("QScrollBar:vertical { width: 40px; }");
QFont font = ui->textEdit->font();
font.setPixelSize(12);
ui->textEdit->setFont(font);
previewFlag =0;
ui->textEditOption->bindText(ui->textEdit);
ui->textEditOption->bindPicWidget(ui->PicWidgetDisp);
ui->textEditOption->bindStackWidget(ui->stackedWidgetOption,ui->stackedWidgetText);
//ui->textEditOption->setl
#ifdef _2DCODE_
// dlgqrcode = new dlgQrCode();
dlgqrcode = ui->textEditOption->qrcode; // 实时更新二维码,使用同一个界面
//barcode = ui->textEditOption->barcode;
barcode = new QBarCode();
#endif
//ui->pushButtonEditBarCode->hide();
connect(ui->labelFaultResume,SIGNAL(pressed()),this,SLOT(onLabelFaultRusumePressed()));
#ifdef EnableArabic
connect(ui->textEditOption,SIGNAL(fontSizeArabicSelect(bool)),myInputMethod,SLOT(getArabicFlag(bool)));
connect(myInputMethod,SIGNAL(selectArabicPage(int)),ui->textEditOption,SLOT(changeArabicPage(int)));
connect(myInputMethod,SIGNAL(switchEnglishOrArabic(bool)),ui->textEditOption,SLOT(swithchEnglisOrArabic(bool)));
connect(ui->textEditOption,SIGNAL(EnableSwitchArabicFlag(bool)),myInputMethod,SLOT(switchArabicFlag(bool)));
#endif
connect(ui->labelStatusHighVoltageFault,SIGNAL(pressed()),this,SLOT(onStatusHighVoltageFault()));
connect(ui->labelStatusInkLeak,SIGNAL(pressed()),this,SLOT(onStatusInkLeak()));
connect(ui->labelStatusInkSwint,SIGNAL(pressed()),this,SLOT(onStatusInkSwint()));
connect(ui->labelStatusInkWaterLevel,SIGNAL(pressed()),this,SLOT(onStatusInkWaterLevel()));
connect(ui->labelStatusRecycleWarn,SIGNAL(pressed()),this,SLOT(onStatusRecycleWarn()));
connect(ui->labelStatusSolvLevelWarn,SIGNAL(pressed()),this,SLOT(onStatusSolvLevelWarn()));
connect(ui->labelStatusViscosityWarn,SIGNAL(pressed()),this,SLOT(onStatusViscosityWarn()));
connect(ui->labelStatusChargefault,SIGNAL(pressed()),this,SLOT(onStatusChargefault()));
//connect(ui->labelStatu,SIGNAL(pressed()),this,SLOT(on())); labelStatusChargefault
//connect(ui->labelStatu,SIGNAL(pressed()),this,SLOT(on()));
connect(ui->textEdit,SIGNAL(textChanged ()),this,SLOT(ontextEdittextChanged()));
connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(onTextEditCursorPositionChanged()));
connect(ui->textEdit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), ui->textEditOption, SLOT(currentCharFormatChanged(QTextCharFormat)));
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(displayTime()));
timer->start(1000);
airPushTimer = new QTimer(this);
connect(airPushTimer, SIGNAL(timeout()), this, SLOT(airPushingProcess()));
timerShowItem = new QTimer(this);
connect(timerShowItem, SIGNAL(timeout()), this, SLOT(onShowAndHideItem()));
timerPowerOff = new QTimer(this);
connect(timerPowerOff,SIGNAL(timeout()),this,SLOT(sendPowerOffCmd()));
printingFlag = false;
startPrintingFlag = false;
connect(ui->labelProductCnt,SIGNAL(pressed()),this,SLOT(onLabelProductCntPressed()));
connect(ui->labelTotalProductCnt,SIGNAL(pressed()),this,SLOT(onLabelTotalProductCntPressed()));
connect(ui->textEditOption->getPushButtonPreview(),SIGNAL(pressed()),this,SLOT(onPushButtonPreviewPressed()));
#ifndef EnableArabic
connect(ui->textEditOption,SIGNAL(fileNameChanged(QString)),ui->labelOpenedFileName,SLOT(setText(QString)));
#else
connect(ui->textEditOption,SIGNAL(fileNameChanged(QString)),this,SLOT(setOpenFileName(QString)));
#endif
connect(ui->textEditOption,SIGNAL(fileNameChanged(QString)),this,SLOT(changeTxtMode(QString)));
//edit@02-07
connect(ui->textEditOption,SIGNAL(switchBengalLanguage(bool)),myInputMethod,SLOT(switchBangalInput(bool)));
connect(ui->textEditOption,SIGNAL(PicfileNameOpen(QString,bool)),this,SLOT(openPicFIleOpen(QString,bool))); // 由TEXTOPTION界面按键触发
connect(ui->pushButtonTXTOpen,SIGNAL(clicked()),ui->textEditOption,SLOT( showDlg()));
connect(ui->pushButtonCNTResetNow,SIGNAL(pressed()),this,SLOT(onPushButtonCNTResetNowPressed()));
#ifdef _2DCODE_
connect(ui->pushButtonEditBarCode,SIGNAL(pressed()),this,SLOT(onEditBarCode()));
connect(ui->pushButtonQREnCode,SIGNAL(pressed()),this,SLOT(onEditQRCode()));
connect(ui->textEditOption, SIGNAL(fontSizeChange(int)), barcode, SLOT(setFontSize(int)));
connect(barcode,SIGNAL(onBarCodeClose()),this,SLOT(onBarCodeClose()));
connect(dlgqrcode,SIGNAL(onQRCodeCloseNow()),this,SLOT(onQRCodeClose()));
//专门处理网络发送的二维码
connect(dlgqrcode,SIGNAL(sig_updateNetworkQR()),this,SLOT(slt_updateNetworkQR()));
connect(dlgqrcode, SIGNAL(sig_clearAllQRCode()), this, SLOT(slt_clearAllQRCode()));
#endif
connect(this,SIGNAL(ShowWarnningText(QString,QString)),this,SLOT(ShowWarnningText1(QString,QString)));
msgtest = new QMessageBox(this);
connect(msgtest, SIGNAL(finished(int)), this, SLOT(OnFinished(int)));
//QFile file(SYS_ROOT_DIR"UseEn");
if( Public::ReadLanguageName()!="Chinese")
{
ui->pushButtonStartPrint->setIcon(QIcon(":/icon/Estartprint2.png"));
//ui->pushButtonPausePrint->setIcon(QIcon(":/icon/Epauseprint2.png"));
ui->pushButtonStopPrint->setIcon(QIcon(":/icon/EstopPrint2.png"));
if(Public::ReadLanguageName()=="Thai"){
ui->pushButtonStartPrint->setIcon(QIcon(":/icon/Estartprint3.png"));
ui->pushButtonStopPrint->setIcon(QIcon(":/icon/EstopPrint3.png"));
}
}
// 立即清零
#ifdef ENGLISH
ui->pushButtonStartPrint->setIcon(QIcon(":/icon/Estartprint2.png"));
ui->pushButtonPausePrint->setIcon(QIcon(":/icon/Epauseprint2.png"));
ui->pushButtonStopPrint->setIcon(QIcon(":/icon/EstopPrint2.png"));
#endif
#ifndef CLEARCNTNOW
ui->pushButtonCNTResetNow->hide();
#endif
fileChange=true;
pushButtonFlag = true;
if(sysPara)
{
sysPara->status.FileChangeRestCntFlag=0;
}
Public::derivePixelSizeFromHeight(12);
pPicScene = new PicScene(this);
//edit@12-09
pPicScene->setSceneRect(QRectF(0,0, 3999, 220));
ui->graphicsView->setScene(pPicScene);
ui->graphicsView->centerOn(0,0);
ui->senceEditOption->bindScene(pPicScene, ui->graphicsView, ui->textEdit);
ui->senceEditOption->bindStackWidget(ui->stackedWidgetOption,ui->stackedWidgetText);
connect(ui->senceEditOption,SIGNAL(generateQRCode(QString)),this,SLOT(onGenerateQRCode(QString)));
connect(ui->senceEditOption,SIGNAL(previewScene()),this,SLOT(onPreviewScene()));
connect(ui->textEditOption,SIGNAL(scenefileOpen(QString,bool)),ui->senceEditOption,SLOT(onFileOpen(QString,bool)));
connect(this,SIGNAL(scenefileOpen(QString,bool)),ui->senceEditOption,SLOT(onFileOpen(QString,bool)));
connect(ui->senceEditOption,SIGNAL(editItemMode()),ui->textEditOption,SLOT(onEditItemMode()));
connect(ui->textEditOption,SIGNAL(editItemDone()),ui->senceEditOption,SLOT(onEditItemDone()));
connect(ui->senceEditOption,SIGNAL(fileNameChanged(QString)),ui->labelOpenedFileName,SLOT(setText(QString)));
connect(ui->senceEditOption,SIGNAL(fileNameChanged(QString)),this,SLOT(changeTxtMode(QString)));
m_2sFlag = false;
moveToThread(&ShowThead);
ShowThead.start();
ui->pushButtonStart->setHidden(true);//屏蔽紧急停机按钮
ui->textEdit->viewport()->setProperty("cursor", QVariant(QCursor(Qt::IBeamCursor)));
// 在 textChanged 信号中处理
connect(ui->textEdit, &QTextEdit::textChanged, [=]() {
QTextCursor c = ui->textEdit->textCursor();
QRect r = ui->textEdit->cursorRect(c);
int viewportWidth = ui->textEdit->viewport()->width();
if (r.right() > viewportWidth - 20) {
int diff = r.right() - viewportWidth + 20;
ui->textEdit->horizontalScrollBar()->setValue(
ui->textEdit->horizontalScrollBar()->value() + diff
);
}
});
}
MainWindow::~MainWindow()
{
disconnect(&ShowThead, SIGNAL(started()), this, SLOT(onShowAndHideItem()));
if (ShowThead.isRunning()) {
ShowThead.quit();
ShowThead.wait();
}
delete ui;
delete timer;
delete pPicScene;
}
/*显示当前系统时间 */
void MainWindow::displayTime()
{
if(sysPara){
ui->labelCurrentTime->setText(tr("机箱:")+QString().sprintf("%d ",sysPara->status.AD_FIXED/4)+"°C"); // 机箱温度
ui->labDate->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
static bool CleanUPEn=1,preCleanUP=0;
if(!sysPara->para.isCheckMagnet)
{
CleanUPEn = (sysPara->status.currReclaimTankPos<70) && (sysPara->status.statWarn & WARN_STATUS_HDINT);
}
else
{
CleanUPEn = (sysPara->status.currReclaimTankPos<70) ;
}
if(CleanUPEn != preCleanUP){
ui->pushButtonCleanUP->setEnabled(CleanUPEn);
}
preCleanUP=CleanUPEn;
if(m_2sFlag)
{
{
sysPara->devOp->controlInkValve(!sysPara->devOp->isInkValveOpen()); //控制供墨阀开关
sysPara->devOp->controlInkValvePWM(!sysPara->devOp->isInkValveOpen1()); //控制供墨阀开关
}
}
}
}
void MainWindow::bindSysPara(SysPara *sysPara){
this->sysPara = sysPara;
ui->textEditOption->bindSysPara(sysPara);
ui->widgetPrintTextDisplay->bindSysPara(sysPara);
#ifdef _2DCODE_
barcode->bindSysPara(sysPara);
dlgqrcode->setSysPara(sysPara);
dlgqrcode->barCodeFlag = this->sysPara->para.qrOption.barCodeFlag;
dlgqrcode->SetOption((qrOption_t*)&sysPara->para.qrOption);
#endif
#ifdef PICSCENE
ui->senceEditOption->bindSysPara(sysPara);
#endif
}
void MainWindow::updateSysParaToUI(){
if(sysPara){
//nothing here
ui->textEditOption->updateSysParaToUI();
}
}
void MainWindow::applyUIPara(){
if(sysPara){
}
}
void MainWindow::CheckStatus(int Flag){
if(sysPara){
static unsigned int lastProductCnt=0;
int AutoCount=0;
int bcAutoCount=0;
static int lastMinutes = 0;
//QDate curDate=QDate::currentDate();
int currMinutes = QDateTime::currentDateTime().time().minute();
int usbDate = sysPara->status.ExpiryVarNum || sysPara->status.CurrDateVariNum ||sysPara->status.classVariNum;
if(usbDate)
{
//qDebug()<<"CheckStatus";
bool needSendPrintData=false;
//if(sysPara->print.CurDateVar.endRowPos && (sysPara->print.CurDateVar.day != curDate.day()))
if (sysPara->status.ExpiryVarNum && (lastMinutes != currMinutes))
{
ExpiryDotUpdate(1);
needSendPrintData = true;
}
//if(sysPara->print.ExpiryVar.endRowPos && (sysPara->para.ExpiryDay != r_ExpiryDay))
if(sysPara->status.CurrDateVariNum && (lastMinutes != currMinutes))
{
ExpiryDotUpdate(2);
needSendPrintData = true;
}
if(sysPara->status.classVariNum && (lastMinutes != currMinutes))
{
ExpiryDotUpdate(3);
needSendPrintData = true;
}
lastMinutes = currMinutes;
//sysPara->print.CurDateVar.day = curDate.day();
if(needSendPrintData)
{
sysPara->status.ExpiryDispUpdate=10;
SendPrintDataToFpga(0);
}
//if(ui->stackedWidgetText->currentWidget()==ui->pagePrintTextDisplay)
// ui->widgetPrintTextDisplay->update();
//sysPara->status.ExpiryDispUpdate=1;
}
if(sysPara->status.productCnt != lastProductCnt)
//if( sysPara->para.calandar_and_dat.cnt1CurrValue != sysPara->para.qrOption.counter )
{
lastProductCnt = sysPara->status.productCnt;
//sysPara->para.qrOption.counter ++;//= sysPara->para.calandar_and_dat.cnt1CurrValue;
// 荆州-四机赛瓦要求:跟计数器同步 此处优化逻辑,增量大于0才+=
if (sysPara->para.qrOption.CntInc > 0)
sysPara->para.qrOption.counter += sysPara->para.qrOption.CntInc;
AutoCount = (sysPara->status.QRvariNum?1:0);
//bcAutoCount = (sysPara->status.BCvariNum?1:0);
#ifdef MYARMTEST
qDebug()<<"CheckStatus:"<<sysPara->para.qrOption.counter<<AutoCount;
#endif
//qDebug()<<"CheckStatus :"<<sysPara->status.productCnt<<sysPara->para.qrOption.counter <<sysPara->status.QRvariNum;
}
//else qDebug()<<"P:"<<lastProductCnt<<sysPara->status.productCnt;
if( sysPara->para.qrOption.RecFromHost || AutoCount )
{
sysPara->para.qrOption.RecFromHost=0;
sysPara->para.qrOption.type = sysPara->print.QRvars[0].type;
sysPara->para.qrOption.height = sysPara->print.QRvars[0].height;
sysPara->para.qrOption.width = sysPara->print.QRvars[0].width;
if(ui->stackedWidgetText->currentWidget()==ui->pagePrintTextDisplay)
{
onUpdateDispQRCode(1); // 更新二维码显示
//qDebug()<<"PN:"<<lastProductCnt;
}
else { onUpdateDispQRCode(0);
//qDebug()<<"P0:"<<lastProductCnt;
}
if(AutoCount)
{
SendPrintDataToFpga(0);
}
AutoCount =0;
}
if(Flag){//pulse_300ms
sysPara->status.LightUpCnt ++ ;
if((sysPara->status.LightUpCnt%3) == 0){
if(printingFlag && startPrintingFlag && !sysPara->status.RedLightOnFlag && !sysPara->status.YellowLightOnFlag)
sysPara->status.GreenLightOnFlag = true;
else
sysPara->status.GreenLightOnFlag = false;
if(sysPara->status.GreenLightOnFlag){
if(!sysPara->para.isCheckPrintLight)
sysPara->devOp->controlGreenLight(!sysPara->devOp->isGreenLightEnable());
else
sysPara->devOp->controlGreenLight(true);
}
else{
sysPara->devOp->controlGreenLight(false); // 只在确定不亮时才发关灯
}
}
Test_Start_Stop();
if(sysPara->status.circleProductCnt && (sysPara->status.productCnt >= sysPara->para.cnt1EndValue))
{
if(sysPara)
{
sysPara->devOp->clearProductCnt(3 | 0x10);// [3]总产品计数器清零FPGA
sysPara->para.totalProductCnt = 0;
}
}
}
}
}
void MainWindow::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);
}
}
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")));
}
else {
ui->labelStatusInkSwint->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
}
if(!(sysPara->status.statWarn & WARN_STATUS_HDINT)){//喷头盖
ui->labelStatusHDINT->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG")));
if(printingFlag && startPrintingFlag)
setRunStatus(tr("正在喷印..............."));
}
else {
ui->labelStatusHDINT->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
if(printingFlag && startPrintingFlag)
setRunStatus(tr("喷头盖开, 喷印无法正常进行!!!"));
}
if(!(sysPara->status.statWarn & WARN_STATUS_SUMP_WARN)){ //液位渗漏,高电平警告
ui->labelStatusInkLeak->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG")));
}
else {
ui->labelStatusInkLeak->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
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")));
}
else {
ui->labelStatusInkWaterLevel->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
strTitle = tr("墨水液位报警");
}
if(!(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN)){
ui->labelStatusSolvLevelWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG")));
}
else {
ui->labelStatusSolvLevelWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
strTitle = tr("溶剂液位报警");
}
if(!(sysPara->status.statWarn & WARN_STATUS_RECYCLE_FAULT) ){
ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG")));
}
else {
ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
}
//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")));
}
// HVfaultCnt=0;
//sysPara->status.HVFaultCloseEn=0;
}
else {
ui->labelStatusHighVoltageFault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
if(startPrintingFlag && printingFlag){ //已经在打印,则暂停打印 2013-9-15高压报警停止充电
on_pushButtonPausePrint_pressed();
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();
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")));
}
else {
if(sysPara->status.viscosityFault==1){
ui->labelStatusViscosityWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
}
else if(sysPara->status.viscosityFault==2) {
ui->labelStatusViscosityWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMYellow.PNG")));
}
}
}
sysPara->status.lastViscosityFault = sysPara->status.viscosityFault;
/*-----------------------------------------------------------------------------------*/
if(!(sysPara->status.statWarn & WARN_STATUS_RECYCLE_FAULT)){ //20140211 nie
if(sysPara->status.RecycleWarnCnt)
ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG")));
sysPara->status.RecycleWarnCnt = 0;
sysPara->status.lastRecycleWarn = 0;
}
else {
// 速度过快时墨线可能瞬时偏移导致误报回收故障,此时抑制计数器累加并重置,避免误触发关槽
if(sysPara->status.lesslen_warn && (sysPara->para.printTriggerMode != PRINT_TRIGGER_TIME))
{
sysPara->status.RecycleWarnCnt = 0;
ui->labelStatusRecycleWarn->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMYellow.PNG")));
}
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
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_pushButtonReclaimTankClose_pressed();
LogInfo::setRunStatusText(tr("回收故障,关闭回收槽,关墨线"));
setRunStatus(tr("回收故障,关闭回收槽,关墨线"));
}
}
else setRunStatus(tr("回收故障."));
}
else
{
sysPara->status.RecycleWarnCnt ++ ;
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(ui->labelRunStatus->text().length()<4){
if(startPrintingFlag ){
if(printingFlag)
setRunStatus(tr("正在喷印..............."));
else
setRunStatus(tr("暂停喷印..............."));
}
}
// 20160620 新增主界面显示:压力,粘度,隔膜位置,晶振电压数,相位
ui->labPress->setText(QString("%1/%2").arg(sysPara->status.PRESSURE).arg(sysPara->para.pressure));
ui->labViso->setText(QString("%1/%2").arg(sysPara->status.viscosity).arg(sysPara->para.viscosity) );
if(sysPara->para.gearPumpEnable)
{
ui->labPosition->setText(QString("%1").arg(sysPara->status.gearPumpRunSpeed));
}
else
{
ui->labPosition->setText(QString("%1/%2").arg(sysPara->status.SEPTAL_POSITION).arg(sysPara->para.septalPostion) );
}
ui->labOscVol->setText(QString::number(sysPara->status.HV_DETOUT) + "/" + QString::number(sysPara->para.maxHighVoltageDAC));
}
}
bool MainWindow::updatePhaseIndicatorLight(){
if(sysPara==0) return 0;
if(dlgMyWarringShowDlyCnt)dlgMyWarringShowDlyCnt--;
if(dlgMyWarringShowDlyCnt==1) dlgMyWarring.hide();
/*------------------------------------------喷头盖未关或回收槽未全部打开的时候不报相位故障-------------------------------------------------*/
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")));
}
}
sysPara->status.phaseErrorCnt = 0;
}
else {
if(sysPara->status.phaseErrorCnt < 10)
sysPara->status.phaseErrorCnt ++ ;
else {
if(!sysPara->status.lastPhaseFault){
ui->labelStatusChargefault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMRed.PNG")));
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 && printingFlag){ //已经在打印,则暂停打印
on_pushButtonPausePrint_pressed();
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;
}
double MainWindow::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时间内墨点数/ 列需要墨点数
double pulseNum = colNum*sysPara->para.synNumPerCol/(1<<8); //synNumPerCol是被放大后的值
if(sysPara->para.divideRatio == 0 || sysPara->para.synPulseNumPerMm == 0)
return 600.0f;
double freq = (FPGA_SYS_HZ/(sysPara->para.divideRatio*2));
double ddotNumPerCol = sysPara->status.currPrintRow - (sysPara->status.currPrintRow * sysPara->para.reducedPixelNumRatio / 100.0);
pulseNum = sysPara->para.printColDelay / sysPara->para.synPulseNumPerMm / 1000.0 * freq / ddotNumPerCol * 60.0;
return qBound(0.0, pulseNum, 600.0);
}
static int reclaimTankDelay = 0;
void MainWindow::updateSysStatusToUI(){ //100ms
if(sysPara){
if(sysPara->para.gearPumpEnable)
{
ui->label_11->setText(tr("齿轮泵转速"));
}
else
{
ui->label_11->setText(tr("隔膜位置"));
}
RefreshStatusLight();
if(sysPara->status.lastProductCnt != sysPara->status.productCnt){ //产品计数
ui->labelProductCnt->setText(QString::number(sysPara->status.productCnt));
updateTotalCnt(0);
}
if(sysPara->status.ExpiryDispUpdate >0 )
{
sysPara->status.ExpiryDispUpdate--;
ui->widgetPrintTextDisplay->update();// 2018.5.25
}
if(sysPara->para.alterPrint.enable==1) ui->labelXFileName->setText (tr("交替打印"));
else if(sysPara->para.alterPrint.enable==2) ui->labelXFileName->setText (tr("电眼交替"));
else ui->labelXFileName->setText ("");
/*--------------------------------------------------------------------------*/
//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
{
double speed = getMaxSpeedCalcPara();//No67
maxMM = int(speed * 1000.0);
}
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')));
}
else
ui->labelSynRate->setText("");
sysPara->status.lastSynPulseCntPer1s = sysPara->status.synPulseCntPer1s;
}
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();
}
firstGetFpgaVersionNumFlag=1;
QString ARM_Version;
ARM_Version.sprintf("%s.%s.", MACHINAE_VER, PUMP_VER);
ARM_Version = ARM_Version + (QString) Public::DateToString(__DATE__)+"."+SUB_VER+SUB_RFID;
ui->labelFpgaVersionNum->setText(QString("%1/F%2.%3.%4").arg(ARM_Version).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("%s.%s.", MACHINAE_VER, PUMP_VER);
ARM_Version = ARM_Version + (QString) Public::DateToString(__DATE__)+"."+SUB_VER+SUB_RFID;
ui->labelFpgaVersionNum->setText(QString("%1/F%2.%3.%4").arg(ARM_Version).arg(sysPara->status.fpgaVersionNum >> 12)
.arg((sysPara->status.fpgaVersionNum>>8) & 0x0f).arg(sysPara->status.fpgaVersionNum&0xff) );
}
}
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)){
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) //减少不必要的刷新动作
{
ui->widgetPrintTextDisplay->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(SIMULATE_PRINTING_MODE)
enablePrintButton(true);
ui->label_size->setText(tr("%1/%2/%3").arg(sysPara->status.sizeFPGA).arg(sysPara->status.sizequeueFPGA).arg(sysPara->status.sizeSTM32));
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);
}
#ifdef NETWORKQRCODE //荆州-四机赛瓦要求:跟计数器同步
// ========== 新增:检测计数器1变化并同步更新二维码 ==========
int currentCnt1Value =
QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue, 16).toInt();
if(sysPara->para.qrOption.counter != currentCnt1Value){
// 检查是否有二维码变量需要更新
if(sysPara->status.QRvariNum > 0 && sysPara->para.qrOption.AutoCount){
// 更新二维码选项中的计数器值
sysPara->para.qrOption.counter = currentCnt1Value;
// 触发二维码重新生成
onUpdateDispQRCode(1);
// 如果正在打印,重新发送打印数据
if(startPrintingFlag && printingFlag){
SendPrintDataToFpga(0);
}
}
}
// ========================================================
#endif
}
}
void MainWindow::showPrintBitImage(){
if(sysPara){
unsigned char *dat;
bool MaxCol4000;
if(sysPara->status.flagOfNo67FPGA)
MaxCol4000 = true;
else
MaxCol4000 = false;
if(MaxCol4000){
dat =sysPara->status.printDat_Normal;
}else{
dat =sysPara->status.printDat;
}
for(int j = sysPara->status.currPrintCol - 1; j >= 0 ; j --){
for(int i = 0; i < sysPara->status.currPrintRow; i++){
if(dat[j*MAX_PRINT_ROW_BYTE_NUM + i/8] & (1<<(i%8)))
printf("1");
else
printf(" ");
}
printf("\n");
}
}
}
//void MainWindow::on_pushButtonTXTOpen_pressed(){
//}
void MainWindow::openPicFIleOpen(QString filePath,bool insertFlag) {
fileChange=true;
#ifdef TXTEDIT
ui->textEditOption->onFileOpenN(filePath,insertFlag);
emit setMainTabNow(0);
#else
Q_UNUSED(insertFlag);
if(sysPara) {
if(//filePath.endsWith(".gif") || filePath.endsWith(".jpeg") ||
//filePath.endsWith(".jpg") ||
// ||filePath.endsWith(".bmp")
filePath.endsWith(".png"))
{
QFile file(filePath);
if(!file.open(QIODevice::ReadOnly)){
QMessageBox::warning(this,tr("警告"),tr("无法打开文件") + filePath);
return ;
}
else {
QByteArray data = file.readAll();
QTextCodec *codec = Qt::codecForHtml(data);
QString str = codec->toUnicode(data);
if(filePath.startsWith(UDISK_DOC_ROOT_DIR))
str.replace(DOC_ROOT_DIR,UDISK_DOC_ROOT_DIR); //做相应处理
file.close ();
ui->PicWidgetDisp->loadImage (filePath,false);
ui->labelOpenedFileName->setText (QFileInfo(filePath).fileName());
LogInfo::setRunStatusText(tr("打开文件:")+(QString)(QFileInfo(filePath).fileName()));
if(sysPara){
//QString str1 =QFileInfo( filePath).fileName ();
sysPara->sysFile= PARA_ROOT_DIR+QFileInfo( filePath).baseName()+".dpn";
sysPara->loadParaFromFile ();// 从磁盘读取参数文件
emit openFileChange();
// emit openFileChange();
snprintf(sysPara->para.lastOpenedFileName,sizeof(sysPara->para.lastOpenedFileName),"%s",filePath.toLatin1().constData());
}
/* other action */
PreviewPressed();
if(sysPara->status.addSpace)
ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol/2, sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow);
else ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol, sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow);
ui->stackedWidgetText->setCurrentWidget(ui->pagePrintTextDisplay);
ui->widgetPrintTextDisplay->setScaleRatio(3);
//ui->labelTextWidthHeight->setText(tr("[ %1行 x %2列 ]").arg(sysPara->status.currPrintRow).arg(sysPara->status.currPrintCol));
}
}
}
#endif
}
void MainWindow::on_pushButtonGetData_pressed()
{
emit getJSONData();
}
void MainWindow::onPushButtonPreviewPressed(){
if(sysPara)
{
sysPara->para.EditMode = TXTFILE;
if(previewFlag==0) {
#ifdef SAVEWHENPREVIEW
if(ui->textEditOption->fileName.isEmpty()){
QMessageBox::StandardButton ret = QMessageBox::Ok;
ret = QMessageBox::warning(this, tr("提示"),
tr("文件未保存,是否先保存文件!"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok)
{
ui->textEditOption->on_bottonSave_clicked();
}
}
else
ui->textEditOption->on_bottonSave_clicked();
#else
#endif
PreviewPressed();
}
}
}
int MainWindow::getVarStarRow(int x,int y,int h,int w,char *dat)
{
int t_x_start_pos = x;
int t_x_end_pos = t_x_start_pos + w;
bool MaxCol4000;
if(sysPara->status.flagOfNo67FPGA)
MaxCol4000 = true;
else
MaxCol4000 = false;
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 = y - h/2;
//int t_y_end_pos = y ;
if(t_y_start_pos < 0)
t_y_start_pos = 0;
for(int j=y - h/2;j>0;j--)
{
char startRowFound=0;
for(int i = t_x_start_pos; i < t_x_end_pos; i++)
{
if( (dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] & (1 << (j%8))))
{
startRowFound=1;
dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] &=~ (1 << (j%8));//将画点取消掉
}
}
if(startRowFound)continue;
t_y_start_pos=j+1;
// qDebug()<<"F:"<<t_y_start_pos;
break;
}
return t_y_start_pos;
}
void MainWindow::PreviewPressed(){
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:"<<sysPara->status.variNum<<"v-nLeter1:"<<sysPara->status.vars[0].letterSpace<<"v-nLeter2:"<<sysPara->status.vars[1].letterSpace<<"v-nLeter3:"<<sysPara->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);
}
// end of PICFILE
else if(sysPara->para.EditMode==TXTFILE)// TXTFLE
{
sysPara->status.addSpace = sysPara->para.checkSpace;
ontextEdittextChanged();
coldot = (int)ui->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");
ui->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()<<j<< QString().sprintf("%08X",rgb);
//if((rgb&0x00FFFFFF)==0)
{
firstRow = j;
break;
}
}
}
if(firstRow != maxPicHeight)
break;
}
firstRow = 0;
//qDebug()<<"firstRow"<<firstRow<<maxPicHeight;
//firstRow = 0;
/*--------------------------------------------------------------------------*/
int lastRow = firstRow + MAX_PRINT_ROW_NUM;
int TempVarNum=0;
int varLastRow=0;
lastRow = (lastRow>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);
// 修改code判断逻辑
long unsigned int rgbValue = rgb & COLOR_MASK;
if(rgb&0x80000000) { //判断alpha,rgb<0xFFE0E0E0->过滤偏白背景
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(varLastRow<j+1) varLastRow=j+1;
sysPara->status.variNum ++;TempVarNum++;
i+=5;
//qDebug()<<"VARr:"<<TempVarNum<<i<<j;
}
else TempVarNum++;
//dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8] |= 1 << (j%8); //画黑点
}
}
else if( (rgbValue == MDT_RGB) || (rgbValue == QR_RGB) ||
(rgbValue == BAR_RGB)){
if(sysPara->status.QRvariNum>=4)continue;
if(rgbValue == MDT_RGB) { //MDT
handleCode(i,j,&varLastRow, MDT);
}
else if(rgbValue == QR_RGB) { //QR
handleCode(i,j,&varLastRow, QR);
}
else if(rgbValue == BAR_RGB) { //BAR
handleCode(i,j,&varLastRow, BAR);
}
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(varLastRow<j+1) varLastRow=j+1;
if(sysPara->status.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:"<<rgb;
bool foundExVar=0;
if(j>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(varLastRow<j+1) varLastRow=j+1;
if(sysPara->status.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:"<<rgb;
//qDebug()<<" found class:"<<i<<j + firstRow;
{
qDebug()<<"found class:";
//if(sysPara->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(varLastRow<j+1) varLastRow=j+1;
if(sysPara->status.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;
}
}
}
}/*判断alpha end*/
}
}
// var
//qDebug() <<"VarNum"<<TempVarNum;
if(TempVarNum>8){
setRunStatus(tr("变量数大于8个,某些变量将不起作用!!!"));
strTitle= tr("变量数大于8个,某些变量将不起作用!!!");
strTitle.append("\r\n");
strTitle.append(tr("请减少信息中的变量(或计数器)数量."));
QMessageBox::warning(this, tr("警告"),strTitle,QMessageBox::Ok);
}
//qDebug()<<firstRow<<lastRow<< sysPara->status.vars[0].startRowPos<<sysPara->status.vars[0].endRowPos<< sysPara->status.currPrintRow;
// ==============查找QRV, DMTV,BARV 变量 MAX_QVARI_NUM
//qDebug()<<"qrvar"<<sysPara->status.QRvariNum;
searchQrVar();
//if(sysPara->status.ExpiryVarNum)
searchExpiryVar();
//ui->widgetPrintTextDisplay->update();
//===============
if(sysPara->status.variNum){
//
/*--------------------------------提取变量------------------------------------------*/
QString pattern = "<img src=\":/(\\d*)/(\\d*)_([a-zA-Z_][a-zA-Z0-9_]*)/../image/digitalWidth(\\d*).bmp\" width=\"(\\d*)\" height=\"(\\d*)\" />";
QRegExp rx(pattern);
QString textHtml = ui->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){
qDebug() << rx.capturedTexts();
sysPara->status.vars[varNum].digitalNum = rx.cap(4).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);//第一个匹配
strcpy(sysPara->status.vars[varNum].fontname,rx.cap(3).toUtf8().data());
sysPara->status.vars[varNum].width = rx.cap(5).toInt(&ok)*(sysPara->status.addSpace?2:1);
sysPara->status.vars[varNum].height = rx.cap(6).toInt(&ok);
//qDebug() <<varNum<< "startRowPos=:" << sysPara->status.vars[varNum].startRowPos
// << "endRowPos" << sysPara->status.vars[varNum].endRowPos
// <<"Height"<<sysPara->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:"<<sysPara->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(6).toInt(&ok);
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:"<<sysPara->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"<<sysPara->status.vars[varNum].height<<pixelSize;
sysPara->status.vars[varNum].letterSpace = 0;
if(sysPara->status.vars[varNum].digitalNum){ //算出letterspace
QFont font;
//font.setFamily(Public::getFontFamily(pixelSize));
font.setFamily(sysPara->status.vars[varNum].fontname); // 20160812
//pixelSize==7? font.setFamily(ui->textEditOption->getLabelFontFamily()->text()):font.setFamily(Public::getFontFamily(pixelSize, 0));
// font.setPixelSize(pixelSize);
font.setPixelSize(sysPara->status.vars[varNum].height);
font.setWeight(sysPara->status.vars[varNum].bold?QFont::Bold:QFont::Normal);
font.setLetterSpacing(QFont::AbsoluteSpacing, 0);
QFontMetrics fontMetrics(font);
int charWidth = (fontMetrics.horizontalAdvance("0123456789")) / 10 ;
if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){
charWidth = (fontMetrics.horizontalAdvance("0123456789.m "))/13;
}
sysPara->status.vars[varNum].letterSpace =
(sysPara->status.vars[varNum].width - charWidth * sysPara->status.vars[varNum].digitalNum)
/ (sysPara->status.vars[varNum].digitalNum);
//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<<sysPara->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:"<<lastRow;
for(int j = sysPara->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:"<<i<<j<<dat[MAX_PRINT_ROW_BYTE_NUM*i + j/8]<<sysPara->status.currPrintRow;
break;
}
}
if(found)
break;
}
if(lastRow>MAX_PRINT_ROW_NUM-1)lastRow =MAX_PRINT_ROW_NUM-1;
if(lastRow<varLastRow)lastRow= varLastRow-1;
if(lastRow<1) lastRow =1;
//if(lastRow>20 &&lastRow<=25) lastRow =24;
sysPara->status.currPrintRow =lastRow;
//sysPara->status.currPrintRow = (lastRow > varLastRow) ? lastRow : varLastRow; //配合賴工省点打印少行問题
if(sysPara->status.specialVarPrint.SpecialVarEnable)
{
sysPara->devOp->fpgaWr(0xa4b0,(unsigned char *)&sysPara->status.specialVarPrint,sizeof(SpecialVarPrint)); // Send specialVarPrint 20240716
}
}
// end of TxtMode
// 交替打印
// 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)
ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol/2,sysPara->status.currPrintRow);
else ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol,sysPara->status.currPrintRow);
ui->widgetPrintTextDisplay->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));
ui->widgetPrintTextDisplay->update();
//qDebug()<<"3"<<sysPara->status.currPrintRow;
}
previewFlag=0;
}
void MainWindow::showDat(unsigned char * Dat)
{
Q_UNUSED(Dat);
}
void MainWindow::alterDataPrint(unsigned char m)
{
if(sysPara)
{
ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol,sysPara->para.AlterMode?sysPara->status.currAlterPrintRow : sysPara->status.currPrintRow);
emit ui->widgetPrintTextDisplay->update();
}
}
void MainWindow::generateCharRamData(){/* 生成字模数据 */
if(sysPara->status.variNum){
QTextEdit textEdit;
textEdit.document()->setDocumentMargin(0);
textEdit.setLineWrapMode(QTextEdit::NoWrap);
int ramAddress = 0;
int i;
qDebug()<<"sysPara->status.variNum:"<<sysPara->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 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);
// int height = p_var->height;
textEdit.clear();
int DPI = textEdit.logicalDpiX();
DPI = DPI?DPI:1; //Pixel = DPI * Point / 72
auto fontFamily = QString(p_var->fontname);
textEdit.setFontFamily(fontFamily);
if(sysPara->para.flagOfModuleDecimal || sysPara->para.flagOfModuleHide){
textEdit.insertHtml(QString("<span style=\" font-family:'%1'; font-size:%2pt; font-weight:%3;\">0123456789.m </span>")
.arg(fontFamily) // 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("<span style=\" font-family:'%1'; font-size:%2pt; font-weight:%3;\">0123456789</span>")
.arg(fontFamily) // 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));
}
QFont font = textEdit.font();
font.setLetterSpacing(QFont::AbsoluteSpacing, p_var->letterSpace);
textEdit.setFont(font);
// width = p_var->width;
qDebug() << "letterSpace: " << p_var->letterSpace<< "font:" << font.family()<< "font width:" << width;
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"<<lastValidRow;
qDebug()<<"GetData"<<p_var->endRowPos<< p_var->startRowPos;
int rowDiff = p_var->endRowPos - p_var->startRowPos;
int firstValidRow = -1; // 变量的第一行所处的行地址
for(int y = 0; y < image.height(); ++y) {
for(int x = 0; x < image.width(); ++x) {
if(image.pixel(x, y) & 0xff000000) {
firstValidRow = y;
break;
}
}
if(firstValidRow != -1)
break;
}
firstValidRow = qMax(firstValidRow, 0);
int rowByteNum = rowDiff/8 + ((rowDiff%8)?1:0); // 一列占用字节数
if (rowByteNum > 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 - firstValidRow;
if(((rgb >> 24)&0xff) > 0x80){ // 判断是否有效的像素点
dat[rowByteNum*(j+(sysPara->status.addSpace?j:0) )+ currRow/8] |= (1<<(currRow%8));
}
}
}
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;
} else {
qDebug() << "startRowPos:" << p_var->startRowPos
<<" endRowPos:" << p_var->endRowPos
<<" rowDiff:" << rowDiff
<< " 按原逻辑,执行这一步的时候软件就已经崩溃了";
}
}
}
}
}
void MainWindow::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));
}
static int numOfTextChange = 0;
void MainWindow::on_pushButtonStartPrint_pressed()
{
unsigned int type = sysPara->status.fpgaVersionNum >> 12;
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 && type == 8) //同步模式下,判断喷印间隔是否设置合理
{
QSizeF size = ui->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*****/
#ifndef FPGATEST
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 ;
}
}
#endif
sysPara->devOp->highVoltageCtrl(1);
sysPara->devOp->setHighVoltageAmplitudetoSTM32();
sysPara->status.waitHightVolOff = 0;
if(!printingFlag)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(numOfTextChange >= 5){
numOfTextChange = 0;
emit autoUpdateFontWidthByMainWindow((const unsigned int)sysPara->status.currPrintCol);
}
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 ;
}
// LogInfo::setRunStatusText(tr("有效打印区域 %1行 x %2 列").arg(sysPara->status.currPrintRow).arg(sysPara->status.currPrintCol));
//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))
)
{
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;
setRunStatus(tr("开始打印1"));
qDebug()<<QString("mainwindow 打印内容:%1").arg(ui->textEdit->toPlainText());
SendPrintDataToFpga(0); // 0--正常打印,1--打印交替部分信息1; 2--打印交替部分信息2,
if(sysPara->para.isCheckInsertTime)
{
if(!startPrintingFlag)
{
LogInfo::setRunStatusText(tr("开始打印"));
}
}
else
{
LogInfo::setRunStatusText(tr("开始打印"));
}
/*-------------------------------------------------------------------*/
ui->labelSynColDelay->setText("");
sysPara->status.lastSynColDelay = -1; //目的是为了清空原来的数据
/*--------------------------------暂停按钮------------------------------*/
ui->pushButtonPausePrint->setEnabled(true);
// ui->pushButtonPausePrint->setText(tr("暂停打印"));
/*---------------------------------开关回收槽------------------------------*/
enableReclaimCtrlButton(false);
updatePrintDisplayLabel();
// 20170717 移动此,以观察条形码打印异常问题。
if(!startPrintingFlag)
{
sysPara->devOp->printCtrl(PRINT_CTRL_START);
printingFlag = true;
}
else
{
//如果已经在打印,则不要在发送start命令,只要更新相应的数据即可
if(!printingFlag) //如果在暂停,重复取消暂停
on_pushButtonPausePrint_pressed();
}
startPrintingFlag = true;sysPara->status.isPrinting=true;
}
}
unsigned char blankDat1[BLANK_COL_NUM*MAX_PRINT_ROW_BYTE_NUM]={0};
void MainWindow::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);
}
int MainWindow::getCurrPrintStatus()
{
int printStatus;
if (startPrintingFlag ) {
if(printingFlag) {
printStatus = 1; // 正在打印
}
else {
printStatus = 2; // 暂停喷印
}
}
else {
printStatus = 3; // 停止打印
}
return printStatus;
}
void MainWindow::updatePrintDisplayLabel(){
if(sysPara && !sysPara->status.reclainTankReachEnd){
setRunStatus(tr("回收槽未到底!!!!!!"));
}
else if(startPrintingFlag ){
if(printingFlag)
setRunStatus(tr("正在喷印..............."));
else
setRunStatus(tr("暂停喷印..............."));
}
else
setRunStatus("");
}
void MainWindow::on_pushButtonStopPrint_pressed()
{
if(sysPara->status.isPrinting){
qDebug("Mainwindow: Printing 停止打印");
}else{
qDebug("Mainwindow: Non printing 停止打印");
}
if(sysPara){
#ifndef FPGATEST
if (!sysPara->status.reclainTankReachEnd && !SIMULATE_PRINTING_MODE) {
return;
}
#endif
sysPara->status.flagOfAbnormalStatus = false;
sysPara->status.isPrinting=false;
sysPara->devOp->printCtrl2(1);
sysPara->devOp->printCtrl( PRINT_CTRL_STOP);//:PRINT_CTRL_STOPSYNCNT
LogInfo::setRunStatusText(tr("停止打印"));
ui->pushButtonStartPrint->setEnabled(true);
ui->pushButtonPausePrint->setEnabled(false);
// ui->pushButtonPausePrint->setText(tr("暂停打印"));
enableReclaimCtrlButton(true);
printingFlag = 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("随机码文件导出完成.");
}
}
}
}
void MainWindow::on_pushButtonPausePrint_pressed()
{
if(sysPara){
if(sysPara->status.WorkTimeOut && !SIMULATE_PRINTING_MODE) { sysPara->devOp->printCtrl(PRINT_CTRL_STOP);
return;
}
if (!sysPara->status.reclainTankReachEnd && !SIMULATE_PRINTING_MODE) {
return;
}
sysPara->devOp->printCtrl(PRINT_CTRL_PAUSE);
LogInfo::setRunStatusText(printingFlag?tr("暂停打印"):tr("继续打印"));
ui->pushButtonStartPrint->setEnabled(true);
printingFlag = !printingFlag;
if(printingFlag)
{
ui->pushButtonPausePrint->setText(tr("继续打印\n保持高压"));
ui->pushButtonPausePrint->setStyleSheet("QPushButton{color:rgb(0, 255, 0)}");
sysPara->devOp->highVoltageCtrl(sysPara->para.HighVoltageAmplitude);
}
else
{
ui->pushButtonPausePrint->setText(tr("暂停打印\n停止高压"));
ui->pushButtonPausePrint->setStyleSheet("QPushButton{color:rgb(255, 0, 0)}");
}
updatePrintDisplayLabel();
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("随机码文件导出完成.");
}
}
}
}
void MainWindow::resetReclaimCtrlButtonText(){
ui->pushButtonReclaimTanOpen->setText(tr("开"));
ui->pushButtonReclaimTankClose->setText(tr("关"));
}
void MainWindow::enableReclaimCtrlButton(bool enable) {
ui->pushButtonReclaimTanOpen->setEnabled(enable);
ui->pushButtonReclaimTankClose->setEnabled(enable);
}
void MainWindow::enablePushButtonStart(bool enable)
{
ui->pushButtonStart->setEnabled(enable);
}
void MainWindow::enablePrintButton(bool enable){
ui->pushButtonPausePrint->setEnabled(false);
#ifdef FPGATEST
enable = true;
#endif
ui->pushButtonStartPrint->setEnabled(enable);
ui->pushButtonStopPrint->setEnabled(enable);
}
static int mainInkPumpCtrlStatus = 0;
static int mainInkPumpCtrlCnt = 0;
//100ms 为单位
void MainWindow::airPushingProcess()
{
if(sysPara){
if (sysPara->status.airPushing) {
setRunStatus(tr("正在排气 ..............."));
//qDebug()<< "start airPushingProcess "<<sysPara->status.airPushingOnTime;
// 执行排气 4 秒
sysPara->status.airPushingOnTime += 100;
if(sysPara->para.airPushDurationSec <= 0 || sysPara->para.airPushDurationSec > 30) {
sysPara->para.airPushDurationSec = 4;
sysPara->saveParaToFile();
}
// 延迟 半秒后才开回收槽,正式结束排气阶段
if(sysPara->status.airPushingOnTime >= sysPara->para.airPushDurationSec * 1000 + 500){
//qDebug()<< "start stop";
reclaimTanOpen();
sysPara->status.airPushingDone = 1;
sysPara->status.airPushing = 0;
sysPara->status.airPushingOnTime = 0;
airPushTimer->stop();
return;
}
if(sysPara->status.airPushingOnTime >= sysPara->para.airPushDurationSec * 1000){
sysPara->devOp->controlViscosityPump(false);
sysPara->devOp->controlCycleValve(false);
if(!sysPara->devOp->isReclaimPumpOpen())
sysPara->devOp->controlReclaimPump(true, false);
return;
}
}
}
}
void MainWindow::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());
ui->pushButtonReclaimTanOpen->setText(sysPara->devOp->isReclaimTankOpenEnable()?tr("停止"):tr("开"));
ui->pushButtonReclaimTankClose->setText(tr("关"));
enablePrintButton(SIMULATE_PRINTING_MODE);
sysPara->devOp->highVoltageCtrl(0); /*回收槽动作的时候务必关高压*/
// sysPara->status.reclaimTankstatus = 1;
setRunStatus(sysPara->devOp->isReclaimTankOpenEnable()?tr("正在打开回收槽..."):tr("停止打开"));
if (!sysPara->para.reclaimTankTime) {
LogInfo::setRunStatusText(tr("警告!回收槽开关时间未设置!"));
}
sysPara->status.currReclaimOperationCnt = 0;
sysPara->status.reclainTankReachEnd = false;
sysPara->status.reclainOpenAppending = true;
sysPara->status.reclainCloseAppending = false;
sysPara->status.reclaimBlockedCnt = 0;
sysPara->status.canRunAirPushing = false;
}
void MainWindow::handleCode(int col, int row, int *varLastRow, int type)
{
int idx = sysPara->status.QRvariNum;
sysPara->print.QRvars[idx].type=type;
sysPara->print.QRvars[idx].countEn=1;
sysPara->print.QRvars[idx].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[idx].startColPos=col+(sysPara->status.addSpace?col:0);
sysPara->print.QRvars[idx].endRowPos=row+1;
if(*varLastRow<row+1) *varLastRow=row+1;
sysPara->status.QRvariNum++;
}
void MainWindow::handleCodeScene(int col, int row, int *varLastRow, int type, int textItemPosX, int textItemPosY)
{
int idx = sysPara->status.QRvariNum;
sysPara->print.QRvars[idx].type=type;
sysPara->print.QRvars[idx].countEn=1;
sysPara->print.QRvars[idx].Counter=sysPara->status.productCnt;
sysPara->print.QRvars[idx].startColPos=col+(sysPara->status.addSpace?col:0)+textItemPosX;
sysPara->print.QRvars[idx].endRowPos=row+1+textItemPosY;
if(*varLastRow<row+1) *varLastRow=row+1;
sysPara->status.QRvariNum++;
}
void MainWindow::on_pushButtonReclaimTanOpen_pressed()
{
if(sysPara){
if (!sysPara->status.reclaimTankBlockedAppending) {
if (sysPara->status.canRunAirPushing && (sysPara->status.currReclaimTankPos == 0)) { // 回收槽关闭的情况下才可以执行排气;//2019/10/24 当回收槽未在顶的位置,不需要排气
if (!sysPara->status.airPushing) { // 先执行排气后开回收槽
sysPara->status.byHandStore = sysPara->status.isPumpValveControledByHand;
sysPara->status.isPumpValveControledByHand = true;
sysPara->devOp->mainInkCtrl();
sysPara->devOp->controlCycleValve(true);
sysPara->devOp->controlViscosityPump(true);//关粘度泵
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();
}
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 MainWindow::on_pushButtonReclaimTankClose_pressed()
{
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());
ui->pushButtonReclaimTanOpen->setText(tr("开"));
ui->pushButtonReclaimTankClose->setText(sysPara->devOp->isReclaimTankCloseEnable()?tr("停止"):tr("关"));
enablePrintButton(SIMULATE_PRINTING_MODE);
sysPara->devOp->highVoltageCtrl(0);
// sysPara->status.reclaimTankstatus = 2;
setRunStatus(sysPara->devOp->isReclaimTankCloseEnable()?tr("正在关闭回收槽..."):tr("停止关闭"));
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;
}
}
void MySleep(unsigned int msec);
/*
* 关机前务必保存参数
* */
void MainWindow::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("准备关机......"));
qDebug()<<"准备关机";
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 MainWindow::sendPowerOffCmd(){
if(++numOfPowerOffCMD == 120){
sysPara->devOp->color_flag = 2;
setRunStatus(tr("关机失败!!!"));
timerPowerOff->stop();
numOfPowerOffCMD = 0;
return;
}
sysPara->devOp->powerOff();
}
void MainWindow::powerOffConfirmed(){
timerPowerOff->stop();
QProcess process;
process.startDetached("poweroff");
qApp->exit(0);
}
void MainWindow::on_pushButtonStart_pressed()
{
QMessageBox::StandardButton ret;
if(pushButtonFlag)
ret = QMessageBox::information(this, tr("提示"),
tr("是否关闭齿轮泵,关闭齿轮泵会导致墨水停止流动!"),
QMessageBox::Ok | QMessageBox::Cancel);
else
ret = QMessageBox::information(this, tr("提示"),
tr("是否启动齿轮泵?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok){
pushButtonFlag = !pushButtonFlag;
if(pushButtonFlag)
{
ui->pushButtonStart->setStyleSheet("QPushButton{background-color:rgb(0, 255, 0)}");
ui->pushButtonStart->setText(tr("泵启动"));
}
else
{
ui->pushButtonStart->setStyleSheet("QPushButton{background-color:rgb(255, 0, 0)}");
ui->pushButtonStart->setText(tr("泵停止"));
}
//ui->pushButtonStart->setEnabled(false);
emit pushButtonStartPressed(pushButtonFlag);
}
}
void MainWindow::_on_pushButtonPowerOff_pressed(bool notice){
if(sysPara){
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_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 MySleep(unsigned int msec)
{
QTime dieTime = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < dieTime )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
//extern MyInputMethod *myInputMethod;
void MainWindow::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<size.width() && ++numOfTextChange > 10)
{
numOfTextChange = 0;
emit autoUpdateFontWidthByMainWindow((const unsigned int)size.width());
}
}
QPoint QTextCursorPos(const QTextEdit * myTextEdit)
{
QPoint pt;
QTextCursor tc=myTextEdit->textCursor();
QTextLayout *pLayout=tc.block().layout();
pt.setY(tc.position()-tc.block().position());
pt.setX(pLayout->lineForTextPosition(pt.y()).lineNumber()+tc.block().firstLineNumber());
return pt;
}
extern MyInputMethod *myInputMethod;
void MainWindow::onTextEditCursorPositionChanged(){
for(int i = 0; i < 2; i++){
QTextCharFormat fmt = ui->textEdit->currentCharFormat ();
QString s = ui->textEdit->document()->toPlainText();
QFont font = fmt.font();
QLabel *labelFontSize = ui->textEditOption->getLabelFontSize();
QLabel *labelFontFamily = ui->textEditOption->getLabelFontFamily();
QCheckBox *checkBoxBold = ui->textEditOption->getCheckBoxBold();
bool ok;
//qDebug()<<"onTextEditCursorPositionChanged"<< font.family()<<labelFontSize->text().toInt(&ok,10)<<s.length()<<s;
if(labelFontSize && checkBoxBold){
int DPI = labelFontSize->logicalDpiX();
DPI = DPI?DPI:1;
int pixeSize = font.pointSizeF()*DPI/72;
if(pixeSize >= Public::getMinFontPixelSize()){
labelFontSize->setText(QString::number(Public::getAdjustedPixelSize(pixeSize)));
checkBoxBold->setChecked(font.weight() == QFont::Bold);
labelFontFamily->setText(font.family());
barcode->setFontSize(Public::getAdjustedPixelSize(pixeSize));
break;
}
else {
if(s.length()<=1) {
ui->textEdit->selectAll();
font.setFamily(Public::getFontFamily(labelFontSize->text().toInt(&ok,10) ));
ui->textEditOption->setFontFormat(); //设置完格式后,在第二轮重设字体
ui->textEdit->moveCursor(QTextCursor::End);
} else
ui->textEditOption->setFontFormat(); //设置完格式后,在第二轮重设字体
}
}
}
}
void MainWindow::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->labelRunStatus->clear();
sysPara->status.beeperOnFlag = false;
sysPara->devOp->controlBeeper(false);
sysPara->status.heaterONTimeCnt = 0; //加热块计数清零
ui->labelStatusChargefault->setPixmap(QPixmap(QString::fromUtf8(":/image/ALARMGreen.PNG")));
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(printingFlag) {
sysPara->devOp->highVoltageCtrl(sysPara->para.HighVoltageAmplitude);
}
}
}
void MainWindow::onEnableReclaimCtrlButton(bool flag)
{
enableReclaimCtrlButton(flag);
}
void MainWindow::onInkJetPrinterCurrentChanged(int index)
{
ui->senceEditOption->onInkJetPrinterCurrentChanged(index);
}
void MainWindow::onLabelProductCntPressed(){
if(sysPara){
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this, tr("警告"),
tr("是否初始化产品计数?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok){
updateTotalCnt(0);
sysPara->devOp->clearProductCnt(1);
sysPara->saveParaToFile();
}
}
}
void MainWindow::onLabelTotalProductCntPressed(){
if(sysPara){
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this, tr("警告"),
tr("是否清除总产品计数?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok){
sysPara->devOp->clearProductCnt(1 | 0x10 );// [3]总产品计数器清零FPGA
sysPara->para.totalProductCnt = 0;
}
}
}
void MainWindow::onPushButtonCNTResetNowPressed(){
if(sysPara){
// emit closeSerial();
QMessageBox::StandardButton ret;
ret = QMessageBox::warning(this, tr("警告"),
tr("是否立即重新计米?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok){
sysPara->devOp->clearProductCnt(3 | 0x10);// [3]总产品计数器清零FPGA
sysPara->para.totalProductCnt = 0;
}
}
}
void MainWindow::on_bottonEditText_pressed()
{
//qDebug()<<"EditMode"<<sysPara->para.EditMode;
if(sysPara->para.EditMode==TXTFILE){
bool MaxCol4000;
if(sysPara->status.flagOfNo67FPGA)
MaxCol4000 = true;
else
MaxCol4000 = false;
ui->stackedWidgetText->setCurrentWidget(ui->pageTextEdit);
ui->stackedWidgetOption->setCurrentWidget(ui->textEditOption);
ontextEdittextChanged(); //显示大小
int coldot = (int)ui->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)));
}
}
else if(sysPara->para.EditMode==PICFILE){
emit openCurrFile(sysPara->para.lastOpenedFileName);
}
else if(sysPara->para.EditMode==SCENE){
//qDebug()<<"SCENE";
//emit openCurrFile(sysPara->para.lastOpenedFileName);
ui->stackedWidgetText->setCurrentWidget(ui->fileSceneViewer);
ui->stackedWidgetOption->setCurrentWidget(ui->senceEditOption);
}
}
void MainWindow::on_pushButtonReduceTextDisplay_pressed()
{
ui->widgetPrintTextDisplay->reduceDisplay();
}
void MainWindow::on_pushButtonEnlargeTextDisplay_pressed()
{
ui->widgetPrintTextDisplay->enlargeDisplay();
//update();
}
/*
* value以100ms为单位
* */
void MainWindow::onReclainTankPositionChanged(int value){
static bool init = false;
static int totalCharNum = 0;
if(!init){
int w = ui->labelReclaimStatus->geometry().width() - 1; //预留几个像素
QFontMetrics fontMetrics = QApplication::fontMetrics();
w -= fontMetrics.width(QString(" |>|"));
int t = fontMetrics.width(QChar('-'));
if(fontMetrics.width(QChar('-')) != fontMetrics.width(QChar(' '))){
LogInfo::setRunStatusText(tr("警告:‘-’和空格的宽度不一样")); //可能有的字体两者宽度不同
}
totalCharNum = t?w/t:w; //t永远都不应该为零,保险起见
init = true;
}
if(sysPara){
int reclaimTime = sysPara->para.reclaimTankTime?sysPara->para.reclaimTankTime:15;
int charNum = value*totalCharNum/(reclaimTime*10);
charNum = (charNum > totalCharNum)?totalCharNum:charNum;
QString str = " |";
for(int i = 0; i <= totalCharNum; i++) { //多加”>|“
if(i < charNum)
str.append(QChar('-'));
else if(i == charNum)
str.append(QChar('>'));
else
str.append(QChar(' '));
}
str.append(QChar('|'));
ui->labelReclaimStatus->setText(str);
}
}
void MainWindow::setRunStatus(QString str){
switch(sysPara->devOp->color_flag){
case 1:
ui->labelRunStatus->setStyleSheet("color:yellow");
break;
case 2:
ui->labelRunStatus->setStyleSheet("color:red");
break;
default:
ui->labelRunStatus->setStyleSheet("color:black");
break;
}
ui->labelRunStatus->setText(str);
}
void MainWindow::changeTxtMode(QString str){
if(sysPara){
fileChange=true;
sysPara->status.FileChangeRestCntFlag = true;
emit openFileChange();
unsigned char SpecialVarEnable = 0;
sysPara->devOp->fpgaWr(0xa4b0,(unsigned char *)&SpecialVarEnable,1);
}
}
void MainWindow::update_scroll()
{
ui->widgetPrintTextDisplay->scroll_update();
}
void MainWindow::changeEditMode(int editMode)
{
if(sysPara){
//qDebug()<<"changeEditMode"<<sysPara->para.EditMode;
if(sysPara->para.EditMode==PICFILE){
ui->stackedWidgetText->setCurrentWidget(ui->pagePrintTextDisplay);
ui->stackedWidgetOption->setCurrentWidget(ui->pageOption);
ui->widgetPrintTextDisplay->update();
ui->pushButtonTXTOpen->show();
ui->textEditOption->editMode=sysPara->para.EditMode;
}
else if(sysPara->para.EditMode==TXTFILE)
{
// ui->stackedWidgetText->setCurrentWidget(ui->pageTextEdit);
// ui->stackedWidgetOption->setCurrentWidget(ui->textEditOption);
sysPara->para.EditMode=TXTFILE;
ui->stackedWidgetText->setCurrentWidget(ui->pageTextEdit);
ui->stackedWidgetOption->setCurrentWidget(ui->textEditOption);
ui->widgetPrintTextDisplay->update();
ui->pushButtonTXTOpen->hide();
ui->textEditOption->editMode=sysPara->para.EditMode;
ui->textEditOption->editItemModeDone();
}
else if(sysPara->para.EditMode==SCENE)
{
//qDebug()<<"CCCCCENE";
sysPara->para.EditMode=SCENE;
ui->stackedWidgetText->setCurrentWidget(ui->fileSceneViewer);
ui->stackedWidgetOption->setCurrentWidget(ui->senceEditOption);
ui->widgetPrintTextDisplay->update();
ui->pushButtonTXTOpen->hide();
ui->textEditOption->editMode=sysPara->para.EditMode;
//edit@12-12
ui->senceEditOption->show_scene_new_dlg();
}
//ontextEdittextChanged(); //显示大小 20140831
if(sysPara->para.EditMode==SCENE)
{
onSwitchTimerShowItem(true);
}
else
{
onSwitchTimerShowItem(false);
}
}
}
TextEditOption* MainWindow::getTexteditOption()
{
return ui->textEditOption;
}
void MainWindow::SetEditMode(int mode)
{
ui->textEditOption->editMode = sysPara->para.EditMode;
// if(sysPara->para.EditMode==SCENE)
// {
// timerShowItem->start(10);
// }
}
void MainWindow::setRunStatus(QPixmap pixMap){
ui->labelRunStatus->setPixmap(pixMap);
}
void MainWindow::SetMainTabEdit(int n){
}
void MainWindow::testPrint(){
//on_pushButtonStartPrint_pressed();
}
void MainWindow::onEditBarCode(){
#ifdef _2DCODE_
if(sysPara) {
dlgqrcode->move( 0,10);
barcode->setWindowTitle(tr("条形码信息编辑"));
//qDebug()<<"bcOption->height"<<sysPara->para.bcOption.height;
barcode->SetOption((bcOption_t*)&sysPara->para.bcOption);
barcode->show();
//barcode->GetOption((bcOption_t*)&sysPara->para.bcOption);
}
#endif
}
void MainWindow::onBarCodeClose(){
#ifdef _2DCODE_
barcode->GetOption((bcOption_t*)&sysPara->para.bcOption);
unsigned char *dat;
bool MaxCol4000;
if(sysPara->status.flagOfNo67FPGA)
MaxCol4000 = true;
else
MaxCol4000 = false;
if(MaxCol4000){
dat =sysPara->status.printDat_Normal;
}else{
dat =sysPara->status.printDat;
}
if(barcode->flagCount)
{
barcode->getDat(dat,0);
barcode->flagCount=0;
ui->widgetPrintTextDisplay->update();
}
if(barcode->flagInsert )
{
barcode->flagInsert=0;
if(sysPara->para.EditMode==PICFILE)
{
}
else
{
//ui->textEditOption->InsertBarCodeToEdit(barcode->pictureName,barcode->imgBar.width(),barcode->imgBar.height());
QString html = "<img src='" + barcode->pictureName + "'/>";
QTextCharFormat fmt = ui->textEditOption->textEdit->currentCharFormat ();
ui->textEditOption->textEdit->insertHtml (html);
ui->textEditOption->textEdit->mergeCurrentCharFormat(fmt);
ui->stackedWidgetText->setCurrentWidget(ui->pageTextEdit);
ui->stackedWidgetOption->setCurrentWidget(ui->textEditOption);
}
}
sysPara->saveParaToFile();
#endif
}
void MainWindow::onEditQRCode(){
#ifdef _2DCODE_
if(sysPara) {
dlgqrcode->SetOption((qrOption_t*)&sysPara->para.qrOption);
dlgqrcode->move( (this->width() - dlgqrcode->width())/2 ,10);
dlgqrcode->setWindowTitle(tr("二维码信息编辑"));
dlgqrcode->setCntCheckBoxHide(1);
dlgqrcode->show();
}
#endif
}
void MainWindow::onInitQRCode(){
#ifdef _2DCODE_
if(sysPara) {
dlgqrcode->SetOption((qrOption_t*)&sysPara->para.qrOption);
dlgqrcode->move( (this->width() - dlgqrcode->width())/2 ,10);
dlgqrcode->setWindowTitle(tr("二维码信息编辑"));
//dlgqrcode->show();
}
#endif
}
void MainWindow::onQRCodeClose(){
#ifdef _2DCODE_
// dlgqrcode->GetOption((qrOption_t*)&sysPara->para.qrOption);
if(dlgqrcode->flagInsert ) {
dlgqrcode->GetOption((qrOption_t*)&sysPara->para.qrOption);
dlgqrcode->flagInsert=0;
if(sysPara->para.EditMode==PICFILE){
return;
}
// qDebug()<<"flagInsert2"<<dlgqrcode->flagInsert<<dlgqrcode->bcWidth<<dlgqrcode->bcHeight;
ui->textEditOption->InsertBarCodeToEdit(dlgqrcode->pictureName,dlgqrcode->bcWidth,dlgqrcode->bcHeight);
ui->stackedWidgetText->setCurrentWidget(ui->pageTextEdit);
ui->stackedWidgetOption->setCurrentWidget(ui->textEditOption);
}
if( sysPara->para.qrOption.barCodeFlag != dlgqrcode->barCodeFlag)
{
sysPara->para.qrOption.barCodeFlag = dlgqrcode->barCodeFlag;
ui->textEditOption->textEdit->setHtml(QApplication::translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;\">\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'wenquanyi'; font-size:10pt;\"><br /></p></body></html>", 0));
}
sysPara->saveParaToFile();
#endif
}
void MainWindow::onGenerateQRCode(QString strData)
{
dlgqrcode->extSetText(strData);
dlgqrcode->GetOption((qrOption_t *)&sysPara->para.qrOption);
}
void MainWindow::onShowAndHideItem()
{
/////////特殊条件
//while(1)
{
static bool startFlag= false, lastStarFlag = false;
QList<QGraphicsItem *> items = pPicScene->items();
foreach (QGraphicsItem *item, items)
{
PicTextItem *picText = qgraphicsitem_cast<PicTextItem*>(item);
if(picText->SpecialConditions)
{
//setRunStatus(tr("六个内容(%1,%2)").arg(picText->CatchCnt1CurrValue).arg(QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt()));
if(picText->CatchCnt1StartValue <= QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt() &&
QString::number(sysPara->status.calandar_and_dat.cnt1CurrValue,16).toInt() <= picText->CatchCnt1CurrValue)
{
picText->show();
startFlag = true;
}
else
{
picText->hide();
startFlag = false;
}
if(startFlag != lastStarFlag)
{
lastStarFlag = startFlag;
//on_pushButtonStartPrint_pressed();
if(sysPara->para.EditMode == TXTFILE||sysPara->para.EditMode== PICFILE)
PreviewPressed(); //生成打印数据,确定变量的位置和对应生成字模
else if(sysPara->para.EditMode == SCENE)
onPreviewScene();
// unsigned char blankDat[BLANK_COL_NUM*MAX_PRINT_ROW_BYTE_NUM];
// memset(blankDat,0,sizeof(blankDat));
// sysPara->devOp->fpgaWr(0,blankDat,sizeof(blankDat));//...所加的空白偏移地址
// sysPara->devOp->fpgaWr(sizeof(blankDat),sysPara->status.printDat,sizeof(sysPara->status.printDat)-sizeof(blankDat));
}
}
}
//QApplication::processEvents();
}
//////////////
}
void MainWindow::onSwitchTimerShowItem(bool flag)
{
if(flag)
{
// timerShowItem->start(10);
}
else
{
timerShowItem->stop();
unsigned char SpecialVarEnable = 0;
sysPara->devOp->fpgaWr(0xa4b0,(unsigned char *)&SpecialVarEnable,1);
}
}
void MainWindow::JSON_UpdateDATA(){
QLabel *labelFontSize = ui->textEditOption->getLabelFontSize();
bool ok;
int font_size = labelFontSize->text().toInt(&ok,10);
QString font_family = Public::getFontFamily(font_size);
static int save_uniCode = 33; //数据码固定33位
ui->textEditOption->textEdit->clear();//宴令需要屏蔽
QString strContentPrint(sysPara->Get_JSON_DATA.PrintingContent);
strContentPrint.replace(' ',"&nbsp;");
QString strContent = sysPara->Get_JSON_DATA.QRCodeContent;
int left_int = strContent.indexOf("https://dwz.cn/");
if(left_int == 0)
{
strContent = strContent.mid(8, strContent.size());
strContent = "www." + strContent;
}
if(sysPara->para.isRemoveCode)
{
QSize size(2,5);
QImage image(size,QImage::Format_ARGB32);
image.fill(0x00ffffff);//填充白色
//image.fill(0x00f0f000);//填充白色
// QPainter painter(&image);
// //image.save("./printImage.jpg");
// ui->textEdit->document()->drawContents (&painter, image.rect()); /*将text写到pic*/
image.save("/home/plg/doc/modbusQR.bmp");
}
else
{
if(dlgqrcode->barCodeFlag == 1)
{
barcode->extSetText(QString::fromUtf8(strContent.toStdString().c_str()));
barcode->GetOption((bcOption_t*)&sysPara->para.bcOption);
}
else
{
dlgqrcode->extSetText(QString::fromUtf8(strContent.toStdString().c_str()), true);
dlgqrcode->GetOption((qrOption_t *)&sysPara->para.qrOption);
}
}
QString save_text = ui->textEditOption->textEdit->toHtml();
if(save_text.contains("<img src=\"/home/plg/doc/modbusQR.bmp\" />", Qt::CaseSensitive)){
int left_int = save_text.indexOf("<img src=\"/home/plg/doc/modbusQR.bmp\" />");
QString str_html = save_text.left(left_int); //get the QRcode pic left html
QString right_str_html = save_text.mid(left_int, save_text.size());
if(!sysPara->para.isRemoveDigitCode)
{
str_html += "<img src=\"/home/plg/doc/modbusQR.bmp\" />";
left_int = right_str_html.indexOf(";\">") + 1;
int index_size = QString(";\">").size();
QString right_html = right_str_html.mid(left_int+index_size+save_uniCode, right_str_html.size());
save_uniCode = QString::fromUtf8(sysPara->Get_JSON_DATA.ProductUniqueCode).size();
// qDebug()<<"right_html="<<right_html;
QString txt_fomart = QString::fromUtf8("<span style=\" font-family:'%1'; font-size:%2pt;font-weight:%3;\">&nbsp;").arg(font_family)
.arg(font_size).arg(ui->textEditOption->getCheckBoxBold()->isChecked()? 600:400);
txt_fomart += QString::fromUtf8(sysPara->Get_JSON_DATA.ProductUniqueCode);
if(!right_html.startsWith("<")){ //situation: "$ProductUniqueCodexxxx</span>"
QString crash_word = right_html.left(right_html.indexOf("<"));
txt_fomart += crash_word;
// qDebug()<<"crash_word="<<crash_word;
}
txt_fomart += "</span>";
str_html += txt_fomart;
left_int = right_html.indexOf("</span>");
index_size = QString("</span>").size();
QString final_str = right_html.mid(left_int +index_size, right_html.size());
str_html += final_str;
}
else
{
str_html += right_str_html;
}
// QMessageBox::StandardButton ret;
// ret = QMessageBox::question(this, tr("提示"),tr("是否接收新的信息!"), QMessageBox::Ok | QMessageBox::Cancel);
// if (ret == QMessageBox::Ok)
{
ui->textEditOption->textEdit->setHtml(str_html);
ui->textEditOption->textEdit->moveCursor(QTextCursor::EndOfLine);
}
}else{
QString txt_fomart = "";
txt_fomart = QString::fromUtf8("<span style=\" font-family:'%1'; font-size:%2pt;font-weight:%3;\">").arg(font_family).arg(font_size)
.arg(ui->textEditOption->getCheckBoxBold()->isChecked()? 600:400);
txt_fomart += strContentPrint.toUtf8();
txt_fomart += "</span>";
txt_fomart += "<img src=\"/home/plg/doc/modbusQR.bmp\" />";
if(!sysPara->para.isRemoveDigitCode)
{
txt_fomart += QString::fromUtf8("<span style=\" font-family:'%1'; font-size:%2pt;font-weight:%3;\">&nbsp;").arg(font_family).arg(font_size)
.arg(ui->textEditOption->getCheckBoxBold()->isChecked()? 600:400);
txt_fomart += QString::fromUtf8(sysPara->Get_JSON_DATA.ProductUniqueCode);
save_uniCode = QString::fromUtf8(sysPara->Get_JSON_DATA.ProductUniqueCode).size();
txt_fomart += "</span>";
}
else
{
txt_fomart += QString::fromUtf8("<span style=\" font-family:'%1'; font-size:%2pt;font-weight:%3;\">&nbsp;</span>").arg(font_family).arg(font_size);
}
// QMessageBox::StandardButton ret;
// ret = QMessageBox::question(this, tr("提示"),tr("是否接收新的信息!"), QMessageBox::Ok | QMessageBox::Cancel);
// if (ret == QMessageBox::Ok)
{
ui->textEditOption->textEdit->insertHtml(txt_fomart);
}
// QString refresh_text = ui->textEditOption->textEdit->toHtml();
// ui->textEditOption->textEdit->setHtml(refresh_text);
// ui->textEditOption->textEdit->moveCursor(QTextCursor::EndOfLine);
}
if(sysPara->para.EditMode == TXTFILE||sysPara->para.EditMode== PICFILE)
PreviewPressed(); //生成打印数据,确定变量的位置和对应生成字模
else if(sysPara->para.EditMode == SCENE)
onPreviewScene();
//on_pushButtonStartPrint_pressed();
ui->label_24->setFocus(); //prevent keyboard pop up
}
QStringList stringListRecive;
// mdOpenFile(QString("/home/plg/doc/%1").arg(fileName));
void MainWindow::modbusUpdateQRCode(){
// QString temp = QString();
sysPara->modbusStatus.printFinishFlag = 0;//置打印标志
sysPara->status.printDoneFlag = false;
static QString lastReceiveContent = "";
char temp[120] = {0};
int i,j = 0;
for(i=0; i<110; i+=2)
{
//if(sysPara->modbusParas.QRcode_buf[i] == 0) break;
temp[j] = sysPara->modbusParas.QRcode_buf[i];
j++;
}
if(strlen(&temp[1]) == 0)
{
LogInfo::setRunStatusText(tr("获取DM码内容为空!"));
return;
}
if(sysPara->para.EditMode == TXTFILE)
{
QString receiveContent = QString::fromUtf8(&temp[1]);
dlgqrcode->extSetText(receiveContent);
LogInfo::setRunStatusText(tr("获取DM码内容:"));
LogInfo::setRunStatusText(tr("receiveContent").arg(receiveContent));
// dlgqrcode->extSetText("asbasb");
dlgqrcode->GetOption((qrOption_t *)&sysPara->para.qrOption);
// ui->textEditOption->modbus_insert_pic("/home/plg/doc/QR_aa.bmp");
ui->textEditOption->textEdit->clear();//插入之前先清空
//ui->textEditOption->modbus_insert_pic("/home/plg/doc/modbusQR.bmp");
QString html = "<img src=\"/home/plg/doc/modbusQR.bmp\" />";
ui->textEditOption->textEdit->setHtml(html);
ui->textEditOption->textEdit->moveCursor(QTextCursor::EndOfLine);
//sysPara->modbusStatus.printFinishFlag = 0;//置打印标志
if(receiveContent == lastReceiveContent)
{
LogInfo::setRunStatusText(tr("获取DM码内容跟上次相同"));
//sysPara->modbusStatus.printFinishFlag = 1;//置打印标志
MySleep(200);
sysPara->status.printDoneFlag = true;
return;
}
lastReceiveContent = receiveContent;
sysPara->status.oneCodePrintOnce = true;
on_pushButtonStartPrint_pressed();//开始打印
}
else if(sysPara->para.EditMode == SCENE)
{
QString receiveContent = QString::fromUtf8(&temp[1]);
LogInfo::setRunStatusText(tr("获取DM码内容:"));
LogInfo::setRunStatusText(tr("receiveContent").arg(receiveContent));
if(receiveContent == lastReceiveContent)
{
LogInfo::setRunStatusText(tr("获取DM码内容跟上次相同"));
MySleep(200);
sysPara->status.printDoneFlag = true;
return;
}
lastReceiveContent = receiveContent;
stringListRecive = receiveContent.split(";");
QString lastopenedFileName = sysPara->para.lastOpenedFileName;
lastopenedFileName = QFileInfo(lastopenedFileName).baseName();
int left_int = lastopenedFileName.indexOf('@');
if(left_int == 0)
{
sysPara->status.forTemplateUse = true;
emit scenefileOpen(sysPara->para.lastOpenedFileName,false);//sceneeditoption 接收这个信号然后打开文件
//emit fileNameChanged(QFileInfo(filePath).fileName());
sysPara->status.forTemplateUse = false;
sysPara->status.oneCodePrintOnce = true;
on_pushButtonStartPrint_pressed();//开始打印
}
}
}
void MainWindow::onUpdateDispQRCode(int type){
#ifdef _2DCODE_
int varNum;
qDebug()<<"onUpdateDispQRCode";
//QRcode string test
// static int cc = 0;
for(varNum=0;varNum<sysPara->status.QRvariNum;varNum++){
if(sysPara->print.QRvars[varNum].type<2)
{
sysPara->print.QRvars[varNum].Counter = sysPara->para.qrOption.counter;
sysPara->print.QRvars[varNum].cntNum = sysPara->para.qrOption.cntNum;
dlgqrcode->TextToQRImg((qrOption_t *)&sysPara->para.qrOption);
dlgqrcode->getDat(sysPara,varNum);
}else if(sysPara->print.QRvars[varNum].type==2)
{
QString txt,txt2,txt3,txt4,txtVar1,txtVar2;
//char fmt[]="%08d%04d";
txt2=sysPara->para.bcOption.TxtModule;
txt3=sysPara->para.bcOption.TxtLine;
txt4=sysPara->para.bcOption.TxtLine1;
sysPara->para.bcOption.var1Type =1;
sysPara->para.bcOption.var2Type =2;
txtVar1=barcode->getVarTxt(sysPara->para.bcOption.var1En,sysPara->para.bcOption.var1Type);
txtVar2=barcode->getVarTxt(sysPara->para.bcOption.var2En,sysPara->para.bcOption.var2Type);
//txt.sprintf(fmt,sysPara->status.calandar_and_dat.cnt1CurrValue,sysPara->status.calandar_and_dat.cnt2CurrValue);
txt = txt2.trimmed()+txtVar1+txt3.trimmed()+txtVar2+txt4.trimmed();
barcode->TextToBCImg((bcOption_t *)&sysPara->para.bcOption,txt); //
barcode->getDat2(sysPara,varNum);
//qDebug()<<"update BAR"<<sysPara->status.calandar_and_dat.cnt1CurrValue<<sysPara->status.calandar_and_dat.cnt2CurrValue;
//qDebug()<<txt;
}
sysPara->print.QRvars[varNum].startRowPos = sysPara->print.QRvars[varNum].endRowPos-sysPara->print.QRvars[varNum].height;
if(sysPara->status.currPrintCol < (sysPara->print.QRvars[varNum].startColPos+sysPara->print.QRvars[varNum].width)) {
sysPara->status.currPrintCol = sysPara->print.QRvars[varNum].startColPos+sysPara->print.QRvars[varNum].width;
}
if (sysPara->status.currPrintRow<sysPara->print.QRvars[varNum].endRowPos) {
sysPara->status.currPrintRow = sysPara->print.QRvars[varNum].endRowPos;
}
//sysPara->status.currPrintCol = (sysPara->status.currPrintCol<sysPara->print.QRvars[varNum].startColPos+sysPara->print.QRvars[varNum].width)?
// sysPara->print.QRvars[varNum].startColPos+sysPara->print.QRvars[varNum].width:sysPara->status.currPrintCol;
//sysPara->status.currPrintRow = (sysPara->status.currPrintRow<sysPara->print.QRvars[varNum].endRowPos)?sysPara->print.QRvars[varNum].endRowPos:sysPara->status.currPrintRow;
// qDebug()<<"onUpdate:"<< sysPara->print.QRvars[varNum].startColPos
// <<sysPara->print.QRvars[varNum].endRowPos <<sysPara->print.QRvars[varNum].width
// <<sysPara->print.QRvars[varNum].height <<sysPara->print.QRvars[varNum].type;
}
if(type)
{
sysPara->para.qrOption.DisplayUpdate=1;
// ui->widgetPrintTextDisplay->updateSysStatusToUI();
if(sysPara->status.addSpace)
ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol/2,sysPara->status.currPrintRow);
else ui->widgetPrintTextDisplay->setDisplaySize(sysPara->status.currPrintCol,sysPara->status.currPrintRow);
ui->stackedWidgetText->setCurrentWidget(ui->pagePrintTextDisplay);
ui->stackedWidgetOption->setCurrentWidget(ui->pageOption);
ui->labelTextWidthHeight->setText(tr("[ %1行 x %2列 ]").arg(sysPara->status.currPrintRow ).arg(sysPara->status.currPrintCol));
ui->widgetPrintTextDisplay->update();
//qDebug()<<"update BAR ??";
}
#endif
}
int MainWindow::searchExpiryVar(QString html)
{
int varNum = 0;
if( sysPara->status.ExpiryVarNum || sysPara->status.CurrDateVariNum || sysPara->status.classVariNum)
{
QString pattern = "<img src=\":/(\\d*)/(\\d*)/../image/(\\w*).bmp\" width=\"(\\d*)\" height=\"(\\d*)\" />";
// 1 type ,2 name,3 width,4 height
//<img src=":/80/image/expiryDate8.bmp" width="16" height="16" /></p><
//<img src=":/81/image/curDate8.bmp" width="25" height="21" />
QRegExp rx(pattern);
QString textHtml = html==""? ui->textEdit->toHtml() : html;
// qDebug() << "searchExpiryVar:"<< textHtml;
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;
if(from != -1)
{
from ++;
if(varNum < 3)
{
QString s = rx.cap(3);
int type = rx.cap(1).toInt(&ok);
// 填充信息
//qDebug()<<"QVARName:"<<type<<rx.cap(1)<<rx.cap(2)<<rx.cap(3)<<rx.cap(4);
if(type==EXPIRYDATE || type==EXPIRYDATE + 10 || type==EXPIRYDATE + 20 || type==EXPIRYDATE + 30)
{ //expiryDate
//qDebug()<<"ExpiryVar:"<<type<<rx.cap(1)<<rx.cap(2).left(10)<<rx.cap(2)<<rx.cap(3)<<rx.cap(4);
sysPara->print.ExpiryVar.type = type;
sysPara->print.ExpiryVar.width = rx.cap(4).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ;
sysPara->print.ExpiryVar.height = rx.cap(5).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);
sysPara->print.ExpiryVar.letterSpace = rx.cap(2).toInt();
if(sysPara->print.ExpiryVar.startRowPos < 0)
{
sysPara->print.ExpiryVar.startRowPos = 0;
}
if(rx.cap(3).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(4).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ;
sysPara->print.CurDateVar.height = rx.cap(5).toInt(&ok);
sysPara->print.CurDateVar.startRowPos = sysPara->print.CurDateVar.endRowPos-(sysPara->print.CurDateVar.height-1);
sysPara->print.CurDateVar.letterSpace = rx.cap(2).toInt();
if(sysPara->print.CurDateVar.startRowPos < 0)
{
sysPara->print.CurDateVar.startRowPos = 0;
}
if(rx.cap(3).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"<<sysPara->print.CurDateVar.startRowPos<<" height"<<sysPara->print.CurDateVar.height;
// 生产日期即当前日期
ExpiryDotUpdate(2);
varNum++;
}
else if(type == CURCLASS)
{
//qDebug()<<"CURCLASS:"<<type<<rx.cap(1)<<rx.cap(2).contains("875")<<rx.cap(2)<<rx.cap(3)<<rx.cap(4);
EXPIRYVAR_t *currClass = &sysPara->print.ClassVari ;
currClass->type = type;
currClass->width = rx.cap(4).toInt(&ok);// *(sysPara->status.addSpace && type==9 ?2:1) ;
currClass->height = rx.cap(5).toInt(&ok);
currClass->startRowPos = currClass->endRowPos-currClass->height-1;
currClass->letterSpace = rx.cap(2).toInt();
if(rx.cap(3).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"<<sysPara->print.CurDateVar.startRowPos<<" height"<<sysPara->print.CurDateVar.height;
// 生产日期即当前日期
ExpiryDotUpdate(3);
varNum++;
}
}
else if(varNum>=3) break;
}
//break;
//if(varNum>sysPara->status.ExpiryVarNum)break;
}
}
return varNum;
}
void MainWindow::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<int, QString> 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("<span style=\" font-family:'%1'; font-size:%2pt; font-weight:%3;\">%4</span>")
.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("<span style=\" font-family:'%1'; font-size:%2pt; font-weight:%3;\">%4</span>")
.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, p_var->letterSpace);
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++;
}
}
}
int MainWindow::searchQrVar(){
int varNum = 0;
if( sysPara->status.QRvariNum){
QString pattern = "<img src=\":/(\\d*)/image/(\\w*).bmp\" width=\"(\\d*)\" height=\"(\\d*)\" />";
// 1 type ,2 name,3 width,4 height
//<img src=":/9/image/DMTV16.bmp" width="16" height="16" /></p><
//<img src=":/10/image/QRV21.bmp" width="25" height="21" />
QRegExp rx(pattern);
//QString textHtml = ui->textEdit->toHtml();
/////////////
QTextEdit textEdit ;
for(int i=0;i<sysPara->status.QRvariNum;i++)
{
if(sysPara->print.QRvars[i].type==0){
textEdit.insertHtml(QString("<img src=':/%1/image/DMTV%2.bmp' height='%2' width='%3' />")
.arg(9).arg(sysPara->para.qrOption.height).arg(sysPara->para.qrOption.width)); //插入索引后
}
else if(sysPara->print.QRvars[i].type==1){
textEdit.insertHtml(QString("<img src=':/%1/image/QRV%2.bmp' height='%2' width='%3' />")
.arg(10).arg(sysPara->para.qrOption.height).arg(sysPara->para.qrOption.width)); //插入索引后
}
else if(sysPara->print.QRvars[i].type==2){
textEdit.insertHtml(QString("<img src=':/%1/image/BARV%2.bmp' height='%2' width='%3' />")
.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()<<xx<<"from:"<<from;
if(from != -1){
from ++;
if(varNum < 4){
QString s = rx.cap(2);
int type = rx.cap(1).toInt(&ok);
// 填充信息
//qDebug()<<"QVARName:"<<type<<rx.cap(1)<<rx.cap(2)<<rx.cap(3)<<rx.cap(4);
if(type<20 && type>=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;
//qDebug()<<"type:"<<varNum<<sysPara->print.QRvars[varNum].type<<sysPara->status.QRvariNum
// <<sysPara->print.QRvars[varNum].startColPos<<sysPara->print.QRvars[varNum].startRowPos<<sysPara->print.QRvars[varNum].endRowPos
// <<sysPara->print.QRvars[varNum].width<<sysPara->print.QRvars[varNum].height
// <<rx.cap(1)<<rx.cap(2)<<rx.cap(3)<<rx.cap(4);
//type: 0 1 1 0 0 21 25 21 "10" "QRV21" "25" "21"
//type: 0 2 1 0 0 12 325 12 "11" "BARV12" "325" "12"
varNum++;
//break;
}
}
}
}
}
return varNum;
}
PicScene* MainWindow::getPicScene()
{
return pPicScene;
}
void MainWindow::on_pushButtonCleanUP_pressed(){
emit InkjetCleanUP();
}
void MainWindow::ShowWarnningText1(QString strTitle,QString strWarring){
dlgMyWarring.SetTitleText(strTitle);
dlgMyWarring.SetWarringText(strWarring);
dlgMyWarring.show();
dlgMyWarringShowDlyCnt =20;
}
void MainWindow::onStatusHighVoltageFault(){
#ifdef X86TEST
#else
if(!(sysPara->status.statWarn & WARN_STATUS_POWER_MON)) return;
#endif
strTitle = tr("高压故障,暂停打印.");
strWarring = tr("高压故障:两高压偏转板间的电压检测异常");strWarring.append("\r\n");
strWarring.append(tr("1.高压偏转板和高压底座潮湿、脏污,请清洗并吹干高压板和高压底座;"));strWarring.append("\r\n");
strWarring.append( tr("2.机器更换主板或者高压包,请进入“系统设置”点击“重置高压”,字高设置为90时,重置高压报警值应在480—550之间;"));strWarring.append("\r\n");
//strWarring.append( tr("字高设置为90时,重置高压报警值应在480—550之间;"));strWarring.append("\r\n");
strWarring.append( tr("3.高压线路漏电,请更换高压线路;"));strWarring.append("\r\n");
strWarring.append( tr("4.高压底座漏电,请更换高压底座。"));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
void MainWindow::onStatusInkLeak(){
#ifdef X86TEST
#else
if(!(sysPara->status.statWarn & WARN_STATUS_SUMP_WARN)) return;
#endif
strTitle = tr("墨水缸满报警");
strWarring = tr("墨水过多:墨水溢出");strWarring.append("\r\n");
strWarring.append(tr("1. 请停止添加墨水;"));strWarring.append("\r\n");
strWarring.append(tr("2. 请排出多余墨水。"));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
void MainWindow::onStatusInkSwint(){
if(!(sysPara->status.statWarn & WARN_STATUS_INK_SWINT)) return;
}
void MainWindow::onStatusInkWaterLevel(){
#ifdef X86TEST
#else
if(!(sysPara->status.statWarn & WARN_STATUS_INK_WARN)) return;
#endif
strTitle = tr("墨水液位报警");
strWarring = tr("墨水液位:墨水即将耗尽");strWarring.append("\r\n");
strWarring.append(tr("1. 墨水耗尽,3小时后将自动关机,请及时添加墨水。"));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
void MainWindow::onStatusRecycleWarn(){
#ifdef X86TEST
#else
if(!(sysPara->status.statWarn & WARN_STATUS_RECYCLE_FAULT)) return;
#endif
strTitle = tr("回收故障,关闭回收槽,关墨线");
strWarring = tr("回收故障:未检测到有墨水回收");strWarring.append("\r\n");
strWarring.append( tr("1. 墨水未射入回收管,请修正墨线方向;"));strWarring.append("\r\n");
strWarring.append( tr("2. 墨水粘度太低,请更换新墨水;"));strWarring.append("\r\n");
strWarring.append( tr("3. 回收管堵塞,请清通或者更换回收管;"));strWarring.append("\r\n");
strWarring.append(tr("4. 回收泵故障,请清洗或者更换回收泵;"));strWarring.append("\r\n");
strWarring.append( tr("5. 确认各参数及设备无异常后请进入“打印设置”取消“回收故障处理”的勾选,退回主窗口界面点击“故障恢复”按钮."));strWarring.append("\r\n");
//strWarring.append( tr(" 退回主窗口界面点击“故障恢复”按钮."));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
void MainWindow::onStatusSolvLevelWarn(){
#ifdef X86TEST
#else
if(!(sysPara->status.statWarn & WARN_STATUS_SOLV_WARN)) return;
#endif
strTitle = tr("溶剂液位报警");
strWarring = tr("溶剂液位:溶剂即将耗尽");strWarring.append("\r\n");
strWarring .append(tr("1. 溶剂耗尽,3小时后将自动关机,请及时添加溶剂。"));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
void MainWindow::onStatusViscosityWarn(){
#ifdef X86TEST
#else
if(sysPara->status.viscosityFault==1)
#endif
{
strTitle = tr("粘度故障报警");
strWarring = tr("粘度故障:墨水粘度无法自动调整");strWarring.append("\r\n");
strWarring.append( tr("1. 混合阀失灵,请冲洗或者更换混合阀;"));strWarring.append("\r\n");
strWarring.append( tr("2. 墨水罐内的墨水异常,请更换新墨水;"));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
#ifdef X86TEST
#else
}
else if(sysPara->status.viscosityFault==2)
{
#endif
strTitle = tr("粘度故障报警");
strWarring= tr("粘度计异常:");strWarring.append("\r\n");
strWarring.append(tr("1. 泵前过滤网堵塞,请更换泵前滤网;"));strWarring.append("\r\n");
strWarring.append( tr("2. 粘度泵异常,请清洗或更换粘度泵;"));strWarring.append("\r\n");
strWarring.append(tr("3. 粘度传感器异常,请检查传感器线路或者更换传感器."));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
}
void MainWindow::onStatusChargefault(){
#ifdef X86TEST
#else
if(sysPara->status.lastPhaseFault)
#endif
{
strTitle = tr("相位故障报警");
strWarring = tr("相位故障:相位信号检测异常");strWarring.append("\r\n");
strWarring.append(tr("1. 墨水分裂不正常,请调整墨水分裂;"));strWarring.append("\r\n");
strWarring.append(tr("2. 充电槽或者相检头脏污,请清洗充电槽和相检头;"));strWarring.append("\r\n");
strWarring.append(tr("3. 放大板功能性异常,请更换放大板;"));strWarring.append("\r\n");
strWarring.append( tr("4. 相检头和墨线的距离过远,请检测喷头活动机构,调整相检头和墨线间的距离;"));strWarring.append("\r\n");
strWarring.append( tr("5. 地线未接或者外界干扰,请连接地线或者隔离外界干扰;"));strWarring.append("\r\n");
strWarring.append( tr("6. 墨水质量异常,请更换新墨水。"));strWarring.append("\r\n");
emit ShowWarnningText(strTitle,strWarring);
}
}
void MainWindow::OnFinished(int event){
//msgtest->setText("孔一:60分钟灌浆结束条件!请点击\"结束\"按钮!");
//msgtest->show();
msgtest->hide();
}
void MainWindow::onPreviewScene()
{
pPicScene->clearSelection();
QSize size(pPicScene->itemsBoundingRect().width(),pPicScene->itemsBoundingRect().height());
QImage image(size,QImage::Format_ARGB32);
image.fill(0x00ffffff);//填充白色
QPainter painter(&image);
pPicScene->render(&painter,QRectF(),pPicScene->itemsBoundingRect());
int coldot=0;
if(sysPara){
bool MaxCol4000 = sysPara->status.flagOfNo67FPGA;
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));
}
{
sysPara->status.addSpace = sysPara->para.checkSpace;
coldot = (int)ui->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 = MAX_PRINT_ROW_NUM > maxPicHeight? maxPicHeight:MAX_PRINT_ROW_NUM; //MAX_PRINT_ROW_NUM=40
int TempVarNum=0;
int varLastRow=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);
// 修改code判断逻辑
long unsigned int rgbValue = rgb & COLOR_MASK;
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;
}
else TempVarNum++;
}
}
else if( (rgbValue == MDT_RGB) || (rgbValue == QR_RGB) ||
(rgbValue == BAR_RGB)){
if(sysPara->status.QRvariNum>=4)continue;
if(rgbValue == MDT_RGB) { //MDT
handleCode(i,j,&varLastRow, MDT);
}
else if(rgbValue == QR_RGB) { //QR
handleCode(i,j,&varLastRow, QR);
}
else if(rgbValue == BAR_RGB) { //BAR
handleCode(i,j,&varLastRow, BAR);
}
if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4;
}
else if((rgb & 0x00ffffff)==EXPIRY_VARI_RECONISE)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
}
else if((rgb & 0xfffff0)==0xff0cf0)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
}
else if((rgb & 0xffffff)==0xff00ff)
{ // 有效期变量 : 处理变量, 查找左下角,因为同一行的左下角是对齐的
}
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;
}
}
}
}/*判断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);
}
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
// 处理变量和常量的渲染和更新
handleSceneShow(MaxCol4000, dat);
if(sysPara->status.currPrintRow>MAX_PRINT_ROW_NUM-1)sysPara->status.currPrintRow=MAX_PRINT_ROW_NUM-1;
bool found=0;
lastRow = sysPara->status.currPrintRow;
for(int j = sysPara->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;
break;
}
}
if(found)
break;
}
if(lastRow>MAX_PRINT_ROW_NUM-1)lastRow = MAX_PRINT_ROW_NUM-1;
if(lastRow<varLastRow)lastRow= varLastRow-1;//在场景模式下,变量的最低一行并不一定是打印的最后一行
if(lastRow<1) lastRow =1;
// lastRow只检测了一部分,优先选择大的那个
sysPara->status.currPrintRow = sysPara->status.currPrintRow > lastRow?
sysPara->status.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;
}
/*-------------------------------切换到预览显示窗口-----------------------------------*/
ui->widgetPrintTextDisplay->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));
ui->widgetPrintTextDisplay->update();
}
previewFlag=0;
}
int MainWindow::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_83K:
oscfreq = 83000;
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;
}
void MainWindow::Test_Start_Stop()
{
if(test_flag <=0) return;
if(test_flag >= RECICLARNUMBER){
LogInfo::setRunStatusText(tr("回收槽开关检测完成!"));
test_flag = 0;
return;
}
if((test_flag%2) == 0){
if(!open_close){
on_pushButtonReclaimTanOpen_pressed();
open_close = 1;
}
}
else if(test_flag%2 == 1){
if(open_close){
on_pushButtonReclaimTankClose_pressed();
open_close = 0;
}
}
}
int MainWindow::checkRange(QImage textImage, int textColdot,
int posX, int posY)
{
int firstRow = 0;//变量显示底部会多一条横线
int lastRow = MAX_PRINT_ROW_NUM;
int variNum = 0;
for(int j = 0; j < lastRow - firstRow; j++){ // Y
for(int i = 0; i < textColdot; i++){ //
QRgb rgb = textImage.pixel(i,j + firstRow);
long unsigned int rgbValue = rgb & COLOR_MASK;
if((rgb&0x80000000)){ //判断alpha
if((rgb & 0xf0f0ff) == 0xf0f000){ //处理变量, 查找左下角,因为同一行的左下角是对齐的 看起来这个颜色是黄色
bool textfoundvar = 0;
if(j>0){
QRgb r_rgb = textImage.pixel(i,j + firstRow+1);
if((r_rgb & 0xf0f0ff) != 0xf0f000 )
{
textfoundvar =1;
}
}
if(textfoundvar) {
if(sysPara->status.variNum < MAX_VARI_NUM){
sysPara->status.vars[sysPara->status.variNum].startColPos = i+(sysPara->status.addSpace?i:0)+posX;
sysPara->status.vars[sysPara->status.variNum].endRowPos = j+posY;
if(lastRow<j+1)
lastRow=j+1;
sysPara->status.variNum ++;
variNum++;
i+=5;//scene 每一行可能都包含变量
}
else variNum++;
}
}
else if((rgbValue == MDT_RGB) || (rgbValue == QR_RGB) ||
(rgbValue == BAR_RGB)){
if(sysPara->status.QRvariNum>=4)continue;
if(rgbValue == MDT_RGB) { //MDT
handleCodeScene(i, j, &lastRow, MDT, posX, posY);
}
else if(rgbValue == QR_RGB) { //QR
handleCodeScene(i, j, &lastRow, QR, posX, posY);
}
else if(rgbValue == BAR_RGB) { //BAR
handleCodeScene(i, j, &lastRow, BAR, posX, posY);
}
if(sysPara->status.QRvariNum>=4)sysPara->status.QRvariNum=4;
}
else if((rgb & 0x0000ffff)==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 == 0)
{
sysPara->status.ExpiryVarNum ++;
}
sysPara->print.ExpiryVar.startColPos = i+(sysPara->status.addSpace?i:0)+posX;
sysPara->print.ExpiryVar.endRowPos = j+posY;
if(lastRow<j+1) lastRow=j+1;
i+=10;
}
}
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)
{
if(sysPara->status.CurrDateVariNum == 0)
{
sysPara->status.CurrDateVariNum ++;
}
sysPara->print.CurDateVar.startColPos = i+(sysPara->status.addSpace?i:0)+posX;
sysPara->print.CurDateVar.endRowPos = j + posY;
if(lastRow<j+1) lastRow=j+1;
i+=10;
}
}
if(j > sysPara->status.currPrintRow) {
sysPara->status.currPrintRow = j+posY;
}
}
}
}
return variNum;
}
void MainWindow::handleSceneShow(bool MaxCol4000, unsigned char *dat)
{
int myvariNum=0;
QList<QGraphicsItem *> items = ui->senceEditOption->getPicSceneItems();
foreach (QGraphicsItem *item, items) {
PicTextItem *picText = qgraphicsitem_cast<PicTextItem*>(item);
bool ok;
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);//填充白色
QPainter textPainter(&textImage);
QRectF validtextRectF(picText->pos().x(),picText->pos().y(),textColdot,picText->document()->size().height());
pPicScene->render(&textPainter,QRectF(),validtextRectF);
/*--------------------------------------------------------------------------*/
int textItemPosX;
int textItemPosY;
textItemPosX = picText->pos().x() - pPicScene->itemsBoundingRect().x();
textItemPosY = picText->pos().y() - pPicScene->itemsBoundingRect().y();
//接下来就是要把打印到数据data填充以及确认变量的个数,变量对应的开始列和结束行
checkRange(textImage, textColdot, textItemPosX, textItemPosY);
//===================一般变量=====================
QString textVariPattern = "<img src=\":/(\\d*)/(\\d*)_([a-zA-Z_][a-zA-Z0-9_]*)/../image/digitalWidth(\\d*).bmp\" width=\"(\\d*)\" height=\"(\\d*)\" />";
QRegExp textrx(textVariPattern);
QString textHtml = picText->toHtml();
int from = 0;
while(from < textHtml.size() && from != -1){
from = textHtml.indexOf(textrx,from);
if(from != -1){//找到匹配的
from ++;
if(myvariNum < sysPara->status.variNum)
{
sysPara->status.vars[myvariNum].digitalNum = textrx.cap(4).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);//第一个匹配
QByteArray fontNameUtf8 = textrx.cap(3).toUtf8();
strncpy(sysPara->status.vars[myvariNum].fontname, fontNameUtf8.data(), sizeof(sysPara->status.vars[myvariNum].fontname) - 1);
sysPara->status.vars[myvariNum].fontname[sizeof(sysPara->status.vars[myvariNum].fontname) - 1] = '\0';
sysPara->status.vars[myvariNum].width = textrx.cap(5).toInt(&ok)*(sysPara->status.addSpace?2:1);
sysPara->status.vars[myvariNum].height = textrx.cap(6).toInt(&ok);
sysPara->status.vars[myvariNum].startRowPos = sysPara->status.vars[myvariNum].endRowPos - sysPara->status.vars[myvariNum].height+1;
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(6).toInt(&ok);
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)
{
sysPara->status.RandomDigitNum = sysPara->status.vars[myvariNum].digitalNum;
}
sysPara->status.vars[myvariNum].letterSpace = 0;
if(sysPara->status.vars[myvariNum].digitalNum){ //算出letterspace
QFont font;
font.setFamily(sysPara->status.vars[myvariNum].fontname); // 20160812
font.setPixelSize(sysPara->status.vars[myvariNum].height);
font.setWeight(sysPara->status.vars[myvariNum].bold?QFont::Bold:QFont::Normal);
font.setLetterSpacing(QFont::AbsoluteSpacing, 0);
QFontMetrics fontMetrics(font);
int charWidth = (fontMetrics.horizontalAdvance("0123456789"))/10 ;
sysPara->status.vars[myvariNum].letterSpace =
(sysPara->status.vars[myvariNum].width - charWidth * sysPara->status.vars[myvariNum].digitalNum)
/ (sysPara->status.vars[myvariNum].digitalNum);
}
myvariNum++;
}
}
}
//==========================一般变量结束=======================
//=========================二维码变量==================
searchQrVar();
//=========================有效期/生产日期变量==================
searchExpiryVar(textHtml);
//=========================数模转换=================
generateCharRamData();
}
}
void MainWindow::UpdateDateTimeQRCode(QString strContent)
{
if(!printingFlag || !sysPara->para.isCheckInsertTime)
{
return ;
}
QLabel *labelFontSize = ui->textEditOption->getLabelFontSize();
bool ok;
int font_size = labelFontSize->text().toInt(&ok,10);
QString font_family = Public::getFontFamily(font_size);
if(sysPara->para.EditMode == TXTFILE)
{
QFile file("/home/plg/doc/modbusQR.bmp");
if(file.exists())
{
file.remove();
}
if(dlgqrcode->barCodeFlag == 1)
{
barcode->extSetText("");
barcode->GetOption((bcOption_t*)&sysPara->para.bcOption);
}
else
{
QString receiveContent = QString::fromUtf8(strContent.toStdString().c_str());
dlgqrcode->extSetText(receiveContent,sysPara->para.qrOption.type);
dlgqrcode->GetOption((qrOption_t *)&sysPara->para.qrOption);
}
QString txt_fomart = "";
txt_fomart = QString::fromUtf8("<span style=\" font-family:'%1'; font-size:%2pt;font-weight:%3;\">").arg(font_family).arg(font_size)
.arg(ui->textEditOption->getCheckBoxBold()->isChecked()? 600:400);
txt_fomart += barcode->getLabe_TxtString().toUtf8();
txt_fomart += "&nbsp;</span>";
txt_fomart += "<img src=\"/home/plg/doc/modbusQR.bmp\" />";
ui->textEditOption->textEdit->setHtml(txt_fomart);
ui->textEditOption->textEdit->moveCursor(QTextCursor::EndOfLine);
on_pushButtonStartPrint_pressed();//开始打印
}
}
QSizeF MainWindow::getDocSize()const
{
QSizeF size = ui->textEdit->document()->size();
return size;
}
#ifdef EnableArabic
void MainWindow::setOpenFileName(QString fileName){
qDebug()<<"set open fileName"<<fileName;
int lastIndex = fileName.lastIndexOf(".");
QFont font;
if(lastIndex != -1){
int secondLastIndex = fileName.lastIndexOf(".",lastIndex-1);
if(secondLastIndex != -1){
QString subsuffix = fileName.mid(secondLastIndex);
if(subsuffix.contains(".a")){
QString subsuffix2=fileName.mid(lastIndex);
QString subname=fileName.mid(0,secondLastIndex);
QString stringhtml=QString("<span style=font-family:'biyangarabic';>%1</span><span style=font-family:'biyang';>%2</span>").arg(subname).arg(subsuffix2);
ui->labelOpenedFileName->setText(stringhtml);
}else{
font.setFamily("biyang");
ui->labelOpenedFileName->setFont(font);
ui->labelOpenedFileName->setText(fileName);
}
}else{
font.setFamily("biyang");
ui->labelOpenedFileName->setFont(font);
ui->labelOpenedFileName->setText(fileName);
}
}else{
ui->labelOpenedFileName->setText(fileName);
}
}
#endif
void MainWindow::showFPGAData(QByteArray data){
ui->textEdit->clear();
ui->textEdit->setText(QString::fromUtf8(data));
}
void MainWindow::showFPGAqueuesize(int size){
sysPara->status.sizeFPGA = size;
}
void MainWindow::showSTM32queuesize(int size){
sysPara->status.sizeSTM32 = size;
}
void MainWindow::showqueueFPGAsize(int size){
sysPara->status.sizequeueFPGA = size;
}
void MainWindow::on_pushButton_Reboot_clicked()
{
QMessageBox::StandardButton ret = QMessageBox::Ok;
ret = QMessageBox::warning(this, tr("警告"),
tr("是否确认重启?"),
QMessageBox::Ok | QMessageBox::Cancel);
if (ret == QMessageBox::Ok){
if(!sysPara->status.selfCheckDone)
sysPara->status.selfCheckDone = true;
this->setDisabled(true);
emit setDisableAll();
if(!TEST_MODE && sysPara->para.flagOfReclaimPumEnable){
for(int i=15;i>11;i--)
{
if(i == 15){
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 == 12){
sysPara->devOp->controlInkValve(false);
sysPara->devOp->controlInkValvePWM(false);
}
this->setRunStatus(tr("正在准备重启,请等待%1秒...............").arg(i));
MySleep(1000);
}
}
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=11;i>7;i--)
{
if(i==9)
sysPara->devOp->controlReclaimTankOpen(false);
this->setRunStatus(tr("正在准备重启,请等待%1秒...............").arg(i));
MySleep(1000);
}
}
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 == 5)
sysPara->devOp->controlReclaimTankClose(true);
if(i == 4){
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));
MySleep(1000);
}
}
sysPara->saveParaToFile(); // 关机前将相关配置保存
sysPara->saveRFIDPara();
MySleep(200);
system("sync");//缓存同步
QCoreApplication::quit();
}
}
void MainWindow::setReBootQtUIEnable(bool flag){
ui->pushButton_Reboot->setEnabled(flag);
}
void MainWindow::on_pushButtonPowerOff_clicked()
{
_on_pushButtonPowerOff_pressed(true);
}
/**
* @brief MainWindow::slt_updateNetworkQR
* 响应 dlgQrCode::sig_updateNetworkQR 信号,将网络(TCP)收到的新二维码
* 更新到主界面的文本编辑区。
*/
void MainWindow::slt_updateNetworkQR()
{
#ifdef _2DCODE_
// 图片模式下不操作文本编辑区,直接返回
if(sysPara->para.EditMode==PICFILE) return;
sysPara->saveParaToFile();
// 刷新预览
if(sysPara->para.EditMode == TXTFILE) {
PreviewPressed();
} else if(sysPara->para.EditMode == SCENE) {
onPreviewScene();
}
// 切换到预览页面,让用户看到更新后的二维码
ui->stackedWidgetText->setCurrentWidget(ui->pagePrintTextDisplay);
// 如果正在打印,立即发送新数据到 FPGA
if(startPrintingFlag && printingFlag) {
SendPrintDataToFpga(0);
}
#endif
}
void MainWindow::slt_clearAllQRCode()
{
#ifdef _2DCODE_
// 1. 清除 textEdit 中的所有二维码图片
QTextCursor cursor(ui->textEdit->document());
bool modified = false;
while (!cursor.atEnd()) {
cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor);
QTextCharFormat fmt = cursor.charFormat();
if (fmt.isImageFormat()) {
QString imgName = fmt.toImageFormat().name();
// 删除所有二维码相关的图片(包括普通二维码和网络二维码)
if (imgName.contains("QRV") || imgName.contains("DMTV") ||
imgName.contains("BARV") || imgName.contains("networkQR")) {
cursor.deleteChar();
modified = true;
}
}
cursor.clearSelection();
}
// 2. 清除场景中的二维码变量标记
sysPara->status.QRvariNum = 0;
memset(sysPara->print.QRvars, 0, sizeof(sysPara->print.QRvars));
// 3. 复位二维码参数
sysPara->para.qrOption.width = 0;
sysPara->para.qrOption.height = 0;
// 4. 刷新显示
if (modified) {
ui->widgetPrintTextDisplay->update();
LogInfo::setRunStatusText(tr("已清除所有二维码,准备添加网络二维码"));
}
#endif
}
extern int baudRateValue;
void MainWindow::UpdateUIVersion(){
int fpgaType = sysPara->status.fpgaVersionNum>>12;
QString fpgaVersion;
if(fpgaType == 6){
fpgaVersion = "72";
}else if(fpgaType == 1){
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 = SUB_RFID;
// 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::showVerionInformation(Mac,VernonBach,fpgaVersion,STM32Ver,sysPara->status.flagOfPowerOnMode);
}
void MainWindow::checkPrintingInterval(){
unsigned int type = sysPara->status.fpgaVersionNum >> 12;
if(sysPara->para.printTriggerMode == PRINT_TRIGGER_SYNCHRONIZER && type == 8) //72版本同步模式下,判断喷印间隔是否设置合理
{
QSizeF size = ui->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;
}
}
}