VTrain_BothSides/engine/MergeEngine/MergeEngine.cpp

1 line
7.3 KiB
C++

#include "MergeEngine.h"
using namespace ai_matrix;
namespace
{
//按照x坐标排列
bool CompareX(const SingleData &a, const SingleData &b)
{
return a.fLTX < b.fLTX;
}
}
MergeEngine::MergeEngine() {}
MergeEngine::~MergeEngine() {}
APP_ERROR MergeEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1";
this->baseConfig_ = Config::getins()->getBaseConfig();
this->identifyConfig_ = Config::getins()->getIdentifyConfig();
LogInfo << "MergeEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR MergeEngine::DeInit()
{
LogInfo << "MergeEngine DeInit ok";
return APP_ERR_OK;
}
bool MergeEngine::isSameCarriage(std::shared_ptr<VTrainInfo> pVTrain, const VTrainInfo &train_secondary)
{
bool isSame = false;
for (const VContainer & container : pVTrain->vecContainer)
{
for (const VContainer & container_second : train_secondary.vecContainer)
{
if (container.strContainerNo == container_second.strContainerNo) isSame = true;
}
}
if (pVTrain->strTNum == train_secondary.strTNum) isSame = true;
return isSame;
}
void MergeEngine::supplementTrain(std::shared_ptr<VTrainInfo> pVTrain, const VTrainInfo &train_secondary)
{
if (!this->isSameCarriage(pVTrain, train_secondary)) return;
if (pVTrain->strTType.empty() && !train_secondary.strTType.empty())
{
pVTrain->strTType = train_secondary.strTType;
}
if (pVTrain->strTNum.empty() && !train_secondary.strTNum.empty())
{
pVTrain->strTNum = train_secondary.strTNum;
pVTrain->strTNum_image = train_secondary.strTNum_image;
}
if (pVTrain->strTLoadWeight.empty() && !train_secondary.strTLoadWeight.empty())
{
pVTrain->strTLoadWeight = train_secondary.strTLoadWeight;
}
if (pVTrain->strTTareWeight.empty() && !train_secondary.strTTareWeight.empty())
{
pVTrain->strTTareWeight = train_secondary.strTTareWeight;
}
if (pVTrain->strTChangeLen.empty() && !train_secondary.strTChangeLen.empty())
{
pVTrain->strTChangeLen = train_secondary.strTChangeLen;
pVTrain->strTPro_image = train_secondary.strTPro_image;
}
if (pVTrain->vecContainer.size() == train_secondary.vecContainer.size())
{
for (int i = 0; i < pVTrain->vecContainer.size(); ++i)
{
if (pVTrain->vecContainer[i].strContainerNo.empty() && !train_secondary.vecContainer[i].strContainerNo.empty())
{
pVTrain->vecContainer[i].strContainerNo = train_secondary.vecContainer[i].strContainerNo;
pVTrain->vecContainer[i].strImg = train_secondary.vecContainer[i].strImg;
}
}
}
std::string strContainer, strContainerImage;
for (int i = 0; i < pVTrain->vecContainer.size(); i++)
{
strContainer += pVTrain->vecContainer[i].strContainerNo;
strContainerImage += pVTrain->vecContainer[i].strImg;
if (i < pVTrain->vecContainer.size() - 1)
{
strContainer += ",";
strContainerImage += ",";
}
}
LogInfo << "\n ===汇总结果=== \n"
<< "数据源: " << pVTrain->iDataSource << "\n"
<< "日期时间: " << pVTrain->strTrainDate << " " << pVTrain->strTrainTime << "\n"
<< "股道: " << pVTrain->strTrackName << "\n"
<< "行驶方向: " << pVTrain->iTDirection << "\n"
<< "车厢序号: " << pVTrain->iCarOrder << "\n"
<< "车型Id: " << pVTrain->iCategory << "\n"
<< "车型: " << pVTrain->strTType << "\n"
<< "车号: " << pVTrain->strTNum << "\n"
<< "载重: " << pVTrain->strTLoadWeight << "\n"
<< "自重: " << pVTrain->strTTareWeight << "\n"
<< "容积: " << pVTrain->strTVolume << "\n"
<< "换长: " << pVTrain->strTChangeLen << "\n"
<< "编号图片: " << pVTrain->strTNum_image << "\n"
<< "属性图片: " << pVTrain->strTPro_image << "\n"
<< "车节开始时间: " << pVTrain->strStartTime << "\n"
<< "车节结束时间: " << pVTrain->strEndTime << "\n"
<< "集装箱:" << strContainer << "\n"
<< "集装箱图片:" << strContainerImage << "\n"
<< " ---汇总结果 END--- ";
}
bool MergeEngine::isComplete(std::shared_ptr<VTrainInfo> pVTrain)
{
if (pVTrain->strTNum.empty()) return false;
if (pVTrain->strTType.empty()) return false;
if (pVTrain->strTLoadWeight.empty()) return false;
if (pVTrain->strTTareWeight.empty()) return false;
if (pVTrain->strTChangeLen.empty()) return false;
for (const auto & container : pVTrain->vecContainer)
{
if (container.strContainerNo.empty()) return false;
}
return true;
}
APP_ERROR MergeEngine::Process()
{
int iRet = APP_ERR_OK;
while (!isStop_)
{
std::shared_ptr<void> pVoidData0 = nullptr;
inputQueMap_[strPort0_]->pop(pVoidData0);
if (pVoidData0 == nullptr)
{
usleep(1000);
continue;
}
std::shared_ptr<VTrainInfo> pVTrainInfo =
std::static_pointer_cast<VTrainInfo>(pVoidData0);
if (pVTrainInfo->iDataSource == 0)
{
this->mapTrain_[pVTrainInfo->iCarOrder] = *pVTrainInfo;
if (!this->isComplete(pVTrainInfo))
{
std::shared_ptr<MergeSecondaryData> pMergeSecondaryData = std::make_shared<MergeSecondaryData>();
pMergeSecondaryData->iCarOrder = pVTrainInfo->iCarOrder;
LogInfo << " --- > 发送所需补全的车号:" << pVTrainInfo->iCarOrder;
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pMergeSecondaryData), true);
// this->mapHavSecondary_[pVTrainInfo->iCarOrder] = false;
this->queueHavSecondary_.push(pVTrainInfo->iCarOrder);
}
else
{
outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pVTrainInfo));
this->mapTrain_.erase(pVTrainInfo->iCarOrder);
}
}
if (pVTrainInfo->iDataSource == 1)
{
LogInfo << " === > 收到所需补全的车号:" << pVTrainInfo->iCarOrder;
if (this->queueHavSecondary_.front() == pVTrainInfo->iCarOrder)
{
// this->mapHavSecondary_[pVTrainInfo->iCarOrder] = true;
this->queueHavSecondary_.pop();
std::shared_ptr<VTrainInfo> pVTrain = std::make_shared<VTrainInfo>();
*pVTrain = this->mapTrain_[pVTrainInfo->iCarOrder];
this->supplementTrain(pVTrain, *pVTrainInfo);
outputQueMap_[strPort0_]->push(std::static_pointer_cast<void>(pVTrain));
this->mapTrain_.erase(pVTrainInfo->iCarOrder);
}
}
if (pVTrainInfo->bIsTheLast && this->queueHavSecondary_.empty())
{
std::shared_ptr<MergeSecondaryData> pMergeSecondaryData = std::make_shared<MergeSecondaryData>();
pMergeSecondaryData->bIsTheLast = pVTrainInfo->bIsTheLast;
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pMergeSecondaryData), true);
LogInfo << " --- > 发送补全车号清空请求";
}
}
return APP_ERR_OK;
}