#include "Sub3Judge12Ptdt.h" #include "HFactory.h" Sub3Judge12Ptdt::Sub3Judge12Ptdt(TKM3Item* exam) { m_exam = exam; } Sub3Judge12Ptdt::~Sub3Judge12Ptdt() { m_exam = nullptr; } bool Sub3Judge12Ptdt::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 TGpsInfo& gps = cg->real.gps; m_itemv = TSub3Item12Ptdt(); const std::vector& s510 = TableSysSet->asArray510(); //得到掉头项目必须的项目距离(如果到达了这个项目距离,没有完成掉头,判:不按规定考试) m_itemv.XMJL_Mi = s510.size() > 0 && s510[0] != "" ? std::atoi(s510[0].c_str()) : 350; //完成项目的规定距离 //角度变动到多大算掉头完成(达到这个角度后,并且不压任何线,就算掉头完成) m_itemv.FinishDiaoTou_JiaoDu_Change = s510.size() > 1 && s510[1] != "" ? std::atoi(s510[1].c_str()) : 120; //速度阈值(必须小于设定值,认为速度合法) m_itemv.Temp_XS = s510.size() > 2 && s510[2] != "" ? std::atoi(s510[2].c_str()) : 35; //20170824 //初始行驶距离(用于计算项目距离) m_itemv.CSJL_Mi = cg->ai_ljjl; //得到最多倒车次数 m_itemv.Max_DC_CiShu = s510.size() > 5 && s510[5] != "" ? std::atoi(s510[5].c_str()) : 0; //初始GPS角度 m_itemv.CS_GPS_D = gps.hxj; m_itemv.mapping = m_car->graphic()->mapping(); m_itemv.line = coordTransform(cg); m_exam->TestPro = ItemProFlagJudge; //ToDo1:播报项目语音 //ToDo2:生成进项目事件 return true; } void Sub3Judge12Ptdt::dealJudgeItem() { HELP_COST_TIME(""); if(m_exam->TestPro != ItemProFlagJudge) return; if(!judgeAllowable()) return; 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 TChuanGan* his2 = m_car->historyChuanGan(2); const TChuanGan* his3 = m_car->historyChuanGan(3); const std::string& ksdd = TableSysSet->get211(); if(m_car->isExamMode()) //正式考试 { if(!m_car->isQualified()) { m_exam->TestPro = ItemProFlagEnd; return; } } Update_DiaoTou_JianSuRec(m_itemv.slowDown); //, m_itemv.Temp_XS //多次后退 if(m_itemv.Max_DC_CiShu > 0) { if(cg->move == moveBackward && his1->move == moveBackward && his2->move != moveBackward && his3->move != moveBackward) { m_itemv.Max_DC_CiShu = m_itemv.Max_DC_CiShu - 1; if(m_itemv.Max_DC_CiShu == 0) { //不按考试员指令驾驶 JUDGE_MARK_SUB3(12, "03", false); } } } //车辆行驶中骑轧车道中心实线或者车道边缘实线 if(ksdd == siteof::xjcj) { const TRTKResult& RTKKM3_1 = his1->RTKKM3; const TRTKResult& RTKKM3_2 = his2->RTKKM3; const TRTKResult& RTKKM3_3 = his3->RTKKM3; //InShapeAttr: Integer; //0-不在形状里 1-在人行道内 2-在网格线内 if(RTKKM3.InShapeAttr == InShapeAttr_2 && RTKKM3_1.InShapeAttr == InShapeAttr_2 && RTKKM3_2.InShapeAttr == InShapeAttr_0 && RTKKM3_3.InShapeAttr == InShapeAttr_0) { //车辆行驶中骑轧车道中心实线或者车道边缘实线 JUDGE_MARK_SUB3(20, "57", false); } } //不按规定速度行驶 if(gps.sd > 20 && his1->real.gps.sd > 20 && ksdd == siteof::lfgakm3) { //不按规定速度行驶 JUDGE_MARK_SUB3(20, "58", true); } if(ksdd == siteof::linxiahz || ksdd == siteof::guizhou) { const TRTKResult& RTKKM3_1 = his1->RTKKM3; const TRTKResult& RTKKM3_2 = his2->RTKKM3; const TRTKResult& RTKKM3_3 = his3->RTKKM3; //记录一下第一次变道时刻的项目距离(向右边变道的) if(RTKKM3.BaseLaneCount > 0 && RTKKM3_2.BasePointInLaneNo == RTKKM3_3.BasePointInLaneNo && RTKKM3_2.BasePointInLaneNo < RTKKM3_1.BasePointInLaneNo && RTKKM3_1.BasePointInLaneNo == RTKKM3.BasePointInLaneNo) { m_itemv.BianDaoJL = cg->ai_ljjl; } //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线 //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄) if(RTKKM3.TouchLineType == LineType_6 && RTKKM3_1.TouchLineType == LineType_6 && RTKKM3_2.TouchLineType != LineType_6 && RTKKM3_3.TouchLineType != LineType_6) { //如果再次压中心虚线,是不是可以说:你准备再次变道了 if(cg->ai_ljjl - m_itemv.BianDaoJL < 20) { if(ksdd == siteof::guizhou) { //连续变更两条或两条以上车道 if(!m_itemv.MarkFlag_12_45) { m_itemv.MarkFlag_12_45 = true; JUDGE_MARK_SUB3(20, "89", false); } } else { //不按交通信号灯、标志、标线或者民警指挥信号行驶 if(!m_itemv.MarkFlag_12_45) { m_itemv.MarkFlag_12_45 = true; JUDGE_MARK_SUB3(12, "45", false); } } } } } if(m_exam->bYdt == true) //20150516 表示右掉头 { if(m_itemv.b_FXD == false) { if(sor.yfxd == SYES && sor.zfxd == SNOT) { m_itemv.b_FXD = true; } } if(m_itemv.b_FXD == true) { bool FindFlag = true; if(sor.yfxd == SNOT && sor.zfxd == SYES) { FindFlag = false; } for(int i = 1; i <= 14; i++) { const TSensorInfo& sori = m_car->historySensor(i); if(sori.zfxd == SYES) { FindFlag = false; break; } if(sori.yfxd != SYES) { FindFlag = false; break; } } if(FindFlag == true) { m_itemv.FXD_TM_OK_Flag = true; } } } else { if(m_itemv.b_FXD == false) { if(sor.zfxd == SYES && sor.yfxd == SNOT) { m_itemv.b_FXD = true; } } if(m_itemv.b_FXD == true) { bool FindFlag = true; if(sor.zfxd == SNOT && sor.yfxd == SYES) { FindFlag = false; } for(int i = 1; i <= 14; i++) { const TSensorInfo& sori = m_car->historySensor(i); if(sori.yfxd == SYES) { FindFlag = false; break; } if(sori.zfxd != SYES) { FindFlag = false; break; } } if(FindFlag == true) { m_itemv.FXD_TM_OK_Flag = true; } } } const TChuanGan* his5 = m_car->historyChuanGan(5); //掉头角度变化 老的角度变化计算方式(windows就是这么做的) //const TGpsInfo& gps5 = his5->real.gps; //double a = std::abs(gps.hxj - m_itemv.CS_GPS_D); //double b = std::abs(gps5.hxj- m_itemv.CS_GPS_D); //***新的角度变化计算方式(这个应该更精准)注意:左上角是(0,0)点 yhy 20240823 Linei line0 = coordTransform(cg); Linei line5 = coordTransform(his5); double a = std::abs(GpsMath::calcAngle(line0.p2, m_itemv.line.p2, m_itemv.line.p1)); double b = std::abs(GpsMath::calcAngle(line5.p2, m_itemv.line.p2, m_itemv.line.p1)); //IGraphicAbstract* graphic = m_car->graphic(); //graphic->drawPoint({10,10},RGB_RED,10); //graphic->drawLine(m_itemv.line,RGB_RED); //graphic->drawLine(line0,RGB_GREEN); //graphic->drawLine(line5,RGB_PURPLE); //FactoryExamService->examJudgeCallbackMapImageToCaller(graphic->image(), graphic->size()); //logdebug("CS_GPS_D=%0.2f,hxj=%0.2f,hxj5=%0.2f, a=%0.2f,b=%0.2f a_=%0.2f,b_=%0.2f", // m_itemv.CS_GPS_D, gps.hxj, gps5.hxj, a, b, a_, b_); //528:掉头N米内不判连续变道和方向灯 if(m_car->getNJ_DiaoTou_JL() == 0 && TableSysSet->asInt528() > 0) { if(a > 90 && a < 270 && b > 90 && b < 270) { m_car->setNJ_DiaoTou_JL(cg->ai_ljjl); } } const std::vector& s510 = TableSysSet->asArray510(); //StrToIntDef(getdotstr(8, sysset[510], ','), 1) = 1 int si = s510.size() > 7 && s510[7] != "" ? std::atoi(s510[7].c_str()) : 1; //贵州地区需求 if(Tools::pos(siteof::guizhou, ksdd) == true || si == 1) { // //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线 //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄) if(RTKKM3.TouchLineType == LineType_6 && his1->RTKKM3.TouchLineType == LineType_6 && his2->RTKKM3.TouchLineType == LineType_0) { if(!m_itemv.Judge_DengGuang_Flag) { m_itemv.Judge_DengGuang_Flag = true; if(!m_itemv.b_FXD) { if(!m_itemv.MarkFlag_12_42) { //掉头前未开启左转向灯 JUDGE_MARK_SUB3(12, "42", false); //20160928 m_itemv.MarkFlag_12_42 = true; } //ToDo:头部姿态 } if(ksdd == siteof::gdjykm3 || ksdd == siteof::gsgnzkm3 || ksdd == siteof::chongqingkm3 || ksdd == siteof::ynzt || ksdd == siteof::guizhou || ksdd == siteof::guizhouas || ksdd == siteof::shandongyt || ksdd == siteof::gxlzkm3) { //:对可能出现危险的情形未采取减速、鸣喇叭等安全措施 //if not Itmv12.Js_Passed then if (m_itemv.slowDown.Js_Passed == false) { if(!m_itemv.MarkFlag_12_46) { //对可能出现危险的情形未采取减速、鸣喇叭等安全措施 JUDGE_MARK_SUB3(12, "46", false); //20170505 m_itemv.MarkFlag_12_46 = true; } } } } } } if(ksdd == siteof::dehongkm3) { if(cg->ai_ljjl - m_itemv.CSJL_Mi > m_itemv.XMJL_Mi) { if(!m_itemv.b_FXD) { if(!m_itemv.MarkFlag_12_42) { //掉头前未开启左转向灯 JUDGE_MARK_SUB3(12, "42", false); //20160928 m_itemv.MarkFlag_12_42 = true; } } if(!m_itemv.b_JSC) { if(!m_itemv.MarkFlag_12_46) { //对可能出现危险的情形未采取减速、鸣喇叭等安全措施 JUDGE_MARK_SUB3(12, "46", false); //20170505 m_itemv.MarkFlag_12_46 = true; } } m_exam->TestPro = ItemProFlagEnd; } } else { if(a > 50 && a < 210 && b > 50 && b < 210) { if(!m_itemv.Judge_DengGuang_Flag) { m_itemv.Judge_DengGuang_Flag = true; //ToDo:头部姿态 if(ksdd == siteof::gdjykm3 || ksdd == siteof::gsgnzkm3 || ksdd == siteof::chongqingkm3 || ksdd == siteof::ynzt || ksdd == siteof::guizhou || ksdd == siteof::guizhouas || ksdd == siteof::shandongyt || ksdd == siteof::gxlzkm3 ) { if(!m_itemv.slowDown.Js_Passed) { if(!m_itemv.MarkFlag_12_46) { //对可能出现危险的情形未采取减速、鸣喇叭等安全措施 JUDGE_MARK_SUB3(12, "46", false); //20170505 m_itemv.MarkFlag_12_46 = true; } } } //如果是右掉头 //制动气压不足起步(20,73) 为什么这么扣?按规则翻译即可 if(m_exam->bYdt == true) //右掉头 { if(!m_itemv.b_FXD) { if(!m_itemv.MarkFlag_20_73) { JUDGE_MARK_SUB3(20, "73", false); //20170505 m_itemv.MarkFlag_20_73 = true; } } if(Tools::pos(siteof::guizhou, ksdd) == true && !m_itemv.FXD_TM_OK_Flag) { //违反交通安全法律、法规,影响交通安全 if(!m_itemv.MarkFlag_20_20) { JUDGE_MARK_SUB3(20, "20", true); m_itemv.MarkFlag_20_20 = true; } } } else { if(!m_itemv.b_FXD) { if(!m_itemv.MarkFlag_12_42) { //起步、转向、变更车道、超车、靠边停车前不使用或错误使用转向灯 JUDGE_MARK_SUB3(12, "42", false); //20160928 m_itemv.MarkFlag_12_42 = true; } } else { if(ksdd == siteof::hebeihskm3) { //起步、转向、变更车道、超车、靠边停车前,开转向灯少于3s即转向 if(!m_itemv.FXD_TM_OK_Flag) //20141107 { if(!m_itemv.MarkFlag_12_43) { JUDGE_MARK_SUB3(12, "43", false); m_itemv.MarkFlag_12_43 = true; } } } } //20171109 贵州个性需求 if(Tools::pos(siteof::guizhou, ksdd) == true && !m_itemv.FXD_TM_OK_Flag) { if(!m_itemv.MarkFlag_20_20) { JUDGE_MARK_SUB3(20, "20", false); //20160928 m_itemv.MarkFlag_20_20 = true; } } } } } } if(a > m_itemv.FinishDiaoTou_JiaoDu_Change && a < 210 && b > m_itemv.FinishDiaoTou_JiaoDu_Change && b < 210) { //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线 //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄) if(RTKKM3.TouchLineType == LineType_0) { m_exam->TestPro = ItemProFlagEnd; } } if(cg->ai_ljjl - m_itemv.CSJL_Mi > m_itemv.XMJL_Mi) { JUDGE_MARK_SUB3(12, "41", false); //20160928 m_exam->TestPro = ItemProFlagEnd; return; } #if JUDGE_USE_INSPECT //无锡所送检转向灯少于3s即转向 if(m_itemv.b_FXD) { if(m_exam->TestPro == ItemProFlagEnd) { //开转向灯少于3s即转向 if(!m_itemv.FXD_TM_OK_Flag) //20141107 { if(!m_itemv.MarkFlag_12_43) { JUDGE_MARK_SUB3(12, "43", false); m_itemv.MarkFlag_12_43 = true; } } } } #endif char buf[128] = {0}; SafeSprintf(buf, sizeof(buf), JUDGE_UTF8S("结束距离=%d,当前距离=%d;角度阈值=%d,当前角度变化=%0.2f,a=%0.2f,b=%0.2f"), m_itemv.XMJL_Mi, cg->ai_ljjl-m_itemv.CSJL_Mi, m_itemv.FinishDiaoTou_JiaoDu_Change, gps.hxj-m_itemv.CS_GPS_D,a,b); std::string str = buf; showStatus(JUDGE_UTF8S("[普通掉头]") + str); } Linei Sub3Judge12Ptdt::coordTransform(const TChuanGan* cg) { const TGPSPoint center = cg->real.gps.to(); Linei line = GpsMath::coordMapping(TGPSLine(cg->body.b1_a, cg->body.b2_a), center, m_itemv.mapping); return line; }