#include "BaseSetupWidget.h" #include "ui_BaseSetupWidget.h" #include "Common.h" #include "frame/Frame.h" #include "device/Device.h" #include "device/DeviceManager.h" #include "logger/LogManager.h" #include "SetupService.h" #include "Utils.h" #include "TmsKey.h" #include #include #include #include #include #include #include extern double gZoomValue; extern unsigned char m_currType; //const unsigned int gFieldCount = 17; //tagRecordFile gTagRecordFile[gFieldCount] = { // {"帧类型", FIELD_TYPE_UCHAR, 1}, // {"序号", FIELD_TYPE_USHORT, 2}, // {"出厂编号", FIELD_TYPE_STRING, 8}, // {"日期", FIELD_TYPE_DATETIME, 7}, // {"设备名称", FIELD_TYPE_STRING, 16}, // {"设备编号", FIELD_TYPE_STRING, 8}, // {"操作人员", FIELD_TYPE_STRING, 16}, // {"目标扭矩", FIELD_TYPE_UINT, 4}, // {"实际扭矩", FIELD_TYPE_UINT, 4}, // {"螺栓规格等级编号", FIELD_TYPE_USHORT, 2}, // {"目标角度", FIELD_TYPE_USHORT, 2}, // {"实际角度", FIELD_TYPE_USHORT, 2}, // {"档位", FIELD_TYPE_UCHAR, 1}, // {"对应扭矩", FIELD_TYPE_UINT, 4}, // {"选定模式", FIELD_TYPE_UCHAR, 1}, // {"运行时间", FIELD_TYPE_USHORT, 2}, // {"拧紧结果", FIELD_TYPE_UCHAR, 1} //}; const unsigned int gFieldCount = 19; const unsigned char m_spannerType = 4; tagRecordFile gTagRecordFile[gFieldCount] = { {"帧类型", FIELD_TYPE_UCHAR, 1}, {"记录序号", FIELD_TYPE_UINT, 4}, {"工具型号", FIELD_TYPE_STRING, 10}, {"出厂编号", FIELD_TYPE_STRING, 8}, {"日期", FIELD_TYPE_DATETIME, 7}, {"设备名称", FIELD_TYPE_STRING, 16}, {"设备编号", FIELD_TYPE_STRING, 8}, {"操作人员", FIELD_TYPE_STRING, 16}, {"对应压力", FIELD_TYPE_USHORT, 2}, {"目标扭矩", FIELD_TYPE_UINT, 4}, {"实际扭矩", FIELD_TYPE_UINT, 4}, {"螺栓规格", FIELD_TYPE_STRING, 10}, {"螺栓等级", FIELD_TYPE_STRING, 10}, {"目标角度", FIELD_TYPE_USHORT, 2}, {"实际角度", FIELD_TYPE_USHORT, 2}, {"档位", FIELD_TYPE_UCHAR, 1}, {"选定模式", FIELD_TYPE_UCHAR, 1}, {"工作方式", FIELD_TYPE_UCHAR, 1}, {"拧紧结果", FIELD_TYPE_UCHAR, 1} }; tagRecordFile gTagRecordFileEng[gFieldCount] = { {"帧类型", FIELD_TYPE_UCHAR, 1}, {"Number", FIELD_TYPE_UINT, 4}, {"Product Type", FIELD_TYPE_STRING, 10}, {"Serial Number", FIELD_TYPE_STRING, 8}, {"Date", FIELD_TYPE_DATETIME, 7}, {"User Equipment Item", FIELD_TYPE_STRING, 16}, {"User Equipment Number", FIELD_TYPE_STRING, 8}, {"Operator", FIELD_TYPE_STRING, 16}, {"Work Pressure", FIELD_TYPE_USHORT, 2}, {"Target Torque", FIELD_TYPE_UINT, 4}, {"Actual Torque", FIELD_TYPE_UINT, 4}, {"Bolt Size", FIELD_TYPE_STRING, 10}, {"Bolt Strength", FIELD_TYPE_STRING, 10}, {"Target Angle", FIELD_TYPE_USHORT, 2}, {"Actual Angle", FIELD_TYPE_USHORT, 2}, {"Gear", FIELD_TYPE_UCHAR, 1}, {"Select Mode", FIELD_TYPE_UCHAR, 1}, {"Work Pattern", FIELD_TYPE_UCHAR, 1}, {"Fastening Result", FIELD_TYPE_UCHAR, 1} }; BaseSetupWidget::BaseSetupWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::BaseSetupWidget) //, m_sysStatus(SYS_STATUS_IDLE) , m_currCmd(FRAME_CMD_START) , m_bSucc(false) { ui->setupUi(this); init(); // 初始化定时器0,用于显示系统时间 initTimer0(); // 初始化文件记录定时器 initRecordTimer(); // // Excel初始化 // m_excelObject = new QAxObject("Excel.Application"); // // 是否可视化excel // m_excelObject->dynamicCall("SetVisible(bool Visble)", "false"); // // 是否弹出警告窗口 // m_excelObject->setProperty("DisplayAlerts", false); } BaseSetupWidget::~BaseSetupWidget() { clearTimer0(); // if(m_excelObject != nullptr) // { // m_excelObject->dynamicCall("Quit()"); // delete m_excelObject; // m_excelObject = nullptr; // } delete ui; } void BaseSetupWidget::init() { // 控件大小 int nLabelWidth = 120 * gZoomValue; int nLabelHeight = gnDefaultLabelHeight * gZoomValue; ui->labelToolsUnlock->setFixedSize(nLabelWidth, nLabelHeight); ui->labelToolsSerialNumber->setFixedSize(nLabelWidth, nLabelHeight); ui->labelTimeSetting->setFixedSize(nLabelWidth, nLabelHeight); ui->labelUserEquitmentItem->setFixedSize(nLabelWidth, nLabelHeight); ui->labelUserEquitmentNo->setFixedSize(nLabelWidth, nLabelHeight); ui->labelOperatorSettings->setFixedSize(nLabelWidth, nLabelHeight); ui->labelRecordedData->setFixedSize(nLabelWidth, nLabelHeight); int nLineEditHeight = gnDefaultLineEditHeight * gZoomValue; ui->lineEditToolsUnlock->setFixedHeight(nLineEditHeight); ui->lineEditToolsSerialNumber->setFixedHeight(nLineEditHeight); ui->lineEditTimeSetting->setFixedHeight(nLineEditHeight); ui->lineEditUserEquitmentItem->setFixedHeight(nLineEditHeight); ui->lineEditUserEquitmentNo->setFixedHeight(nLineEditHeight); ui->lineEditOperatorSettings->setFixedHeight(nLineEditHeight); int nPushButtonWidth = 130 * gZoomValue; int nPushButtonHeight = gnDefaultPushButtonHeight * gZoomValue; int nWidgetHeight = nPushButtonHeight; ui->widget_7->setFixedHeight(nWidgetHeight); ui->pushButtonGetRecords->setFixedWidth(80 * gZoomValue); ui->pushButtonGetRecords->setFixedHeight(nPushButtonHeight); ui->pushButtonToolsUnlock->setFixedSize(nPushButtonWidth, nPushButtonHeight); ui->pushButtonToolsSerialNumber->setFixedSize(nPushButtonWidth, nPushButtonHeight); ui->pushButtonTimeSetting->setFixedSize(nPushButtonWidth, nPushButtonHeight); ui->pushButtonUserEquitmentItem->setFixedSize(nPushButtonWidth, nPushButtonHeight); ui->pushButtonUserEquitmentNo->setFixedSize(nPushButtonWidth, nPushButtonHeight); ui->pushButtonOperatorSettings->setFixedSize(nPushButtonWidth, nPushButtonHeight); ui->pushButtonDeleteRecordedData->setFixedSize(nPushButtonWidth, nPushButtonHeight); // 进度条不可用,不可见 ui->progressBarGetRecords->setDisabled(true); ui->progressBarGetRecords->setValue(0); // 控件字体 QString strStyleSheet = gstrStyleSheet.arg(gnFontSize * gZoomValue); ui->lineEditToolsUnlock->setStyleSheet(strStyleSheet); ui->lineEditToolsSerialNumber->setStyleSheet(strStyleSheet); // 时间不可编辑 ui->lineEditTimeSetting->setEnabled(false); ui->lineEditTimeSetting->setStyleSheet(strStyleSheet); ui->lineEditUserEquitmentItem->setStyleSheet(strStyleSheet); ui->lineEditUserEquitmentNo->setStyleSheet(strStyleSheet); ui->lineEditOperatorSettings->setStyleSheet(strStyleSheet); // 定义只能输入数字的正则表达式 QRegExp regx("[0-9]+$"); //QValidator *validator1 = new QRegExpValidator(regx, ui->lineEditUserEquitmentNo); QValidator *validator = new QRegExpValidator(regx); // 设置解除锁定的密码最多输入8位数字 ui->lineEditToolsUnlock->setValidator(validator); ui->lineEditToolsUnlock->setMaxLength(8); // 设置出厂编号最多输入8位数字 ui->lineEditToolsSerialNumber->setValidator(validator); ui->lineEditToolsSerialNumber->setMaxLength(8); // 设置设备名称最多输入长度16,中文字算长度1,英文字符也是长度1 ui->lineEditUserEquitmentItem->setMaxLength(8); // 设置设备编号最多输入8位数字 ui->lineEditUserEquitmentNo->setValidator(validator); ui->lineEditUserEquitmentNo->setMaxLength(8); // 设置操作人员最多输入长度8,中文字算长度1,英文字符也是长度1 ui->lineEditUserEquitmentItem->setMaxLength(8); // 解锁 connect(ui->pushButtonToolsUnlock, SIGNAL(clicked()), this, SLOT(slot_pushButtonToolsUnlock_clicked())); // 出厂编号 connect(ui->pushButtonToolsSerialNumber, SIGNAL(clicked()), this, SLOT(slot_pushButtonToolsSerialNumber_clicked())); // 设置时间 connect(ui->pushButtonTimeSetting, SIGNAL(clicked()), this, SLOT(slot_pushButtonTimeSetting_clicked())); // 设置设备名称 connect(ui->pushButtonUserEquitmentItem, SIGNAL(clicked()), this, SLOT(slot_pushButtonUserEquitmentItem_clicked())); // 设置设备编号 connect(ui->pushButtonUserEquitmentNo, SIGNAL(clicked()), this, SLOT(slot_pushButtonUserEquitmentNo_clicked())); // 操作人员编辑 connect(ui->pushButtonOperatorSettings, SIGNAL(clicked()), this, SLOT(slot_pushButtonOperatorSettings_clicked())); // 获取记录 connect(ui->pushButtonGetRecords, SIGNAL(clicked()), this, SLOT(slot_pushButtonGetRecords_clicked())); // 清除记录 connect(ui->pushButtonDeleteRecordedData, SIGNAL(clicked()), this, SLOT(slot_pushButtonDeleteRecordedData_clicked())); } // // 初始化定时器 // void BaseSetupWidget::initTimer0() { m_timer0.stop(); m_timer0.setInterval(100);//1ms定时器,类似于单片机的中断函数 connect(&m_timer0, SIGNAL(timeout()),this,SLOT(slot_timer0_task())); //当记满1000时执行Timer0_Task m_timer0.start(); } void BaseSetupWidget::clearTimer0() { m_timer0.stop(); disconnect(&m_timer0, SIGNAL(timeout()),this,SLOT(slot_timer0_task())); } // // 定时器0的功能:在设置时间的lineEdit框中显示当前时间 // void BaseSetupWidget::slot_timer0_task() { QString d = QDate::currentDate().toString("yyyy-MM-dd"); QString t = QTime::currentTime().toString("hh:mm:ss"); ui->lineEditTimeSetting->setText(tr("%1 %2").arg(d).arg(t)); } // // 解除锁定 // void BaseSetupWidget::slot_pushButtonToolsUnlock_clicked() { logInfo("请求解锁..."); char c[2] = {0}; c[0] = 0x00; // 0x00 解锁,0x01加锁 c[1] = '\0'; std::string s; s.append(c, 1); s.append(ui->lineEditToolsUnlock->text().toStdString()); SetupService::GetInstance()->SendData(FRAME_CMD_SET_LOCK_STATUS, s); } // // 设置出厂编号 // void BaseSetupWidget::slot_pushButtonToolsSerialNumber_clicked() { logInfo("请求设置出厂序列号..."); SetupService::GetInstance()->SendData(FRAME_CMD_SET_SERIAL_NUMBER, ui->lineEditToolsSerialNumber->text().toStdString().substr(0, 8)); } // // 设置时间 // void BaseSetupWidget::slot_pushButtonTimeSetting_clicked() { logInfo(tr("请求设置日期时间...")); SetupService::GetInstance()->SendData(FRAME_CMD_SET_TIME); } // // 设置设备名称 // void BaseSetupWidget::slot_pushButtonUserEquitmentItem_clicked() { logInfo(tr("请求设置设备名称...")); // 设备名称中英文混合,一个中文utf8编码为3字节,英文字符为1字节,混排计算长度 QString s = ui->lineEditUserEquitmentItem->text(); while(s.toStdString().length() > 16) { s = s.left(s.length()-1); } //SendData(FRAME_CMD_SET_DEVICE_NAME, ui->lineEditUserEquitmentItem->text().toStdString().substr(0, 16)); SetupService::GetInstance()->SendData(FRAME_CMD_SET_DEVICE_NAME, s.toStdString()); } // // 设置设备编号 // void BaseSetupWidget::slot_pushButtonUserEquitmentNo_clicked() { logInfo(tr("请求设置设备序列号...")); SetupService::GetInstance()->SendData(FRAME_CMD_SET_DEVICE_NUMBER, ui->lineEditUserEquitmentNo->text().toStdString().substr(0, 8)); } // // 设置操作人 // void BaseSetupWidget::slot_pushButtonOperatorSettings_clicked() { logInfo(tr("请求设置操作人...")); // 操作人名称可中文可英文,一个中文utf8编码为3字节,英文字符为1字节,混排计算长度 QString s = ui->lineEditOperatorSettings->text(); while(s.toStdString().length() > 16) { s = s.left(s.length()-1); } SetupService::GetInstance()->SendData(FRAME_CMD_SET_OPERATOR, s.toStdString()); } void BaseSetupWidget::slot_pushButtonGetRecords_clicked() { logInfo("请求获取记录数据..."); m_recordAllCount = 0; // 清空文件总记录数 m_recordCurrCount = 0; // 清空当前收到记录数 m_recordData.clear(); // 清空文件内容列表 m_recordFlag = false; // 尚未开始记录,收到起始帧才算真正的开始 SetupService::GetInstance()->SendData(FRAME_CMD_GET_RECORD, "", 2000); // saveRecordToFile(); } // // 删除记录 // void BaseSetupWidget::slot_pushButtonDeleteRecordedData_clicked() { logInfo(tr("请求删除记录数据...")); SetupService::GetInstance()->SendData(FRAME_CMD_CLS_RECORD); } void BaseSetupWidget::slot_recvData(QString portName, unsigned char cmd, QByteArray recvData) { //QMessageBox::warning(this, "Warning!", "BaseSetupWidget::slot_recvData", QMessageBox::Ok, QMessageBox::Ok); #ifdef _DEBUG logInfo(tr("PORT:%1 >> Recv Data: CMD=[%2]%3").arg(portName).arg(cmd).arg(QString::fromStdString(getCmdName(cmd)))); #else logInfo(tr("PORT:%1 >> Recv Data: CMD=%2").arg(portName).arg(QString::fromStdString(getCmdName(cmd)))); #endif switch(cmd) { case FRAME_CMD_SET_TIME : processSetTimeRsp(portName, recvData); break; case FRAME_CMD_GET_TIME : processGetTimeRsp(portName, recvData); break; case FRAME_CMD_SET_SERIAL_NUMBER: processSetSerialNumberRsp(portName, recvData); break; case FRAME_CMD_GET_SERIAL_NUMBER: processGetSerialNumberRsp(portName, recvData); break; case FRAME_CMD_SET_DEVICE_NAME : processSetDeviceNameRsp(portName, recvData); break; case FRAME_CMD_GET_DEVICE_NAME : processGetDeviceNameRsp(portName, recvData); break; case FRAME_CMD_SET_DEVICE_NUMBER: processSetDeviceNumberRsp(portName, recvData); break; case FRAME_CMD_GET_DEVICE_NUMBER: processGetDeviceNumberRsp(portName, recvData); break; case FRAME_CMD_GET_RECORD : processGetRecordRsp(portName, recvData); break; case FRAME_CMD_CLS_RECORD : processClsRecordRsp(portName, recvData); break; case FRAME_CMD_SET_OPERATOR : processSetOperatorRsp(portName, recvData); break; case FRAME_CMD_GET_OPERATOR : processGetOperatorRsp(portName, recvData); break; case FRAME_CMD_SET_LOCK_STATUS : processSetLockStatusRsp(portName, recvData); break; default: logInfo(tr("PORT:%1 >> Unsupported CMD Of Base Setup[%2]!").arg(portName).arg(cmd)); break; } } // // 设置时间响应 // void BaseSetupWidget::processSetTimeRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> SET TIME SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> SET TIME SUCCESS").arg(portName)); #endif } // // 获取时间响应 -- 暂无此功能 // void BaseSetupWidget::processGetTimeRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> GET TIME SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> GET TIME SUCCESS").arg(portName)); #endif } // // 设置出厂序列号响应 // void BaseSetupWidget::processSetSerialNumberRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> SET SERIAL NUMBER SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> SET SERIAL NUMBER SUCCESS").arg(portName)); #endif } // // 获取出厂序列号响应 -- 系统启动时自动请求获取 // void BaseSetupWidget::processGetSerialNumberRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> GET SERIAL NUMBER SUCCESS![%2][%3]") .arg(portName) .arg(Utils::strToHexStr(data.toStdString()).c_str()) .arg(data.toStdString().c_str())); #else logInfo(tr("PORT:%1 >> GET SERIAL NUMBER SUCCESS").arg(portName)); #endif ui->lineEditToolsSerialNumber->setText(data); } // // 设置设备名称响应 // void BaseSetupWidget::processSetDeviceNameRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> SET DEVICE NAME SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> SET DEVICE NAME SUCCESS").arg(portName)); #endif } // // 获取设备名称响应 -- 系统启动时自动请求获取 // void BaseSetupWidget::processGetDeviceNameRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> GET DEVICE NAME SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> GET DEVICE NAME SUCCESS").arg(portName)); #endif ui->lineEditUserEquitmentItem->setText(data); } // // 设置设备序列号响应 // void BaseSetupWidget::processSetDeviceNumberRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> SET DEVICE NUMBER SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> SET DEVICE NUMBER SUCCESS").arg(portName)); #endif } // // 获取设备序列号响应 -- 系统启动时自动请求获取 // void BaseSetupWidget::processGetDeviceNumberRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> GET DEVICE NUMBER SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> GET DEVICE NUMBER SUCCESS").arg(portName)); #endif ui->lineEditUserEquitmentNo->setText(data); } // // 设置操作人响应 // void BaseSetupWidget::processSetOperatorRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> SET OPERATOR SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> SET OPERATOR SUCCESS").arg(portName)); #endif } // // 获取操作人响应 // void BaseSetupWidget::processGetOperatorRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> GET OPERATOR SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> GET OPERATOR SUCCESS").arg(portName)); #endif ui->lineEditOperatorSettings->setText(data); } // // 获取记录响应 // void BaseSetupWidget::processGetRecordRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> GET RECORD SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #endif if(data.length() < 1) { logInfo(tr("PORT:%1 >> 返回数据格式错误!").arg(portName)); emit get_record_finish(-1); return; } unsigned char type = data.at(0); switch(type) { case 0x00: // 起始帧 logInfo(tr("PORT:%1 >> 文件记录 - 收到起始帧").arg(portName)); if(!m_recordFlag) { if(data.length() < 3) { logInfo(tr("PORT:%1 >> 返回数据格式错误0x00!").arg(portName)); emit get_record_finish(-1); return; } m_recordFlag = true; m_recordAllCount = Utils::charToShort(data.at(1), data.at(2)); // 设置进度条可用可见 ui->progressBarGetRecords->setEnabled(true); ui->progressBarGetRecords->setVisible(true); ui->progressBarGetRecords->setValue(0); startRecordTimer(1000); } break; case 0x01: // 数据帧 logInfo(tr("PORT:%1 >> 文件记录 - 收到数据帧").arg(portName)); if(m_recordFlag) { if(data.length() < 81) // 目前数据长度为81 { logInfo(tr("PORT:%1 >> 返回数据格式错误0x01!").arg(portName)); emit get_record_finish(-1); return; } // 收到数据即停止定时器,然后将数据放入队列,再启动定时器 stopRecordTimer(); // 将数据放入队列 m_recordData.push_back(QString::fromLatin1(data, data.length())); m_recordCurrCount++; // 设置进度条的值 ui->progressBarGetRecords->setValue(m_recordCurrCount / m_recordCurrCount); startRecordTimer(1000); } else { logInfo(tr("PORT:%1 >> Record Flag is false!").arg(portName)); } break; case 0x02: // 结束帧 logInfo(tr("PORT:%1 >> 文件记录 - 收到结束帧").arg(portName)); if(m_recordFlag) { m_recordFlag = false; stopRecordTimer(); ui->progressBarGetRecords->setValue(100); // 将数据存为文件 saveRecordToFile(); emit get_record_finish(0); ui->progressBarGetRecords->setDisabled(true); } break; default: logInfo(tr("PORT:%1 >> Unknown Type[%1]").arg(portName).arg(type)); break; } return; } // // 清除记录按钮点击响应 // void BaseSetupWidget::processClsRecordRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> CLS RECORD SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> CLS RECORD SUCCESS").arg(portName)); #endif } // // 设置锁状态响应 // void BaseSetupWidget::processSetLockStatusRsp(QString portName, QByteArray data) { #ifdef _DEBUG logDebug(tr("PORT:%1 >> SET LOCK STATUS SUCCESS[%2]").arg(portName).arg(Utils::strToHexStr(data.toStdString()).c_str())); #else logInfo(tr("PORT:%1 >> SET LOCK STATUS SUCCESS").arg(portName)); #endif } // // 初始化获取记录定时器 // void BaseSetupWidget::initRecordTimer() { m_recordTimer.stop(); m_recordTimer.setInterval(1000); // 本定时器定时长度可变,初始化时暂定1秒,后续通过start connect(&m_recordTimer, SIGNAL(timeout()), this, SLOT(slot_recordTimeout())); } // // 启动获取记录定时器 // void BaseSetupWidget::startRecordTimer(unsigned int msec) { m_recordTimer.start(msec); } // // 停止获取记录定时器 // void BaseSetupWidget::stopRecordTimer() { m_recordTimer.stop(); } // // 获取记录定时器超时处理 // void BaseSetupWidget::slot_recordTimeout() { logInfo("文件接收超时"); if(m_recordFlag) { stopRecordTimer(); saveRecordToFile(); } //m_sysStatus = SYS_STATUS_IDLE; emit get_record_finish(1); } /* void BaseSetupWidget::saveRecordToFile() { QString currDateTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss"); QString fileName = tr("record_%1").arg(currDateTime); // 打开文件保存路径 m_recordFilePath = QFileDialog::getSaveFileName( this, tr("数据文件另存为(Save as)"), tr("C:/%1").arg(fileName), tr("Excel files(*.xlsx);;text files(*.csv)")); if(m_recordFilePath.length() == 0) { // 取消保存,相当于取消文件记录了 return; } logInfo(tr("记录文件保存路径:%1").arg(m_recordFilePath)); // 开始保存文件,将 m_recordData 中数据存储到文件中 //获取工作簿集合 QAxObject *workbooks = m_excelObject->querySubObject("WorkBooks"); //新建一个工作簿 workbooks->dynamicCall("Add"); //获取当前工作簿 QAxObject *workbook = m_excelObject->querySubObject("ActiveWorkBook"); //获取工作表格集合 QAxObject *worksheets = workbook->querySubObject("Sheets"); //获取当前工作表格1,即sheet1 QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); //产生数据 QList allRowData; // 保存标题 QList titleRowData; for(unsigned int i=0; i aRowData; std::string rowData = m_recordData.at(0).toLatin1().toStdString(); //std::string s; int nPos = 0; int nLen = 0; int nIndex = 0; //{"帧类型", FIELD_TYPE_UCHAR, 1}, nLen = gTagRecordFile[nIndex].fieldLen; std::string s1 = rowData.substr(nPos, nLen); nPos += nLen; char val1 = Utils::strToChar(s1); aRowData.append(QVariant(Utils::strToChar(s1))); nIndex++; //{"序号", FIELD_TYPE_USHORT, 2}, nLen = gTagRecordFile[nIndex].fieldLen; std::string s2 = rowData.substr(nPos, nLen); nPos += nLen; short int val2 = Utils::strToShort(s2); aRowData.append(QVariant(Utils::strToShort(s2))); nIndex++; //{"出厂编号", FIELD_TYPE_STRING, 8}, nLen = gTagRecordFile[nIndex].fieldLen; std::string s3 = rowData.substr(nPos, nLen); nPos += nLen; std::string val3 = s3; aRowData.append(QVariant(QString::fromStdString(s3))); nIndex++; //{"日期", FIELD_TYPE_DATETIME, 7}, nLen = gTagRecordFile[nIndex].fieldLen; std::string s4 = rowData.substr(nPos, nLen); logInfo(tr("日期: %1").arg(QString::fromStdString(Utils::strToHexStr(s4)))); nPos += nLen; std::string val4 = s4; short int year = Utils::strToShort(s4); unsigned char month = s4.at(2); unsigned char day = s4.at(3); unsigned char hour = s4.at(4); unsigned char minute = s4.at(5); unsigned char second = s4.at(6); aRowData.append(QVariant(tr("%1-%2-%3 %4:%5:%6").arg(year).arg(month).arg(day).arg(hour).arg(minute).arg(second))); nIndex++; //{"设备名称", FIELD_TYPE_STRING, 16}, nLen = gTagRecordFile[nIndex].fieldLen; std::string s5 = rowData.substr(nPos, nLen); nPos += nLen; std::string val5 = s5; aRowData.append(QVariant(QString::fromStdString(s5))); nIndex++; //{"设备编号", FIELD_TYPE_STRING, 8}, //{"操作人员", FIELD_TYPE_STRING, 16}, //{"目标扭矩", FIELD_TYPE_UINT, 4}, //{"实际扭矩", FIELD_TYPE_UINT, 4}, //{"螺栓规格等级编号", FIELD_TYPE_USHORT, 2}, //{"目标角度", FIELD_TYPE_USHORT, 2}, //{"实际角度", FIELD_TYPE_USHORT, 2}, //{"档位", FIELD_TYPE_UCHAR, 1}, //{"对应扭矩", FIELD_TYPE_UINT, 4}, //{"选定模式", FIELD_TYPE_UCHAR, 1}, //{"运行时间", FIELD_TYPE_USHORT, 2}, //{"拧紧结果", FIELD_TYPE_UCHAR, 1} // for(unsigned int i=0; iquerySubObject("Range(const QString)", "A1:Q1"); QAxObject *range = worksheet->querySubObject("Range(const QString)", tr("A1:Q%1").arg(m_recordData.size() + 1)); //批量写入 range->dynamicCall("SetValue(const QVariant&)", QVariant(allRowData)); //设置字体大小 //range->querySubObject("Font")->setProperty("Size", 30); //获取单元格 //QAxObject *cell = worksheet->querySubObject("Cells(int, int)", 1, 1); //储存一个字符串数据至表格 //cell->dynamicCall("setValue(const QVariant&)", QVariant("abc")); //读取单元格数据 //QString str = cell->dynamicCall("Value2()").toString(); //qDebug()<<"The value of cell is "<< str <querySubObject("Range(const QString&)", "3:4")->setProperty("RowHeight", 60); //worksheet->querySubObject("Range(const QString&)", "j1")->setProperty("ColumnWidth", 80); //保存至文件注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"\",不然一定保存不了。 workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_recordFilePath)); workbook->dynamicCall("Close(Boolean)", true); } */ void BaseSetupWidget::saveToXlsx() { QXlsx::Document xlsx; //产生数据 //QList allRowData; // 保存标题 //QList titleRowData; // 从1开始,忽略第一个 QXlsx::CellRange range(1,1,1,18); xlsx.setColumnWidth(range,13); xlsx.setColumnWidth(4,16); QXlsx::Format format; format.setFontSize(11); format.setFontName(QStringLiteral("Calibri")); format.setVerticalAlignment(QXlsx::Format::AlignVCenter); format.setHorizontalAlignment(QXlsx::Format::AlignHCenter); for(unsigned int i=1; i