subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp
2025-05-09 12:01:14 +08:00

460 lines
17 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 "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<std::string>& 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<std::string>& 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;
}