123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283 |
- #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<MainDlg*>(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;
- }
|