subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp

500 lines
16 KiB
C++
Raw Normal View History

2024-07-11 16:16:43 +08:00
#include "Sub3Judge05Lkzx.h"
#include "HFactory.h"
Sub3Judge05Lkzx::Sub3Judge05Lkzx()
{
m_exam = __NEW__(TKM3Item);
}
Sub3Judge05Lkzx::~Sub3Judge05Lkzx()
{
__DELETE__(m_exam);
}
bool Sub3Judge05Lkzx::dealJudgeEnter()
{
if(m_exam->TestPro != ItemProFlagInit) return false;
if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return false;
const TChuanGan* cg = m_car->historyChuanGan();
m_itemv = ISub3Item05Lkzx();
#ifdef JUDGE_USE_INSPECT
//是否是停车让行项目
const std::string& ksdd = TableSysSet->get211();
if (ksdd == siteof::tcrx)
{
m_itemv.Is_TCRX_Item = true;
}
#endif
//m_itemv.ItemPosI = xi;
m_itemv.Start_JL_CM = cg->ai_ljjl_cm;
const std::vector<std::string>& s508 = TableSysSet->asArray508();
//得到项目距离(如果没有读到停止线或者没有感应到出路口,行驶指定距离后,自动结束项目 )
m_itemv.XMJL_Mi = s508.size() > 0 && s508[0] != "" ? std::atoi(s508[0].c_str()) : 250; //StrToIntDef(getdotstr(1, sysset[508] + ',', ','), 250); // strtointdef(readiniparam('通过路口', 'lkxmjl', '250'), 0); //20151214
//1、得到路口类型
m_itemv.LuK_Type = m_exam->SetUp1.length() > 0 ? std::atoi(m_exam->SetUp1.c_str()) : 1;
//2、得到减速类型和速度阈值
const std::vector<std::vector<std::string>>& s522 = TableSysSet->asArray2_522();
if(s522.size() > 0)
{
const std::vector<std::string>& ss522 = s522[0];
m_itemv.JianSu_LeiXing = ss522.size() > 0 && ss522[0] != "" ? std::atoi(ss522[0].c_str()) : 0;
m_itemv.JianSu_SuDu = ss522.size() > 1 && ss522[1] != "" ? std::atoi(ss522[1].c_str()) : 30;
}
if(m_itemv.JianSu_LeiXing > 4)
{
m_itemv.JianSu_LeiXing = 0;
}
//3、得到行驶方向点和停车让行标志
if(m_exam->SetUp3 != "")
{
std::vector<std::string> setup3 = Tools::split(m_exam->SetUp3, "-");
m_itemv.LuK_Fx_PointNo = setup3.size() > 0 && setup3[0] != "" ? std::atoi(setup3[0].c_str()) : 0;
//停车让行
m_itemv.LuK_TcRx = (setup3.size() > 2 && setup3[2] == "1");
}
else
{
m_itemv.LuK_Fx_PointNo = 0;
}
//4、路口内禁止停车时间
m_itemv.LuK_TCSJ = (m_exam->SetUp5 != "" ? std::atoi(m_exam->SetUp5.c_str()) : 10000);
//5、越过停车线后X米后不允许停车
m_itemv.LuK_TCJL = (m_exam->SetUp6 != "" ? std::atof(m_exam->SetUp6.c_str()) : 10);
m_exam->TestPro = ItemProFlagJudge;
//ToDo1:播报项目语音
//ToDo2:生成进项目事件
return true;
}
void Sub3Judge05Lkzx::dealJudgeItem()
{
HELP_COST_TIME("");
if(m_exam->TestPro != ItemProFlagJudge) return;
if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return;
//setup1: 路口类型 1-平交 2-环道 3-三叉 缺省 1平交
//setup2: 限速值,通过路口停车线时的车速 缺省 35
//setup3: 正确行驶方向点-方向-停车让行
//setup4: *语音提示方向,保存语音文件名 缺省 空
//setup5: 路口内禁止停车时间 缺省 10000秒 标识不限制
//setup6: 越过停车线后X米后不允许停车超过setup5秒 缺省 10米
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TGpsInfo& gps = cg->real.gps;
const TSensorInfo& sor = cg->real.sensor;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const std::string& ksdd = TableSysSet->get211();
if(m_car->isExamMode()) //正式考试
{
if(!m_car->isQualified())
{
m_exam->TestPro = ItemProFlagEnd;
flagEndJudge();
return;
}
}
#ifdef JUDGE_USE_INSPECT
//(*XLG_Modify 2024-06-06*)
const TChuanGan* his2 = m_car->historyChuanGan(1);
if(m_itemv.Is_TCRX_Item == true)
{
if (cg->ai_ljjl_cm - m_itemv.Start_JL_CM > 1480)
{
if(m_itemv.Cross_TZX_Flag == false)
{
if(cg->move == moveStop && his1->move == moveStop && his2->move == moveStop)
{
m_itemv.TCRX_FinishFlag = true;
}
}
}
if(m_itemv.Cross_TZX_Flag == true)
{
if(m_itemv.Is_TCRX_Item == true && m_itemv.TCRX_FinishFlag == false)
{
JUDGE_MARK_SUB3(5, "03", true);
}
}
}
#endif
//(*2024-03-08*)
if (Tools::pos("+", cg->MapPoint_Road_Code) == true && Tools::pos("+", his1->MapPoint_Road_Code) == false) //包含路口端点的路口项目
{
if(m_exam->Gps_Itemno1 < 3)
{
m_exam->Gps_Itemno1 = 3;
}
}
if(m_exam->Gps_Itemno1 == 3 || m_itemv.Cross_TZX_Flag == true)
{
if(m_itemv.Step3Flag == false)
{
m_itemv.Step3Flag = true;
std::string roadData = cg->MapPoint_Road_Code;
if(roadData == "")
{
//这里要稍微讲解一下(有些地方,可能驾校在路段中间,这种情况下,初始读不到路段,这种情况比较少)
roadData = RTKKM3.MapRoad_Name;
}
roadData = Tools::replace(roadData, "+", ""); //, [rfReplaceAll]
m_itemv.Step3RoadData = roadData;
}
}
//读到下一个路段标志
if(m_itemv.Step3Flag == true)
{
std::string roadData = cg->MapPoint_Road_Code;
if(roadData == "")
{
roadData = RTKKM3.MapRoad_Name;
}
roadData = Tools::replace(roadData, "+", ""); //, [rfReplaceAll]
if(m_itemv.Step3RoadData != roadData)
{
m_itemv.ReadNextLuDuanFlag = true;
}
//做完项目后,有没有关闭灯光(综合评判会用到,这里先赋值)
if(sor.zfxd == SNOT && sor.yfxd == SNOT)
{
TTestCtl* ctl = m_car->getTTestCtl();
ctl->ZXD_GuanBi = true;
}
}
//直行不可以打灯
if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1) //停止线处,直行不可以打灯
{
//方向灯错误评判
//508:路口项目参数:xmjl,Fxdpp,
// Xmjl:a项目距离
//Fxdpp:方向灯评判时机0打方向角度1停止线默认
//fxdcc方向灯错误评判如左转开右方向灯立即扣分
//大车右转必停时长毫秒默认为0不用停车
//方向灯必须持续到路口停止线
const std::vector<std::string>& s508 = TableSysSet->asArray508();
if(s508.size() > 2 && std::atoi(s508[2].c_str()) == 1)
{
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
if(sor.zfxd == SYES && sor1.zfxd == SYES && sor2.zfxd == SYES)
{
if(!m_itemv.Mark_20_73_Flag)
{
JUDGE_MARK_SUB3(20, "73", false);
}
}
if(sor.yfxd == SYES && sor1.yfxd == SYES && sor2.yfxd == SYES)
{
if(!m_itemv.Mark_20_73_Flag)
{
JUDGE_MARK_SUB3(20, "73", false);
}
}
}
}
std::string msg = "";
if(m_itemv.Cross_TZX_Flag == true)
{
if(m_itemv.StopLine_JLCM != 0)
{
//环岛业务逻辑翻译(一般很少有地方是环岛) //路口类型 1-平交 2-环岛
int disMI = m_itemv.LuK_Type == 2 ? 190 : 100;
int dis1 = cg->ai_ljjl_cm - m_itemv.StopLine_JLCM;
int dis2 = disMI * 100;
msg = XCharacter(",过停止线距离cm=") + std::to_string(dis1) + XCharacter(",结束=") + std::to_string(dis2);
if(cg->ai_ljjl_cm - m_itemv.StopLine_JLCM >= dis2)
{
m_exam->TestPro = ItemProFlagEnd;
flagEndJudge();
return;
}
}
}
// (*2024-03-07*)
//增加南京地区特殊判断
if(ksdd == siteof::nj && m_exam->Gps_Itemno1 == 3 && TableSysSet->get346() == "-1")
{
if(!m_itemv.Cross_TZX_Flag)
{
m_itemv.Cross_TZX_Flag = true;
//0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119
m_itemv.StopLine_JLCM = cg->ai_ljjl_cm; //停止线时刻的距离
}
}
//判断是否到达停止线
//0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119
if(m_itemv.Cross_TZX_Flag == false)
{
if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1)
{
m_itemv.Cross_TZX_Flag = true;
if(m_exam->Gps_Itemno1 < 3)
{
m_exam->Gps_Itemno1 = 3;
}
//0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119
m_itemv.StopLine_JLCM = cg->ai_ljjl_cm; //停止线时刻的距离
//路段状况:基准天线所在车道方向: 1-右转 2-直行 3-左转 4-掉头
//1000 0100 0010 0001
//评判方向灯
}
}
if(m_itemv.Cross_TZX_Flag == true) // || m_exam->Gps_Itemno1 == 3
{
if(m_itemv.Judge_TCX == false)
{
m_itemv.Judge_TCX = true;
//方向灯评判
JudgeFXD();
//停车让行评判(掉头不存在停车让行)
if(m_itemv.LuK_TcRx == true)
{
if(CheckJL_TingChe(30) == false) //20170924
{
JUDGE_MARK_SUB3(5, "03", true);
}
}
//(*XLG_Modify 2024-03-15*)
Judge_LuKou_TZX_JianSu(itemNo(), m_itemv.JianSu_LeiXing, m_itemv.JianSu_SuDu);
}
}
//检查车道是否正确
if(RTKKM3.CrossLineAttr == TRTKResult::CrossLineAttr1 || m_exam->Gps_Itemno1 == 2 || m_exam->Gps_Itemno1 == 3)
{
#ifdef JUDGE_USE_INSPECT
if(1)
{
//路段状况:基准天线所在车道方向: 1-右转 2-直行 3-左转 4-掉头
//1000 0100 0010 0001
if(RTKKM3.BasePointInLaneDir != "" && RTKKM3.BasePointInLaneDir != "0000")
{
if(RTKKM3.BasePointInLaneDir.substr(1, 1) != "1")
{
JUDGE_MARK_SUB3(5, "45", true);
}
}
}
#else
if(m_itemv.Check_CheDao == false)
{
m_itemv.Check_CheDao = true;
//路段状况:基准天线所在车道方向: 1-右转 2-直行 3-左转 4-掉头
//1000 0100 0010 0001
if(RTKKM3.BasePointInLaneDir != "")
{
if(RTKKM3.BasePointInLaneDir.substr(1, 1) != "1")
{
JUDGE_MARK_SUB3(5, "45", true);
}
}
}
#endif
}
//(5,04):遇有路口交通阻塞时进入路口,将车辆停在路口内等候
//路口内停车判断
//RTK_PP穿越停车线赋值
if(cg->move != moveStop)
{
m_itemv.StopLine_TCTM = 0;
}
if(cg->move == moveStop && m_itemv.Cross_TZX_Flag == true)
{
int dis = cg->ai_ljjl_cm - m_itemv.StopLine_JLCM;
if(dis > m_itemv.LuK_TCJL * 100)
{
if(m_itemv.StopLine_TCTM == 0)
{
m_itemv.StopLine_TCTM = gps.sj;
}
if(std::abs(gps.sj - m_itemv.StopLine_TCTM) > m_itemv.LuK_TCSJ * SECOND)
{
if(ksdd == siteof::hnpy)
{
if(!m_itemv.LKTCKF)
{
JUDGE_MARK_SUB3(5, "04", false);
m_itemv.LKTCKF = true;
}
}
else
{
JUDGE_MARK_SUB3(5, "04", true);
}
}
}
}
//停车让行评判
//////////////////////////////////////////////////////////////////////////
//不按规定考试(比如:走错车道了
//////////////////////////////////////////////////////////////////////////////
//方向灯标志
///////////////////////////////////////////////////////////////////////////
if(m_itemv.Cross_TZX_Flag == false)
{
if(cg->ai_ljjl_cm - m_itemv.Start_JL_CM > m_itemv.XMJL_Mi * 100)
{
m_exam->TestPro = ItemProFlagEnd;
flagEndJudge();
return;
}
}
if(m_itemv.Step3Flag == true)
{
//1、左转方向评判2标配
//{
// if not m_itemv.ZhongXinDian3MarkFlag then
// {
// if(RTKKM3.CrossLineAttr = 2) or (RTKKM3.CrossLineAttr = 4) then
// {
// JUDGE_MARK_SUB3(15, '05', False);
// m_itemv.ZhongXinDian3MarkFlag := True;
// }
// }
//}
//插入穿越点
int ptNo = m_car->lastCrossPtNo();
if(ptNo != 0)
{
bool findFlag = false;
int len = m_itemv.Step3PtArr.size();
for(int i = 0; i < len; i++)
{
if(m_itemv.Step3PtArr[i] == ptNo)
{
findFlag = true;
}
}
if(!findFlag)
{
m_itemv.Step3PtArr.push_back(ptNo);
}
findFlag = false;
len = m_itemv.Step3PtArr.size();
for(int i = 0; i < len; i++)
{
if(m_itemv.Step3PtArr[i] == m_itemv.LuK_Fx_PointNo)
{
findFlag = true;
}
}
m_itemv.OKFangXiangPt_SuccessFlag = findFlag;
}
std::string roadData = cg->MapPoint_Road_Code;
if(roadData == "")
{
roadData = RTKKM3.MapRoad_Name;
}
roadData = Tools::replace(roadData, "+", ""); // [rfReplaceAll]
if(roadData != "")
{
//如果路段发生变化了(如果持续3帧不同可以认为路口项目结束了
if(roadData != m_itemv.Step3RoadData)
{
bool OKFlag = true;
for(int i = 1; i <= 2; i++)
{
TChuanGan* cgi = m_car->historyChuanGan(i);
roadData = cgi->MapPoint_Road_Code;
if(roadData == "")
{
roadData = cgi->RTKKM3.MapRoad_Name;
}
roadData = Tools::replace(roadData, "+", ""); //, [rfReplaceAll]
if(roadData == m_itemv.Step3RoadData)
{
OKFlag = false;
break;
}
}
if(OKFlag == true)
{
m_exam->TestPro = ItemProFlagEnd;
flagEndJudge();
return;
}
}
}
}
//ToDo:贵州地区的信号灯评判
if(ksdd == siteof::guizhoubj)
{
//ToDo:贵州地区的红绿灯通信数据
}
//ToDo: 等待控制线,需要结合红绿灯信号 (暂时不实现)
//0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119
//RTKKM3.CrossLineAttr = 3 。
//ToDo:暂时屏蔽观察类算法,后期实现
//状态提示
std::string str = "";
std::vector<std::string> xhd = Tools::split(sor.xhd, ",");
if(ksdd == siteof::nmgcfkm3 && xhd.size() > 0 && xhd[0] == m_exam->ItemSNO)
{
char buf[128] = {0};
SafeSprintf(buf, sizeof(buf), "%s;St=%d;Cs=%0.2f,xhd=%s",
m_exam->ItemSNO.c_str(), m_exam->Gps_Itemno1, gps.sd, sor.xhd.c_str());
str += buf;
}
else
{
char buf[128] = {0};
SafeSprintf(buf, sizeof(buf), "%s;St=%d;Cs=%0.2f",
m_exam->ItemSNO.c_str(), m_exam->Gps_Itemno1, gps.sd);
str += buf;
}
//替换为 flagEndJudge();
str += msg;
showStatus(str);
}
void Sub3Judge05Lkzx::flagEndJudge()
{
if(m_exam->TestPro == ItemProFlagEnd)
{
if(m_itemv.LuK_Fx_PointNo > 0)
{
if(m_itemv.OKFangXiangPt_SuccessFlag == false && m_itemv.ReadNextLuDuanFlag == true)
{
JUDGE_MARK_SUB3(5, "41", true);
}
}
}
}
void Sub3Judge05Lkzx::JudgeFXD()
{
return;
}