#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& 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& 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& 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>& s522 = TableSysSet->asArray2_522(); if(s522.size() > 1) { const std::vector& 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; if(!judgeAllowable()) return; 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; //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)) { FindFlag = false; } int jl = TempTXT2 != "" ? std::atoi(TempTXT2.c_str()) : 80; //20140902 if(FindFlag == true && !CheckJL_YJG(jl)) //不在路口内的人行横道 { //20171006 if(ksdd == siteof::sz111) { JUDGE_MARK_SUB3(41, "03", false); } else { JUDGE_MARK_SUB3(13, "03", false); } } } } 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); } } }