subject-two/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp
2025-03-27 10:18:35 +08:00

657 lines
20 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "Sub3Judge01Sczb.h"
#include "HFactory.h"
Sub3Judge01Sczb::Sub3Judge01Sczb()
{
m_exam = __NEW__(TKM3Item);
}
Sub3Judge01Sczb::~Sub3Judge01Sczb()
{
__DELETE__(m_exam);
}
bool Sub3Judge01Sczb::dealJudgeEnter()
{
if(m_exam->TestPro != ItemProFlagInit) return false;
//超声波评判跟差分信号没有关系,所以不做差分信号状态的判断
//if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return false;
const std::string& ksdd = TableSysSet->get211();
m_itemv = TSub3Item01Sczb();
m_csb.clear(); //C++记得在程序关闭的时候,把这个堆对象释放掉(其实释放不释放无所谓,程序都退出了)
//SysSet[513]:
//(*
//513绕车一周传感器 0-原始两个声波或两个手按自动识别
// 1-手按式 接到右后磁s和右后磁n2-四个传感 器模式^串口号1,串口号2^
// 3-三个手按式传感 器 接到右后磁s 左后磁n 右后磁n
// 4-一型机4个按钮 5-二型机4个按钮 6-超声波 8-4个按钮磁前磁s前磁n左前磁s左前磁n
//*)
//1、得到绕车一周模式
//SysSet[512]:
//(*
//标准的开始考试模式,必须熄火状态下开始考试,以点火触发模拟灯光(启用标记^t1提示点火时间^t2不下车绕车扣分时间^t3提示后未点火扣分时间^)
//启用标记1-从副驾驶门外开始考试绕车2-从主驾驶位置上开始考试绕车建议使用2模式
//*)
const std::vector<std::string>& s512 = TableSysSet->asArray512();
std::string Temp512_9 = s512.size() > 8 && s512[8] != "" ? s512[8].c_str() : "";
const std::vector<std::string> s512_9 = Tools::split(Temp512_9, "^");
m_itemv.newtype = s512_9.size() > 0 && s512_9[0] != "" ? std::atoi(s512_9[0].c_str()) : 0;
m_itemv.time_tishi = s512_9.size() > 1 && s512_9[1] != "" ? std::atoi(s512_9[1].c_str()) : 0;
m_itemv.time_raoche = s512_9.size() > 2 && s512_9[2] != "" ? std::atoi(s512_9[2].c_str()) : 0;
m_itemv.time_koufen = s512_9.size() > 3 && s512_9[3] != "" ? std::atoi(s512_9[3].c_str()) : 0;
//当前的绕车时刻的累计用时,秒
int64 lastTime = m_car->timeElapsed()/SECOND;
m_itemv.time_raoche_js = lastTime; //Tds.LastTime;
//特殊地点版本
if(ksdd == siteof::huaiangtkm3 || ksdd == siteof::huaianxuyi)
{
m_itemv.time_raoche_js = 0;
m_itemv.time_tishi_js = lastTime; // Tds.LastTime;
}
const std::string& s513 = TableSysSet->get513();
int Temp513 = s513 != "" ? std::atoi(s513.c_str()) : 0;
if(Temp513 < 0 || Temp513 > 9)
{
Temp513 = 0;
}
// (*XLG_Modify 2024-04-07*)
// (*
// 1超声波定义
// 513绕车一周传感器
//0-原始两个声波或两个手按自动识别
// 1-手按式 接到右后磁s和右后磁n
// 2-四个传感器模式^串口号1,串口号2^
// 3-三个手按式传感 器 接到右后磁s 左后磁n 右后磁n
// 4-一型机4个按钮
// 5-二型机4个按钮
// 6-超声波
// 7-未找到定义
// 8-4个按钮磁前磁s前磁n左前磁s左前磁n
// *)
if(Temp513 == 0 || Temp513 == 1 || Temp513 == 6 || Temp513 == 7)
{
m_itemv.radarCount = 2;
}
else if(Temp513 == 3)
{
m_itemv.radarCount = 3;
}
else
{
m_itemv.radarCount = 4;
}
m_exam->TestPro = ItemProFlagJudge;
//ToDo2:生成进项目事件
return true;
}
void Sub3Judge01Sczb::dealJudgeItem()
{
#if JUDGE_USE_INSPECT
return; //屏蔽上车准备
#endif
HELP_COST_TIME("");
if(m_exam->TestPro != ItemProFlagJudge) return;
//超声波评判跟差分信号没有关系,所以不做差分信号状态的判断
//if(!m_car->rtkEnabled() || !m_car->rtkEnabled(1)) return;
const std::string& s386 = TableSysSet->get386();
if(s386 == "3") //无锡地区模式只要发动机启动了,点切换就上车准备自动完成播报模拟灯光
{
return;
}
//有这种考试模式,上车准备是外壳完成的,这种少数,兼容 windows是这种做法
const TStuInfo& stuInfo = m_car->stuInfo();
if(stuInfo.sczb) //StuInfo.CS_Finish_SCZB_Flag
{
const std::vector<TKfXm>& sczb_mark = stuInfo.sczbkf;
if(!sczb_mark.empty()) //StuInfo.CX_SCZB_KouFenData
{
for(size_t i = 0; i < sczb_mark.size(); i++)
{
const TKfXm& m = sczb_mark[i];
//强制扣分
//JudgeKM3Obj.Mark(StrToInt(Temp1), Temp2, False, True);
//2025-01-03 因为要上传项目开始,项目结束,还有扣分也要上传,所有要走这里,要发扣分事件给外壳
JUDGE_MARK_SUB3(m.xmdm, m.kfdm.c_str(), false, true, true, MarkTypeArti);
}
}
m_exam->TestPro = ItemProFlagEnd;
return;
}
//第二次考试不绕车一周(0-否+1-是)不扣分
if(m_car->stuKkcs() < 2 && TableSysSet->asInt398() == 1)
{
m_exam->TestPro = ItemProFlagEnd;
return;
}
//3、绕车一周评判时机(1-开始考试后判 2-开始考试前判,)
const std::string& s364 = TableSysSet->get364();
if(s364 == "2")
{
return;
}
const TChuanGan* cg = m_car->historyChuanGan();
const TSensorInfo& sor = cg->real.sensor;
const std::string& ksdd = TableSysSet->get211();
int count = m_car->historyCount();
if(count < 2*FRAMES_PER_SECOND)
{
//TASSERT(false, "");
return;
}
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
const TSensorInfo& sor3 = m_car->historySensor(3);
//TSensorInfo sor1;
//TSensorInfo sor2;
//TSensorInfo sor3;
//if(count > 1) sor1 = m_car->historySensor(1);
//if(count > 2) sor2 = m_car->historySensor(2);
//if(count > 3) sor3 = m_car->historySensor(3);
//当前时刻的累计用时秒
const int64 lastTime = m_car->timeElapsed()/SECOND;
const int64 temptime = lastTime; //Tds.LastTime;
//加入超声波数据
//加入左前
if(sor.csbzq < m_csbValue && sor.csbzq > 0)
{
AddCSBData(CsbType::ZQ);
}
//加入右后
if(sor.csbyh < m_csbValue && sor.csbyh > 0)
{
AddCSBData(CsbType::YH);
}
if(m_itemv.radarCount >= 3)
{
//加入右前
if(sor.csbyq < m_csbValue && sor.csbyq > 0)
{
AddCSBData(CsbType::YQ);
}
//加入左后
if(sor.csbzh < m_csbValue && sor.csbzh > 0)
{
AddCSBData(CsbType::ZH);
}
}
if(m_itemv.FinishFlag == true)
{
//ToDo:超声波计算 judgecsb();
judge_csb();
m_exam->TestPro = ItemProFlagEnd;
return;
}
if(m_itemv.newtype == 1)
{
//当前时刻的累计用时秒
//temptime = m_car->timeElapsed()/SECOND; //Tds.LastTime;
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SNOT && sor3.mkg == SNOT)
{
m_itemv.time_raoche_js = -1;
if(ksdd != siteof::huaiangtkm3 && ksdd != siteof::huaianxuyi)
{
m_itemv.time_tishi_js = temptime;
}
if(ksdd == siteof::shanghaikm3)
{
//ToDO:语音提示,请点火
}
}
if(m_itemv.time_raoche_js > 0 && m_itemv.time_raoche > 0)
{
if(temptime - m_itemv.time_raoche_js > m_itemv.time_raoche)
{
m_itemv.time_raoche_js = -1;
//不按考试员指令驾驶
JUDGE_MARK_SUB3(20, "94", false);
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
//提示计时相关
if(m_itemv.time_tishi_js > 0)
{
if(temptime - m_itemv.time_tishi_js > m_itemv.time_tishi)
{
m_itemv.time_tishi_js = -1;
m_itemv.time_koufen_js = temptime;
if(ksdd == siteof::shanghaikm3)
{
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES)
{
//ToDo:语音提示,请关门
}
}
if(sor.fdjzs < 100 && sor1.fdjzs < 100 && sor2.fdjzs < 100)
{
//ToDo:语音提示,请点火
}
}
}
//2、扣分计时相关
if(m_itemv.time_koufen_js > 0)
{
if(temptime - m_itemv.time_koufen_js > m_itemv.time_koufen)
{
m_itemv.time_koufen_js = -1;
if(sor.fdjzs < 100 && sor1.fdjzs < 100 && sor2.fdjzs < 100)
{
//不按考试员指令驾驶
JUDGE_MARK_SUB3(20, "94", false);
m_exam->TestPro = ItemProFlagEnd;
}
}
}
//关门动作
if(ksdd != siteof::huaiangtkm3)
{
if(sor.mkg == SNOT && sor1.mkg == SNOT && sor2.mkg == SYES && sor3.mkg == SYES)
{
judge_csb();
}
}
bool b = false;
if(sor.fdjzs > 100 && sor1.fdjzs > 100 && sor2.fdjzs > 100)
{
b = true;
}
//SysSet[386]
//(*
//触发夜间灯光模拟的条件(0-点完成 1-插安全带或点火 2-点火 3-上车准备人工评判按钮切换 4-点击"继续考试"按钮触发
//5-有点火2信号就可以触发6-有安全带就触发)
//*)
if(s386 == "6" && sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SYES)
{
b = true;
}
if(s386 == "5" && sor.dh2 == SYES)
{
b = true;
}
if(b == true)
{
m_itemv.FinishFlag = true;
}
}
else if(m_itemv.newtype == 2)
{
//temptime = m_car->timeElapsed()/SECOND;
//门开关
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SNOT && sor3.mkg == SNOT)
{
m_itemv.time_raoche_js = -1;
m_itemv.time_tishi_js = temptime;
m_itemv.time_guanmen_js = temptime;
}
if(m_csb.size() != 0)
{
m_itemv.time_raoche_js = -1;
}
if(m_itemv.time_raoche_js > 0 && m_itemv.time_raoche > 0)
{
if(temptime - m_itemv.time_raoche_js > m_itemv.time_raoche)
{
m_itemv.time_raoche_js = -1;
JUDGE_MARK_SUB3(20, "94", true); //不按规定考试
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
//语音提示
if(m_itemv.time_tishi_js > 0)
{
if(temptime - m_itemv.time_tishi_js > m_itemv.time_tishi)
{
m_itemv.time_tishi_js = -1;
m_itemv.time_koufen_js = temptime;
if(sor.fdjzs < 100 && sor1.fdjzs < 100 && sor2.fdjzs < 100)
{
//ToDo:语音提示,请“点火”
}
}
}
//地点版本相关
if(ksdd == siteof::ynzt)
{
if(m_itemv.time_guanmen_js > 0)
{
if(temptime - m_itemv.time_guanmen_js > 10)
{
m_itemv.time_guanmen_js = -1;
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES)
{
//考试过程中打开车门
JUDGE_MARK_SUB3(2, "02", false); //20, "90",
}
}
}
}
//点火2
if(sor.dh2 == SYES)
{
m_itemv.time_koufen_js = -1;
}
if(m_itemv.time_koufen_js > 0)
{
if(temptime - m_itemv.time_koufen_js > m_itemv.time_koufen)
{
m_itemv.time_koufen_js = -1;
if(sor.fdjzs < 100 && sor1.fdjzs < 100 && sor2.fdjzs < 100)
{
if(Tools::pos(siteof::guizhou, ksdd) == false)
{
JUDGE_MARK_SUB3(20, "94", true); //不按规定考试
m_exam->TestPro = ItemProFlagEnd;
return;
}
}
}
}
bool b = false;
if(sor.fdjzs > 100 && sor1.fdjzs > 100 && sor2.fdjzs > 100)
{
b = true;
}
//SysSet[386]
//(*
//触发夜间灯光模拟的条件(0-点完成 1-插安全带或点火 2-点火 3-上车准备人工评判按钮切换 4-点击"继续考试"按钮触发
//5-有点火2信号就可以触发6-有安全带就触发)
//*)
if(s386 == "6")
{
if(sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SYES)
{
b = true;
}
}
if(s386 == "5" && sor.dh2 == SYES)
{
b = true;
}
if(s386 == "2" && sor.dh2 == SYES && sor1.dh2 == SYES && sor2.dh2 == SNOT)
{
b = true;
}
if(b == true)
{
m_itemv.FinishFlag = true;
}
}
else
{
//标准
//SysSet[386]:
//(*
// 触发夜间灯光模拟的条件(0-点完成 1-插安全带或点火 2-点火 3-上车准备人工评判按钮切换
// 4-点击"继续考试"按钮触发 5-有点火1信号就可以触发6-有安全带就触发)
//*)
if(s386 == "2")
{
if(sor.aqd == SYES && sor1.aqd == SYES && sor2.aqd == SNOT && sor3.aqd == SNOT)
{
if(sor.fdjzs == 0 && sor1.fdjzs == 0 && sor2.fdjzs == 0)
{
if(m_itemv.bsound_dh == false)
{
m_itemv.bsound_dh = true;
//ToDo语音提示"请点火"
}
}
}
//考试计时大于3秒
if(lastTime > 3)
{
if(sor.fdjzs > 100 && sor1.fdjzs > 100 && sor2.fdjzs > 100 && sor3.fdjzs > 100)
{
m_itemv.FinishFlag = true;
}
}
}
//(*
//else if(SysSet[386] = '4') then
//{
// //ToDo:人工点击了“继续考试" (界面上有个按钮,可以人工点击”继续考试" 的,评判和外壳协商如何解决
// //如果收到了外壳点击的“继续考试”命令m_itemv.FinishFlag = true;
//}
//*)
else
{
if(sor.aqd == SYES && sor1.aqd == SNOT && sor2.aqd == SNOT && sor3.aqd == SNOT)
{
m_itemv.FinishFlag = true;
}
}
//前进也结束项目
if(lastTime > 5)
{
if(m_car->historyMoveState(0) == moveForward &&
m_car->historyMoveState(1) == moveForward &&
m_car->historyMoveState(2) == moveForward &&
m_car->historyMoveState(3) == moveForward &&
m_car->historyMoveState(4) == moveForward)
{
if(sor.jsc == SNOT)
{
judge_csb();
m_itemv.FinishFlag = true;
}
}
}
}
//except
//}
//finally
char buf[128] = {0};
SafeSprintf(buf, sizeof(buf), JUDGE_UTF8S("CSBNum=%d,newType=%d-->CSBData="), m_itemv.radarCount, m_itemv.newtype);
std::string data = buf;
for(size_t i = 0; i < m_csb.size(); i++)
{
std::string s;
switch(m_csb[i])
{
case CsbType::ZQ: s = "ZQ"; break;
case CsbType::ZH: s = "ZH"; break;
case CsbType::YH: s = "YH"; break;
case CsbType::YQ: s = "YQ"; break;
default: break;
}
data += (s + ",");
}
showStatus(data);
}
void Sub3Judge01Sczb::AddCSBData(CsbType csb)
{
bool addFlag = false;
if(m_csb.empty())
{
m_csb.push_back(csb);
std::string sou;
switch(csb)
{
case CsbType::ZQ: sou = sound::sub3_401001; break;
case CsbType::ZH: sou = sound::sub3_401002; break;
case CsbType::YH: sou = sound::sub3_401003; break;
case CsbType::YQ: sou = sound::sub3_401004; break;
default: break;
}
//ToDo:语音提示,
m_car->createEventSound({itemNo(), sou});
}
else
{
if(m_csb.back() != csb)
{
m_csb.push_back(csb);
//ToDo:语音提示
addFlag = true;
std::string sou;
switch(csb)
{
case CsbType::ZQ: sou = sound::sub3_401001; break;
case CsbType::ZH: sou = sound::sub3_401002; break;
case CsbType::YH: sou = sound::sub3_401003; break;
case CsbType::YQ: sou = sound::sub3_401004; break;
default: break;
}
//ToDo:语音提示,
m_car->createEventSound({itemNo(), sou});
}
}
if(addFlag == true)
{
const std::string& ksdd = TableSysSet->get211();
if(ksdd == siteof::scnckm3)
{
const TSensorInfo& sor = m_car->historySensor(0);
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
if((sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES) ||
(sor.ssc == SNOT && sor1.ssc == SNOT && sor2.ssc == SNOT))
{
JUDGE_MARK_SUB3(20, "82", true);
}
}
if(ksdd == siteof::ynzt)
{
const TSensorInfo& sor = m_car->historySensor(0);
const TSensorInfo& sor1 = m_car->historySensor(1);
const TSensorInfo& sor2 = m_car->historySensor(2);
if(sor.mkg == SYES && sor1.mkg == SYES && sor2.mkg == SYES)
{
JUDGE_MARK_SUB3(2, "02", true); //20, "90"
}
}
}
}
void Sub3Judge01Sczb::judge_csb()
{
//if(m_csb.empty()) return;
int PosI = m_csb.size() - 1;
//1、特殊地点版本
const std::string& ksdd = TableSysSet->get211();
if(ksdd == siteof::shanghaikm3)
{
if(m_csb.size() == 0)
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
}
else
{
if(m_itemv.radarCount == 2)
{
if(m_csb.size() < 2)
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
else
{
if(m_csb[PosI] == CsbType::ZQ && m_csb[PosI-1] == CsbType::YH)
{
//正确操作
}
else
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
}
}
else if(m_itemv.radarCount == 3)
{
if(m_csb.size() < 3)
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
else
{
if(m_csb[PosI] == CsbType::ZQ && m_csb[PosI-1] == CsbType::YQ && m_csb[PosI-2] == CsbType::YH)
{
//正确操作1
}
else if(m_csb[PosI] == CsbType::ZQ && m_csb[PosI-1] == CsbType::YH && m_csb[PosI-2] == CsbType::ZH)
{
//正确操作2
}
else
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
}
}
else if(m_itemv.radarCount == 4)
{
if(m_csb.size() < 4)
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
else
{
if(m_csb[PosI] == CsbType::ZQ && m_csb[PosI-1] == CsbType::YQ && m_csb[PosI-2] == CsbType::YH && m_csb[PosI-3] == CsbType::ZH)
{
//正确操作
}
else
{
//未逆时针绕车一周
JUDGE_MARK_SUB3(1, "01", true);
}
}
}
}
}