Train_RFID_Linux/engine/VideoAuxiliaryEngine/VideoAuxiliaryEngine.cpp

175 lines
5.9 KiB
C++
Raw Normal View History

#include "VideoAuxiliaryEngine.h"
using namespace ai_matrix;
VideoAuxiliaryEngine::VideoAuxiliaryEngine() {}
VideoAuxiliaryEngine::~VideoAuxiliaryEngine() {}
APP_ERROR VideoAuxiliaryEngine::Init()
{
strPort0_ = engineName_ + "_" + std::to_string(engineId_) + "_0";
2024-07-27 08:12:26 +00:00
strPort1_ = engineName_ + "_" + std::to_string(engineId_) + "_1";
this->videoAuxiliaryConfig_ = Config::GetIns()->getVideoAuxiliaryConfig();
this->carType_ = "0";
LogInfo << "VideoAuxiliaryEngine Init ok";
return APP_ERR_OK;
}
APP_ERROR VideoAuxiliaryEngine::DeInit()
{
this->baseScoket_.Close();
LogInfo << "VideoAuxiliaryEngine DeInit ok";
return APP_ERR_OK;
}
APP_ERROR VideoAuxiliaryEngine::Process()
{
int iRet = APP_ERR_OK;
if (!this->videoAuxiliaryConfig_.bUseVideoAuxiliary)
{
return APP_ERR_OK;
}
this->baseScoket_.Open();
this->baseScoket_.SetPort(this->videoAuxiliaryConfig_.iPort, this->videoAuxiliaryConfig_.strIp);
this->baseScoket_.Init();
LogInfo << "视频辅助 服务端IP" << this->videoAuxiliaryConfig_.strIp << " 端口:" << this->videoAuxiliaryConfig_.iPort;
LogInfo << "视频辅助 开启通讯...";
while (!isStop_)
{
char chbuffer[AEI_COMM_BUFFER_SIZE] = {0};
int nRevSize = 0;
memset(chbuffer, 0x00, sizeof(chbuffer));
if (!this->baseScoket_.bRuning())
{
LogError << "TCP 连接失败,重启中 ...";
2024-07-27 08:12:26 +00:00
std::shared_ptr<DeviceStatus> pDeviceStatus = std::make_shared<DeviceStatus>();
pDeviceStatus->strDeviceName = "RFID程序";
pDeviceStatus->strDeviceRunningStatus = "正常";
pDeviceStatus->strNetworkStatus = "异常";
pDeviceStatus->strDeviceWarnInfo = "“RFID车号识别”同“视频车号识别”的通讯断开";
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pDeviceStatus));
usleep(20 * 1000 * 1000); // 20秒后重试
this->baseScoket_.Close();
this->baseScoket_.Open();
this->baseScoket_.Init();
2024-07-27 08:12:26 +00:00
if (this->baseScoket_.bRuning())
{
LogInfo << "TCP 连接成功!";
std::shared_ptr<DeviceStatus> pDeviceStatus = std::make_shared<DeviceStatus>();
pDeviceStatus->strDeviceName = "RFID程序";
pDeviceStatus->strDeviceRunningStatus = "正常";
pDeviceStatus->strNetworkStatus = "正常";
pDeviceStatus->strDeviceWarnInfo = "“RFID车号识别”同“视频车号识别”的通讯连接成功";
outputQueMap_[strPort1_]->push(std::static_pointer_cast<void>(pDeviceStatus));
}
continue;
}
nRevSize = this->baseScoket_.Read();
if (nRevSize <= 0)
{
this->baseScoket_.Monitor();
continue;
}
else
{
memcpy(chbuffer, this->baseScoket_.chbuffer, nRevSize);
}
this->dealSocketInfo(chbuffer);
}
return APP_ERR_OK;
}
bool VideoAuxiliaryEngine::getOrder(const std::string &recv, Json::Value &order)
{
Json::CharReaderBuilder readerBuilder;
std::shared_ptr<Json::CharReader> reader(readerBuilder.newCharReader());
JSONCPP_STRING errs;
if (!reader->parse(recv.data(), recv.data() + recv.size(), &order, &errs))
return false;
if (order.isArray()) {
if (!order.empty()) order = order[0];
return true;
}
return true;
}
void VideoAuxiliaryEngine::dealSocketInfo(const std::string &info) {
std::string vedioInfo = info;
LogInfo << "接收到:" << vedioInfo;
StringUtil::getins()->replace_all_distinct(vedioInfo, "}{", "}&{");
std::vector<std::string> vecJson = StringUtil::getins()->split(vedioInfo, "&");
for (int i = 0; i < vecJson.size(); ++i)
{
Json::Value feedBack;
if (!this->getOrder(vecJson[i], feedBack))
{
LogWarn << "接收到视频识别反馈的来车状态信息未能解析成JSON格式。";
continue;
}
std::shared_ptr<ComeTrainInfo> pComeTrainInfo = std::make_shared<ComeTrainInfo>();
std::string tmpCarType = feedBack.get("type", "").asString();
int iDirection = feedBack.get("direction", 0).asInt();
if (tmpCarType != this->carType_)
{
if (this->carType_ == "0")
{
// 来车
pComeTrainInfo->bComeTrain = true;
pComeTrainInfo->iDirection = 0;
if (iDirection != 0) pComeTrainInfo->iDirection = iDirection;
outputQueMap_[strPort0_]->push(pComeTrainInfo);
this->carType_ = tmpCarType;
LogInfo << "视频辅助-来车了";
}
else if (this->carType_ == "1")
{
// 无车
pComeTrainInfo->bComeTrain = false;
pComeTrainInfo->iDirection = 0;
outputQueMap_[strPort0_]->push(pComeTrainInfo);
this->carType_ = tmpCarType;
LogInfo << "视频辅助-火车离开了";
}
else
{
LogWarn << "视频辅助检测来车状态,反馈的来车状态无法识别";
continue;
}
if (iDirection != 0)
{
pComeTrainInfo->bComeTrain = true;
pComeTrainInfo->iDirection = iDirection;
outputQueMap_[strPort0_]->push(pComeTrainInfo);
LogInfo << "视频辅助-获得是否需要识别判定" << iDirection;
}
}
else {
if (iDirection != 0)
{
pComeTrainInfo->bComeTrain = true;
pComeTrainInfo->iDirection = iDirection;
outputQueMap_[strPort0_]->push(pComeTrainInfo);
LogInfo << "视频辅助-获得是否需要识别判定" << iDirection;
}
}
}
}