oamupgrade.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. #include "oamupgrade.h"
  2. #include "ui_oamupgrade.h"
  3. #include "includes.h"
  4. #include "maindlg.h"
  5. OamUpgrade::OamUpgrade(QWidget *parent)
  6. : QDialog(parent)
  7. , ui(new Ui::OamUpgrade)
  8. {
  9. ui->setupUi(this);
  10. m_pMainDlg = static_cast<MainDlg*>(parent);//保存上级窗口指针
  11. m_strFilePaht = "";
  12. memset(&m_stUpgrade, 0,sizeof(OAM_UPGRADE_T));
  13. memset(&m_stLtvB, 0,sizeof(LTV_B_T));
  14. configSignalSlot();
  15. }
  16. OamUpgrade::~OamUpgrade()
  17. {
  18. delete ui;
  19. }
  20. //配置信号槽函数
  21. void OamUpgrade::configSignalSlot(){
  22. connect(ui->pushButtonOpenFIle, &QPushButton::clicked, this, &this->selectUpgradeFile);
  23. connect(ui->pushButtonUpgrade, &QPushButton::clicked, this, &this->startUpgrade);
  24. connect(this, &this->SignalSendUpgradeMsg, m_pMainDlg, &m_pMainDlg->slotOamSendUpgradeMsg);
  25. connect(this, &this->SignalSendRestartMsg, m_pMainDlg, &m_pMainDlg->slotUpgradeRestart);
  26. }
  27. //选择升级文件
  28. void OamUpgrade::selectUpgradeFile(){
  29. //文件过滤器
  30. QString filter = tr("升级文件(*.bin);;All Files (*)");
  31. // 打开对话框并获取用户选择的文件路径
  32. QString filePath = QFileDialog::getOpenFileName(this, tr("Open Bin File"),"",filter);
  33. // 用户未选择文件,直接退出
  34. if (filePath.isEmpty()) {
  35. return;
  36. }
  37. //保存文件路径
  38. m_strFilePaht = filePath;
  39. ui->lineEditFilePath->setText(filePath);
  40. return;
  41. }
  42. //开始升级
  43. void OamUpgrade::startUpgrade(){
  44. QMessageBox::StandardButton dlg;
  45. quint32 fileSize = 0;//文件大小,以字节为单位
  46. quint32 dataLen = 0;
  47. quint32 totalTimes = 0;
  48. quint8 remainderLen = 0;
  49. quint8 *pDataHead = NULL;
  50. //关闭定时器
  51. m_pMainDlg->stopUpgradeTimer();
  52. //检查升级文件路径是否为空
  53. if(m_strFilePaht.isEmpty()){
  54. QMessageBox::information(this, "提示", "请选择文件");
  55. return;
  56. }
  57. //二次确认是否进行升级
  58. dlg = QMessageBox::question(this, "提示", "确实要进行升级吗", QMessageBox::Yes|QMessageBox::No);
  59. if (dlg == QMessageBox::No) {
  60. return;
  61. }
  62. //打开文件
  63. QFile file(m_strFilePaht);
  64. if (!file.open(QIODevice::ReadOnly)) {
  65. QMessageBox::information(this, "提示", "打开文件错误");
  66. return;
  67. }
  68. //读取文件全部内容,并保存文件
  69. QByteArray fileData = file.readAll();
  70. fileSize = fileData.size();
  71. remainderLen = fileSize % 4;
  72. dataLen = fileSize;
  73. if(remainderLen){
  74. dataLen = fileSize + 4 - remainderLen;//4字节对齐
  75. }
  76. //保存升级文件数据
  77. m_stUpgrade.pData = new quint8[dataLen];
  78. memset(m_stUpgrade.pData, 0, sizeof(quint8)*dataLen);
  79. pDataHead = m_stUpgrade.pData;
  80. for(quint32 i = 0; i < fileSize;i++){
  81. *pDataHead = fileData.at(i);
  82. pDataHead++;
  83. }
  84. //组织升级文件结构
  85. m_stUpgrade.fileSize = dataLen;
  86. totalTimes = dataLen / PS_MCP_B_DATA_LEN;
  87. remainderLen = dataLen % PS_MCP_B_DATA_LEN;
  88. if(remainderLen){
  89. m_stUpgrade.totalTimes = totalTimes + 1;
  90. m_stUpgrade.remainderLen = remainderLen;
  91. }else{
  92. m_stUpgrade.totalTimes = totalTimes;
  93. m_stUpgrade.remainderLen = PS_MCP_B_DATA_LEN;
  94. }
  95. //设置进度条初始值
  96. ui->progressBarUpgrade->setRange(0,totalTimes);
  97. ui->progressBarUpgrade->setValue(0);
  98. //切换软件工作模式
  99. m_stUpgrade.upgradeStatus = 1;//升级中
  100. switchSoftWorkMode();
  101. return;
  102. }
  103. //切换基站软件运行模式
  104. void OamUpgrade::switchSoftWorkMode(){
  105. m_stLtvB.wLen = 5;
  106. m_stLtvB.wTag = OAM_UPGRADE_SWITCH_SOFT_WORK_MODE;
  107. m_stLtvB.abyData[0] = 0x02;//升级模式
  108. emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_CONTROL, 5);
  109. return;
  110. }
  111. //发送通知文件信息
  112. void OamUpgrade::noticeUpgradeFileInfo(){
  113. quint8 dataLen = 8;
  114. OAM_UPGRAD_NOTICE_FILE_INFO_T *pdwData = NULL;
  115. m_stLtvB.wLen = dataLen;
  116. m_stLtvB.wTag = OAM_UPGRADE_NOTICE_UPGRADE_FILE_INFO;
  117. pdwData = (OAM_UPGRAD_NOTICE_FILE_INFO_T *)m_stLtvB.abyData;
  118. pdwData->fileSize = m_stUpgrade.fileSize;
  119. emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_CONTROL, dataLen);
  120. return;
  121. }
  122. //发送升级文件
  123. void OamUpgrade::sendUpgradeFile(){
  124. quint16 dataLen = PS_MCP_B_DATA_LEN;
  125. quint8 *pbyDataHead = NULL;
  126. OAM_UPGRADE_DATA_PAYLOAD_T stUpgradeDataPayload;
  127. memset(&stUpgradeDataPayload, 0, sizeof(OAM_UPGRADE_DATA_PAYLOAD_T));
  128. //文件发送中
  129. if(m_stUpgrade.sendingTimes < m_stUpgrade.totalTimes){
  130. dataLen = PS_MCP_B_DATA_LEN;
  131. if(m_stUpgrade.sendingTimes == (m_stUpgrade.totalTimes - 1)){
  132. dataLen = m_stUpgrade.remainderLen;//最后一次文件长度
  133. }
  134. //组织数据
  135. m_stLtvB.wLen = 2 + 2 + 4 + dataLen;//一帧数据长度
  136. m_stLtvB.wTag = OAM_UPGRADE_SEND_UPGRADE_FILE;
  137. //组织数据
  138. pbyDataHead = m_stUpgrade.pData + m_stUpgrade.sendingTimes * PS_MCP_B_DATA_LEN;
  139. memcpy(stUpgradeDataPayload.abyData, pbyDataHead, dataLen);//保存载荷
  140. m_stUpgrade.sendingTimes++;
  141. stUpgradeDataPayload.sendTimes = m_stUpgrade.sendingTimes;//保存当前帧号
  142. memcpy(m_stLtvB.abyData, &stUpgradeDataPayload, dataLen+4);
  143. //发送数据
  144. emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_FILE_TRANSFER, m_stLtvB.wLen);
  145. //更新进度条
  146. ui->progressBarUpgrade->setValue(m_stUpgrade.sendingTimes);
  147. }else{//文件发送完成
  148. noticeUpgradeOver();//通知升级结束
  149. }
  150. return;
  151. }
  152. //通知升级结束
  153. void OamUpgrade::noticeUpgradeOver(){
  154. quint8 dataLen = 8;
  155. m_stLtvB.wLen = dataLen;
  156. m_stLtvB.wTag = OAM_UPGRADE_NOTICE_UPGRADE_OVER;
  157. memcpy(m_stLtvB.abyData, &m_stUpgrade.fileSize, 4);
  158. emit SignalSendUpgradeMsg((quint8*)&m_stLtvB, MCP_B_CONTROL, dataLen);
  159. return;
  160. }
  161. //升级命令执行成功响应槽函数
  162. //wTag:命令
  163. void OamUpgrade::slotNoticeUpgradeOk(quint16 wTag){
  164. if(m_stUpgrade.upgradeStatus == 1){
  165. //收到切换软件工作模式命令执行成功消息
  166. if(wTag == OAM_UPGRADE_SWITCH_SOFT_WORK_MODE){
  167. QThread::msleep(25);
  168. noticeUpgradeFileInfo();//发送升级文件通知消息
  169. }
  170. //收到通知文件信息命令执行成功消息
  171. else if(wTag == OAM_UPGRADE_NOTICE_UPGRADE_FILE_INFO){
  172. QThread::msleep(25);
  173. sendUpgradeFile();//发送升级文件
  174. }
  175. //收到发送文件命令执行成功消息
  176. else if(wTag == OAM_UPGRADE_SEND_UPGRADE_FILE){
  177. QThread::msleep(25);
  178. sendUpgradeFile();//发送升级文件
  179. }
  180. //收到通知升级结束命令执行成功消息
  181. else if(wTag == OAM_UPGRADE_NOTICE_UPGRADE_OVER){
  182. deinitUpgrade();
  183. m_stUpgrade.upgradeStatus = 2;//升级成功
  184. upgradeSuccess();//升级成功后向处理
  185. }else{
  186. deinitUpgrade();
  187. QMessageBox::information(this,"提示","错的升级命令");
  188. }
  189. }
  190. return;
  191. }
  192. //升级命令执行失败响应槽函数
  193. void OamUpgrade::slotNoticeUpgradeFail(){
  194. deinitUpgrade();
  195. QMessageBox::information(this,"提示","升级失败,请重试");
  196. m_stUpgrade.upgradeStatus = 3;
  197. return;
  198. }
  199. //升级命令超时
  200. void OamUpgrade::slotNoticeUpgradeTimeout(){
  201. deinitUpgrade();
  202. QMessageBox::information(this,"提示","升级超时,请重试");
  203. m_stUpgrade.upgradeStatus = 4;
  204. return;
  205. }
  206. //升级模块反向初始化
  207. void OamUpgrade::deinitUpgrade(){
  208. ui->lineEditFilePath->setText("");
  209. //释放内存
  210. free(m_stUpgrade.pData);
  211. m_stUpgrade.pData = NULL;
  212. memset(&m_stUpgrade, 0,sizeof(OAM_UPGRADE_T));
  213. memset(&m_stLtvB, 0,sizeof(LTV_B_T));
  214. return;
  215. }
  216. //升级成功后向处理
  217. void OamUpgrade::upgradeSuccess(){
  218. QMessageBox::StandardButton dlg;
  219. //确认是否重启设备
  220. dlg = QMessageBox::question(this, "提示", "软件升级成功,重启后生效,要重启吗?", QMessageBox::Yes|QMessageBox::No);
  221. if (dlg == QMessageBox::No) {
  222. return;
  223. }
  224. //发消息给主控模块,重启设备
  225. emit SignalSendRestartMsg();
  226. return;
  227. }