#include "dataupdatethread.h" #include #include #include #include #include /* For O_* constants */ #ifdef pduRun #include #include #include /* For shm_open, mmap, ftruncate, etc */ #include /* For mode constants */ #include // kill() #include // pid_t #include // errno, ESRCH #endif #include #include #include DataUpdateThread::DataUpdateThread(QObject *parent) :QThread(parent) { isRunStats=true; nMaxCh=0; nReadType=0; m_shmData=0; bTacStatus=0; shm_PowerBord=-1; pPowerBoard=nullptr; nTimeindex=4; } DataUpdateThread::~DataUpdateThread() { isRunStats=false; pdu_Ctrl::instance()->getDB().close(); } void DataUpdateThread::InitSql() { pdu_Ctrl::instance()->getDB()=QSqlDatabase::addDatabase("QSQLITE"); pdu_Ctrl::instance()->getDB().setDatabaseName(strSqliteAddress); qDebug()<getDB().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(); 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:"<UpdateDate(); pwidget->update(); } }else { int nMode=pwidget->getShowModeIndex(); int nPage=pwidget->getShowPagIndex(); ReadShmMaxch(); 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->update(); //qDebug() <<"V:"<UpdateDate(); pwidget->update(); } } } if(!CheckPowerBoard())//判断对方进程是否存在 { if(nTimeindex>4)//不存在则重新创建,每5s创建一次 { initShmPowerBoard(); nTimeindex=0; } nTimeindex++; }else { if(pMainWidget&&m_shmData) { strT = QString::number(m_shmData->fT,'f',2); strH = QString::number(m_shmData->fH,'f',2); pMainWidget->UpdateTemp(strT,strH); } } sleep(1); } } void DataUpdateThread::ReadSqlData(int nCHID) { if(!isDBOpen) { return; } QSqlQuery sql_query(pdu_Ctrl::instance()->getDB()); 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()<getDB()); QString strSql=QString("SELECT MAX(product_ch_id) as maxCh FROM Table_PowerManage "); //qDebug()<nMAXChildIndex=nMaxCh; } } }else { qDebug()<nIPD, 0) == -1 && errno == ESRCH) { // 进程不存在,触发清理 deleteShmPowerBoard(); return false; }else { return true; } }else { return false; } } int DataUpdateThread::initShm() { /* 创建共享内存对象 */ #ifdef pduRun shm_fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666); #else shm_fd = -1; #endif if (shm_fd == -1) { perror("shm_open"); return 1; } /* 设置共享内存对象的大小 */ qDebug()<<"======================================="; qDebug()<<"SHM_SizeOf="<nSelectSensor=10; nReadType=1; return 0; } void DataUpdateThread::deleteShm() { #ifdef pduRun 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; } #endif 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:"<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:"<nSelectPowerCH<<"nSelectPh:"<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); } } void DataUpdateThread::ReadShmMaxch() { if(nReadType!=1&&!m_shmData) { if(pwidget) { pwidget->nMAXChildIndex=0; } return; } if(pwidget&&m_shmData->bPDUSet>0) { if(pwidget->nMAXChildIndex!=m_shmData->nMaxCh) { pwidget->nMAXChildIndex=m_shmData->nMaxCh; } } } int DataUpdateThread::isT_ACType() { return bTacStatus; } void DataUpdateThread::initShmPowerBoard() { shm_PowerBord = shm_open("/smartPDU_shm_5_inch_screen", O_RDWR, 0666); if (shm_PowerBord < 0) { printf("error open shm \n"); //sleep(5); // 延时5秒后再次创建 return; } qDebug()<<"shm_PowerBordSuCCESS"<0) { pPowerBoard = (smartPDU_shm_5_inch_data *)mmap(0, shm_stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_PowerBord, 0); qDebug()<<"shm_PowerBord_ReadOK"; pdu_Ctrl::instance()->setPowerBoard(pPowerBoard->array_size,pPowerBoard->m_pData); qDebug()<<"shm_PowerBord_pduSetOK_ipd="<nIPD <<"Size="<array_size <<" ALL memry="<clearPowerBoard(); if (pPowerBoard) { munmap(pPowerBoard,sizeof(GlobalPowerCtrlBoard)*pPowerBoard->array_size+sizeof(pid_t)+sizeof(size_t)/*+sizeof(int)*2*/); close(shm_PowerBord); shm_unlink("/smartPDU_shm_5_inch_screen"); } pPowerBoard=nullptr; }