#include "oamupgrade.h" #include "ui_oamupgrade.h" #include "includes.h" #include "maindlg.h" OamUpgrade::OamUpgrade(QWidget *parent) : QDialog(parent) , ui(new Ui::OamUpgrade) { ui->setupUi(this); m_pMainDlg = static_cast(parent);//保存上级窗口指针 m_strFilePaht = ""; memset(&m_stUpgrade, 0,sizeof(OAM_UPGRADE_T)); memset(&m_stLtvB, 0,sizeof(LTV_B_T)); configSignalSlot(); } OamUpgrade::~OamUpgrade() { delete ui; } //配置信号槽函数 void OamUpgrade::configSignalSlot(){ connect(ui->pushButtonOpenFIle, &QPushButton::clicked, this, &this->selectUpgradeFile); connect(ui->pushButtonUpgrade, &QPushButton::clicked, this, &this->startUpgrade); connect(this, &this->SignalSendUpgradeMsg, m_pMainDlg, &m_pMainDlg->slotOamSendUpgradeMsg); connect(this, &this->SignalSendRestartMsg, m_pMainDlg, &m_pMainDlg->slotUpgradeRestart); } //选择升级文件 void OamUpgrade::selectUpgradeFile(){ //文件过滤器 QString filter = tr("升级文件(*.bin);;All Files (*)"); // 打开对话框并获取用户选择的文件路径 QString filePath = QFileDialog::getOpenFileName(this, tr("Open Bin File"),"",filter); // 用户未选择文件,直接退出 if (filePath.isEmpty()) { return; } //保存文件路径 m_strFilePaht = filePath; ui->lineEditFilePath->setText(filePath); return; } //开始升级 void OamUpgrade::startUpgrade(){ QMessageBox::StandardButton dlg; quint32 fileSize = 0;//文件大小,以字节为单位 quint32 dataLen = 0; quint32 totalTimes = 0; quint8 remainderLen = 0; quint8 *pDataHead = NULL; //关闭定时器 m_pMainDlg->stopUpgradeTimer(); //检查升级文件路径是否为空 if(m_strFilePaht.isEmpty()){ QMessageBox::information(this, "提示", "请选择文件"); return; } //二次确认是否进行升级 dlg = QMessageBox::question(this, "提示", "确实要进行升级吗", QMessageBox::Yes|QMessageBox::No); if (dlg == QMessageBox::No) { return; } //打开文件 QFile file(m_strFilePaht); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::information(this, "提示", "打开文件错误"); return; } //读取文件全部内容,并保存文件 QByteArray fileData = file.readAll(); fileSize = fileData.size(); remainderLen = fileSize % 4; dataLen = fileSize; if(remainderLen){ dataLen = fileSize + 4 - remainderLen;//4字节对齐 } //保存升级文件数据 m_stUpgrade.pData = new quint8[dataLen]; memset(m_stUpgrade.pData, 0, sizeof(quint8)*dataLen); pDataHead = m_stUpgrade.pData; for(quint32 i = 0; i < fileSize;i++){ *pDataHead = fileData.at(i); pDataHead++; } //组织升级文件结构 m_stUpgrade.fileSize = dataLen; totalTimes = dataLen / PS_MCP_B_DATA_LEN; remainderLen = dataLen % PS_MCP_B_DATA_LEN; if(remainderLen){ m_stUpgrade.totalTimes = totalTimes + 1; m_stUpgrade.remainderLen = remainderLen; }else{ m_stUpgrade.totalTimes = totalTimes; m_stUpgrade.remainderLen = PS_MCP_B_DATA_LEN; } //设置进度条初始值 ui->progressBarUpgrade->setRange(0,totalTimes); ui->progressBarUpgrade->setValue(0); //切换软件工作模式 m_stUpgrade.upgradeStatus = 1;//升级中 switchSoftWorkMode(); return; } //切换基站软件运行模式 void OamUpgrade::switchSoftWorkMode(){ m_stLtvB.wLen = 5; m_stLtvB.wTag = OAM_UPGRADE_SWITCH_SOFT_WORK_MODE; m_stLtvB.abyData[0] = 0x02;//升级模式 emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_CONTROL, 5); return; } //发送通知文件信息 void OamUpgrade::noticeUpgradeFileInfo(){ quint8 dataLen = 8; OAM_UPGRAD_NOTICE_FILE_INFO_T *pdwData = NULL; m_stLtvB.wLen = dataLen; m_stLtvB.wTag = OAM_UPGRADE_NOTICE_UPGRADE_FILE_INFO; pdwData = (OAM_UPGRAD_NOTICE_FILE_INFO_T *)m_stLtvB.abyData; pdwData->fileSize = m_stUpgrade.fileSize; emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_CONTROL, dataLen); return; } //发送升级文件 void OamUpgrade::sendUpgradeFile(){ quint16 dataLen = PS_MCP_B_DATA_LEN; quint8 *pbyDataHead = NULL; OAM_UPGRADE_DATA_PAYLOAD_T stUpgradeDataPayload; memset(&stUpgradeDataPayload, 0, sizeof(OAM_UPGRADE_DATA_PAYLOAD_T)); //文件发送中 if(m_stUpgrade.sendingTimes < m_stUpgrade.totalTimes){ dataLen = PS_MCP_B_DATA_LEN; if(m_stUpgrade.sendingTimes == (m_stUpgrade.totalTimes - 1)){ dataLen = m_stUpgrade.remainderLen;//最后一次文件长度 } //组织数据 m_stLtvB.wLen = 2 + 2 + 4 + dataLen;//一帧数据长度 m_stLtvB.wTag = OAM_UPGRADE_SEND_UPGRADE_FILE; //组织数据 pbyDataHead = m_stUpgrade.pData + m_stUpgrade.sendingTimes * PS_MCP_B_DATA_LEN; memcpy(stUpgradeDataPayload.abyData, pbyDataHead, dataLen);//保存载荷 m_stUpgrade.sendingTimes++; stUpgradeDataPayload.sendTimes = m_stUpgrade.sendingTimes;//保存当前帧号 memcpy(m_stLtvB.abyData, &stUpgradeDataPayload, dataLen+4); //发送数据 emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_FILE_TRANSFER, m_stLtvB.wLen); //更新进度条 ui->progressBarUpgrade->setValue(m_stUpgrade.sendingTimes); }else{//文件发送完成 noticeUpgradeOver();//通知升级结束 } return; } //通知升级结束 void OamUpgrade::noticeUpgradeOver(){ quint8 dataLen = 8; m_stLtvB.wLen = dataLen; m_stLtvB.wTag = OAM_UPGRADE_NOTICE_UPGRADE_OVER; memcpy(m_stLtvB.abyData, &m_stUpgrade.fileSize, 4); emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_CONTROL, dataLen); return; } //升级命令执行成功响应槽函数 //wTag:命令 void OamUpgrade::slotNoticeUpgradeOk(quint16 wTag){ if(m_stUpgrade.upgradeStatus == 1){ //收到切换软件工作模式命令执行成功消息 if(wTag == OAM_UPGRADE_SWITCH_SOFT_WORK_MODE){ QThread::msleep(25); noticeUpgradeFileInfo();//发送升级文件通知消息 } //收到通知文件信息命令执行成功消息 else if(wTag == OAM_UPGRADE_NOTICE_UPGRADE_FILE_INFO){ QThread::msleep(25); sendUpgradeFile();//发送升级文件 } //收到发送文件命令执行成功消息 else if(wTag == OAM_UPGRADE_SEND_UPGRADE_FILE){ QThread::msleep(25); sendUpgradeFile();//发送升级文件 } //收到通知升级结束命令执行成功消息 else if(wTag == OAM_UPGRADE_NOTICE_UPGRADE_OVER){ deinitUpgrade(); m_stUpgrade.upgradeStatus = 2;//升级成功 upgradeSuccess();//升级成功后向处理 }else{ deinitUpgrade(); QMessageBox::information(this,"提示","错的升级命令"); } } return; } //升级命令执行失败响应槽函数 void OamUpgrade::slotNoticeUpgradeFail(){ deinitUpgrade(); QMessageBox::information(this,"提示","升级失败,请重试"); m_stUpgrade.upgradeStatus = 3; return; } //升级命令超时 void OamUpgrade::slotNoticeUpgradeTimeout(){ deinitUpgrade(); QMessageBox::information(this,"提示","升级超时,请重试"); m_stUpgrade.upgradeStatus = 4; return; } //升级模块反向初始化 void OamUpgrade::deinitUpgrade(){ ui->lineEditFilePath->setText(""); //释放内存 free(m_stUpgrade.pData); m_stUpgrade.pData = NULL; memset(&m_stUpgrade, 0,sizeof(OAM_UPGRADE_T)); memset(&m_stLtvB, 0,sizeof(LTV_B_T)); return; } //升级成功后向处理 void OamUpgrade::upgradeSuccess(){ QMessageBox::StandardButton dlg; //确认是否重启设备 dlg = QMessageBox::question(this, "提示", "软件升级成功,重启后生效,要重启吗?", QMessageBox::Yes|QMessageBox::No); if (dlg == QMessageBox::No) { return; } //发消息给主控模块,重启设备 emit SignalSendRestartMsg(); return; }