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

401 lines
13 KiB
C++
Raw Normal View History

2025-03-26 16:56:51 +08:00
#include "Sub3Judge06Rxhd.h"
#include "HFactory.h"
Sub3Judge06Rxhd::Sub3Judge06Rxhd()
{
m_exam = __NEW__(TKM3Item);
}
Sub3Judge06Rxhd::~Sub3Judge06Rxhd()
{
__DELETE__(m_exam);
}
bool Sub3Judge06Rxhd::dealJudgeEnter()
{
if(m_exam->TestPro != ItemProFlagInit) return false;
// if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return false;
const TChuanGan* cg = m_car->historyChuanGan();
const std::string& ksdd = TableSysSet->get211();
setSeed(cg->real.gps.sj);
int TempJL = m_itemv.last_jl; //注意:这里要备份出来
m_itemv = TSub3Item06Rxhd();
m_itemv.Status = 1;
m_itemv.last_jl = TempJL;
//进入项目时刻的累计距离
m_itemv.tmpljjl = cg->ai_ljjl;
//SysSet[512]-->3 学校、公交、人行横道模拟项目是否语音0不需要 1需要
const std::vector<std::string>& s512 = TableSysSet->asArray512();
m_itemv.WavKind = s512.size() > 2 && s512[2] != "" ? std::atoi(s512[2].c_str()) : 0;
//SysSet[509]:7
//连续的人行横道间隔不超过30米不需判断减速
const std::vector<std::string>& s509 = TableSysSet->asArray509();
m_itemv.tmp_jskf = s509.size() > 6 && s509[6] != "" ? std::atoi(s509[6].c_str()) : 0;
m_itemv.tmp_xmjl = 500; //厘米
if(ksdd == siteof::dehongkm3) //特殊地点版本
{
m_itemv.tmp_xmjl = 3000;
}
if(ksdd == siteof::nj || ksdd == siteof::njdckm3)
{
//ToDo:语音提示:通过人行横道
m_itemv.tmp_xmjl = 8000; //厘米
}
else
{
if(m_itemv.WavKind == 1)
{
//ToDo:语音提示:通过人行横道
}
}
m_itemv.tmp_xrtg = true; //行人通过标志
if(m_exam->Gps_Itemno1 == 1)
{
//进项目,评判车速
m_itemv.Status = 2;
m_itemv.tmp_ljjlcm = cg->ai_ljjl_cm; //20140730
}
//SysSet[334]:1 人行横道随机提示有行人通过(随机提示比例0~10)
const std::vector<std::string>& s334 = TableSysSet->asArray334();
if(s334.size() > 0 && s334[0] != "")
{
//Randomize;
//a = Random(10) + 1; //1-10
int a = random2(1, 10);
if(a <= std::atoi(s334[0].c_str())) //20180823
{
m_itemv.tmp_xrtg = false;
//Todo:语音提示:有行人通过
m_car->createEventSound({itemNo(), sound::sub3_410002});
}
else
{
m_itemv.tmp_xrtg = true;
}
}
//得到减速类型
//SysSet[522]:
//(*
//522路口和人行横道项目减速设置第一个分号前是路口设置第二个分号是人行横道设置。
//每个项目里的第一个逗号表示减速类型第二逗号表示速度要求阀值减速类型2和3时有效
//减速类型:
//*)
const std::vector<std::vector<std::string>>& s522 = TableSysSet->asArray2_522();
if(s522.size() > 1)
{
const std::vector<std::string>& s = s522[1];
//减速类型
m_itemv.jiansu_leixing = s.size() > 0 && s[0] != "" ? std::atoi(s[0].c_str()) : 0;
//速度阈值
m_itemv.jiansu_sudu = s.size() > 1 && s[1] != "" ? std::atoi(s[1].c_str()) : 30;
}
if(m_itemv.jiansu_leixing > 4)
m_itemv.jiansu_leixing = 0;
m_exam->TestPro = ItemProFlagJudge;
//ToDo2:生成进项目事件
return true;
}
void Sub3Judge06Rxhd::dealJudgeItem()
{
HELP_COST_TIME("");
if(m_exam->TestPro != ItemProFlagJudge) return;
2025-05-09 12:01:14 +08:00
if(!judgeAllowable()) return;
2025-03-26 16:56:51 +08:00
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const std::string& ksdd = TableSysSet->get211();
//南京地区需要有脚刹车动作
if(!m_itemv.b_Jsc)
{
if(sor.jsc == SYES)
m_itemv.b_Jsc = true;
}
//20170415
if(ksdd == siteof::dehongkm3)
{
if((cg->ai_ljjl_cm - m_itemv.tmp_ljjlcm) >= m_itemv.tmp_xmjl)
{
if(CheckJL_ShaChe(40) == false)
{
//不按规定减速慢行
JUDGE_MARK_SUB3(6, "02", false); //20160928
}
m_exam->TestPro = ItemProFlagEnd;
return;
}
return;
}
if(m_itemv.Status == 1)
{
if(ksdd == siteof::guizhou || ksdd == siteof::guizhouas)
{
if(!m_itemv.tmp_xrtg)
{
if(m_itemv.tcsj == 0)
{
if(cg->move == moveStop)
m_itemv.tcsj = cg->tkCnt;
}
else
{
if(cg->tkCnt - m_itemv.tcsj > 5*SECOND)
{
//ToDo:语音播报:行人已通过
m_itemv.tmp_xrtg = true;
m_car->createEventSound({itemNo(), sound::sub3_410003});
}
else
{
if(cg->move != moveStop)
m_itemv.tcsj = 0;
}
}
}
}
else
{
if(m_itemv.tmp_xrtg == false && cg->move == moveStop)
{
m_itemv.tmp_xrtg = true;
if(m_car->historyMoveState(1) != moveStop)
{
//ToDo:语音播报:行人已通过
m_car->createEventSound({itemNo(), sound::sub3_410003});
}
}
}
//GPS进入下一阶段
if(m_exam->Gps_Itemno1 == 1)
{
m_itemv.Status = 2;
m_itemv.tmp_ljjlcm = cg->ai_ljjl_cm; //20140730
return;
}
}
else if(m_itemv.Status == 2)
{
m_itemv.Status = 3;
//行人正在通过人行横道线
if(!m_itemv.tmp_xrtg)
{
JUDGE_MARK_SUB3(6, "03", true);
}
//20181016 20190219 20190305
bool b_jsfk = true;
if(m_itemv.tmp_jskf == 1)
{
if(cg->ai_ljjl - m_itemv.last_jl < 50)
b_jsfk = false;
}
if(ksdd == siteof::GXWZKM3 || ksdd == siteof::NMGTLKM3 || ksdd == siteof::guizhou || ksdd == siteof::guizhouas)
{
if(ksdd == siteof::guizhouas)
{
if(CheckJL_ShaChe(40) == false)
JUDGE_MARK_SUB3(6, "02", false);
if(CheckJL_CS(30) == false)
JUDGE_MARK_SUB3(20, "38", false);
}
else
{
if(CheckJL_ShaChe(40) == false || CheckJL_CS(30) == false)
JUDGE_MARK_SUB3(6, "02", false);
}
}
else if(ksdd == siteof::njdckm3)
{
if(CheckJL_ShaChe(100) == false)
JUDGE_MARK_SUB3(6, "02", false);
}
else if(b_jsfk)
{
//不按规定减速慢行
if(ksdd != siteof::nj)
{
if(m_itemv.jiansu_leixing > 0)
{
if(m_itemv.jiansu_leixing == 1)
{
if(CheckJL_ShaChe(30) == false)
{
JUDGE_MARK_SUB3(6, "02", false);
}
}
else if(m_itemv.jiansu_leixing == 2)
{
if(CheckJL_CS(30, m_itemv.jiansu_sudu) == false)
JUDGE_MARK_SUB3(6, "02", false);
}
else if(m_itemv.jiansu_leixing == 3)
{
if(CheckJL_ShaChe(30) == false)
{
JUDGE_MARK_SUB3(6, "02", false);
}
else
{
if(CheckJL_CS(30, m_itemv.jiansu_sudu) == false)
JUDGE_MARK_SUB3(6, "02", false);
}
}
else if(m_itemv.jiansu_leixing == 4)
{
if(CheckJL_CS(30, 2) == false)
JUDGE_MARK_SUB3(6, "02", false);
}
}
else
{
TTestCtl* ctl = m_car->getTTestCtl();
if(ctl->JianSuLeiXing == 2) //20190411
{
if(CheckJL_CheShu_New(30) == false)
JUDGE_MARK_SUB3(6, "02", false);
}
else
{
if(CheckJL_ShaChe(30) == false)
{
//判断车速
if(ctl->JianSuLeiXing == 1) //if(m_itemv.jiansu_leixing == 1)
{
if(CheckJL_CS(30) == false)
{
JUDGE_MARK_SUB3(6, "02", false);
}
}
else
{
//20180412 30米是否有停车状态如有停车则不扣
JUDGE_MARK_SUB3(6, "02", false); //20160928
}
}
}
}
}
}
//夜间不切换远近光灯 20171006
TKM3Item* item13 = m_car->findExamItem(Sub3ItemType13Yjxs);
bool FindFlag = item13 && item13->Item_Color == itemStateZk;
TCar* tcar = m_car->getTCar();
if((FindFlag == true) || (tcar->Night_ID && TableSysSet->get323() == "3") || (ksdd == siteof::sz111)) //20150130
{
const std::string& TempTXT2 = m_exam->Txt2;
2025-04-01 17:53:30 +08:00
//TKM3Item* item05 = m_car->findExamItem(Sub3ItemType05Lkzx);
//FindFlag = item05 && item05->TestPro == ItemProFlagIdle; //20140902
FindFlag = true;
if(m_car->itemsSomeExaming2(Sub3ItemType05Lkzx) ||
m_car->itemsSomeExaming2(Sub3ItemType15Lkzz) ||
m_car->itemsSomeExaming2(Sub3ItemType16Lkyz) ||
(m_car->itemsSomeExaming2(Sub3ItemType12Dtxx) &&
m_car->findExamItem(Sub3ItemType12Dtxx)->EnterItemFromLuKou5))
2025-03-26 16:56:51 +08:00
{
2025-04-01 17:53:30 +08:00
FindFlag = false;
2025-03-26 16:56:51 +08:00
}
2025-04-01 17:53:30 +08:00
int jl = TempTXT2 != "" ? std::atoi(TempTXT2.c_str()) : 80; //20140902
if(FindFlag == true && !CheckJL_YJG(jl)) //不在路口内的人行横道
2025-03-26 16:56:51 +08:00
{
2025-04-01 17:53:30 +08:00
//20171006
if(ksdd == siteof::sz111)
2025-03-26 16:56:51 +08:00
{
2025-04-01 17:53:30 +08:00
JUDGE_MARK_SUB3(41, "03", false);
}
else
{
JUDGE_MARK_SUB3(13, "03", false);
2025-03-26 16:56:51 +08:00
}
}
}
}
else if(m_itemv.Status == 3)
{
//结束项目
if(cg->ai_ljjl_cm - m_itemv.tmp_ljjlcm >= m_itemv.tmp_xmjl)
{
if(ksdd == siteof::nj)
{
if(!m_itemv.b_Jsc)
{
JUDGE_MARK_SUB3(6, "02", false);
}
}
m_itemv.last_jl = cg->ai_ljjl;
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
std::string str1, str2;
switch(m_itemv.Status)
{
case 1 : str1 = JUDGE_UTF8S("1-进项目到人行横道之前"); break;
case 2 : str1 = JUDGE_UTF8S("2-经过人行横道线"); break;
case 3 : str1 = JUDGE_UTF8S("3-等待项目结束"); break;
default: break;
}
//得到减速类型
switch(m_itemv.jiansu_leixing)
{
case 1 : str2 = JUDGE_UTF8S("刹车"); break;
case 2 : str2 = JUDGE_UTF8S("小于规定车速"); break;
case 3 : str2 = JUDGE_UTF8S("刹车+小于规定车速"); break;
case 4 : str2 = JUDGE_UTF8S("降过速"); break;
default: break;
}
char buf[256] = {0};
SafeSprintf(buf, sizeof(buf), JUDGE_UTF8S("St:%d-->%s-->减速类型=%s"),
m_itemv.Status, str1.c_str(), str2.c_str() );
showStatus(std::string(buf));
NS3JudgeVision_41002();
}
void Sub3Judge06Rxhd::NS3JudgeVision_41002()
{
//不观察左、右方交通情况
//通过人行横道线前10s内头部姿态没有大于左侧角度【18度】或大于右侧角度【20度】
if(!NS3UsingAndData(NS3UsingPose)) return;
int64 nowTime = m_car->GetCurrentTime2();
const TNS3PoseSysset& poseSys = m_nsub3->getPoseSysset();
const TVisionPose* pose0 = m_nsub3->hisPose(0);
if(pose0->zy < -poseSys.left || pose0->zy > poseSys.right)
{
m_itemv.observe.obsTime = nowTime;
}
const TRTKResult& RTKKM3_0 = m_car->historyRtkKM3(0);
const TRTKResult& RTKKM3_1 = m_car->historyRtkKM3(1);
bool opportunity = RTKKM3_0.InShapeAttr == InShapeAttr_1 &&
RTKKM3_1.InShapeAttr != InShapeAttr_1;
if(opportunity && !m_itemv.observe.isJudge)
{
m_itemv.observe.isJudge = true;
if(nowTime - m_itemv.observe.obsTime > 10*SECOND)
{
JUDGE_MARK_NSUB3(6, "01", false);
}
}
}