subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge05Lkzx.cpp
2024-08-26 16:07:11 +08:00

500 lines
16 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
JudgeFlagEnd();
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;
JudgeFlagEnd();
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[TURN_Z] != TURN_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[TURN_Z] != TURN_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;
JudgeFlagEnd();
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;
JudgeFlagEnd();
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;
}
//替换为 JudgeFlagEnd();
str += msg;
showStatus(str);
}
void Sub3Judge05Lkzx::JudgeFlagEnd()
{
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;
}