subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp
2025-04-07 09:00:36 +08:00

1632 lines
54 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 "Sub3Judge11Kbtc.h"
#include "HFactory.h"
Sub3Judge11Kbtc::Sub3Judge11Kbtc()
{
m_exam = __NEW__(TKM3Item);
}
Sub3Judge11Kbtc::~Sub3Judge11Kbtc()
{
__DELETE__(m_exam);
}
bool Sub3Judge11Kbtc::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();
m_car->setPubCanJudge_XiHuoFlag(true);
m_car->setPubKaoBianTCFinish_LJJL(0);
m_itemv = TSub3Item11Kbtc();
//得到靠边停车的项目距离
const std::vector<std::string>& s505 = TableSysSet->asArray505();
m_itemv.parm_xmjl = s505.size() > 5 && s505[5] != "" ? std::atoi(s505[5].c_str()) : 150; //strtointdef(getdotstr(6, sysset[505], ','), 150);
//项目设定项目距离
//SysSet[523]:靠边停车按每个项目设定项目距离
const std::vector<std::vector<std::string>>& s523 = TableSysSet->asArray2_523();
if(!s523.empty())
{
for(size_t i = 0; i < s523.size(); i++)
{
const std::vector<std::string>& ss523 = s523[i];
if(ss523.empty()) continue;
const std::string& str1 = ss523.size() > 0 && ss523[0] != "" ? ss523[0] : "";
const std::string& str2 = ss523.size() > 1 && ss523[1] != "" ? ss523[1] : "";
const std::string str = std::to_string(m_exam->ItemNo) + "~" + m_exam->SubName;
if(str1 == str)
{
int xmjl = str2.length() > 0 ? std::atoi(str2.c_str()) : 0;
if(xmjl > 0)
{
m_itemv.parm_xmjl = xmjl;
}
}
}
}
if(IS_C1(m_carType) || IS_C2(m_carType))
{
if(m_itemv.parm_xmjl > 150)
{
m_itemv.parm_xmjl = 150;
}
}
if(ksdd == siteof::njdckm3)
{
m_itemv.parm_xmjl = 350;
}
//靠边停车误差CM
if(ksdd == siteof::changzhoukm3)
{
m_itemv.kbtcwc = 5;
}
m_itemv.PPFXD = s505.size() > 4 && s505[4] != "" ? std::atoi(s505[4].c_str()) : 1; //strtointdef(getdotstr(5, sysset[505], ','), 1);
m_itemv.parm_Rtk_Ag = s505.size() > 1 && s505[1] != "" ? std::atoi(s505[1].c_str()) : 0; //strtointdef(getdotstr(2, sysset[505], ','), 0); //20151013
//如果设置了角度变化评判方向灯,但是阈值不对,把评判方向灯方式改成:停车时刻
if(m_itemv.PPFXD == 0 && m_itemv.parm_Rtk_Ag <= 0.001)
{
m_itemv.PPFXD = 1;
m_itemv.parm_Rtk_Ag = 0;
}
//打方向灯需要3秒
m_itemv.parm_Fxd3s = 3 * SECOND; //round(strtofloat(readiniparam('综合评判', 'fxdyc3s', '3')) * 1000);
//靠边停车项目总时间
double s505_2 = s505.size() > 2 && s505[2] != "" ? std::atof(s505[2].c_str()) : 0;
m_itemv.parm_ZSj = std::round(s505_2 * SECOND); //round(strtofloatdef(getdotstr(3, sysset[505], ','), 0) * 1000);
//进入时刻的时间
m_itemv.Entet_SJ = cg->tkCnt;
//允许停车时间秒,必须在这个时间内拉手刹陕西汉中、黑龙江省大庆需求
int s505_3 = s505.size() > 3 && s505[3] != "" ? std::atoi(s505[3].c_str()) : 180;
m_itemv.Parm_HanZhong_KBTC_SJ = s505_3 * SECOND; //strtointdef(getdotstr(4, sysset[505], ','), 180) * 1000;
//停车后,多长时间内必须开车门,单位:秒
int s505_8 = s505.size() > 8 && s505[8] != "" ? std::atoi(s505[8].c_str()) : 3600;
m_itemv.Parm_TC_KaiCheMen_ShiJian = s505_8 * SECOND; //strtointdef(getdotstr(9, sysset[505], ','), 3600) * 1000;
//开门后多长时间自动进入Status6( 关门处理阶段)
m_itemv.parm_KaiMen_Status6 = 15;
//特殊地点版本处理
if(ksdd == siteof::shanghaikm3 && IS_C5(m_carType))
{
m_itemv.parm_KaiMen_Status6 = 210;
}
//大车夜考相关的 大车夜间模式0不启用 1启用不判靠边距离
TCar* tcar = m_car->getTCar();
if(tcar->Night_ID == true)
{
if(IS_A1A2A3B1B2C6(m_carType))
{
m_itemv.dcykkb = s505.size() > 6 && s505[6] != "" ? std::atoi(s505[6].c_str()) : 0; //strtointdef(getdotstr(7, sysset[505], ','), 0);
}
}
if(Tools::tolower(ksdd) == siteof::chongqingkm3)
{
if(tcar->Night_ID == true)
{
if(IS_A1A2A3B1B2(m_carType))
{
m_itemv.dcykkb = 1;
}
}
}
//允许停车车道默认0只能停最右车道以路边线算距离如果设置了此参数则在设置的车道范围内都可以停车以车道距离来计算。暂时保定地区启用。
m_itemv.Parm_BaoDing_TC_CheDaoJuLi = s505.size() > 7 && s505[7] != "" ? std::atoi(s505[7].c_str()) : 0;
if(m_itemv.Parm_BaoDing_TC_CheDaoJuLi == 0 && (ksdd == siteof::bdgaoyangkm3 || ksdd == siteof::sxbjxc))
{
m_itemv.Parm_BaoDing_TC_CheDaoJuLi = 10;
}
//进入时刻的当前距离,米
m_itemv.Enter_ljjl = cg->ai_ljjl;
//计次,控制语音用的
m_itemv.jscnt = 1;
//ToDo2:生成进项目事件
//ToDo:语言播报-->请靠边停车
m_exam->TestPro = ItemProFlagJudge;
return true;
}
void Sub3Judge11Kbtc::dealJudgeItem()
{
HELP_COST_TIME("");
if(m_exam->TestPro != ItemProFlagJudge) return;
//if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return;
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const std::string& ksdd = TableSysSet->get211();
m_car->setPubCanJudge_XiHuoFlag(m_itemv.Status < 3);
//特殊地区功能1
if(ksdd == siteof::nj || ksdd == siteof::njdckm3)
{
if(cg->tkCnt - m_itemv.Entet_SJ >= 2000 && cg->tkCnt - m_itemv.Entet_SJ < 2600) //(m_car->GetCurrentTick2() - m_itemv.Entet_SJ >= 2000 && m_car->GetCurrentTick2() - m_itemv.Entet_SJ < 2600)
{
m_itemv.Enter_ljjl = cg->ai_ljjl;
}
}
if(ksdd == siteof::nj)
{
TKM3Item* item = m_car->findExamItem(Sub3ItemType05Lkzx); //直行路口
if(item && item->Item_Color == itemStateZk)
{
if(m_itemv.parm_xmjl < 250)
{
m_itemv.parm_xmjl = 250;
}
}
}
//特殊地区功能2
if(ksdd == siteof::hbwh)
{
if(IS_A1A2A3B1B2(m_carType))
{
if(cg->tkCnt - m_itemv.Entet_SJ >= 2000 && cg->tkCnt - m_itemv.Entet_SJ < 3000) //(GetCurrentTick2() - m_itemv.Entet_SJ >= 2000) and (GetCurrentTick2() - m_itemv.Entet_SJ < 3000) then
{
m_itemv.Enter_ljjl = cg->ai_ljjl;
}
}
}
//到达项目距离不停车
if(cg->ai_ljjl - m_itemv.Enter_ljjl > m_itemv.parm_xmjl && cg->move == moveForward)
{
//未按语音指令在规定的距离内停车
JUDGE_MARK_SUB3(11, "41", true); //20160928
m_exam->TestPro = ItemProFlagEnd;
return;
}
//20160613 商丘
if(m_itemv.parm_ZSj > 0)
{
if(cg->tkCnt - m_itemv.Entet_SJ >= m_itemv.parm_ZSj)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
}
}
//拉手刹前,放松脚刹
if(ksdd == siteof::changzhoukm3)
{
//0-播报语音 1-语音结束,开始评判 到停车前 2-停车了但未确认,可能继续行驶 3-确认停车了 4-下车评判
if(m_itemv.Status == 2 || m_itemv.Status == 3 || m_itemv.Status == 4)
{
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
const TSensorInfo& sor4 = m_car->historySensor(4);
const TSensorInfo& sor5 = m_car->historySensor(5);
//拉手刹前,脚刹松开了
if(sor.jsc == SNOT && sor1.jsc == SNOT && sor2.jsc == SNOT && sor3.jsc == SNOT && sor4.jsc == SNOT && sor5.jsc == SNOT &&
cg->move == moveStop && his1->move == moveStop && sor.dw == 0)
{
if(sor.ssc == SNOT) //0表示手刹放下 1-表示拉起来状态
{
if(!IS_C2(m_carType))
{
m_itemv.Kf06 = true;
//Mark(11, '06', false);
}
}
}
}
}
else
{
//拉手刹前,脚刹松开了
if(m_itemv.Status == 2 || m_itemv.Status == 3 || m_itemv.Status == 4)
{
const TSensorInfo& sor1 = m_car->historySensor(1);
if(sor.ssc == SYES && sor1.ssc == SNOT)
{
if(sor.jsc == SNOT && sor1.jsc == SNOT)
{
if(!m_itemv.Kf06)
{
m_itemv.Kf06 = true;
//拉紧驻车制动器前放松行车制动踏板
JUDGE_MARK_SUB3(11, "06", false);
}
}
}
}
}
//0-播报语音 1-语音结束,开始评判 到停车前 2-停车了但未确认,可能继续行驶 3-确认停车了 4-下车评判
switch (m_itemv.Status)
{
case 0: DoStatus_0(); break; //语音播报阶段
case 1: DoStatus_1(); break;
case 2: DoStatus_2(); break;
case 3: DoStatus_3(); break; //停车位置已确认,开始评判
case 4: DoStatus_4(); break; //下车过程评判开始
case 5: DoStatus_5(); break; //关门进入下一步动作
case 6: DoStatus_6(); break; //关门后处理
case 100: DoStatus_100(); break; //结束项目处理
default: TASSERT(false, ""); break;
}
char buf[256]= {0};
SafeSprintf(buf, sizeof(buf), JUDGE_UTF8S("ST:%d,距离=%d"), m_itemv.Status, cg->ai_ljjl - m_itemv.Enter_ljjl);
showStatus(buf);
NS3JudgeVision_40601();
NS3JudgeVision_40604();
}
void Sub3Judge11Kbtc::DoStatus_0()
{
bool OKFlag = false;
if(TableSysSet->get211() != siteof::sccdcz)
{
OKFlag = true;
}
else
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TChuanGan* his3 = m_car->historyChuanGan(3);
if(cg->move == moveForward && his1->move == moveForward && his2->move == moveForward && his3->move == moveForward)
{
OKFlag = true;
}
}
if(OKFlag == true)
{
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
//0-播报语音 1-语音结束,开始评判 到停车前 2-停车了但未确认,可能继续行驶 3-确认停车了 4-下车评
m_itemv.Status = 1;
//播报完声音,初始化
m_itemv.Enter_ljjl = cg->ai_ljjl;
m_itemv.Enter_Rtk_Ag = gps.hxj; //20151013
m_itemv.Enter_Tk = cg->tkCnt;
}
}
void Sub3Judge11Kbtc::DoStatus_1()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor = cg->real.sensor;
const TGpsInfo& gps = cg->real.gps;
const std::string& ksdd = TableSysSet->get211();
m_itemv.Kf06 = false; // 20170310
//停车语音提示
//方向灯标志
if(sor.yfxd == SYES && sor.zfxd == SNOT)
{
if(!m_itemv.yfxd)
{
m_itemv.yfxd = true;
m_itemv.yfxd_tk = cg->tkCnt;
}
if(m_itemv.yfxd_tk != 0)
{
if(cg->tkCnt - m_itemv.yfxd_tk > m_itemv.parm_Fxd3s)
{
m_itemv.yfxd3s = true;
}
}
}
else
{
if(!m_itemv.yfxd3s)
{
m_itemv.yfxd_tk = 0;
}
}
if(cg->move == moveForward && his1->move == moveForward)
{
if(m_itemv.PPFXD == 0)
{
double lsjd = 0.0;
if(m_itemv.Enter_Rtk_Ag + m_itemv.parm_Rtk_Ag > 360.0)
{
if(gps.hxj < 90.0)
{
lsjd = std::abs(360 - m_itemv.Enter_Rtk_Ag + gps.hxj);
}
else
{
lsjd = std::abs(gps.hxj - m_itemv.Enter_Rtk_Ag);
}
}
else
{
lsjd = std::abs(gps.hxj - m_itemv.Enter_Rtk_Ag);
}
if(m_itemv.HasJudgeFXD == false)
{
if(std::abs(lsjd) >= m_itemv.parm_Rtk_Ag)
{
m_itemv.HasJudgeFXD = true;
//评判方向灯
if(!m_itemv.yfxd)
{
//停车前不使用转向灯
JUDGE_MARK_SUB3(11, "42", false);
}
else
{
if(!m_itemv.yfxd3s)
{
//方向灯少于3秒
JUDGE_MARK_SUB3(11, "43", false);
}
}
}
}
}
}
//停车进入下一阶段 20171013 排除熄火状态 20171020
if(cg->move == moveStop && his1->move == moveStop) //增加了前一个信号也是停车状态 20140707 20171019
{
if(ksdd == siteof::xjcj_hm && !IS_C2(m_carType) && !IS_C5(m_carType)) //20190215
{
const TSensorInfo& sor = m_car->historySensor(2);
//车辆运行速度和挡位不匹配
if(sor.dw != 1 && sor.dw != 2) //not (lscg[zj(2)].ai_dw in [1, 2]) then
{
JUDGE_MARK_SUB3(14, "02", true);
}
}
// (*
// if(cg.ai_fdjzs > 200) or ((car.kscx = 'C5') or (car.kscx = 'C2')) then
// {
// //m_itemv.zdtc := true;
// }
// *)
//先看505参数 然后看 按430参数确认靠边确认靠边后再扣
// if(m_itemv.HasJudgeFXD == false)
// {
// m_itemv.HasJudgeFXD = true;
// //评判方向灯
// if(!m_itemv.yfxd)
// {
// //停车前不使用转向灯
// JUDGE_MARK_SUB3(11, "42", false);
// }
// else
// {
// if(!m_itemv.yfxd3s)
// {
// //方向灯少于3秒
// JUDGE_MARK_SUB3(11, "43", false);
// }
// }
// }
m_itemv.Status = 2;
m_itemv.TCZT_Tk = cg->tkCnt;
m_itemv.Enter_Tk = cg->tkCnt; //20151119
//停车拉手刹相关(汉中需求)
m_itemv.tclssjs = cg->tkCnt; //20170223
//停车拉手刹次数
m_itemv.tclsscnt = 0; //20170223
if(!m_itemv.yfxd && sor.yfxd == SYES)
{
m_itemv.yfxd = true;
m_itemv.yfxd_tk = cg->tkCnt;
}
}
}
void Sub3Judge11Kbtc::DoStatus_2()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = his1->real.sensor;
const std::string& ksdd = TableSysSet->get211();
//特殊地点版本处理
if(ksdd == siteof::shanghaikm3)
{
//方向灯标志
if(!m_itemv.yfxd && sor.yfxd == SYES)
{
m_itemv.yfxd = true;
m_itemv.yfxd_tk = cg->tkCnt;
}
if(m_itemv.yfxd == true && m_itemv.yfxd3s == false && cg->tkCnt - m_itemv.yfxd_tk >= m_itemv.parm_Fxd3s && sor.yfxd == SYES)
{
m_itemv.yfxd3s = true;
}
}
//靠边停车评判距离的次数
m_itemv.kbtccs = 0; //20180317
//20171030
//靠边停车确认停车条件0-拉手刹放空挡或拉手刹动作或开车门或解开安全带 1-拉手刹同时置空档 2-停车就判 3-开车门才判)
const std::string& s430 = TableSysSet->get430();
if(s430 == "2")
{
m_itemv.Status = 3;
return;
}
//特殊地点处理2
if(ksdd == siteof::linxiahz)
{
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TChuanGan* his3 = m_car->historyChuanGan(3);
const TChuanGan* his4 = m_car->historyChuanGan(4);
const TChuanGan* his5 = m_car->historyChuanGan(5);
const TChuanGan* his6 = m_car->historyChuanGan(6);
if(cg->move == moveBackward && (sor.dw < 1 || sor.dw > 5) &&
his1->move == moveBackward && his2->move == moveBackward &&
his3->move == moveBackward && his4->move == moveBackward &&
his5->move != moveBackward && his6->move != moveBackward)
{
JUDGE_MARK_SUB3(11, "45", false);
}
}
if(cg->move == moveForward && his1->move == moveForward)
{
const std::vector<std::string>& s505 = TableSysSet->asArray505();
int s505_9 = s505.size() > 9 && s505[9] != "" ? std::atoi(s505[9].c_str()) : 0;
if(ksdd == siteof::sccdcz || ksdd == siteof::ankang)
{
//在前后无干扰条件下停车后,再次挪动车辆
JUDGE_MARK_SUB3(11, "11", false);
m_itemv.Status = 1;
return;
}
else if(ksdd == siteof::ynyx || ksdd == siteof::sxbjxc || ksdd == siteof::sxbjdc || s505_9 == 1)
{
if(cg->tkCnt - m_itemv.TCZT_Tk > 3000)
{
//在前后无干扰条件下停车后,再次挪动车辆
JUDGE_MARK_SUB3(11, "11", false);
}
m_itemv.Status = 1;
return;
}
else
{
if(ksdd == siteof::sccd) //20151230
{
m_itemv.Status = 3;
return;
}
else
{
m_itemv.Status = 1;
return;
}
}
}
//特殊地区处理
if(ksdd == siteof::hnpy)
{
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TChuanGan* his3 = m_car->historyChuanGan(3);
if(cg->move == moveBackward && his1->move == moveBackward && his2->move == moveStop && his3->move == moveStop)
{
//在前后无干扰条件下停车后,再次挪动车辆
JUDGE_MARK_SUB3(11, "11", false);
}
}
//特殊地区处理
if(ksdd == siteof::JXNC)
{
if(cg->tkCnt - m_itemv.tclssjs > m_itemv.Parm_HanZhong_KBTC_SJ)
{
m_itemv.Status = 3;
return;
}
}
//靠边停车确认停车条件0-拉手刹放空挡或拉手刹动作或开车门或解开安全带 1-拉手刹同时置空档 2-停车就判 3-开车门才判)
if(s430 == "3") //开车门
{
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SNOT && sor3.mkg == SNOT)
{
m_itemv.Status = 3;
return;
}
}
else if(s430 == "1") //拉手刹放空挡
{
//20180625
if(sor.ssc == SYES && sor.dw == 0)
{
m_itemv.Status = 3;
return;
}
}
else
{
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
//拉手刹放空挡 或 拉手刹动作 或 开车门 或 解开安全带 进入下一阶段
if((sor.ssc == SYES && sor.dw == SNOT) ||
(sor.ssc == SYES && sor1.ssc == SYES && sor2.ssc == SYES) ||
(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES && sor3.mkg == SNOT) ||
(sor.aqd == SNOT && sor1.aqd == SNOT && sor2.aqd == SNOT && sor3.aqd == SYES)) //20180130
{
m_itemv.Status = 3;
return;
}
if(ksdd == siteof::hnay)
{
if(sor.ssc == SYES)
{
m_itemv.Status = 3;
return;
}
}
//20170223
if(ksdd == siteof::gdmm) //广东茂名
{
if(cg->tkCnt - m_itemv.tclssjs > 10 * SECOND)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
m_exam->TestPro = ItemProFlagEnd;
return;
}
else
{
if(((cg->tkCnt - m_itemv.tclssjs) / 4000) != m_itemv.tclsscnt && m_itemv.tclsscnt < 2)
{
//ToDo:语音提示-->请继续完成考试
m_itemv.tclsscnt++; //inc(m_itemv.tclsscnt);
m_car->createEventSound({itemNo(), sound::sub3_406005});
}
}
}
}
//20170504
if(ksdd == siteof::zhoukou)
{
if(cg->tkCnt - m_itemv.tclssjs > 60 * SECOND)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
}
void Sub3Judge11Kbtc::DoStatus_3()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = his1->real.sensor;
const std::string& ksdd = TableSysSet->get211();
//特殊地点版本翻译
if(ksdd == siteof::sxbjxc)
{
int wayNo = m_car->wayNo();
if(m_car->wayNo() == 1)
{
if(cg->RTKKM3.BasePointInLaneNo != 2)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
}
}
else if(wayNo == 2)
{
if(cg->RTKKM3.BasePointInLaneNo != 2)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
}
}
else if(wayNo == 3)
{
if(cg->RTKKM3.BasePointInLaneNo != 1)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
}
}
}
if(ksdd == siteof::ynyx)
{
if(sor.yfxd == SYES && sor1.yfxd == SYES)
{
//操作完成后不关闭转向灯
JUDGE_MARK_SUB3(20, "71", true);
}
}
if(m_itemv.dcykkb == 0 || ksdd != siteof::hbwh)
{
if(!m_itemv.HasJudgeFXD)
{
m_itemv.HasJudgeFXD = true;
if(!m_itemv.yfxd)
{
JUDGE_MARK_SUB3(11, "42", false);
}
else
{
if(!m_itemv.yfxd3s)
{
JUDGE_MARK_SUB3(11, "43", false);
}
}
}
}
if(m_car->rtkEnabled())
{
m_itemv.kbtccs = 11;
if(ksdd == siteof::jj && cg->RTKKM3.BaseLaneCount == 0)
{
JUDGE_MARK_SUB3(11, "45", true);
}
if(ksdd == siteof::shanxilinfen && cg->RTKKM3.BaseLaneCount == 0)
{
JUDGE_MARK_SUB3(11, "45", true);
}
if(ksdd == siteof::shenyangkm3 && cg->RTKKM3.BaseLaneCount == 0)
{
JUDGE_MARK_SUB3(11, "45", true);
}
//压路边线
Judge_KBTC_YaXian();
Judge_KBTC_YaXian_Tail(); //A2C6-20250314
}
else
{
//20180531
if(ksdd == siteof::hbtskm3 || ksdd == siteof::lyggy)
m_itemv.kbtccs = 11;
else
m_itemv.kbtccs++; //inc(m_itemv.kbtccs);
}
//信号不好也强制结束
if(m_itemv.kbtccs >= 11)
{
//特殊地点业务翻译
TTestCtl* ctl = m_car->getTTestCtl();
const std::vector<std::string>& s301 = TableSysSet->asArray301();
const std::vector<std::string> s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector<std::string>();
const std::string s301_1_3 = s301_1.size() > 3 && s301_1[3] != "" ? s301_1[3] : "";
if(!ctl->Dw_Cs_Ok1 && s301_1_3 != "0" && ctl->dw_kf_sj == 0 && ksdd == siteof::zjwz)
{
const std::vector<std::vector<std::string>>& s308 = TableSysSet->asArray2_308();
if(!ctl->Dw_Cs_Ok2)
{
const std::vector<std::string> temp = s308.size() > 0 ? s308[0] : std::vector<std::string>(); //getdotstr(1, Sysset[308] + '^', '^');
if(!temp.empty())
{
for(size_t i = 0 ; i < temp.size(); i++)
{
std::string str = temp[i];
if(str == "")
{
break;
}
const std::vector<std::string>& ss = Tools::split(str, ",");
int itemNo = ss.size() > 0 ? std::atoi(ss[0].c_str()) : 0;
std::string serial = ss.size() > 1 ? ss[1] : "";
JUDGE_MARK_SUB3(itemNo, serial.c_str(), false); // JUDGE_MARK_SUB3(StrToInt(GetDotStr(1, str, ',')), GetDotStr(2, str + ',', ','));
}
}
else
{
JUDGE_MARK_SUB3(20, "60", true); //A310 3次
}
}
else
{
const std::vector<std::string> temp = s308.size() > 1 ? s308[1] : std::vector<std::string>();
if(!temp.empty())
{
for(size_t i = 0 ; i < temp.size(); i++)
{
std::string str = temp[i];
if(str == "")
{
break;
}
const std::vector<std::string>& ss = Tools::split(str, ",");
int itemNo = ss.size() > 0 ? std::atoi(ss[0].c_str()) : 0;
std::string serial = ss.size() > 1 ? ss[1] : "";
JUDGE_MARK_SUB3(itemNo, serial.c_str(), false); // JUDGE_MARK_SUB3(StrToInt(GetDotStr(1, str, ',')), GetDotStr(2, str + ',', ','));
}
}
else
{
JUDGE_MARK_SUB3(20, "60", true); //A310
}
}
}
const std::string& s326 = TableSysSet->get326();
//靠边停车后是否进入下车状态评判0-否 1-是)
if(s326 == "1") //进入下车评判过程
{
m_itemv.Status = 4;
m_itemv.Enter_ljjl = cg->ai_ljjl;
//语音提示-->请下车
m_itemv.jscnt = 1; //20170215
m_itemv.TingCheJiShi = cg->tkCnt; //20170215
m_car->createEventSound({itemNo(), sound::sub3_406004});
}
else
{
m_itemv.Status = 100; // 准备结束项目
//20150702 河南要求 河南洛阳车管所科目三靠边停车修改评判要求:夜考时,靠边停车项目在停车后,拉手刹结束前需要评判是否打开视宽灯或把近光灯调成视宽灯。
if(s326 == "2")
{
TKM3Item* item = m_car->findExamItem(Sub3ItemType13Yjxs);
bool OKFlag = (item && item->Item_Color == itemStateZk);
if(OKFlag == true) //夜间驾驶
{
if(sor1.ygd == SYES || sor1.jgd == SYES || sor1.skd == SNOT)
{
JUDGE_MARK_SUB3(11, "09", true); //夜间在路边临时停车不关闭前照灯或不开启式廓灯
}
}
}
if(s326 == "3") //20150924 河南濮阳
{
m_itemv.Status = 7; //根据安全带松了判断结束 20150922
m_itemv.Enter_Tk = cg->tkCnt; //20151113
}
}
}
}
void Sub3Judge11Kbtc::DoStatus_4()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = his1->real.sensor;
const std::string& ksdd = TableSysSet->get211();
//贵州特殊功能1
if(Tools::pos(siteof::guizhou, ksdd))
{
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TChuanGan* his3 = m_car->historyChuanGan(3);
const TChuanGan* his4 = m_car->historyChuanGan(4);
if(cg->move == moveForward && his1->move == moveForward && his2->move == moveForward && his3->move == moveStop && his4->move == moveStop)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
}
if((std::abs(cg->tkCnt - m_itemv.TingCheJiShi) / 20000) >= m_itemv.jscnt && ksdd != siteof::SXHZ && ksdd != siteof::hnay)
{
//计次,控制语音的
m_itemv.jscnt++; //inc(m_itemv.jscnt);
//ToDo:语音提示-->靠边停车完成后,请下车
m_car->createEventSound({itemNo(), sound::sub3_406004});
}
if(ksdd == siteof::zjnb)
{
if(cg->tkCnt - m_itemv.TingCheJiShi > 30*SECOND)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
}
if(std::abs(cg->tkCnt - m_itemv.TingCheJiShi) > m_itemv.Parm_TC_KaiCheMen_ShiJian)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
const TSensorInfo& sor5 = m_car->historySensor(5);
const TSensorInfo& sor6 = m_car->historySensor(6);
const TSensorInfo& sor7 = m_car->historySensor(7);
const TSensorInfo& sor8 = m_car->historySensor(8);
const TSensorInfo& sor9 = m_car->historySensor(9);
const TSensorInfo& sor10 = m_car->historySensor(10);
if(ksdd == siteof::GXWZKM3)
{
if(sor.fdjzs > 0 && sor1.fdjzs > 0 && sor2.fdjzs > 0 && sor5.fdjzs > 0 && sor6.fdjzs == 0 && sor7.fdjzs == 0 && sor10.fdjzs == 0)
{
//因操作不当造成发动机熄火一次
JUDGE_MARK_SUB3(20, "36", false);
}
}
if(ksdd == siteof::hnay)
{
if(sor.fdjzs == 0 && sor1.fdjzs == 0 && sor2.fdjzs == 0 && sor5.fdjzs == 0 &&
sor6.fdjzs == 0 && sor7.fdjzs == 0 && sor8.fdjzs > 0 && sor9.fdjzs > 0 && sor10.fdjzs > 0)
{
if(sor.dw > 0 && sor1.dw > 0)
{
const std::string& s527 = TableSysSet->get527();
if(s527 != "1")
{
//因操作不当造成发动机熄火一次
JUDGE_MARK_SUB3(20, "36", false);
}
m_itemv.chongxindianhuo = true;
m_itemv.chongxindianhuo_tk = cg->tkCnt;
}
if(sor.lhq > 0 && sor1.lhq > 0)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
}
//特殊地点版本
if(m_itemv.chongxindianhuo)
{
if(sor.fdjzs > 500 && sor1.fdjzs > 500 && sor2.fdjzs > 500 && sor5.fdjzs > 500)
{
m_itemv.chongxindianhuo = false;
}
if(cg->tkCnt - m_itemv.chongxindianhuo_tk > 120000)
{
m_itemv.chongxindianhuo_tk = cg->tkCnt;
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
}
else
{
if(sor.dh2 == SYES && sor1.dh2 == SYES && sor2.dh2 == SNOT && sor3.dh2 == SNOT)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
}
}
if((sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES) || (ksdd == siteof::JXNC && sor.mkg == SYES))
{
//20150304
if(Tools::pos(siteof::guizhou, ksdd) || ksdd == siteof::ynzt)
{
if(!m_itemv.bJc)
{
if(m_itemv.bJc2) //20160229
{
//满足条件
m_itemv.bJc = true;
}
else
{
//需要下车的,在打开车门前不回头观察左后方交通情况
JUDGE_MARK_SUB3(11, "02", false);
m_itemv.bJc = true;
}
}
}
if(ksdd == siteof::changzhoukm3)
{
if(m_itemv.Kf06)
{
//拉紧驻车制动器前放松行车制动踏板
JUDGE_MARK_SUB3(11, "06", false);
m_itemv.Kf06 = false;
}
}
if(sor.ssc == SNOT && !m_itemv.Kf05)
{
m_itemv.Kf05 = true; //20160928
//停车后,未拉紧驻车制动器
JUDGE_MARK_SUB3(11, "05", false);
}
if(sor2.mkg == SYES || (ksdd == siteof::JXNC && sor.mkg == SYES)) //连续3帧数据是开门信号才算开门 20140825 and (lscg[zj(5)].di_mkg = 1)
{
if(m_itemv.chongxindianhuo)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", false);
}
TCar* tcar = m_car->getTCar();
//夜考相关的
//2025-02-13 yhy 修改
if(tcar->Night_ID) //if(ksdd == siteof::shanxi && tcar->Night_ID)
{
int c = 0;
if(sor2.skd == SNOT && sor.skd == SNOT)
{
c = 1;
}
if(sor2.jgd == SYES && sor.jgd == SYES)
{
c = 1;
}
if(sor2.ygd == SYES && sor.ygd == SYES)
{
c = 1;
}
if(c == 1)
{
//在路边临时停车不关闭前照灯和不开启示廓灯
JUDGE_MARK_SUB3(13, "07", true);
}
}
//20180403 以开车门就评判
//下车熄火判断时机0 - 开门1 - 关门
const std::vector<std::string>& s505 = TableSysSet->asArray505();
int s505_12 = s505.size() > 12 && s505[12] != "" ? std::atoi(s505[12].c_str()) : 0;
if(s505_12 == 0)
{
int c = 0;
if(ksdd == siteof::sxbjxc || ksdd == siteof::sxbjdc)
{
if(sor.fdjzs > 600)
{
c = 1;
}
}
else
{
if(sor.fdjzs > 200)
{
c = 1;
}
}
if(c == 1 && sor.fdjzs < 8000)
{
//下车前不将发动机熄火
JUDGE_MARK_SUB3(11, "08", true);
}
}
if(ksdd == siteof::scyb)
{
if(sor.yfxd + sor.zfxd >= 1 && sor1.yfxd + sor1.zfxd >= 1 && sor2.yfxd + sor2.zfxd >= 1)
{
//不能正确使用灯光、雨刮器等车辆常用操纵件
JUDGE_MARK_SUB3(20, "93", false);
}
}
//20180115
if(ksdd.substr(0, 7) == siteof::guizhou)
{
if(sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SYES)
{
//不按规定使用安全带或者戴安全头盔
JUDGE_MARK_SUB3(20, "01", true);
}
}
int s505_10 = s505.size() > 10 && s505[10] != "" ? std::atoi(s505[10].c_str()) : 0;
//下车开门前是否判断安全带
if(s505_10 == 1)
{
if(sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SYES)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(20, "46", true);
}
}
//开门前不关闭方向灯是否扣分
int s505_11 = s505.size() > 11 && s505[11] != "" ? std::atoi(s505[11].c_str()) : 0;
if(s505_11 == 1)
{
if(sor.yfxd == SYES && sor1.yfxd == SYES)
{
JUDGE_MARK_SUB3(20, "71", false);
}
}
if(ksdd == siteof::zjnb)
{
if(sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SYES)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
}
}
if(ksdd == siteof::nmgcfkm3 || ksdd == siteof::nmgtlkm3 || ksdd == siteof::hnzzkm3)
{
if(sor.dw > 0 && sor1.dw > 0 && sor2.dw > 0 &&
sor.dw < 10 && sor1.dw < 10 && sor2.dw < 10)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(11, "45", true);
}
}
//ToDo:头部姿态
m_itemv.Status = 5;
m_itemv.Enter_Tk = cg->tkCnt;
}
//20171212 唐山要求开车门 评判距离
if(ksdd == siteof::hbtskm3 || ksdd == siteof::lyggy)
{
if(m_car->rtkEnabled())
{
Judge_KBTC_YaXian();
Judge_KBTC_YaXian_Tail(); //A2C6-20250314
}
} // 20171211
}
else //20170215
{
if(ksdd == siteof::SXHZ)
{
//靠边停车后3分钟内每隔30秒提示考试完成请下车考试语音3分钟后仍然不下车的以不按考试员指令驾驶评判为不合格。
//20170508
if(std::abs(cg->tkCnt - m_itemv.TingCheJiShi) <= m_itemv.Parm_HanZhong_KBTC_SJ) //3 * 60 * 1000 then
{
if(m_itemv.jscnt < m_itemv.Parm_HanZhong_KBTC_SJ)
{
if((std::abs(cg->tkCnt - m_itemv.TingCheJiShi) / 30*SECOND) >= m_itemv.jscnt)
{
m_itemv.jscnt++; //inc(m_itemv.jscnt);
//ToDo:语音提示-->下车时请注意左后方来车
m_car->createEventSound({itemNo(), sound::sub3_406004});
}
}
}
else
{
JUDGE_MARK_SUB3(11, "45", true);
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
if(ksdd == siteof::HLJDQ || ksdd == siteof::hebeihskm3) //20170616
{
//靠边停车后3分钟内每隔30秒提示考试完成请下车考试语音3分钟后仍然不下车的以不按考试员指令驾驶评判为不合格。
if(std::abs(cg->tkCnt - m_itemv.TingCheJiShi) > m_itemv.Parm_HanZhong_KBTC_SJ) //3 * 60 * 1000 then
{
JUDGE_MARK_SUB3(11, "45", true);
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
}
}
void Sub3Judge11Kbtc::DoStatus_5()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = his1->real.sensor;
const std::string& ksdd = TableSysSet->get211();
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
//如果关门进入下一阶段
if(sor.mkg == SNOT && sor1.mkg == SNOT && sor2.mkg == SNOT && sor3.mkg == SYES)
{
if(ksdd.substr(0,7) == siteof::guizhou)
{
if(sor.fsc == SYES && sor1.fsc == SYES && sor2.fsc == SYES)
{
//不按考试员指令行驶
JUDGE_MARK_SUB3(20, "50", false);
}
}
m_itemv.Status = 6;
//考试结束计时
m_itemv.KaoShiJieShu_JS = cg->tkCnt;
return;
}
//如果到时间15S进入下一阶段
if(cg->tkCnt - m_itemv.Enter_Tk > m_itemv.parm_KaiMen_Status6 * SECOND)
{
m_itemv.Status = 6;
m_itemv.KaoShiJieShu_JS = cg->tkCnt;
return;
}
}
void Sub3Judge11Kbtc::DoStatus_6()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = his1->real.sensor;
const std::string& ksdd = TableSysSet->get211();
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
//SysSet[505]-->13
//下车熄火判断时机0-开门1-关门
const std::vector<std::string>& s505 = TableSysSet->asArray505();
int s505_12 = s505.size() > 12 && s505[12] != "" ? std::atoi(s505[12].c_str()) : 0;
if(s505_12 == 1)
{
int c = 0;
if(ksdd == siteof::sxbjxc || ksdd ==siteof::sxbjdc)
{
if(sor.fdjzs > 600)
{
c = 1;
}
}
else
{
if(sor.fdjzs > 200)
{
c = 1;
}
}
if(c == 1 && sor.fdjzs < 8000)
{
//下车前不将发动机熄火
JUDGE_MARK_SUB3(11, "08", true);
}
}
//20190408
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES && sor3.mkg == SYES && (!IS_C5(m_carType) || ksdd == siteof::shanghaikm3))
{
//下车后不关闭车门
JUDGE_MARK_SUB3(11, "07", true); //20160928
}
TKM3Item* item = m_car->findExamItem(Sub3ItemType13Yjxs); //夜间行驶
bool FindFlag = (item && item->Item_Color == itemStateZk);
if(FindFlag == true) //夜间驾驶
{
if(ksdd == siteof::hbxy) //20160122
{
if(sor.ygd == SYES || sor.jgd == SYES || sor.skd == SNOT || sor.shtd == SNOT)
{
JUDGE_MARK_SUB3(11, "09", false); //夜间在路边临时停车不关闭前照灯或不开启式廓灯
}
}
else
{
if(sor.ygd == SYES || sor.jgd == SYES || sor.skd == SNOT)
{
if(ksdd == siteof::GXWZKM3)
{
//在路边临时停车不关闭前照灯或不开启示廓灯
JUDGE_MARK_SUB3(11, "09", false);
}
else
{
//在路边临时停车不关闭前照灯或不开启示廓灯
JUDGE_MARK_SUB3(11, "09", false);
}
}
}
}
//特殊地点版本处理
if(ksdd == siteof::GXWZKM3)
{
if(cg->tkCnt - m_itemv.KaoShiJieShu_JS > 25 * SECOND)
{
//结束项目处理
m_itemv.Status = 100;
}
}
else if(ksdd == siteof::gxbhkm3)
{
if(cg->tkCnt - m_itemv.KaoShiJieShu_JS > 15 * SECOND)
{
m_itemv.Status = 100;
}
}
else
{
m_itemv.Status = 100;
}
m_car->setPubKaoBianTCFinish_LJJL(cg->ai_ljjl);
}
void Sub3Judge11Kbtc::DoStatus_100()
{
m_exam->TestPro = ItemProFlagEnd;
const std::string& ksdd = TableSysSet->get211();
if(ksdd == siteof::changzhoukm3) //20170315
{
//结束直行路口
m_car->KM3EndItem(Sub3ItemType05Lkzx);
//结束左转弯
m_car->KM3EndItem(Sub3ItemType15Lkzz);
//结束右转弯
m_car->KM3EndItem(Sub3ItemType16Lkyz);
}
//检查是否有未做的项目,除了靠边停车是否都已经完成
bool FindFlag = m_car->itemsNotFinishExcept(Sub3ItemType11Kbtc);
if(FindFlag == true)
{
//ToDo: 语音提示-->请起步,继续完成考试
m_car->createEventSound({itemNo(), sound::sub3_406005});
}
}
void Sub3Judge11Kbtc::Judge_KBTC_YaXian()
{
//3帧车身右上离右侧边线距离
int RightJL0_RF = 0;
int RightJL1_RF = 0;
int RightJL2_RF = 0;
//3帧车身右下离右侧边线距离
int RightJL0_RB = 0;
int RightJL1_RB = 0;
int RightJL2_RB = 0;
//3帧车身右中心点离右侧边线距离
//ZXD_JL0: Integer;
//ZXD_JL1: Integer;
//ZXD_JL2: Integer;
const TRTKResult& RTKKM3_0 = m_car->historyRtkKM3(0);
const TRTKResult& RTKKM3_1 = m_car->historyRtkKM3(1);
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
//车身右侧距离计算
//靠边停车以右前轮、右后轮判靠边距离0-否 1-是)
const std::string& s411 = TableSysSet->get411();
if(s411 != "1")
{
RightJL0_RF = RTKKM3_0.Body_RF_ToBaseLine;
RightJL1_RF = RTKKM3_1.Body_RF_ToBaseLine;
RightJL2_RF = RTKKM3_2.Body_RF_ToBaseLine;
RightJL0_RB = RTKKM3_0.Body_RB_ToBaseLine;
RightJL1_RB = RTKKM3_1.Body_RB_ToBaseLine;
RightJL2_RB = RTKKM3_2.Body_RB_ToBaseLine;
}
else
{
RightJL0_RF = RTKKM3_0.Wheel_RF_ToBaseLine;
RightJL1_RF = RTKKM3_1.Wheel_RF_ToBaseLine;
RightJL2_RF = RTKKM3_2.Wheel_RF_ToBaseLine;
RightJL0_RB = RTKKM3_0.Wheel_RB_ToBaseLine;
RightJL1_RB = RTKKM3_1.Wheel_RB_ToBaseLine;
RightJL2_RB = RTKKM3_2.Wheel_RB_ToBaseLine;
}
//ZXD_JL0 := (RightJL0_RF + RightJL0_RB) div 2;
//ZXD_JL1 := (RightJL1_RF + RightJL1_RB) div 2;
//ZXD_JL2 := (RightJL2_RF + RightJL2_RB) div 2;
int Max_JL0 = std::max(RightJL0_RF, RightJL0_RB);
int Max_JL1 = std::max(RightJL1_RF, RightJL1_RB);
int Max_JL2 = std::max(RightJL2_RF, RightJL2_RB);
if(m_car->rtkEnabled() == false) return;
bool FindFlag = false;
if(RTKKM3_0.TouchLineType == LineType_3 &&
RTKKM3_1.TouchLineType == LineType_3 &&
RTKKM3_2.TouchLineType == LineType_3)
{
FindFlag = true;
}
if(RTKKM3_0.TouchLineTypeCS == LineType_3 &&
RTKKM3_1.TouchLineTypeCS == LineType_3 &&
RTKKM3_2.TouchLineTypeCS == LineType_3)
{
FindFlag = true;
}
//车身出线
bool CheShenChuXian = false;
// 20150415 出线,边缘线为负值
if(FindFlag == true)
{
int JL0 = std::min(RTKKM3_0.Body_RF_ToBaseLine, RTKKM3_0.Body_RB_ToBaseLine);
int JL1 = std::min(RTKKM3_1.Body_RF_ToBaseLine, RTKKM3_1.Body_RB_ToBaseLine);
int JL2 = std::min(RTKKM3_2.Body_RF_ToBaseLine, RTKKM3_2.Body_RB_ToBaseLine);
int s481 = TableSysSet->asInt481();
if(JL0 + s481 < 0 && JL1 + s481 < 0 && JL2 + s481 < 0 && !m_itemv.Kf03)
{
CheShenChuXian = true;
}
}
if(CheShenChuXian == true)
{
m_itemv.Kf03 = true; //20160928
//停车后,车身超过道路右侧边缘线或者人行道边缘
JUDGE_MARK_SUB3(11, "03", false);
}
else
{
const TGpsInfo& gps = m_car->historyGps();
//靠边停车以右前、后轮判靠边距离0-否 1-是)
int RtkOffset = m_car->getTCar()->RtkOffset;
int offset = RtkOffset + std::round(gps.jdyz*100) + std::round(gps.wdyz*100);
Max_JL0 -= offset;
Max_JL1 -= offset;
Max_JL2 -= offset;
//20170724
int kbtcwc = 50 + m_itemv.kbtcwc;
if(Max_JL0 > kbtcwc && Max_JL1 > kbtcwc && Max_JL2 > kbtcwc)
{
if(m_itemv.dcykkb == 0) //大车夜考相关的参数
{
//停车后车身距离道路右侧边缘线或者人行道边缘超出50cm
JUDGE_MARK_SUB3(11, "04", true); //20170724 新增
}
}
else
{
if(Max_JL0 > 30 + m_itemv.kbtcwc && Max_JL1 > 30 + m_itemv.kbtcwc && Max_JL2 > 30 + m_itemv.kbtcwc)
{
if(!m_itemv.Kf10)
{
m_itemv.Kf10 = true; //20160928
if(m_itemv.dcykkb == 0) //20181015
{
//靠边30相关的
JUDGE_MARK_SUB3(11, "10", true);
}
}
}
}
//特殊规则,直接翻译代码即可
if(s411 != "1")
{
std::string txt2 = m_exam->Txt2;
if(Tools::pos(",", txt2))
{
bool ok = Tools::pos("," + RTKKM3_0.MapRoad_Code_No + ",", "," + txt2 + ",");
if(RTKKM3_0.MapRoad_Code_No == "" || (RTKKM3_0.MapRoad_Code_No != "" && ok == false))
{
if(m_itemv.dcykkb == 0) //20181015
{
JUDGE_MARK_SUB3(11, "04", true);
}
}
}
}
}
}
void Sub3Judge11Kbtc::Judge_KBTC_YaXian_Tail()
{
if(!IS_A2C6(m_carType))
{
return;
}
//3帧车身右上离右侧边线距离
int RightJL0_RF = 0;
int RightJL1_RF = 0;
int RightJL2_RF = 0;
//3帧车身右下离右侧边线距离
int RightJL0_RB = 0;
int RightJL1_RB = 0;
int RightJL2_RB = 0;
//3帧车身右中心点离右侧边线距离
//ZXD_JL0: Integer;
//ZXD_JL1: Integer;
//ZXD_JL2: Integer;
const TRTKResult& RTKKM3_Tail_0 = m_car->historyRtkKM3_Tail(0);
const TRTKResult& RTKKM3_Tail_1 = m_car->historyRtkKM3_Tail(1);
const TRTKResult& RTKKM3_Tail_2 = m_car->historyRtkKM3_Tail(2);
//车身右侧距离计算
//靠边停车以右前轮、右后轮判靠边距离0-否 1-是)
const std::string& s411 = TableSysSet->get411();
if(s411 != "1")
{
RightJL0_RF = RTKKM3_Tail_0.Body_RF_ToBaseLine;
RightJL1_RF = RTKKM3_Tail_1.Body_RF_ToBaseLine;
RightJL2_RF = RTKKM3_Tail_2.Body_RF_ToBaseLine;
RightJL0_RB = RTKKM3_Tail_0.Body_RB_ToBaseLine;
RightJL1_RB = RTKKM3_Tail_1.Body_RB_ToBaseLine;
RightJL2_RB = RTKKM3_Tail_2.Body_RB_ToBaseLine;
}
else
{
RightJL0_RF = RTKKM3_Tail_0.Wheel_RF_ToBaseLine;
RightJL1_RF = RTKKM3_Tail_1.Wheel_RF_ToBaseLine;
RightJL2_RF = RTKKM3_Tail_2.Wheel_RF_ToBaseLine;
RightJL0_RB = RTKKM3_Tail_0.Wheel_RB_ToBaseLine;
RightJL1_RB = RTKKM3_Tail_1.Wheel_RB_ToBaseLine;
RightJL2_RB = RTKKM3_Tail_2.Wheel_RB_ToBaseLine;
}
//ZXD_JL0 := (RightJL0_RF + RightJL0_RB) div 2;
//ZXD_JL1 := (RightJL1_RF + RightJL1_RB) div 2;
//ZXD_JL2 := (RightJL2_RF + RightJL2_RB) div 2;
int Max_JL0 = std::max(RightJL0_RF, RightJL0_RB);
int Max_JL1 = std::max(RightJL1_RF, RightJL1_RB);
int Max_JL2 = std::max(RightJL2_RF, RightJL2_RB);
if(m_car->rtkEnabled2() == false) return;
bool FindFlag = false;
if(RTKKM3_Tail_0.TouchLineType == LineType_3 &&
RTKKM3_Tail_1.TouchLineType == LineType_3 &&
RTKKM3_Tail_2.TouchLineType == LineType_3)
{
FindFlag = true;
}
if(RTKKM3_Tail_0.TouchLineTypeCS == LineType_3 &&
RTKKM3_Tail_1.TouchLineTypeCS == LineType_3 &&
RTKKM3_Tail_2.TouchLineTypeCS == LineType_3)
{
FindFlag = true;
}
//车身出线
bool CheShenChuXian = false;
// 20150415 出线,边缘线为负值
if(FindFlag == true)
{
int JL0 = std::min(RTKKM3_Tail_0.Body_RF_ToBaseLine, RTKKM3_Tail_0.Body_RB_ToBaseLine);
int JL1 = std::min(RTKKM3_Tail_1.Body_RF_ToBaseLine, RTKKM3_Tail_1.Body_RB_ToBaseLine);
int JL2 = std::min(RTKKM3_Tail_2.Body_RF_ToBaseLine, RTKKM3_Tail_2.Body_RB_ToBaseLine);
int s481 = TableSysSet->asInt481();
if(JL0 + s481 < 0 && JL1 + s481 < 0 && JL2 + s481 < 0 && !m_itemv.Kf03)
{
CheShenChuXian = true;
}
}
if(CheShenChuXian == true)
{
m_itemv.Kf03 = true; //20160928
//停车后,车身超过道路右侧边缘线或者人行道边缘
JUDGE_MARK_SUB3(11, "03", false);
}
else
{
const TGpsInfo& gps2 = m_car->historyGps2();
//靠边停车以右前、后轮判靠边距离0-否 1-是)
int RtkOffset = m_car->getTCar()->RtkOffset;
int offset = RtkOffset + std::round(gps2.jdyz*100) + std::round(gps2.wdyz*100);
Max_JL0 -= offset;
Max_JL1 -= offset;
Max_JL2 -= offset;
//20170724
int kbtcwc = 50 + m_itemv.kbtcwc;
if(Max_JL0 > kbtcwc && Max_JL1 > kbtcwc && Max_JL2 > kbtcwc)
{
if(m_itemv.dcykkb == 0) //大车夜考相关的参数
{
//停车后车身距离道路右侧边缘线或者人行道边缘超出50cm
JUDGE_MARK_SUB3(11, "04", true); //20170724 新增
}
}
else
{
if(Max_JL0 > 30 + m_itemv.kbtcwc && Max_JL1 > 30 + m_itemv.kbtcwc && Max_JL2 > 30 + m_itemv.kbtcwc)
{
if(!m_itemv.Kf10)
{
m_itemv.Kf10 = true; //20160928
if(m_itemv.dcykkb == 0) //20181015
{
//靠边30相关的
JUDGE_MARK_SUB3(11, "10", true);
}
}
}
}
//特殊规则,直接翻译代码即可
if(s411 != "1")
{
std::string txt2 = m_exam->Txt2;
if(Tools::pos(",", txt2))
{
bool ok = Tools::pos("," + RTKKM3_Tail_0.MapRoad_Code_No + ",", "," + txt2 + ",");
if(RTKKM3_Tail_0.MapRoad_Code_No == "" || (RTKKM3_Tail_0.MapRoad_Code_No != "" && ok == false))
{
if(m_itemv.dcykkb == 0) //20181015
{
JUDGE_MARK_SUB3(11, "04", true);
}
}
}
}
}
}
void Sub3Judge11Kbtc::NS3JudgeVision_40601()
{
//靠边停车项目中停车前10s内头部姿态没有大于右后侧角度【25度】
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.rightBack)
{
m_itemv.stopPose = nowTime;
}
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
if(cg->move == moveStop && his1->move == moveStop && his2->move == moveForward)
{
if(nowTime - m_itemv.stopPose > 10*SECOND)
{
m_itemv.stopPose = nowTime;
JUDGE_MARK_NSUB3(11, "01", false);
//NS3video
}
}
}
void Sub3Judge11Kbtc::NS3JudgeVision_40604()
{
//靠边停车项目中打开车门前10s内头部姿态没有大于左后侧角度【25度】
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.leftBack)
{
m_itemv.doorPose = nowTime;
}
const TSensorInfo& sor = m_car->historySensor();
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SNOT)
{
if(nowTime - m_itemv.doorPose > 10*SECOND)
{
m_itemv.doorPose = nowTime;
JUDGE_MARK_NSUB3(11, "02", false);
//NS3video
}
}
}