#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& 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>& s522 = TableSysSet->asArray2_522(); if(s522.size() > 0) { const std::vector& 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 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& 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 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; }