Merge pull request 'feat_surenjun' (#54) from feat_surenjun into main
Reviewed-on: #54
This commit is contained in:
		
						commit
						1dd23b9768
					
				| @ -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
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| //********************************以上是预编译定义***************************************
 | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * 基础整数类型定义 | ||||
|  * | ||||
|  | ||||
| @ -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; } | ||||
|  | ||||
| @ -3,6 +3,11 @@ | ||||
|  * | ||||
|  *  作者: 杨海洋 | ||||
|  *  日期: 2024-01-03 | ||||
|  * | ||||
|  ****************************************************************************** | ||||
|  *  1、免考项目参数设置:systemparm表: NO1=1并且TXT3=1的是免考的,NO2是项目代码 | ||||
|  * | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef SYSPARMTABLE_H | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -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
											
										
									
								
							| @ -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
 | ||||
|  | ||||
| @ -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 第一帧数据就是非差分状态?如果做模拟灯光的时候一直没差分进不了项目了
 | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @ -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); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -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; | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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() | ||||
|  | ||||
| @ -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;      //开始时间(从倒库开始计时)
 | ||||
|  | ||||
| @ -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 | ||||
|     { | ||||
|  | ||||
| @ -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; | ||||
|             } | ||||
|  | ||||
| @ -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 | ||||
|                 ); | ||||
|  | ||||
| @ -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); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|                     } | ||||
|  | ||||
| @ -68,6 +68,13 @@ | ||||
|  * | ||||
|  *        快进到1840帧,然后步进跟踪项目。 | ||||
|  * | ||||
|  * 公交判断规则: | ||||
|  *  1、509-8不为1 and 当前车道大于2,and (342参数为0,或为2,509-10为1):不扣分 | ||||
|  *  2、500-13为2,按科研所规则判断是否减速; | ||||
|  *  3、509-6为1,同时满足刹车和速度小于阈值(509-5); | ||||
|  *  4、500-13为1,刹车和速度小于阈值,满足其中一个就不扣分; | ||||
|  *  5、无上述参数,只判断刹车 | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef SUB3JUDGE08GJZT_H | ||||
|  | ||||
| @ -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 | ||||
|             { | ||||
|  | ||||
| @ -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;
 | ||||
|  | ||||
| @ -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; | ||||
|             } | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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-中心线(黄色实线)
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -39,6 +39,7 @@ export default class FileUtil{ | ||||
|           fs.mkdirSync(path) | ||||
|         } | ||||
|       } catch (e) { | ||||
|         console.info('初始化文件夹失败',path) | ||||
|         promptAction.showToast({ | ||||
|           message:`初始化文件夹失败`+JSON.stringify(e), | ||||
|           duration:4000, | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
| @ -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 } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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设置的路段不能触发对应项目 | ||||
|  | ||||
| @ -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)) | ||||
|                 } | ||||
| 
 | ||||
|               }) | ||||
|  | ||||
| @ -226,9 +226,9 @@ export default struct DeductedPopup { | ||||
|     } | ||||
|     const code = await writeObjectOut(beginData) | ||||
|     //TODO code待处理 | ||||
|     if (code == 1) { | ||||
| 
 | ||||
|     } | ||||
|     // if (code == 1) { | ||||
|     // | ||||
|     // } | ||||
|   } | ||||
| 
 | ||||
|   //过程照片 | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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:'路口右转弯'}, | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
| @ -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', | ||||
|  | ||||
| @ -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位数
 | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -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': | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/big.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/big.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.8 KiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/small.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/small.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 8.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/404004.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/404004.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/点火.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/点火.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请拉手刹.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请拉手刹.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请置空档.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请置空档.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请解开安全带.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请解开安全带.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user