dataupdatethread.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  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. }
  123. void DataUpdateThread::ReadSqlData(int nCHID)
  124. {
  125. if(!isDBOpen)
  126. {
  127. return;
  128. }
  129. QSqlQuery sql_query(m_db);
  130. 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);
  131. //qDebug()<<strSql;
  132. if (sql_query.exec(strSql))
  133. {
  134. while (sql_query.next())
  135. {
  136. strV = sql_query.value("product_ch_voltage").toString();
  137. strA = sql_query.value("product_ch_current").toString();
  138. strW = sql_query.value("product_ch_power").toString();
  139. strF = sql_query.value("product_ch_power_freq").toString();
  140. strS = sql_query.value("product_ch_consumption").toString();
  141. //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
  142. }
  143. }else
  144. {
  145. qDebug()<<sql_query.lastError().text();
  146. }
  147. }
  148. void DataUpdateThread::ReadMaxCh()
  149. {
  150. if(!isDBOpen)
  151. {
  152. return;
  153. }
  154. QSqlQuery sql_query(m_db);
  155. QString strSql=QString("SELECT MAX(product_ch_id) as maxCh FROM Table_PowerManage ");
  156. //qDebug()<<strSql;
  157. if (sql_query.exec(strSql))
  158. {
  159. while (sql_query.next())
  160. {
  161. nMaxCh = sql_query.value("maxCh").toInt();
  162. if(pwidget)
  163. {
  164. pwidget->nMAXChildIndex=nMaxCh;
  165. }
  166. }
  167. }else
  168. {
  169. qDebug()<<sql_query.lastError().text();
  170. }
  171. }
  172. int DataUpdateThread::initShm()
  173. {
  174. /* 创建共享内存对象 */
  175. shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
  176. if (shm_fd == -1) {
  177. perror("shm_open");
  178. return 1;
  179. }
  180. /* 设置共享内存对象的大小 */
  181. qDebug()<<"=======================================";
  182. qDebug()<<"SHM_SizeOf="<<sizeof(smartPDU_shm_data);
  183. qDebug()<<"=======================================";
  184. if (ftruncate(shm_fd, sizeof(smartPDU_shm_data)) == -1) {
  185. perror("ftruncate");
  186. return 2;
  187. }
  188. m_shmData = (smartPDU_shm_data*)mmap(NULL, sizeof(smartPDU_shm_data), PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
  189. memset(m_shmData,0,sizeof(smartPDU_shm_data));
  190. m_shmData->nSelectSensor=10;
  191. nReadType=1;
  192. return 0;
  193. }
  194. void DataUpdateThread::deleteShm()
  195. {
  196. m_shmData->bPDUSet=-1;
  197. if (munmap(m_shmData, sizeof(smartPDU_shm_data)) == -1) {
  198. perror("munmap");
  199. return;
  200. }
  201. if (shm_unlink(SHM_NAME) == -1) {
  202. perror("shm_unlink");
  203. return;
  204. }
  205. m_shmData=nullptr;
  206. }
  207. void DataUpdateThread::setShmChRead(int nCh,int nPhID)
  208. {
  209. if(nReadType!=1&&!m_shmData)
  210. {
  211. return;
  212. }
  213. if(m_shmData->bPDUSet>0)
  214. {
  215. if(m_shmData->nSelectPowerCH!=nCh||m_shmData->nSelectPh!=nPhID||bTacStatus!=m_shmData->bT_ACType)
  216. {
  217. m_shmData->nSelectPowerCH=nCh;
  218. qDebug()<<"ShmData_____bT_ACType:"<<bTacStatus<<"nSelectPowerCH:"<<m_shmData->nSelectPowerCH;
  219. bTacStatus=m_shmData->bT_ACType;
  220. pdu_Ctrl::instance()->isT_ACType=bTacStatus;
  221. if(bTacStatus==1)
  222. {
  223. if(m_shmData->nSelectPh!=nPhID)
  224. {
  225. m_shmData->nSelectPh=nPhID;
  226. qDebug()<<"ShmData_____nSelectPowerCH:"<<m_shmData->nSelectPowerCH<<"nSelectPh:"<<m_shmData->nSelectPh;
  227. }
  228. }else
  229. {
  230. m_shmData->nSelectPh=0;
  231. }
  232. m_shmData->bPDUSet=0;
  233. }
  234. }
  235. }
  236. void DataUpdateThread::ReadShmData()
  237. {
  238. if(nReadType!=1&&!m_shmData)
  239. {
  240. return;
  241. }
  242. if(m_shmData->bPDUSet>0)
  243. {
  244. if(m_shmData->fV>=0.1)
  245. {
  246. strV = QString::number(m_shmData->fV,'f',2);
  247. }else
  248. {
  249. strV = "0.00";
  250. }
  251. if(m_shmData->fA>=0.01)
  252. {
  253. strA = QString::number(m_shmData->fA,'f',2);
  254. }else
  255. {
  256. strA="0.00";
  257. }
  258. strW = QString::number(m_shmData->fW,'f',2);
  259. strF = QString::number(m_shmData->fF,'f',2);
  260. strS = QString::number(m_shmData->fS,'f',2);
  261. if(m_shmData->nStatus==0)
  262. {
  263. strStatus="OFF";
  264. }else
  265. {
  266. strStatus="ON";
  267. }
  268. strT = QString::number(m_shmData->fT,'f',2);
  269. strH = QString::number(m_shmData->fH,'f',2);
  270. QString strShow=QString::number(m_shmData->fCO2,'f',2);
  271. //qDebug()<< "Update CO2:"+strShow;
  272. strCO2 = strShow;//QString::number(m_shmData->fCO2,'f',2);
  273. }
  274. }
  275. void DataUpdateThread::ReadShmMaxch()
  276. {
  277. if(nReadType!=1&&!m_shmData)
  278. {
  279. if(pwidget)
  280. {
  281. pwidget->nMAXChildIndex=0;
  282. }
  283. return;
  284. }
  285. if(pwidget&&m_shmData->bPDUSet>0)
  286. {
  287. if(pwidget->nMAXChildIndex!=m_shmData->nMaxCh)
  288. {
  289. pwidget->nMAXChildIndex=m_shmData->nMaxCh;
  290. }
  291. }
  292. }
  293. void DataUpdateThread::ReadShmVer()
  294. {
  295. if(nReadType!=1&&!m_shmData)
  296. {
  297. return;
  298. }
  299. if(m_shmData->bPDUSet>0)
  300. {
  301. strVer=QString::fromLocal8Bit(m_shmData->strVer);
  302. }
  303. }
  304. int DataUpdateThread::isT_ACType()
  305. {
  306. return bTacStatus;
  307. }
  308. void DataUpdateThread::ReadMSG()
  309. {
  310. if(nReadType!=1&&!m_shmData)
  311. {
  312. return;
  313. }
  314. if(0<=nIndexMSG&&nIndexMSG<10)
  315. {
  316. switch(m_shmData->nTypeCtrlType[nIndexMSG])
  317. {
  318. case MSGCtrl_Null:
  319. case MSGCtrl_Click:
  320. {
  321. bool isHaveMSG=false;
  322. //未检测到更新从当前位置循环遍历一遍
  323. qDebug()<<"MSG_Find"<<nIndexMSG<<"=Null";
  324. for(int nIndex=0;nIndex<10;nIndex++)//监测其他的点是否有被更新依次刷新过去
  325. {
  326. nIndexMSG=NextIndex();
  327. if(m_shmData->nTypeCtrlType[nIndexMSG]==MSGCtrl_Write)//检测到新的点。
  328. {
  329. qDebug()<<nIndexMSG<<"=MSGCtrl_Write";
  330. isHaveMSG=true;
  331. QString strShow=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
  332. qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
  333. qDebug()<<"MSG_Update strMSG="<<strShow;
  334. ShowMSGWidget(strShow);
  335. break;
  336. }else
  337. {
  338. //qDebug()<<nIndexMSG<<"="<<m_shmData->nTypeCtrlType[nIndexMSG];
  339. }
  340. }
  341. if(isHaveMSG)
  342. {
  343. nIndexMSG=0;//如果全没有就重新设置到0从0开始
  344. }
  345. }
  346. break;
  347. case MSGCtrl_Write://存在已写入的数据
  348. {
  349. QString strShow=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
  350. qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
  351. qDebug()<<"MSG_Update strMSG="<<strShow;
  352. ShowMSGWidget(strShow);
  353. }
  354. break;
  355. default:
  356. break;
  357. }
  358. qDebug()<<"MSG_Switch_end nIndexMSG ="<<nIndexMSG;
  359. }
  360. }
  361. int DataUpdateThread::NextIndex()
  362. {
  363. if(0<=nIndexMSG&&nIndexMSG<9)
  364. {
  365. return nIndexMSG+1;
  366. }else
  367. {
  368. return 0;
  369. }
  370. }
  371. void DataUpdateThread::ShowMSGWidget(QString strShowData)
  372. {
  373. if(strShowData.isEmpty())return;
  374. if(pwidget&&pwidget->isHiddenMSGWidget())
  375. {
  376. if(strShowData!=strNowMSG)
  377. {
  378. strNowMSG=strShowData;
  379. pwidget->ShowMSGWidget(strShowData);
  380. }
  381. }
  382. }
  383. void DataUpdateThread::slot_ClickMSG()
  384. {
  385. strNowMSG="";
  386. if(nReadType!=1&&!m_shmData)
  387. {
  388. return;
  389. }
  390. if(0<=nIndexMSG&&nIndexMSG<10)
  391. {
  392. m_shmData->nTypeCtrlType[nIndexMSG]=MSGCtrl_Click;
  393. }
  394. nIndexMSG=NextIndex();
  395. //ReadMSG();
  396. }