dataupdatethread.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. #include "dataupdatethread.h"
  2. #include <QSqlQuery>
  3. #include <QSqlError>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <fcntl.h> /* For O_* constants */
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <sys/mman.h> /* For shm_open, mmap, ftruncate, etc */
  10. #include <sys/stat.h> /* For mode constants */
  11. #include <errno.h>
  12. #include <unistd.h>
  13. #include <QtSql>
  14. DataUpdateThread::DataUpdateThread(QObject *parent)
  15. :QThread(parent)
  16. {
  17. isRunStats=true;
  18. nMaxCh=0;
  19. nReadType=0;
  20. m_shmData=0;
  21. bTacStatus=0;
  22. nIndexMSG=0;
  23. }
  24. DataUpdateThread::~DataUpdateThread()
  25. {
  26. isRunStats=false;
  27. m_db.close();
  28. }
  29. void DataUpdateThread::InitSql()
  30. {
  31. m_db=QSqlDatabase::addDatabase("QSQLITE");
  32. m_db.setDatabaseName(strSqliteAddress);
  33. qDebug()<<strSqliteAddress;
  34. if (m_db.open())
  35. {
  36. qDebug()<<"SQL Open Success";
  37. isDBOpen=true;
  38. }else
  39. {
  40. qDebug()<<"SQL Open Error";
  41. isDBOpen=false;
  42. }
  43. if(isDBOpen)
  44. {
  45. ReadMaxCh();
  46. }
  47. nReadType=0;
  48. }
  49. void DataUpdateThread::run()
  50. {
  51. qDebug() <<"Start SQLThread";
  52. while (isRunStats)
  53. {
  54. if(pwidget)
  55. {
  56. if(nReadType==0)
  57. {
  58. int nMode=pwidget->getShowModeIndex();
  59. int nPage=pwidget->getShowPagIndex();
  60. // qDebug() <<"ReadType=0 nMode:"<<nMode<<";nPage"<<nPage;
  61. if(nMode==0&&nPage!=0)
  62. {
  63. int nSubPag=pwidget->getShowSubIndex();
  64. ReadSqlData(nSubPag);
  65. pwidget->SetV(strV);
  66. pwidget->SetA(strA);
  67. pwidget->SetW(strW);
  68. pwidget->SetF(strF);
  69. pwidget->SetSUM(strS);
  70. pwidget->setCH(nSubPag);
  71. pwidget->update();
  72. //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
  73. }
  74. else if(nMode==0&&nPage==0)
  75. {
  76. pwidget->UpdateDate();
  77. pwidget->update();
  78. }
  79. ReadMSG();
  80. }else
  81. {
  82. int nMode=pwidget->getShowModeIndex();
  83. int nPage=pwidget->getShowPagIndex();
  84. //qDebug() <<"ReadType=1 nMode:"<<nMode<<";nPage"<<nPage;
  85. ReadShmMaxch();
  86. ReadMSG();
  87. if(nMode==0&&nPage!=0)
  88. {
  89. int nSubPag=pwidget->getShowSubIndex();
  90. int nPHIndex=pwidget->getShowPHIndex();
  91. setShmChRead(nSubPag,nPHIndex);
  92. ReadShmData();
  93. pwidget->SetV(strV);
  94. pwidget->SetA(strA);
  95. pwidget->SetW(strW);
  96. pwidget->SetF(strF);
  97. pwidget->SetSUM(strS);
  98. pwidget->SetStatus(strStatus);
  99. pwidget->setCH(nSubPag);
  100. pwidget->SetT(strT);
  101. pwidget->SetH(strH);
  102. pwidget->SetCO2(strCO2);
  103. pwidget->update();
  104. //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
  105. }
  106. else if(nMode==0&&nPage==0)
  107. {
  108. ReadShmVer();
  109. pwidget->UpdateDate();
  110. pwidget->SetVer(strVer);
  111. pwidget->update();
  112. }
  113. }
  114. }
  115. sleep(1);
  116. }
  117. }
  118. void DataUpdateThread::SetShowWidget(Widget *pShowWidget)
  119. {
  120. pwidget=pShowWidget;
  121. connect(pwidget,SIGNAL(signal_ClickMSG()),this,SLOT(slot_ClickMSG()));
  122. connect(this,SIGNAL(signal_ShowMSGWidget(QString)),pwidget,SLOT(ShowMSGWidget(QString)),Qt::QueuedConnection);
  123. }
  124. void DataUpdateThread::ReadSqlData(int nCHID)
  125. {
  126. if(!isDBOpen)
  127. {
  128. return;
  129. }
  130. QSqlQuery sql_query(m_db);
  131. QString strSql=QString("SELECT * FROM Table_PowerInfo WHERE product_id=1 AND product_ch_id=%1 ORDER BY product_Index DESC LIMIT 1").arg(nCHID);
  132. //qDebug()<<strSql;
  133. if (sql_query.exec(strSql))
  134. {
  135. while (sql_query.next())
  136. {
  137. strV = sql_query.value("product_ch_voltage").toString();
  138. strA = sql_query.value("product_ch_current").toString();
  139. strW = sql_query.value("product_ch_power").toString();
  140. strF = sql_query.value("product_ch_power_freq").toString();
  141. strS = sql_query.value("product_ch_consumption").toString();
  142. //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
  143. }
  144. }else
  145. {
  146. qDebug()<<sql_query.lastError().text();
  147. }
  148. }
  149. void DataUpdateThread::ReadMaxCh()
  150. {
  151. if(!isDBOpen)
  152. {
  153. return;
  154. }
  155. QSqlQuery sql_query(m_db);
  156. QString strSql=QString("SELECT MAX(product_ch_id) as maxCh FROM Table_PowerManage ");
  157. //qDebug()<<strSql;
  158. if (sql_query.exec(strSql))
  159. {
  160. while (sql_query.next())
  161. {
  162. nMaxCh = sql_query.value("maxCh").toInt();
  163. if(pwidget)
  164. {
  165. pwidget->setMAXChildIndex(nMaxCh);
  166. }
  167. }
  168. }else
  169. {
  170. qDebug()<<sql_query.lastError().text();
  171. }
  172. }
  173. int DataUpdateThread::initShm()
  174. {
  175. /* 创建共享内存对象 */
  176. shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
  177. if (shm_fd == -1) {
  178. perror("shm_open");
  179. return 1;
  180. }
  181. /* 设置共享内存对象的大小 */
  182. qDebug()<<"=======================================";
  183. qDebug()<<"SHM_SizeOf="<<sizeof(smartPDU_shm_data);
  184. qDebug()<<"=======================================";
  185. if (ftruncate(shm_fd, sizeof(smartPDU_shm_data)) == -1) {
  186. perror("ftruncate");
  187. return 2;
  188. }
  189. m_shmData = (smartPDU_shm_data*)mmap(NULL, sizeof(smartPDU_shm_data), PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
  190. memset(m_shmData,0,sizeof(smartPDU_shm_data));
  191. m_shmData->nSelectSensor=10;
  192. nReadType=1;
  193. return 0;
  194. }
  195. void DataUpdateThread::deleteShm()
  196. {
  197. m_shmData->bPDUSet=-1;
  198. if (munmap(m_shmData, sizeof(smartPDU_shm_data)) == -1) {
  199. perror("munmap");
  200. return;
  201. }
  202. if (shm_unlink(SHM_NAME) == -1) {
  203. perror("shm_unlink");
  204. return;
  205. }
  206. m_shmData=nullptr;
  207. }
  208. void DataUpdateThread::setShmChRead(int nCh,int nPhID)
  209. {
  210. if(nReadType!=1&&!m_shmData)
  211. {
  212. return;
  213. }
  214. if(m_shmData->bPDUSet>0)
  215. {
  216. if(m_shmData->nSelectPowerCH!=nCh||m_shmData->nSelectPh!=nPhID||bTacStatus!=m_shmData->bT_ACType)
  217. {
  218. m_shmData->nSelectPowerCH=nCh;
  219. qDebug()<<"ShmData_____bT_ACType:"<<bTacStatus<<"nSelectPowerCH:"<<m_shmData->nSelectPowerCH;
  220. bTacStatus=m_shmData->bT_ACType;
  221. pdu_Ctrl::instance()->isT_ACType=bTacStatus;
  222. if(bTacStatus==1)
  223. {
  224. if(m_shmData->nSelectPh!=nPhID)
  225. {
  226. m_shmData->nSelectPh=nPhID;
  227. qDebug()<<"ShmData_____nSelectPowerCH:"<<m_shmData->nSelectPowerCH<<"nSelectPh:"<<m_shmData->nSelectPh;
  228. }
  229. }else
  230. {
  231. m_shmData->nSelectPh=0;
  232. }
  233. m_shmData->bPDUSet=0;
  234. }
  235. }
  236. }
  237. void DataUpdateThread::ReadShmData()
  238. {
  239. if(nReadType!=1&&!m_shmData)
  240. {
  241. return;
  242. }
  243. if(m_shmData->bPDUSet>0)
  244. {
  245. if(m_shmData->fV>=0.1)
  246. {
  247. strV = QString::number(m_shmData->fV,'f',2);
  248. }else
  249. {
  250. strV = "0.00";
  251. }
  252. if(m_shmData->fA>=0.01)
  253. {
  254. strA = QString::number(m_shmData->fA,'f',2);
  255. }else
  256. {
  257. strA="0.00";
  258. }
  259. strW = QString::number(m_shmData->fW,'f',2);
  260. strF = QString::number(m_shmData->fF,'f',2);
  261. strS = QString::number(m_shmData->fS,'f',2);
  262. if(m_shmData->nStatus==0)
  263. {
  264. strStatus="OFF";
  265. }else
  266. {
  267. strStatus="ON";
  268. }
  269. strT = QString::number(m_shmData->fT,'f',2);
  270. strH = QString::number(m_shmData->fH,'f',2);
  271. QString strShow=QString::number(m_shmData->fCO2,'f',2);
  272. //qDebug()<< "Update CO2:"+strShow;
  273. strCO2 = strShow;//QString::number(m_shmData->fCO2,'f',2);
  274. }
  275. }
  276. void DataUpdateThread::ReadShmMaxch()
  277. {
  278. if(nReadType!=1&&!m_shmData)
  279. {
  280. if(pwidget)
  281. {
  282. pwidget->setMAXChildIndex(0);
  283. }
  284. return;
  285. }
  286. if(pwidget&&m_shmData->bPDUSet>0)
  287. {
  288. if(pwidget->nMAXChildIndex!=m_shmData->nMaxCh)
  289. {
  290. pwidget->setMAXChildIndex(m_shmData->nMaxCh);
  291. }
  292. }
  293. }
  294. void DataUpdateThread::ReadShmVer()
  295. {
  296. if(nReadType!=1&&!m_shmData)
  297. {
  298. return;
  299. }
  300. if(m_shmData->bPDUSet>0)
  301. {
  302. strVer=QString::fromLocal8Bit(m_shmData->strVer);
  303. }
  304. }
  305. int DataUpdateThread::isT_ACType()
  306. {
  307. return bTacStatus;
  308. }
  309. void DataUpdateThread::ReadMSG()
  310. {
  311. if(nReadType!=1&&!m_shmData)
  312. {
  313. return;
  314. }
  315. if(0<=nIndexMSG&&nIndexMSG<10)
  316. {
  317. switch(m_shmData->nTypeCtrlType[nIndexMSG])
  318. {
  319. case MSGCtrl_Null:
  320. case MSGCtrl_Click:
  321. {
  322. bool isHaveMSG=false;
  323. //未检测到更新从当前位置循环遍历一遍
  324. //qDebug()<<"MSG_Find"<<nIndexMSG<<"=Null";
  325. for(int nIndex=0;nIndex<10;nIndex++)//监测其他的点是否有被更新依次刷新过去
  326. {
  327. nIndexMSG=NextIndex();
  328. if(m_shmData->nTypeCtrlType[nIndexMSG]==MSGCtrl_Write)//检测到新的点。
  329. {
  330. //qDebug()<<nIndexMSG<<"=MSGCtrl_Write";
  331. isHaveMSG=true;
  332. QString strShow=QString::fromUtf8(m_shmData->strMSG[nIndexMSG]);
  333. QString strShow8bit=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
  334. //qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
  335. //qDebug()<<"MSG_Update fromUtf8="<<strShow;
  336. //qDebug()<<"MSG_Update fromLocal8bit="<<strShow8bit;
  337. ShowMSGWidget(strShow);
  338. break;
  339. }else
  340. {
  341. //qDebug()<<nIndexMSG<<"="<<m_shmData->nTypeCtrlType[nIndexMSG];
  342. }
  343. }
  344. if(isHaveMSG)
  345. {
  346. nIndexMSG=0;//如果全没有就重新设置到0从0开始
  347. }
  348. }
  349. break;
  350. case MSGCtrl_Write://存在已写入的数据
  351. {
  352. /*QString strShow=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
  353. qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
  354. qDebug()<<"MSG_Update strMSG="<<strShow;
  355. ShowMSGWidget(strShow);*/
  356. QString strShow=QString::fromUtf8(m_shmData->strMSG[nIndexMSG]);
  357. QString strShow8bit=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
  358. //qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
  359. //qDebug()<<"MSG_Update fromUtf8="<<strShow;
  360. //qDebug()<<"MSG_Update fromLocal8bit="<<strShow8bit;
  361. ShowMSGWidget(strShow);
  362. }
  363. break;
  364. default:
  365. break;
  366. }
  367. //qDebug()<<"MSG_Switch_end nIndexMSG ="<<nIndexMSG;
  368. }
  369. }
  370. int DataUpdateThread::NextIndex()
  371. {
  372. if(0<=nIndexMSG&&nIndexMSG<9)
  373. {
  374. return nIndexMSG+1;
  375. }else
  376. {
  377. return 0;
  378. }
  379. }
  380. void DataUpdateThread::ShowMSGWidget(QString strShowData)
  381. {
  382. if(strShowData.isEmpty())return;
  383. if(pwidget&&pwidget->isHiddenMSGWidget())
  384. {
  385. if(strShowData!=strNowMSG)
  386. {
  387. strNowMSG=strShowData;
  388. emit signal_ShowMSGWidget(strShowData);
  389. //pwidget->ShowMSGWidget(strShowData);
  390. //qDebug()<<"emit ShowMSGWidget_Data:"<<strNowMSG;
  391. }
  392. }
  393. }
  394. void DataUpdateThread::slot_ClickMSG()
  395. {
  396. strNowMSG="";
  397. if(nReadType!=1&&!m_shmData)
  398. {
  399. return;
  400. }
  401. if(0<=nIndexMSG&&nIndexMSG<10)
  402. {
  403. m_shmData->nTypeCtrlType[nIndexMSG]=MSGCtrl_Click;
  404. }
  405. nIndexMSG=NextIndex();
  406. //ReadMSG();
  407. }