Merge pull request 'feat_surenjun' (#54) from feat_surenjun into main

Reviewed-on: #54
This commit is contained in:
wangzhongjie 2024-08-12 14:37:17 +08:00
commit 1dd23b9768
53 changed files with 1092 additions and 572 deletions

View File

@ -107,6 +107,7 @@
*** JUDGE_USE_MEMORY //是否启用内存操作检查
*** JUDGE_USE_POOL //是否启用内存池调试信息
*** JUDGE_USE_ASSERT //是否启用断言提示
*** JUDGE_USE_NICE //是否启用调试测试代码
*** JUDGE_USE_PERF //是否启用CPU性能分析
*** JUDGE_USE_LEAK //是否启用内存泄露检测
*** JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作
@ -119,20 +120,26 @@
#define JUDGE_USE_LOG
/*
*
* APP侧传入参数严格检查
*/
#if defined(JUDGE_OS_OHOS) || defined(JUDGE_OS_ANDROID) || defined(JUDGE_DEBUG__)
#define JUDGE_USE_STRICT //是否启用外壳APP侧传入参数严格检查
#define JUDGE_USE_STRICT
#endif
#define JUDGE_USE_CODE //是否启用系统在返回错误码的时候输出日志
/*
*
*/
#define JUDGE_USE_CODE
/*
*
*
*
*/
#if 0
#define JUDGE_USE_COST //是否启用函数执行耗时检测
#define JUDGE_USE_MEMORY //是否启用内存操作检查
#define JUDGE_USE_POOL //是否启用内存池调试信息
#define JUDGE_USE_COST
#define JUDGE_USE_MEMORY
#define JUDGE_USE_POOL
#endif
/*
@ -143,6 +150,11 @@
#define JUDGE_USE_ASSERT //是否启用断言提示
#endif
/*
*
*/
#define JUDGE_USE_NICE
/*
* CPU性能分析和内存泄露检测
* linux系统并且在编译测试工程时前提下条件下才能开启
@ -159,6 +171,7 @@
//#define JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作
#endif
/*
*
* :
@ -189,12 +202,14 @@
* 7.ret2000
*
*
*
*/
//#define JUDGE_USE_INSPECT
//#define JUDGE_USE_INSPECT
//********************************以上是预编译定义***************************************
/*
*
*

View File

@ -18,18 +18,19 @@ public:
bool load(const TMap_Point_Items& mapPointItem);
void unload();
const TMap_Point_Item* findMapPointItem(int ptNo) const
const std::vector<const TMap_Point_Item*> findMapPointItem(int ptNo) const
{
std::vector<const TMap_Point_Item*> items;
int ssize = size();
for(int i = 0 ; i < ssize; i++)
{
const TMap_Point_Item* mapPointItem = getMapPointItem(i);
if(mapPointItem && mapPointItem->point_no == ptNo)
{
return mapPointItem;
items.push_back(mapPointItem);
}
}
return nullptr;
return items;
}
const TMap_Point_Item* getMapPointItem(int idx) const { TASSERT_NULL(idx >= 0 && idx < size(), ""); return &m_mapPointItem[idx]; }
const TMap_Point_Items& getMapPointItems() const noexcept { return m_mapPointItem; }

View File

@ -3,6 +3,11 @@
*
* :
* : 2024-01-03
*
******************************************************************************
* 1systemparm表: NO1=1TXT3=1NO2是项目代码
*
*
*/
#ifndef SYSPARMTABLE_H

View File

@ -147,7 +147,7 @@ class JUDGE_API SysSetTable : public IDBTable
SYSSET_DECLARE(19, type_array, ":"); //夜间考试考试时间
SYSSET_DECLARE(211); //考试地点参数
SYSSET_DECLARE(301, type_array2, "^", ","); //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ //示例:4,35,3,0,1,^5,50,3,0,1,^
SYSSET_DECLARE(301, type_array, "^"); //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ //示例:4,35,3,0,1,^5,50,3,0,1,^
SYSSET_DECLARE(303); //行驶距离限制(米) //3000
SYSSET_DECLARE(306); //直行键(0-直行,1-加速行驶) //1
SYSSET_DECLARE(307); //只考一次的项目 //5,15,16

View File

@ -59,6 +59,7 @@ ErrorCode ExamCarSub2::examGoonExam()
{
if(m_stuInfo.ddxk)
{
m_disForward = m_stuInfo.yklc;
for(size_t i = 0; i < m_stuInfo.ykxm.size(); i++)
{
int itemNo = m_stuInfo.ykxm[i];
@ -365,7 +366,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem()
//必须是前进状态进项目
if(historyMoveState() != moveForward)
{
logdebug("not moveForward move=%d", m_cg->move);
//logdebug("not moveForward move=%d", m_cg->move);
return nullptr;
}
for(auto k = m_itemsAll.begin(); k != m_itemsAll.end(); k++)
@ -389,7 +390,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem()
if(examItem->isFlagEnd())
{
//已经考过,略过
logdebug("exam already itemNo=%d.", itemEnter->itemNo());
//logdebug("exam already itemNo=%d.", itemEnter->itemNo());
continue;
}
#endif

File diff suppressed because it is too large Load Diff

View File

@ -49,6 +49,9 @@ public: //for IExamCarSub3 override
virtual bool isExamAlready(ExamItemCode ItemNo) const override { return m_ctl.PassedItem.find(ItemNo) != m_ctl.PassedItem.end();};
virtual bool isMileage() const override;
virtual TCar* getTCar() override { return &m_car; }
virtual TTestCtl* getTTestCtl() override { return &m_ctl; }
@ -73,6 +76,14 @@ public: //for IExamCarSub3 override
virtual bool getyjdg_road_code_kf() const override { return m_pub.yjdg_road_code_kf; }
protected:
void dealOffset(); //行驶距离补偿
void dealItemNoIDEndItem();
void dealItemNoIDEnd14Jjdw();
//行驶方向1正向行驶-1逆向行驶
DriveDirType driveDirection(const TModelLine* lane);
bool Init_KM3_Global(std::string& sError);
void UpdateCarParmWithSystemParm();
bool Init_KM3_Special();
@ -160,6 +171,7 @@ private:
int E_1Deg2Cm = 0; //经度1度=多少厘米
const int N_1Deg2Cm = 11110792; //北纬1度X cm
bool m_disOffset = false;
//TCarStatus m_carStatus;
//int64 m_ContinuedStartTime = 0; //续考的上次开始考试时间 20150205

View File

@ -175,6 +175,15 @@ bool ExamSensor::convertDatas(TChuanGan* cg)
TGpsInfo& gps = cg->real.gps;
gps.errorFlag = true;
//测试是否逆向行驶
//static int s_count = 0;
//int ny = s_count++ % 10;
//if(ny < 5)
//{
// gps.hxj += 180.0;
//}
//航向角(默认是按诺瓦泰的数据格式定义的所以要加上180度) 1:天宝(北云)/C1 2:诺瓦泰
if(gps.bklx == boardTypeTB)
{
@ -290,15 +299,16 @@ bool ExamSensor::calcCarBody(TChuanGan* cg)
int x = 0, y = 0;
GpsMath::calcEastAndNorthDistanceCM(m_basePoint, ps[II(33)], m_basePoint.gc, x, y);
if(cg->real.gps.rtkEnabled)
TGpsInfo& gps = cg->real.gps;
if(gps.rtkEnabled && gps.jd > 1 && gps.wd > 1)
{
cg->real.gps.ai_gps = Pointi(x, y);
gps.ai_gps = Pointi(x, y);
}
else
{
if(m_car->historyCount() > 0)
{
cg->real.gps.ai_gps = m_car->historyAiGps(); //20240702 yhy
gps.ai_gps = m_car->historyAiGps(); //20240702 yhy
//return false; //这里不能返回false 第一帧数据就是非差分状态?如果做模拟灯光的时候一直没差分进不了项目了
}
}

View File

@ -45,7 +45,8 @@ int ExamService::examJudgeInit(const char* data, int len)
//logdebug("MemorySpace [spaceTotal=%lld MB] [spaceFree=%lld MB], [spaceAvailable=%lld MB], [spaceSelf=%lld MB]",
// space.spaceTotal, space.spaceFree, space.spaceAvailable, space.spaceSelf);
logdebug("call examJudgeInit.");
//logdebug("call examJudgeInit.");
logtrace("exam-init version=%s.", JUDGE_VERSION_INFO);
if(m_init)
{
//已经初始化过了,不能重复初始化
@ -105,7 +106,7 @@ int ExamService::examJudgeInit(const char* data, int len)
return QE(code);
}
m_init = true;
loginfo("exam-init success version=%s.", JUDGE_VERSION_INFO);
logtrace("exam-init success kchp=%s,kchm=%d,kscx=%s.", m_initInfo->kchp.c_str(), m_initInfo->kchm, m_initInfo->kscx.c_str());
return QE(codeSuccess);
}

View File

@ -43,6 +43,7 @@ int IExamCar::examJudgeBeginExam(const char* data, int len)
{
HELP_COST_TIME("");
IAutoLock(m_mtx);
logtrace("begin-exam version=%s", JUDGE_VERSION_INFO);
if(m_examState != examStateEnd)
{
logerror("error begin exam not end.");
@ -489,17 +490,17 @@ void IExamCar::doExamDatagram(Package* pkg)
}
void IExamCar::calcDistance()
int IExamCar::calcDistance()
{
if(m_history->size() <= 1)
{
return;
return 0;
}
const Pointi& h = historyAiGps(1);
const Pointi& c = historyAiGps();
if( (c.x == 0 && c.y == 0) || (h.x == 0 && h.y == 0) )
{
return;
return 0;
}
double x = h.x - c.x;
double y = h.y - c.y;
@ -517,11 +518,12 @@ void IExamCar::calcDistance()
if(m_cg->move == moveForward)
{
int gear = m_cg->real.sensor.dw;
int gear = m_cg->real.sensor.dw; //只有科三用到
m_disGears[gear] += a;
}
//logdebug("move=%d,dis=%dCM", state, a);
return a;
}
int64 IExamCar::GetCurrentTime2() const

View File

@ -127,7 +127,7 @@ public:
//执行处理每一帧的GPS传感数据
virtual void doExamDatagram(Package* pkg);
//前进 后退 距离计算
virtual void calcDistance();
virtual int calcDistance();
//当前系统时间回放取的事GPS时间
virtual int64 GetCurrentTime2() const;
@ -219,6 +219,8 @@ public:
virtual bool itemsSomeExaming2(ExamItemCode itemno) const = 0;
//是否已考
virtual bool isExamAlready(ExamItemCode ItemNo) const = 0;
//里程是否满足
virtual bool isMileage() const = 0;
//获取TCar

View File

@ -70,7 +70,7 @@ private:
const int m_channel = 4;
const unsigned char m_default = 255; //默认底色 白色
bool m_showVersion = true;
bool m_showTime = false;
bool m_showTime = true;
};

View File

@ -373,6 +373,8 @@ struct TSub3Item08Gjzt //公交站台 8
bool Must_JianSu_Flag = false; //必须减速标志
bool EndXMJL_Flag = false; //结束项目距离标志
int WavKind = 0; //SysSet[512]-->3 学校、公交、人行横道模拟项目是否语音标识0不需要 1需要 2024-03-18 yhy 增加
int s509_10 = 0;
#ifdef JUDGE_USE_INSPECT
bool inspectJSC = false; //完成脚刹车动作
#endif

View File

@ -33,6 +33,40 @@ void Sub2Judge00Dcrk::dealDrawItem()
drawGpsSign(m_model->F8(), "F8", false);
drawGpsSign(m_model->F9(), "F9", false);
#ifdef JUDGE_USE_NICE
if(pureCarPointInItemArea(II(33)))
{
TChuanGan* cg = m_car->historyChuanGan();
nice(cg->body.b1_a, cg->body.b2_a, RGB_RED);
nice(cg->body.points_a[II(8)], cg->body.points_a[II(18)], RGB_RED);
TGPSPoint z1 = GpsMath::GetChuiZhu(cg->body.b1_a, cg->body.points_a[II(6)], cg->body.points_a[II(8)]);
nice(cg->body.b1_a, z1, RGB_PURPLE);
TGPSPoint z2 = GpsMath::GetChuiZhu(cg->body.points_a[II(25)], m_model->P3(),m_model->P4());
nice(cg->body.points_a[II(25)], z2, RGB_RED);
TGPSPoint z3 = GpsMath::GetChuiZhu(cg->body.points_a[II(27)], m_model->P3(),m_model->P4());
nice(cg->body.points_a[II(27)], z3, RGB_RED);
nice(cg->body.points_a[II(1)], cg->body.points_a[II(13)], RGB_GREEN);
TGPSPoint z4 = GpsMath::GetChuiZhu(cg->body.points_a[II(13)], m_model->P4(), m_model->P5());
nice(cg->body.points_a[II(13)], z4, RGB_RED);
}
#endif
}
void Sub2Judge00Dcrk::nice(const TGPSPoint& p1, const TGPSPoint& p2, const RgbColor& color)
{
int cm = GpsMath::calcGpsDistanceCM(p1,p2);
TGPSPoint c = GpsMath::calcCenterPoint(p1,p2);
char buf[32] = {0};
SafeSprintf(buf, sizeof(buf), "%dcm", cm);
drawGpsLine(p1, p2, false, color, 16);
drawGpsText(c, buf, color, 16);
}
void Sub2Judge00Dcrk::dealJudgeItem()

View File

@ -38,6 +38,8 @@ private:
//判断考试用时是否超时
bool examTimeout();
void nice(const TGPSPoint& p1, const TGPSPoint& p2, const RgbColor& color);
private:
enum{L1=1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11};
int64 m_dcrkTime = 0; //开始时间(从倒库开始计时)

View File

@ -38,7 +38,7 @@ bool Sub3Judge01Sczb::dealJudgeEnter()
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, "^");
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;
@ -495,6 +495,18 @@ void Sub3Judge01Sczb::AddCSBData(CsbType csb)
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
{

View File

@ -20,7 +20,7 @@ bool Sub3Judge02Qbxx::dealJudgeEnter()
//10s内未起步只评判第一次^第一次起步以打左方向灯开始计时^
const std::vector<std::string>& s502 = TableSysSet->asArray502();
std::string str = s502.size() > 7 ? s502[7] : "";
const std::vector<std::string>& ss = Tools::split(str, "^");
const std::vector<std::string> ss = Tools::split(str, "^");
m_itemv.sys502_8_1 = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0;
m_itemv.sys502_8_2 = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 0; //StrToIntDef(GetDotStr(2, tempstr + '^', '^'), 0);
@ -219,10 +219,10 @@ void Sub3Judge02Qbxx::nogo_timeout()
{
const TSensorInfo& sor2 = m_car->historySensor(2);
if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9) ||
if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9 && sor.dw != 10) ||
(sor.ssc == SNOT && sor1.ssc == SYES))
{
if(sor.dw >= 1 && sor.dw != 9 && sor.ssc == SNOT)
if(sor.dw >= 1 && sor.dw != 9 && sor.dw != 10 && sor.ssc == SNOT)
{
m_itemv.ZhunBeiQiBuTK = cg->tkCnt;
}

View File

@ -390,10 +390,10 @@ void Sub3Judge03Zxxs::dealJudgeItem()
}
char buf[256] = {0};
SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d,项目距离=%d,已行驶=%d角度变化=%0.2f"),
SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d-%d,项目距离=%d,已行驶=%d角度变化=%0.2f"),
m_itemv.Kind == 0 ? "右边线" : "左边线",
Temp_Gps_Itemno1,
m_itemv.Init_D,m_itemv.parm_hcjl,
m_itemv.Init_D,m_itemv.parm_hcjl,m_itemv.Gps_Offset,
(int)std::abs(m_itemv.Kind == 0 ? RightJL0 - m_itemv.Init_D : LeftJL0 - m_itemv.Init_D),
m_itemv.parm_xmjl,cg->ai_ljjl - m_itemv.Init_LJJL,Jdbh
);

