Train_Identify_arm/nvidia_ascend_engine/common_engine/MergerEngine/MergerAllEngine.cpp

331 lines
12 KiB
C++
Raw Normal View History

2024-06-19 06:35:05 +00:00
#include "MergerAllEngine.h"
using namespace ai_matrix;
MergerAllEngine::MergerAllEngine() {}
MergerAllEngine::~MergerAllEngine() {}
APP_ERROR MergerAllEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0"; //接受车号属性
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1"; //接受定检期
strPort2_ = engineName_ + "_" + std::to_string(engineId_) + "_2"; //接受集装箱
strPort3_ = engineName_ + "_" + std::to_string(engineId_) + "_3"; //接受车厢范围
iPushDirection_ = MyYaml::GetIns()->GetIntValue("gc_push_direction");
mapPopPort_[strPort0_] = false;
mapPopPort_[strPort1_] = false;
mapPopPort_[strPort2_] = false;
mapPopPort_[strPort3_] = true;
//获取在用摄像头识别的目标(目标分为3大类车号定检期集装箱 哪个识别监听哪个端口的数据)
std::map<int, ai_matrix::DataSourceConfig> mapUseDataSouceCfg = MyYaml::GetIns()->GetUseDataSourceConfig();
std::string delimiter(",");
for (auto iter = mapUseDataSouceCfg.begin(); iter!=mapUseDataSouceCfg.end(); iter++)
{
std::vector<std::string> vecSplit = MyUtils::getins()->split(iter->second.strTarget, delimiter);
for (auto iter = vecSplit.begin(); iter != vecSplit.end(); iter++)
{
if (*iter == "NUM" && !mapPopPort_[strPort0_])
{
mapPopPort_[strPort0_] = true;
}
else if (*iter == "CHKDATE" && !mapPopPort_[strPort1_])
{
mapPopPort_[strPort1_] = true;
}
else if ((*iter == "CONTAINER" || *iter == "CONTAINER_T") && !mapPopPort_[strPort2_])
{
mapPopPort_[strPort2_] = true;
}
}
}
for (auto iter = mapPopPort_.begin(); iter != mapPopPort_.end(); iter++)
{
if (iter->second)
{
iPopPortCnt_++;
}
}
LogDebug << "iPopPortCnt_:" << iPopPortCnt_;
InitParam();
bUploadFlag_ = (MyYaml::GetIns()->GetIntValue("gc_http_open") == 1 || MyYaml::GetIns()->GetIntValue("gc_mysql_open") == 1);
LogInfo << "MergerAllEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR MergerAllEngine::DeInit()
{
LogInfo << "MergerAllEngine DeInit ok";
return APP_ERR_OK;
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
void MergerAllEngine::InitParam()
{
iTrainIndex_ = 1;
bHeadFrontFlag_ = false;
}
/**
* push结果
* inParam : std::shared_ptr<Train> pTrain
* outParam: N/A
* return : N/A
*/
void MergerAllEngine::PushData(std::shared_ptr<Train> pTrain)
{
LogInfo << "\n ---所有信息合并结果--- \n"
<< "日期: " << pTrain->strTrainDate << "\n"
<< "车次: " << pTrain->strTrainName << "\n"
<< "车厢序号: " << pTrain->iCarXH << "\n"
<< "车型Id: " << pTrain->trainNum.iTrainTypeId << "\n"
<< "车型: " << pTrain->trainNum.strTrainType << "\n"
<< "车号: " << pTrain->trainNum.strTrainNum << "\n"
<< "载重: " << pTrain->trainPro.strLoad << "\n"
<< "自重: " << pTrain->trainPro.strSelf << "\n"
<< "容积: " << pTrain->trainPro.strVolume << "\n"
<< "换长: " << pTrain->trainPro.strChange << "\n"
<< "容量计表: " << pTrain->trainPro.strVolumeSurface << "\n"
<< "编号图片: " << pTrain->trainNum.strBestImg << "\n"
<< "属性图片: " << pTrain->trainPro.strBestImg << "\n"
<< "开始帧号: " << pTrain->iStartFrameId << "\n"
<< "结束帧号: " << pTrain->iEndFrameId << "\n"
<< "时间戳: " << pTrain->i64TimeStamp << "\n"
<< "定检期_段修: " << pTrain->chkDate.strChkDate1 << "\n"
<< "定检期_厂修: " << pTrain->chkDate.strChkDate2 << "\n"
<< "定检期图片: " << pTrain->chkDate.strBestImg << "\n"
<< "定检期时间戳: " << pTrain->chkDate.i64TimeStamp << "\n"
<< "集装箱1: " << pTrain->container1.strContainerNo << "\n"
<< "集装箱1图片: " << pTrain->container1.strBestImg << "\n"
<< "集装箱1时间戳: " << pTrain->container1.i64TimeStamp << "\n"
<< "集装箱2: " << pTrain->container2.strContainerNo << "\n"
<< "集装箱2图片: " << pTrain->container2.strBestImg << "\n"
<< "集装箱2时间戳: " << pTrain->container2.i64TimeStamp << "\n"
<< " ---所有信息合并结果 END--- ";
if (pTrain->bIsEnd)
{
LogInfo << " ===============所有信息合并结束=============== ";
}
//3:敞车,6:平车 有集装箱; 其他车型无集装箱,有误识别时剔除
if (pTrain->trainNum.iTrainTypeId != 3 && pTrain->trainNum.iTrainTypeId != 6)
{
pTrain->container1.strContainerNo = "";
pTrain->container1.strBestImg = "";
pTrain->container2.strContainerNo = "";
pTrain->container2.strBestImg = "";
}
pTrain->bMergerFlag = true;
std::shared_ptr<Train> pTrainToCsv = std::make_shared<Train>();
*pTrainToCsv = *pTrain;
if (bUploadFlag_)
{
queTrain_.push(pTrain);
if (pTrain->iDirection == iPushDirection_ || iPushDirection_ == DIRECTION_UNKNOWN)
{
while (!queTrain_.empty())
{
std::shared_ptr<Train> pTrainToHttp = queTrain_.front();
queTrain_.pop();
outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pTrainToHttp));
}
}
if (pTrain->bIsEnd)
{
while (!queTrain_.empty())
{
std::shared_ptr<Train> pTrainTemp = queTrain_.front();
queTrain_.pop();
LogDebug << "carNO:" << pTrainTemp->iCarXH << " direction:" << pTrainTemp->iDirection << " not push to httpSrv";
}
}
}
//push端口1csv保存合并结果
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pTrainToCsv));
}
/**
*
* inParam : N/A
* outParam: N/A
* return : N/A
*/
int MergerAllEngine::QueueHaveDataCount()
{
int iHaveDataCnt = 0;
iHaveDataCnt = queuePort0_.empty() ? iHaveDataCnt : iHaveDataCnt + 1;
iHaveDataCnt = queuePort1_.empty() ? iHaveDataCnt : iHaveDataCnt + 1;
iHaveDataCnt = queuePort2_.empty() ? iHaveDataCnt : iHaveDataCnt + 1;
iHaveDataCnt = queuePort3_.empty() ? iHaveDataCnt : iHaveDataCnt + 1;
LogDebug << "queuePort0_size:" << queuePort0_.size() << " queuePort1_size:" << queuePort1_.size()
<< " queuePort2_size:" << queuePort2_.size() << " queuePort3_size:" << queuePort3_.size();
return iHaveDataCnt;
}
/*
(IsEnd-) push到该Engine中web端
1.
2.
*/
APP_ERROR MergerAllEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
bool bPopFlag = false;
// pop端口0车号
if (mapPopPort_[strPort0_])
{
std::shared_ptr<void> pVoidData0 = nullptr;
inputQueMap_[strPort0_]->pop(pVoidData0);
if (nullptr != pVoidData0)
{
LogInfo<<"pop0 data";
queuePort0_.push(pVoidData0);
bPopFlag = true;
}
}
// pop端口1定检期
if (mapPopPort_[strPort1_])
{
std::shared_ptr<void> pVoidData1 = nullptr;
inputQueMap_[strPort1_]->pop(pVoidData1);
if (nullptr != pVoidData1)
{
LogDebug<<"pop1 data";
queuePort1_.push(pVoidData1);
bPopFlag = true;
}
}
// pop端口2集装箱
if (mapPopPort_[strPort2_])
{
std::shared_ptr<void> pVoidData2 = nullptr;
inputQueMap_[strPort2_]->pop(pVoidData2);
if(nullptr != pVoidData2)
{
LogDebug<<"pop2 data";
queuePort2_.push(pVoidData2);
bPopFlag = true;
}
}
//pop端口3车厢范围
if (mapPopPort_[strPort3_])
{
std::shared_ptr<void> pVoidData3 = nullptr;
inputQueMap_[strPort3_]->pop(pVoidData3);
if (nullptr != pVoidData3)
{
LogDebug << "pop3 data";
queuePort3_.push(pVoidData3);
bPopFlag = true;
}
}
if (!bPopFlag)
{
usleep(1000); // 1ms
continue;
}
int iHaveDataCnt = QueueHaveDataCount();
//识别目标信息个数和获取信息个数相等则合并信息推送web
if (iHaveDataCnt == iPopPortCnt_)
{
std::shared_ptr<Train> pTrain = nullptr;
std::shared_ptr<ChkDate> pChkDate = nullptr;
std::shared_ptr<TrainContainer> pTrainContainer = nullptr;
std::shared_ptr<TrainRange> pTrainRange = nullptr;
if (!queuePort0_.empty())
{
pTrain = std::static_pointer_cast<Train>(queuePort0_.front());
queuePort0_.pop();
}
if (!queuePort1_.empty())
{
pChkDate = std::static_pointer_cast<ChkDate>(queuePort1_.front());
queuePort1_.pop();
}
if (!queuePort2_.empty())
{
pTrainContainer = std::static_pointer_cast<TrainContainer>(queuePort2_.front());
queuePort2_.pop();
}
if (!queuePort3_.empty())
{
pTrainRange = std::static_pointer_cast<TrainRange>(queuePort3_.front());
queuePort3_.pop();
}
//信息合并处理
if (nullptr != pTrain)
{
if (nullptr != pTrainRange)
{
pTrain->iStartFrameId = pTrainRange->iStartFrameId;
pTrain->i64StartTimeStamp = pTrainRange->i64StartTimeStamp;
pTrain->iEndFrameId = pTrainRange->iEndFrameId;
pTrain->i64EndTimeStamp = pTrainRange->i64EndTimeStamp;
pTrain->bIsEnd = pTrainRange->bIsEnd;
}
if (nullptr != pChkDate)
{
pTrain->chkDate = *pChkDate;
}
if (nullptr != pTrainContainer)
{
pTrain->container1 = pTrainContainer->container1;
pTrain->container2 = pTrainContainer->container2;
}
//车头在前为第0节; 车头在后为最后一节+1
if(pTrain->trainNum.iTrainTypeId == 0 && iTrainIndex_ == 1)
{
iTrainIndex_ = 0;
bHeadFrontFlag_ = true;
}
pTrain->iCarXH = iTrainIndex_++;
/*
web端无法过滤的问题
*/
if (!bHeadFrontFlag_ && pTrain->bIsEnd && pTrain->trainNum.iTrainTypeId == -1)
{
LogDebug << "cometime:" << pTrain->strTrainDate << " " << pTrain->strTrainName << " iCarXH:" << pTrain->iCarXH
<< " num:" << pTrain->trainNum.strTrainNum;
pTrain->trainNum.iTrainTypeId = 0;
}
PushData(pTrain);
//最后一节处理后,初始化参数
if (pTrain->bIsEnd)
{
InitParam();
}
}
}
}
return APP_ERR_OK;
}