subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp
2025-05-06 14:49:05 +08:00

6449 lines
241 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 "Sub3Judge20Comm.h"
#include "HFactory.h"
#include "Sub3Judge14Jjdw.h"
#include "Sub3Judge41Mndg.h"
#include "Sub3Judge11Kbtc.h"
Sub3Judge20Comm::Sub3Judge20Comm()
{
m_exam = __NEW__(TKM3Item);
}
Sub3Judge20Comm::~Sub3Judge20Comm()
{
__DELETE__(m_exam);
}
bool Sub3Judge20Comm::dealJudgeEnter()
{
//通用评判不存在不支持进项目函数接口
TASSERT_BOOL(false, "not-support!");
return false;
}
void Sub3Judge20Comm::dealJudgeItem()
{
HELP_COST_TIME("");
if(!m_CSHItmv20_Flag)
{
m_CSHItmv20_Flag = true;
//Step0-1触发模拟灯光
Init_ZongHe();
return;
}
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
//更新脚刹车距离
if(sor.jsc == SYES)
{
m_car->setPub_JSC_JL(cg->ai_ljjl);
}
if(m_car->historyCount() <= 2*FRAMES_PER_SECOND+2) return; //必须收满2秒数据
//Step0-4设置发动机怠速
Set_FDJ_DS();
//Step0-5 座椅检查(贵州),按贵州翻译即可
doCheck_ZuoYi();
//Step0-3触发起步项目
CallQiBu();
//自动靠边停车计算
Call_Auto_KBTC();
//240710 触发模拟灯光
CallMoNiDengGuang();
//1、溜车评判
//Judge_LiuChe(); //移到起步专项里评判 20240730
//2、连续2次挂挡不进
Judge_GuaDangBuJin();
//3、空挡滑行
Judge_KongDangHuaXing();
//4、不按规定速度行驶
Judge_GuiDingSuDu();
//5、压线评判
Judge_YaXian_30120();
//5、挂车压线评判
Judge_YaXian_30120_Tail(); //A2C6-20250313
Judge_YaXian_10S_XuXian();
Judge_YaXian_10S_XuXian_Tail(); //A2C6-20250314
//6、起步方向灯、喇叭
//Judge_QiBu_FXD_LaBa(); //移到起步项目里了 20240730
//7、连续变道
Judge_LianXuBianDao();
//8、不能停止人行横道网格线内
Judge_ForbiddenTC();
Judge_ForbiddenTC_Tail(); //A2C6-20250314
//9、加速踏板使用错误
Jugde_JiaSuTaBan();
//10、半联动长时间踩离合器
Judge_BanLianDong();
//11、制动不平顺
Judge_ZhiDongBuPingShun();
//12、操作完成后不关灯
Judge_BuGuanBiDengGuang();
//13、变道方向灯评判2
Judge_BianDaoFangXiangDeng2();
//14、副刹车评判
Judge_FSC();
//15、全程 越级加挡扣分
Judge_YueJi_JiaJianDang();
/////////////////////////以下是标准科目三评判项目/////////////////////////////
//16、行驶中连续使用起步挡行驶距离超过50m
Judge_QiBuDang_50();
//17、因操作不当造成发动机熄火一次(20,36)
Judge_XiHuo();
//18、启动发动机时挡位未至于空挡
Judge_DW_KongDang();
//19、长时间启动钥匙
Judge_ChangShiJian_QiDongYaoShi();
//20、安全带扣分(连续前进1秒)
Judge_AnQuanDai();
//21、考试过程中打开车门
Judge_DaKaiCheMen();
//22、起步挂错挡
//Judge_QiBu_GuaCuoDang(); //移到起步专项里评判 20240730
//23、使用挡位与车速长时间不匹配造成车辆发动机转速过高或过低发动机转速〉2500转或〈900转且时间大于30秒扣100分
Judge_DangWei_CS_ZS();
Judge_Sysset534();
Judge_Sysset535(false);
//24、全程必须达到次高挡位 、全程必须次高挡达到5秒
Judge_CiGaoDang();
//逆向行驶评判
//JudgeDriveDirection();
//附加评判比如非法掉头、超速SystemParm8、夜间行驶)
Judge_Extra();
//行驶中双手离开方向盘时间超过双手脱离方向盘安全时间【2s】
NS3JudgeVision_30108();
//行驶中单手控制方向盘且车辆发生偏移偏移距离大于设置的偏移距离【30cm】
NS3JudgeVision_30110();
//行驶中视线离开行驶方向超过2s 非项目行驶中2秒内头部姿态角度大于左侧角度【18度】大于右侧角度【20度】
NS3JudgeVision_30116();
//行驶中头、手伸出窗户时间超过伸出窗户安全时间【2s】
NS3JudgeVision_30130();
//不能正确使用灯光、雨刮器等车辆常用操纵件
NS3JudgeWeather_30104();
}
//综合评判初始化
void Sub3Judge20Comm::Init_ZongHe()
{
//ZeroMemory(@m_itemvCJH, SizeOf(TSub3Item20Comm_CJH));
m_itemvCJH = TSub3Item20Comm_CJH();
m_itemvXLG = TSub3Item20Comm_XLG();
m_itemvNS3 = TSub3Item20Comm_NS3();
const std::vector<std::vector<std::string>>& s534 = TableSysSet->asArray2_534();
const std::vector<std::vector<std::string>>& s535 = TableSysSet->asArray2_535();
for(size_t i = 0 ; i < s534.size(); i++)
{
const std::vector<std::string>& ss = s534[i];
if(ss.size() >= 3)
{
if(name2ExamCarType(ss[0].c_str()) == m_carType)
{
int speed = std::atoi(ss[1].c_str());
int limit = std::atoi(ss[2].c_str());
auto& item = m_itemvXLG.SDs534[speed];
item.speed = speed;
item.limit = limit;
item.distance = 0;
}
}
}
for(size_t i = 0 ; i < s535.size(); i++)
{
const std::vector<std::string>& ss = s535[i];
if(ss.size() >= 3)
{
if(name2ExamCarType(ss[0].c_str()) == m_carType)
{
int speed = std::atoi(ss[1].c_str());
int limit = std::atoi(ss[2].c_str());
auto& item = m_itemvXLG.SDs535[speed];
item.speed = speed;
item.limit = limit;
item.distance = 0;
}
}
}
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const std::string& ksdd = TableSysSet->get211();
//自动靠边停车参数
//SysSet[319]:里程不够不报靠边停车0-否 1-是 2-必考项目完成,并且里程满足要求)
//SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
const std::string& s319 = TableSysSet->get319();
if(s319 == "2")
{
const std::vector<std::string>& s415 = TableSysSet->asArray415();
m_itemvCJH.bZdKbTc = s415.size() > 0 && s415[0] == "1"; //getdotstr(1, sysset[415] + '^', '^') = '1');
m_itemvCJH.ZdKbTcJl = s415.size() > 1 && s415[1] != "" ? std::atoi(s415[1].c_str()) : 1; //strtointdef(getdotstr(2, sysset[415] + '^', '^'), 1);
m_itemvCJH.KbTcJl = -1;
}
else
{
m_itemvCJH.bZdKbTc = false;
m_itemvCJH.ZdKbTcJl = 1;
m_itemvCJH.KbTcJl = -1;
}
//溜车变量初始化
//SysSet[529]:模拟灯光是否需要人脸验证
//说明:这个参数目前我没有实际的用到
m_sfyz_state = 0;
const std::string& s529 = TableSysSet->get529();
if(s529 == "1" && m_car->isExamMode())
{
m_sfyz_state = 1; //模拟灯光是否需要人脸验证
}
//SysSet[394]:档位车速范围
// (*
// 1:0-20;2:5-30;3:15-40;4:25-55;5:35-150;
// *)
const std::vector<std::vector<std::string>>& s394 = TableSysSet->asArray2_394();
if(!s394.empty())
{
ISub3JudgeItem* item = m_car->findJudgeItem(Sub3ItemType14Jjdw);
if(item)
{
Sub3Judge14Jjdw* item14 = dynamic_cast<Sub3Judge14Jjdw*>(item);
TASSERT(item14 != nullptr, "");
if(item14)
{
TSub3Item14Jjdw* itemv14 = item14->getItemv();
for(size_t i = 0; i < s394.size(); i++)
{
const std::vector<std::string>& s394i = s394[i]; //getdotstr(I, Sysset[394] + ';', ';');
if(s394i.empty()) break;
std::string str1 = s394i.size() > 0 ? s394i[0] : ""; //GetDotStr(1, Str + ':', ':');
std::string str2 = s394i.size() > 1 ? s394i[1] : ""; //GetDotStr(2, Str + ':', ':');
if(str1 == "" || str1 == "0") continue;
if(str2 == "") continue;
int dw = std::atoi(str1.c_str());
const std::vector<std::string> stmp = Tools::split(str2, "-");
itemv14->DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
itemv14->DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 100;
}
}
}
}
m_itemvCJH.jscnt = 1; //汉中需求
//掉头地点选择不当(角度阈值)
const std::vector<std::string>& s510 = TableSysSet->asArray510();
m_itemvCJH.dtzzj = s510.size() > 3 && s510[3] != "" ? std::atoi(s510[3].c_str()) : 150; //StrToIntdef(GetDotStr(4, sysset[510], ','), 150);
TCar* tcar = m_car->getTCar();
tcar->fxd3scs = 3 * FRAMES_PER_SECOND; //tcar->fxd3scs = 3 * 5;
#if JUDGE_USE_INSPECT
tcar->fxd3scs = 12;
#endif
//空挡滑行参数
m_itemvCJH.kdhx = 5; //StrToIntdef(readiniparam('综合评判', 'kdhx', '8'), 8); 20170712
if(ksdd == siteof::njdckm3)
{
m_itemvCJH.kdhx = 10;
}
//离合器参数相关:离合器时长^离合器距离^离合器空挡滑行时间^
//评判半联动用的比如前进状态下离合器连续30秒
const std::vector<std::string>& s500 = TableSysSet->asArray500();
std::string s500_1 = s500.size() > 0 ? s500[0] : "";
const std::vector<std::string> ss500_1 = Tools::split(s500_1, "^");
m_itemvCJH.lhqxs = ss500_1.size() > 0 && ss500_1[0] != "" ? std::atoi(ss500_1[0].c_str()) : 30;
//离合器距离
m_itemvCJH.lhqxjl = ss500_1.size() > 1 && ss500_1[1] != "" ? std::atoi(ss500_1[1].c_str()) : 0;
//离合器空挡滑行时间
//SysSet[363]:踩下离合器也算空档滑行(0-否 1-是 2-2019年8月检测新规则)
m_itemvCJH.lhq_kdhxxs = ss500_1.size() > 2 && ss500_1[2] != "" ? std::atoi(ss500_1[2].c_str()) : m_itemvCJH.kdhx;
//自动熄火评判方式:熄火次数扣分,1:根据PLC熄火次数 2根据点火2其它值根据发动机转速为0或点火2+转速大于100
m_itemvCJH.zdxhkf = s500.size() > 1 && s500[1] != "" ? std::atoi(s500[1].c_str()) : 0;
if(tcar->XiHuo != INVALID_INDEX) //优先以车型代码参数NO3=70,同500参数
{
m_itemvCJH.zdxhkf = tcar->XiHuo;
}
//踩副刹时长
m_itemvCJH.fscys = s500.size() > 2 && s500[2] != "" ? std::atoi(s500[2].c_str()) : 5;
//挡位扣分间隔
m_itemvCJH.DWKF_SJ = (s500.size() > 3 && s500[3] != "" ? std::atoi(s500[3].c_str()) : 20) * SECOND;
//加速发动机转速阀值^加速发动机变化倍数^
std::string Str = s500.size() > 4 && s500[4] != "" ? s500[4] : "";
const std::vector<std::string> s500_4 = Tools::split(Str, "^");
m_itemvCJH.KongYouMen_FDJ_YZ = s500_4.size() > 0 && s500_4[0] != "" ? std::atoi(s500_4[0].c_str()) : 3000;
//变化倍数
m_itemvCJH.KonbYouMen_FDJ_BS = s500_4.size() > 1 && s500_4[1] != "" ? std::atoi(s500_4[1].c_str()) : 3;
//转向灯不关闭距离^项目结束后不关闭时间
Str = s500.size() > 5 && s500[5] != "" ? s500[5] : "";
const std::vector<std::string> s500_5 = Tools::split(Str, "^");
m_itemvCJH.ZXD_BGB_JL = s500_5.size() > 0 && s500_5[0] != "" ? std::atoi(s500_5[0].c_str()) : 3000;
m_itemvCJH.ZXD_BGB_SJ = s500_5.size() > 1 && s500_5[1] != "" ? std::atoi(s500_5[1].c_str()) : 0;
//方向控制不稳角度
m_itemvCJH.fxkzbwjd = s500.size() > 6 && s500[6] != "" ? std::atof(s500[6].c_str()) : 5;
//方向控制不稳系数
m_itemvCJH.fxkzbwxz = s500.size() > 7 && s500[7] != "" ? std::atof(s500[7].c_str()) : 0.1;
//制动不平顺时间 扣分间隔时间
m_itemvCJH.ZDBPS_SJ = s500.size() > 8 && s500[8] != "" ? std::atoi(s500[8].c_str()) : 90;
//准备考试等待时间
m_itemvCJH.zbksddsj = (s500.size() > 9 && s500[9] != "" ? std::atof(s500[9].c_str()) : 5) * MINUTE; //准备考试允许等待时间 20150721 单位分钟
//开始考试后n秒不启动发动机扣分设置时间秒
m_itemvCJH.kaishikaoshi_fadongji = s500.size() > 19 && s500[19] != "" ? std::atoi(s500[19].c_str()) : 0;
//准备考试允许等待时间提示最大次数
m_itemvCJH.zbksddtscs = s500.size() > 10 && s500[10] != "" ? std::atoi(s500[10].c_str()) : 2; // 20170508
//点火等待时间单位秒
m_itemvCJH.dddhsj = (s500.size() > 11 && s500[11] != "" ? std::atoi(s500[11].c_str()) : 15) * SECOND; // 点火等待时间 20150721 单位秒
//越级加挡持续时间
m_itemvCJH.yjjdcxsj = s500.size() > 13 && s500[13] != "" ? std::atoi(s500[13].c_str()) : 2;
//全程越级加挡扣专项扣分 0:扣通用分 1扣专项分
m_itemvCJH.qcyjjdkf = s500.size() > 14 && s500[14] != "" ? std::atoi(s500[14].c_str()) : 1;
//模拟灯光触发等待时长,单位秒(插了安全带后等待时长再触发模拟灯光)
m_itemvCJH.mndgddsj = (s500.size() > 16 && s500[16] != "" ? std::atoi(s500[16].c_str()) : 0) * SECOND;
//变道方向灯评判时机 0以变道时判灯 2以压线时记录打灯记录变道时评判
m_itemvCJH.bdfxdsj = s500.size() > 17 && s500[17] != "" ? std::atoi(s500[17].c_str()) : 0;
#if JUDGE_USE_INSPECT
m_itemvCJH.bdfxdsj = 2;
#endif
//中心虚线借道是否要打方向灯 0不需要 1需求 默认为0
m_itemvCJH.JieDaoFXD_Flag = s500.size() > 18 && s500[18] != "" ? std::atoi(s500[18].c_str()) == 1 : false;
const std::vector<std::string>& s502 = TableSysSet->asArray502();
//起步项目进项目时机 0表示只要停车满足5秒就进入起步状态 1表示只有差分才能进项目
m_itemvCJH.qbjxmsj = s502.size() > 5 && s502[5] != "" ? std::atoi(s502[5].c_str()) : 0;
//停车多长时间进入起步状态单位秒最大值5最小值1
m_itemvCJH.qbsjcs = s502.size() > 6 && s502[6] != "" ? std::atoi(s502[6].c_str()) : 5;
if(m_itemvCJH.qbsjcs == 0 || m_itemvCJH.qbsjcs > 5)
{
m_itemvCJH.qbsjcs = 5;
}
//是否一上车就系了安全带
m_itemvCJH.bKsAqd = (sor.aqd == SYES); //20150112;
//转向灯打开,一开始的距离
m_itemvCJH.ZXD_Open_TempJL = -1;
//临时停车状态
m_itemvCJH.lstc_zt = -1; //20151116
//夜间行驶用到,同方向近距离跟车行驶
m_itemvCJH.gc_zt = -1; //20160617
//夜间行驶用到,人行横道相关的
m_itemvCJH.rxhd_zt = -1;
//夜间行驶用到,无信号灯控制的路口
m_itemvCJH.wxhd_zt = -1;
//夜间行驶,模拟会车用到
m_itemvCJH.hc_zt = -1;
//夜间行驶,模拟超车用到
m_itemvCJH.cc_zt = -1;
//广西梧州 开始考试要在2分钟内启动发动机
m_itemvCJH.qdfdjpp = true; //20181016
TTestCtl* ctl = m_car->getTTestCtl();
for(size_t i = 0; i < ctl->Dw_Cs_JL.size(); i++)
{
ctl->Dw_Cs_JL[i] = {0, 0};
ctl->Dw_Cs_JL1[i] = {0, 0};
ctl->Dw_Cs_JL2[i] = {0, 0};
}
//SysSet[301]:
//条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^
//条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^
const std::vector<std::string>& s301 = TableSysSet->asArray301();
const std::vector<std::string> s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector<std::string>();
if(!s301_1.empty())
{
m_itemvCJH.dw_cs_dw1 = s301_1.size() > 0 && s301_1[0] != "" ? std::atoi(s301_1[0].c_str()) : 1;
m_itemvCJH.dw_cs_cs1 = s301_1.size() > 1 && s301_1[1] != "" ? std::atoi(s301_1[1].c_str()) : 1;
m_itemvCJH.dw_cs_sj1 = s301_1.size() > 2 && s301_1[2] != "" ? std::atoi(s301_1[2].c_str()) : 1;
m_itemvCJH.dw_cs_sl1 = s301_1.size() > 4 && s301_1[4] != "" ? std::atoi(s301_1[4].c_str()) : 0;
}
else
{
m_itemvCJH.dw_cs_dw1 = 1;
m_itemvCJH.dw_cs_cs1 = 1;
m_itemvCJH.dw_cs_sj1 = 1;
m_itemvCJH.dw_cs_sl1 = 0;
}
const std::vector<std::string>& s301_2 = s301.size() > 1 ? Tools::split(s301[1], ",") : std::vector<std::string>();
if(!s301_2.empty())
{
m_itemvCJH.dw_cs_dw2 = s301_2.size() > 0 && s301_2[0] != "" ? std::atoi(s301_2[0].c_str()) : 1;
m_itemvCJH.dw_cs_cs2 = s301_2.size() > 1 && s301_2[1] != "" ? std::atoi(s301_2[1].c_str()) : 1;
m_itemvCJH.dw_cs_sj2 = s301_2.size() > 2 && s301_2[2] != "" ? std::atoi(s301_2[2].c_str()) : 1;
m_itemvCJH.dw_cs_sl2 = s301_2.size() > 4 && s301_2[4] != "" ? std::atoi(s301_2[4].c_str()) : 0;
}
else
{
ctl->Dw_Cs_Ok2 = true;
m_itemvCJH.dw_cs_dw2 = 1;
m_itemvCJH.dw_cs_cs2 = 1;
m_itemvCJH.dw_cs_sj2 = 1;
m_itemvCJH.dw_cs_sl2 = 0;
}
std::string s301_3 = s301.size() > 2 ? s301[2] : "";
//301评判时间0-结束考试时评判1-里程达标就评判 100-表示已评判过 20140630 //yhyflag
ctl->dw_kf_sj = s301_3 != "" ? std::atoi(s301_3.c_str()) : 1; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
//******老的新科三注释掉没用了******
//SysSet[530]:环境感知相关参数(原封不动翻译即可,前期用不到,赞不考虑)
// const std::vector<std::string>& s530 = TableSysSet->asArray530();
// //双手离开方向盘时间参数
// m_itemvCJH.sslkfxp_sj = s530.size() > 0 && s530[0] != "" ? std::atoi(s530[0].c_str()) : 15; //StrToIntdef(GetDotStr(1, Sysset[530] + '^', '^'), 15);
// //单手离开方向盘时间秒右边距离偏差cm
// const std::string& ss530 = s530.size() > 1 && s530[1] != "" ? s530[1] : "";
// const std::vector<std::string> s530_2 = Tools::split(ss530, ",");
//
// m_itemvCJH.dslkfxp_sj = s530_2.size() > 0 && s530_2[0] != "" ? std::atoi(s530_2[0].c_str()) : 60;
// m_itemvCJH.dslkfxp_jlpc = s530_2.size() > 1 && s530_2[1] != "" ? std::atoi(s530_2[1].c_str()) : 30;
// //伸出窗外时间秒
// m_itemvCJH.sccw_sj = s530_2.size() > 2 && s530_2[2] != "" ? std::atoi(s530_2[2].c_str()) : 1;
//
// m_itemvCJH.sslkfxp_kfbj = -1;
// m_itemvCJH.dslkfxp_kfbj = -1;
// m_itemvCJH.sccw_kfbj = -1;
// m_itemvCJH.kfsj_43 = -1;
// m_itemvCJH.kfsj_20_62 = -1;
//1挡距离
m_itemvCJH.dw12_1d_jl = 100000;
//2挡距离
m_itemvCJH.dw12_2d_jl = 100000;
//1+2挡累计距离
m_itemvCJH.dw12_3d_jl = 100000;
//1挡时间
m_itemvCJH.dw12_1d_sj = 100000000;
//2挡时间
m_itemvCJH.dw12_2d_sj = 100000000;
//1+2挡累计时间
m_itemvCJH.dw12_3d_sj = 100000000;
//挡位起效距离相关
m_itemvCJH.dw12_Ljjl1 = cg->ai_ljjl;
m_itemvCJH.dw12_Ljjl2 = cg->ai_ljjl;
//起效的有效时间TK
m_itemvCJH.dw12_Ljsj1 = cg->tkCnt; //m_car->GetCurrentTick2();
m_itemvCJH.dw12_Ljsj2 = cg->tkCnt; //m_car->GetCurrentTick2();
//SysSet[316]
// (*
// 1^距离^重复(0-否,1-是)^扣分^时间^~2^距离^重复^扣分^时间^~3(1,2档累计使用)^距离^重复^扣分^时间^~
// *)
const std::vector<std::string>& s316 = TableSysSet->asArray316();
const std::vector<std::vector<std::string>> s316s = Tools::split(s316.size() > 0 ? s316[0] : "", "~", "^");
for(size_t i = 0; i < s316.size(); i++) // i < 3
{
const std::vector<std::string>& s316_i = s316s[i];
if(s316_i.empty()) break;
int dw = s316_i.size() > 0 && s316_i[0] != "" ? std::atoi(s316_i[0].c_str()) : 0; // StrToIntdef(GetDotStr(1, str, '^'), 0);
if(dw == 1)
{
m_itemvCJH.dw12_1d_jl = s316_i.size() > 1 && s316_i[1] != "" ? std::atoi(s316_i[1].c_str()) : 0;
m_itemvCJH.dw12_1d_kfrep = s316_i.size() > 2 && s316_i[2] == "1";
m_itemvCJH.dw12_1d_kf = s316_i.size() > 3 ? s316_i[3] : "";
const std::vector<std::string> s = Tools::split(m_itemvCJH.dw12_1d_kf, ",");
int tmp = s.size() > 0 && s[0] != "" ? std::atoi(s[0].c_str()) : 0;
if(tmp == 0)
{
m_itemvCJH.dw12_1d_kf = "";
}
//20140529
m_itemvCJH.dw12_1d_sj = (s316_i.size() > 4 && s316_i[4] != "" ? std::atoi(s316_i[4].c_str()) : 5) * SECOND;
}
else if(dw == 2)
{
m_itemvCJH.dw12_2d_jl = s316_i.size() > 1 && s316_i[1] != "" ? std::atoi(s316_i[1].c_str()) : 0;
m_itemvCJH.dw12_2d_kfrep = s316_i.size() > 2 && s316_i[2] == "1";
m_itemvCJH.dw12_2d_kf = s316_i.size() > 3 ? s316_i[3] : "";
const std::vector<std::string> s = Tools::split(m_itemvCJH.dw12_2d_kf, ",");
int tmp = s.size() > 0 && s[0] != "" ? std::atoi(s[0].c_str()) : 0;
if(tmp == 0)
{
m_itemvCJH.dw12_2d_kf = "";
}
//20140529
m_itemvCJH.dw12_2d_sj = (s316_i.size() > 4 && s316_i[4] != "" ? std::atoi(s316_i[4].c_str()) : 0) * SECOND;
}
else if(dw == 3)
{
m_itemvCJH.dw12_3d_jl = s316_i.size() > 1 && s316_i[1] != "" ? std::atoi(s316_i[1].c_str()) : 0;
m_itemvCJH.dw12_3d_kfrep = s316_i.size() > 2 && s316_i[2] == "1";
m_itemvCJH.dw12_3d_kf = s316_i.size() > 3 ? s316_i[3] : "";
const std::vector<std::string> s = Tools::split(m_itemvCJH.dw12_3d_kf, ",");
int tmp = s.size() > 0 && s[0] != "" ? std::atoi(s[0].c_str()) : 0;
if(tmp == 0)
{
m_itemvCJH.dw12_3d_kf = "";
}
//20140529
m_itemvCJH.dw12_3d_sj = (s316_i.size() > 4 && s316_i[4] != "" ? std::atoi(s316_i[4].c_str()) : 0) * SECOND;
}
}
const std::vector<std::string>& s316_2 = Tools::split(s316.size() > 1 ? s316[1] : "", "^");
if(!s316_2.empty())
{
m_itemvCJH.low_speed = s316_2.size() > 0 && s316_2[0] != "" ? std::atoi(s316_2[0].c_str()) : 0;
m_itemvCJH.low_speed_jl = s316_2.size() > 1 && s316_2[1] != "" ? std::atoi(s316_2[1].c_str()) : 0;
}
// (*
// no1=8 (路段设置)
// no2=2
// txt1=路段号road_code
// txt2=最高速度,持续时间^照明情况^能否掉头^
// *)
m_itemvCJH.Road_Attr_LEN = 0;
int size = TableSysParm->parm8Size();
for(int i = 0; i < size; i++)
{
const TSystemparm* parm = TableSysParm->parm8By(i);
if(parm && parm->NO2 == 2 && parm->TXT1 != "")
{
m_itemvCJH.Road_Attr[m_itemvCJH.Road_Attr_LEN].Road_Code = parm->TXT1;
m_itemvCJH.Road_Attr[m_itemvCJH.Road_Attr_LEN].Attr_Str = parm->TXT2;
m_itemvCJH.Road_Attr_LEN++;
}
}
//全程车速要求
// (*
// 全程车速要求:评判标记(0-不评判1-里程车速评判2-按分断车速持续时间)^每M米之内保持N米(秒)YKm/h车速以上^
// *)
const std::vector<std::string>& s400 = TableSysSet->asArray400();
std::string s400_1 = s400.size() > 0 && s400[0] != "" ? s400[0] : "";
ctl->Cs_type = s400_1 != "" ? std::atoi(s400[0].c_str()) : 0; //20180810
if(s400_1 != "1" && s400_1 != "2") //20180810
{
ctl->Cs_Yq = 0;
}
else
{
std::string s400_2 = s400.size() > 1 && s400[1] != "" ? s400[1] : "";
if(s400_2 == "")
{
ctl->Cs_Yq = 0;
}
else
{
if(ctl->Cs_type == 1)
{
std::vector<std::string> ss = Tools::split(s400_2, ",");
ctl->Cs_JlYq1 = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 500;
ctl->Cs_JlYq2 = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 50;
ctl->Cs_Yq = ss.size() > 2 && ss[2] != "" ? std::atoi(ss[2].c_str()) : 20;
m_itemvCJH.Cs_ljZ = cg->ai_ljjl;
m_itemvCJH.Cs_lj0 = cg->ai_ljjl;
m_itemvCJH.Cs_lj1 = 0;
m_itemvCJH.Cs_lj2 = 0;
}
if(ctl->Cs_type == 2)
{
std::vector<std::string> ss = Tools::split(s400_2, ",");
ctl->Cs_JlYq1 = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 1000;
ctl->Cs_JlYq2 = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 3; //时长
ctl->Cs_Yq = ss.size() > 2 && ss[2] != "" ? std::atoi(ss[2].c_str()) : 27; //车速
m_itemvCJH.Cs_ljZ = cg->ai_ljjl;
m_itemvCJH.Cs_lj0 = cg->ai_ljjl;
m_itemvCJH.Cs_lj1 = 0;
m_itemvCJH.Cs_lj2 = 0;
}
}
}
//20181016
if(ksdd == siteof::GXWZKM3)
{
m_itemvCJH.Cs_ljZ = cg->ai_ljjl;
}
////////////////////////////////////////////////////////////////////////////
//挡位车速范围
//SysSet[394]
if(!s394.empty())
{
for(size_t i = 0; i < s394.size(); i++)
{
const std::vector<std::string>& s394i = s394[i]; //getdotstr(I, Sysset[394] + ';', ';');
if(s394i.empty()) break;
std::string str1 = s394i.size() > 0 ? s394i[0] : ""; //GetDotStr(1, Str + ':', ':');
std::string str2 = s394i.size() > 1 ? s394i[1] : ""; //GetDotStr(2, Str + ':', ':');
int dw = std::atoi(str1.c_str());
const std::vector<std::string> stmp = Tools::split(str2, "-");
m_itemvCJH.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
m_itemvCJH.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0;
}
}
//开始下山路段号 20151112 贵州
m_itemvCJH.xsldh = 100;
const std::vector<std::string>& s484 = TableSysSet->asArray484();
if(!s484.empty()) //20151112
{
m_itemvCJH.xsldh = (s484.size() > 1 && s484[1] != "" ? std::atoi(s484[1].c_str()) : 99) + 1;
}
m_itemvCJH.dh1 = sor.dh1;
m_itemvCJH.fdjzs = sor.fdjzs;
m_itemvCJH.ItemNo = Sub3ItemType20Comm;
//方向盘参数复位
ResetFxp();
//方向灯状态
itm20_ckfxd();
//熄火
m_itemvCJH.xhcs = 0; //sor.xhcs; //yhyflag 暂时用不到这个参数
}
void Sub3Judge20Comm::ResetFxp()
{
const TChuanGan* cg = m_car->historyChuanGan();
m_itemvCJH.izz = 0; //cg.ai_zz; //yhyflag .izz和.iyz用不到
m_itemvCJH.iyz = 0; //cg.ai_yz;
for(size_t i = 0; i < m_itemvCJH.ibtkt.size(); i++)
{
m_itemvCJH.ibtkt[i] = cg->tkCnt; //m_car->GetCurrentTick2();
}
m_itemvCJH.ifxpflag = 0;
m_itemvCJH.ifxpidx = 0;
m_itemvCJH.dtfxpmark = cg->tkCnt - 3000; //m_car->GetCurrentTick2() - 3000;
}
void Sub3Judge20Comm::itm20_ckfxd()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
if(sor.zfxd == SYES)
{
if(m_itemvCJH.ifxdflag > -1)
{
m_itemvCJH.ifxdflag = -1;
m_itemvCJH.ifxdtkt = cg->tkCnt; //m_car->GetCurrentTick2();
}
}
if(sor.yfxd == SYES)
{
if(m_itemvCJH.ifxdflag < 1)
{
m_itemvCJH.ifxdflag = 1;
m_itemvCJH.ifxdtkt = cg->tkCnt; //m_car->GetCurrentTick2();
}
}
}
//设置发动机怠速
void Sub3Judge20Comm::Set_FDJ_DS()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
bool ErrorFlag = false;
int TotalZS;
//设置发动机怠速
//发动机怠速值是否设置
TCar* tcar = m_car->getTCar();
if(tcar->bFDJDS == false && tcar->ZDB_Flag == true)
{
if(m_car->historyCount() >= 30) //收到了6秒数据
{
if(cg->move == moveStop && sor.fdjzs > 500)
{
ErrorFlag = false;
TotalZS = 0;
for(int i = 1; i <= 25; i++)
{
const TChuanGan* hisi = m_car->historyChuanGan(1);
const TSensorInfo& sori = hisi->real.sensor;
if(hisi->move != moveStop)
{
ErrorFlag = true;
break;
}
if(sori.fdjzs <= 500)
{
ErrorFlag = true;
}
TotalZS += sori.fdjzs;
}
if(ErrorFlag == false)
{
TCar* tcar = m_car->getTCar();
tcar->bFDJDS = true;
tcar->FDJDS = TotalZS / 25; //div
}
}
}
}
}
//检查座椅
void Sub3Judge20Comm::doCheck_ZuoYi()
{
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 std::string& ksdd = TableSysSet->get211();
if(!m_qbjc_zuoyi) //20151207
{
if((sor.dh2 == 1 && sor1.dh2 == 0) || (sor.fdjzs > 100 && sor1.fdjzs < 100))
{
m_qbjc_zuoyi = true;
if(Tools::pos(siteof::guizhou, ksdd))
{
if(!m_itemvCJH.bJc1)
{
JUDGE_MARK_SUB3(2, "50", false);
}
if(!m_itemvCJH.bJc2)
{
JUDGE_MARK_SUB3(2, "51", false);
}
if(!m_itemvCJH.bJc3)
{
JUDGE_MARK_SUB3(2, "52", false);
}
}
else if(ksdd == siteof::ynzt)
{
if(!m_itemvCJH.bJc1)
{
JUDGE_MARK_SUB3(2, "50", false);
}
if(!m_itemvCJH.bJc3)
{
JUDGE_MARK_SUB3(2, "52", false);
}
}
else if(ksdd == siteof::ynljys)
{
if(!m_itemvCJH.bJc1 || !m_itemvCJH.bJc3 || !m_itemvCJH.bJc2)
{
JUDGE_MARK_SUB3(2, "52", false);
}
}
else
{
if(!m_itemvCJH.bJc1 || !m_itemvCJH.bJc3)
{
JUDGE_MARK_SUB3(2, "52", false);
}
}
}
}
if(!m_itemvCJH.bJc2)
{
if(Tools::pos(siteof::guizhou, ksdd) == false && ksdd != siteof::ynzt && ksdd != siteof::ynljys)
{
if(m_car->rtkEnabled() && cg->ai_ljjl > 1 && cg->move == moveForward)
{
m_itemvCJH.bJc2 = true;
JUDGE_MARK_SUB3(2, "53", true); //检查座椅
}
}
}
}
//加载模拟灯光项目
void Sub3Judge20Comm::CallMoNiDengGuang()
{
#if JUDGE_USE_INSPECT
return; //屏蔽模拟灯光
#endif
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 TChuanGan* his3 = m_car->historyChuanGan(3);
const TSensorInfo& sor3 = his3->real.sensor;
const std::string& ksdd = TableSysSet->get211();
const std::string& s386 = TableSysSet->get386();
if(s386 == "3")
{
//无锡地区模式只要发动机启动了,点切换就上车准备自动完成播报模拟灯光 //2025-03-21 yhy add
//无锡地区在发动机未启动点切换,提示启动发动机,启动发动机之后播报模拟灯光
if(m_itemvXLG.rmndg2 == false)
{
if(sor.rmndg == 2 && sor1.rmndg == 0 && sor2.rmndg == 0)
{
m_itemvXLG.rmndg2 = true;
}
}
}
if(m_car->disForward() + m_car->disBackward() < 50 &&
sor.fdjzs == SNOT && sor1.fdjzs == SNOT && sor2.fdjzs == SNOT && sor3.fdjzs == SNOT)
{
//如果配置512走512如果没配走533如果533没配置走插安全带
/*
* (9)ksksms:标准的开始考试模式,必须熄火状态下开始考试,
* 以点火触发模拟灯光(启用标记^t1提示点火时间^t2不下车绕车扣分时间^t3提示后未点火扣分时间^)
*启用标记1-从副驾驶门外开始考试绕车2-从主驾驶位置上开始考试绕车建议使用2模式
*/
const std::vector<std::string>& s512 = TableSysSet->asArray512();
std::string Temp = s512.size() > 8 && s512[8] != "" ? s512[8] : "";
const std::vector<int> ss512 = Tools::splitToInt(Temp, "^");
if(ss512.size() > 0 && ss512[0] == 1) //2024-11-13杭州新增
{
int n = ss512.size() > 1 ? ss512[1] : 0;
int m = ss512.size() > 3 ? ss512[3] : 0;
if(n > 0)
{
//n秒提示一次请启动发动机
if(m_engineTick == 0 && m_car->timeElapsed() > n*SECOND)
{
m_engineTick = cg->tkCnt;
//ToDo:语音提示点火
m_car->createEventSound({itemNo(), sound::sub3_ts_fdj});
}
}
if(m > 0)
{
if(m_engineTick > 0 && cg->tkCnt - m_engineTick > m*SECOND)
{
JUDGE_MARK_SUB3(20, "94", true);
}
}
return;
}
//533参数开始考试后n秒提示点火,m秒不点火扣分, 参数格式30,60
const std::vector<int>& s533 = TableSysSet->asArrayInt533();
if(s533.size() > 0)
{
int n = s533.size() > 0 ? s533[0] : 0;
int m = s533.size() > 1 ? s533[1] : 0;
if(n > 0)
{
//n秒提示一次请启动发动机
if(m_engineTick == 0 && m_car->timeElapsed() > n*SECOND)
{
m_engineTick = cg->tkCnt;
//ToDo:语音提示点火
m_car->createEventSound({itemNo(), sound::sub3_ts_fdj});
}
}
if(m > 0)
{
if(m_engineTick > 0 && cg->tkCnt - m_engineTick > m*SECOND)
{
JUDGE_MARK_SUB3(20, "94", true);
}
}
return;
}
if(sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SYES) //2024-11-13杭州新增
{
static constexpr int n = 10;
//static constexpr int m = 0;
//if(m_engineTick == 0) m_engineTick = cg->tkCnt;
//n秒提示一次请启动发动机
if(cg->tkCnt - m_engineTick > n*SECOND)
{
m_engineTick = cg->tkCnt;
//ToDo:语音提示点火
m_car->createEventSound({itemNo(), sound::sub3_ts_fdj});
}
return;
}
}
TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg);
if(item41 == nullptr) //有可能免考,可能没这个项目
{
return;
}
if(item41->FinishFlag == true) //考结束了
{
ISub3JudgeItem* item = m_car->findJudgeItem(Sub3ItemType41Mndg);
if(item)
{
Sub3Judge41Mndg* item41mndg = dynamic_cast<Sub3Judge41Mndg*>(item);
if(item41mndg)
{
item41mndg->JudgeEndCloseLight();
}
}
return;
}
if(item41->Item_Color != itemStateWk) //正在考或者已经考过了
{
return;
}
//模拟灯光参数386=0,开始考试后,就触发模拟灯光
if(s386 != "0" && s386 != "3")
{
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
if(item01 && item01->FinishFlag == false)
{
return;
}
}
//322参数0:模拟灯光开始和结束都要检查 1:只检查结束 2:只检查开始 默认不配置都检查
//501第10个参数时间毫秒、如果不配置那就是2米检查如果过程中关闭再打开也算关闭
const std::string& s322 = TableSysSet->get322();
if((sor.fdjzs > 100 && sor1.fdjzs > 100 && sor2.fdjzs > 100 && sor3.fdjzs > 100) ||
(Tools::pos(JUDGE_UTF8S("江淮电动"), m_car->carClass()) && sor.dh1 == SYES) ||
(s386 == "5" && sor.dh1 == SYES) ||
(s386 == "6" && sor.aqd == SYES && sor1.aqd == SYES) ) //20170314 训练模式 只要有dh1就可以进行模拟灯光
{
//关闭灯光提示 20180809
if((s322 != "1") && (sor.shtd + sor.skd + sor.ygd + sor.jgd + sor.zfxd + sor.yfxd > 0 || ksdd == siteof::nj))
{
if(!m_itemvCJH.Gbdg_ID)
{
m_itemvCJH.Gbdg_ID = true;
//ToDo:语音提示:请关闭所有灯光
m_itemvCJH.Gbdg_SndTk = cg->tkCnt;
m_car->createEventSound({Sub3ItemType41Mndg, sound::sub3_417001});
}
if(m_itemvCJH.Gbdg_SndTk > 0 && m_itemvCJH.Gbdg_Kfyy == 0)
{
//ToDo1: 语音播报完毕
//这里留意一下
if(cg->tkCnt - m_itemvCJH.Gbdg_SndTk > 4*SECOND) //If (语音播报完毕) then //yhyflag
{
m_itemvCJH.Gbdg_Kfyy = cg->tkCnt;
}
}
//20181002
if(ksdd == siteof::nj && m_itemvCJH.Gbdg_SndTk > 0 && cg->tkCnt - m_itemvCJH.Gbdg_SndTk > 5*SECOND)
{
if(sor.shtd + sor.skd + sor.ygd + sor.jgd == 0)
{
//开始模拟灯光
if(item41 && item41->Item_Color == itemStateWk) //有可能免考,可能没这个项目
{
m_car->setEnterItem(item41);
}
}
}
if(m_itemvCJH.Gbdg_Kfyy > 0 && cg->tkCnt - m_itemvCJH.Gbdg_Kfyy > 10*SECOND)
{
if(sor.shtd + sor.skd + sor.ygd + sor.jgd + sor.zfxd + sor.yfxd > 0)
{
//20180205
//WriteStringToLog('Playsound', '检查灯光扣分:' + inttostr(cg.tkCnt) + '-' + inttostr(m_itemvCJH.Gbdg_Kfyy));
if(ksdd == siteof::guizhouzy)
{
JUDGE_MARK_SUB3(20, "93", true);
}
else
{
JUDGE_MARK_SUB3(41, "42", true);
}
if(m_car->isExamDrill())
{
//开始模拟灯光
if(item41 && item41->Item_Color == itemStateWk) //有可能免考,可能没这个项目
{
m_car->setEnterItem(item41);
}
}
}
}
}
else
{
if(s386 == "3")
{
//无锡地区模式只要发动机启动了,点切换就上车准备自动完成播报模拟灯光 //2025-03-21 yhy add
//无锡地区在发动机未启动点切换,提示启动发动机,启动发动机之后播报模拟灯光
if(m_itemvXLG.rmndg2 && sor.fdjzs > 100 && sor1.fdjzs > 100 && sor2.fdjzs > 100)
{
m_car->KM3EndItem(Sub3ItemType01Sczb,true,false);
m_car->setEnterItem(item41);
}
}
else
{
//开始模拟灯光
m_car->setEnterItem(item41);
}
}
}
else
{
//提示启动发动机
}
}
void Sub3Judge20Comm::CallQiBu()
{
bool condition = (m_itemvCJH.qbjxmsj == 0 ||
(m_itemvCJH.qbjxmsj != 0 && m_car->rtkEnabled() && m_car->rtkEnabled(1) && m_car->rtkEnabled(2)));
if(!condition)
{
return;
}
const TChuanGan* cg = m_car->historyChuanGan();
const std::string& ksdd = TableSysSet->get211();
if(!m_car->itemsSomeExaming())
{
return;
}
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item11 && item11->Item_Color == itemStateZk)
{
return;
}
if(ksdd == siteof::weinancgs)
{
if(cg->ai_ljjl > 5)
{
return;
}
}
//20171107
int k = m_itemvCJH.qbsjcs * 5;
for(int i = 1; i <= k; i++)
{
TChuanGan* his = m_car->historyChuanGan(i);
if(his == nullptr)
{
break;
}
if(his->move != moveStop) // or (lscg[zj(i)].di_qjzt_gps = 2)
{
return;
}
if((ksdd == siteof::heb || ksdd == siteof::shenyangkm3) && cg->ai_ljjl > 10)
{
if(his->move != moveForward)
{
return;
}
}
}
//SysSet[502]:起步触发顺序0-无限制1-上车准备完成2-模拟灯光完成
const std::vector<std::string>& s502 = TableSysSet->asArray502();
int s502_9 = s502.size() > 9 && s502[9] != "" ? std::atoi(s502[9].c_str()) : 0; //StrToIntdef(GetDotStr(10, sysset[502], ','), 0);
if(s502_9 == 1)
{
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
if(item01)
{
if(item01->Item_Color == itemStateWk || item01->Item_Color == itemStateZk)
{
return;
}
}
}
else if(s502_9 == 2)
{
//SysSet[362] 启用监管系统(0-否 1-项目进一次 2-项目进多次)
TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg); //上车准备
if(item41)
{
if(item41->Item_Color == itemStateWk || item41->Item_Color == itemStateZk) return;
if(MilliSecondsBetween(m_car->GetCurrentTime2(), item41->EndTime) < 2*SECOND) return;
}
}
bool Flag1 = false;
bool Flag2 = false;
bool Flag3 = false;
TKM3Item* item02 = m_car->findExamItem(Sub3ItemType02Qbxx); //起步项目
if(item02 && item02->TestPro == ItemProFlagIdle) Flag1 = true;
//TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc); //靠边停车
if(item11 && item11->TestPro == ItemProFlagIdle) Flag2 = true;
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
if(item01 && item01->Item_Color != itemStateWk) Flag3 = true;
if(Flag1 == true && Flag2 == true && m_car->examState() == examStateIng) // FinishKM3Flag == false
{
if(Tools::pos(siteof::guizhou, ksdd) || ksdd == siteof::shanghaikm3 || Flag3 == true)
{
if(ksdd == siteof::hbtskm3)
{
//靠边停车
if(item11 && item11->Item_Color != itemStateWk)
{
return;
}
}
const std::string& s307 = TableSysSet->get307();
//只进一次的项目
std::string itemno02 = "," + std::to_string(Sub3ItemType02Qbxx) + ",";
if(m_car->isItemPassed(Sub3ItemType02Qbxx) && Tools::pos(itemno02, "," + s307 + ","))
{
return;
}
else
{
if(item02) //起步项目
{
m_car->setEnterItem(item02);
}
m_sys360liji = cg->ai_ljjl;
}
}
}
}
/*
//1、溜车评判 //移到起步专项里评判 20240730
void Sub3Judge20Comm::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 LCValue = 32; //后溜车距离
static constexpr int LC30FaZhi = 12;
if(cg->move == moveForward && his1->move == moveForward) //前进的时候要评判溜车小于30厘米的
{
if(m_PubMaxLCValue >= LC30FaZhi && m_PubMaxLCValue <= LCValue)
{
//通用或起步项目
JUDGE_MARK_SUB3(2, "47", false);
}
m_PubLCTCPtt.x = 0;
m_PubLCTCPtt.y = 0;
m_PubMaxLCValue = 0;
m_PubCanMarkLC50Flag = true;
}
if(sor.dw != 9 && sor.dw != 6 && sor.ssc == SNOT)
{
if(m_PubLCTCPtt.x == 0 && m_PubLCTCPtt.y == 0 && m_car->rtkEnabled())
{
const TChuanGan* his2 = m_car->historyChuanGan(2);
if(cg->move == moveStop && his1->move == moveStop && his2->move == moveStop)
{
m_PubLCTCPtt.x = gps.ai_gps.x;
m_PubLCTCPtt.y = gps.ai_gps.y;
m_PubLCTC_GPS_JD = gps.jd;
m_PubLCTC_GPS_WD = gps.wd;
m_PubMaxLCValue = 0;
}
}
ExamSensor* sensor = m_car->sensor();
if(m_PubLCTCPtt.x != 0 && m_PubLCTCPtt.y != 0 && sensor->calcMoveState() != moveForward) // JudgeKM3Obj.GetMovingState <> 1
{
if(cg->move != moveForward)
{
Point Ptt = gps.ai_gps;
int b = m_PubLCTCPtt.x - Ptt.x;
int c = m_PubLCTCPtt.y - Ptt.y;
int a = std::round(std::sqrt(b*b + c*c)); //cm
int LC = a;
if(m_PubMaxLCValue < LC)
{
m_PubMaxLCValue = LC;
}
}
//溜车大于30了直接扣分
if(m_PubCanMarkLC50Flag == true && m_PubMaxLCValue > LCValue)
{
JUDGE_MARK_SUB3(2, "46", false);
m_PubCanMarkLC50Flag = false;
}
}
}
}
*/
//2、连续两次挂挡不进
void Sub3Judge20Comm::Judge_GuaDangBuJin()
{
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 std::string& ksdd = TableSysSet->get211();
//连续两次换档不进(按规则翻译即可
if(ksdd == siteof::hbcz118) return;
if(sor.dw == SNOT && sor1.dw == SNOT)
{
const TSensorInfo& sor2 = m_car->historySensor(2);
int j = 0;
int k = sor2.dw; //最近的一个前进档
int itc = 0;
//SysSet[507]>5: 2次挂挡不进在停车状态下也判
const std::vector<std::string>& s507 = TableSysSet->asArray507();
if(s507.size() > 4 && s507[4] == "1") //getdotstr(5, sysset[507], ',') = '1'
{
itc = 1;
}
else
{
if(cg->move == moveForward)
itc = 1;
}
if(itc == 1 && k > 0 && k != 9)
{
itc = 25;
if(ksdd == siteof::linxiahz)
itc = 40;
//5秒内两次挂入同一前进档
int count = m_car->historyCount();
for(int i = 3; i <= itc; i++)
{
if(i >= count) break;
const TSensorInfo& sori = m_car->historySensor(i);
int Temp = sori.dw;
//挂过其他档,不算两次换档不进
if(k != Temp && Temp > 0)
{
break;
}
if(j == 0)
{
if(Temp == 0)
{
j = 1;
}
}
else if(j == 1)
{
if(Temp == k)
{
j = 2;
}
}
else if(j == 2)
{
if(ksdd == siteof::linxiahz)
{
if(Temp != k && sor.lhq == SYES)
{
JUDGE_MARK_SUB3(20, "85", true);
break;
}
}
else
{
if(Temp == 0 && sor.lhq == SYES)
{
JUDGE_MARK_SUB3(20, "85", true);
break;
}
}
}
}
}
}
}
//3、空挡滑行
void Sub3Judge20Comm::Judge_KongDangHuaXing()
{
//C2 N空挡是0 R倒车档9 P驻车档10 D前进挡11
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TSensorInfo& sor = cg->real.sensor;
const std::string& ksdd = TableSysSet->get211();
#if JUDGE_USE_INSPECT
//无锡所只要0档前进就算空挡滑行
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TGpsInfo& gps1 = his1->real.gps;
const TSensorInfo& sor1 = his1->real.sensor;
if(cg->move == moveForward && sor.dw_plc == 0 && Tools::greater(gps.sd, 1) &&
his1->move == moveForward && sor1.dw_plc == 0 && Tools::greater(gps1.sd, 1))
{
JUDGE_MARK_SUB3(20, "11", false);
}
return;
#endif
//空挡滑行30115 相关评判
if(m_itemvCJH.kdhx_tk > 0)
{
bool i = false;
if(sor.dw > 0 || cg->move != moveForward || Tools::isZero(gps.sd))
{
i = true;
}
if(ksdd != siteof::scms && sor.lhq == SYES)
{
i = true;
}
const std::vector<std::string>& s507 = TableSysSet->asArray507();
std::string ss507 = s507.size() > 11 ? s507[11] : "";
if(ss507 != "1" && sor.lhq == SYES)
{
i = true;
}
if(i)
{
m_itemvCJH.kdhx_tk = 0;
}
else
{
TCar* tcar = m_car->getTCar();
//20171009
if(tcar->FDJDS > 0 && sor.fdjzs > tcar->FDJDS + 200 && TableSysSet->get478() == "1")
{
m_itemvCJH.kdhx_tk = cg->tkCnt;
}
else
{
if(ksdd == siteof::xiangyang)
{
// 1、所有车型:档位=0时间>5秒 2、A1A2A3B1B2行驶速度15公里/小时以上时连续踩离合时间超过15秒 C1C2C5连续踩离合时间超过15秒
if(sor.dw == 0)
{
if(cg->tkCnt - m_itemvCJH.kdhx_tk > m_itemvCJH.kdhx * SECOND)
{
if(m_car->isExamDrill())
{
JUDGE_MARK_SUB3(20, "11", false);
m_itemvCJH.kdhx_tk = 0;
}
else
{
JUDGE_MARK_SUB3(20, "11", true);
}
m_itemvCJH.kdhx_tk = 0;
}
}
}
else
{
if(cg->tkCnt - m_itemvCJH.kdhx_tk > m_itemvCJH.kdhx * SECOND)
{
if(m_car->isExamDrill())
{
JUDGE_MARK_SUB3(20, "11", false);
m_itemvCJH.kdhx_tk = 0;
}
else
{
JUDGE_MARK_SUB3(20, "11", true);
}
m_itemvCJH.kdhx_tk = 0;
}
}
}
}
}
else
{
//20160923
if(ksdd == siteof::xiangyang)
{
if(Tools::pos("C", m_car->carType2()) == true)
{
if((sor.dw == SNOT && m_itemvCJH.kdhx_tk == 0) && cg->move == moveForward)
{
m_itemvCJH.kdhx_tk = cg->tkCnt;
}
}
else
{
if(sor.dw == SNOT && m_itemvCJH.kdhx_tk == 0 && cg->move == moveForward && gps.sd > 15)
{
m_itemvCJH.kdhx_tk = cg->tkCnt;
}
}
}
else
{
if(sor.dw == SNOT && m_itemvCJH.kdhx_tk == 0 && cg->move == moveForward && gps.sd > 5)
{
m_itemvCJH.kdhx_tk = cg->tkCnt;
}
}
}
/////////////// 20180209
//SysSet[363]:踩下离合器也算空档滑行(0-否 1-是 2-2019年8月检测新规则)
const std::string& s363 = TableSysSet->get363();
if(s363 == "1")
{
if(m_itemvCJH.kdhx_tk_lhq > 0)
{
//下面按规则翻译即可
bool Flag1 = false;
bool Flag2 = false;
bool Flag3 = false;
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item11 && item11->TestPro > ItemProFlagIdle)
{
Flag1 = true;
}
TKM3Item* item44 = m_car->findExamItem(Sub3ItemType44Xxxx);
if(item44 && item44->TestPro > ItemProFlagIdle)
{
Flag2 = true;
}
TKM3Item* item12 = m_car->findExamItem(Sub3ItemType12Dtxx);
if(item12 && item12->TestPro > ItemProFlagIdle)
{
Flag3 = true;
}
if(sor.lhq == SNOT || Tools::less(gps.sd, 5) || cg->move != moveForward || Flag1 == true ||
(ksdd == siteof::guizhou && Flag2 == true) ||
(ksdd == siteof::guizhou && Flag3 == true))
{
m_itemvCJH.kdhx_tk_lhq = 0;
}
else
{
if(sor.lhq == SYES)
{
if(ksdd == siteof::xiangyang || ksdd == siteof::shandongyt) //20181010
{
if(cg->tkCnt - m_itemvCJH.kdhx_tk_lhq > 15 * SECOND)
{
if(m_car->isExamDrill())
{
JUDGE_MARK_SUB3(20, "11", true);
m_itemvCJH.kdhx_tk_lhq = 0;
}
else
{
JUDGE_MARK_SUB3(20, "11", true);
}
}
}
else
{
//20180118 xjcj 去除特殊要求 20180206
if(Tools::pos(siteof::xjcj, ksdd) || ksdd == siteof::xjks || ksdd == siteof::xjbz || ksdd == siteof::guizhou)
{
int lhqsj = 0;
//20181030
if(Tools::pos(siteof::xjcj, ksdd) || ksdd == siteof::xjbz)
{
if(Tools::pos("C", m_car->carType2()))
{
lhqsj = 5;
}
else
{
lhqsj = 12;
}
}
else if(ksdd == siteof::guizhou)
{
if(m_itemvCJH.lhq_kdhxxs > 10)
{
lhqsj = m_itemvCJH.lhq_kdhxxs;
}
else
{
lhqsj = 10;
}
}
else
{
lhqsj = 12;
}
if(cg->tkCnt - m_itemvCJH.kdhx_tk_lhq > lhqsj * SECOND)
{
JUDGE_MARK_SUB3(20, "11", false);
m_itemvCJH.kdhx_tk_lhq = 0;
}
}
else
{
if(cg->tkCnt - m_itemvCJH.kdhx_tk_lhq > m_itemvCJH.lhq_kdhxxs * SECOND)
{
JUDGE_MARK_SUB3(20, "11", false);
m_itemvCJH.kdhx_tk_lhq = 0;
}
}
}
}
}
}
else
{
if(ksdd == siteof::xiangyang)
{
if(Tools::pos("C", m_car->carType2()))
{
if(sor.lhq == SYES && cg->move == moveForward)
{
m_itemvCJH.kdhx_tk_lhq = cg->tkCnt;
}
}
else
{
if(sor.lhq == SYES && cg->move == moveForward && gps.sd > 15)
{
m_itemvCJH.kdhx_tk_lhq = cg->tkCnt;
}
}
}
else
{
if(sor.lhq == SYES && cg->move == moveForward && gps.sd > 5)
{
m_itemvCJH.kdhx_tk_lhq = cg->tkCnt;
}
}
}
}
else if(s363 == "2") //20190901
{
if(m_itemvCJH.kdhx_tk_lhq > 0)
{
if(sor.lhq == SNOT)
{
m_itemvCJH.kdhx_tk_lhq = 0;
}
if(gps.sd <= 15)
{
m_itemvCJH.kdhx_tk_lhq = 0;
}
if(m_itemvCJH.kdhx_tk_lhq > 0)
{
if(cg->tkCnt - m_itemvCJH.kdhx_tk_lhq <= 5 * SECOND)
{
if(gps.sd <= 30)
{
if(sor.jsc == SYES)
{
m_itemvCJH.kdhx_tk_lhq = 0;
}
}
if(m_itemvCJH.kdhx_dw != sor.dw)
{
m_itemvCJH.kdhx_dw = 99;
}
}
else
{
if(m_itemvCJH.kdhx_dw != 99)
{
JUDGE_MARK_SUB3(20, "11", true);
m_itemvCJH.kdhx_tk_lhq = 0;
}
else
{
if(cg->tkCnt - m_itemvCJH.kdhx_tk_lhq > 15 * SECOND)
{
JUDGE_MARK_SUB3(20, "11", true);
m_itemvCJH.kdhx_tk_lhq = 0;
}
}
}
}
}
else
{
if(sor.lhq == SYES && cg->move == moveForward && gps.sd > 15)
{
m_itemvCJH.kdhx_tk_lhq = cg->tkCnt;
m_itemvCJH.kdhx_dw = sor.dw;
}
}
}
}
//4、不按规定速度
void Sub3Judge20Comm::Judge_GuiDingSuDu()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TGpsInfo& gps1 = his1->real.gps;
const std::string& ksdd = TableSysSet->get211();
bool moves = true;
for(int i = 0 ; i <= 10; i++)
{
const TChuanGan* his = m_car->historyChuanGan(i);
if(his->move != moveForward)
{
moves = false;
break;
}
}
const std::vector<std::string>& s441 = TableSysSet->asArray441();
//SysSet[441]:全程限高速0-不启用 >0表示启用表示最高车速)
if(!s441.empty() && moves) //20170405
{
int v = s441.size() > 0 && s441[0] != "" ? std::atoi(s441[0].c_str()) : 0;
if(v > 0)
{
const TGpsInfo& gps2 = m_car->historyGps(2);
const TGpsInfo& gps3 = m_car->historyGps(3);
const TGpsInfo& gps4 = m_car->historyGps(4);
//GPS速度大于i
if(Tools::greater(gps.sd, v) && Tools::greater(gps1.sd, v) && Tools::greater(gps2.sd, v) &&
Tools::greater(gps3.sd, v) && Tools::greater(gps4.sd, v) && m_car->rtkEnabled())
{
JUDGE_MARK_SUB3(20, "58", true);
}
}
std::string TempRoadData = cg->MapPoint_Road_Code;
if(TempRoadData == "")
{
TempRoadData = cg->RTKKM3.MapRoad_Name;
}
if(TempRoadData != "")
{
std::string tempstr = s441.size() > 1 ? s441[1] : "";
if(tempstr != "")
{
std::vector<std::vector<std::string>> ss = Tools::split(tempstr, ";", ",");
for(size_t i = 0; i < ss.size(); i++)
{
const std::vector<std::string>& s = ss[i];
if(s.empty()) break;
std::string str1 = s.size() > 0 ? s[0] : "";
if(TempRoadData != str1) continue;
std::string str2 = s.size() > 0 ? s[0] : "";
int v = str2 != "" ? std::atoi(str2.c_str()) : 0;
if(v > 0)
{
const TGpsInfo& gps2 = m_car->historyGps(2);
const TGpsInfo& gps3 = m_car->historyGps(3);
const TGpsInfo& gps4 = m_car->historyGps(4);
//GPS速度大于i
if(Tools::greater(gps.sd, v) && Tools::greater(gps1.sd, v) && Tools::greater(gps2.sd, v) &&
Tools::greater(gps3.sd, v) && Tools::greater(gps4.sd, v) && m_car->rtkEnabled())
{
JUDGE_MARK_SUB3(20, "58", true);
}
}
break;
}
}
}
}
//按规则翻译即可
if(ksdd == siteof::GXWZKM3)
{
TTestCtl* ctl = m_car->getTTestCtl();
ctl->Cs_Yq = 0;
if(gps.sd < 15)
{
m_itemvCJH.Cs_lj1 = cg->ai_ljjl - m_itemvCJH.Cs_ljZ;
if(m_itemvCJH.Cs_lj1 > 500)
{
JUDGE_MARK_SUB3(20, "59", true);
}
}
else
{
m_itemvCJH.Cs_ljZ = cg->ai_ljjl;
}
}
}
//5、压线评判重点
void Sub3Judge20Comm::Judge_YaXian_30120()
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
//压中心线
//去除角度变化的条件
bool ItemFlag2 = false;
bool ItemFlag5 = false;
bool ItemFlag11 = false;
bool ItemFlag15 = false;
bool ItemFlag16 = false;
TKM3Item* item02 = m_car->findExamItem(Sub3ItemType02Qbxx);
if(item02 && item02->TestPro == ItemProFlagIdle)
{
ItemFlag2 = true; //起步
}
TKM3Item* item05 = m_car->findExamItem(Sub3ItemType05Lkzx);
if(item05 && item05->TestPro == ItemProFlagIdle)
{
ItemFlag5 = true; //直行路口
}
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item11 && item11->TestPro == ItemProFlagIdle)
{
ItemFlag11 = true; //靠边停车
}
TKM3Item* item15 = m_car->findExamItem(Sub3ItemType15Lkzz);
if(item15 && item15->TestPro == ItemProFlagIdle)
{
ItemFlag15 = true; //左转弯
}
TKM3Item* item16 = m_car->findExamItem(Sub3ItemType16Lkyz);
if(item16 && item16->TestPro == ItemProFlagIdle)
{
ItemFlag16 = true; //右转弯
}
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TGpsInfo& gps = cg->real.gps;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_1 = his1->RTKKM3;
const std::string& ksdd = TableSysSet->get211();
const std::vector<std::string>& s360 = TableSysSet->asArray360();
int ss360 = s360.size() > 0 && s360[0] != "" ? std::atoi(s360[0].c_str()) : 0;
//起步一定距离内不判 20181106
if(ss360 > 0 && cg->ai_ljjl < ss360)
{
return;
}
if(ksdd == siteof::xjcj)
{
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
const TRTKResult& RTKKM3_3 = m_car->historyRtkKM3(3);
//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);
}
}
const std::string& s445 = TableSysSet->get445();
//TouchLineType: Integer; //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
if(RTKKM3.TouchLineType == LineType_1 &&
RTKKM3_1.TouchLineType == LineType_1) //or ((stuinfo.Stu_Type = 0) and (cg.RTKKM3.TouchLineType = 1))
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
if(ksdd == siteof::heb) //20150825 20190115 去掉guizhou
{
//20180719 20180831
if(m_car->rtkEnabled() && m_car->rtkEnabled(1) && gps.dwzt == gpsStatusNARROW_INT) //20160427 增加过滤条件
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
else if(ksdd == siteof::lnjzkm3)
{
//20180719 20180831
if(m_car->rtkEnabled() && m_car->rtkEnabled(1) && gps.dwzt == gpsStatusNARROW_INT) //20160427 增加过滤条件
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
else if(s445 == "1")
{
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
//SysSet[445]-->1压线即刻评判不关心是否差分状态
if(RTKKM3_1.TouchLineType != RTKKM3_2.TouchLineType)
{
JUDGE_MARK_SUB3(20, "56", false);
}
}
else
{
//20171026
if(ksdd == siteof::hn || ksdd == siteof::hncs || ksdd == siteof::fjqz)
{
if(m_car->rtkEnabled() && m_car->rtkEnabled(1))
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
else
{
//20160905 20180403 20180408 20180831
if(m_car->rtkEnabled() && m_car->rtkEnabled(1))
{
//20171107 20181120
if(m_car->isExamDrill() || ksdd == siteof::hebtest)
{
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
if(RTKKM3_1.TouchLineType != RTKKM3_2.TouchLineType)
{
JUDGE_MARK_SUB3(20, "56", false);
}
}
else
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
}
}
}
//20161113 增加压左边线
if(ksdd == siteof::linxiahz || ksdd == siteof::jiuquan1)
{
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
if(RTKKM3.TouchLineType == LineType_5 &&
RTKKM3_1.TouchLineType == LineType_5 &&
RTKKM3_2.TouchLineType == LineType_0 && ItemFlag11 == true)
{
JUDGE_MARK_SUB3(20, "129", false);
}
if(ksdd != siteof::jiuquan1)
{
if(RTKKM3.BaseLaneCount == 3 && RTKKM3_1.BaseLaneCount == 3 &&
RTKKM3.BasePointInLaneNo == 3 && RTKKM3_1.BasePointInLaneNo == 3 &&
ItemFlag5 == true && ItemFlag15 == true && ItemFlag16 == true)
{
JUDGE_MARK_SUB3(20, "128", true);
}
}
}
//SysSet[541]:压非机动车道分解线立即评判
//TouchLineType: Integer; //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
const std::string& s541 = TableSysSet->get541();
if(s541 == "1")
{
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
const TRTKResult& RTKKM3_3 = m_car->historyRtkKM3(3);
const TRTKResult& RTKKM3_4 = m_car->historyRtkKM3(4);
const TRTKResult& RTKKM3_5 = m_car->historyRtkKM3(5);
if(RTKKM3.TouchLineType == LineType_5 &&
RTKKM3_1.TouchLineType == LineType_5 &&
RTKKM3_2.TouchLineType == LineType_5 &&
RTKKM3_3.TouchLineType == LineType_5 &&
RTKKM3_4.TouchLineType == LineType_0 &&
RTKKM3_5.TouchLineType == LineType_0 &&
ItemFlag2 == true && ItemFlag11 == true)
{
JUDGE_MARK_SUB3(20, "57", false);
}
}
if(ksdd == siteof::sz)
{
if((RTKKM3.TouchLineType == LineType_3 || RTKKM3.TouchLineType == LineType_4) &&
m_car->rtkEnabled())
{
JUDGE_MARK_SUB3(20, "57", true);
}
}
//TouchLineType: Integer; //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TChuanGan* his3 = m_car->historyChuanGan(3);
const TChuanGan* his4 = m_car->historyChuanGan(4);
const TRTKResult& RTKKM3_2 = his2->RTKKM3;
const TRTKResult& RTKKM3_3 = his3->RTKKM3;
const TRTKResult& RTKKM3_4 = his4->RTKKM3;
//连续3帧压不同类型的线
if(((RTKKM3.TouchLineType == LineType_3 || RTKKM3.TouchLineType == LineType_4) &&
(RTKKM3_1.TouchLineType == LineType_3 || RTKKM3_1.TouchLineType == LineType_4) &&
(RTKKM3_2.TouchLineType == LineType_3 || RTKKM3_2.TouchLineType == LineType_4) &&
(RTKKM3_3.TouchLineType == LineType_3 || RTKKM3_3.TouchLineType == LineType_4)) ||
(RTKKM3.TouchLineType == LineType_7 && RTKKM3_1.TouchLineType == LineType_7 &&
RTKKM3_2.TouchLineType == LineType_7 && RTKKM3_3.TouchLineType == LineType_7 &&
Tools::greater(gps.sd, 0)) ||
(RTKKM3.TouchLineType == LineType_5 && RTKKM3_1.TouchLineType == LineType_5 &&
RTKKM3_2.TouchLineType == LineType_5 && RTKKM3_3.TouchLineType == LineType_5 &&
ItemFlag2 == true && ksdd == siteof::jswxbz)) //ItemFlag2 == true && ItemFlag11 == true
{
int TempZT = 0;
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc); //靠边停车
if(item11)
{
TempZT = item11->TestPro;
}
const std::string& s325 = TableSysSet->get325();
//SysSet[325] 靠边停车压线条件(0-停车压线才判;1-压线立即判)
//if(TempZT == ItemProFlagIdle || (TempZT > ItemProFlagInit && Tools::greater(gps.sd, 0)))
if(TempZT == ItemProFlagIdle || (TempZT > ItemProFlagInit && ((s325 == "1") || (s325 != "1" && cg->move == moveStop)))) //不在靠边停车 或在靠边停车非停车状态 20150807
{
//20190115
if(ksdd == siteof::heb)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", true);
}
else if(ksdd == siteof::lnjzkm3)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
if(m_car->rtkEnabled() && m_car->rtkEnabled(1) && gps.dwzt == gpsStatusNARROW_INT) //20160427 增加过滤条件
{
JUDGE_MARK_SUB3(20, "57", true);
}
}
else if(s445 == "1")
{
//SysSet[445] 压线评判不判断差分信号
if(RTKKM3_4.TouchLineType != RTKKM3_3.TouchLineType)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", false);
}
}
else
{
if(ksdd == siteof::hn || ksdd == siteof::hncs)
{
if(m_car->rtkEnabled() && m_car->rtkEnabled(1) && Tools::greater(gps.sd, 0))
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", true);
}
}
else
{
if(m_car->rtkEnabled() && m_car->rtkEnabled(1) && m_car->rtkEnabled(2))
{
if(m_car->isExamDrill() || ksdd == siteof::hebtest)
{
if(RTKKM3_4.TouchLineType != RTKKM3_3.TouchLineType &&
cg->move == moveForward && his1->move == moveForward &&
his2->move == moveForward && his3->move == moveForward)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", false);
}
}
else
{
if(cg->move == moveForward && his1->move == moveForward &&
his2->move == moveForward && his3->move == moveForward)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", true);
}
}
}
}
}
}
}
//长时间骑压分界线 襄阳:C1C2C515秒或者50米 A1A2A3B1B215秒
if((ksdd == siteof::zjjh || ksdd == siteof::xjcj) && ItemFlag2 == true && ItemFlag11 == true)
{
//基准点所在车道的上边线属性
if(RTKKM3.BasePointInLaneLeftLine == "5") //非机动车道
{
if(m_itemvCJH.feijidongchedaojuli == 0)
{
m_itemvCJH.feijidongchedaojuli = cg->ai_ljjl;
}
if(m_itemvCJH.feijidongchedaojuli > 0 && cg->ai_ljjl - m_itemvCJH.feijidongchedaojuli > 5)
{
m_itemvCJH.feijidongchedaojuli = 0;
JUDGE_MARK_SUB3(20, "95", true);
}
}
else
{
m_itemvCJH.feijidongchedaojuli = 0;
}
}
}
void Sub3Judge20Comm::Judge_YaXian_30120_Tail()
{
if(!IS_A2C6(m_carType))
{
return;
}
//车辆行驶中骑轧车道中心实线或者车道边缘实线
//压中心线
//去除角度变化的条件
bool ItemFlag2 = false;
bool ItemFlag5 = false;
bool ItemFlag11 = false;
bool ItemFlag15 = false;
bool ItemFlag16 = false;
TKM3Item* item02 = m_car->findExamItem(Sub3ItemType02Qbxx);
if(item02 && item02->TestPro == ItemProFlagIdle)
{
ItemFlag2 = true; //起步
}
TKM3Item* item05 = m_car->findExamItem(Sub3ItemType05Lkzx);
if(item05 && item05->TestPro == ItemProFlagIdle)
{
ItemFlag5 = true; //直行路口
}
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item11 && item11->TestPro == ItemProFlagIdle)
{
ItemFlag11 = true; //靠边停车
}
TKM3Item* item15 = m_car->findExamItem(Sub3ItemType15Lkzz);
if(item15 && item15->TestPro == ItemProFlagIdle)
{
ItemFlag15 = true; //左转弯
}
TKM3Item* item16 = m_car->findExamItem(Sub3ItemType16Lkyz);
if(item16 && item16->TestPro == ItemProFlagIdle)
{
ItemFlag16 = true; //右转弯
}
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3_Tail = cg->RTKKM3_Tail;
const TGpsInfo& gps = cg->real.gps;
const TGpsInfo& gps2 = cg->real.gps2;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_Tail_1 = his1->RTKKM3_Tail;
const std::string& ksdd = TableSysSet->get211();
const std::vector<std::string>& s360 = TableSysSet->asArray360();
int ss360 = s360.size() > 0 && s360[0] != "" ? std::atoi(s360[0].c_str()) : 0;
//起步一定距离内不判 20181106
if(ss360 > 0 && cg->ai_ljjl < ss360)
{
return;
}
if(ksdd == siteof::xjcj)
{
const TRTKResult& RTKKM3_Tail_2 = m_car->historyRtkKM3_Tail(2);
const TRTKResult& RTKKM3_Tail_3 = m_car->historyRtkKM3_Tail(3);
//InShapeAttr: Integer; //0-不在形状里 1-在人行道内 2-在网格线内
if(RTKKM3_Tail.InShapeAttr == InShapeAttr_2 &&
RTKKM3_Tail_1.InShapeAttr == InShapeAttr_2 &&
RTKKM3_Tail_2.InShapeAttr == InShapeAttr_0 &&
RTKKM3_Tail_3.InShapeAttr == InShapeAttr_0)
{
JUDGE_MARK_SUB3(20, "57", false);
}
}
const std::string& s445 = TableSysSet->get445();
//TouchLineType: Integer; //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
if(RTKKM3_Tail.TouchLineType == LineType_1 &&
RTKKM3_Tail_1.TouchLineType == LineType_1) //or ((stuinfo.Stu_Type = 0) and (cg.RTKKM3.TouchLineType = 1))
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
if(ksdd == siteof::heb) //20150825 20190115 去掉guizhou
{
//20180719 20180831
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1) && gps2.dwzt == gpsStatusNARROW_INT) //20160427 增加过滤条件
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
else if(ksdd == siteof::lnjzkm3)
{
//20180719 20180831
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1) && gps2.dwzt == gpsStatusNARROW_INT) //20160427 增加过滤条件
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
else if(s445 == "1")
{
const TRTKResult& RTKKM3_Tail_2 = m_car->historyRtkKM3_Tail(2);
//SysSet[445]-->1压线即刻评判不关心是否差分状态
if(RTKKM3_Tail_1.TouchLineType != RTKKM3_Tail_2.TouchLineType)
{
JUDGE_MARK_SUB3(20, "56", false);
}
}
else
{
//20171026
if(ksdd == siteof::hn || ksdd == siteof::hncs || ksdd == siteof::fjqz)
{
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1))
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
else
{
//20160905 20180403 20180408 20180831
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1))
{
//20171107 20181120
if(m_car->isExamDrill() || ksdd == siteof::hebtest)
{
const TRTKResult& RTKKM3_Tail_2 = m_car->historyRtkKM3_Tail(2);
if(RTKKM3_Tail_1.TouchLineType != RTKKM3_Tail_2.TouchLineType)
{
JUDGE_MARK_SUB3(20, "56", false);
}
}
else
{
JUDGE_MARK_SUB3(20, "56", true);
}
}
}
}
}
//20161113 增加压左边线
if(ksdd == siteof::linxiahz || ksdd == siteof::jiuquan1)
{
const TRTKResult& RTKKM3_Tail_2 = m_car->historyRtkKM3_Tail(2);
if(RTKKM3_Tail.TouchLineType == LineType_5 &&
RTKKM3_Tail_1.TouchLineType == LineType_5 &&
RTKKM3_Tail_2.TouchLineType == LineType_0 && ItemFlag11 == true)
{
JUDGE_MARK_SUB3(20, "129", false);
}
if(ksdd != siteof::jiuquan1)
{
if(RTKKM3_Tail.BaseLaneCount == 3 && RTKKM3_Tail_1.BaseLaneCount == 3 &&
RTKKM3_Tail.BasePointInLaneNo == 3 && RTKKM3_Tail_1.BasePointInLaneNo == 3 &&
ItemFlag5 == true && ItemFlag15 == true && ItemFlag16 == true)
{
JUDGE_MARK_SUB3(20, "128", true);
}
}
}
//SysSet[541]:压非机动车道分解线立即评判
//TouchLineType: Integer; //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
const std::string& s541 = TableSysSet->get541();
if(s541 == "1")
{
const TRTKResult& RTKKM3_Tail_2 = m_car->historyRtkKM3_Tail(2);
const TRTKResult& RTKKM3_Tail_3 = m_car->historyRtkKM3_Tail(3);
const TRTKResult& RTKKM3_Tail_4 = m_car->historyRtkKM3_Tail(4);
const TRTKResult& RTKKM3_Tail_5 = m_car->historyRtkKM3_Tail(5);
if(RTKKM3_Tail.TouchLineType == LineType_5 &&
RTKKM3_Tail_1.TouchLineType == LineType_5 &&
RTKKM3_Tail_2.TouchLineType == LineType_5 &&
RTKKM3_Tail_3.TouchLineType == LineType_5 &&
RTKKM3_Tail_4.TouchLineType == LineType_0 &&
RTKKM3_Tail_5.TouchLineType == LineType_0 &&
ItemFlag2 == true && ItemFlag11 == true)
{
JUDGE_MARK_SUB3(20, "57", false);
}
}
if(ksdd == siteof::sz)
{
if((RTKKM3_Tail.TouchLineType == LineType_3 || RTKKM3_Tail.TouchLineType == LineType_4) &&
m_car->rtkEnabled2())
{
JUDGE_MARK_SUB3(20, "57", true);
}
}
//TouchLineType: Integer; //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TChuanGan* his3 = m_car->historyChuanGan(3);
const TChuanGan* his4 = m_car->historyChuanGan(4);
const TRTKResult& RTKKM3_Tail_2 = his2->RTKKM3_Tail;
const TRTKResult& RTKKM3_Tail_3 = his3->RTKKM3_Tail;
const TRTKResult& RTKKM3_Tail_4 = his4->RTKKM3_Tail;
//连续3帧压不同类型的线
if(((RTKKM3_Tail.TouchLineType == LineType_3 || RTKKM3_Tail.TouchLineType == LineType_4) &&
(RTKKM3_Tail_1.TouchLineType == LineType_3 || RTKKM3_Tail_1.TouchLineType == LineType_4) &&
(RTKKM3_Tail_2.TouchLineType == LineType_3 || RTKKM3_Tail_2.TouchLineType == LineType_4) &&
(RTKKM3_Tail_3.TouchLineType == LineType_3 || RTKKM3_Tail_3.TouchLineType == LineType_4)) ||
(RTKKM3_Tail.TouchLineType == LineType_7 && RTKKM3_Tail_1.TouchLineType == LineType_7 &&
RTKKM3_Tail_2.TouchLineType == LineType_7 && RTKKM3_Tail_3.TouchLineType == LineType_7 &&
Tools::greater(gps.sd, 0)) ||
(RTKKM3_Tail.TouchLineType == LineType_5 && RTKKM3_Tail_1.TouchLineType == LineType_5 &&
RTKKM3_Tail_2.TouchLineType == LineType_5 && RTKKM3_Tail_3.TouchLineType == LineType_5 &&
ItemFlag2 == true && ksdd == siteof::jswxbz)) //ItemFlag2 == true && ItemFlag11 == true
{
int TempZT = 0;
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc); //靠边停车
if(item11)
{
TempZT = item11->TestPro;
}
const std::string& s325 = TableSysSet->get325();
//SysSet[325] 靠边停车压线条件(0-停车压线才判;1-压线立即判)
//if(TempZT == ItemProFlagIdle || (TempZT > ItemProFlagInit && Tools::greater(gps.sd, 0)))
if(TempZT == ItemProFlagIdle || (TempZT > ItemProFlagInit && ((s325 == "1") || (s325 != "1" && cg->move == moveStop)))) //不在靠边停车 或在靠边停车非停车状态 20150807
{
//20190115
if(ksdd == siteof::heb)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", true);
}
else if(ksdd == siteof::lnjzkm3)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1) && gps.dwzt == gpsStatusNARROW_INT) //20160427 增加过滤条件
{
JUDGE_MARK_SUB3(20, "57", true);
}
}
else if(s445 == "1")
{
//SysSet[445] 压线评判不判断差分信号
if(RTKKM3_Tail_4.TouchLineType != RTKKM3_Tail_3.TouchLineType)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", false);
}
}
else
{
if(ksdd == siteof::hn || ksdd == siteof::hncs)
{
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1) && Tools::greater(gps.sd, 0))
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", true);
}
}
else
{
if(m_car->rtkEnabled2() && m_car->rtkEnabled2(1) && m_car->rtkEnabled2(2))
{
if(m_car->isExamDrill() || ksdd == siteof::hebtest)
{
if(RTKKM3_Tail_4.TouchLineType != RTKKM3_Tail_3.TouchLineType &&
cg->move == moveForward && his1->move == moveForward &&
his2->move == moveForward && his3->move == moveForward)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", false);
}
}
else
{
if(cg->move == moveForward && his1->move == moveForward &&
his2->move == moveForward && his3->move == moveForward)
{
//车辆行驶中骑轧车道中心实线或者车道边缘实线
JUDGE_MARK_SUB3(20, "57", true);
}
}
}
}
}
}
}
//长时间骑压分界线 襄阳:C1C2C515秒或者50米 A1A2A3B1B215秒
if((ksdd == siteof::zjjh || ksdd == siteof::xjcj) && ItemFlag2 == true && ItemFlag11 == true)
{
//基准点所在车道的上边线属性
if(RTKKM3_Tail.BasePointInLaneLeftLine == "5") //非机动车道
{
if(m_itemvCJH.FeiJiDongCheDaoJuLi_Tail == 0)
{
m_itemvCJH.FeiJiDongCheDaoJuLi_Tail = cg->ai_ljjl;
}
if(m_itemvCJH.FeiJiDongCheDaoJuLi_Tail > 0 && cg->ai_ljjl - m_itemvCJH.FeiJiDongCheDaoJuLi_Tail > 5)
{
m_itemvCJH.FeiJiDongCheDaoJuLi_Tail = 0;
JUDGE_MARK_SUB3(20, "95", true);
}
}
else
{
m_itemvCJH.feijidongchedaojuli = 0;
}
}
}
void Sub3Judge20Comm::Judge_YaXian_10S_XuXian()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3 = cg->RTKKM3;
//长时间骑轧车道分界线行驶
if(RTKKM3.BaseLaneCount == 0 || RTKKM3.TouchLineType == LineType_0)
{
m_PubLastMark_XuXian_TK = 0; //当前没压线给我退出
return;
}
//检查是否真正做靠边停车项目
bool KBTCFlag = m_car->itemsSomeExaming2(Sub3ItemType11Kbtc);
//路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
//std::array<int, 3> kind;
//kind.fill(LineType_0); //所有值填充设置为0 YaXianKindArr
std::vector<int> kind(3, LineType_0); //数组初始化3个0
kind[0] = LineType_2; //加入虚线类型 车道分界线(虚线)
const std::string& s541 = TableSysSet->get541();
if(s541 == "1") //压非机动车道分解线立即评判
{
kind[1] = LineType_0;
}
else
{
if(KBTCFlag == false)
{
kind[1] = LineType_5; //非机动车道分界线
}
else
{
kind[1] = LineType_0;
}
}
//SysSet[526]-->1 单向单车道压黄线是否扣分
if(RTKKM3.BaseLaneCount < 2)
{
kind[2] = LineType_0;
}
else if(RTKKM3.BaseLaneCount == 2)
{
if(RTKKM3.BasePointInLaneLeftLine == "5") //非机动车道
{
kind[2] = LineType_0;
}
else
{
kind[2] = LineType_6;
}
}
else
{
kind[2] = LineType_6;
}
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
if(m_car->rtkEnabled() && m_car->rtkEnabled(1) &&
cg->move == moveForward && his1->move == moveForward && his2->move == moveForward)
{
for(size_t i = 0; i < kind.size(); i++)
{
auto ty = kind[i];
if(ty == LineType_0) continue;
if(m_PubLastMark_XuXian_TK == 0 && cg->RTKKM3.TouchLineType == ty)
{
m_PubLastMark_XuXian_TK = cg->tkCnt;
}
bool OKFlag = true;
for(int j = 0; j < 50; j++) //10秒钟对应的是50帧
{
TChuanGan* cg_j = m_car->historyChuanGan(j);
if(cg_j == nullptr)
{
OKFlag = false;
break;
}
if(cg_j->RTKKM3.TouchLineType != ty || cg_j->move == moveStop)
{
OKFlag = false;
break;
}
}
if(OKFlag == true)
{
if(m_PubLastMark_XuXian_TK> 0 && cg->tkCnt - m_PubLastMark_XuXian_TK >= 10 * SECOND)
{
const char* serial = "65";
#if JUDGE_USE_INSPECT
serial = "118";
#endif
if(m_car->isExamDrill())
{
//长时间骑轧车道分界线行驶
JUDGE_MARK_SUB3(20, serial, false);
m_PubLastMark_XuXian_TK = cg->tkCnt;
}
else
{
//长时间骑轧车道分界线行驶
JUDGE_MARK_SUB3(20, serial, true);
m_PubLastMark_XuXian_TK = cg->tkCnt;
}
}
}
}
}
}
void Sub3Judge20Comm::Judge_YaXian_10S_XuXian_Tail()
{
if(!IS_A2C6(m_carType))
{
return;
}
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3_Tail = cg->RTKKM3_Tail;
//长时间骑轧车道分界线行驶
if(RTKKM3_Tail.BaseLaneCount == 0 || RTKKM3_Tail.TouchLineType == LineType_0)
{
m_PubLastMark_XuXian_Tail_TK = 0; //当前没压线给我退出
return;
}
//检查是否真正做靠边停车项目
bool KBTCFlag = m_car->itemsSomeExaming2(Sub3ItemType11Kbtc);
//路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
//6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
//std::array<int, 3> kind;
//kind.fill(LineType_0); //所有值填充设置为0 YaXianKindArr
std::vector<int> kind(3, LineType_0); //数组初始化3个0
kind[0] = LineType_2; //加入虚线类型 车道分界线(虚线)
const std::string& s541 = TableSysSet->get541();
if(s541 == "1") //压非机动车道分解线立即评判
{
kind[1] = LineType_0;
}
else
{
if(KBTCFlag == false)
{
kind[1] = LineType_5; //非机动车道分界线
}
else
{
kind[1] = LineType_0;
}
}
//SysSet[526]-->1 单向单车道压黄线是否扣分
if(RTKKM3_Tail.BaseLaneCount < 2)
{
kind[2] = LineType_0;
}
else if(RTKKM3_Tail.BaseLaneCount == 2)
{
if(RTKKM3_Tail.BasePointInLaneLeftLine == "5") //非机动车道
{
kind[2] = LineType_0;
}
else
{
kind[2] = LineType_6;
}
}
else
{
kind[2] = LineType_6;
}
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
if(cg->move == moveForward && his1->move == moveForward && his2->move == moveForward)
{
for(size_t i = 0; i < kind.size(); i++)
{
auto ty = kind[i];
if(ty == LineType_0) continue;
if(m_PubLastMark_XuXian_Tail_TK == 0 && cg->RTKKM3_Tail.TouchLineType == ty)
{
m_PubLastMark_XuXian_Tail_TK = cg->tkCnt;
}
bool OKFlag = true;
for(int j = 0; j < 50; j++) //10秒钟对应的是50帧
{
TChuanGan* cg_j = m_car->historyChuanGan(j);
if(cg_j == nullptr)
{
OKFlag = false;
break;
}
if(cg_j->RTKKM3_Tail.TouchLineType != ty || cg_j->move == moveStop)
{
OKFlag = false;
break;
}
}
if(OKFlag == true)
{
if(m_PubLastMark_XuXian_Tail_TK > 0 && cg->tkCnt - m_PubLastMark_XuXian_Tail_TK >= 10 * SECOND)
{
const char* serial = "65";
#if JUDGE_USE_INSPECT
serial = "118";
#endif
if(m_car->isExamDrill())
{
//长时间骑轧车道分界线行驶
JUDGE_MARK_SUB3(20, serial, false);
m_PubLastMark_XuXian_Tail_TK = cg->tkCnt;
}
else
{
//长时间骑轧车道分界线行驶
JUDGE_MARK_SUB3(20, serial, true);
m_PubLastMark_XuXian_Tail_TK = cg->tkCnt;
}
}
}
}
}
}
/*
//6、起步方向灯、喇叭
void Sub3Judge20Comm::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(m_Pub_First_QiBu_Flag == true) return;
m_Pub_First_QiBu_Flag = 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);
}
}
}
*/
//是否是连续变道
bool Sub3Judge20Comm::Is_Lxbd_New()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_1 = his1->RTKKM3;
//1)10秒内变化了2个或以上的车道
//2)同一个方向灯不关闭变了2次或以上车道
//变道一瞬间
//1、只考虑那种车道总数不发生变化的
//2、基准点所在的车道号发生变化了
if(RTKKM3.BasePointInLaneNo > 0 && RTKKM3_1.BasePointInLaneNo > 0 &&
RTKKM3.BasePointInLaneNo != RTKKM3_1.BasePointInLaneNo &&
RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount)
{
int CurrentCheDaoHao = RTKKM3.BasePointInLaneNo;
int LS1CheDaoHao = RTKKM3_1.BasePointInLaneNo;
//SysSet[512]-->2
//连续变更车道方式(格式: 0^0第一个数字0abc方式 1aba/abc方式
//第二个数字0超车项目里不判1超车时候也判2有项目的时候都不判
TTestCtl* ctl = m_car->getTTestCtl();
if(RTKKM3.BaseLaneCount < 3 && ctl->LianXuBianDaoKind != 1)
{
//abc, 你车道只有2个当然判不了
return false;
}
//20170
bool FindFlag1 = false;
bool FindFlag2 = false;
//1、检查10秒内是否有其他车道abc
for(int i = 2; i < 100; i++)
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
if(hisi == nullptr) break;
const TGpsInfo& gpsi = hisi->real.gps;
const TRTKResult& RTKKM3_i = hisi->RTKKM3;
if(SecondsBetween(gps.sj, gpsi.sj) > m_LaneChangeTime) break;
int TempCheDaoHao = RTKKM3_i.BasePointInLaneNo;
if(TempCheDaoHao == 0) continue;
if(TempCheDaoHao != LS1CheDaoHao && TempCheDaoHao != CurrentCheDaoHao)
{
FindFlag1 = true;
break;
}
}
//2、检查10秒内是否有其他车道aba Cur=a LS1=b 检测历史是否有a->b
if(ctl->LianXuBianDaoKind == 1) //允许aba方式
{
for(int i = 2; i < 100; i++)
{
int TempLS1Pos = i;
int TempLS2Pos = i + 1;
const TChuanGan* hisi1 = m_car->historyChuanGan(TempLS1Pos);
const TChuanGan* hisi2 = m_car->historyChuanGan(TempLS2Pos);
if(hisi1 == nullptr || hisi2 == nullptr) break;
const TGpsInfo& gpsi1 = hisi1->real.gps;
const TGpsInfo& gpsi2 = hisi2->real.gps;
const TRTKResult& RTKKM3_i1 = hisi1->RTKKM3;
const TRTKResult& RTKKM3_i2 = hisi2->RTKKM3;
if(SecondsBetween(gps.sj, gpsi1.sj) > m_LaneChangeTime) break;
if(SecondsBetween(gps.sj, gpsi2.sj) > m_LaneChangeTime) break;
//假如当前是b-->a,也就是说 LS1CheDaoHao=b CurrentCheDaoHao=a
//追溯历史,需要监测到 a->b
if(RTKKM3_i2.BasePointInLaneNo == CurrentCheDaoHao && RTKKM3_i1.BasePointInLaneNo == LS1CheDaoHao)
{
FindFlag1 = true;
}
}
}
//2、同一方向灯不关闭变化了2次或以上
bool LSFXDLeftFlag = false;
bool LSFXDRightFlag = false;
for(int i = 2; i < 900; i++) //如果你的队列长队是500那么把这个值改成500
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
if(hisi == nullptr) break;
const TSensorInfo& sori = hisi->real.sensor;
if(sori.zfxd == SYES && sori.yfxd == SNOT)
{
LSFXDLeftFlag = true;
break;
}
if(sori.zfxd == SNOT && sori.yfxd == SYES)
{
LSFXDRightFlag = true;
break;
}
}
if(LSFXDLeftFlag == true || LSFXDRightFlag == true)
{
//1、翻译abc
for(int i = 2; i < 900; i++) //如果你的队列长队是500那么把这个值改成500
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
if(hisi == nullptr) break;
const TSensorInfo& sori = hisi->real.sensor;
const TRTKResult& RTKKM3_i = hisi->RTKKM3;
if(LSFXDLeftFlag == true && (sori.zfxd == SNOT || sori.yfxd == SYES)) break;
if(LSFXDRightFlag == true && (sori.zfxd == SYES || sori.yfxd == SNOT)) break;
int TempCheDaoHao = RTKKM3_i.BasePointInLaneNo;
if(TempCheDaoHao == 0) continue;
if(TempCheDaoHao != LS1CheDaoHao && TempCheDaoHao != CurrentCheDaoHao)
{
FindFlag2 = true;
break;
}
}
//2、兼容aba
if(ctl->LianXuBianDaoKind == 1) //允许aba方式
{
int count = m_car->historyCount();
for(int i = 2; i < 900; i++) //如果你的队列长队是500那么把这个值改成500
{
int TempLS1Pos = i;
int TempLS2Pos = i + 1;
if(TempLS1Pos >= count || TempLS2Pos >= count)
{
break;
}
const TChuanGan* hisi1 = m_car->historyChuanGan(TempLS1Pos);
const TChuanGan* hisi2 = m_car->historyChuanGan(TempLS2Pos);
if(hisi1 == nullptr || hisi2 == nullptr) break;
const TSensorInfo& sori1 = hisi1->real.sensor;
const TSensorInfo& sori2 = hisi2->real.sensor;
const TRTKResult& RTKKM3_i1 = hisi1->RTKKM3;
const TRTKResult& RTKKM3_i2 = hisi2->RTKKM3;
if(LSFXDLeftFlag == true && (sori1.zfxd == SNOT || sori1.yfxd == SYES)) break;
if(LSFXDRightFlag == true && (sori1.zfxd == SYES || sori1.yfxd == SNOT)) break;
if(LSFXDLeftFlag == true && (sori2.zfxd == SNOT || sori2.yfxd == SYES)) break;
if(LSFXDRightFlag == true && (sori2.zfxd == SYES || sori2.yfxd == SNOT)) break;
//假如当前是b-->a,也就是说 LS1CheDaoHao=b CurrentCheDaoHao=a
//追溯历史,需要监测到 a->b
if(RTKKM3_i2.BasePointInLaneNo == CurrentCheDaoHao && RTKKM3_i1.BasePointInLaneNo == LS1CheDaoHao)
{
FindFlag2 = true;
}
}
}
}
return (FindFlag1 || FindFlag2);
}
return false;
}
//是否是连续变道
bool Sub3Judge20Comm::Is_Lxbd_New2()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_1 = his1->RTKKM3;
const std::string& ksdd = TableSysSet->get211();
TTestCtl* ctl = m_car->getTTestCtl();
bool bYx = false; //20180604 是否压过线值
//变道一瞬间
if(RTKKM3.BasePointInLaneNo > 0 && RTKKM3_1.BasePointInLaneNo > 0 &&
RTKKM3.BasePointInLaneNo != RTKKM3_1.BasePointInLaneNo &&
RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount)
{
//abc方式
if(RTKKM3.BaseLaneCount < 3 && ctl->LianXuBianDaoKind != 1)
{
return false;
}
//20170
const int zjcdtlsj = m_LaneChangeTime; // strtoint(readiniparam('连续变道', 'zjcdtlsj', '5'));
int Ora_Chedao = RTKKM3.BasePointInLaneNo; //原始车道
bool Fxd_HwID = false; //方向灯回位标
//c := cg.tkCnt;
//缓存历史传感数据的长度
const int number = m_car->historyNumber() - 10;
const int count = m_car->historyCount();
for(int i = 1; i <= number; i++)
{
int a = i; //a := zj(i);
int b = i+1; //b := zj(i + 1);
if(a >= count || b >= count)
{
break;
}
//20180625 20180831
const TChuanGan* his_a = m_car->historyChuanGan(a);
const TChuanGan* his_b = m_car->historyChuanGan(b);
if(his_a == nullptr || his_b == nullptr) break;
const TSensorInfo& sor_a = his_a->real.sensor;
const TGpsInfo& gps_a = his_a->real.gps;
const TRTKResult& RTKKM3_a = his_a->RTKKM3;
const TRTKResult& RTKKM3_b = his_b->RTKKM3;
if(m_car->rtkEnabled(a))
{
//不在车道内,退出 20171009
if(RTKKM3_a.BaseLaneCount <= 0 ||
RTKKM3_a.BaseLaneCount != RTKKM3.BaseLaneCount ||
RTKKM3_a.BasePointInLaneNo > RTKKM3_a.BaseLaneCount)
{
return false;
}
if(RTKKM3_a.BasePointInLaneNo == 0)
{
return false;
}
//LS压线当前不压线了(相当于历史记录中,再次找到了一次变道记录)
if(RTKKM3_a.TouchLineType == LineType_0 &&
RTKKM3_b.TouchLineType != LineType_0)
{
bYx = true;
}
//车道数发生变化
if(RTKKM3_a.BaseLaneCount > 0 && RTKKM3_b.BaseLaneCount > 0 && RTKKM3_a.BaseLaneCount != RTKKM3_b.BaseLaneCount)
{
Ora_Chedao = Ora_Chedao + (RTKKM3_b.BasePointInLaneNo - RTKKM3_a.BasePointInLaneNo);
continue;
}
//方向灯回位
if(sor_a.zfxd == SNOT && sor_a.yfxd == SNOT)
{
Fxd_HwID = true;
}
if(ksdd == siteof::hncs) Fxd_HwID = true; //20160415
if(!bYx) continue;
if(ctl->LianXuBianDaoKind == 1)
{
if(std::abs(RTKKM3_a.BasePointInLaneNo - Ora_Chedao) == 0 && std::abs(RTKKM3_b.BasePointInLaneNo - Ora_Chedao) == 0)
{
if(RTKKM3.BaseLaneCount >= 2)
{
//方向灯未回位 或 在中间车道停留时间小于规定时间
if((!Fxd_HwID || std::abs(his_a->tkCnt - cg->tkCnt) < zjcdtlsj * SECOND) &&
(RTKKM3_a.BaseLaneCount == RTKKM3.BaseLaneCount)) //20140728
{
if(ksdd == siteof::hbwh || ksdd == siteof::hbwhjz || ksdd == siteof::yingtan)
{
int ChaoChe_Start_TM = m_car->getChaoChe_Start_TM();
int ChaoChe_End_TM = m_car->getChaoChe_End_TM();
if(((gps_a.sj < ChaoChe_Start_TM && ChaoChe_Start_TM > 0) ||
(gps_a.sj > ChaoChe_End_TM && ChaoChe_End_TM > 0)) ||
ChaoChe_Start_TM == 0 )
{
return true;
}
}
else
{
return true;
}
}
}
}
else
{
if(std::abs(RTKKM3_a.BasePointInLaneNo - Ora_Chedao) == 2)
{
//方向灯未回位 或 在中间车道停留时间小于规定时间
if((!Fxd_HwID || std::abs(his_a->tkCnt - cg->tkCnt) < zjcdtlsj * SECOND) &&
(RTKKM3_a.BaseLaneCount == RTKKM3.BaseLaneCount)) //20140728
{
if(ksdd == siteof::hbwh || ksdd == siteof::hbwhjz || ksdd == siteof::yingtan)
{
int ChaoChe_Start_TM = m_car->getChaoChe_Start_TM();
int ChaoChe_End_TM = m_car->getChaoChe_End_TM();
if(((gps_a.sj < ChaoChe_Start_TM && ChaoChe_Start_TM > 0) ||
(gps_a.sj > ChaoChe_End_TM && ChaoChe_End_TM > 0)) ||
ChaoChe_Start_TM == 0)
{
return true;
}
}
else
{
return true;
}
}
}
}
}
else
{
if(std::abs(RTKKM3_a.BasePointInLaneNo - Ora_Chedao) == 2 && RTKKM3_a.BaseLaneCount == RTKKM3.BaseLaneCount)
{
//方向灯未回位 或 在中间车道停留时间小于规定时间
if((!Fxd_HwID || std::abs(his_a->tkCnt - cg->tkCnt) < zjcdtlsj * SECOND) &&
RTKKM3_a.BaseLaneCount == RTKKM3.BaseLaneCount) //20140728
{
std::string str = std::to_string(his_a->ai_ljjl);
str = std::to_string(i);
return true;
}
}
}
}
}
}
return false;
}
bool Sub3Judge20Comm::Is_Lxbd_New3()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_1 = his1->RTKKM3;
//1)10秒内变化了2个或以上的车道
//2)同一个方向灯不关闭变了2次或以上车道
//变道一瞬间
//1、只考虑那种车道总数不发生变化的
//2、基准点所在的车道号发生变化了
if(RTKKM3.BasePointInLaneNo > 0 && RTKKM3_1.BasePointInLaneNo > 0 &&
RTKKM3.BasePointInLaneNo != RTKKM3_1.BasePointInLaneNo &&
RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount)
{
int cnt = 0;
int LaneNo = RTKKM3.BasePointInLaneNo;
for(int i = 1; i < 900; i++) //如果你的队列长队是500那么把这个值改成500
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
if(hisi == nullptr)
{
break;
}
const TRTKResult& RTKKM3_i = hisi->RTKKM3;
const TSensorInfo& sori = hisi->real.sensor;
const TGpsInfo& gpsi = hisi->real.gps;
if(SecondsBetween(gps.sj, gpsi.sj) > m_LaneChangeTime)
{
break;
}
if(RTKKM3.BaseLaneCount != RTKKM3_i.BaseLaneCount)
{
break;
}
if(LaneNo != RTKKM3_i.BasePointInLaneNo)
{
LaneNo = RTKKM3_i.BasePointInLaneNo;
cnt++;
}
bool Fxd_HwID = false;
if(sori.zfxd == SNOT && sori.yfxd == SNOT)
{
Fxd_HwID = true;
}
if(!Fxd_HwID && cnt >= 2)
{
return true;
}
}
}
return false;
}
//7、连续变更两条以上车道
void Sub3Judge20Comm::Judge_LianXuBianDao()
{
const TChuanGan* cg = m_car->historyChuanGan();
//累计距离不大于2米不判连续变道
if(cg->ai_ljjl <= 2)
{
return;
}
bool FindFlag = false;
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
//自动靠边停车
for(auto it = all.begin(); it != all.end(); it++)
{
TKM3Item* item = it->second->getExamItem();
if(item && item->ItemNo != Sub2ItemType20Comm)
{
if(item->TestPro == ItemProFlagInit || item->TestPro == ItemProFlagJudge)
{
FindFlag = true;
break;
}
}
}
TTestCtl* ctl = m_car->getTTestCtl();
const std::vector<std::string>& s512 = TableSysSet->asArray512();
//获取连续变道超车参数
std::string Temp = s512.size() > 1 && s512[1] != "" ? s512[1] : "";
const std::vector<std::string> ss = Tools::split(Temp, "^");
//0:abc 1:aba和abc都判
ctl->LianXuBianDaoKind = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0;
//#if JUDGE_USE_INSPECT
// ctl->LianXuBianDaoKind = 1;
//#endif
ctl->LianXuBianDao_CC = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 1;
//连续变更两条以上车道
//SysSet[528]:掉头N米内不判连续变道和方向灯
int TempJL = TableSysSet->asInt528();
int NJ_DiaoTou_JL = m_car->getNJ_DiaoTou_JL();
if(NJ_DiaoTou_JL > 0 && TempJL > 0 && cg->ai_ljjl - NJ_DiaoTou_JL < TempJL)
{
return;
}
m_car->setNJ_DiaoTou_JL(0);
if(m_car->rtkEnabled() && m_car->rtkEnabled(1))
{
//连续变更车道方式(格式: 0^0第一个数字0abc方式 1aba/abc方式
//第二个数字0超车项目里不判1超车时候也判2有项目的时候都不判
if(ctl->LianXuBianDao_CC == 2)
{
if(!FindFlag)
{
if(Is_Lxbd_New2() == true)
{
JUDGE_MARK_SUB3(20, "89", false);
}
}
}
else if(ctl->LianXuBianDao_CC == 1)
{
if(Is_Lxbd_New2() == true)
{
JUDGE_MARK_SUB3(20, "89", false);
}
}
else
{
TKM3Item* item10 = m_car->findExamItem(Sub3ItemType10Ccxx); //超车项目
bool FindFlag = (item10 && item10->TestPro == ItemProFlagIdle);
if(FindFlag == true)
{
if(Is_Lxbd_New2() == true)
{
JUDGE_MARK_SUB3(20, "89", false);
}
}
}
}
}
//8、不能停止人行横道网格线内
void Sub3Judge20Comm::Judge_ForbiddenTC()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3 = cg->RTKKM3;
const std::string& ksdd = TableSysSet->get211();
if(m_car->rtkEnabled() && cg->move == moveStop)
{
int itc = ksdd == siteof::JXYTSF001 ? 5 : 15;
if(ksdd == siteof::SXHZ || ksdd == siteof::shanghaikm3) //20170215
{
itc = 5 * 5;
}
if(Tools::pos(siteof::guizhou, ksdd) ) //20170609
{
itc = 4;
}
int count = m_car->historyCount();
for(int i = 1; i <= itc; i++) //停车3秒
{
if(i >= count) break;
const TChuanGan* his_i = m_car->historyChuanGan(i);
const TRTKResult& RTKKM3_i = his_i->RTKKM3;
if(his_i->move != moveStop) break;
// 0-不在形状里 1-在人行道内 2-在网格线内
if(RTKKM3_i.InShapeAttr != InShapeAttr_1 &&
RTKKM3_i.InShapeAttr != InShapeAttr_2)
{
break;
}
if(i == itc) //20160229 15 改成 itc
{
//将车辆停在人行横道
if(((ksdd == siteof::hn && cg->ai_ljjl > 20) || ksdd != siteof::hn) && (std::to_string(RTKKM3.ShapeNo) != m_itemvCJH.kf64))
{
const std::vector<std::string>& s360 = TableSysSet->asArray360();
int ss360 = s360.size() > 0 && s360[0] != "" ? std::atoi(s360[0].c_str()) : 0;
//起步一定距离内不判 20181106
if(cg->ai_ljjl > ss360)
{
m_itemvCJH.kf64 = std::to_string(RTKKM3.ShapeNo);
JUDGE_MARK_SUB3(20, "64", false);
}
}
}
}
}
}
void Sub3Judge20Comm::Judge_ForbiddenTC_Tail()
{
if(!IS_A2C6(m_carType))
{
return;
}
const TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3_Tail = cg->RTKKM3_Tail;
const std::string& ksdd = TableSysSet->get211();
if(m_car->rtkEnabled2() && cg->move == moveStop)
{
int itc = ksdd == siteof::JXYTSF001 ? 5 : 15;
if(ksdd == siteof::SXHZ || ksdd == siteof::shanghaikm3) //20170215
{
itc = 5 * 5;
}
if(Tools::pos(siteof::guizhou, ksdd) ) //20170609
{
itc = 4;
}
int count = m_car->historyCount();
for(int i = 1; i <= itc; i++) //停车3秒
{
if(i >= count) break;
const TChuanGan* his_i = m_car->historyChuanGan(i);
const TRTKResult& RTKKM3_Tail_i = his_i->RTKKM3_Tail;
if(his_i->move != moveStop) break;
// 0-不在形状里 1-在人行道内 2-在网格线内
if(RTKKM3_Tail_i.InShapeAttr != InShapeAttr_1 &&
RTKKM3_Tail_i.InShapeAttr != InShapeAttr_2)
{
break;
}
if(i == itc) //20160229 15 改成 itc
{
//将车辆停在人行横道
if(((ksdd == siteof::hn && cg->ai_ljjl > 20) || ksdd != siteof::hn) && (std::to_string(RTKKM3_Tail.ShapeNo) != m_itemvCJH.kf64))
{
const std::vector<std::string>& s360 = TableSysSet->asArray360();
int ss360 = s360.size() > 0 && s360[0] != "" ? std::atoi(s360[0].c_str()) : 0;
//起步一定距离内不判 20181106
if(cg->ai_ljjl > ss360)
{
m_itemvCJH.kf64 = std::to_string(RTKKM3_Tail.ShapeNo);
JUDGE_MARK_SUB3(20, "64", false);
}
}
}
}
}
}
//9、加速踏板错误
void Sub3Judge20Comm::Jugde_JiaSuTaBan()
{
const std::vector<std::string>& s500 = TableSysSet->asArray500();
std::string str = s500.size() > 4 && s500[4] != "" ? s500[4] : "";
const std::vector<std::string> ss500 = Tools::split(str, "^");
int KYM_ZS = ss500.size() > 0 && ss500[0] != "" ? std::atoi(ss500[0].c_str()) : 3000; //空油门 发动机转速阀值
int KYM_ZS_BeiShu = ss500.size() > 1 && ss500[1] != "" ? std::atoi(ss500[1].c_str()) : 3;
TKM3Item* item02 = m_car->findExamItem(Sub3ItemType02Qbxx);
bool FindFlag = (item02 && item02->TestPro == ItemProFlagIdle);
if(FindFlag == true)
{
//检查离合器
if(!IS_C2(m_carType))
{
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TSensorInfo& sor = cg->real.sensor;
if(m_car->historyCount() > 30)
{
const TChuanGan* his15 = m_car->historyChuanGan(15);
const TChuanGan* his30 = m_car->historyChuanGan(30);
const TSensorInfo& sor15 = his15->real.sensor;
if( gps.sd > 5 && cg->move == moveForward && his30->move == moveForward
&& sor.fdjzs >= KYM_ZS && sor.fdjzs > sor15.fdjzs * KYM_ZS_BeiShu)
{
JUDGE_MARK_SUB3(20, "75", true);
}
}
}
}
}
//10、半联动
void Sub3Judge20Comm::Judge_BanLianDong()
{
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc);
bool FindFlag = (item11 && item11->TestPro > ItemProFlagIdle);
//检查离合器
if(!IS_C2(m_carType))
{
const std::string& ksdd = TableSysSet->get211();
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TSensorInfo& sor = cg->real.sensor;
//长时间踩离合器
if(sor.lhq == SYES && cg->move == moveForward && gps.sd > 5)
{
if(ksdd == siteof::linxiahz)
{
if(FindFlag == true)
{
m_itemvCJH.lhqjs = 0;
m_itemvCJH.lhqjl = 0;
}
}
if(m_itemvCJH.lhqxs > 0)
{
if(m_itemvCJH.lhqjs == 0)
{
m_itemvCJH.lhqjs = cg->tkCnt;
}
else
{
if(cg->tkCnt - m_itemvCJH.lhqjs > m_itemvCJH.lhqxs * SECOND) //默认踩30秒扣分 20170712
{
m_itemvCJH.lhqjs = cg->tkCnt + 50*SECOND; //50000
JUDGE_MARK_SUB3(20, "35", false);
}
}
}
else
{
if(m_itemvCJH.lhqxjl > 0)
{
if(m_itemvCJH.lhqjl == 0)
{
m_itemvCJH.lhqjl = cg->ai_ljjl;
}
else
{
if(cg->ai_ljjl - m_itemvCJH.lhqjl > m_itemvCJH.lhqxjl)
{
m_itemvCJH.lhqjl = cg->ai_ljjl + 50;
JUDGE_MARK_SUB3(20, "35", false);
}
}
}
}
}
else
{
m_itemvCJH.lhqjs = 0;
m_itemvCJH.lhqjl = 0;
}
}
}
//11、制动不平顺
void Sub3Judge20Comm::Judge_ZhiDongBuPingShun()
{
const std::vector<std::string>& s437 = TableSysSet->asArray437();
const std::vector<std::string>& s500 = TableSysSet->asArray500();
//SysSet[437]:制动不平顺评判方式0-靠边停车阶段1-表示全过程阶段),以^隔开使用速度模式,第二个^里设置速度差值
int c = s437.size() > 1 && s437[1] != "" ? std::atoi(s437[1].c_str()) : 0;
if(c > 0)
{
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
const TSensorInfo& sor = cg->real.sensor;
const TGpsInfo& gps5 = m_car->historyGps(5);
if(Tools::greater(gps5.sd - gps.sd, c) && m_car->rtkEnabled() && sor.jsc == SYES)
{
int Parm_Z_SJ = s500.size() > 8 && s500[8] != "" ? std::atoi(s500[8].c_str()) : 90; //20150112 制动不平顺扣分间隔时间
if(cg->tkCnt - m_itemvCJH.zdsj > Parm_Z_SJ * SECOND || m_itemvCJH.zdsj == 0) //20170113 //if(m_car->GetCurrentTick2() - m_itemvCJH.zdsj > Parm_Z_SJ * SECOND || m_itemvCJH.zdsj == 0) //20170113
{
m_itemvCJH.zdsj = cg->tkCnt; //m_car->GetCurrentTick2();
JUDGE_MARK_SUB3(20, "44", false);
}
}
}
}
//12、操作完成后不关闭灯光
void Sub3Judge20Comm::Judge_BuGuanBiDengGuang()
{
const std::vector<std::string>& s500 = TableSysSet->asArray500();
std::string str = s500.size() > 5 && s500[5] != "" ? s500[5] : "";
const std::vector<std::string> ss500 = Tools::split(str, "^");
//转向灯不关闭距离^项目结束后不关闭时间
int ParmJL = ss500.size() > 0 && ss500[0] != "" ? std::atoi(ss500[0].c_str()) : 3000;
//得到方向灯时间
int ParmSJ = ss500.size() > 1 && ss500[1] != "" ? std::atoi(ss500[1].c_str()) : 0;
TTestCtl* ctl = m_car->getTTestCtl();
if(m_car->itemsSomeExaming2(Sub3ItemType02Qbxx) ||
m_car->itemsSomeExaming2(Sub3ItemType04Bgcd) ||
m_car->itemsSomeExaming2(Sub3ItemType05Lkzx) ||
m_car->itemsSomeExaming2(Sub3ItemType10Ccxx) ||
m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx) ||
m_car->itemsSomeExaming2(Sub3ItemType15Lkzz) ||
m_car->itemsSomeExaming2(Sub3ItemType16Lkyz) )
{
ctl->ZXD_KSSJ_TK = 0;
}
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 std::string& ksdd = TableSysSet->get211();
//转向灯不关闭距离
//20190128
if(ksdd == siteof::xjcj)
{
if((sor.zfxd == SYES && sor1.zfxd == SNOT) ||
(sor.yfxd == SYES && sor1.yfxd == SNOT) ||
(sor.shtd == SYES && sor1.shtd == SNOT))
{
m_itemvCJH.ZXD_Open_TempJL = cg->ai_ljjl;
}
if((sor.zfxd + sor.yfxd + sor.shtd) == 0 || (sor.zfxd + sor.yfxd + sor.shtd) == 3)
{
m_itemvCJH.ZXD_Open_TempJL = -1;
}
if(m_itemvCJH.ZXD_Open_TempJL > 0)
{
if(cg->ai_ljjl - m_itemvCJH.ZXD_Open_TempJL > ParmJL && ParmJL > 0)
{
m_itemvCJH.ZXD_Open_TempJL = -1;
JUDGE_MARK_SUB3(20, "71", false);
}
}
}
else if(ksdd == siteof::chongqingkm3)
{
if((sor.zfxd + sor.yfxd) == 0 || (sor.zfxd + sor.yfxd) == 2)
{
m_itemvCJH.ZXD_Open_TempJL = -1;
}
if(m_itemvCJH.ZXD_Open_TempJL > 0)
{
if(cg->ai_ljjl - m_itemvCJH.ZXD_Open_TempJL > ParmJL && ParmJL > 0)
{
m_itemvCJH.ZXD_Open_TempJL = -1;
JUDGE_MARK_SUB3(20, "71", false);
}
}
}
else
{
int dis = m_car->disForward() / 100; //cg->ai_ljjl
if((sor.zfxd == SYES && sor1.zfxd == SNOT) || (sor.yfxd == SYES && sor1.yfxd == SNOT))
{
m_itemvCJH.ZXD_Open_TempJL = dis;
}
if((sor.zfxd + sor.yfxd) == 0 || (sor.zfxd + sor.yfxd) == 2)
{
m_itemvCJH.ZXD_Open_TempJL = -1;
}
if(m_itemvCJH.ZXD_Open_TempJL >= 0)
{
if(dis - m_itemvCJH.ZXD_Open_TempJL > ParmJL && ParmJL > 0)
{
m_itemvCJH.ZXD_Open_TempJL = -1;
//20190306
if(ksdd == siteof::zjwz)
{
JUDGE_MARK_SUB3(20, "93", false);
}
else
{
JUDGE_MARK_SUB3(20, "71", false);
}
}
}
}
//转向灯开始时间相关的
if(sor.zfxd + sor.yfxd == 0 || sor.zfxd + sor.yfxd == 2)
{
ctl->ZXD_KSSJ_TK = 0;
}
if(ParmSJ > 0)
{
if(ctl->ZXD_KSSJ_TK > 0)
{
if(cg->tkCnt - ctl->ZXD_KSSJ_TK > ParmSJ * SECOND)
{
ctl->ZXD_KSSJ_TK = 0;
JUDGE_MARK_SUB3(20, "71", false);
}
}
}
}
//13、变道方向灯评判2重点翻译
void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TSensorInfo& sor1 = his1->real.sensor;
const TRTKResult& RTKKM3_1 = his1->RTKKM3;
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor5 = m_car->historySensor(5);
const std::string& ksdd = TableSysSet->get211();
TCar* tcar = m_car->getTCar();
TTestCtl* ctl = m_car->getTTestCtl();
//1、得到路段信息
std::string TempRoadData = cg->MapPoint_Road_Code;
if(TempRoadData == "")
{
TempRoadData = RTKKM3.MapRoad_Name;
}
TempRoadData = Tools::replace(TempRoadData, "+", ""); //变道相关
//变道方向灯判断相关 小于3秒
if(RTKKM3.FrontPointLaneCount > 0)
{
//压线一瞬间,车辆所在车道赋值
// (*
// //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
// //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
// *)
if(RTKKM3.TouchLineType > LineType_0 &&
RTKKM3_1.TouchLineType == LineType_0 &&
RTKKM3_1.FrontPointLaneCount > 0)
{
//打了左方向灯
if(sor1.zfxd == SYES && sor1.yfxd == SNOT)
{
m_itemvCJH.BeforeBgcd_zfxd = true;
}
//打了右方向灯
if(sor1.yfxd == SYES && sor1.zfxd == SNOT)
{
m_itemvCJH.BeforeBgcd_yfxd = true;
}
//变道前的车道号
m_itemvCJH.BeforeBgcd_LaneNo = RTKKM3_1.FrontPointLaneNo;
//方向灯满3秒检查
for(int i = 1; i < 100; i++)
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TSensorInfo& sori = his1->real.sensor;
if(hisi->tkCnt == 0 || (cg->tkCnt - hisi->tkCnt) > (tcar->fxd3scs / 5 * SECOND))
{
if(sori.zfxd == SYES && sori.yfxd == SNOT)
{
m_itemvCJH.BeforeBgcd_zfxd3s = true;
}
if(sori.yfxd == SYES && sori.zfxd == SNOT)
{
m_itemvCJH.BeforeBgcd_yfxd3s = true;
}
break;
}
}
}
//车头中心点已经到了新车道
if((RTKKM3.FrontPointLaneCount != RTKKM3_1.FrontPointLaneCount && RTKKM3_1.FrontPointLaneCount != 0) ||
RTKKM3.TouchLineType == 0)
{
m_itemvCJH.BeforeBgcd_LaneNo = 0;
m_itemvCJH.BeforeBgcd_zfxd = false;
m_itemvCJH.BeforeBgcd_yfxd = false;
m_itemvCJH.BeforeBgcd_zfxd3s = false;
m_itemvCJH.BeforeBgcd_yfxd3s = false;
}
}
else
{
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
const TRTKResult& RTKKM3_3 = m_car->historyRtkKM3(3);
//这种情况应该很少,外面都是测绘的,很少车头中心点不在任何车道的情况,按规则
//翻译即可
if(RTKKM3_1.FrontPointLaneCount == 0 && RTKKM3_2.FrontPointLaneCount == 0 &&
RTKKM3_3.FrontPointLaneCount == 0 && RTKKM3.TouchLineType == 0)
{
m_itemvCJH.BeforeBgcd_LaneNo = 0;
m_itemvCJH.BeforeBgcd_zfxd = false;
m_itemvCJH.BeforeBgcd_yfxd = false;
m_itemvCJH.BeforeBgcd_zfxd3s = false;
m_itemvCJH.BeforeBgcd_yfxd3s = false;
}
}
int s528 = TableSysSet->asInt528();
int NJ_DiaoTou_JL = m_car->getNJ_DiaoTou_JL();
//SysSet[528]:掉头N米内不判连续变道和方向灯
if(NJ_DiaoTou_JL > 0 && s528 > 0 && cg->ai_ljjl - NJ_DiaoTou_JL < s528)
{
}
else
{
m_car->setNJ_DiaoTou_JL(0);
int Tag = 0;
//如果基准点所在车道数和保险杠所在的车道数不一致
if(RTKKM3.BaseLaneCount != RTKKM3.FrontPointLaneCount)
{
Tag = 1;
}
// (*
// //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
// //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
// *)
//车轮压中心虚线
if(RTKKM3.TouchLineType == 6)
{
Tag = 0;
}
if(!m_car->rtkEnabled() || !m_car->rtkEnabled() || Tag == 1) return;
if(ksdd == siteof::guizhou)
{
//车道分界线
if(RTKKM3.TouchLineType == 2 && RTKKM3_1.TouchLineType == 2)
{
if((sor1.zfxd == SNOT && sor.zfxd == SYES) || (sor1.yfxd == SNOT && sor.yfxd == SYES))
{
JUDGE_MARK_SUB3(4, "42", false);
}
}
}
//SysSet[355]:
//(*
//差分模式下任何时刻都判变道不打方向灯(0-否 1-以前点车道数变化 2-以基准点车道数发生变化 3-车轮压线)
//*)
const std::string& s355 = TableSysSet->get355();
if(s355 != "0")
{
//20180415 借道超车方向灯评判
//向左压黄虚线变道:左前轮<右前轮 左后轮>右后轮
//向右压黄虚线变道:左前轮>右前轮 左后轮<右后轮
if(RTKKM3.TouchLineType == LineType_0 &&
RTKKM3_1.TouchLineType == LineType_0 && RTKKM3.BaseLaneCount > 0)
{
m_itemvCJH.CheLunYaXian_St = 0;
}
//20180607 掉头和靠边项目,不判借道方向灯
bool OKFlag = true;
//11、靠边停车 12掉头
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx))
{
OKFlag = false;
}
if(OKFlag == true)
{
//(*
// //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
// //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
//*)
if(RTKKM3.TouchLineType == LineType_6 && RTKKM3.BaseLaneCount > 0 &&
m_itemvCJH.CheLunYaXian_St == 0 && m_itemvCJH.JieDaoFXD_Flag == true) //20180626
{
//向左 20180530 rk_DistanceLFToLaneEdge
if(RTKKM3.Wheel_LF_ToRightEdge < RTKKM3.Wheel_RF_ToRightEdge && RTKKM3.Wheel_LB_ToRightEdge > RTKKM3.Wheel_RB_ToRightEdge)
{
m_itemvCJH.CheLunYaXian_St = 1;
if(!m_itemvCJH.BeforeBgcd_zfxd) //20180428
{
if(sor.zfxd == SNOT)
{
Mark_FXD_42_43(true);
}
}
else
{
if(!m_itemvCJH.BeforeBgcd_zfxd3s)
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
if(sorx.zfxd == SNOT || sor8.zfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
}
//向右 20180530
if(RTKKM3.Wheel_LF_ToRightEdge > RTKKM3.Wheel_RF_ToRightEdge && RTKKM3.Wheel_LB_ToRightEdge < RTKKM3.Wheel_RB_ToRightEdge)
{
m_itemvCJH.CheLunYaXian_St = 1;
if(!m_itemvCJH.BeforeBgcd_yfxd)
{
if(sor.yfxd == SNOT) //20180428
{
Mark_FXD_42_43(true);
}
}
else
{
if(!m_itemvCJH.BeforeBgcd_yfxd3s)
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
if(sorx.yfxd == SNOT || sor8.yfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
}
}
}
} //20180502
if(s355 == "3") //20180314 以车轮压线就算变道
{
//20180531 山东主动变道(压线前主动打灯,要变道)和"借道"(压线前没有打灯,车身过1/2时需判灯)
//SysSet[550] 第18个参数-->m_itemvCJH.bdfxdsj 变道方向灯评判时机 0以变道时判灯 2以压线时记录打灯记录变道时评判
if(m_itemvCJH.bdfxdsj == 2 || Tools::pos(siteof::shandong, ksdd)) //20180817 改成通用
{
//主动变道
bool OKFlag = true;
if(m_car->itemsSomeExaming2(Sub3ItemType04Bgcd) ||
m_car->itemsSomeExaming2(Sub3ItemType10Ccxx) ||
m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx) )
{
OKFlag = false;
}
if(OKFlag == true)
{
if(RTKKM3.TouchLineType == 0)
{
//主动变道
m_itemvCJH.zdbd = false;
m_itemvCJH.zdbd3 = false;
}
// (*
// //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
// //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
// *)
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
if(RTKKM3.TouchLineType == LineType_2 &&
RTKKM3_1.TouchLineType == LineType_2 &&
RTKKM3_2.TouchLineType == LineType_0 && RTKKM3_2.BasePointInLaneNo != 0 &&
RTKKM3.FrontPointLaneCount == RTKKM3_1.FrontPointLaneCount &&
RTKKM3_1.FrontPointLaneCount == RTKKM3_2.FrontPointLaneCount)
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
//相对于线来说, 1:从左->右方向压线 -1从右->左方向压线
if(RTKKM3_1.TouchDir == -1)
{
//向左变道
if(sor.zfxd == SNOT || sor1.zfxd == SNOT || (sor.zfxd == SYES && sor1.yfxd == SYES))
{
m_itemvCJH.zdbd = true;
}
else if(sorx.zfxd == SNOT || sor8.zfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
m_itemvCJH.zdbd3 = true;
}
}
else
{
//相对于线来说, 1:从左->右方向压线 -1从右->左方向压线
if(RTKKM3_1.TouchDir == TouchDir_1)
{
//向右变道
if(sor.yfxd == SNOT || sor1.yfxd == SNOT || (sor.zfxd == SYES && sor1.yfxd == SYES))
{
m_itemvCJH.zdbd = true;
}
else if(sorx.yfxd == SNOT || sor8.yfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
m_itemvCJH.zdbd3 = true;
}
}
}
}
// (*
// //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
// //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
// *)
if(RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount &&
((RTKKM3.BasePointInLaneNo > RTKKM3_1.BasePointInLaneNo && RTKKM3_1.BasePointInLaneNo > 0) ||
(RTKKM3.BasePointInLaneNo < RTKKM3_1.BasePointInLaneNo && RTKKM3.BasePointInLaneNo > 0)))
{
if(m_itemvCJH.zdbd)
{
JUDGE_MARK_SUB3(4, "42", false);
}
else
{
if(m_itemvCJH.zdbd3)
{
JUDGE_MARK_SUB3(4, "43", false);
}
}
m_itemvCJH.zdbd = false;
m_itemvCJH.zdbd3 = false;
//SysSet[409]:变道后变更车道项目结束0-否 1-是)
HandleSysSet409_1_Common();
const TSensorInfo& sor2 = m_car->historySensor(2);
if(sor.zfxd + sor.yfxd == SYES && sor1.zfxd + sor1.yfxd == SYES && sor2.zfxd + sor2.yfxd == SYES)
{
ctl->ZXD_KSSJ_TK = cg->tkCnt;
if(ksdd == siteof::chongqingkm3)
{
m_itemvCJH.ZXD_Open_TempJL = cg->ai_ljjl;
ctl->ZXD_KSSJ_TK = 0;
}
}
}
}
}
//(*
// //路段状况:车轮是否压线以及压线类型: 0-无 1-中心实线 2-车道分界线(虚线) 3-路右边线 4-路左边线 5-非机动车道分界线
// //6:中心线虚线 7:道路分界线(实线) 8:道路边缘线(右黄)
//*)
const TRTKResult& RTKKM3_2 = m_car->historyRtkKM3(2);
if(RTKKM3.TouchLineType == LineType_2 &&
RTKKM3_1.TouchLineType == LineType_2 &&
RTKKM3_2.TouchLineType == LineType_0 &&
RTKKM3_2.BasePointInLaneNo != 0 &&
RTKKM3.FrontPointLaneCount == RTKKM3_1.FrontPointLaneCount &&
RTKKM3_1.FrontPointLaneCount == RTKKM3_2.FrontPointLaneCount)
{
//20180531 山东专项 或其它地方专项和全程变道
bool OKFlag = false;
//4:变更车道 10:超车
if(m_car->itemsSomeExaming2(Sub3ItemType04Bgcd) ||
m_car->itemsSomeExaming2(Sub3ItemType10Ccxx))
{
OKFlag = true;
}
if(((Tools::pos(siteof::shandong, ksdd)) && OKFlag == true) ||
(!Tools::pos(siteof::shandong, ksdd) && m_itemvCJH.bdfxdsj != 2) ||
(m_itemvCJH.bdfxdsj == 2 && OKFlag == true)) //20180817
{
//变道判方向灯
OKFlag = true;
//11:靠边停车 12:掉头
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx))
{
OKFlag = false;
}
if(OKFlag == true) //在以下项目中不判 (掉头 靠边停车)
{
OKFlag = false;
//变更车道和超车
if(m_car->itemsSomeExaming2(Sub3ItemType04Bgcd) ||
m_car->itemsSomeExaming2(Sub3ItemType10Ccxx))
{
OKFlag = true;
}
//SysSet[355]
//(*
//差分模式下任何时刻都判变道不打方向灯(0-否 1-以前点车道数变化 2-以基准点车道数发生变化 3-车轮压线)
//*)
if(s355 != "0" || (s355 == "0" && OKFlag == true))
{
//前点跨车道 20171008
if(RTKKM3_1.TouchDir == TouchDir__1)
{
const TSensorInfo& sor5 = m_car->historySensor(5);
//向左变道
m_itemvCJH.bgcd_fangxiang = 1;
if((sor1.zfxd == SNOT && sor5.zfxd == SNOT) || (sor.zfxd == SYES && sor1.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
//判小于3秒
if(sorx.zfxd == SNOT || sor8.zfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
///////////////////
//ToDo:判断之前x秒内面部是否向左回头看 yhyflag
//20180523 5 左后
/////////////
}
else
{
if(RTKKM3_1.TouchDir == TouchDir_1)
{
//向右变道
const TSensorInfo& sor5 = m_car->historySensor(5);
m_itemvCJH.bgcd_fangxiang = 2;
if((sor1.yfxd == SNOT && sor5.yfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
//判小于3秒
if(sorx.yfxd == SNOT || sor8.yfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
////////////////////
//ToDo:判断之前x秒内面部是否向右回头看 yhyflag
//20180523 6右后
///////////////////
}
}
m_itemvCJH.BeforeBgcd_LaneNo = 0;
m_itemvCJH.BeforeBgcd_zfxd = false;
m_itemvCJH.BeforeBgcd_yfxd = false;
m_itemvCJH.BeforeBgcd_zfxd3s = false;
m_itemvCJH.BeforeBgcd_yfxd3s = false;
//SysSet[409]:变道后变更车道项目结束0-否 1-是)
HandleSysSet409_1_Special();
const TSensorInfo& sor2 = m_car->historySensor(2);
if(sor.zfxd + sor.yfxd == SYES && sor1.zfxd + sor1.yfxd == SYES && sor2.zfxd + sor2.yfxd == SYES)
{
ctl->ZXD_KSSJ_TK = cg->tkCnt;
if(ksdd == siteof::chongqingkm3)
{
m_itemvCJH.ZXD_Open_TempJL = cg->ai_ljjl;
ctl->ZXD_KSSJ_TK = 0;
}
}
}
}
}
}
}
else
{
if(s355 == "2" && RTKKM3.TouchLineType != 6)
{
const TChuanGan* his2 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_2 = his2->RTKKM3;
if((RTKKM3.BasePointInLaneNo > 0 && RTKKM3_1.BasePointInLaneNo > 0 &&
RTKKM3.BasePointInLaneNo != RTKKM3_1.BasePointInLaneNo &&
RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount) ||
(RTKKM3.BasePointInLaneNo > 0 && RTKKM3_2.BasePointInLaneNo > 0 &&
RTKKM3.BasePointInLaneNo != RTKKM3_2.BasePointInLaneNo &&
RTKKM3.BaseLaneCount == RTKKM3_2.BaseLaneCount))
{
//实线变道 增加连续两个信号压线 20140825
//变道判方向灯
bool OKFlag = true;
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx))
{
OKFlag = false;
}
if(OKFlag == true) //在以下项目中不判 (掉头 靠边停车)
{
//355扩展2表示要判方向灯且根据基准天线所在车道进行评判 20150804
OKFlag = false;
//超车和掉头
if(m_car->itemsSomeExaming2(Sub3ItemType04Bgcd) ||
m_car->itemsSomeExaming2(Sub3ItemType10Ccxx))
{
OKFlag = true;
}
if(s355 == "2" || s355 == "1" || (s355 == "0" && OKFlag == true))
{
if(m_itemvCJH.BeforeBgcd_LaneNo > 0)
{
//前点跨车道 20171008
if(RTKKM3.BasePointInLaneNo > RTKKM3_1.BasePointInLaneNo &&
RTKKM3_1.BasePointInLaneNo > 0 &&
RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount) //20140728
{
//向左变道 20180328
m_itemvCJH.bgcd_fangxiang = 1;
if(m_itemvCJH.bdfxdsj == 0)
{
const TSensorInfo& sor5 = m_car->historySensor(5);
if((sor.zfxd == SNOT && sor5.zfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
//判小于3秒
if(sorx.zfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
else
{
if(!m_itemvCJH.BeforeBgcd_zfxd)
{
Mark_FXD_42_43(true);
}
else
{
//判小于3秒
if(!m_itemvCJH.BeforeBgcd_zfxd3s)
{
Mark_FXD_42_43(false);
}
}
}
///////////////////
//ToDo:判断之前x秒内面部是否向左回头看 yhyflag
//20180523 5:左后
/////////////
}
else
{
//20171008
if(RTKKM3.BasePointInLaneNo < RTKKM3_1.BasePointInLaneNo &&
RTKKM3.BasePointInLaneNo > 0 &&
RTKKM3.BaseLaneCount == RTKKM3_1.BaseLaneCount) //20140728
{
//向右变道
m_itemvCJH.bgcd_fangxiang = 2;
if(m_itemvCJH.bdfxdsj == 0)
{
const TSensorInfo& sor5 = m_car->historySensor(5);
if((sor.yfxd == SNOT && sor5.yfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
//判小于3秒
if(sorx.yfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
else
{
if(!m_itemvCJH.BeforeBgcd_yfxd)
{
Mark_FXD_42_43(true);
}
else
{
//判小于3秒
if(!m_itemvCJH.BeforeBgcd_yfxd3s)
{
Mark_FXD_42_43(false);
}
}
}
////////////////////
//ToDo:判断之前x秒内面部是否向右回头看 yhyflag
//20180523 6右后
///////////////////
}
}
m_itemvCJH.BeforeBgcd_LaneNo = 0;
m_itemvCJH.BeforeBgcd_zfxd = false;
m_itemvCJH.BeforeBgcd_yfxd = false;
m_itemvCJH.BeforeBgcd_zfxd3s = false;
m_itemvCJH.BeforeBgcd_yfxd3s = false;
}
//SysSet[409]:变道后变更车道项目结束0-否 1-是)
HandleSysSet409_1_Special();
if((sor.zfxd + sor.yfxd == SYES) && (sor1.zfxd + sor1.yfxd == SYES) && (sor2.zfxd + sor2.yfxd == SYES))
{
ctl->ZXD_KSSJ_TK = cg->tkCnt;
if(ksdd == siteof::chongqingkm3)
{
m_itemvCJH.ZXD_Open_TempJL = cg->ai_ljjl;
ctl->ZXD_KSSJ_TK = 0;
}
}
}
}
}
}
else
{
//标准 20180416
if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 &&
RTKKM3.FrontPointLaneNo != RTKKM3_1.FrontPointLaneNo &&
RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6)
{
//变道判方向灯
Tag = 0;
//掉头、靠边
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx))
{
Tag = 1;
const std::vector<std::string>& s510 = TableSysSet->asArray510();
std::string tmp = s510.size() > 4 ? s510[4] : "";
if(tmp == "1")
{
Tag = 0;
}
}
//11:靠边停车
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc))
{
Tag = 1;
const std::vector<std::string>& s505 = TableSysSet->asArray505();
int tmp = s505.size() > 4 && s505[4] != "" ? std::atoi(s505[4].c_str()) : 1;
if(tmp == 1)
{
Tag = 0;
}
}
if(Tag != 0) return;
//355扩展2表示要判方向灯且根据基准天线所在车道进行评判 20150804
bool OKFlag = false;
//变道和超车
if(m_car->itemsSomeExaming2(Sub3ItemType04Bgcd) ||
m_car->itemsSomeExaming2(Sub3ItemType10Ccxx))
{
OKFlag = true;
}
if(s355 == "1" || (s355 != "1" && OKFlag == true))
{
if(m_itemvCJH.BeforeBgcd_LaneNo > 0)
{
//标准按车头所在车道
//前点跨车道
if(RTKKM3.FrontPointLaneNo > RTKKM3_1.FrontPointLaneNo &&
RTKKM3.FrontPointLaneCount == RTKKM3_1.FrontPointLaneCount) //20140728
{
m_itemvCJH.bgcd_fangxiang = 1;
const std::string& s490 = TableSysSet->get490();
if(ksdd == siteof::dingxi && Tools::pos(TempRoadData, s490))
{
//向右
//向右变道
if((sor.yfxd == SNOT && sor5.yfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
//判小于3秒
if(sorx.yfxd == SNOT || sor8.yfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
else
{
//向左变道 20180328
if(m_itemvCJH.bdfxdsj == 0)
{
if((sor.zfxd == SNOT && sor5.zfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
//判小于3秒
if(sorx.zfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
else
{
if(!m_itemvCJH.BeforeBgcd_zfxd)
{
Mark_FXD_42_43(true);
}
else
{
//判小于3秒
if(!m_itemvCJH.BeforeBgcd_zfxd3s)
{
Mark_FXD_42_43(false);
}
}
}
///////////////////
//ToDo:判断之前x秒内面部是否向左回头看 yhyflag
//20180523 5 左后
} //2016113
}
else
{
if(RTKKM3.FrontPointLaneNo < RTKKM3_1.FrontPointLaneNo &&
RTKKM3.FrontPointLaneCount == RTKKM3_1.FrontPointLaneCount) //20140728
{
const std::string& s490 = TableSysSet->get490();
//20161113
m_itemvCJH.bgcd_fangxiang = 2;
if(ksdd == siteof::dingxi && Tools::pos(TempRoadData, s490))
{
//向左变道
if((sor.zfxd == SNOT && sor5.zfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
//判小于3秒
if(sorx.zfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
else
{
//20180328
//向右变道
if(m_itemvCJH.bdfxdsj == 0)
{
if((sor.yfxd == SNOT && sor5.yfxd == SNOT) || (sor.zfxd == SYES && sor.yfxd == SYES)) //过滤双跳
{
Mark_FXD_42_43(true);
}
else
{
const TSensorInfo& sorx = m_car->historySensor(tcar->fxd3scs);
const TSensorInfo& sor8 = m_car->historySensor(8);
//判小于3秒
if(sorx.yfxd == SNOT || sor8.yfxd == SNOT || (sorx.zfxd == SYES && sorx.yfxd == SYES))
{
Mark_FXD_42_43(false);
}
}
}
else
{
//向右变道
if(!m_itemvCJH.BeforeBgcd_yfxd)
{
Mark_FXD_42_43(true);
}
else
{
//判小于3秒
if(!m_itemvCJH.BeforeBgcd_yfxd3s)
{
Mark_FXD_42_43(false);
}
}
}
////////////////////
//ToDo:判断之前x秒内面部是否向右回头看 //yhyflag
//20180523 6右后
///////////////////
}
}
}
m_itemvCJH.BeforeBgcd_LaneNo = 0;
m_itemvCJH.BeforeBgcd_zfxd = false;
m_itemvCJH.BeforeBgcd_yfxd = false;
m_itemvCJH.BeforeBgcd_zfxd3s = false;
m_itemvCJH.BeforeBgcd_yfxd3s = false;
}
//SysSet[409]:变道后变更车道项目结束0-否 1-是)
HandleSysSet409_1_Special();
if(sor.zfxd + sor.yfxd == SYES && sor1.zfxd + sor1.yfxd == SYES && sor2.zfxd + sor2.yfxd == SYES)
{
ctl->ZXD_KSSJ_TK = cg->tkCnt;
if(ksdd == siteof::chongqingkm3)
{
m_itemvCJH.ZXD_Open_TempJL = cg->ai_ljjl;
ctl->ZXD_KSSJ_TK = 0;
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
}
void Sub3Judge20Comm::Mark_FXD_42_43(bool Flag42)
{
/*
bool CCFlag = m_car->itemsSomeExaming2(Sub3ItemType10Ccxx); //超车
if(CCFlag == true) //20150427
{
if(Flag42 == true)
{
JUDGE_MARK_SUB3(10, "42", false);
}
else
{
JUDGE_MARK_SUB3(10, "43", false);
}
}
else
{
if(Flag42 == true)
{
JUDGE_MARK_SUB3(4, "42", false);
}
else
{
JUDGE_MARK_SUB3(4, "43", false);
}
}
*/
bool CCFlag = m_car->itemsSomeExaming2(Sub3ItemType10Ccxx); //超车
if(CCFlag == true) //20150427
{
if(Flag42 == true)
{
JUDGE_MARK_SUB3(10, "42", false);
}
else
{
JUDGE_MARK_SUB3(10, "43", false);
}
}
else
{
bool BGCD_ItemFlag = m_car->itemsSomeExaming2(Sub3ItemType04Bgcd); //变更车道
if(BGCD_ItemFlag == true) return; //(*XLG_Modify 2024-06-04*)
if(Flag42 == true)
{
JUDGE_MARK_SUB3(4, "42", false);
}
else
{
JUDGE_MARK_SUB3(4, "43", false);
}
}
}
void Sub3Judge20Comm::HandleSysSet409_1_Common()
{
const std::string& s409 = TableSysSet->get409();
if(s409 != "1")
{
return;
}
TKM3Item* item04 = m_car->findExamItem(Sub3ItemType04Bgcd);
if(item04)
{
if(item04->TestPro == ItemProFlagIdle || item04->TestPro == ItemProFlagEnd)
{
//ToDo1:通知上层生成当前项目的进项目事件
//ToDo2:通知上层生成当前项目的拍照事件
m_car->createEventEnterItem({item04->ItemNo, ""});
m_car->KM3EndItem(item04->ItemNo,true,false);
}
else if(item04->TestPro == ItemProFlagInit || item04->TestPro == ItemProFlagJudge)
{
m_car->KM3EndItem(item04->ItemNo);
}
}
}
void Sub3Judge20Comm::HandleSysSet409_1_Special()
{
const std::string& s409 = TableSysSet->get409();
if(s409 != "1")
{
return;
}
const std::string& ksdd = TableSysSet->get211();
TKM3Item* item10 = m_car->findExamItem(Sub3ItemType10Ccxx); //超车
bool OKFlag = (item10 && item10->Item_Color == itemStateWk);
if(m_itemvCJH.bgcd_fangxiang == 2 && ksdd == siteof::ynljys && OKFlag == true)
{
OKFlag = false;
TKM3Item* item04 = m_car->findExamItem(Sub3ItemType04Bgcd); //变更车道
if(item04 && (item04->Item_Color == itemStateHg || item04->Item_Color == itemStateBhg))
{
OKFlag = true;
}
if(OKFlag == true)
{
if(!CheckJL_CS_Itmv20(30))
{
TKM3Item* item10 = m_car->findExamItem(Sub3ItemType10Ccxx);
//超车项目检查
if(item10 != nullptr)
{
if(!m_car->itemsSomeExaming2(item04->ItemNo))
{
m_car->createEventEnterItem({item10->ItemNo, ""});
m_car->KM3EndItem(item10->ItemNo,true,false);
}
else
{
m_car->KM3EndItem(item10->ItemNo);
}
}
//ToDo:语音播报,结束超车
}
}
}
TKM3Item* item04 = m_car->findExamItem(Sub3ItemType04Bgcd); //变更车道
if(item04 != nullptr)
{
//这个参数的意思是,不在变更车道项目里面,就是说,
//我们没有读卡或者说考试员触发变更车道项目,学员自己在路上自己变道了。
//然后他变道完成的时候,我们会把变更车道项目。变成完已完成状态,就认为已经做过了。
if(!m_car->itemsSomeExaming2(item04->ItemNo) && !m_car->isItemPassed(item04->ItemNo)) //Tools::pos(',4,', ',' + Ctl.PassedItem) = 0
{
m_car->createEventEnterItem({item04->ItemNo, ""});
m_car->KM3EndItem(item04->ItemNo,true,false);
if(ksdd == siteof::ynljys)
{
//ToDo:语音播报:结束变更
}
}
}
}
bool Sub3Judge20Comm::CheckJL_CS_Itmv20(int jl, int cscs) //从当前位置向倒退jl米的距离内是否减速低于30
{
int count = m_car->historyCount(); //historyNumber
const TChuanGan* cg = m_car->historyChuanGan();
for(int i = 1; i < count; i++)
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
if(hisi == nullptr) break;
const TGpsInfo& gpsi = hisi->real.gps;
if(Tools::less(std::round(gpsi.sd), cscs))
{
return true;
}
if(cg->ai_ljjl - hisi->ai_ljjl >= jl)
{
break;
}
}
return false;
}
//14、副刹车评判
void Sub3Judge20Comm::Judge_FSC()
{
const std::string& ksdd = TableSysSet->get211();
const std::string& s527 = TableSysSet->get527();
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);
const TSensorInfo& sor1 = his1->real.sensor;
//SysSet[527]:踩副刹时(包括引起的熄火)车上不扣分,由监控画面提示是否扣分
if(s527 != "1")
{
if(ksdd == siteof::hbwh || ksdd == siteof::hbwhjz || m_itemvCJH.fscys == 0)
{
if(sor.fsc == SYES && sor1.fsc == SNOT) //踩副刹
{
//20180830
if((ksdd == siteof::zjjh && cg->ai_ljjl > 2 && Tools::greater(gps.sd, 0)) || (ksdd != siteof::zjjh))
{
JUDGE_MARK_SUB3(20, "15", false);
}
}
}
else
{
if(sor.fsc == SYES) //踩副刹 (cg.di_jsc = 1) and
{
m_itemvCJH.cfssj = cg->tkCnt;
for(int i = 1; i <= m_itemvCJH.fscys; i++) //qss 101201
{
const TChuanGan* hisi = m_car->historyChuanGan(i);
if(hisi == nullptr) break;
const TSensorInfo& sori = hisi->real.sensor;
if(sori.fsc == SNOT)
{
break;
}
if(i == m_itemvCJH.fscys)
{
TKM3Item* item03 = m_car->findExamItem(Sub3ItemType03Zxxs);
bool FindFlag = (item03 && item03->TestPro > ItemProFlagIdle);
if(FindFlag == true)
{
JUDGE_MARK_SUB3(3, "02", true);
}
else
{
//20180830
if((ksdd == siteof::zjjh && cg->ai_ljjl > 2 && Tools::greater(gps.sd, 0)) || (ksdd != siteof::zjjh))
{
JUDGE_MARK_SUB3(20, "15", true);
}
}
}
}
}
}
}
else
{
if(sor.fsc == SYES) //踩副刹
{
m_itemvCJH.cfssj = cg->tkCnt;
}
}
}
//15、越级加减档
void Sub3Judge20Comm::Judge_YueJi_JiaJianDang()
{
const std::string& ksdd = TableSysSet->get211();
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);
const TGpsInfo& gps1 = his1->real.gps;
const TSensorInfo& sor1 = his1->real.sensor;
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TGpsInfo& gps2 = his2->real.gps;
const TSensorInfo& sor2 = his2->real.sensor;
//SysSet[425] 加减挡位一挡一离合
// (*
// 加减档位操作挂一个挡位要松一次离合器(项目,全程0-否 1-是)
// *)
if(Tools::tolower(ksdd) == siteof::chongqingkm3)
{
TableSysSet->set425("0");
}
//20170826 全程 越级加挡扣分
if(IS_C2(m_carType)) return;
if(IS_C5(m_carType)) return;
if(gps.sd < 5.0 && gps1.sd < 5.0 && gps2.sd < 5.0) return;
#define HIS(x) m_car->historySensor(x).dw
//SysSet[425] 一档一离合相关
// (*
// 加减档位操作挂一个挡位要松一次离合器(项目,全程0-否 1-是)()
// *)
const std::vector<std::string>& s425 = TableSysSet->asArray425();
std::string ss425 = s425.size() > 1 ? s425[1] : "";
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw);//加减挡
if(item14 && item14->TestPro == ItemProFlagIdle && ss425 == "1")
{
if(sor.dw == HIS(1) && sor.dw != HIS(2) && sor.dw != HIS(3) && sor.dw > 0)
{
int dw = sor.dw;
int k = 0;
int count = m_car->historyCount();
for(int i = 1; i <= 25; i++)
{
if(i >= count || i + 6 >= count)
{
break;
}
const TSensorInfo& sori = m_car->historySensor(i);
if(sori.lhq == SNOT) break;
if(sori.dw == 0) continue;
if(dw != sori.dw &&
sori.dw == HIS(i+1) && sori.dw == HIS(i+2) && sori.dw == HIS(i+3) &&
sori.dw == HIS(i+4) && sori.dw == HIS(i+5) && sori.dw == HIS(i+6))
{
k = k + 1;
dw = sori.dw;
}
}
if(k > 1)
{
JUDGE_MARK_SUB3(14, "01", true);
}
}
}
/*
if Ctl.ksdd = 'wuxijiance' then
begin
if (cg.di_lhq = 1) and (cg.ai_dw = 3) then
begin
for i := 1 to 100 do
begin
if lscg[zj(i)].di_lhq = 0 then
Break;
if lscg[zj(i)].ai_dw > 3 then
Break;
if lscg[zj(i)].ai_dw = 1 then
begin
Mark(14, '01', True);
Break;
end;
end;
end;
end;
*/
int count = m_car->historyCount();
bool btempkf = false;
bool btemp1 = false;
bool btemp2 = false;
//越级加减档持续时间
if(m_itemvCJH.yjjdcxsj == 0)
{
bool ix = 0;
if(sor.lhq == SNOT)
{
ix = 1;
}
if(ksdd == siteof::lfgakm3)
{
ix = 1;
}
if(sor.dw == HIS(1) && sor.dw == HIS(2) && sor.dw > 0 && sor.dw < 9 &&
sor.lhq == SNOT && gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
{
for(int i = 3; i < 53; i++)
{
if(i >= count || i + 2 >= count)
{
break;
}
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TSensorInfo& sori = hisi->real.sensor;
if(sori.dw >= sor.dw && sori.lhq == SNOT) break;
if(sori.dw + 1 == sor.dw && sori.lhq == SNOT) break;
if(sori.dw == 0)
btemp1 = true;
if(sori.lhq == SYES)
btemp2 = true;
if(ksdd == siteof::shandong)
btemp2 = true;
if(ksdd == siteof::scms || ksdd == siteof::hnay || ksdd == siteof::lfgakm3)
btemp1 = true;
if(btemp1 && btemp2)
btempkf = true;
if(sori.dw < sor.dw && HIS(i+1) == sori.dw && sori.dw > 0)
{
if(sor.dw - sori.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt && btempkf)
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1)
{
JUDGE_MARK_SUB3(14, "01", true);
}
else
{
JUDGE_MARK_SUB3(20, "98", false);
}
m_itemvCJH.yjjdkfjs = hisi->tkCnt;
}
break;
}
}
}
}
else if(m_itemvCJH.yjjdcxsj == 1)
{
bool ix = 0;
if(sor.lhq == SNOT && sor1.lhq == SNOT)
{
ix = 1;
}
if(ksdd == siteof::lfgakm3)
{
ix = 1;
}
if(sor.dw == HIS(1) && sor.dw == HIS(2) && sor.dw == HIS(3) && sor.dw == HIS(4) &&
sor.dw > 0 && sor.dw < 9 && sor.lhq == SNOT && sor1.lhq == SNOT &&
gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
{
for(int i = 5; i <= 55; i++)
{
if(i >= count || i + 5 >= count)
{
break;
}
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TSensorInfo& sori = hisi->real.sensor;
if(sori.dw > sor.dw && sori.lhq == SNOT) break;
if(sori.dw + 1 == sor.dw && sori.lhq == SNOT) break;
if(sori.dw == 0)
btemp1 = true;
if(sori.lhq == SYES)
btemp2 = true;
if(ksdd == siteof::shandong)
btemp2 = true;
if(ksdd == siteof::scms || ksdd == siteof::hnay || ksdd == siteof::lfgakm3)
btemp1 = true;
if(btemp1 && btemp2)
btempkf = true;
if(sori.dw < sor.dw &&
HIS(i+1) == sori.dw && HIS(i+2) == sori.dw &&
HIS(i+3) == sori.dw && HIS(i+4) == sori.dw && sori.dw > 0)
{
if(sor.dw - sori.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt && btempkf)
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1)
{
JUDGE_MARK_SUB3(14, "01", true);
}
else
{
JUDGE_MARK_SUB3(20, "98", false);
}
m_itemvCJH.yjjdkfjs = hisi->tkCnt;
}
break;
}
}
}
}
else if(m_itemvCJH.yjjdcxsj == 2)
{
bool ix = 0;
if(sor.lhq == SNOT && sor2.lhq == SNOT)
{
ix = 1;
}
if(ksdd == siteof::lfgakm3)
{
ix = 1;
}
if(sor.dw == HIS(1) && sor.dw == HIS(2) && sor.dw == HIS(3) &&
sor.dw == HIS(4) && sor.dw == HIS(5) && sor.dw == HIS(6) &&
sor.dw == HIS(7) && sor.dw == HIS(8) && sor.dw > 0 && sor.dw < 9 &&
ix == 1 && gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
{
for(int i = 9; i < 59; i++)
{
if(i >= count || i + 10 >= count)
{
break;
}
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TSensorInfo& sori = hisi->real.sensor;
if(sori.dw > sor.dw && sori.lhq == SNOT) break;
if(sori.dw + 1 == sor.dw && sori.lhq == SNOT) break;
if(sori.dw == 0)
btemp1 = true;
if(sori.lhq == SYES)
btemp2 = true;
if(ksdd == siteof::shandong)
btemp2 = true;
if(ksdd == siteof::scms || ksdd == siteof::hnay || ksdd == siteof::lfgakm3)
btemp1 = true;
if(btemp1 && btemp2)
btempkf = true;
if(sori.dw < sor.dw &&
HIS(i+1) == sori.dw && HIS(i+2) == sori.dw && HIS(i+3) == sori.dw &&
HIS(i+4) == sori.dw && HIS(i+5) == sori.dw && HIS(i+6) == sori.dw &&
HIS(i+7) == sori.dw && HIS(i+8) == sori.dw && HIS(i+9) == sori.dw && sori.dw > 0)
{
if(sor.dw - sori.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt && btempkf)
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1)
{
JUDGE_MARK_SUB3(14, "01", true);
}
else
{
JUDGE_MARK_SUB3(20, "98", false);
}
m_itemvCJH.yjjdkfjs = hisi->tkCnt;
}
break;
}
}
//特殊地点版本规则翻译
if(ksdd == siteof::xjcj || ksdd == siteof::xjbz || ksdd == siteof::xjks) //越级减档
{
for(int i = 9; i < 59; i++)
{
if(i >= count || i + 9 >= count)
{
break;
}
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TSensorInfo& sori = hisi->real.sensor;
if(sori.dw == 9) break;
if(hisi->move != moveForward) break;
if(sori.dw < sor.dw && sori.lhq == SNOT) break;
if(sori.dw - 1 == sor.dw && sori.lhq == SNOT) break;
if(sori.dw > sor.dw &&
HIS(i+1) == sori.dw && HIS(i+2) == sori.dw && HIS(i+3) == sori.dw &&
HIS(i+4) == sori.dw && HIS(i+5) == sori.dw && HIS(i+6) == sori.dw &&
HIS(i+7) == sori.dw && HIS(i+8) == sori.dw && HIS(i+9) == sori.dw && sori.dw > 0)
{
if(sori.dw - sor.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt)
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1)
{
JUDGE_MARK_SUB3(14, "01", true);
}
else
{
JUDGE_MARK_SUB3(20, "98", false);
}
m_itemvCJH.yjjdkfjs = hisi->tkCnt;
}
break;
}
}
}
}
}
}
//16、起步挡50
void Sub3Judge20Comm::Judge_QiBuDang_50()
{
if(IS_C2(m_carType) || IS_C5(m_carType))
{
return;
}
const std::string& ksdd = TableSysSet->get211();
if(ksdd == siteof::zjhz && m_car->isMileage())
{
//浙江杭州的起步档50米满足公里数后不在评判
return;
}
const std::vector<std::string>& s507 = TableSysSet->asArray507();
std::string s507_8 = s507.size() > 7 ? s507[7] : ""; //8掉头项目里也扣连续起步档50米分0-不扣1-扣) 如果没设置默认为0不扣
std::string s507_9 = s507.size() > 8 ? s507[8] : ""; //9靠边停车项目里也扣连续起步档50米分0-不扣1-扣如果没设置默认为0不扣
if(s507_8 != "1")
{
if(m_car->itemsSomeExaming2(Sub3ItemType12Dtxx))
{
return;
}
}
if(s507_9 != "1")
{
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc))
{
return;
}
}
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc) ||
m_car->itemsSomeExaming2(Sub3ItemType12Dtxx))
{
}
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);
if((cg->move == moveStop && his1->move == moveStop && his2->move == moveStop) || (sor.dw != 1))
{
m_itemvXLG.CSH_QBDW_Flag = false;
}
if(cg->move == moveForward && his1->move == moveForward)
{
if(sor.dw == 1 && cg->ai_ljjl_cm > 0)
{
if(!m_itemvXLG.CSH_QBDW_Flag) // && cg->ai_ljjl_cm > 0
{
m_itemvXLG.CSH_QBDW_Flag = true;
m_itemvXLG.Mark_20_77_Flag = false;
m_itemvXLG.QB_CSJL_CM = cg->ai_ljjl_cm;
}
if(m_itemvXLG.CSH_QBDW_Flag && std::abs(cg->ai_ljjl_cm - m_itemvXLG.QB_CSJL_CM) >= 50 * 100)
{
if(!m_itemvXLG.Mark_20_77_Flag)
{
JUDGE_MARK_SUB3(20, "77", false);
m_itemvXLG.Mark_20_77_Flag = true;
}
}
}
/*
if(!m_itemvXLG.CSH_QBDW_Flag)
{
m_itemvXLG.CSH_QBDW_Flag = true;
m_itemvXLG.QB_CSJL_CM = cg->ai_ljjl_cm;
}
if(!m_itemvXLG.Mark_20_77_Flag)
{
if(sor.dw == 1)
{
int count = m_car->historyCount();
for(int i = 1; i < 200; i++)
{
if(count <= i) break;
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TSensorInfo& sori = hisi->real.sensor;
if(sori.dw != 1) break;
if(hisi->move != moveForward) break;
if(std::abs(hisi->ai_ljjl_cm - m_itemvXLG.QB_CSJL_CM) >= 50 * 100)
{
JUDGE_MARK_SUB3(20, "77", false);
m_itemvXLG.Mark_20_77_Flag = true;
}
}
}
}
*/
}
}
//17、熄火评判
void Sub3Judge20Comm::Judge_XiHuo()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TGpsInfo& gps = cg->real.gps;
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;
//ToDo:目前先按发动机转速评判
//靠边停车项目中不判熄火
if(sor.fdjzs > 20 && sor1.fdjzs > 20 && sor2.fdjzs > 20)
{
m_itemvXLG.XH_Enabled = true;
}
bool JudgeXiHuo = true;
if(m_car->itemsSomeExaming2(Sub3ItemType11Kbtc)) //如果是靠边停车确认停车之前要判
{
JudgeXiHuo = m_car->getPubCanJudge_XiHuoFlag();
}
int dis = m_car->getPubKaoBianTCFinish_LJJL();
if(dis != 0 && cg->ai_ljjl - dis < 5) //防止在考完所有项目这个时候还没点结束考试,这个时候熄火
{
JudgeXiHuo = false;
//if(m_car->itemsSomeExaming())
//{
// JudgeXiHuo = true; //中途做靠边停车,如果进了别的项目或者有项目还没做也判
//}
}
if(JudgeXiHuo == false)
{
return;
}
if(m_itemvCJH.zdxhkf == 2) //点火2评判熄火
{
if(sor.dh2 == SYES && sor1.dh2 == SNOT && Tools::lessequal(gps.sd, 1.001))
{
if(JudgeXiHuo)
{
JUDGE_MARK_SUB3(20, "36", false);
}
}
}
else
{
const TChuanGan* his3 = m_car->historyChuanGan(3);
const TSensorInfo& sor3 = his3->real.sensor;
//发动机转速
if(sor.fdjzs == 0 && sor1.fdjzs == 0 && sor2.fdjzs == 0 && sor3.fdjzs == 0)
{
//发动机转速模式判熄火的没有速度条件。如果是点火2判熄火的有速度条件。
if(m_itemvXLG.XH_Enabled == true)
{
m_itemvXLG.XH_Enabled = false;
if(JudgeXiHuo)
{
JUDGE_MARK_SUB3(20, "36", false);
}
}
}
}
}
//18、启动发动机挡位未置空挡
void Sub3Judge20Comm::Judge_DW_KongDang()
{
//C2 N空挡是0 R倒车档9 P驻车档10 D前进挡11
const TSensorInfo& sor = m_car->historySensor();
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
//启动发动机时,挡位未至于空挡(驻车挡)
if(sor.dh2 == SYES && sor1.dh2 == SNOT && sor2.dh2 == SNOT)
{
if(sor.dw_plc != 0 && sor.dw_plc != 10) //C2自动挡10档是驻车档P档0档是空挡 //(sor.dw != 0) //用原始档位无锡所
{
if(m_car->itemsSomeExaming2(Sub3ItemType02Qbxx))
{
JUDGE_MARK_SUB3(2, "04", false); //如果起步项目正在考就扣这个分
}
else
{
JUDGE_MARK_SUB3(20, "05", false);
}
}
}
}
//19、长时间启动钥匙
void Sub3Judge20Comm::Judge_ChangShiJian_QiDongYaoShi()
{
const TSensorInfo& sor = m_car->historySensor();
const TSensorInfo& sor1 = m_car->historySensor(1);
//const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor5 = m_car->historySensor(5);
const TSensorInfo& sor6 = m_car->historySensor(6);
const TSensorInfo& sor7 = m_car->historySensor(7);
const TSensorInfo& sor8 = m_car->historySensor(8);
const TSensorInfo& sor9 = m_car->historySensor(9);
const TSensorInfo& sor10 = m_car->historySensor(10);
const TSensorInfo& sor11 = m_car->historySensor(11);
const TSensorInfo& sor12 = m_car->historySensor(12);
if(sor.dh2 == SYES && sor1.dh2 == SNOT)
{
m_itemvXLG.qdysFlag = true;
}
if(sor.dh2 == SYES && sor5.dh2 == SYES && sor6.dh2 == SYES &&
sor7.dh2 == SYES && sor8.dh2 == SYES && sor9.dh2 == SYES &&
sor10.dh2 == SYES && sor11.dh2 == SYES && sor12.dh2 == SYES)
{
if(m_itemvXLG.qdysFlag == true)
{
JUDGE_MARK_SUB3(2, "05", false);
m_itemvXLG.qdysFlag = false;
}
}
}
//20、安全带
void Sub3Judge20Comm::Judge_AnQuanDai()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TSensorInfo& sor = cg->real.sensor;
const TSensorInfo& sor1 = his1->real.sensor;
const TSensorInfo& sor2 = his2->real.sensor;
// 1、默认前进状态有速度时触发评判这个条件100%执行)
// 2、当492=1时点火时也会触发评判
// 3、当492=2时里程大于1米靠边停车项目未考状态下触发评判
if(sor.aqd == SNOT && sor1.aqd == SNOT && sor2.aqd == SNOT)
{
const TGpsInfo& gps = cg->real.gps;
const TGpsInfo& gps1 = his1->real.gps;
const TGpsInfo& gps2 = his2->real.gps;
if(Tools::greater(gps.sd, 1.0) && Tools::greater(gps1.sd, 1.0) && Tools::greater(gps2.sd, 1.0))
{
m_itemvXLG.aqd_kfid = true;
JUDGE_MARK_SUB3(20, "01", true);
return;
}
int s492 = TableSysSet->asInt492();
if(s492 == 1)
{
if(sor.dh2 == SYES && sor1.dh2 == SYES)
{
JUDGE_MARK_SUB3(20, "01", true);
return;
}
}
else if(s492 == 2)
{
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc); //靠边停车
bool unExam = (item11 && item11->Item_Color == itemStateWk);
if(m_car->disForward() > 100 && unExam)
{
JUDGE_MARK_SUB3(20, "01", true);
return;
}
}
}
}
//21、打开车门
void Sub3Judge20Comm::Judge_DaKaiCheMen()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TSensorInfo& sor = cg->real.sensor;
const TSensorInfo& sor1 = his1->real.sensor;
const TSensorInfo& sor2 = his2->real.sensor;
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES)
{
const TGpsInfo& gps = cg->real.gps;
const TGpsInfo& gps1 = his1->real.gps;
const TGpsInfo& gps2 = his2->real.gps;
if(Tools::greater(gps.sd, 1.0) && Tools::greater(gps1.sd, 1.0) && Tools::greater(gps2.sd, 1.0))
{
//不能是靠边停车项目
TKM3Item* item11 = m_car->findExamItem(Sub3ItemType11Kbtc); //靠边停车
bool FindFlag = (item11 && item11->Item_Color == itemStateZk);
if(FindFlag == false)
{
//无锡所数据库里扣分表没有这个扣分只能扣上面的那个 //打开车门 2, "02",
JUDGE_MARK_SUB3(2, "02", true); //20, "90"
}
}
}
}
/*
//22、起步挂错挡
void Sub3Judge20Comm::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)
{
const TSensorInfo& sor = cg->real.sensor;
#if JUDGE_USE_INSPECT
if(sor.dw_plc >= 2) //无锡所用原始档位
{
JUDGE_MARK_SUB3(2, "44", false);
}
#else
if(sor.dw >= 2)
{
JUDGE_MARK_SUB3(2, "44", false);
}
#endif
}
}
*/
//23、挡位与车速、转速不匹配
void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TGpsInfo& gps = cg->real.gps;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TChuanGan* his2 = m_car->historyChuanGan(2);
const std::string& ksdd = TableSysSet->get211();
const std::string& s429 = TableSysSet->get429();
//SysSet[524]:
// (*
// 5242019年8月检测新规定
// 1停车时松开刹车15内未拉手刹扣分
// 2档位与车速不匹配使用新规则
// 3模拟灯光临时停车放最后一个
// 4点火不及时松开关新规则
// *)
if(IS_C2(m_carType) || IS_C5(m_carType)) return;
const std::vector<std::string>& s524 = TableSysSet->asArray524();
std::string s524_1 = s524.size() > 1 ? s524[1] : "";
if(s524_1 == "1")
{
//新规则
if(sor.lhq == SYES || Tools::less(gps.sd, 5))
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
m_itemvCJH.DW_FDJZS_ERROR_DW = 0;
m_itemvCJH.DW_FDJZS_ERROR_TK = 0;
}
else
{
bool bKfMn = false;
const TDwCs_Range& range = m_itemvCJH.DwCs_Range[sor.dw];
double sd = std::round(gps.sd);
if(Tools::less(sd, range.Low_Cs) || Tools::greater(sd, range.High_Cs))
{
if(m_itemvCJH.DW_CS_ERROR_DW == 0)
{
m_itemvCJH.DW_CS_ERROR_DW = sor.dw;
m_itemvCJH.DW_CS_ERROR_TK = cg->tkCnt;
}
}
else
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
}
TCar* tcar =m_car->getTCar();
int zsMax = tcar->DwZsMax[sor.dw];
int zsMin = tcar->DwZsMin[sor.dw];
if(sor.dw >= 1 && sor.dw <= 3)
{
//a := car.DwZsMax[cg.ai_dw];
if(sor.fdjzs > zsMax && zsMax > 0) //2100
{
bKfMn = true;
}
}
else if(sor.fdjzs < zsMin) //750
{
bKfMn = true;
}
if(bKfMn)
{
if(m_itemvCJH.DW_FDJZS_ERROR_DW == 0)
{
m_itemvCJH.DW_FDJZS_ERROR_DW = sor.dw;
m_itemvCJH.DW_FDJZS_ERROR_TK = cg->tkCnt;
}
}
else
{
m_itemvCJH.DW_FDJZS_ERROR_DW = 0;
m_itemvCJH.DW_FDJZS_ERROR_TK = 0;
}
}
//挡位发动机转速相关评判
if(m_itemvCJH.DW_FDJZS_ERROR_DW > 0)
{
int TempDW = m_itemvCJH.DW_FDJZS_ERROR_DW;
if(TempDW >= 1 && TempDW <= 5)
{
TDWErrorRec& dwerr = m_itemvCJH.DWErrArr[TempDW];
if(dwerr.djtkCnt != m_itemvCJH.DW_FDJZS_ERROR_TK)
{
dwerr.djtkCnt = m_itemvCJH.DW_FDJZS_ERROR_TK;
dwerr.djsc = dwerr.Ljsc;
dwerr.Ljsc = dwerr.djsc + (cg->tkCnt - m_itemvCJH.DW_FDJZS_ERROR_TK);
}
else
{
dwerr.Ljsc = dwerr.djsc + (cg->tkCnt - m_itemvCJH.DW_FDJZS_ERROR_TK);
}
if(dwerr.Ljsc > 15 * SECOND)
{
//使用挡位与车速长时间不匹配,造成车辆发动机转速过高或过低
JUDGE_MARK_SUB3(20, "86", false);
dwerr.Ljsc = 0;
m_itemvCJH.DW_FDJZS_ERROR_DW = 0;
}
}
}
//挡位与车速相关评判
if(m_itemvCJH.DW_CS_ERROR_DW > 0)
{
if(cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK > 2*SECOND)
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
//SysSet[429]:加减档位操作只在项目中评判0-否全过程评判 1-是此在项目中评判)
if(s429 != "1")
{
JUDGE_MARK_SUB3(14, "02", true);
}
}
}
}
else
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his3 = m_car->historyChuanGan(3);
const TChuanGan* his4 = m_car->historyChuanGan(4);
const TChuanGan* his5 = m_car->historyChuanGan(5);
const TChuanGan* his6 = m_car->historyChuanGan(6);
//旧规则评判
int TempCS = std::round(gps.sd);
const std::vector<std::string>& s507 = TableSysSet->asArray507();
std::string lhq = s507.size() > 9 ? s507[9] : ""; //507第10个参数 设置为1不管踩没踩离合器都判否则踩离合器不判
///////////////////////////////////////////////////////////////////////////
if((lhq != "1" && sor.lhq == SYES) || Tools::less(std::round(gps.sd), 5) ||
(ksdd != siteof::nj && (cg->move != moveForward || his1->move != moveForward ||
his2->move != moveForward || his3->move != moveForward || his4->move != moveForward ||
his5->move != moveForward || his6->move != moveForward)))
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
}
else
{
if(sor.dw >= 1 && sor.dw <= 5 && TempCS >= 1)
{
ISub3JudgeItem* item = m_car->findJudgeItem(Sub3ItemType14Jjdw);
if(item)
{
Sub3Judge14Jjdw* item14 = dynamic_cast<Sub3Judge14Jjdw*>(item);
TASSERT(item14 != nullptr, "");
TSub3Item14Jjdw* itemv14 = item14->getItemv();
if(TempCS > itemv14->DwCs_Range[sor.dw].High_Cs) //20170712 20180531
{
if(sor.dw != m_itemvCJH.DW_CS_ERROR_DW)
{
TCar* tcar =m_car->getTCar();
int zsMax = tcar->DwZsMax[sor.dw];
//20140812 增加转速的判断
if((sor.fdjzs > zsMax && zsMax > 0) || zsMax == 0)
{
m_itemvCJH.DW_CS_ERROR_DW = sor.dw;
m_itemvCJH.DW_CS_High_Flag = true;
m_itemvCJH.DW_CS_ERROR_TK = cg->tkCnt;
}
}
}
else
{
if(sor.dw == 1)
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
}
else
{
if(sor.fdjzs > 200 && TempCS < m_itemvCJH.DwCs_Range[sor.dw].Low_Cs)
{
if(sor.dw != m_itemvCJH.DW_CS_ERROR_DW || m_itemvCJH.DW_CS_High_Flag == true)
{
m_itemvCJH.DW_CS_ERROR_DW = sor.dw;
m_itemvCJH.DW_CS_High_Flag = false;
m_itemvCJH.DW_CS_ERROR_TK = cg->tkCnt;
}
}
else
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
}
}
}
}
}
else
{
m_itemvCJH.DW_CS_ERROR_DW = 0;
m_itemvCJH.DW_CS_ERROR_TK = 0;
m_itemvCJH.DW_FDJZS_ERROR_TK = 0;
}
}
//扣分处理 20171008 20171008
if(m_itemvCJH.DW_CS_ERROR_DW > 0 && TempCS > 5)
{
//20170713
if(cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK > 15 * SECOND)
{
//使用挡位与车速长时间不匹配,造成车辆发动机转速过高或过低
JUDGE_MARK_SUB3(20, "86", false);
m_itemvCJH.DW_CS_ERROR_DW = 0; //20190603
}
else
{
if(m_itemvCJH.DW_CS_High_Flag == true)
{
//低档高速
static constexpr int jskf = 2*SECOND;
if(cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK > jskf)
{
int TempDW = m_itemvCJH.DW_CS_ERROR_DW;
if(TempDW >= 1 && TempDW <= 5)
{
TDWErrorRec& dwerr = m_itemvCJH.DWErrArr[TempDW];
if(dwerr.djtkCnt != m_itemvCJH.DW_CS_ERROR_TK)
{
dwerr.djtkCnt = m_itemvCJH.DW_CS_ERROR_TK;
dwerr.djsc = dwerr.Ljsc;
dwerr.Ljsc = dwerr.djsc + (cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK);
}
else
{
dwerr.Ljsc = dwerr.djsc + (cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK);
}
if(dwerr.Ljsc > 15 * SECOND)
{
//使用挡位与车速长时间不匹配,造成车辆发动机转速过高或过低
JUDGE_MARK_SUB3(20, "86", false);
dwerr.Ljsc = 0;
m_itemvCJH.DW_CS_ERROR_DW = 0; //20190603
}
}
if(cg->tkCnt - m_itemvCJH.Mark_DW_CS_ZS_TK > m_itemvCJH.DWKF_SJ ||
m_itemvCJH.DW_FDJZS_ERROR_DW != m_itemvCJH.DW_CS_ERROR_DW) //20170713
{
m_itemvCJH.DW_FDJZS_ERROR_DW = m_itemvCJH.DW_CS_ERROR_DW; //20170713
m_itemvCJH.Mark_DW_CS_ZS_TK = cg->tkCnt;
//dqdf := tds.Grade; //20141106
//bKf := false;
//SysSet[429]:
// (*
// 加减档位操作只在项目中评判0-否全过程评判 1-是此在项目中评判)
// *)
if(s429 != "1")
{
if(Tools::pos(siteof::xjcj, ksdd) || ksdd == siteof::xjks || ksdd == siteof::xjbz)
{
if(m_itemvCJH.DW_CS_ERROR_DW >= 1 && m_itemvCJH.DW_CS_ERROR_DW <= 5)
{
//车辆运行速度和挡位不匹配
JUDGE_MARK_SUB3(14, "02", false);
}
}
else
{
if(m_itemvCJH.DW_CS_ERROR_DW >= 1 && m_itemvCJH.DW_CS_ERROR_DW <= 5)
{
//车辆运行速度和挡位不匹配
JUDGE_MARK_SUB3(14, "02", false);
}
}
}
}
}
}
else
{
//高档低速,发动机转速低
constexpr int jskf = 2000;
if(cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK >= jskf)
{
//20180205
int TempDW = m_itemvCJH.DW_CS_ERROR_DW;
if(TempDW >= 1 && TempDW <= 5)
{
TDWErrorRec& dwerr = m_itemvCJH.DWErrArr[TempDW];
if(dwerr.djtkCnt != m_itemvCJH.DW_CS_ERROR_TK)
{
dwerr.djtkCnt = m_itemvCJH.DW_CS_ERROR_TK;
dwerr.djsc = dwerr.Ljsc;
dwerr.Ljsc = dwerr.djsc + (cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK);
}
else
{
dwerr.Ljsc = dwerr.djsc + (cg->tkCnt - m_itemvCJH.DW_CS_ERROR_TK);
}
if(dwerr.Ljsc > 5 * SECOND)
{
JUDGE_MARK_SUB3(20, "86", false);
dwerr.Ljsc = 0;
m_itemvCJH.DW_CS_ERROR_DW = 0; //20190603
}
}
if(cg->tkCnt - m_itemvCJH.Mark_DW_CS_ZS_TK > m_itemvCJH.DWKF_SJ)
{
//dqdf := tds.Grade; //20141106
m_itemvCJH.Mark_DW_CS_ZS_TK = cg->tkCnt;
//20171130
if(s429 != "1") //20141106
{
if(m_itemvCJH.DW_CS_ERROR_DW >= 3 && m_itemvCJH.DW_CS_ERROR_DW <= 5)
{
JUDGE_MARK_SUB3(14, "02", false);
}
}
}
}
}
}
}
}
}
void Sub3Judge20Comm::Judge_Sysset534()
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
for(auto it = m_itemvXLG.SDs534.begin(); it != m_itemvXLG.SDs534.end(); ++it)
{
auto& v = it->second;
if(cg->real.gps.sd < v.speed)
{
v.distance += (cg->ai_ljjl_cm - his1->ai_ljjl_cm);
}
if(v.distance > v.limit*100)
{
JUDGE_MARK_SUB3(20, "46", true);
}
}
}
void Sub3Judge20Comm::Judge_Sysset535(bool timing)
{
if(!timing)
{
const TChuanGan* cg = m_car->historyChuanGan();
const TChuanGan* his1 = m_car->historyChuanGan(1);
for(auto it = m_itemvXLG.SDs535.begin(); it != m_itemvXLG.SDs535.end(); ++it)
{
auto& v = it->second;
if(cg->real.gps.sd > v.speed)
{
v.distance += (cg->ai_ljjl_cm - his1->ai_ljjl_cm);
}
}
}
else
{
for(auto it = m_itemvXLG.SDs535.begin(); it != m_itemvXLG.SDs535.end(); ++it)
{
auto& v = it->second;
if(v.distance < v.limit*100)
{
JUDGE_MARK_SUB3(20, "50", true);
}
}
}
}
//24、全程次高挡评判
void Sub3Judge20Comm::Judge_CiGaoDang()
{
TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const TGpsInfo& gps = cg->real.gps;
if(sor.dw >= 4 && sor.dw != 9 && gps.sd >= 10)
{
m_itemvXLG.CGD_Nums = m_itemvXLG.CGD_Nums + 1;
}
//按照军华说的 在行驶距离达到的实际判断全程次高档 20240731
//301 第3个^参数 1:达到行驶里程 非1靠边停车开始前 20240805
bool timing = false; //次高档时机
TTestCtl* ctl = m_car->getTTestCtl();
if(ctl->dw_kf_sj == 1) //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前
{
if(m_car->isMileage())
{
timing = true;
}
}
else
{
if(m_car->isMileage()) //靠边停车前结算次高档也要判断行驶里程
{
//TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc);
//if(item && item->Item_Color != itemStateWk)
//{
// timing = true;
//}
//靠边模式评判次高档的时机调整到靠边确认(如拉手刹挂空挡等)
ISub3JudgeItem* item = m_car->findJudgeItem(Sub3ItemType11Kbtc);
if(item)
{
Sub3Judge11Kbtc* item11 = dynamic_cast<Sub3Judge11Kbtc*>(item);
if(item11 && item11->isConfirm())
{
timing = true;
}
}
}
}
if(timing)
{
if(m_itemvXLG.CGD_Nums == 0)
{
JUDGE_MARK_SUB3(14, "03", true);
}
else if(m_itemvXLG.CGD_Nums < 5 * FRAMES_PER_SECOND) //要在次高档行驶5秒
{
JUDGE_MARK_SUB3(14, "04", true);
}
Judge_Sysset535(true);
}
}
//25、自动靠边停车重点
void Sub3Judge20Comm::Call_Auto_KBTC()
{
//SysSet[319]:里程不够不报靠边停车0-否 1-是 2-必考项目完成,并且里程满足要求)
//SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
const std::string& s319 = TableSysSet->get319();
//自动靠边停车
if(s319 == "1")
{
if(!m_car->isMileage()) return;
}
if(s319 == "2")
{
if(!m_car->isMileage()) return;
//自动靠边停车计算
//自动靠边停车
if(m_itemvCJH.bZdKbTc)
{
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
//必考项目未完成
for(auto it = all.begin(); it != all.end(); it++)
{
TKM3Item* item = it->second->getExamItem();
if(item->ItemNo == Sub3ItemType11Kbtc)
{
if(item->Item_Color != itemStateWk)
{
return;
}
}
else
{
if(item->NoID == false && (item->Item_Color == itemStateWk || item->Item_Color == itemStateZk))
{
return;
}
}
}
const TChuanGan* cg = m_car->historyChuanGan();
if(m_itemvCJH.KbTcJl == -1)
{
m_itemvCJH.KbTcJl = cg->ai_ljjl;
}
if(cg->ai_ljjl - m_itemvCJH.KbTcJl >= m_itemvCJH.ZdKbTcJl)
{
//20171008
const std::string& ksdd = TableSysSet->get211();
if(ksdd == siteof::changzhoukm3)
{
if(cg->RTKKM3.BaseLaneCount > 0)
{
TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item && item->Item_Color == itemStateWk)
{
m_car->setEnterItem(item);
}
}
}
else
{
TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item && item->Item_Color == itemStateWk)
{
m_car->setEnterItem(item);
}
}
}
}
}
}
//26、夜间行驶及其他业务逻辑
void Sub3Judge20Comm::Judge_Extra()
{
/*const*/TChuanGan* cg = m_car->historyChuanGan();
const TRTKResult& RTKKM3 = cg->RTKKM3;
const TChuanGan* his1 = m_car->historyChuanGan(1);
const TRTKResult& RTKKM3_1 = his1->RTKKM3;
const TChuanGan* his2 = m_car->historyChuanGan(2);
const TRTKResult& RTKKM3_2 = his2->RTKKM3;
const TSensorInfo& sor = cg->real.sensor;
const TSensorInfo& sor1 = his1->real.sensor;
const TGpsInfo& gps = cg->real.gps;
const TGpsInfo& gps1 = his1->real.gps;
const TGpsInfo& gps2 = his2->real.gps;
const std::string& ksdd = TableSysSet->get211();
//触发夜间行驶
TKM3Item* item13 = m_car->findExamItem(Sub3ItemType13Yjxs);
if(item13 && item13->Item_Color == itemStateWk && item13->FinishFlag == false && item13->TestPro == ItemProFlagIdle)
{
//ToDo1:生成 夜间行驶 进项目事件
m_car->setEnterItem(item13);
}
/*
//自动触发加减挡位
bool FindSCZB = false;
bool FindMNDG = false;
bool SCZBFinishFlag = false;
bool MNDGFinishFlag = false;
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb);
if(item01)
{
FindSCZB = true;
if(item01->FinishFlag)
{
SCZBFinishFlag = true;
}
if(item01->Item_Color == itemStateHg || item01->Item_Color == itemStateBhg)
{
SCZBFinishFlag = true;
}
}
TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg);
if(item41)
{
FindMNDG = true;
if(item41->FinishFlag)
{
MNDGFinishFlag = true;
}
if(item41->Item_Color == itemStateHg || item41->Item_Color == itemStateBhg)
{
MNDGFinishFlag = true;
}
}
if((SCZBFinishFlag == true || FindSCZB == false) && (MNDGFinishFlag == true || FindMNDG == false))
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //20240731
if(item14 && item14->NoID == true) //免考加减挡的
{
if(item14->Item_Color == itemStateWk)
{
//ToDo1:生成 全程加减挡 进项目事件
m_car->createEventEnterItem({item14->ItemNo, ""});
m_car->KM3EndItem(item14->ItemNo);
}
}
}
*/
m_DiaoTou_ID = 0;
std::string CurrentRoadData = cg->MapPoint_Road_Code;
if(CurrentRoadData == "")
{
//这里要稍微讲解一下(有些地方,可能驾校在路段中间,这种情况下,初始读不到路段,这种情况比较少 )
CurrentRoadData = RTKKM3.MapRoad_Name;
}
if(Tools::pos("+", CurrentRoadData) == false && CurrentRoadData != "") //不在路口
{
//获取当前路段属性
std::string LSRoadData1 = his1->MapPoint_Road_Code;
if(LSRoadData1 == "")
{
LSRoadData1 = RTKKM3_1.MapRoad_Name;
}
std::string LSRoadData2 = his2->MapPoint_Road_Code;
if(LSRoadData2 == "")
{
LSRoadData2 = RTKKM3_2.MapRoad_Name;
}
if(CurrentRoadData != LSRoadData2)
{
m_itemvCJH.Road_Attr_MaxCS = 0;
m_itemvCJH.Road_Attr_NoDiaotou = false;
//路段灯光属性计算
cg->ai_road_light = 0; //20151116
for(int i = 0; i < m_itemvCJH.Road_Attr_LEN; i++)
{
if(m_itemvCJH.Road_Attr[i].Road_Code == CurrentRoadData)
{
//车速,间隔帧,^照明属性^禁止掉头^
const std::string& str1 = m_itemvCJH.Road_Attr[i].Attr_Str;
if(str1 != "")
{
std::vector<std::string> s = Tools::split(str1, "^");
std::vector<std::string> ss = Tools::split(s.size() > 0 ? s[0] : "", ",");
m_itemvCJH.Road_Attr_MaxCS = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0;
m_itemvCJH.Road_Attr_MaxCS_Tm = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 0;
if(m_itemvCJH.Road_Attr_MaxCS_Tm <= 0)
{
m_itemvCJH.Road_Attr_MaxCS_Tm = 1;
}
//得到路段的照明属性
//路段照明情况 0-未知 1-照明良好 2-照明不良 3-临时停车 4-同方向近距离跟车行驶20151116
//5-夜间模拟通过人行横道 6-夜间模拟没有交通信号灯的路口 7-夜间模拟会车 8-夜间模拟超车 20160617
std::string str = s.size() > 1 ? s[1] : "";
cg->ai_road_light = str != "" ? std::atoi(str.c_str()) : 0;
//3、是否允许掉头
str = s.size() > 2 ? s[2] : "";
m_itemvCJH.Road_Attr_NoDiaotou = (str == "1");
}
}
}
}
if(m_itemvCJH.Road_Attr_MaxCS > 0 && cg->move == moveForward)
{
int count = m_car->historyCount();
if(count > 3 && count > 4 && count > m_itemvCJH.Road_Attr_MaxCS_Tm * 5)
{
const TGpsInfo& gps3 = m_car->historyGps(3);
const TGpsInfo& gps4 = m_car->historyGps(4);
const TGpsInfo& gpsx = m_car->historyGps(m_itemvCJH.Road_Attr_MaxCS_Tm * 5);
int TempCS = m_itemvCJH.Road_Attr_MaxCS;
if(Tools::greater(std::round(gps.sd), TempCS) &&
Tools::greater(std::round(gps1.sd), TempCS) &&
Tools::greater(std::round(gps2.sd), TempCS) &&
Tools::greater(std::round(gps3.sd), TempCS) &&
Tools::greater(std::round(gps4.sd), TempCS) &&
Tools::greater(std::round(gpsx.sd), TempCS) &&
m_car->rtkEnabled())
{
//不按规定速度行驶
JUDGE_MARK_SUB3(20, "58", false);
m_itemvCJH.Road_Attr_MaxCS = 0;
}
}
}
//如果当前路段设置成了不允许掉头
if(m_itemvCJH.Road_Attr_NoDiaotou == true)
{
if(m_DiaoTou_ID == 0)
{
int jl = 0;
if(IS_C1C2C5C6(m_carType))
{
jl = 18;
}
else
{
jl = 30;
}
//检查是否有掉头动作(dtzzj:掉头角度变化阈值)
if(Check_Diaotou(jl, m_itemvCJH.dtzzj))
{
m_DiaoTou_ID = 2;
}
else
{
m_DiaoTou_ID = 1;
}
}
if(m_DiaoTou_ID == 2 && Tools::greater(std::round(gps.sd), 0)) //20140423 增加车速大于0 的条件
{
//掉头地点选择不当
JUDGE_MARK_SUB3(12, "02", true);
}
}
}
//在人行道内
//人行道不能掉头0-否 1-是)
const std::string& s389 = TableSysSet->get389();
if(s389 == "1")
{
if(RTKKM3.InShapeAttr == InShapeAttr_1)
{
if(m_DiaoTou_ID == 0)
{
if(Check_Diaotou(30, m_itemvCJH.dtzzj))
{
m_DiaoTou_ID = 2;
}
else
{
m_DiaoTou_ID = 1;
}
}
if(m_DiaoTou_ID == 2)
{
const TRTKResult& RTKKM3_3 = m_car->historyRtkKM3(3);
//不允许掉头 20180830
if(RTKKM3_1.InShapeAttr == InShapeAttr_1 &&
RTKKM3_2.InShapeAttr == InShapeAttr_1 &&
RTKKM3_3.InShapeAttr == InShapeAttr_1)
{
//掉头地点选择不当
JUDGE_MARK_SUB3(12, "02", true);
}
}
}
}
//(13,'08') 在有路灯照明良好的道路上行驶时,使用远光灯
bool Execute_13_08_Flag = false;
//item13 = m_car->findExamItem(Sub3ItemType13Yjxs);
//if(item13)
//{
// if(item01->TestPro == ItemProFlagInit || item01->TestPro == ItemProFlagJudge)
// {
// Execute_13_08_Flag = true;
// }
//}
Execute_13_08_Flag = m_car->itemsSomeExaming2(Sub3ItemType13Yjxs);
const std::string& s323 = TableSysSet->get323();
TCar* tcar = m_car->getTCar();
if(tcar->Night_ID == true && s323 == "3")
{
Execute_13_08_Flag = true;
}
if(Execute_13_08_Flag == true)
{
//1、切换到照明不良的路段
if(cg->ai_road_light == 2 && his1->ai_road_light != 2 && CurrentRoadData != "'")
{
m_itemvCJH.yjdg_road_code = CurrentRoadData;
m_car->setyjdg_road_code_kf(true);
}
if(cg->ai_road_light == 1 && his1->ai_road_light != 1 && CurrentRoadData != "")
{
m_itemvCJH.yjdg_road_code = CurrentRoadData;
}
if(m_car->getyjdg_road_code_kf() == true)
{
if(cg->ai_road_light != 2 || CurrentRoadData == "")
{
m_car->setyjdg_road_code_kf(false);
}
if(sor.ygd == SYES && sor1.ygd == SYES)
{
m_car->setyjdg_road_code_kf(false);
}
}
int ZhaoMingGood_Succ_Num = 0;
int ZhaoMingGood_Error_Num = 0;
int ZhaoMingBad_Succ_Num = 0;
int ZhaoMingBad_Error_Num = 0;
int count = m_car->historyCount();
for(int i = 1; i <= 100; i++)
{
if(i >= count || i+1 >= count)
{
break;
}
TChuanGan* hisi = m_car->historyChuanGan(i);
const TRTKResult& RTKKM3_i = hisi->RTKKM3;
const TSensorInfo& sor_i = hisi->real.sensor;
TChuanGan* hisi1 = m_car->historyChuanGan(i+1);
const TRTKResult& RTKKM3_i1 = hisi1->RTKKM3;
//前进状态,在路段内,不在路口内
std::string LSRoadData1 = hisi->MapPoint_Road_Code;
if(LSRoadData1 == "")
{
LSRoadData1 = RTKKM3_i.MapRoad_Name;
}
std::string LSRoadData2 = hisi1->MapPoint_Road_Code;
if(LSRoadData2 == "")
{
LSRoadData2 = RTKKM3_i1.MapRoad_Name;
}
if(hisi->move == moveForward && LSRoadData1 != "" && Tools::pos("+", LSRoadData1) == false )
{
//在一个大路段(没有到路口,是持续变化的路段)(这里重点讲解一下)
if(LSRoadData1 != LSRoadData2 && LSRoadData2 == m_itemvCJH.yjdg_road_code) //不同一路段,重新计算
{
//照明良好的道路上远光灯超过2秒。并且正确操作少于1秒
if(ZhaoMingGood_Error_Num > 10 && ZhaoMingGood_Succ_Num < 5)
{
//在有路灯、照明良好的道路上行驶时,使用远光灯
JUDGE_MARK_SUB3(13, "08", true);
}
//照明不良的道路上远光灯少于1秒并且近关灯小于1秒
if(ZhaoMingBad_Error_Num > 10 && ZhaoMingBad_Succ_Num < 5)
{
//20170817
if(m_itemvCJH.WzmKFRoad != m_itemvCJH.yjdg_road_code)
{
//在有路灯、照明良好的道路上行驶时,使用远光灯
JUDGE_MARK_SUB3(13, "09", true);
m_car->setyjdg_road_code_kf(false);
m_itemvCJH.WzmKFRoad = m_itemvCJH.yjdg_road_code;
}
}
ZhaoMingGood_Succ_Num = 0;
ZhaoMingGood_Error_Num = 0;
ZhaoMingBad_Succ_Num = 0;
ZhaoMingBad_Error_Num = 0;
}
bool FindFlag = true;
if(m_car->itemsSomeExaming2(Sub3ItemType05Lkzx) ||
m_car->itemsSomeExaming2(Sub3ItemType15Lkzz) ||
m_car->itemsSomeExaming2(Sub3ItemType16Lkyz))
{
FindFlag = false;
}
if(FindFlag == true)
{
//1.1、照明良好的道路上,打远光灯
if(hisi->ai_road_light == 1 && sor_i.ygd == SYES && sor.ygd == SYES)
{
ZhaoMingGood_Error_Num = ZhaoMingGood_Error_Num + 1;
}
//1.2、照明良好的道路上,没有打远光灯
if(hisi->ai_road_light == 1 && sor_i.ygd == SNOT && sor.ygd == SNOT)
{
ZhaoMingGood_Succ_Num = ZhaoMingGood_Succ_Num + 1;
}
//2.1照明不良的道路上,没有使用远光灯
if(hisi->ai_road_light == 2 && sor_i.ygd == SNOT && sor.ygd == SNOT)
{
ZhaoMingBad_Error_Num = ZhaoMingBad_Error_Num + 1;
}
//照明不良的道路上,打远光灯
if(hisi->ai_road_light == 2 && sor_i.ygd == SYES && sor.ygd == SYES)
{
ZhaoMingBad_Succ_Num = ZhaoMingBad_Succ_Num + 1;
}
}
}
}
if(ZhaoMingGood_Error_Num >= 50) //10秒
{
//在有路灯、照明良好的道路上行驶时使用远光灯超过10秒
JUDGE_MARK_SUB3(13, "08", true);
}
//照明不良道路上不使用远光灯超过10秒 yhy 2025-02-13 咨询过的//20也行吧win是20后来安卓我统一为10了。
if(ZhaoMingBad_Error_Num >= 50) //10秒
{
if(m_itemvCJH.WzmKFRoad != m_itemvCJH.yjdg_road_code)
{
//进入无照明、照明不良的道路行驶时不使用远光灯
JUDGE_MARK_SUB3(13, "09", false);
m_car->setyjdg_road_code_kf(false);
m_itemvCJH.WzmKFRoad = m_itemvCJH.yjdg_road_code;
}
}
}
//////////////////////////////////////////////////////////////////////////////
bool FindFlag = false;
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
for(auto it = all.begin(); it != all.end(); it++)
{
TKM3Item* item = it->second->getExamItem();
if(item->ItemNo == Sub3ItemType05Lkzx||
item->ItemNo == Sub3ItemType15Lkzz ||
item->ItemNo == Sub3ItemType16Lkyz)
{
if(item->TestPro == ItemProFlagInit)
{
FindFlag = true;
}
}
if(item->ItemNo == Sub3ItemType12Dtxx && item->EnterItemFromLuKou5 == true)
{
if(item->TestPro == ItemProFlagInit)
{
FindFlag = true;
}
}
}
if(FindFlag == true)
{
if(ksdd == siteof::heb && cg->ai_road_light == 2)
{
if(m_car->getyjdg_road_code_kf())
{
//进入无照明、照明不良的道路行驶时不使用远光灯
JUDGE_MARK_SUB3(13, "09", false);
}
}
m_car->setyjdg_road_code_kf(false);
}
}
//掉头检查
bool Sub3Judge20Comm::Check_Diaotou(int jl, int dtjd)
{
//gps_a := 0;
const TChuanGan* cg = m_car->historyChuanGan();
const TGpsInfo& gps = cg->real.gps;
int count = m_car->historyCount();
for(int i = 1; i <= 500; i++)
{
if(i >= count || i+1 >= count)
{
break;
}
const TChuanGan* hisi = m_car->historyChuanGan(i);
const TRTKResult& RTKKM3_i = hisi->RTKKM3;
const TChuanGan* hisi1 = m_car->historyChuanGan(i+1);
const TRTKResult& RTKKM3_i1 = hisi1->RTKKM3;
const TGpsInfo& gps_i1 = hisi->real.gps;
if(cg->ai_ljjl - hisi->ai_ljjl > jl)
{
return false;
}
//0-不在形状里 1-在人行道内 2-在网格线内
if(RTKKM3_i.InShapeAttr == InShapeAttr_1 && RTKKM3_i1.InShapeAttr == InShapeAttr_0)
{
//按测向角判
if(!m_car->rtkEnabled()) //测向角丢了,退出
{
break;
}
double a = gps.hxj - gps_i1.hxj;
//处理越界问题
if(a > 300)
{
a = a - 360;
}
else
{
if(a < -300)
{
a = a + 360;
}
}
//gps_a := gps_a + a;
if(std::abs(a) > dtjd && std::abs(a) < 210) //20180830 -150
{
return true;
}
break;
}
}
return false;
}
void Sub3Judge20Comm::JudgeDriveDirection()
{
if(m_car->historyCount() > 25)
{
const TRTKResult& RTK0 = m_car->historyRtkKM3(0);
const TRTKResult& RTK1 = m_car->historyRtkKM3(1);
if(RTK0.DirInverse == DriveDirN &&
RTK1.DirInverse == DriveDirN &&
m_car->historyRtkKM3(5).DirInverse == DriveDirN &&
m_car->historyRtkKM3(10).DirInverse == DriveDirN &&
m_car->historyRtkKM3(15).DirInverse == DriveDirN &&
m_car->historyRtkKM3(20).DirInverse == DriveDirN &&
m_car->historyRtkKM3(25).DirInverse == DriveDirN )
{
//连续5秒逆向行驶并且在测绘道路上
if(RTK0.BasePointInLaneNo > 0 && RTK0.BaseLaneCount > 0 &&
RTK1.BasePointInLaneNo > 0 && RTK1.BaseLaneCount > 0)
{
JUDGE_MARK_SUB3(20, "88", true);
}
}
}
}
//**********************以下是新科目三************************
void Sub3Judge20Comm::NS3JudgeVision_30108()
{
//行驶中双手离开方向盘时间超过双手脱离方向盘安全时间【2s】
if(!NS3UsingAndData(NS3UsingBeha)) return;
const TVisionBeha* beha0 = m_nsub3->hisBeha(0);
int64 nowTime = m_car->GetCurrentTime2();
if(beha0->fx == 0)
{
if(m_itemvNS3.offSteer == 0)
{
m_itemvNS3.offSteer = nowTime;
}
else
{
const std::vector<std::vector<int>>& s530 = TableSysSet->asArray2Int_530();
std::vector<int> ss530 = s530.size() > 0 ? s530[0] : std::vector<int>();
int sec = ss530.size() > 0 ? ss530[0] : 2;
if(sec > 0 && m_itemvNS3.offSteer > 0 && nowTime - m_itemvNS3.offSteer > sec*SECOND)
{
m_itemvNS3.offSteer = 0;
JUDGE_MARK_NSUB3(20, "63", true);
//NS3video
}
}
}
else
{
m_itemvNS3.offSteer = 0;
}
}
void Sub3Judge20Comm::NS3JudgeVision_30110()
{
//行驶中单手控制方向盘且车辆发生偏移偏移距离大于设置的偏移距离【30cm】
if(!NS3UsingAndData(NS3UsingBeha)) return;
const TVisionBeha* beha0 = m_nsub3->hisBeha(0);
if(beha0->fx == 1)
{
const TRTKResult& RTKKM3 = m_car->historyRtkKM3();
int dis = (RTKKM3.Body_RF_ToRightEdge + RTKKM3.Body_RB_ToRightEdge) / 2;
if(m_itemvNS3.oneHand == 0)
{
m_itemvNS3.oneHand = dis;
}
else
{
const std::vector<std::vector<int>>& s530 = TableSysSet->asArray2Int_530();
std::vector<int> ss530 = s530.size() > 1 ? s530[1] : std::vector<int>();
int dis = ss530.size() > 0 ? ss530[0] : 30;
int r0 = (RTKKM3.Body_RF_ToRightEdge + RTKKM3.Body_RB_ToRightEdge) / 2;
const TRTKResult& RTKKM3_1 = m_car->historyRtkKM3(1);
int r1 = (RTKKM3_1.Body_RF_ToRightEdge + RTKKM3_1.Body_RB_ToRightEdge) / 2;
if(dis > 0 && m_itemvNS3.oneHand > 0 &&
std::abs(r0 - m_itemvNS3.oneHand) > dis &&
std::abs(r1 - m_itemvNS3.oneHand) > dis)
{
m_itemvNS3.oneHand = 0;
JUDGE_MARK_NSUB3(20, "66", true);
//NS3video
}
}
}
else
{
m_itemvNS3.oneHand = 0;
}
}
void Sub3Judge20Comm::NS3JudgeVision_30116()
{
//行驶中视线离开行驶方向超过2s 非项目行驶中2秒内头部姿态角度大于左侧角度【18度】大于右侧角度【20度】
if(!NS3UsingAndData(NS3UsingPose)) return;
if(m_car->isInItemExaming()) //非项目行驶中才评判
{
return;
}
const TNS3PoseSysset& poseSys = m_nsub3->getPoseSysset();
int64 nowTime = m_car->GetCurrentTime2();
const TVisionPose* pose0 = m_nsub3->hisPose(0);
if(pose0->zy < -poseSys.left || pose0->zy > poseSys.right)
{
if(m_itemvNS3.sight == 0)
{
m_itemvNS3.sight = nowTime;
}
else
{
//2s是行标定的所以暂时没有参数
if(m_itemvNS3.sight > 0 && nowTime - m_itemvNS3.sight > 2*SECOND)
{
m_itemvNS3.sight = 0; //2秒扣一次
JUDGE_MARK_NSUB3(20, "45", true);
//NS3video
}
}
}
else
{
m_itemvNS3.sight = 0;
}
}
void Sub3Judge20Comm::NS3JudgeVision_30130()
{
//行驶中头、手伸出窗户时间超过伸出窗户安全时间【2s】
if(!NS3UsingAndData(NS3UsingBeha)) return;
int64 nowTime = m_car->GetCurrentTime2();
const TVisionBeha* beha0 = m_nsub3->hisBeha(0);
if(beha0->ch > 0)
{
if(m_itemvNS3.outWindow == 0)
{
m_itemvNS3.outWindow = nowTime;
}
else
{
const std::vector<std::vector<int>>& s530 = TableSysSet->asArray2Int_530();
std::vector<int> ss530 = s530.size() > 1 ? s530[1] : std::vector<int>();
int s = ss530.size() > 1 ? ss530[1] : 2;
if(s > 0 && m_itemvNS3.outWindow > 0 && nowTime - m_itemvNS3.outWindow > s*SECOND)
{
m_itemvNS3.outWindow = 0; //2秒扣一次
JUDGE_MARK_NSUB3(20, "67", true);
//NS3video
}
}
}
else
{
m_itemvNS3.outWindow = 0;
}
}
void Sub3Judge20Comm::NS3JudgeWeather_30104()
{
//不能正确使用灯光、雨刮器等车辆常用操纵件
//增加光学雨量传感器
//1.降雨量大于【2.5mm/时】阀值【5s】内没有打开雨刮器
//2.光照小于【50lux】阀值【5s】内没有打开近光灯。
#if !JUDGE_USE_NSUB3
return;
#else
const std::vector<int>& s549 = TableSysSet->asArrayInt549();
int illumination = s549.size() > 0 ? s549[0] : 0;
int rainfall = s549.size() > 1 ? s549[1] : 0;
const TSensorInfo& sor = m_car->historySensor();
int64 nowTime = m_car->GetCurrentTime2();
if(rainfall > 0) //启用雨量评判
{
if(sor.yl > rainfall)
{
if(m_itemvNS3.rainfall == 0)
{
m_itemvNS3.rainfall = nowTime;
}
else
{
if(sor.ygq == SYES)
{
m_itemvNS3.rainfall = 0;
}
else
{
if(m_itemvNS3.rainfall > 0 &&
nowTime - m_itemvNS3.rainfall > 5*SECOND &&
m_itemvNS3.isJudgeRainfall == false)
{
m_itemvNS3.isJudgeRainfall = true;
m_itemvNS3.rainfall = 0;
JUDGE_MARK_NSUB3(20, "93", false);
//NS3video
}
}
}
}
else
{
m_itemvNS3.rainfall = 0;
}
}
if(illumination > 0) //启用光照评判
{
if(sor.gx < illumination)
{
if(m_itemvNS3.illumination == 0)
{
m_itemvNS3.illumination = nowTime;
}
else
{
if(sor.jgd == SYES)
{
m_itemvNS3.illumination = 0;
}
else
{
if(m_itemvNS3.illumination > 0 &&
nowTime - m_itemvNS3.illumination > 5*SECOND &&
m_itemvNS3.isJudgeIllum == false)
{
m_itemvNS3.isJudgeIllum = true;
m_itemvNS3.illumination = 0;
JUDGE_MARK_NSUB3(20, "93", false);
//NS3video
}
}
}
}
else
{
m_itemvNS3.illumination = 0;
}
}
#endif
}