6449 lines
241 KiB
C++
6449 lines
241 KiB
C++
#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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//长时间骑压分界线 襄阳:C1C2C5:15秒或者50米 A1A2A3B1B2:15秒
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//长时间骑压分界线 襄阳:C1C2C5:15秒或者50米 A1A2A3B1B2:15秒
|
||
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):第一个数字0:abc方式 1:aba/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):第一个数字0:abc方式 1:aba/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]:
|
||
// (*
|
||
// 524:2019年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
|
||
}
|