| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437 |
- #include "dataupdatethread.h"
- #include <QSqlQuery>
- #include <QSqlError>
- #include <stdio.h>
- #include <stdlib.h>
- #include <fcntl.h> /* For O_* constants */
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <sys/mman.h> /* For shm_open, mmap, ftruncate, etc */
- #include <sys/stat.h> /* For mode constants */
- #include <errno.h>
- #include <unistd.h>
- #include <QtSql>
- DataUpdateThread::DataUpdateThread(QObject *parent)
- :QThread(parent)
- {
- isRunStats=true;
- nMaxCh=0;
- nReadType=0;
- m_shmData=0;
- bTacStatus=0;
- nIndexMSG=0;
- }
- DataUpdateThread::~DataUpdateThread()
- {
- isRunStats=false;
- m_db.close();
- }
- void DataUpdateThread::InitSql()
- {
- m_db=QSqlDatabase::addDatabase("QSQLITE");
- m_db.setDatabaseName(strSqliteAddress);
- qDebug()<<strSqliteAddress;
- if (m_db.open())
- {
- qDebug()<<"SQL Open Success";
- isDBOpen=true;
- }else
- {
- qDebug()<<"SQL Open Error";
- isDBOpen=false;
- }
- if(isDBOpen)
- {
- ReadMaxCh();
- }
- nReadType=0;
- }
- void DataUpdateThread::run()
- {
- qDebug() <<"Start SQLThread";
- while (isRunStats)
- {
- if(pwidget)
- {
- if(nReadType==0)
- {
- int nMode=pwidget->getShowModeIndex();
- int nPage=pwidget->getShowPagIndex();
- // qDebug() <<"ReadType=0 nMode:"<<nMode<<";nPage"<<nPage;
- if(nMode==0&&nPage!=0)
- {
- int nSubPag=pwidget->getShowSubIndex();
- ReadSqlData(nSubPag);
- pwidget->SetV(strV);
- pwidget->SetA(strA);
- pwidget->SetW(strW);
- pwidget->SetF(strF);
- pwidget->SetSUM(strS);
- pwidget->setCH(nSubPag);
- pwidget->update();
- //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
- }
- else if(nMode==0&&nPage==0)
- {
- pwidget->UpdateDate();
- pwidget->update();
- }
- ReadMSG();
- }else
- {
- int nMode=pwidget->getShowModeIndex();
- int nPage=pwidget->getShowPagIndex();
- //qDebug() <<"ReadType=1 nMode:"<<nMode<<";nPage"<<nPage;
- ReadShmMaxch();
- ReadMSG();
- if(nMode==0&&nPage!=0)
- {
- int nSubPag=pwidget->getShowSubIndex();
- int nPHIndex=pwidget->getShowPHIndex();
- setShmChRead(nSubPag,nPHIndex);
- ReadShmData();
- pwidget->SetV(strV);
- pwidget->SetA(strA);
- pwidget->SetW(strW);
- pwidget->SetF(strF);
- pwidget->SetSUM(strS);
- pwidget->SetStatus(strStatus);
- pwidget->setCH(nSubPag);
- pwidget->SetT(strT);
- pwidget->SetH(strH);
- pwidget->SetCO2(strCO2);
- pwidget->update();
- //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
- }
- else if(nMode==0&&nPage==0)
- {
- ReadShmVer();
- pwidget->UpdateDate();
- pwidget->SetVer(strVer);
- pwidget->update();
- }
- }
- }
- sleep(1);
- }
- }
- void DataUpdateThread::SetShowWidget(Widget *pShowWidget)
- {
- pwidget=pShowWidget;
- connect(pwidget,SIGNAL(signal_ClickMSG()),this,SLOT(slot_ClickMSG()));
- connect(this,SIGNAL(signal_ShowMSGWidget(QString)),pwidget,SLOT(ShowMSGWidget(QString)),Qt::QueuedConnection);
- }
- void DataUpdateThread::ReadSqlData(int nCHID)
- {
- if(!isDBOpen)
- {
- return;
- }
- QSqlQuery sql_query(m_db);
- 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);
- //qDebug()<<strSql;
- if (sql_query.exec(strSql))
- {
- while (sql_query.next())
- {
- strV = sql_query.value("product_ch_voltage").toString();
- strA = sql_query.value("product_ch_current").toString();
- strW = sql_query.value("product_ch_power").toString();
- strF = sql_query.value("product_ch_power_freq").toString();
- strS = sql_query.value("product_ch_consumption").toString();
- //qDebug() <<"V:"<<strV<<";A"<<strA<<";W:"<<strW;
- }
- }else
- {
- qDebug()<<sql_query.lastError().text();
- }
- }
- void DataUpdateThread::ReadMaxCh()
- {
- if(!isDBOpen)
- {
- return;
- }
- QSqlQuery sql_query(m_db);
- QString strSql=QString("SELECT MAX(product_ch_id) as maxCh FROM Table_PowerManage ");
- //qDebug()<<strSql;
- if (sql_query.exec(strSql))
- {
- while (sql_query.next())
- {
- nMaxCh = sql_query.value("maxCh").toInt();
- if(pwidget)
- {
- pwidget->setMAXChildIndex(nMaxCh);
- }
- }
- }else
- {
- qDebug()<<sql_query.lastError().text();
- }
- }
- int DataUpdateThread::initShm()
- {
- /* 创建共享内存对象 */
- shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666);
- if (shm_fd == -1) {
- perror("shm_open");
- return 1;
- }
- /* 设置共享内存对象的大小 */
- qDebug()<<"=======================================";
- qDebug()<<"SHM_SizeOf="<<sizeof(smartPDU_shm_data);
- qDebug()<<"=======================================";
- if (ftruncate(shm_fd, sizeof(smartPDU_shm_data)) == -1) {
- perror("ftruncate");
- return 2;
- }
- m_shmData = (smartPDU_shm_data*)mmap(NULL, sizeof(smartPDU_shm_data), PROT_READ|PROT_WRITE, MAP_SHARED, shm_fd, 0);
- memset(m_shmData,0,sizeof(smartPDU_shm_data));
- m_shmData->nSelectSensor=10;
- nReadType=1;
- return 0;
- }
- void DataUpdateThread::deleteShm()
- {
- m_shmData->bPDUSet=-1;
- if (munmap(m_shmData, sizeof(smartPDU_shm_data)) == -1) {
- perror("munmap");
- return;
- }
- if (shm_unlink(SHM_NAME) == -1) {
- perror("shm_unlink");
- return;
- }
- m_shmData=nullptr;
- }
- void DataUpdateThread::setShmChRead(int nCh,int nPhID)
- {
- if(nReadType!=1&&!m_shmData)
- {
- return;
- }
- if(m_shmData->bPDUSet>0)
- {
- if(m_shmData->nSelectPowerCH!=nCh||m_shmData->nSelectPh!=nPhID||bTacStatus!=m_shmData->bT_ACType)
- {
- m_shmData->nSelectPowerCH=nCh;
- qDebug()<<"ShmData_____bT_ACType:"<<bTacStatus<<"nSelectPowerCH:"<<m_shmData->nSelectPowerCH;
- bTacStatus=m_shmData->bT_ACType;
- pdu_Ctrl::instance()->isT_ACType=bTacStatus;
- if(bTacStatus==1)
- {
- if(m_shmData->nSelectPh!=nPhID)
- {
- m_shmData->nSelectPh=nPhID;
- qDebug()<<"ShmData_____nSelectPowerCH:"<<m_shmData->nSelectPowerCH<<"nSelectPh:"<<m_shmData->nSelectPh;
- }
- }else
- {
- m_shmData->nSelectPh=0;
- }
- m_shmData->bPDUSet=0;
- }
- }
- }
- void DataUpdateThread::ReadShmData()
- {
- if(nReadType!=1&&!m_shmData)
- {
- return;
- }
- if(m_shmData->bPDUSet>0)
- {
- if(m_shmData->fV>=0.1)
- {
- strV = QString::number(m_shmData->fV,'f',2);
- }else
- {
- strV = "0.00";
- }
- if(m_shmData->fA>=0.01)
- {
- strA = QString::number(m_shmData->fA,'f',2);
- }else
- {
- strA="0.00";
- }
- strW = QString::number(m_shmData->fW,'f',2);
- strF = QString::number(m_shmData->fF,'f',2);
- strS = QString::number(m_shmData->fS,'f',2);
- if(m_shmData->nStatus==0)
- {
- strStatus="OFF";
- }else
- {
- strStatus="ON";
- }
- strT = QString::number(m_shmData->fT,'f',2);
- strH = QString::number(m_shmData->fH,'f',2);
- QString strShow=QString::number(m_shmData->fCO2,'f',2);
- //qDebug()<< "Update CO2:"+strShow;
- strCO2 = strShow;//QString::number(m_shmData->fCO2,'f',2);
- }
- }
- void DataUpdateThread::ReadShmMaxch()
- {
- if(nReadType!=1&&!m_shmData)
- {
- if(pwidget)
- {
- pwidget->setMAXChildIndex(0);
- }
- return;
- }
- if(pwidget&&m_shmData->bPDUSet>0)
- {
- if(pwidget->nMAXChildIndex!=m_shmData->nMaxCh)
- {
- pwidget->setMAXChildIndex(m_shmData->nMaxCh);
- }
- }
- }
- void DataUpdateThread::ReadShmVer()
- {
- if(nReadType!=1&&!m_shmData)
- {
- return;
- }
- if(m_shmData->bPDUSet>0)
- {
- strVer=QString::fromLocal8Bit(m_shmData->strVer);
- }
- }
- int DataUpdateThread::isT_ACType()
- {
- return bTacStatus;
- }
- void DataUpdateThread::ReadMSG()
- {
- if(nReadType!=1&&!m_shmData)
- {
- return;
- }
- if(0<=nIndexMSG&&nIndexMSG<10)
- {
- switch(m_shmData->nTypeCtrlType[nIndexMSG])
- {
- case MSGCtrl_Null:
- case MSGCtrl_Click:
- {
- bool isHaveMSG=false;
- //未检测到更新从当前位置循环遍历一遍
- //qDebug()<<"MSG_Find"<<nIndexMSG<<"=Null";
- for(int nIndex=0;nIndex<10;nIndex++)//监测其他的点是否有被更新依次刷新过去
- {
- nIndexMSG=NextIndex();
- if(m_shmData->nTypeCtrlType[nIndexMSG]==MSGCtrl_Write)//检测到新的点。
- {
- //qDebug()<<nIndexMSG<<"=MSGCtrl_Write";
- isHaveMSG=true;
- QString strShow=QString::fromUtf8(m_shmData->strMSG[nIndexMSG]);
- QString strShow8bit=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
- //qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
- //qDebug()<<"MSG_Update fromUtf8="<<strShow;
- //qDebug()<<"MSG_Update fromLocal8bit="<<strShow8bit;
- ShowMSGWidget(strShow);
- break;
- }else
- {
- qDebug()<<nIndexMSG<<"="<<m_shmData->nTypeCtrlType[nIndexMSG];
- }
- }
- if(isHaveMSG)
- {
- nIndexMSG=0;//如果全没有就重新设置到0从0开始
- }
- }
- break;
- case MSGCtrl_Write://存在已写入的数据
- {
- /*QString strShow=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
- qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
- qDebug()<<"MSG_Update strMSG="<<strShow;
- ShowMSGWidget(strShow);*/
- QString strShow=QString::fromUtf8(m_shmData->strMSG[nIndexMSG]);
- QString strShow8bit=QString::fromLocal8Bit(m_shmData->strMSG[nIndexMSG]);
- //qDebug()<<"MSG_Update char*MSG="<<m_shmData->strMSG[nIndexMSG];
- //qDebug()<<"MSG_Update fromUtf8="<<strShow;
- //qDebug()<<"MSG_Update fromLocal8bit="<<strShow8bit;
- ShowMSGWidget(strShow);
- }
- break;
- default:
- break;
- }
- //qDebug()<<"MSG_Switch_end nIndexMSG ="<<nIndexMSG;
- }
- }
- int DataUpdateThread::NextIndex()
- {
- if(0<=nIndexMSG&&nIndexMSG<9)
- {
- return nIndexMSG+1;
- }else
- {
- return 0;
- }
- }
- void DataUpdateThread::ShowMSGWidget(QString strShowData)
- {
- if(strShowData.isEmpty())return;
- if(pwidget&&pwidget->isHiddenMSGWidget())
- {
- if(strShowData!=strNowMSG)
- {
- strNowMSG=strShowData;
- emit signal_ShowMSGWidget(strShowData);
- //pwidget->ShowMSGWidget(strShowData);
- //qDebug()<<"emit ShowMSGWidget_Data:"<<strNowMSG;
- }
- }
- }
- void DataUpdateThread::slot_ClickMSG()
- {
- strNowMSG="";
- if(nReadType!=1&&!m_shmData)
- {
- return;
- }
- if(0<=nIndexMSG&&nIndexMSG<10)
- {
- m_shmData->nTypeCtrlType[nIndexMSG]=MSGCtrl_Click;
- }
- nIndexMSG=NextIndex();
- //ReadMSG();
- }
|