pdu_ctrl.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. #include "pdu_ctrl.h"
  2. #include <QtWidgets/QStackedWidget>
  3. #include <QSettings>
  4. #include <QProcess>
  5. #include <QCoreApplication>
  6. #include <QSql>
  7. #include <QSqlDatabase>
  8. #include <QSqlQuery>
  9. #include <QSqlError>
  10. #include <QTextStream>
  11. #include <QRegularExpression>
  12. #include <QApplication>
  13. #define READ_INI_STR(key, default_value) (settings.contains(key) ? settings.value(key).toString() : default_value)
  14. #define READ_INI_INT(key, default_value) (settings.contains(key) ? settings.value(key).toInt() : default_value)
  15. pdu_Ctrl* pdu_Ctrl::m_instance = nullptr;
  16. QMutex pdu_Ctrl::mutex;
  17. pdu_Ctrl::pdu_Ctrl(QObject *parent) : QObject(parent)
  18. {
  19. m_nModbusSelect=0;
  20. m_nModbusAddress=0;//从机地址
  21. m_nModbusMSType=1;//主从
  22. m_nSaveData=0;
  23. nViewShowType=widgetType_Main;
  24. nSettingType=0;
  25. nChidIndex=0;
  26. nChidPHIndex=0;
  27. m_nAngle=0;
  28. isT_ACType=0;
  29. m_nSaveAngle=0;
  30. nMonway=2;
  31. memset(nButtonStatus,0,sizeof(nButtonStatus));
  32. //
  33. }
  34. void pdu_Ctrl::slot_setAngel(int nAngle)
  35. {
  36. if(m_pAngleCtrl&&m_pWidget)
  37. {
  38. //m_pAngleCtrl->setPos(size().width()/2, size().height()/2);
  39. //m_pAngleCtrl->transform(width() / 2, height() / 2);
  40. m_pAngleCtrl->setRotation(nAngle);
  41. m_nAngle=nAngle;
  42. if(m_nAngle!=m_nSaveAngle)
  43. {
  44. m_nSaveAngle=m_nAngle;
  45. SetPDUInit();
  46. }
  47. #ifdef RS485Type
  48. if(nAngle==0||nAngle==180)
  49. {
  50. m_pWidget->resize(m_nWidth+2, m_nHeight+2);
  51. if(nAngle==0)
  52. {
  53. m_pAngleCtrl->setPos(0,0);
  54. }else
  55. {
  56. m_pAngleCtrl->setPos(m_pWidget->size().width()-2,m_pWidget->size().height()-2);
  57. }
  58. //QRect pRect=size();
  59. qDebug()<<"x:"<<m_pWidget->geometry().x()<<"y:"<<m_pWidget->geometry().y()<<"Width:"<<m_pWidget->size().width()<<"Height:"<<m_pWidget->size().height();
  60. }else
  61. {
  62. m_pWidget->resize(m_nHeight+2,m_nWidth+2);
  63. if(nAngle==90)
  64. {
  65. m_pAngleCtrl->setPos(m_nWidth-2,0);
  66. }else
  67. {
  68. m_pAngleCtrl->setPos(0,m_nHeight-2);
  69. }
  70. qDebug()<<"x:"<<m_pWidget->geometry().x()<<"y:"<<m_pWidget->geometry().y()<<"Width:"<<m_pWidget->size().width()<<"Height:"<<m_pWidget->size().height();
  71. }
  72. #else
  73. if(nAngle==0||nAngle==180)
  74. {
  75. m_pWidget->resize(m_nWidth, m_nHeight);
  76. if(nAngle==0)
  77. {
  78. m_pAngleCtrl->setPos(0,0);
  79. }else
  80. {
  81. m_pAngleCtrl->setPos(m_pWidget->size().width(),m_pWidget->size().height());
  82. }
  83. //QRect pRect=size();
  84. qDebug()<<"x:"<<m_pWidget->geometry().x()<<"y:"<<m_pWidget->geometry().y()<<"Width:"<<m_pWidget->size().width()<<"Height:"<<m_pWidget->size().height();
  85. }else
  86. {
  87. m_pWidget->resize(m_nHeight,m_nWidth);
  88. if(nAngle==90)
  89. {
  90. m_pAngleCtrl->setPos(m_nWidth,0);
  91. }else
  92. {
  93. m_pAngleCtrl->setPos(0,m_nHeight);
  94. }
  95. qDebug()<<"x:"<<m_pWidget->geometry().x()<<"y:"<<m_pWidget->geometry().y()<<"Width:"<<m_pWidget->size().width()<<"Height:"<<m_pWidget->size().height();
  96. }
  97. #endif
  98. m_pWidget->m_nAngle=nAngle;
  99. m_pView->update();
  100. }
  101. }
  102. void pdu_Ctrl::slot_ClickBtn(int nButton)
  103. {
  104. ButtonDown(nButton,BtnDown_C);
  105. }
  106. void pdu_Ctrl::slot_DClickBtn(int nButton)
  107. {
  108. ButtonDown(nButton,BtnDown_C);
  109. }
  110. void pdu_Ctrl::slot_LClickBtn(int nButton)
  111. {
  112. ButtonDown(nButton,BtnDown_L);
  113. }
  114. void pdu_Ctrl::slot_BtnClear(int nButton)
  115. {
  116. ButtonDown(nButton,BtnDown_Null);
  117. }
  118. void pdu_Ctrl::InitData(Widget *pWidget, QGraphicsProxyWidget *pProxy, QGraphicsView *pView,int nWidth, int nHeight)
  119. {
  120. m_pAngleCtrl=pProxy;
  121. m_pView=pView;
  122. m_pWidget=pWidget;
  123. m_nWidth= nWidth;
  124. m_nHeight = nHeight;
  125. }
  126. void pdu_Ctrl::ReadModbusInit()
  127. {
  128. QString appPath = QCoreApplication::applicationDirPath();
  129. QSettings settings(appPath+"/smartPDU.ini",QSettings::IniFormat);
  130. m_nModbusAddress=READ_INI_INT("MODBUS/address",0);
  131. if(m_nModbusAddress>255||m_nModbusAddress<0)
  132. {
  133. m_nModbusAddress=0;
  134. }
  135. m_nModbusMSType=READ_INI_INT("MODBUS/MSType",1);//0:主机,1:从机
  136. qDebug()<<"modbus Config m_nModbusMSType="<<m_nModbusMSType<<" m_nModbusAddress="<<m_nModbusAddress;
  137. QSqlDatabase m_db;
  138. m_db=QSqlDatabase::addDatabase("QSQLITE");
  139. m_db.setDatabaseName(strSqliteAddress);
  140. qDebug()<<"modbus DB="<<strSqliteAddress;
  141. bool isDBOpen=false;
  142. if (m_db.open())
  143. {
  144. qDebug()<<"SQL Open Success";
  145. isDBOpen=true;
  146. }else
  147. {
  148. qDebug()<<"SQL Open Error";
  149. isDBOpen=false;
  150. }
  151. if(isDBOpen)
  152. {
  153. QSqlQuery sql_query(m_db);
  154. QString strSql=QString("SELECT * FROM Table_DeviceInfo where product_id==1;");
  155. //qDebug()<<strSql;
  156. if (sql_query.exec(strSql))
  157. {
  158. while (sql_query.next())
  159. {
  160. m_nModbusAddress = sql_query.value("product_modbus_addr").toInt();
  161. }
  162. }else
  163. {
  164. qDebug()<<sql_query.lastError().text();
  165. }
  166. }
  167. m_db.close();
  168. qDebug()<<"modbus m_nModbusMSType="<<m_nModbusMSType<<" m_nModbusAddress="<<m_nModbusAddress;
  169. ReadPDUinit();
  170. }
  171. void pdu_Ctrl::SaveModbusInit()
  172. {
  173. //QSettings settings("/root/run/app/smartPDU.ini",QSettings::IniFormat);
  174. QString appPath = QCoreApplication::applicationDirPath();
  175. updateIniValue(appPath+"/smartPDU.ini","MODBUS","address",QString::number(m_nModbusAddress));
  176. updateIniValue(appPath+"/smartPDU.ini","MODBUS","MSType",QString::number(m_nModbusMSType));
  177. //settings.setValue("MODBUS/address",m_nModbusAddress);
  178. //settings.setValue("MODBUS/MSType",m_nModbusMSType);//0:主机,1:从机
  179. QSqlDatabase m_db;
  180. m_db=QSqlDatabase::addDatabase("QSQLITE");
  181. m_db.setDatabaseName(strSqliteAddress);
  182. qDebug()<<strSqliteAddress;
  183. bool isDBOpen=false;
  184. if (m_db.open())
  185. {
  186. qDebug()<<"SQL Open Success";
  187. isDBOpen=true;
  188. }else
  189. {
  190. qDebug()<<"SQL Open Error";
  191. isDBOpen=false;
  192. }
  193. if(isDBOpen)
  194. {
  195. QSqlQuery sql_query(m_db);
  196. QString strSql=QString("UPDATE Table_DeviceInfo SET product_modbus_addr = %1 WHERE product_id==1").arg(m_nModbusAddress);
  197. //qDebug()<<strSql;
  198. if (!sql_query.exec(strSql))
  199. {
  200. qDebug()<<sql_query.lastError().text();
  201. }
  202. }
  203. m_db.close();
  204. }
  205. void pdu_Ctrl::ReadPDUinit()
  206. {
  207. qDebug()<<"Read misc/rotate";
  208. QString appPath = QCoreApplication::applicationDirPath();
  209. QSettings settings(appPath+"/smartPDU.ini",QSettings::IniFormat);
  210. QString strRotate=READ_INI_STR("misc/rotate","0");
  211. QString strMonway=READ_INI_STR("webcfg/monway","2");
  212. nMonway=strMonway.toInt();
  213. qDebug()<<"misc/rotate="<<strRotate;
  214. qDebug()<<"webcfg/monway="<<strMonway;
  215. if(!strRotate.isEmpty())
  216. {
  217. m_nSaveAngle=strRotate.toInt();
  218. qDebug()<<"InitAngleStr="<<strRotate<<"InitAngleToint="<<m_nSaveAngle;
  219. m_nAngle=m_nSaveAngle;
  220. slot_setAngel(m_nAngle);
  221. }
  222. else
  223. {
  224. qDebug()<<"InitAngleStr="<<strRotate;
  225. }
  226. if(m_pWidget)m_pWidget->setMonwayType(nMonway);
  227. }
  228. void pdu_Ctrl::SetPDUInit()
  229. {
  230. //QSettings settings("/root/run/app/smartPDU.ini",QSettings::IniFormat);
  231. QString strValue="\""+QString::number(m_nSaveAngle)+"\"";
  232. //settings.setValue("misc/rotate",strValue);
  233. QString appPath = QCoreApplication::applicationDirPath();
  234. updateIniValue(appPath+"/smartPDU.ini","misc","rotate",strValue);
  235. }
  236. bool pdu_Ctrl::updateIniValue(const QString &filePath, const QString &section, const QString &key, const QString &newValue)
  237. {
  238. QFile file(filePath);
  239. if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
  240. return false;
  241. }
  242. QTextStream in(&file);
  243. QStringList lines;
  244. bool inTargetSection = false;
  245. QRegularExpression sectionRe(R"(^\[(.*)\]\s*$)");
  246. QRegularExpression keyRe(R"(^\s*([^=]+)\s*=\s*(.*)\s*$)");
  247. // 逐行读取并处理
  248. while (!in.atEnd()) {
  249. QString line = in.readLine();
  250. QRegularExpressionMatch sectionMatch = sectionRe.match(line);
  251. if (sectionMatch.hasMatch()) {
  252. inTargetSection = (sectionMatch.captured(1) == section);
  253. } else if (inTargetSection) {
  254. QRegularExpressionMatch keyMatch = keyRe.match(line);
  255. if (keyMatch.hasMatch() && keyMatch.captured(1).trimmed() == key) {
  256. // 替换目标键的值,保留原格式(如双引号)
  257. line = QString("%1 = %2").arg(key, newValue);
  258. }
  259. }
  260. lines.append(line);
  261. }
  262. // 写回文件
  263. file.resize(0); // 清空原内容
  264. QTextStream out(&file);
  265. for (const QString& line : lines) {
  266. out << line << "\n";
  267. }
  268. file.close();
  269. return true;
  270. }
  271. void pdu_Ctrl::Main_UPBtnSet(BtnDownType nbtnType)
  272. {
  273. qDebug()<<"Main_UPBtnSet";
  274. if(!m_pWidget)
  275. {
  276. return;
  277. }
  278. if(nbtnType==BtnDown_C)
  279. {
  280. qDebug()<<"pageUp";
  281. m_pWidget->pageUp();
  282. }
  283. }
  284. void pdu_Ctrl::Main_FunBtnSet(BtnDownType nbtnType)
  285. {
  286. //中间按钮
  287. qDebug()<<"Main_FunBtnSet";
  288. if (nbtnType==BtnDown_C)
  289. {
  290. //在通道界面是显示三项通道
  291. if(m_pWidget)
  292. {
  293. int nNowIndex=m_pWidget->getShowPagIndex();
  294. qDebug()<<"NowIndex="<<nNowIndex;
  295. switch (nNowIndex) {
  296. #ifdef RS485Type
  297. #else
  298. case 1:
  299. case 2://CH通道界面如果是三项则切换至三项子通道界面
  300. {
  301. if(isT_ACType==1)
  302. {
  303. lastACIndex=nNowIndex;
  304. m_pWidget->setShowPHIndex(1);
  305. ChangeView(widgetType_Main,4);
  306. }
  307. }
  308. break;
  309. case 4://PH通道界面返回CH通道界面
  310. {
  311. m_pWidget->setShowPHIndex(0);
  312. ChangeView(widgetType_Main,lastACIndex);
  313. }
  314. break;
  315. #endif
  316. default://其他界面
  317. //在显示主界面时是旋转窗口
  318. m_nAngle+=90;
  319. m_nAngle==360?m_nAngle=0:m_nAngle;
  320. qDebug()<<"nAngle:"<<m_nAngle;
  321. slot_setAngel(m_nAngle);
  322. qDebug()<<"slot_setAngel";
  323. break;
  324. }
  325. }
  326. }
  327. else
  328. {
  329. qDebug()<<"setSelectStatus";
  330. if(m_pWidget)
  331. {
  332. m_nModbusSelect=0;
  333. m_pWidget->CtrlBtnSet(0,m_nModbusAddress);
  334. m_pWidget->setSelectStatus(m_nModbusSelect);
  335. m_nSaveData=0;
  336. }
  337. //切换到modbus
  338. qDebug()<<"ChangeView";
  339. //nViewShowType=widgetType_Setting;
  340. ChangeView(widgetType_Setting,0);
  341. }
  342. }
  343. void pdu_Ctrl::Main_DownBtnSet(BtnDownType nbtnType)
  344. {
  345. qDebug()<<"Main_DownBtnSet";
  346. if(!m_pWidget)
  347. {
  348. return;
  349. }
  350. if(nbtnType==BtnDown_C)
  351. {
  352. m_pWidget->pageDown();
  353. qDebug()<<"pageDown";
  354. }
  355. }
  356. void pdu_Ctrl::Setting_UPBtnSet(BtnDownType nbtnType)
  357. {
  358. switch (nSettingType) {
  359. case settingMode_Modbus:
  360. {
  361. if(nbtnType==BtnDown_C)
  362. {//切换select
  363. if(m_pWidget)
  364. {
  365. switch (m_nModbusSelect) {
  366. case 0://address
  367. {
  368. m_nModbusAddress+=1;
  369. if(m_nModbusAddress>32)m_nModbusAddress=1;
  370. m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nModbusAddress);
  371. }break;
  372. case 1://SAVE
  373. {
  374. //保存切换
  375. m_nSaveData==0?m_nSaveData=1:m_nSaveData=0;
  376. m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nSaveData);
  377. }break;
  378. case 2://主从
  379. {
  380. //主从切换
  381. m_nModbusMSType==0?m_nModbusMSType=1:m_nModbusMSType=0;
  382. m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nModbusMSType);
  383. }break;
  384. }
  385. }
  386. }else if(nbtnType==BtnDown_L)
  387. {
  388. switch (m_nModbusSelect) {
  389. case 0://address
  390. {
  391. m_nModbusAddress+=5;
  392. if(m_nModbusAddress>255)m_nModbusAddress=0;
  393. if(m_pWidget)m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nModbusAddress);
  394. }break;
  395. }
  396. }
  397. }break;
  398. case settingMode_IP:
  399. {
  400. }break;
  401. default:
  402. break;
  403. }
  404. }
  405. void pdu_Ctrl::Setting_FunBtnSet(BtnDownType nbtnType)
  406. {
  407. switch (nSettingType) {
  408. case settingMode_Modbus:
  409. {
  410. if(nbtnType==BtnDown_C)
  411. {//切换select
  412. if(m_pWidget)
  413. {
  414. if(m_nModbusSelect==1&&m_nSaveData==1)//短按 FUN 保存YES回到前台。
  415. {
  416. SaveModbusInit();
  417. ChangeView(widgetType_Main,0);
  418. }else
  419. {
  420. #ifdef RS485Type
  421. m_nModbusSelect==0?m_nModbusSelect=1:m_nModbusSelect=0;
  422. #endif
  423. m_pWidget->setSelectStatus(m_nModbusSelect);
  424. }
  425. }
  426. }else if(nbtnType==BtnDown_L)
  427. {
  428. ChangeView(widgetType_Main,0);
  429. }
  430. }break;
  431. case settingMode_IP:
  432. {
  433. }break;
  434. default:
  435. break;
  436. }
  437. }
  438. void pdu_Ctrl::Setting_DownBtnSet(BtnDownType nbtnType)
  439. {
  440. switch (nSettingType) {
  441. case settingMode_Modbus:
  442. {
  443. if(nbtnType==BtnDown_C)
  444. {//切换select
  445. if(m_pWidget)
  446. {
  447. switch (m_nModbusSelect) {
  448. case 0://address
  449. {
  450. m_nModbusAddress-=1;
  451. if(m_nModbusAddress<1)m_nModbusAddress=32;
  452. m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nModbusAddress);
  453. }break;
  454. case 1://SAVE
  455. {
  456. //保存切换
  457. m_nSaveData==0?m_nSaveData=1:m_nSaveData=0;
  458. m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nSaveData);
  459. }break;
  460. case 2://主从
  461. {
  462. //主从切换
  463. m_nModbusMSType==0?m_nModbusMSType=1:m_nModbusMSType=0;
  464. m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nModbusMSType);
  465. }break;
  466. }
  467. }
  468. }else if(nbtnType==BtnDown_L)
  469. {
  470. switch (m_nModbusSelect) {
  471. case 0://address
  472. {
  473. m_nModbusAddress-=5;
  474. if(m_nModbusAddress<0)m_nModbusAddress=255;
  475. if(m_pWidget)m_pWidget->CtrlBtnSet(m_nModbusSelect,m_nModbusAddress);
  476. }break;
  477. }
  478. }
  479. }break;
  480. case settingMode_IP:
  481. {
  482. }break;
  483. default:
  484. break;
  485. }
  486. }
  487. void pdu_Ctrl::ChangeView(WidgetType widgetType, int nIndex)
  488. {
  489. if(!m_pWidget)
  490. {
  491. return;
  492. }
  493. if(widgetType!=nViewShowType)
  494. {
  495. qDebug()<<"Widget->ChangeView";
  496. m_pWidget->ChangeView(widgetType,0);
  497. nViewShowType=widgetType;
  498. }else
  499. {
  500. m_pWidget->ChangeView(widgetType,nIndex);
  501. }
  502. }
  503. void pdu_Ctrl::ResetAll()
  504. {
  505. #ifdef RS485IpType
  506. system("sh /mnt/UDISK/app/recovery.sh");
  507. #else
  508. system("sh /opt/recovery.sh");
  509. #endif
  510. }
  511. void pdu_Ctrl::RestartSys()
  512. {
  513. system("reboot");
  514. }
  515. void pdu_Ctrl::ButtonDown(int nButtonID, BtnDownType nDownType)
  516. {
  517. //规整按钮状态
  518. switch (nButtonID) {
  519. case GPIO_KEY1://1按钮
  520. nButtonStatus[0]=nDownType;
  521. break;
  522. case GPIO_KEY2:
  523. nButtonStatus[1]=nDownType;
  524. break;
  525. case GPIO_KEY3://3按钮
  526. nButtonStatus[2]=nDownType;
  527. break;
  528. default:
  529. break;
  530. }
  531. qDebug()<<"Key1="<<GPIO_KEY1<<" Type1="<<nButtonStatus[0];
  532. qDebug()<<"Key2="<<GPIO_KEY2<<" Type2="<<nButtonStatus[1];
  533. qDebug()<<"Key3="<<GPIO_KEY3<<" Type3="<<nButtonStatus[2];
  534. qDebug()<<"widgetType="<<nViewShowType;
  535. if(nDownType<0)
  536. {
  537. return;
  538. }
  539. //判断多键控制
  540. if(nButtonStatus[0]==2&&nButtonStatus[2]==2)
  541. {//恢复出厂设置
  542. ResetAll();
  543. return;
  544. }
  545. if(nButtonStatus[0]==2&&nButtonStatus[1]==2)
  546. {//重新启动
  547. RestartSys();
  548. return;
  549. }
  550. if(m_pWidget&&!m_pWidget->isHiddenMSGWidget())
  551. {
  552. if(nDownType==BtnDown_C||nDownType==BtnDown_D)
  553. {
  554. m_pWidget->ClickMSGBtn();
  555. return;
  556. }
  557. }
  558. if(nViewShowType==widgetType_Main)
  559. {
  560. qDebug()<<"widgetType="<<widgetType_Main;
  561. qDebug()<<"nButtonID="<<nButtonID;
  562. switch (nButtonID) {
  563. case GPIO_KEY1://1按钮
  564. Main_UPBtnSet(nDownType);
  565. break;
  566. case GPIO_KEY2:
  567. Main_FunBtnSet(nDownType);
  568. break;
  569. case GPIO_KEY3://3按钮
  570. Main_DownBtnSet(nDownType);
  571. break;
  572. default:
  573. break;
  574. }
  575. }else if(nViewShowType==widgetType_Setting)
  576. {
  577. qDebug()<<"widgetType="<<widgetType_Setting;
  578. qDebug()<<"nButtonID="<<nButtonID;
  579. switch (nButtonID) {
  580. case GPIO_KEY1://1按钮
  581. Setting_UPBtnSet(nDownType);
  582. break;
  583. case GPIO_KEY2:
  584. Setting_FunBtnSet(nDownType);
  585. break;
  586. case GPIO_KEY3://3按钮
  587. Setting_DownBtnSet(nDownType);
  588. break;
  589. default:
  590. break;
  591. }
  592. }
  593. }