subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge12Ptdt.cpp

460 lines
17 KiB
C++
Raw Normal View History

2025-03-26 16:56:51 +08:00
#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;
2025-05-09 12:01:14 +08:00
if(!judgeAllowable()) return;
2025-03-26 16:56:51 +08:00
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;
}