View File

@ -37,13 +37,15 @@ bool Sub3Judge08Gjzt::dealJudgeEnter()
{
m_itemv.Temp_XS = 30;
}
//是否评判脚刹车
//是否评判脚刹车 1速度+刹车同时满足 其他只判刹车
m_itemv.Judge_JSC = s509.size() > 5 && s509[5] != "" ? std::atoi(s509[5].c_str()) == 1 : false;
//是否必须减速
m_itemv.Must_JianSu_Flag = s509.size() > 7 && s509[7] != "" ? std::atoi(s509[7].c_str()) == 1 : false;
//默认:需要评判减速相关的
m_itemv.JudgeKind = 1;
m_itemv.s509_10 = s509.size() > 9 && s509[9] != "" ? std::atoi(s509[9].c_str()) : 0;
if(ksdd == siteof::nj || ksdd == siteof::njdckm3)
{
//ToDo:语音播报-->通过公交站台
@ -118,7 +120,7 @@ void Sub3Judge08Gjzt::dealJudgeItem()
//SysSet[342]:车上是否能进行人工操作(0-能扣分和进项目 1-不能人工评判 2-可以人工评判 3-都不能)
//如果是人工扣分或者人工评判的,自动评判就不触发 需要评判减速相关的
const std::string& s342 = TableSysSet->get342();
if(s342 == "0" || s342 == "2")
if(s342 == "0" || s342 == "2" || m_itemv.s509_10 == 1)
{
m_itemv.JudgeKind = 0; //科研所规定公交站台当前车辆的车道号在3车道及以上的不需要评判减速相关的
}
@ -209,9 +211,11 @@ void Sub3Judge08Gjzt::dealJudgeItem()
JUDGE_MARK_SUB3(8, "03", true);
}
TTestCtl* ctl = m_car->getTTestCtl();
//新的减速规则
if(ctl->JianSuLeiXing == 2)
{
//500-13为2按科研所规则判断是否减速
if(m_itemv.JudgeKind == 1) //需要评判减速相关的
{
#ifdef JUDGE_USE_INSPECT
@ -251,6 +255,7 @@ void Sub3Judge08Gjzt::dealJudgeItem()
{
if(m_itemv.Judge_JSC == true)
{
// 509-6为1同时满足刹车和速度小于阈值509-5
if(m_itemv.Finish_JSC == false || m_itemv.Finish_JianSu == false)
{
JUDGE_MARK_SUB3(8, "02", false);
@ -258,9 +263,21 @@ void Sub3Judge08Gjzt::dealJudgeItem()
}
else
{
if(m_itemv.Finish_JianSu == false)
if(ctl->JianSuLeiXing == 1)
{
JUDGE_MARK_SUB3(8, "02", false);
//500-13为1刹车和速度小于阈值满足其中一个就不扣分
if(m_itemv.Finish_JSC == false && m_itemv.Finish_JianSu == false)
{
JUDGE_MARK_SUB3(8, "02", false);
}
}
else
{
//5、无上述参数只判断刹车
if(m_itemv.Finish_JSC == false)
{
JUDGE_MARK_SUB3(8, "02", false);
}
}
}
}

View File

@ -68,6 +68,13 @@
*
* 1840
*
*
* 1509-81 and 2and 34202509-101
* 2500-132
* 3509-61509-5
* 4500-131
* 5
*
*/
#ifndef SUB3JUDGE08GJZT_H

View File

@ -375,7 +375,7 @@ void Sub3Judge10Ccxx::dealJudgeItem()
m_car->setChaoChe_Start_TM(0);
//ToDo:语音播报:取消变更车道或者取消超车
m_car->createEventCancelItem({m_exam->ItemNo, ""});
m_car->createEventSound({itemNo(), sound::sub3_414004});
//m_car->createEventSound({itemNo(), sound::sub3_414004});
return;
}
}
@ -396,7 +396,7 @@ void Sub3Judge10Ccxx::dealJudgeItem()
m_car->setChaoChe_Start_TM(0);
//ToDo:语音播报:取消变更车道或者取消超车
m_car->createEventCancelItem({m_exam->ItemNo, ""});
m_car->createEventSound({itemNo(), sound::sub3_414004});
//m_car->createEventSound({itemNo(), sound::sub3_414004});
}
else
{

View File

@ -712,8 +712,8 @@ void Sub3Judge11Kbtc::DoStatus_3()
//特殊地点业务翻译
TTestCtl* ctl = m_car->getTTestCtl();
const std::vector<std::vector<std::string>>& s301 = TableSysSet->asArray2_301();
const std::vector<std::string>& s301_1 = s301.size() > 0 ? s301[0] : std::vector<std::string>();
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>();
const std::string s301_1_3 = s301_1.size() > 3 && s301_1[3] != "" ? s301_1[3] : "";
if(!ctl->Dw_Cs_Ok1 && s301_1_3 != "0" && ctl->dw_kf_sj == 0 && ksdd == siteof::zjwz)
{
@ -1295,24 +1295,24 @@ void Sub3Judge11Kbtc::Judge_KBTC_YaXian()
const std::string& s411 = TableSysSet->get411();
if(s411 != "1")
{
RightJL0_RF = RTKKM3_0.Body_RF_ToRightEdge;
RightJL1_RF = RTKKM3_1.Body_RF_ToRightEdge;
RightJL2_RF = RTKKM3_2.Body_RF_ToRightEdge;
RightJL0_RF = RTKKM3_0.Body_RF_ToBaseLine;
RightJL1_RF = RTKKM3_1.Body_RF_ToBaseLine;
RightJL2_RF = RTKKM3_2.Body_RF_ToBaseLine;
RightJL0_RB = RTKKM3_0.Body_RB_ToRightEdge;
RightJL1_RB = RTKKM3_1.Body_RB_ToRightEdge;
RightJL2_RB = RTKKM3_2.Body_RB_ToRightEdge;
RightJL0_RB = RTKKM3_0.Body_RB_ToBaseLine;
RightJL1_RB = RTKKM3_1.Body_RB_ToBaseLine;
RightJL2_RB = RTKKM3_2.Body_RB_ToBaseLine;
}
else
{
RightJL0_RF = RTKKM3_0.Wheel_RF_ToRightEdge;
RightJL1_RF = RTKKM3_1.Wheel_RF_ToRightEdge;
RightJL2_RF = RTKKM3_2.Wheel_RF_ToRightEdge;
RightJL0_RF = RTKKM3_0.Wheel_RF_ToBaseLine;
RightJL1_RF = RTKKM3_1.Wheel_RF_ToBaseLine;
RightJL2_RF = RTKKM3_2.Wheel_RF_ToBaseLine;
RightJL0_RB = RTKKM3_0.Wheel_RB_ToRightEdge;
RightJL1_RB = RTKKM3_1.Wheel_RB_ToRightEdge;
RightJL2_RB = RTKKM3_2.Wheel_RB_ToRightEdge;
RightJL0_RB = RTKKM3_0.Wheel_RB_ToBaseLine;
RightJL1_RB = RTKKM3_1.Wheel_RB_ToBaseLine;
RightJL2_RB = RTKKM3_2.Wheel_RB_ToBaseLine;
}
//ZXD_JL0 := (RightJL0_RF + RightJL0_RB) div 2;

View File

@ -256,7 +256,7 @@ void Sub3Judge14Jjdw::CSH_Itmv14()
std::string str2 = Str.size() > 1 ? Str[1] : ""; //GetDotStr(2, Str + ':', ':');
int dw = std::atoi(str1.c_str());
const std::vector<std::string>& stmp = Tools::split(str2, "-");
const std::vector<std::string> stmp = Tools::split(str2, "-");
m_itemv.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
m_itemv.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0;
}

View File

@ -159,22 +159,21 @@ void Sub3Judge20Comm::Init_ZongHe()
//自动靠边停车参数
//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.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;
@ -213,7 +212,7 @@ void Sub3Judge20Comm::Init_ZongHe()
if(str2 == "") continue;
int dw = std::atoi(str1.c_str());
const std::vector<std::string>& stmp = Tools::split(str2, "-");
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;
}
@ -243,7 +242,7 @@ void Sub3Judge20Comm::Init_ZongHe()
//评判半联动用的比如前进状态下离合器连续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, "^");
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;
//离合器距离
@ -260,14 +259,14 @@ void Sub3Judge20Comm::Init_ZongHe()
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, "^");
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, "^");
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;
@ -341,8 +340,8 @@ void Sub3Judge20Comm::Init_ZongHe()
//条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^
//条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^
const std::vector<std::vector<std::string>>& s301 = TableSysSet->asArray2_301();
const std::vector<std::string>& s301_1 = s301.size() > 0 ? s301[0] : std::vector<std::string>();
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;
@ -358,7 +357,7 @@ void Sub3Judge20Comm::Init_ZongHe()
m_itemvCJH.dw_cs_sl1 = 0;
}
const std::vector<std::string>& s301_2 = s301.size() > 1 ? s301[1] : std::vector<std::string>();
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;
@ -375,9 +374,9 @@ void Sub3Judge20Comm::Init_ZongHe()
m_itemvCJH.dw_cs_sl2 = 0;
}
std::vector<std::string> s301_3 = s301.size() > 2 ? s301[2] : std::vector<std::string>();
std::string s301_3 = s301.size() > 2 ? s301[2] : "";
//301评判时间0-结束考试时评判1-里程达标就评判 100-表示已评判过 20140630 //yhyflag
ctl->dw_kf_sj = s301_3.size() > 0 && s301_3[0] != "" ? std::atoi(s301_3[0].c_str()) : 1; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
ctl->dw_kf_sj = s301_3 != "" ? std::atoi(s301_3.c_str()) : 0; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
//SysSet[530]:环境感知相关参数(原封不动翻译即可,前期用不到,赞不考虑)
const std::vector<std::string>& s530 = TableSysSet->asArray530();
@ -385,7 +384,7 @@ void Sub3Judge20Comm::Init_ZongHe()
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, ",");
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;
@ -567,7 +566,7 @@ void Sub3Judge20Comm::Init_ZongHe()
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, "-");
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;
}
@ -756,10 +755,15 @@ void Sub3Judge20Comm::CallMoNiDengGuang()
return; //屏蔽模拟灯光
#endif
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg)
const std::string& s386 = TableSysSet->get386();
//模拟灯光参数386=0,开始考试后,就触发模拟灯光
if(s386 != "0")
{
return;
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg)
{
return;
}
}
TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg);
@ -782,7 +786,6 @@ void Sub3Judge20Comm::CallMoNiDengGuang()
const TSensorInfo& sor3 = his3->real.sensor;
const std::string& ksdd = TableSysSet->get211();
const std::string& s386 = TableSysSet->get386();
const std::string& s322 = TableSysSet->get322();
TCar* tcar = m_car->getTCar();
@ -2464,7 +2467,7 @@ void Sub3Judge20Comm::Judge_LianXuBianDao()
//获取连续变道超车参数
std::string Temp = s512.size() > 1 && s512[1] != "" ? s512[1] : "";
const std::vector<std::string>& ss = Tools::split(Temp, "^");
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;
@ -3437,9 +3440,9 @@ void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2()
else
{
//标准 20180416
if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 &&
if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 &&
RTKKM3.FrontPointLaneNo != RTKKM3_1.FrontPointLaneNo &&
RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6 )
RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6)
{
//变道判方向灯
Tag = 0;
@ -4354,9 +4357,16 @@ void Sub3Judge20Comm::Judge_DW_KongDang()
//启动发动机时,挡位未至于空挡(驻车挡)
if(sor.dh2 == SYES && sor1.dh2 == SNOT && sor2.dh2 == SNOT)
{
if(sor.dw_plc != 0) //(sor.dw != 0) //用原始档位无锡所
if(sor.dw_plc != 0 && sor.dw_plc != 10) //C2自动挡10档是驻车档P档0档是空挡 //(sor.dw != 0) //用原始档位无锡所
{
JUDGE_MARK_SUB3(2, "04", false);
if(m_car->itemsSomeExaming2(Sub3ItemType02Qbxx))
{
JUDGE_MARK_SUB3(2, "04", false); //如果起步项目正在考就扣这个分
}
else
{
JUDGE_MARK_SUB3(20, "05", false);
}
}
}
}
@ -4602,8 +4612,11 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
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(sor.lhq == SYES || Tools::less(std::round(gps.sd), 5) ||
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)))
@ -4799,7 +4812,27 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
//24、全程次高挡评判
void Sub3Judge20Comm::Judge_CiGaoDang()
{
if(m_car->allItemFinish() && m_car->isQualified()) //全程次高挡评判 KM3AllPass()
//按照军华说的 在行驶距离达到的实际判断全程次高档 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
{
TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item && item->TestPro == ItemProFlagInit)
{
timing = true;
}
}
if(timing)
{
if(m_itemvXLG.CGD_Nums == 0)
{
@ -4815,79 +4848,43 @@ void Sub3Judge20Comm::Judge_CiGaoDang()
//25、自动靠边停车重点
void Sub3Judge20Comm::Call_Auto_KBTC()
{
//SysSet[319]:里程不够不报靠边停车0-否 1-是 2-必考项目完成,并且里程满足要求)
//SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
const std::string& s319 = TableSysSet->get319();
TCar* tcar = m_car->getTCar();
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
//自动靠边停车
if(s319 == "1" && m_car->getKsLjLc() < tcar->XSJL)
if(s319 == "1")
{
return;
if(!m_car->isMileage()) return;
}
if(s319 == "2")
{
if(m_car->getKsLjLc() < tcar->XSJL) return;
bool ErrorFlag = false;
for(auto it = all.begin(); it != all.end(); it++)
if(!m_car->isMileage()) return;
//自动靠边停车计算
//自动靠边停车
if(m_itemvCJH.bZdKbTc)
{
TKM3Item* item = it->second->getExamItem();
if(item->NoID == true)
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
//必考项目未完成
for(auto it = all.begin(); it != all.end(); it++)
{
if(item->FinishFlag == false)
TKM3Item* item = it->second->getExamItem();
if(item->ItemNo == Sub3ItemType11Kbtc)
{
m_car->KM3EndItem(item->ItemNo);
ErrorFlag = true;
if(item->Item_Color != itemStateWk)
{
return;
}
}
else
{
if(item->NoID == false && (item->Item_Color == itemStateWk || item->Item_Color == itemStateZk))
{
return;
}
}
}
}
if(ErrorFlag == true)
{
return;
}
for(auto it = all.begin(); it != all.end(); it++)
{
TKM3Item* item = it->second->getExamItem();
if(item->ItemNo == Sub3ItemType11Kbtc) continue;
if(item->FinishFlag == false)
{
return;
}
}
}
//自动靠边停车计算
//自动靠边停车
if(m_itemvCJH.bZdKbTc)
{
//必考项目未完成
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;
}
}
}
//SysSet[319]:里程不够不报靠边停车0-否 1-是 2-必考项目完成,并且里程满足要求)
//SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
const std::string& s319 = TableSysSet->get319();
const std::string& ksdd = TableSysSet->get211();
if(s319 == "2")
{
const TChuanGan* cg = m_car->historyChuanGan();
if(m_itemvCJH.KbTcJl == -1)
{
m_itemvCJH.KbTcJl = cg->ai_ljjl;
@ -4895,6 +4892,7 @@ void Sub3Judge20Comm::Call_Auto_KBTC()
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)
@ -4952,6 +4950,7 @@ void Sub3Judge20Comm::Judge_Extra()
//m_car->createEventEnterItem({item13->ItemNo, ""});
}
/*
//自动触发加减挡位
bool FindSCZB = false;
bool FindMNDG = false;
@ -4990,21 +4989,18 @@ void Sub3Judge20Comm::Judge_Extra()
if((SCZBFinishFlag == true || FindSCZB == false) && (MNDGFinishFlag == true || FindMNDG == false))
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw);
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //20240731
if(item14 && item14->NoID == true) //免考加减挡的
{
if(item14->Item_Color == itemStateWk)
{
//ToDo1:生成 全程加减挡 进项目事件
//item14->Item_Color = itemStateZk;
//item14->TestPro = ItemProFlagInit;
//item14->FinishFlag = false;
m_car->createEventEnterItem({item14->ItemNo, ""});
m_car->KM3EndItem(item14->ItemNo);
}
}
}
*/
m_DiaoTou_ID = 0;
std::string CurrentRoadData = cg->MapPoint_Road_Code;

View File

@ -566,27 +566,59 @@ inline void GpsMath::getDimensionalCoordinate(const double& E1, const double& N1
///以下是科目三的函数 2024-01-12
///////////////////////////////////////////////////
/*
double GpsMath::getAngle(const Pointi& p1, const Pointi& p2)
{
double angle = 0;
//修改坐标系
if(p1.x == p2.x)
{
if(p1.y < p2.y)
{
angle = PI / 2;
}
else if(p1.y >= p2.y)
{
angle = PI * 3 / 2;
}
}
else
{
angle = std::atan2(p2.y - p1.y, p2.x - p1.x);
}
if(angle < 0)
{
angle = angle + 2 * PI;
}
angle = angle / PI * 180;
return angle;
}
*/
//1、获得点1指向点2的角度0-360度,该角度是X轴正方向顺时针旋转到有向线段由点1指向点2所确定的角度,例如:正东=0度正北=270
double GpsMath::GetAngle_HQ(const Pointi& p1, const Pointi& p2, int MinusY)
{
int result = 0;
double angle = 0;
if(p1.x == p2.x)
{
if(p1.y * MinusY < p2.y * MinusY)
result = PI * 3 / 2;
angle = PI * 3 / 2;
else if (p1.y * MinusY > p2.y * MinusY)
result = PI / 2;
angle = PI / 2;
else
result = 0;
angle = 0;
}
else
result = std::atan2(p1.y * MinusY - p2.y * MinusY, p2.x - p1.x); //???yhyflag
{
angle = std::atan2(p1.y * MinusY - p2.y * MinusY, p2.x - p1.x);
}
if(result < 0)
result = result + 2 * PI;
if(angle < 0)
angle = angle + 2 * PI;
result = result / PI * 180;
return result;
angle = angle / PI * 180;
return angle;
}

View File

@ -137,7 +137,10 @@ private:
public: //科目三
//计算角度 逆时针
//static double getAngle(const Pointi& point1, const Pointi& point2);
//1、获得点1指向点2的角度0-360度,该角度是X轴正方向顺时针旋转到有向线段由点1指向点2所确定的角度,例如:正东=0度正北=270
//MinusY= 1顺时针, -1逆时针
static double GetAngle_HQ(const Pointi& p1, const Pointi& p2, int MinusY = 1);
//计算两点距离
static int PointDistance(const Pointi& p1, const Pointi& p2);

View File

@ -148,6 +148,14 @@ enum PlaySoundType
PlaySoundEndNotify = 1, //1:表示是模拟灯光项目的语音语音播报结束需要调用examJudgeSoundEnd通知评判。
};
//行驶方向,***注意:枚举不能变,和外壳有对应关系
enum DriveDirType
{
DriveDirN = -1, //-1:逆向行驶
DriveDirX = 0, //0:未知
DriveDirY = 1, //1:正向行驶
};
//Tag1=0-无标线
//Tag1=1-中心线(黄色实线)

View File

@ -334,7 +334,7 @@ struct TStuInfo
int64 ddkssj = 0; //考试中断那次考试开始考试时间 1970年到现在的毫秒数
std::vector<int32> ykxm = {}; //已考项目 "1,3" 对应枚举 ExamItemCode DuanDian_FinishItems
std::vector<TKfXm> kfxm = {}; //扣分项目 "20,01;" 对应枚举 ExamItemCode DuanDian_Marks
int32 yklc = 0; //已考里程,单位
int32 yklc = 0; //已考里程,单位
int8 sczb = 0; //CS_Finish_SCZB_Flag:Boolan; //yhy22 初始完成上车准备标志外壳传递的Boolan
std::vector<TKfXm> sczbkf = {}; //SCZBKouFenData:String[200]; //格式: ItemNo,MarkSerial; ItemNo,MarkSerial;
@ -850,15 +850,14 @@ struct TRTKResult
int CrossPointNo = 0; //穿越点
//20240730 新增 还没计算
int TouchLineDirCS = 0; //车身碰线 车身碰线方向
//20240801 新增 还没计算
int TouchLineDirCS = TouchDir0; //车身碰线 车身碰线方向
int BackPointLaneNo = 0; //后点车道 后点所在车道号
int BackPointLaneCount = 0; //后点车道 后点天线共有几股车道
int Body_RF_ToBaseLine = 0; //右前车身边线 指车身离右侧路边缘线距离
int Body_RB_ToBaseLine = 0; //右后车身边线 指车身离右侧路边缘线距离
int DirInverse = 0; //车道属性 是否逆向行驶
int DirInverse = 0; //车道属性 是否逆向行驶 对应DriveDirType枚举
int ShapeNoWheel = 0; //形状 车轮相交的形状线号
#ifdef JUDGE_USE_INSPECT

View File

@ -16,11 +16,15 @@ export async function download() {
})
}
interface WR{
message?:string
code:number
}
// 通用监管接口
export async function writeObjectOut(params,filePath?:string): Promise<number> {
export async function writeObjectOut(params,filePath?:string): Promise<WR> {
const singlePlay = globalThis.singlePlay
if (singlePlay) {
return 1
return {code:1}
}
//获取监管接口地址路径
@ -42,6 +46,7 @@ export async function writeObjectOut(params,filePath?:string): Promise<number> {
if (globalThis.isJGNew) {
return await writeObjectOutNew(params,filePath)
}
drvexam.zp = drvexam.zp === undefined ? undefined : encodeURIComponent( drvexam.zp)
const drvexamArrs = Reflect.ownKeys(drvexam).map((key: string) => (`<${key}>${drvexam[key]}</${key}>`));
if(filePath){
@ -52,6 +57,7 @@ export async function writeObjectOut(params,filePath?:string): Promise<number> {
}));
}
console.info('surenjun','调用旧监管')
//对象转换成xml
const temp = await request({
host: globalThis.JGHOST,

View File

@ -17,7 +17,11 @@ const gjxlhObj = {
'17C56': '02-21-000014',
}
export default async function writeObjectOutNew(data,filePath): Promise<number> {
interface WR{
message?:string
code:number
}
export default async function writeObjectOutNew(data,filePath): Promise<WR> {
const fileUtil = new FileUtil(globalThis.context);
const {jkid , drvexam} = data;
const basic = await getBasicConfig(jkid);

View File

@ -39,6 +39,7 @@ export default class FileUtil{
fs.mkdirSync(path)
}
} catch (e) {
console.info('初始化文件夹失败',path)
promptAction.showToast({
message:`初始化文件夹失败`+JSON.stringify(e),
duration:4000,

View File

@ -4,8 +4,6 @@ import { testKm2Items,testKm3Items } from '../../pages/judgeSDK/dataTest/index'
import { judgeConfig } from '../../pages/judgeSDK/utils/judgeConfig';
import { setJudgeUdp, setTopLineUdp } from './GlobalUdp';
import { convertGpsCoord2 } from '../utils/tools';
import common from '@ohos.app.ability.common';
export const initJudgeUdp = async () => {
globalThis.serialIndex = 0;

View File

@ -131,12 +131,14 @@ function handleCenterCode(msgXml,isNewCenter){
if(result){
const {code,message} = result
if(code != '1'){
const rMessage = decodeURIComponent(message as string)
prompt.showToast({
message, duration: 3000
message:rMessage,
duration: 3000
});
return
return {code,message}
}else{
return code
return { code }
}
}
}
@ -152,9 +154,9 @@ function handleCenterCode(msgXml,isNewCenter){
message: decodeURIComponent(message as string),
duration: 3000
});
return
return {code,message:decodeURIComponent(message)}
}else{
return code
return { code }
}
}

View File

@ -115,7 +115,6 @@ struct Index {
async initStudent() {
const students = await getSyncData('USER')
const stuInfo = students[0] || {};
console.info('surenjun stuInfo=>', JSON.stringify(stuInfo))
const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx,ksxl} = stuInfo;
this.name = xm || '测试考生';
this.idCard = sfzmhm || '01234567891010';
@ -279,8 +278,8 @@ struct Index {
abbreviation: decodeURI(systemParm.txt3),
projectCode: no2,
projectCodeCenter: txt2,
//是否是必考
isRequired: allItems.includes(no2 + ''),
//是否是必考 加减档设置成非必考
isRequired: no2== 14?false:allItems.includes(no2 + ''),
//是否考过了
isEnd: false,
//项目开始数据是否上传过
@ -300,8 +299,6 @@ struct Index {
})
})
const projects = this.projects;
console.info('surenjun',JSON.stringify(this.projectsObj))
if (!projects.length) {
Prompt.showToast({
message: '读取数据库信息失败,请重新联网更新!',
@ -465,6 +462,7 @@ struct Index {
this.examSubject = isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject;
globalThis.carInfo.examSubject = this.examSubject
this.singlePlay = beginDataObj.exam == 0;
this.carName = initDataObj.name;
globalThis.singlePlay = beginDataObj.exam == 0;
await this.initSystemParam(initDataObj.systemparm)
await this.initMarkRules(initDataObj.mark);
@ -748,7 +746,7 @@ struct Index {
}
Column() {
if (this.examSubject == 3) {
if (this.examSubject == 3 && this.judgeConfigObj['342'] == 0) {
Row() {
Row() {
}
@ -767,14 +765,7 @@ struct Index {
.backgroundImageSize({ width: '100%', height: '100%' })
.margin({ bottom: 10 })
.onClick(() => {
if (this.judgeConfigObj['342'] == 0) {
this.isDeductedPopShow = true
} else {
Prompt.showToast({
message: '平台配置不允许人工评判!',
duration: 4000
});
}
this.isDeductedPopShow = true
})
}
@ -844,7 +835,7 @@ struct Index {
}
//科目三人工扣分弹窗
if (this.isDeductedPopShow && this.examSubject == 3) {
if (this.isDeductedPopShow && this.examSubject == 3 && this.judgeConfigObj['342'] == 0) {
DeductedPopup({
defaultTabIndex: this.defaultTabIndex,
currentItems: Reflect.ownKeys(this.projectsObj).map(projectKey => {
@ -945,12 +936,11 @@ struct Index {
currentXmdm,
} = this;
const projectCode = artSubject3ProjectsCodesArr[index];
console.info('surenjun',getIsExitManualProject(index))
if(index === 5) {
console.info('surenjun 靠边停车状态=> ',getIsExitManualProject(index))
}
if (getIsExitManualProject(index)) {
// 正在进行的项目 取消项目
console.info('surenjun isManualProjectIn=>',isManualProjectIn)
console.info('surenjun projectCode=>',projectCode)
console.info('surenjun currentXmdm=>',currentXmdm)
if (isManualProjectIn && projectCode === currentXmdm) {
await this.judge.setJudgeItem(currentXmdm, 2);
Prompt.showToast({
@ -964,8 +954,15 @@ struct Index {
if (judgeConfigObj['343'] == 0) {
const xmmcStr = this.xmmcStr;
if (xmmcStr == '无' || xmmcStr == '') {
this.amplifiedImgIndex = index;
this.isAmplifyPopShow = true
//512[6] 人工项目按钮放大确认
const param512 = (judgeConfigObj['512'] || '').split(',');
if(param512[6] != 0){
this.amplifiedImgIndex = index;
this.isAmplifyPopShow = true
}else{
const judge = this.judge
await judge.setJudgeItem(projectCode, 1);
}
} else {
if (index === 5) {
Prompt.showToast({
@ -1086,6 +1083,10 @@ struct Index {
return false
}
if(projectRoads[projectCode].length == 0){
return true
}
//设置了514-519参数只能在设置的路段触发对应项目
if (projectRoads[projectCode].includes(road)) {
//如果525为1则514-519设置的路段不能触发对应项目

View File

@ -75,6 +75,7 @@ struct UserInfo {
@State FaceOpenStatue: string = '0'; //是否开启人脸识别
subscriber;
@State faceCatchImg: string = ''
@State Param803Str:string = ''
// 过程照片拍照
getPhoto = async (empty?: boolean) => {
const singlePlay = globalThis.singlePlay
@ -105,13 +106,11 @@ struct UserInfo {
new WebRTCVoice(this.context);
//初始化数据
this.initData()
//身份证读卡器初始化
// this.openDeviceByIDCard()
// 如果是单机模式则模拟假数据
//获取sysset表数据
this.initSysset()
//心跳处理
this.heartMsg()
this.isExamStart = false
@ -164,6 +163,7 @@ struct UserInfo {
return
}
this.showFaceCompare = true
this.pageIndex = Math.floor(index / 4)
}
})
@ -260,9 +260,13 @@ struct UserInfo {
//@ts-ignore
syssetParams.forEach(sys => {
//364 绕车一周评判时机(1-开始考试后判 2-开始考试前判)
if (sys.v_no === '364') {
if (sys.v_no === '364' && decodeURIComponent(sys.v_value) == '2') {
this.isBoardPrePareSetPopupOpen = true;
}
// 开始考试前必须解开安全带或关车门
if (sys.v_no === '803'){
this.Param803Str = sys.v_value+'';
}
})
}
@ -312,8 +316,8 @@ struct UserInfo {
that.studentRefreshStatue = studentRefreshParam?.[0]?.v_value || '0'
const faceParam = syssetParams.filter(sys => sys.v_no == '2413')
that.FaceOpenStatue = faceParam?.[0]?.v_value == '3' ? '1' : '0'
that.FaceOpenStatue = '0'
// that.FaceOpenStatue = '0'
that.FaceOpenStatue = '0'
console.log('that.FaceOpenStatue', that.FaceOpenStatue)
// faceParam?.[0]?.v_value ||
// 1身份证读卡器 2指纹 3人脸
this.faceFlag = faceParam?.[0]?.v_value || '0'
@ -367,6 +371,13 @@ struct UserInfo {
}
this.pageIndex--;
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
this.dataList.forEach(listData => {
for (let i in listData) {
listData[i] = decodeURI(listData[i])
}
listData.kszp = this.photo + listData.kszp
listData.ksmjzp = this.photo + listData.ksmjzp
})
}
//获取下载考生
@ -375,7 +386,7 @@ struct UserInfo {
return
}
const param = `<getExaminationStudentInfoReq><head><checkCode>${Md5.Instance.get_md5(globalThis.carInfo.carId + globalThis.carInfo.examinationRoomId + globalThis.username)}</checkCode></head><body><carId>${globalThis.carInfo.carId}</carId><examinationRoomId>${globalThis.carInfo.examinationRoomId}</examinationRoomId><examinerName>${globalThis.username}</examinerName></body></getExaminationStudentInfoReq>`
getExaminationStudentInfo(param).then(async(res) => {
getExaminationStudentInfo(param).then(async res => {
setTimeout(() => {
this.updateTimeLimit = true
}, 30000)
@ -402,15 +413,7 @@ struct UserInfo {
}
this.list = JSON.parse(JSON.stringify(dataList))
this.list.forEach(listData => {
for (let i in listData) {
listData[i] = decodeURI(listData[i])
}
listData.kszp = this.photo + listData.kszp
listData.ksmjzp = this.photo + listData.ksmjzp
})
dataList = this.list.length > 4 ? this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) : this.list;
this.dataList = dataList
if (this.dataList.length) {
this.currentUser = this.dataList[0]
@ -426,7 +429,6 @@ struct UserInfo {
getSyncData('USER').then(data=>{
if(data?.[0]){
this.getCurrentStudent(data[0].sfzmhm)
}
})
}).catch((error) => {
@ -513,10 +515,11 @@ struct UserInfo {
const avPlayer = this.avPlayer;
this.isLoadingPopupVisible = true
avPlayer.playAudio([`voice/监管通信中.mp3`],false,async ()=>{
const code = await this.beginExam();
if (code != 1) {
const temp = await this.beginExam();
console.info('surenjun',JSON.stringify(temp))
if (temp.code != 1) {
promptAction.showToast({
message:'开始考试接口调用失败!',
message:temp.message,
duration:4000
})
return
@ -541,33 +544,104 @@ struct UserInfo {
// 检测车门、熄火信号
async checkSignal(): Promise<boolean> {
const {isCheckFireOpen} = judgeConfig
const {Param803Str,isBoardPrePareSetPopupOpen} = this;
if(Param803Str === ''){
return true
}
return new Promise((resolve,reject)=>{
if(isCheckFireOpen){
resolve(true)
// return
return
}
console.info('socketTag[PLC.UdpClient]', '注册udp回调')
let plcValue = globalThis.udpClient.getCurrentMessage();
console.info('surenjun',plcValue)
const msgArr = plcValue.split(',') || ''
const mkg = msgArr[14];
const fdjzs = msgArr[25];
if(mkg == 1){
this.avPlayer.playAudio(['voice/关门.mp3'])
promptAction.showToast({
message:'请关闭车门',
duration:4000
})
reject(false)
const aqd = msgArr[19];
const jgd = msgArr[7];
const ygd = msgArr[8];
const ssc = msgArr[13];
const dw = msgArr[28];
// 开始考试信号检测
if(Param803Str !== ''){
//安全带
if(aqd == 1 && Param803Str.includes('1')){
this.avPlayer.playAudio(['voice/请解开安全带.mp3'])
promptAction.showToast({
message:'请解开安全带',
duration:4000
})
reject(false)
}
//门开关
if(mkg == 1 && Param803Str.includes('2')){
this.avPlayer.playAudio(['voice/关门.mp3'])
promptAction.showToast({
message:'请关闭车门',
duration:4000
})
reject(false)
}
//远、近光灯
if((jgd == 1 || ygd == 1) && Param803Str.includes('3')){
this.avPlayer.playAudio(['voice/请关闭远近光灯.mp3'])
promptAction.showToast({
message:'请关闭远近光灯',
duration:4000
})
reject(false)
}
//拉手刹
if(ssc == 0 && Param803Str.includes('4')){
this.avPlayer.playAudio(['voice/请拉手刹.mp3'])
promptAction.showToast({
message:'请拉手刹',
duration:4000
})
reject(false)
}
//请点火
if(fdjzs*1 <=0 && Param803Str.includes('5')){
this.avPlayer.playAudio(['voice/点火.mp3'])
promptAction.showToast({
message:'请点火',
duration:4000
})
reject(false)
}
//置空档
if(dw != 0 && Param803Str.includes('6')){
this.avPlayer.playAudio(['voice/请置空档.mp3'])
promptAction.showToast({
message:'请置空档',
duration:4000
})
reject(false)
}
}
if(fdjzs*1 > 0){
this.avPlayer.playAudio(['voice/熄火.mp3'])
promptAction.showToast({
message:'请熄火',
duration:4000
})
reject(false)
// 考前绕车一周信号检测
if(isBoardPrePareSetPopupOpen){
//请熄火
if(fdjzs*1 > 0){
this.avPlayer.playAudio(['voice/熄火.mp3'])
promptAction.showToast({
message:'请熄火',
duration:4000
})
reject(false)
}
if(mkg == 1){
this.avPlayer.playAudio(['voice/关门.mp3'])
promptAction.showToast({
message:'请关闭车门',
duration:4000
})
reject(false)
}
}
resolve(true)
})
}
@ -600,10 +674,11 @@ struct UserInfo {
//接口标识
jkid: '17C51',
}
const code = await writeObjectOut(param);
console.info('surenjun',JSON.stringify(param))
const temp = await writeObjectOut(param);
globalThis.lsh = this.currentUser.lsh
globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm;
return code
return temp
}
aboutToDisappear() {
@ -752,7 +827,7 @@ struct UserInfo {
.commStyle()
.onClick(async () => {
try {
// await this.checkSignal()
await this.checkSignal()
this.faceCompareSucess = 0
globalThis.statue = 2
if (!this.currentUser.xm) {
@ -771,7 +846,6 @@ struct UserInfo {
this.stopDeviceById()
return
}
console.log('this.FaceOpenStatue',this.FaceOpenStatue)
if (this.FaceOpenStatue != '0') {
this.showFaceCompare = true
} else {
@ -779,7 +853,7 @@ struct UserInfo {
this.sfbdinterfaceFn()
}
} catch (e) {
console.info('Throw Error',JSON.stringify(e))
}
})

View File

@ -226,9 +226,9 @@ export default struct DeductedPopup {
}
const code = await writeObjectOut(beginData)
//TODO code待处理
if (code == 1) {
}
// if (code == 1) {
//
// }
}
//过程照片

View File

@ -2,6 +2,9 @@ import apiJudgeSdk from 'libJudgeSdk.so';
import Judge from '../../judgeSDK/utils/judgeReal';
import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d';
import common from '@ohos.app.ability.common';
import {
examJudgeMapSetScaling
} from '../../judgeSDK/api'
interface RoadDataType {
name: string,
@ -19,6 +22,7 @@ export default struct RealTime {
@State projects: Project[] = []
@State projectsObj: ProjectObj = {}
@State markRuleListObj: MarkRule = {}
@State scaleNum: number = 100
@State gpsActive: number = 1
private widthNumber: string | number | Resource = 0
private heightNumber: string | number | Resource = 0
@ -88,6 +92,11 @@ export default struct RealTime {
}
.width('100%')
.backgroundColor('#fff')
Row(){
Image($rawfile('judge/big.png')).width(60).onClick(()=>{this.scaleFn(-10)})
Image($rawfile('judge/small.png')).width(60).onClick(()=>{this.scaleFn(10)}).margin({left:20})
}.position({x:'32%',y:60})
}
.height('100%')
}
@ -136,5 +145,20 @@ export default struct RealTime {
{ name: '形状', key: ['InShapeAttr', 'ShapeNo','ShapeNoWheel'] },
{ name: '路段点', key: ['CrossPointNo'] },
]
scaleFn = async (num)=>{
const scaleNum = this.scaleNum
if(scaleNum >0 && scaleNum < 200){
this.scaleNum += num;
}
if(scaleNum === 0 && num > 0){
this.scaleNum += num;
}
if(scaleNum === 200 && num < 0){
this.scaleNum += num;
}
await examJudgeMapSetScaling(this.scaleNum);
}
}

View File

@ -558,6 +558,7 @@ export const testUIAllitems = [
]
export const wuxiKm3Items = [
//3,5,9,12,14,15,16,
{projectCode:'1',projectCodeCenter:'40100',name:'上车准备',abbreviation:'上车准备'},
{projectCode:'2',projectCodeCenter:'40200',name:'起步',abbreviation:'起步'},
{projectCode:'3',projectCodeCenter:'40300',name:'直线行驶',abbreviation:'直线行驶'},
@ -570,7 +571,7 @@ export const wuxiKm3Items = [
{projectCode:'10',projectCodeCenter:'41400',name:'超车',abbreviation:'超车'},
{projectCode:'11',projectCodeCenter:'40600',name:'靠边停车',abbreviation:'靠边停车'},
{projectCode:'12',projectCodeCenter:'41500',name:'掉头',abbreviation:'掉头'},
{projectCode:'13',projectCodeCenter:'41600',name:'夜间行驶',abbreviation:'夜间行驶'},
{projectCode:'41',projectCodeCenter:'41600',name:'夜间行驶',abbreviation:'夜间行驶'},
{projectCode:'14',projectCodeCenter:'40400',name:'加减档位操作',abbreviation:'加减档位操作'},
{projectCode:'15',projectCodeCenter:'40800',name:'路口左转弯',abbreviation:'路口左转弯'},
{projectCode:'16',projectCodeCenter:'40900',name:'路口右转弯',abbreviation:'路口右转弯'},

View File

@ -35,7 +35,8 @@ import {
plcStrToJson,
plcStrToWXJson,
promptWxCode,
senorToWXDataStr
senorToWXDataStr,
getKmProjectCancelVoice
} from './utils/judgeCommon';
import {
@ -159,7 +160,8 @@ export default class Judge {
// 3.开始考试
let beginExamInfo = isTrajectoryOpen ? {
...JSON.parse(strArr[1]),
replay: 1
replay: 1,
ykxm:judgeConfig.ignoreProjects
} : await getJudgeBeginData()
await fileLog.setExamJudgeData(beginExamInfo)
@ -291,8 +293,9 @@ export default class Judge {
//处理评判过程回调
handleRealExam = async (strData, callBack) => {
let examData: EXAMDATA = JSON.parse(strData);
const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,setRoadAndLane,judgeUI} = this;
const {carzt,xmks,kf,event,xmjs,ksjs,sound,mndg,lane} = examData
const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,avPlayer,judgeUI} = this;
const {carzt,xmks,kf,event,xmjs,xmqx,ksjs,sound,mndg,lane} = examData
const param512 = (judgeUI.judgeConfigObj['512'] || '').split(',');
//获取项目结束、项目开始代码
const xmdm = event == 2 ? xmjs.xmdm : xmks.xmdm
const xmxh = event == 2 ? xmjs.xmxh : xmks.xmxh;
@ -301,7 +304,6 @@ export default class Judge {
switch (event) {
//项目开始
case 1:
console.info(judgeTag,'项目开始开始1')
judgeUI.projectsObj[xmdm].type = '2';
if (isManualProjectIn) {
//手动项目是否在进行中
@ -322,8 +324,9 @@ export default class Judge {
this.xmdm = xmdm;
this.xmxh = xmxh;
this.judgeUI.isProjectIn = true
this.judgeUI.isDeductedPopShow = true
console.info(judgeTag,'项目开始开始2')
if(param512[7] != 0){
this.judgeUI.isDeductedPopShow = true
}
break;
//项目结束
@ -380,8 +383,16 @@ export default class Judge {
break;
//项目取消
case 6:
case 6:{
console.info(judgeTag,'项目取消');
const xmdm = xmqx.xmdm;
const xmmcCode = judgeUI.projectsObj[xmdm].projectCodeCenter;
const voiceCode = getKmProjectCancelVoice(xmmcCode);
avPlayer.playAudio([`voice/${voiceCode}.mp3`],true)
this.judgeUI.projectsObj[xmdm].type = '1';
this.testKmItems[xmmcCode].status = '1';
break;
}
//语音播放和提示
case 7:
@ -414,7 +425,7 @@ export default class Judge {
this.goVoiceAnnounce(event, xmdm, this.kfArr, xmjs, ksjs)
//更新UI
if (event == 1 || event == 2 || event == 3) {
if (event == 1 || event == 2 || event == 3 || event == 6) {
const copyProjectsObj = this.judgeUI.projectsObj;
judgeUI.projectsObj = deepClone(copyProjectsObj);
}
@ -447,7 +458,7 @@ export default class Judge {
const isEnd = projectsObj[xmdm].isEnd;
const kmCode = getKmProjectVoice(code, 1, judgeConfigObj, lane)
if (!ignoreVoiceCodeArr.includes(code)) {
kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`])
kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`],true)
}
//项目已考不上传监管信息
if (!isEnd) {
@ -490,11 +501,10 @@ export default class Judge {
case 3:
//扣分时实时播报语音0-否+1-是)
const currentKf = kf[kfLen -1];
if (judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen) {
if (judgeConfigObj['418'] == '1' && judgeConfig.kfVoiceOpen) {
avPlayer.playAudio([`voice/${currentKf.markcatalog}.mp3`])
}
const isStart = await checkProjectIsStart(currentKf.xmdm,2,currentKf);
console.info(judgeTag + '扣分 isStart=>',isStart)
if(isStart){
await judgeTask.addTask(async () => {
console.info(judgeTag, `项目扣分-${currentKf.markcatalog}-${currentKf.desc}`)
@ -593,7 +603,7 @@ export default class Judge {
kssj: time
}
}
const code = await writeObjectOut(data,filePath)
const {code} = await writeObjectOut(data,filePath)
console.info(judgeTag, '项目开始 end')
if (code === 2300007) {
this.isJudgeDisConnect = true;
@ -629,7 +639,7 @@ export default class Judge {
jssj: time
}
}
const code = await writeObjectOut(data,filePath)
const {code} = await writeObjectOut(data,filePath)
if (code === 2300007) {
this.isJudgeDisConnect = true;
}
@ -666,7 +676,7 @@ export default class Judge {
kfsj: time
}
}
const code = await writeObjectOut(data,filePath);
const {code} = await writeObjectOut(data,filePath);
if (code === 2300007) {
this.isJudgeDisConnect = true
}
@ -700,7 +710,7 @@ export default class Judge {
ksdd: encodeURI(ksdd)
}
};
const code = await writeObjectOut(data,filePath);
const {code} = await writeObjectOut(data,filePath);
if (code === 2300007) {
this.isJudgeDisConnect = true
}
@ -714,27 +724,25 @@ export default class Judge {
const {xmdm,code,type} = sound;
//判断是不是模拟灯光语音
if (type == 1) {
// console.info(judgeTag, '模拟灯光开始播放:' + code)
avPlayer.playAudio([`voice/${code}.mp3`], false, () => {
examJudgeSoundEnd({
itemno: xmdm, code, type
})
fileLog.setExamJudgeData({
method: 'examJudgeSoundEnd',
itemno: xmdm,
code,
type,
})
})
}else{
avPlayer.playAudio([`voice/${code}.mp3`])
}
avPlayer.playAudio([`voice/${code}.mp3`], false, () => {
if (type == 1) {
// console.info(judgeTag, '播放结束:' + code)
examJudgeSoundEnd({
itemno: xmdm, code, type
})
fileLog.setExamJudgeData({
method: 'examJudgeSoundEnd',
itemno: xmdm,
code,
type,
})
}
})
}
// 校验考试是否结束
checkExamIsEnd = async (isManual?: boolean) => {
const {judgeUI,avPlayer,isExamEnd,} = this;
const {judgeUI,avPlayer,isExamEnd,isEndTip} = this;
const {isAllProjectsEnd,examSubject,singlePlay,totalScore,judgeConfigObj,passingScore} = judgeUI;
if (isExamEnd) {
@ -773,12 +781,18 @@ export default class Judge {
return
}
//成绩合格
if (isAllProjectsEnd && totalScore >= passingGrade) {
if (isAllProjectsEnd && totalScore >= passingGrade && isEndTip) {
const param302 = judgeConfigObj['302'];
if (examSubject == 3 && (param302 != 6 || param302 != 7 || param302 != 8)) {
avPlayer.playAudio(['voice/综合评判.mp3'])
this.judgeUI.isDeductedPopShow = true
this.judgeUI.defaultTabIndex = 1
const param342 = judgeConfigObj['342'];
const param512 = (judgeUI.judgeConfigObj['512'] || '').split(',');
if (examSubject == 3 && param342 != 0 && (param302 != 6 || param302 != 7 || param302 != 8)) {
if(param512[7] != 0){
avPlayer.playAudio(['voice/综合评判.mp3'])
this.judgeUI.isDeductedPopShow = true
this.judgeUI.defaultTabIndex = 1
this.isEndTip = true
}
} else {
await examJudgeEndExam()
this.isExamEnd = true
@ -794,20 +808,23 @@ export default class Judge {
this.judgeUI.endPopupVisible = false;
this.judgeUI.isDeductedPopShow = false;
console.info(judgeTag,1)
const {qjjl,dcjl} = ksjs
const {judgeUI,endExam,handleSEP,kfArr,avPlayer,judgeTask,isManual} = this;
const {judgeConfigObj,examSubject,isAllProjectsEnd,totalScore,passingScore} = judgeUI;
//计算考试分数
console.info(judgeTag,2)
this.judgeUI.totalScore = isAllProjectsEnd ? totalScore : 0;
const singlePlay = globalThis.singlePlay
const param302 = judgeConfigObj['302'];
globalThis.windowClass.setWindowSystemBarEnable(['navigation'])
console.info(judgeTag,3)
//自动退出待验证并且不合格
if (!isManual && examSubject == 3 && (param302 == 1 || (singlePlay && param302 == 2)) && totalScore < passingScore) {
avPlayer.playAudio([`voice/考试结束.mp3`])
}
console.info(judgeTag,4)
//联网模式下手动结束的直接退出
if (!singlePlay && isManual && !isAllProjectsEnd) {
avPlayer.playAudio(['voice/empty.mp3'], true, () => {
@ -815,18 +832,21 @@ export default class Judge {
})
return
}
console.info(judgeTag,5)
if (examSubject == 3) {
const param302 = judgeConfigObj['302'];
if (totalScore < passingScore) {
//考试不合格;考试模式,自动退出;
if (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8) {
}
} else {
//考试合格
}
}
console.info(judgeTag,6)
await handleSEP(306);
console.info(judgeTag,7)
avPlayer.playAudio(['voice/exam_waiting.mp3'], true, async () => {
try {
if (!singlePlay) {
@ -837,6 +857,7 @@ export default class Judge {
//TODO endExam函数逻辑待验证
await endExam()
} catch (e) {
console.info(judgeTag,JSON.stringify(e))
// setTimeout(() => {
// // avPlayer.avPlayerStop();
// router.back();
@ -873,8 +894,8 @@ export default class Judge {
dwlc: [d1,d2,d3,d4,d5].map((d,index) => `${index},${Math.floor(d /100)}`).join(';'),
}
}
const code = await writeObjectOut(data,filePath);
promptWxCode('17C56', code)
const temp = await writeObjectOut(data,filePath);
promptWxCode('17C56', temp.code)
console.info(judgeTag, '考试结束 end')
const param302 = judgeConfigObj['302'];
judgeUI.loadingPopupVisible = true;
@ -897,7 +918,9 @@ export default class Judge {
}
console.info(judgeTag, `考试成绩:${totalScore}`)
await uploadProgressData();
if(!singlePlay){
await uploadProgressData();
}
//语音播放扣分项
let score = 0;
@ -923,7 +946,7 @@ export default class Judge {
}
})
} catch (e) {
console.info(judgeTag,JSON.stringify(e))
}
})
@ -1059,8 +1082,12 @@ export default class Judge {
getSbbm = (ksxm, xmxh) => {
const {judgeUI} = this;
const {cdsbInfoObj,projectsObj} = judgeUI;
const {cdsbInfoObj,projectsObj,examSubject} = judgeUI;
const project = projectsObj[ksxm]
//科目三不需要
if(examSubject == 3){
return undefined
}
if (project === undefined) {
return '00000000'
}
@ -1280,6 +1307,7 @@ export default class Judge {
return tempData
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr) => {
const {fileLog,setJudgeItem,setJudgeMark,endExam} = this;
@ -1290,7 +1318,9 @@ export default class Judge {
console.info(judgeTag, '模拟数据考试结束')
globalThis.windowClass.setWindowSystemBarEnable(['navigation'])
clearInterval(judgeTimer)
this.checkExamIsEnd(true)
await examJudgeEndExam()
this.isExamEnd = true
this.isManual = true
return
}
const msg = JSON.parse(strArr[num]);
@ -1310,7 +1340,7 @@ export default class Judge {
}
await examJudgeRealExam(msg)
num++
}, 200)
}, 50)
globalThis.judgeTimer = judgeTimer;
}
// 统计必考项目、所有项目、已考数量
@ -1324,7 +1354,6 @@ export default class Judge {
let allProjectNum = 0, allEndProjectsNum = 0;
Reflect.ownKeys(projectsObj).forEach(projectKey => {
const {type,isRequired} = projectsObj[projectKey];
allProjectNum += 1;
if (type == 3 || type == 4) {
allEndProjectsNum += 1;
@ -1336,8 +1365,9 @@ export default class Judge {
endProjectsNum += 1;
}
}
})
console.info(judgeTag,'必考项目数量:' + projectNum)
console.info(judgeTag,'必考项目已考数量:' + endProjectsNum)
//必考项目除靠边停车是否全部完成
this.judgeUI.isRequiredProjectsEnd = (projectNum - endProjectsNum === 0)
this.judgeUI.isAllProjectsEnd = (allProjectNum - allEndProjectsNum === 0)
@ -1384,6 +1414,7 @@ export default class Judge {
private judgeTask: JudgeTask
private tempData: any
private performInfo: any
private isEndTip:boolean = false;
private ksjs: {
// 累计前进距离
qjjl: number,

View File

@ -136,6 +136,19 @@ export function getKmProjectVoice(
}
//获取科目三取消项目语音
export function getKmProjectCancelVoice(projectCode){
switch (projectCode*1){
//变更车道
case 40500: return 405004
//加减档
case 40400: return 404004
//超车
case 41400: return 414004
default :return 'empty'
}
}
// 上传监管数据code转换
export function promptWxCode(
jkid:'17C52' | '17C54' |'17C55' | '17C53' | '17C56',

View File

@ -7,6 +7,8 @@ export const judgeConfig = {
isPhotoOpen: true,
//扣分语音是否强制开启
kfVoiceOpen: true,
//忽略的考试项目
ignoreProjects:[41],
// 是否忽略考试前熄火、车门检查
isCheckFireOpen: true,
//是否开启Udp
@ -14,7 +16,7 @@ export const judgeConfig = {
// 本地模型地址
modelPath: 'models/model_enc',
// 济南科目三
trajectoryPath: 'logs/2024_08_07/2024_08_07_11_35_39_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt',
trajectoryPath: 'logs/2024_08_10/2024_08_10_14_24_20_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt',
//四合一画面配置
fourInOneScreen:{
//gps位数

View File

@ -34,7 +34,7 @@ export default class JudgeImg {
setTimeout(async ()=>{
console.info(judgeTag,'1.进入评判入口')
await examJudgeMapSetParam(640, 480); //设置参数宽、高
await examJudgeMapSetScaling(120); //设置缩放比例一般默认填100就是100%的意思) 数字越大视野越大数字越小视野越小不能为0
await examJudgeMapSetScaling(100); //设置缩放比例一般默认填100就是100%的意思) 数字越大视野越大数字越小视野越小不能为0
})
judgeUI.draw = true

View File

@ -42,17 +42,18 @@ export default class VoiceAnnounce{
if(queue.length){
//队列续上
this.queue = this.queue.concat(tempUrls)
// console.info(TAG,'语音队列开始'+shit + JSON.stringify( this.queue))
}else{
this.queue = tempUrls
// console.info(TAG,'语音队列开始' + shit+JSON.stringify( this.queue))
await this.executeQueue()
}
}
async executeQueue(){
const avPlayer = new AVPlayer();
const go = async () => {
const {queue,isStopped,newQueue} = this;
const avPlayer = new AVPlayer();
if(isStopped){
//清空原来队列
this.queue = newQueue
@ -60,16 +61,16 @@ export default class VoiceAnnounce{
await go()
return
}
console.info(TAG,'当前播放队列' + JSON.stringify( queue))
await avPlayer.play(queue[0].url,queue[0].callback);
this.queue.shift();
console.info(TAG,JSON.stringify(this.queue),'堆栈弹出');
console.info(TAG,'当前播放队列播放完成退出');
avPlayer.avPlayerStop();
if(this.queue.length){
await go()
}
}
await go()
avPlayer.avPlayerStop();
}
}
@ -116,8 +117,7 @@ class AVPlayer {
}catch (e){
//检查SD中的语音
this.endCallback = callback
const avPlayer = await media.createAVPlayer();
this.avPlayer = avPlayer;
this.avPlayer = await media.createAVPlayer();
return new Promise(async (resolve,reject) => {
await this.setAVPlayerCallback(()=>{
//@ts-ignore
@ -189,6 +189,7 @@ class AVPlayer {
this.avPlayer.prepare()
break;
case 'prepared': // prepare调用成功后上报该状态机
console.info(TAG,'播放资源播放')
this.avPlayer.play();
this.voiceStatus = 'playing'
break;
@ -199,12 +200,13 @@ class AVPlayer {
case 'completed': // 播放结束后触发该状态机上报
this.voiceStatus = 'completed'
this.avPlayer.stop(); //调用播放结束接口
if(endCallback){
endCallback()
}
break;
case 'stopped': // stop接口成功调用后触发该状态机上报
this.avPlayer.reset(); // 调用reset接口初始化avplayer状态
console.info(TAG,'播放资源释放')
if(endCallback){
endCallback()
}
callBack()
break;
case 'released':

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Binary file not shown.