#include "Sub3Judge02Qbxx.h" #include "HFactory.h" Sub3Judge02Qbxx::Sub3Judge02Qbxx() { m_exam = __NEW__(TKM3Item); } Sub3Judge02Qbxx::~Sub3Judge02Qbxx() { __DELETE__(m_exam); } bool Sub3Judge02Qbxx::dealJudgeEnter() { if(m_exam->TestPro != ItemProFlagInit) return false; // if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return false; m_itemv = TSub3Item02Qbxx(); //10s内未起步只评判第一次^第一次起步以打左方向灯开始计时^ const std::vector& s502 = TableSysSet->asArray502(); std::string str = s502.size() > 7 ? s502[7] : ""; const std::vector ss = Tools::split(str, "^"); m_itemv.sys502_8_1 = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0; m_itemv.sys502_8_2 = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 0; //StrToIntDef(GetDotStr(2, tempstr + '^', '^'), 0); //下面是视觉相关的,先把参数值拿到,暂时不实现 const std::vector& s531 = TableSysSet->asArray531(); if(s531.size() > 0 && s531[0] == "1") { m_itemv.is_radar = true; } m_itemv.Sys502_11 = s502.size() > 10 && s502[10] != "" ? std::atoi(s502[10].c_str()) : 0; //StrToIntDef(GetDotStr(11, SysSet[502], ','), 0); const std::vector& s524 = TableSysSet->asArray524(); m_itemv.Sys524_4 = s524.size() > 3 && s524[3] != "" ? std::atoi(s524[3].c_str()) : 0; //StrToIntDef(GetDotStr(4, SysSet[524], ','), 0); const TChuanGan* cg = m_car->historyChuanGan(); m_itemv.Temp_JL_CM = cg->ai_ljjl_cm; if(m_car->disForward() > 10*100) //10米 { //20240730 在济南修改 yhy //根据程军华口述修改过滤,在下面这种情况下: //如果在做模拟灯光的时候,还没起步之前差分丢了,车子开起来一段距离后差分又恢复了,当进入路口直行项目时,如果这个时候正好在路口等红灯停车了,会触发第一次起步 //路口直行是不需要打灯的,而程序又第一次触发了起步项目,又要打左灯,考生怎么操作都会扣分, //所以这里过滤下,如果起步的时候前进的距离超过10米了就不算第一次起步了,就不判首次起步打左灯了 m_Pub_First_QiBu_Flag = true; } m_itemv.State = 1; //车辆停车状态到前进距离小于1米的阶段 m_exam->TestPro = ItemProFlagJudge; //ToDo2:生成进项目事件 return true; } void Sub3Judge02Qbxx::dealJudgeItem() { #if JUDGE_USE_INSPECT //return; //屏蔽起步 #endif 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 TChuanGan* his1 = m_car->historyChuanGan(1); const TSensorInfo& sor1 = his1->real.sensor; const TChuanGan* his2 = m_car->historyChuanGan(2); const TSensorInfo& sor2 = his2->real.sensor; const std::string& ksdd = TableSysSet->get211(); if(m_itemv.State == 1) //起步相关的,起步距离小于1米 { //评判起步闯动 bool findFlag = true; if(ksdd == siteof::kunming && cg->tkCnt < 60*SECOND) { findFlag = false; } if(findFlag == true) { const TChuanGan* his3 = m_car->historyChuanGan(3); const TSensorInfo& sor3 = his3->real.sensor; const TChuanGan* his4 = m_car->historyChuanGan(4); const TSensorInfo& sor4 = his4->real.sensor; TCar* tcar = m_car->getTCar(); int fdjds = tcar->FDJDS * tcar->fdjds_cdbl; //保持和windows一模一样 原先还叠加了fdjzs>10和前进状态条件 if( (sor.fdjzs > 0 && sor.fdjzs < fdjds) // && cg->move == moveForward && (sor1.fdjzs > 0 && sor1.fdjzs < fdjds) // && his1->move == moveForward && (sor2.fdjzs > 0 && sor2.fdjzs < fdjds) // && his2->move == moveForward && (sor3.fdjzs > 0 && sor3.fdjzs < fdjds) // && his3->move == moveForward && (sor4.fdjzs > 0 && sor4.fdjzs < fdjds) // && his4->move == moveForward && (m_itemv.Mark_ChuangDong == false) ) //闯动 { m_itemv.Mark_ChuangDong = true; JUDGE_MARK_SUB3(2, "08", false); } } //起步时,加速踏板控制不当,致使发动机转速过高 if(!m_itemv.Mark_2_09_Flag) { const TSensorInfo& sor3 = m_car->historySensor(3); const std::vector& s502 = TableSysSet->asArray502(); //发动机转速过高 int ZSMax = s502.size() > 3 && s502[3] != "" ? std::atoi(s502[3].c_str()) : 2500; //StrToIntDef(GetDotStr(4, SysSet[502], ','), 2500); if(sor.fdjzs > ZSMax && sor1.fdjzs > ZSMax && sor2.fdjzs > ZSMax && sor3.fdjzs > ZSMax) { bool bb = true; int count = m_car->historyCount(); for(int i = 1; i <= 10; i++) { if(i >= count) break; const TSensorInfo& sori = m_car->historySensor(i); if(sori.dh2 == SYES) { bb = false; break; } } if(IS_C2(m_carType)) { if(ksdd == siteof::shanghaikm3 || Tools::pos(siteof::guizhou, ksdd) == true) //Copy(Ctl.KSDD, 1, 7) = 'guizhou' { bb = false; } } if(bb == true) { m_itemv.Mark_2_09_Flag = true; JUDGE_MARK_SUB3(2, "09", false); } } } //10秒未起步 nogo_timeout(); //溜车评判 20240730 Judge_LiuChe(); if(cg->ai_ljjl_cm - m_itemv.Temp_JL_CM >= 100) { if(cg->move == moveForward && his1->move == moveForward) { Judge_QiBu_FXD_LaBa(); //20240730 Judge_QiBu_GuaCuoDang(); //20240730 m_itemv.State = 2; return; } } } if(m_itemv.State == 2) //起步10米问题 { if(cg->move == moveForward && his1->move == moveForward) { if(cg->ai_ljjl_cm - m_itemv.Temp_JL_CM >= 10*100+10) //放个10CM { if(sor.ssc == SYES) //手刹错误,未及时纠正 { if(m_itemv.Error_SSC_Flag == true) { JUDGE_MARK_SUB3(2, "10", false, true); } } m_exam->TestPro = ItemProFlagEnd; return; } } } if(cg->move == moveForward && his1->move == moveForward && his2->move == moveStop) { if(sor.ssc == SYES) { m_itemv.Error_SSC_Flag = true; } } if(m_itemv.Error_SSC_Flag == true) { if(cg->move == moveForward) { if(sor.ssc == SNOT) { m_itemv.Error_SSC_Flag = false; //不松驻车制动器起步,但能及时纠正 JUDGE_MARK_SUB3(2, "06", false, true); } } } //状态提示 char buf[128] = {0}; SafeSprintf(buf, sizeof(buf), JUDGE_UTF8S("%s->State:%d,项目距离=%d厘米,最大后溜=%dCM"), m_itemv.State == 1 ? JUDGE_UTF8S("起步未到达1米...") : JUDGE_UTF8S("起步超过1米..."), m_itemv.State, cg->ai_ljjl_cm - m_itemv.Temp_JL_CM, m_itemv.PubMaxLCValue); showStatus(buf); NS3JudgeVision_40202(); } //具备起步条件,10秒没有起步 void Sub3Judge02Qbxx::nogo_timeout() { 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; // C2 N空挡是0 R倒车档9 P驻车档10 D前进挡11 //档位或者手刹信号发生变化,且变化的结果是前进挡和松手刹状态,开始计时,10秒后扣分 if(m_itemv.ZhunBeiQiBuTK == 0) { const TSensorInfo& sor2 = m_car->historySensor(2); if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9 && sor.dw != 10) || (sor.ssc == SNOT && sor1.ssc == SYES)) { if(sor.dw >= 1 && sor.dw != 9 && sor.dw != 10 && sor.ssc == SNOT) { m_itemv.ZhunBeiQiBuTK = cg->tkCnt; } } } else { if(sor.dw == 0 || sor.ssc == SYES) { m_itemv.ZhunBeiQiBuTK = 0; } if(m_itemv.ZhunBeiQiBuTK != 0 && cg->tkCnt - m_itemv.ZhunBeiQiBuTK > 10 * SECOND) //10秒未起步 { if(m_car->rtkEnabled() && m_car->rtkEnabled(1)) { if(cg->move != moveForward) { JUDGE_MARK_SUB3(2, "48", false); m_itemv.ZhunBeiQiBuTK = 0; //赋值0就是动作变化才重新扣 如果是循环扣分赋值成cg->tkCnt } } } } /* //档位或者手刹信号发生变化,且变化的结果是前进挡和松手刹状态,开始计时,10秒后扣分 if(m_itemv.ZhunBeiQiBuTK == 0) { if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor1.dw && sor.dw >= 1 && sor.dw != 9) || (sor.ssc == SNOT && sor1.ssc == SYES)) { m_itemv.ZhunBeiQiBuTK = cg->tkCnt; } } else { if(cg->tkCnt - m_itemv.ZhunBeiQiBuTK > 10 * SECOND) //10秒未起步 { if(gps.rtkEnabled == true && gps1.rtkEnabled == true) { if(cg->move != moveForward) { JUDGE_MARK_SUB3(2, "48", false); m_itemv.ZhunBeiQiBuTK = cg->tkCnt; } } } } */ } //6、起步方向灯、喇叭 void Sub3Judge02Qbxx::Judge_QiBu_FXD_LaBa() { const TChuanGan* cg = m_car->historyChuanGan(); const TSensorInfo& sor = cg->real.sensor; const TChuanGan* his1 = m_car->historyChuanGan(1); //const TChuanGan* his2 = m_car->historyChuanGan(2); //1、检查起步前有没有打转向灯 //if(cg->move == moveForward && his1->move == moveForward && his2->move == moveStop) if(cg->move == moveForward && his1->move == moveForward) { //可以多次触发起步,但是起步方向灯,全程只评判一次 if(m_Pub_First_QiBu_Flag == true) return; m_Pub_First_QiBu_Flag = true; TCar* tcar = m_car->getTCar(); if(tcar->Night_ID == true) { //大车夜考起步时未开启前照灯 yhy 2025-02-13 bool FindFlag = (sor.ygd + sor.jgd != SNOT); if(!FindFlag) { for(int i = 1; i < 50; i++) //前进前10秒看看打没打过前照灯 { const TChuanGan* hisi = m_car->historyChuanGan(i); if(hisi == nullptr) break; const TSensorInfo& sori = hisi->real.sensor; if(hisi->move == moveStop) { if(sori.ygd + sori.jgd != SNOT) { FindFlag = true; break; } } } } if(!FindFlag) { JUDGE_MARK_SUB3(13, "01", true); } } bool FindFlag = (sor.zfxd == SYES && sor.yfxd == SNOT); if(!FindFlag) { for(int i = 1; i < 50; i++) { const TChuanGan* hisi = m_car->historyChuanGan(i); if(hisi == nullptr) break; const TSensorInfo& sori = hisi->real.sensor; if(hisi->move == moveStop) { if(sori.zfxd == SYES && sori.yfxd == SNOT) { FindFlag = true; break; } } } } if(!FindFlag) { JUDGE_MARK_SUB3(2, "42", false, true); //JUDGE_MARK_SUB3(20, "73", false, true); } else { //看方向灯是否小于3秒 int OKNum = 0; for(int i = 1; i < 50; i++) { const TChuanGan* hisi = m_car->historyChuanGan(i); if(hisi == nullptr) break; const TSensorInfo& sori = hisi->real.sensor; if(hisi->move == moveStop) { if(sori.zfxd == SYES && sori.yfxd == SNOT) { OKNum++; } } } if(OKNum < 3*FRAMES_PER_SECOND) { //JUDGE_MARK_SUB3(20, "224", false, true); JUDGE_MARK_SUB3(2, "43", false, true); } } //起步喇叭评判 FindFlag = (sor.lb == SYES); if(!FindFlag) { int count = m_car->historyCount(); for(int i = 1; i < 100; i++) { if(i >= count) break; const TChuanGan* hisi = m_car->historyChuanGan(i); const TSensorInfo& sori = hisi->real.sensor; if(hisi->move == moveStop) { if(sori.lb == SYES) { FindFlag = true; break; } } } } if(!FindFlag) { JUDGE_MARK_SUB3(2, "07", false, true); } } } //22、起步挂错挡 void Sub3Judge02Qbxx::Judge_QiBu_GuaCuoDang() { if(m_car->historyCount() < 2) return; const TChuanGan* cg = m_car->historyChuanGan(); const TChuanGan* his1 = m_car->historyChuanGan(1); //const TChuanGan* his5 = m_car->historyChuanGan(5); //const TChuanGan* his10 = m_car->historyChuanGan(10); //if(cg->move == moveForward && his1->move == moveStop && his5->move == moveStop && his10->move == moveStop) if(cg->move == moveForward && his1->move == moveForward) { const TSensorInfo& sor = cg->real.sensor; //小车1档起步, 大车1、2档起步 //static const int gear = TableSysParm->findQiBuGear(m_car->carCode()); static const int gear = m_car->getTCar()->StartSpeed; #if JUDGE_USE_INSPECT if(sor.dw_plc > gear) //无锡所用原始档位 { JUDGE_MARK_SUB3(2, "44", false); } #else if(sor.dw > gear) { JUDGE_MARK_SUB3(2, "44", false); } #endif } } //1、溜车评判 void Sub3Judge02Qbxx::Judge_LiuChe() { if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1) || !m_car->rtkEnabled(2)) return; const TChuanGan* cg = m_car->historyChuanGan(); const TGpsInfo& gps = cg->real.gps; const TSensorInfo& sor = cg->real.sensor; const TChuanGan* his1 = m_car->historyChuanGan(1); static constexpr int dis30CM = 30; //32 后溜车距离 static constexpr int dis10CM = 10; //12 if(cg->move == moveForward && his1->move == moveForward) //前进的时候要评判溜车小于30厘米的 { if(m_itemv.PubMaxLCValue >= dis10CM && m_itemv.PubMaxLCValue <= dis30CM) { //通用或起步项目 JUDGE_MARK_SUB3(2, "47", false); } m_itemv.PubLCTCPtt.x = 0; m_itemv.PubLCTCPtt.y = 0; m_itemv.PubMaxLCValue = 0; m_itemv.PubCanMarkLC50Flag = true; } if(sor.dw != 9 && sor.dw != 6 && sor.ssc == SNOT) { //if(m_itemv.PubLCTCPtt.x == 0 && m_itemv.PubLCTCPtt.y == 0 && m_car->rtkEnabled()) if(m_car->rtkEnabled()) { const TChuanGan* his2 = m_car->historyChuanGan(2); if(cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) { m_itemv.PubLCTCPtt.x = gps.ai_gps.x; m_itemv.PubLCTCPtt.y = gps.ai_gps.y; //m_itemv.PubMaxLCValue = 0; } } ExamSensor* sensor = m_car->sensor(); if(m_itemv.PubLCTCPtt.x != 0 && m_itemv.PubLCTCPtt.y != 0 && gps.ai_gps.x != 0 && gps.ai_gps.y != 0 && sensor->calcMoveState() != moveForward) { int x = m_itemv.PubLCTCPtt.x - gps.ai_gps.x; int y = m_itemv.PubLCTCPtt.y - gps.ai_gps.y; int a = std::round(std::sqrt(x*x + y*y)); //cm if(m_itemv.PubMaxLCValue < a) { m_itemv.PubMaxLCValue = a; } //溜车大于30了,直接扣分 if(m_itemv.PubCanMarkLC50Flag == true && m_itemv.PubMaxLCValue > dis30CM) { JUDGE_MARK_SUB3(2, "46", false); m_itemv.PubCanMarkLC50Flag = false; } } } } void Sub3Judge02Qbxx::NS3JudgeVision_40202() { //起步项目中,车辆状态从停止切换前进前10s内,头部姿态没有大于左后侧角度【23度】 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.obsTime = nowTime; } const TChuanGan* cg = m_car->historyChuanGan(); const TChuanGan* his1 = m_car->historyChuanGan(1); const TChuanGan* his2 = m_car->historyChuanGan(2); if(cg->move == moveForward && his1->move == moveForward && his2->move == moveStop) { if(nowTime - m_itemv.obsTime > 10*SECOND) { m_itemv.obsTime = nowTime; JUDGE_MARK_NSUB3(2, "03", false); //NS3video } } }