278 lines
8.0 KiB
C++
Raw Normal View History

2025-03-12 11:08:50 +08:00
/**
@file AnaWorkThread.cpp
@brief 线
@author
*/
#include "boost/program_options.hpp"
#include "AnaWorkThread.h"
#include "pub_logger_api/logger.h"
#include "pub_utility_api/TimeUtil.h"
2025-03-12 14:17:01 +08:00
using namespace iot_net;
using namespace iot_public;
using namespace iot_service;
using namespace iot_idl;
using namespace iot_dbms;
2025-03-12 11:08:50 +08:00
using namespace std;
2025-03-12 14:17:01 +08:00
CAnaWorkThread::CAnaWorkThread(iot_public::SRunAppInfo stRunAppInfo,CPacketQueuePtr ptrPacketQueue):
2025-03-12 11:08:50 +08:00
CTimerThreadBase("CAnaWorkThread",15)
{
m_nMsgSeqNum = 0;
m_lLastSendReqAllDataTime = 0;
m_lLastProAlmTime = 0;
m_lLastTime = 0;
m_lLastAllDataTime = 0;
m_ptrAnaProcess = nullptr;
m_ptrDataProcApi = nullptr;
m_ptrDataPublish = nullptr;
m_stRunAppInfo = stRunAppInfo ;
m_lLastAllDataTime = 0 ;
m_ptrPacketQueue = ptrPacketQueue ;
m_lCurTime = getMonotonicMsec();
}
CAnaWorkThread::~CAnaWorkThread()
{
}
bool CAnaWorkThread::initialize()
{
//数据处理接口库实例
//=============================================================================================
m_ptrDataProcApi = getDataProcInstance(m_stRunAppInfo.strAppName);
if (m_ptrDataProcApi == NULL)
{
LOGERROR("CAnaWorkThread::init(), getDataProcInstance error");
return false;
}
if(m_ptrDataProcApi->initialize() <0)
{
LOGERROR("CAnaWorkThread::init(), data_process_api initialize() error");
return false;
}
//数据发布实例
//=============================================================================================
m_ptrDataPublish = boost::make_shared<CSrvDataPublish>(m_stRunAppInfo);
if (m_ptrDataPublish == NULL)
{
LOGERROR("CAnaWorkThread ::init(), make_shared<CSrvDataPublish> fail!\n");
return false;
}
if(m_ptrDataPublish->initialize() == false)
{
LOGERROR("CAnaWorkThread::init(), CSrvDataPublish initialize() error");
return false;
}
//ai处理 实例
//=============================================================================================
m_ptrAnaProcess = boost::make_shared<CAnaProcess>(m_stRunAppInfo,m_ptrDataProcApi,\
m_ptrDataPublish);
if (m_ptrAnaProcess == NULL)
{
LOGERROR("CAnaWorkThread::init(), make_shared<CAnaProcess> fail!\n");
return false;
}
if(m_ptrAnaProcess->initialize() == false)
{
LOGERROR("CAnaWorkThread::init(), CAnaProcess initialize() error");
return false;
}
return true;
}
/**
@brief
@param
@return
@retval
*/
void CAnaWorkThread::execute()
{
m_lCurTime = getMonotonicMsec();
//1.消息处理
//===================================================================
processFesMessage();
requestAllDataFromFes() ;
processOptMessage();
//3.ANA 报警延迟处理
//===================================================================
processDelayTimeAlarm();
//发送变位产生的data/测点事件+SOE事件+越限事件
//=============================================================================================================
if(m_ptrDataPublish)
{
m_ptrDataPublish->sendChange();
m_ptrDataPublish->sendAlarm();
}
return;
}
/**
@brief
@param mapDelayLimitType
@return
@retval
*/
int CAnaWorkThread::processDelayTimeAlarm()
{
if((m_lCurTime - m_lLastProAlmTime) >= 200)
{
m_lLastProAlmTime = m_lCurTime;
int nRetCode = m_ptrAnaProcess->delayTimeProcess(m_stRunAppInfo.nDomainId);
if (nRetCode == -1)
{
LOGERROR("CAnaWorkThread::execute, process analog delayTimeProcessAlgo error ");
}
LOGDEBUG("CAnaWorkThread::execute, end process of delayTimeProcess");
}
return 1;
}
int CAnaWorkThread::processOptMessage()
{
//处理标签操作
//=============================================================================================================
2025-03-12 14:17:01 +08:00
std::deque<iot_idl::SOptSetDataPkg> deqOptManSetPkg;
2025-03-12 11:08:50 +08:00
if(m_ptrPacketQueue->getOptManSetPkg(POINT_TYPE_ANA,deqOptManSetPkg))
{
2025-03-12 14:17:01 +08:00
std::deque<iot_idl::SOptSetDataPkg>::iterator it = deqOptManSetPkg.begin();
2025-03-12 11:08:50 +08:00
for( ;it!=deqOptManSetPkg.end();++it)
{
2025-03-12 14:17:01 +08:00
iot_idl::SOptSetDataPkg &objOptManSetPkg = *it ;
2025-03-12 11:08:50 +08:00
m_ptrAnaProcess->processOperate(objOptManSetPkg,OPERATE_TYPE );
LOGINFO("processOptMessage:处理标签操作 num=%d .",objOptManSetPkg.seq_set_data_info_size());
}
}
//处理计算点
//=============================================================================================================
2025-03-12 14:17:01 +08:00
std::deque<iot_idl::SOptSetDataPkg> deqOptCalSetPkg;
2025-03-12 11:08:50 +08:00
if(m_ptrPacketQueue->getOptCalSetPkg(POINT_TYPE_ANA,deqOptCalSetPkg))
{
2025-03-12 14:17:01 +08:00
std::deque<iot_idl::SOptSetDataPkg>::iterator it = deqOptCalSetPkg.begin();
2025-03-12 11:08:50 +08:00
for( ;it!=deqOptCalSetPkg.end();++it)
{
2025-03-12 14:17:01 +08:00
iot_idl::SOptSetDataPkg &objOptCalSetPkg = *it ;
2025-03-12 11:08:50 +08:00
m_ptrAnaProcess->processOperate(objOptCalSetPkg,OPT_TYPE_CAL_SET);
//LOGINFO("processOptMessage:处理计算点 num=%d .",objOptCalSetPkg.seq_set_data_info_size());
}
}
return true ;
}
/**
@brief ///SOE/
@param
@return
@retval
*/
int CAnaWorkThread::processFesMessage()
{
int64 t1,t2;
//处理变化模拟量
//=============================================================================================================
2025-03-12 14:17:01 +08:00
std::deque<iot_idl::SFesChangeAiPkg> deqFesChgAiPkg;
2025-03-12 11:08:50 +08:00
if(m_ptrPacketQueue->getFesChangeAnaPkg(deqFesChgAiPkg)) //获得变化数据包队列
{
2025-03-12 14:17:01 +08:00
std::deque<iot_idl::SFesChangeAiPkg>::iterator it = deqFesChgAiPkg.begin();
2025-03-12 11:08:50 +08:00
for( ;it!=deqFesChgAiPkg.end();++it)
{
t1 = getMonotonicMsec() ;
2025-03-12 14:17:01 +08:00
iot_idl::SFesChangeAiPkg &objFesChangeAiPkg = *it ;
2025-03-12 11:08:50 +08:00
m_ptrAnaProcess->procAnaChange(objFesChangeAiPkg);
t2 = getMonotonicMsec() ;
LOGDEBUG("processFesMessage:处理变化模拟量 num=%d用时=%lld(ms)",objFesChangeAiPkg.staidata_size(),(long long)(t2-t1));
}
}
//处理全数据
//=============================================================================================================
2025-03-12 14:17:01 +08:00
iot_idl::SFesUpdateAiPkg objFesUpdAiPkg;
2025-03-12 11:08:50 +08:00
if(m_ptrPacketQueue->getFesUpdateAnaPkg(objFesUpdAiPkg)) //获得全数据
{
t1 = getMonotonicMsec() ;
m_ptrAnaProcess->procAnaUpdate(objFesUpdAiPkg);
t2 = getMonotonicMsec() ;
LOGDEBUG("processFesMessage:处理模拟量全数据 num=%d用时=%lld(ms)",objFesUpdAiPkg.staidata_size(),(long long)(t2-t1));
}
return true;
}
/**
@brief 线
@param
@return
@retval
*/
void CAnaWorkThread::afterSuspend()
{
m_ptrDataPublish->suspend();
LOGINFO("CAnaWorkThread::Thread afterSuspend");
}
/**
@brief 线
@param
@return
@retval
*/
void CAnaWorkThread::afterResume()
{
m_ptrDataPublish->resume();
LOGINFO("CAnaWorkThread::Thread afterResume");
}
void CAnaWorkThread::release()
{
if(m_ptrAnaProcess!= NULL)
{
m_ptrAnaProcess.reset();
m_ptrAnaProcess = NULL;
LOGINFO("CAnaWorkThread::release(), 释放模拟量处理类成功!");
}
if(m_ptrDataPublish!= NULL)
{
m_ptrDataPublish->release();
m_ptrDataPublish.reset();
m_ptrDataPublish =NULL;
LOGINFO("CAnaWorkThread::release(), 释放数据发布处理类成功!");
}
if(m_ptrDataProcApi!= NULL)
{
m_ptrDataProcApi.reset();
m_ptrDataProcApi = NULL;
LOGINFO("CAnaWorkThread::release(), 释放数据处理动态库成功!");
}
return ;
}
2025-03-12 14:17:01 +08:00
int iot_service::CAnaWorkThread::requestAllDataFromFes()
2025-03-12 11:08:50 +08:00
{
/*
int64 lCurTimeMs = getMonotonicMsec();
if (lCurTimeMs - m_lLastSendReqAllDataTime > CN_MinReqFesAllDataIntervalMs)
{
//TODO:发送请求
//m_ptrDataPublish->SendFesDataRequest();
}*/
return kbdSuccess;
}