498 lines
18 KiB
C++
498 lines
18 KiB
C++
#include "SaveCsvEngine.h"
|
|
|
|
using namespace ai_matrix;
|
|
|
|
SaveCsvEngine::SaveCsvEngine() {}
|
|
|
|
SaveCsvEngine::~SaveCsvEngine() {}
|
|
|
|
APP_ERROR SaveCsvEngine::Init()
|
|
{
|
|
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
|
|
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1";
|
|
strPort2_ = engineName_ + "_" + std::to_string(engineId_) + "_2";
|
|
strResultPath_ = MyYaml::GetIns()->GetPathValue("gc_result_path");
|
|
strPoundNo_ = MyYaml::GetIns()->GetStringValue("atlas_poundno");
|
|
|
|
LogInfo << "SaveCsvEngine Init ok";
|
|
return APP_ERR_OK;
|
|
}
|
|
|
|
APP_ERROR SaveCsvEngine::DeInit()
|
|
{
|
|
LogInfo << "SaveCsvEngine DeInit ok";
|
|
return APP_ERR_OK;
|
|
}
|
|
|
|
/**
|
|
* 保存合并后车厢的最优结果到CSV中 (该文件支持其web导入)
|
|
* inParam : std::shared_ptr<Train> pTrain :列车信息
|
|
* outParam:
|
|
* return : true/false
|
|
*/
|
|
bool SaveCsvEngine::SaveMergerCsv(std::shared_ptr<Train> pTrain)
|
|
{
|
|
//1. 创建保存路径 (固定路径/YYYY-MM-DD/hh-mm-ss/)
|
|
std::string strTrainPath = strResultPath_ + pTrain->strTrainDate + "/" + pTrain->strTrainName + "/";
|
|
if (!MyUtils::getins()->CreateDirPath(strTrainPath))
|
|
{
|
|
LogError << "iCarXH:" << pTrain->iCarXH << " train savecsv err";
|
|
return false;
|
|
}
|
|
|
|
//2. 保存csv
|
|
std::string strCsvName = pTrain->strTrainDate + pTrain->strTrainName + std::string(".csv");
|
|
strCsvName = MyUtils::getins()->replace_all_distinct(strCsvName, std::string("-"), std::string(""));
|
|
std::string strCsvPath = strTrainPath + strCsvName;
|
|
|
|
bool bIsExsit = false;
|
|
if (access(strCsvPath.c_str(), F_OK) != -1)
|
|
{
|
|
bIsExsit = true;
|
|
}
|
|
|
|
try
|
|
{
|
|
// 写文件
|
|
std::ofstream outFile;
|
|
outFile.open(strCsvPath, std::ios::app); // 打开模式可省略
|
|
|
|
if (!bIsExsit)
|
|
{
|
|
outFile << "poundno" << ','
|
|
<< "year" << ','
|
|
<< "time" << ','
|
|
<< "direction" << ','
|
|
<< "speed" << ','
|
|
<< "camerano" << ','
|
|
<< "skipInterval" << ','
|
|
<< "carxh" << ','
|
|
<< "type" << ','
|
|
<< "num" << ','
|
|
<< "load" << ','
|
|
<< "self" << ','
|
|
<< "volume" << ','
|
|
<< "volumesurface" << ','
|
|
<< "change" << ','
|
|
<< "numImgPath" << ','
|
|
<< "proImgPath" << ','
|
|
<< "videoStart" << ','
|
|
<< "videoEnd" << ','
|
|
<< "containerNo1" << ','
|
|
<< "containerNo2" << ','
|
|
<< "inspection" << ','
|
|
<< "inspectionImg" << ','
|
|
<< "containerImg_1" << ','
|
|
<< "containerImg_2" << ','
|
|
<< "startTime" << ','
|
|
<< "endTime"
|
|
<< std::endl;
|
|
}
|
|
|
|
std::string strTime = pTrain->strTrainName;
|
|
strTime = MyUtils::getins()->replace_all_distinct(strTime, std::string("-"), std::string(":"));
|
|
ai_matrix::DataSourceConfig dataSourceConfig = MyYaml::GetIns()->GetDataSourceConfigById(pTrain->trainNum.iDataSource); //获取摄像机参数
|
|
|
|
char szCameraNo[4] = {0};
|
|
sprintf(szCameraNo, "%03d", pTrain->trainNum.iDataSource + 1);
|
|
|
|
char szNumImgPath[64] = {0}; //车号最优图片路径
|
|
if (!pTrain->trainNum.strBestImg.empty())
|
|
{
|
|
sprintf(szNumImgPath, "%03d/%s", pTrain->trainNum.iDataSource + 1, pTrain->trainNum.strBestImg.c_str());
|
|
}
|
|
|
|
char szProImgPath[64] = {0}; //属性最优图片路径
|
|
if (!pTrain->trainPro.strBestImg.empty())
|
|
{
|
|
sprintf(szProImgPath, "%03d/%s", pTrain->trainPro.iDataSource + 1, pTrain->trainPro.strBestImg.c_str());
|
|
}
|
|
|
|
char szChkDateImgPath[64] = {0}; //定检期最优图片路径
|
|
if (!pTrain->chkDate.strBestImg.empty())
|
|
{
|
|
sprintf(szChkDateImgPath, "%03d/%s", pTrain->chkDate.iDataSource + 1, pTrain->chkDate.strBestImg.c_str());
|
|
}
|
|
|
|
char szContainer1ImgPath[64] = {0}; //集装箱1最优图片路径
|
|
if (!pTrain->container1.strBestImg.empty())
|
|
{
|
|
sprintf(szContainer1ImgPath, "%03d/%s", pTrain->container1.iDataSource + 1, pTrain->container1.strBestImg.c_str());
|
|
}
|
|
|
|
char szContainer2ImgPath[64] = {0}; //集装箱2最优图片路径
|
|
if (!pTrain->container2.strBestImg.empty())
|
|
{
|
|
sprintf(szContainer2ImgPath, "%03d/%s", pTrain->container2.iDataSource + 1, pTrain->container2.strBestImg.c_str());
|
|
}
|
|
|
|
outFile << strPoundNo_ << ','
|
|
<< pTrain->strTrainDate << ','
|
|
<< strTime << ','
|
|
<< pTrain->iDirection << ','
|
|
<< 0.0 << ','
|
|
<< szCameraNo << ','
|
|
<< dataSourceConfig.iSkipInterval << ','
|
|
<< pTrain->iCarXH << ','
|
|
<< pTrain->trainNum.strTrainType << ','
|
|
<< pTrain->trainNum.strTrainNum << ','
|
|
<< pTrain->trainPro.strLoad << ','
|
|
<< pTrain->trainPro.strSelf << ','
|
|
<< pTrain->trainPro.strVolume << ','
|
|
<< pTrain->trainPro.strVolumeSurface << ',' //容量记表
|
|
<< pTrain->trainPro.strChange << ','
|
|
<< szNumImgPath << ','
|
|
<< szProImgPath << ','
|
|
<< pTrain->iStartFrameId << ','
|
|
<< pTrain->iEndFrameId << ','
|
|
<< pTrain->container1.strContainerNo << ','
|
|
<< pTrain->container2.strContainerNo << ','
|
|
<< pTrain->chkDate.strChkDate1DeadLine << ','
|
|
<< szChkDateImgPath << ','
|
|
<< szContainer1ImgPath << ','
|
|
<< szContainer2ImgPath << ','
|
|
<< MyUtils::getins()->Stamp2Time(pTrain->i64StartTimeStamp, true) << ','
|
|
<< MyUtils::getins()->Stamp2Time(pTrain->i64EndTimeStamp, true)
|
|
<< std::endl;
|
|
|
|
outFile.close();
|
|
}
|
|
catch (const std::exception &)
|
|
{
|
|
LogError << "strCsvPath:" << strCsvPath << " train savecsv fail!";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 保存车厢的最优结果到CSV中
|
|
* inParam : std::shared_ptr<Train> pTrain :列车信息
|
|
* outParam:
|
|
* return : true/false
|
|
*/
|
|
bool SaveCsvEngine::SaveTrainCsv(std::shared_ptr<Train> pTrain)
|
|
{
|
|
char szCameraNo[4] = {0};
|
|
sprintf(szCameraNo, "%03d", pTrain->iDataSource + 1);
|
|
std::string strTrainPath = strResultPath_ + pTrain->strTrainDate + "/" + pTrain->strTrainName + "/" +
|
|
szCameraNo + "/";
|
|
|
|
//1. 创建保存路径 (固定路径/YYYY-MM-DD/hh-mm-ss/iDataSoure/)
|
|
if (!MyUtils::getins()->CreateDirPath(strTrainPath))
|
|
{
|
|
LogError << "iCarXH:" << pTrain->iCarXH << " train savecsv err";
|
|
return false;
|
|
}
|
|
|
|
//2. 保存csv
|
|
std::string strCsvName = pTrain->strTrainDate + pTrain->strTrainName + "_" + szCameraNo + "_train.csv";
|
|
strCsvName = MyUtils::getins()->replace_all_distinct(strCsvName, std::string("-"), std::string(""));
|
|
std::string strCsvPath = strTrainPath + strCsvName;
|
|
|
|
bool bIsExsit = false;
|
|
if (access(strCsvPath.c_str(), F_OK) != -1)
|
|
{
|
|
bIsExsit = true;
|
|
}
|
|
|
|
try
|
|
{
|
|
// 写文件
|
|
std::ofstream outFile;
|
|
outFile.open(strCsvPath, std::ios::app);
|
|
|
|
if (!bIsExsit)
|
|
{
|
|
outFile << "car_xh" << ','
|
|
<< "train_num_name" << ','
|
|
<< "train_pro_name" << ','
|
|
<< "t_type" << ','
|
|
<< "t_num" << ','
|
|
<< "load" << ','
|
|
<< "self" << ','
|
|
<< "volume" << ','
|
|
<< "change" << ','
|
|
<< "volumesurface" << ','
|
|
<< "num_ltx" << ','
|
|
<< "num_lty" << ','
|
|
<< "num_rbx" << ','
|
|
<< "num_rby" << ','
|
|
<< "pro_ltx" << ','
|
|
<< "pro_lty" << ','
|
|
<< "pro_rbx" << ','
|
|
<< "pro_rby" << ','
|
|
<< "start_frameId" << ','
|
|
<< "end_frameId" << ','
|
|
<< "start_timestamp" << ',' //记录车厢开始,结束帧时间戳,用于比对集装箱合并
|
|
<< "timestamp" << ','
|
|
<< "end_timestamp" << ','
|
|
<< "start_num" << ','
|
|
<< "num_timestamp" << ',' //记录车号,属性时间戳,用于比对定检期合并
|
|
<< "end_num" << ','
|
|
<< "start_pro" << ','
|
|
<< "pro_timestamp" << ','
|
|
<< "end_pro" << std::endl;
|
|
}
|
|
outFile << pTrain->iCarXH << ','
|
|
<< pTrain->trainNum.strBestImg << ','
|
|
<< pTrain->trainPro.strBestImg << ','
|
|
<< pTrain->trainNum.strTrainType << ','
|
|
<< pTrain->trainNum.strTrainNum << ','
|
|
<< pTrain->trainPro.strLoad << ','
|
|
<< pTrain->trainPro.strSelf << ','
|
|
<< pTrain->trainPro.strVolume << ','
|
|
<< pTrain->trainPro.strChange << ','
|
|
<< pTrain->trainPro.strVolumeSurface << ','
|
|
<< pTrain->trainNum.step1Location.fLTX << ','
|
|
<< pTrain->trainNum.step1Location.fLTY << ','
|
|
<< pTrain->trainNum.step1Location.fRBX << ','
|
|
<< pTrain->trainNum.step1Location.fRBY << ','
|
|
<< pTrain->trainPro.step1Location.fLTX << ','
|
|
<< pTrain->trainPro.step1Location.fLTY << ','
|
|
<< pTrain->trainPro.step1Location.fRBX << ','
|
|
<< pTrain->trainPro.step1Location.fRBY << ','
|
|
<< pTrain->iStartFrameId << ','
|
|
<< pTrain->iEndFrameId << ','
|
|
<< pTrain->i64StartTimeStamp << ','
|
|
<< pTrain->i64TimeStamp << ','
|
|
<< pTrain->i64EndTimeStamp << ','
|
|
<< pTrain->trainNum.i64StartTimeStamp << ','
|
|
<< pTrain->trainNum.i64TimeStamp << ','
|
|
<< pTrain->trainNum.i64EndTimeStamp << ','
|
|
<< pTrain->trainPro.i64StartTimeStamp << ','
|
|
<< pTrain->trainPro.i64TimeStamp << ','
|
|
<< pTrain->trainPro.i64EndTimeStamp << std::endl;
|
|
|
|
outFile.close();
|
|
}
|
|
catch (const std::exception &)
|
|
{
|
|
LogError << "strCsvPath:" << strCsvPath << " train savecsv fail!";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 保存定检期的最优结果到CSV中
|
|
* inParam : std::shared_ptr<ChkDate> pChkDate :定检期信息
|
|
* outParam:
|
|
* return : true/false
|
|
*/
|
|
bool SaveCsvEngine::SaveChkDateCsv(std::shared_ptr<ChkDate> pChkDate)
|
|
{
|
|
if (pChkDate->strBestImg.empty())
|
|
{
|
|
LogDebug << "datetime:" << pChkDate->strTrainDate << " " << pChkDate->strTrainName
|
|
<< " carxh:" << pChkDate->iCarXH << " chkdate empty";
|
|
return true;
|
|
}
|
|
//1. 创建保存路径 (固定路径/YYYY-MM-DD/hh-mm-ss/iDataSoure/)
|
|
char szCameraNo[4] = {0};
|
|
sprintf(szCameraNo, "%03d", pChkDate->iDataSource + 1);
|
|
std::string strChkDatePath = strResultPath_ + pChkDate->strTrainDate + "/" + pChkDate->strTrainName + "/" +
|
|
szCameraNo + "/";
|
|
|
|
if (!MyUtils::getins()->CreateDirPath(strChkDatePath))
|
|
{
|
|
LogError << "iCarXH:" << pChkDate->iCarXH << "chkdate savecsv err";
|
|
return false;
|
|
}
|
|
|
|
//2. 保存csv
|
|
std::string strCsvName = pChkDate->strTrainDate + pChkDate->strTrainName + "_" + szCameraNo + "_chkdate.csv";
|
|
strCsvName = MyUtils::getins()->replace_all_distinct(strCsvName, std::string("-"), std::string(""));
|
|
std::string strCsvPath = strChkDatePath + strCsvName;
|
|
|
|
bool bIsExsit = false;
|
|
if (access(strCsvPath.c_str(), F_OK) != -1)
|
|
{
|
|
bIsExsit = true;
|
|
}
|
|
|
|
try
|
|
{
|
|
// 写文件
|
|
std::ofstream outFile;
|
|
outFile.open(strCsvPath, std::ios::app); // 打开模式可省略
|
|
|
|
if (!bIsExsit)
|
|
{
|
|
outFile << "car_xh" << ','
|
|
<< "chkdate_name" << ','
|
|
<< "chkdate1" << ','
|
|
<< "chkdate2" << ','
|
|
<< "chkdate_ltx" << ','
|
|
<< "chkdate_lty" << ','
|
|
<< "chkdate_rbx" << ','
|
|
<< "chkdate_rby" << ','
|
|
<< "start_frameId" << ','
|
|
<< "end_frameId" << ','
|
|
<< "start_timestamp" << ','
|
|
<< "end_timestamp" << ','
|
|
<< "timestamp" << ','
|
|
<< "chkdate1deadline" << std::endl;
|
|
}
|
|
outFile << pChkDate->iCarXH << ','
|
|
<< pChkDate->strBestImg << ','
|
|
<< pChkDate->strChkDate1 << ','
|
|
<< pChkDate->strChkDate2 << ','
|
|
<< pChkDate->step1Location.fLTX << ','
|
|
<< pChkDate->step1Location.fLTY << ','
|
|
<< pChkDate->step1Location.fRBX << ','
|
|
<< pChkDate->step1Location.fRBY << ','
|
|
<< pChkDate->iStartFrameId << ','
|
|
<< pChkDate->iEndFrameId << ','
|
|
<< pChkDate->i64StartTimeStamp << ','
|
|
<< pChkDate->i64EndTimeStamp << ','
|
|
<< pChkDate->i64TimeStamp << ','
|
|
<< pChkDate->strChkDate1DeadLine << std::endl;
|
|
|
|
outFile.close();
|
|
}
|
|
catch (const std::exception &)
|
|
{
|
|
LogError << "strCsvPath:" << strCsvPath << " chkdate savecsv fail!";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 保存集装箱的最优结果到CSV中
|
|
* inParam : std::shared_ptr<TrainContainer> pTrainContainer :集装箱信息
|
|
* outParam:
|
|
* return : true/false
|
|
*/
|
|
bool SaveCsvEngine::SaveContainerCsv(std::shared_ptr<TrainContainer> pTrainContainer)
|
|
{
|
|
std::vector<Container> vecContainer;
|
|
vecContainer.emplace_back(pTrainContainer->container1);
|
|
vecContainer.emplace_back(pTrainContainer->container2);
|
|
for (auto iter = vecContainer.begin(); iter != vecContainer.end(); iter++)
|
|
{
|
|
if (iter->strContainerNo.empty())
|
|
{
|
|
continue;
|
|
}
|
|
// 1. 创建保存路径 (固定路径/YYYY-MM-DD/hh-mm-ss/iDataSoure/)
|
|
char szCameraNo[4] = {0};
|
|
sprintf(szCameraNo, "%03d", iter->iDataSource + 1);
|
|
std::string strContainerPath = strResultPath_ + iter->strTrainDate + "/" + iter->strTrainName + "/" +
|
|
szCameraNo + "/";
|
|
|
|
if (!MyUtils::getins()->CreateDirPath(strContainerPath))
|
|
{
|
|
LogError << "ContainerNo:" << iter->strContainerNo << " container savecsv err";
|
|
continue;
|
|
}
|
|
// 2. 保存csv
|
|
std::string strCsvName = iter->strTrainDate + iter->strTrainName + "_" + szCameraNo + "_container.csv";
|
|
strCsvName = MyUtils::getins()->replace_all_distinct(strCsvName, std::string("-"), std::string(""));
|
|
std::string strCsvPath = strContainerPath + strCsvName;
|
|
|
|
bool bIsExsit = false;
|
|
if (access(strCsvPath.c_str(), F_OK) != -1)
|
|
{
|
|
bIsExsit = true;
|
|
}
|
|
|
|
try
|
|
{
|
|
// 写文件
|
|
std::ofstream outFile;
|
|
outFile.open(strCsvPath, std::ios::app);
|
|
|
|
if (!bIsExsit)
|
|
{
|
|
outFile << "datasource" << ','
|
|
<< "container_name" << ','
|
|
<< "containerNo" << ','
|
|
<< "container_ltx" << ','
|
|
<< "container_lty" << ','
|
|
<< "container_rbx" << ','
|
|
<< "container_rby" << ','
|
|
<< "start_frameId" << ','
|
|
<< "end_frameId" << ','
|
|
<< "timestamp" << std::endl;
|
|
}
|
|
outFile << iter->iDataSource << ','
|
|
<< iter->strBestImg << ','
|
|
<< iter->strContainerNo << ','
|
|
<< iter->step1Location.fLTX << ','
|
|
<< iter->step1Location.fLTY << ','
|
|
<< iter->step1Location.fRBX << ','
|
|
<< iter->step1Location.fRBY << ','
|
|
<< iter->iStartFrameId << ','
|
|
<< iter->iEndFrameId << ','
|
|
<< iter->i64TimeStamp << std::endl;
|
|
|
|
outFile.close();
|
|
}
|
|
catch (const std::exception &)
|
|
{
|
|
LogError << "strCsvPath:" << strCsvPath << " container savecsv fail!";
|
|
continue;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
APP_ERROR SaveCsvEngine::Process()
|
|
{
|
|
int iRet = APP_ERR_OK;
|
|
while (!isStop_)
|
|
{
|
|
|
|
bool bPopFlag = false;
|
|
//pop端口0 车厢信息
|
|
std::shared_ptr<void> pVoidData0 = nullptr;
|
|
iRet = inputQueMap_[strPort0_]->pop(pVoidData0);
|
|
if (nullptr != pVoidData0)
|
|
{
|
|
std::shared_ptr<Train> pTrain = std::static_pointer_cast<Train>(pVoidData0);
|
|
if (pTrain->bMergerFlag)
|
|
{
|
|
SaveMergerCsv(pTrain);
|
|
}
|
|
else
|
|
{
|
|
SaveTrainCsv(pTrain);
|
|
}
|
|
bPopFlag = true;
|
|
}
|
|
//pop端口1 定检期信息
|
|
if (inputQueMap_.count(strPort1_) > 0)
|
|
{
|
|
std::shared_ptr<void> pVoidData1 = nullptr;
|
|
inputQueMap_[strPort1_]->pop(pVoidData1);
|
|
if (nullptr != pVoidData1)
|
|
{
|
|
std::shared_ptr<ChkDate> pChkDate = std::static_pointer_cast<ChkDate>(pVoidData1);
|
|
SaveChkDateCsv(pChkDate);
|
|
bPopFlag = true;
|
|
}
|
|
}
|
|
//pop端口2 集装箱信息
|
|
if (inputQueMap_.count(strPort2_) > 0)
|
|
{
|
|
std::shared_ptr<void> pVoidData2 = nullptr;
|
|
inputQueMap_[strPort2_]->pop(pVoidData2);
|
|
if (nullptr != pVoidData2)
|
|
{
|
|
std::shared_ptr<TrainContainer> pTrainContainer = std::static_pointer_cast<TrainContainer>(pVoidData2);
|
|
SaveContainerCsv(pTrainContainer);
|
|
bPopFlag = true;
|
|
}
|
|
}
|
|
|
|
if (!bPopFlag)
|
|
{
|
|
usleep(1000);
|
|
continue;
|
|
}
|
|
}
|
|
return APP_ERR_OK;
|
|
}
|