Merge branch '代理服务方案' of http://88.22.24.105:3000/harmony_car/subject-two into 代理服务方案
This commit is contained in:
		
						commit
						13d036f3f5
					
				| @ -5,9 +5,9 @@ | ||||
|         "name": "default", | ||||
|         "material": { | ||||
|           "certpath": "C:\\Users\\93218\\.ohos\\config\\openharmony\\auto_ohos_default_subject-two_com.oh.dts.cer", | ||||
|           "storePassword": "0000001B2A120129476E60A13CB90F2A118FC1DACD776EBF625CBC8C75E83CE8BC2DA4E57F6E6868B0CA45", | ||||
|           "storePassword": "0000001BF9CC4AD294FB6AC2D8A5278FFFD88EEDF04B79D51256E066D7DD5E2E118E445F67468002D624CA", | ||||
|           "keyAlias": "debugKey", | ||||
|           "keyPassword": "0000001BE3163B872A727924E46576C7DF1ACBE4283BA076307E0B53166334958EEE387B446DD981CBE5BA", | ||||
|           "keyPassword": "0000001BF982C0CB222DFA95970757643CDB791BF698C923C974A4A81AD8C2B28B4CE7839BED505B4EE3E2", | ||||
|           "profile": "C:\\Users\\93218\\.ohos\\config\\openharmony\\auto_ohos_default_subject-two_com.oh.dts.p7b", | ||||
|           "signAlg": "SHA256withECDSA", | ||||
|           "storeFile": "C:\\Users\\93218\\.ohos\\config\\openharmony\\auto_ohos_default_subject-two_com.oh.dts.p12" | ||||
|  | ||||
										
											Binary file not shown.
										
									
								
							| @ -27,7 +27,7 @@ | ||||
| #define JUDGE_VERSION_MAJOR  1 | ||||
| #define JUDGE_VERSION_MINOR  0 | ||||
| #define JUDGE_VERSION_PATCH  3 | ||||
| #define JUDGE_VERSION_STAMP  "2504110912b" | ||||
| #define JUDGE_VERSION_STAMP  "2504191100b" | ||||
| #if JUDGE_USE_OLD | ||||
| #   undef JUDGE_VERSION_STAMP | ||||
| #   define JUDGE_VERSION_STAMP  "2411121010b.old" | ||||
|  | ||||
| @ -121,6 +121,7 @@ namespace siteof | ||||
|     siteof_declare(JXYTSF001); | ||||
|     siteof_declare(hnzzkm3); | ||||
|     siteof_declare(jswxbz); | ||||
|     siteof_declare(scms); | ||||
|     siteof_declare(tcrx);  //无锡所检测地点版本特殊
 | ||||
| 
 | ||||
| 
 | ||||
| @ -245,6 +246,7 @@ namespace sound | ||||
|     sound_sub3(471001);      // \sound\临时停车.wav
 | ||||
|     sound_sub3(456001);      // \sound\通过急弯.wav
 | ||||
|     sound_sub3(458001);      // \sound\通过拱桥.wav
 | ||||
|     sound_sub3(zhpp);        // \sound\综合评判.wav 请考官综合评判
 | ||||
| 
 | ||||
|     sound_subx(xmqx);        //项目取消
 | ||||
| 
 | ||||
|  | ||||
| @ -148,6 +148,7 @@ class JUDGE_API SysSetTable : public IDBTable | ||||
|     SYSSET_DECLARE(19, type_array, ":");             //夜间考试考试时间
 | ||||
|     SYSSET_DECLARE(211);                             //考试地点参数
 | ||||
|     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(302);                             //结束考试方式(0-不合格继续,1-考试不合格报靠边 2-不合格不报靠边 3-训练不合格报靠边 4-自动退出 5-不合格自动退出 6-合格自动退出  7-符合条件自动退出8^延时S秒^-不合格自动退出,合格时延时S秒再自动退出)
 | ||||
|     SYSSET_DECLARE(303);                             //行驶距离限制(米)  //3000
 | ||||
|     SYSSET_DECLARE(306);                             //直行键(0-直行,1-加速行驶)	//1
 | ||||
|     SYSSET_DECLARE(307);                             //只考一次的项目 //5,15,16
 | ||||
| @ -160,7 +161,7 @@ class JUDGE_API SysSetTable : public IDBTable | ||||
|     SYSSET_DECLARE(322);                             //模拟夜间检查灯光时机(0-考试前后 1-仅考试后 2-仅考试前) //0	扣20-93
 | ||||
|     SYSSET_DECLARE(323);                             //模拟夜间模式(0-必考 1-未扣分补考时不考 2-不模拟 3-夜考时模拟+实际夜间灯光)   //1
 | ||||
|     SYSSET_DECLARE(325);                             //靠边停车压线条件(0-停车压线才判;1-压线立即判) //0
 | ||||
|     SYSSET_DECLARE(326);                             //靠边停车后是否进入下车状态评判(0-否 1-是)  //0
 | ||||
|     SYSSET_DECLARE(326);                             //靠边停车后是否进入下车状态评判(0-否 1-是)2否(大车夜间拉手刹钱要打开示宽灯) //0
 | ||||
|     SYSSET_DECLARE(329, type_array, ",");            //GPS搜索范围(大范围CM,小范围CM,)	//6000,3000,
 | ||||
|     SYSSET_DECLARE(332);                             //不允许人工触发的项目列表,以","分隔
 | ||||
|     SYSSET_DECLARE(333);                             //直线行驶结束是否判减速带(0-不判,1-判) 0
 | ||||
| @ -264,6 +265,7 @@ class JUDGE_API SysSetTable : public IDBTable | ||||
|     SYSSET_DECLARE(660);                             //侧方停车项目 停车距离判断阈值控制参数
 | ||||
|     SYSSET_DECLARE(668);                             //安全带评判模式
 | ||||
|     SYSSET_DECLARE(671);                             //停车距离判断阈值控制参数
 | ||||
|     SYSSET_DECLARE(686, type_int);                   //1:倒车入库车头穿过10线读卡进项目 不配置按照0处理,686参数默认是车子在库区域内读卡
 | ||||
|     SYSSET_DECLARE(687, type_int);                   //科二差分信号异常时持续N秒后不进行评判 单位秒
 | ||||
|     SYSSET_DECLARE(696);                             //696	直角关灯模式	0	0:车尾出项目线(标准),1:车头出项目线结束项目,2:车后轮出项目线结束项目。3:前轮过项目线,4:车身脱离转弯后垂线
 | ||||
|     SYSSET_DECLARE(697);                             //697	直角开灯模式	0	0:车头到直角入口,1:车头到转弯前垂线,2:车头到转弯处斜线,3:2022新标准 新标准,入口线到转弯区间内有过方向灯
 | ||||
| @ -292,6 +294,7 @@ class JUDGE_API SysSetTable : public IDBTable | ||||
|         SYSSET_ASSIGN(19); | ||||
|         SYSSET_ASSIGN(211); | ||||
|         SYSSET_ASSIGN(301); | ||||
|         SYSSET_ASSIGN(302); | ||||
|         SYSSET_ASSIGN(303); | ||||
|         SYSSET_ASSIGN(306); | ||||
|         SYSSET_ASSIGN(307); | ||||
| @ -408,6 +411,7 @@ class JUDGE_API SysSetTable : public IDBTable | ||||
|         SYSSET_ASSIGN(660); | ||||
|         SYSSET_ASSIGN(668); | ||||
|         SYSSET_ASSIGN(671); | ||||
|         SYSSET_ASSIGN(686); | ||||
|         SYSSET_ASSIGN(687); | ||||
|         SYSSET_ASSIGN(696); | ||||
|         SYSSET_ASSIGN(697); | ||||
|  | ||||
| @ -135,7 +135,8 @@ ErrorCode ExamCarSub2::examGoonExam() | ||||
|     } | ||||
| 
 | ||||
|     //已经不合格了 如果是考试模式,只要分数不合格就立即结束考试
 | ||||
|     if( (isExamMode() && !isQualified()) || allItemFinish() ) | ||||
|     //20250418无锡科目二考试结束的地方网络不好,存在考试结束无法上传,需要支持ykxm项目全部做完了,评判初始化、开始考试能调用成功;问过工程wins是这么操作的。
 | ||||
|     if( (isExamMode() && !isQualified()) /*|| allItemFinish()*/ ) | ||||
|     { | ||||
|         //createEventExamFinish(ExamFinishAuto); //杨 20240724 都由苏那边控制
 | ||||
|         return QE(errorBeginNotQual); //已经不合格了
 | ||||
| @ -347,7 +348,7 @@ void ExamCarSub2::dealJudgeExam() | ||||
|     } | ||||
|     if(allItemFinish())  //如果所有项目都做过了,就不用再读项目了
 | ||||
|     { | ||||
|         logdebug("allItemFinish"); | ||||
|         //logdebug("allItemFinish");
 | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
| @ -442,11 +443,6 @@ void ExamCarSub2::dealJudgeExam() | ||||
| ISub2JudgeItem* ExamCarSub2::readEnterItem() | ||||
| { | ||||
|     //必须是前进状态进项目
 | ||||
|     if(historyMoveState() != moveForward) | ||||
|     { | ||||
|         //logdebug("not moveForward move=%d", m_cg->move);
 | ||||
|         return nullptr; | ||||
|     } | ||||
| 
 | ||||
|     for(auto k = m_itemsAll.begin(); k != m_itemsAll.end(); k++) | ||||
|     { | ||||
|  | ||||
| @ -1045,6 +1045,14 @@ void ExamCarSub3::UpdateCarParmWithSystemParm() | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     const auto PARM_NO3_70 = [&](const TSystemparm* parm)->void | ||||
|     { | ||||
|         if(parm->TXT1 != "") | ||||
|         { | ||||
|             m_car.XiHuo = std::atoi(parm->TXT1.c_str()); | ||||
|         } | ||||
|     }; | ||||
| 
 | ||||
|     //得到考车参数
 | ||||
|     int parm3Size = TableSysParm->parm3Size(); | ||||
|     for(int i = 0; i < parm3Size; i++) | ||||
| @ -1094,6 +1102,7 @@ void ExamCarSub3::UpdateCarParmWithSystemParm() | ||||
|             PARM_CASE_WITH(61); //61:按车型设置的靠边停车参数
 | ||||
|             PARM_CASE_WITH(62); //62:按车型设置的夜间模拟灯光触发条件
 | ||||
|             PARM_CASE_WITH(63); //63:满分学习的学员考试必考项目(非正常的科目三学员),目前可以暂不考虑这种学员
 | ||||
|             PARM_CASE_WITH(70); //同500熄火参数
 | ||||
| 
 | ||||
|         PARM_SWITCH_END; | ||||
|     } | ||||
| @ -1478,7 +1487,7 @@ bool ExamCarSub3::RTKLane() | ||||
|         { | ||||
|             //如果落到了当前路段的某个车道内
 | ||||
|             const TModelPolygon& poly = road->Lanes[j]; | ||||
|             if(poly.Pts.size() >= 5)  //包括圆弧 Length(TempModelPolygon.Pts)
 | ||||
|             if(poly.Pts.size() >= 5)  //包括圆弧
 | ||||
|             { | ||||
|                 if(GpsMath::IsPtInArcLane(b1_b, poly)) | ||||
|                 { | ||||
| @ -1517,7 +1526,7 @@ bool ExamCarSub3::RTKLane() | ||||
|         if(a > 0) a = a - 1; | ||||
|         for(int i = a; i <= b; i++) //I := a to b do
 | ||||
|         { | ||||
|             if(i > roadSize - 1) continue; | ||||
|             if(i >= roadSize) continue; | ||||
| 
 | ||||
|             const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|             for(int j = 0; j < road->LaneCount; j++) | ||||
| @ -1586,7 +1595,7 @@ bool ExamCarSub3::RTKLane() | ||||
|     //车头中点所属车道
 | ||||
|     for(int i = curRoadIndex; i <= curRoadIndex + 4; i++) | ||||
|     { | ||||
|         if(i > roadSize - 1) break; | ||||
|         if(i >= roadSize) break; | ||||
| 
 | ||||
|         const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|         const Pointi& pt = m_cg->body.points_b[II(1)]; //CarStatus.Body_24_RealTimePt[0];
 | ||||
| @ -1957,121 +1966,103 @@ void ExamCarSub3::Calc_LaneDistance() | ||||
| 
 | ||||
|     //Kind:1: 车身左1(上)  2:车身右1(上)  3:车身左2(下)  4:车身右2(下)
 | ||||
|     ExamCarType cartype = carType(); | ||||
|     int LeftFront = GetCarBodyPointNo(cartype, 1); | ||||
|     int LeftBack = GetCarBodyPointNo(cartype, 3); | ||||
|     int RightFront = GetCarBodyPointNo(cartype, 2); | ||||
|     int RightBack = GetCarBodyPointNo(cartype, 4); | ||||
|     int LF_I = GetCarBodyPointNo(cartype, BODY_LF); | ||||
|     int LB_I = GetCarBodyPointNo(cartype, BODY_LB); | ||||
|     int RF_I = GetCarBodyPointNo(cartype, BODY_RF); | ||||
|     int RB_I = GetCarBodyPointNo(cartype, BODY_RB); | ||||
| 
 | ||||
|     if(LeftFront == -1 || LeftBack == -1 || RightFront == -1 || RightBack == -1) | ||||
|     { | ||||
|         logerror("cartype=%d,LeftFront=%d, LeftBack=%d, RightFront=%d, RightBack=%d", | ||||
|                  cartype, LeftFront, LeftBack, RightFront, RightBack); | ||||
|         return; | ||||
|     } | ||||
|     TASSERT_VOID(LF_I >= 0 && LB_I >= 0 && RF_I >= 0 && RB_I >= 0, | ||||
|                  "cartype=%d, LF_I=%d, LB_I=%d, RF_I=%d, RB_I=%d", cartype, LF_I, LB_I, RF_I, RB_I); | ||||
| 
 | ||||
|     int curRoadIndex = RTKKM3.MapRoadIndex; | ||||
|     //int curLaneIndex = RTKKM3.LaneIndex;
 | ||||
|     int roadSize = FactoryRoads->size(); | ||||
|     const TCarBody& body = m_cg->body; | ||||
|     TModelLine line; | ||||
|     //判断车轮离本车道右边线距离1(左 1,左2,右1,右2)
 | ||||
|     //P-->1、车轮与本车道右侧距离  2:车轮与最右侧车道右侧距离  3:车身左侧与本车道左侧距离 4:车身右侧与本车道右侧距离
 | ||||
|     const TMeshDefine* curMesh = FactoryMesh->getMesh(m_meshIndex); | ||||
|     TASSERT_VOID(curMesh != nullptr, ""); | ||||
|     //logdebug("mesh=%d,roadSize=%d, RoadIndex=%d,LaneIndex=%d",m_meshIndex,roadSize,curRoadIndex,RTKKM3.LaneIndex);
 | ||||
| 
 | ||||
|     const TModelLine* laneDriving = nullptr; | ||||
|     for(int p = 1; p <= 4; p++) | ||||
|     for(int i = curRoadIndex - 2; i <= curRoadIndex + 2; i++) | ||||
|     { | ||||
|         for(int i = curRoadIndex - 2; i <= curRoadIndex + 2; i++) | ||||
|         //1、不能大于数组的最大下标
 | ||||
|         if(i < 0) continue; | ||||
|         if(i >= roadSize) break; | ||||
|         //2、检查当前的路段是否在可视区域
 | ||||
|         if(!curMesh->has(i)) continue; | ||||
| 
 | ||||
|         const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|         int endof = road->LaneCount - 1; | ||||
|         //if(p == 2)  //车轮与最右侧车道右侧距离
 | ||||
|         //{
 | ||||
|         //    endof = 0;
 | ||||
|         //}
 | ||||
| 
 | ||||
|         //const TModelLine& L0 = road->BorderLines[0];
 | ||||
|         for(int j = 0; j <= endof; j++) | ||||
|         { | ||||
|             //1、不能大于数组的最大下标
 | ||||
|             if(i < 0) continue; | ||||
|             if(i > roadSize - 1) break; | ||||
|             //2、检查当前的路段是否在可视区域
 | ||||
|             bool findFlag = false; | ||||
|             for(int f = 0; f < curMesh->MapRoadKeyLen; f++) | ||||
|             { | ||||
|                 if(curMesh->MapRoad_Keys[f] == i) | ||||
|                 { | ||||
|                     findFlag = true; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             if(!findFlag) continue; | ||||
|             const TModelLine& Lj = road->BorderLines[j]; | ||||
|             const TModelLine& Lj1 = road->BorderLines[j + 1]; | ||||
|             const TModelPolygon& poly = road->Lanes[j]; | ||||
| 
 | ||||
|             const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|             int endof = road->LaneCount - 1; | ||||
|             if(p == 2)  //车轮与最右侧车道右侧距离
 | ||||
|             if(poly.Pts.size() >= 5)  //圆弧路段
 | ||||
|             { | ||||
|                 endof = 0; | ||||
|             } | ||||
|             const TModelLine& L0 = road->BorderLines[0]; | ||||
|             for(int j = 0; j <= endof; j++) | ||||
|             { | ||||
|                 const TModelLine& Lj = road->BorderLines[j]; | ||||
|                 const TModelLine& Lj1 = road->BorderLines[j + 1]; | ||||
|                 const TModelPolygon& poly = road->Lanes[j]; | ||||
|                 //if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                 laneDriving = &road->BorderLines[0]; | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToRightEdge); | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToRightEdge); | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToRightEdge); | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToRightEdge); | ||||
| 
 | ||||
|                 if(poly.Pts.size() >= 5)  //圆弧路段
 | ||||
|                 //else if(p == 2) //2:车轮与最右侧车道右侧距离
 | ||||
|                 if(j == 0) //j等于0,说明Lj就是最右侧车道,L0 = Lj
 | ||||
|                 { | ||||
|                     if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                     { | ||||
|                         laneDriving = &road->BorderLines[0]; | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToRightEdge); | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToRightEdge); | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToRightEdge); | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToRightEdge); | ||||
|                     } | ||||
|                     else if(p == 2) //2:车轮与最右侧车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToBaseLine); | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToBaseLine); | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToBaseLine); | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToBaseLine); | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b, body.points_b[RightFront], RTKKM3.Body_RF_ToBaseLine); //20240801
 | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b, body.points_b[RightBack],  RTKKM3.Body_RB_ToBaseLine); //20240801
 | ||||
|                     } | ||||
|                     else if(p == 3)  //3:车身左侧与本车道左侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceArc(Lj1, poly, body.b1_b, body.points_b[LeftFront], RTKKM3.Body_LF_ToLeftEdge); | ||||
|                         calcToDistanceArc(Lj1, poly, body.b1_b, body.points_b[LeftBack],  RTKKM3.Body_LB_ToLeftEdge); | ||||
|                     } | ||||
|                     else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b, body.points_b[RightFront],  RTKKM3.Body_RF_ToRightEdge); | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b, body.points_b[RightFront],  RTKKM3.Body_RB_ToRightEdge); | ||||
|                     } | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToBaseLine); | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToBaseLine); | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToBaseLine); | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToBaseLine); | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b, body.b(RF_I), RTKKM3.Body_RF_ToBaseLine); //20240801
 | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b, body.b(RB_I), RTKKM3.Body_RB_ToBaseLine); //20240801
 | ||||
|                 } | ||||
|                 else | ||||
| 
 | ||||
|                 //else if(p == 3)  //3:车身左侧与本车道左侧距离
 | ||||
|                 calcToLaneArc(Lj1, poly, body.b1_b, body.b(LF_I), RTKKM3.Body_LF_ToLeftEdge); | ||||
|                 calcToLaneArc(Lj1, poly, body.b1_b, body.b(LB_I), RTKKM3.Body_LB_ToLeftEdge); | ||||
| 
 | ||||
|                 //else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b, body.b(RF_I), RTKKM3.Body_RF_ToRightEdge); | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b, body.b(RB_I), RTKKM3.Body_RB_ToRightEdge); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 //if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                 laneDriving = &road->BorderLines[0]; | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToRightEdge); | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToRightEdge); | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToRightEdge); | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToRightEdge); | ||||
| 
 | ||||
|                 //else if(p == 2)  //2:车轮与最右侧车道右侧距离
 | ||||
|                 if(j == 0) //j等于0,说明Lj就是最右侧车道,L0 = Lj
 | ||||
|                 { | ||||
|                     if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                     { | ||||
|                         laneDriving = &road->BorderLines[0]; | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToRightEdge); | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToRightEdge); | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToRightEdge); | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToRightEdge); | ||||
|                     } | ||||
|                     else if(p == 2)  //2:车轮与最右侧车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToBaseLine); | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToBaseLine); | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToBaseLine); | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToBaseLine); | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b, body.points_b[RightFront], RTKKM3.Body_RF_ToBaseLine, true); //20240801
 | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b, body.points_b[RightBack], RTKKM3.Body_RB_ToBaseLine, true); //20240801
 | ||||
|                     } | ||||
|                     else if(p == 3)  //3:车身左侧与本车道左侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceLine(Lj1, poly.Pts, body.b1_b, body.points_b[LeftFront], RTKKM3.Body_LF_ToLeftEdge); | ||||
|                         calcToDistanceLine(Lj1, poly.Pts, body.b1_b, body.points_b[LeftBack], RTKKM3.Body_LB_ToLeftEdge); | ||||
|                     } | ||||
|                     else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b, body.points_b[RightFront], RTKKM3.Body_RF_ToRightEdge); | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b, body.points_b[RightBack], RTKKM3.Body_RB_ToRightEdge); | ||||
|                     } | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b, body.ZQ_W_b, RTKKM3.Wheel_LF_ToBaseLine); | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b, body.YQ_W_b, RTKKM3.Wheel_RF_ToBaseLine); | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b, body.ZH_W_b, RTKKM3.Wheel_LB_ToBaseLine); | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b, body.YH_W_b, RTKKM3.Wheel_RB_ToBaseLine); | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b, body.b(RF_I), RTKKM3.Body_RF_ToBaseLine, true); //20240801
 | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b, body.b(RB_I), RTKKM3.Body_RB_ToBaseLine, true); //20240801
 | ||||
|                 } | ||||
| 
 | ||||
|                 //else if(p == 3)  //3:车身左侧与本车道左侧距离
 | ||||
|                 calcToLaneLine(Lj1, poly.Pts, body.b1_b, body.b(LF_I), RTKKM3.Body_LF_ToLeftEdge); | ||||
|                 calcToLaneLine(Lj1, poly.Pts, body.b1_b, body.b(LB_I), RTKKM3.Body_LB_ToLeftEdge); | ||||
| 
 | ||||
|                 //else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b, body.b(RF_I), RTKKM3.Body_RF_ToRightEdge); | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b, body.b(RB_I), RTKKM3.Body_RB_ToRightEdge); | ||||
| 
 | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -2118,7 +2109,7 @@ void ExamCarSub3::Calc_CheShenYaXian() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
| int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, const BodyPointSite& kind, bool tail) | ||||
| { | ||||
|     //1、根据车型得到考车的车身位置(其实是最靠近车轮的点) Kind:1: 车身左1(上)  2:车身右1(上)  3:车身左2(下)  4:车身右2(下)
 | ||||
|     //5、车头中心点  //6、车尾中心点
 | ||||
| @ -2131,12 +2122,12 @@ int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
|         { | ||||
|             switch (kind) | ||||
|             { | ||||
|             case 1:  result = II(9);  break; //车身左1(上)
 | ||||
|             case 2:  result = II(12); break; //车身右1(上)
 | ||||
|             case 3:  result = II(9);  break; //车身左2(下)
 | ||||
|             case 4:  result = II(12); break; //车身右2(下)
 | ||||
|             case 5:  result = II(1);  break; //车头中心点
 | ||||
|             case 6:  result = INVALID_INDEX; break; //车尾中心点
 | ||||
|             case BODY_LF: result = II(9);  break; //车身左1(上)
 | ||||
|             case BODY_RF: result = II(12); break; //车身右1(上)
 | ||||
|             case BODY_LB: result = II(9);  break; //车身左2(下)
 | ||||
|             case BODY_RB: result = II(12); break; //车身右2(下)
 | ||||
|             case BODY_CF: result = II(1);  break; //车头中心点
 | ||||
|             case BODY_CB: result = INVALID_INDEX; break; //车尾中心点
 | ||||
|             default: result = INVALID_INDEX; break; | ||||
|             } | ||||
|         } | ||||
| @ -2145,12 +2136,12 @@ int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
|             int G_offset = m_carModel->CheShenOffsetTail(); | ||||
|             switch (kind) | ||||
|             { | ||||
|             case 1:  result = G_offset+II(1); break;    //挂车*车身左1(上)
 | ||||
|             case 2:  result = G_offset+II(5); break;    //挂车*车身右1(上)
 | ||||
|             case 3:  result = G_offset+II(2); break;    //挂车*车身左2(下)
 | ||||
|             case 4:  result = G_offset+II(4); break;    //挂车*车身右2(下)
 | ||||
|             case 5:  result = INVALID_INDEX;  break;    //挂车*车头中心点
 | ||||
|             case 6:  result = G_offset+II(3); break;    //挂车*车尾中心点
 | ||||
|             case BODY_LF: result = G_offset+II(1); break;    //挂车*车身左1(上)
 | ||||
|             case BODY_RF: result = G_offset+II(5); break;    //挂车*车身右1(上)
 | ||||
|             case BODY_LB: result = G_offset+II(2); break;    //挂车*车身左2(下)
 | ||||
|             case BODY_RB: result = G_offset+II(4); break;    //挂车*车身右2(下)
 | ||||
|             case BODY_CF: result = INVALID_INDEX;  break;    //挂车*车头中心点
 | ||||
|             case BODY_CB: result = G_offset+II(3); break;    //挂车*车尾中心点
 | ||||
|             default: result = INVALID_INDEX;  break; | ||||
|             } | ||||
|         } | ||||
| @ -2162,12 +2153,12 @@ int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
|         { | ||||
|             switch (kind) | ||||
|             { | ||||
|             case 1:  result = II(5);  break; //车身左1(上)
 | ||||
|             case 2:  result = II(21); break; //车身右1(上)
 | ||||
|             case 3:  result = II(9);  break; //车身左2(下)
 | ||||
|             case 4:  result = II(17); break; //车身右2(下)
 | ||||
|             case 5:  result = II(1);  break; //车头中心点
 | ||||
|             case 6:  result = II(13); break; //车尾中心点
 | ||||
|             case BODY_LF: result = II(5);  break; //车身左1(上)
 | ||||
|             case BODY_RF: result = II(21); break; //车身右1(上)
 | ||||
|             case BODY_LB: result = II(9);  break; //车身左2(下)
 | ||||
|             case BODY_RB: result = II(17); break; //车身右2(下)
 | ||||
|             case BODY_CF: result = II(1);  break; //车头中心点
 | ||||
|             case BODY_CB: result = II(13); break; //车尾中心点
 | ||||
|             default: result = INVALID_INDEX; break; | ||||
|             } | ||||
|         } | ||||
| @ -2176,12 +2167,12 @@ int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
|             int G_offset = m_carModel->CheShenOffsetTail(); | ||||
|             switch (kind) | ||||
|             { | ||||
|             case 1:  result = G_offset+II(4);  break; //挂车*车身左1(上)
 | ||||
|             case 2:  result = G_offset+II(22); break; //挂车*车身右1(上)
 | ||||
|             case 3:  result = G_offset+II(6);  break; //挂车*车身左2(下)
 | ||||
|             case 4:  result = G_offset+II(20); break; //挂车*车身右2(下)
 | ||||
|             case 5:  result = G_offset+II(1);  break; //挂车*车头中心点
 | ||||
|             case 6:  result = G_offset+II(13); break; //挂车*车尾中心点
 | ||||
|             case BODY_LF: result = G_offset+II(4);  break; //挂车*车身左1(上)
 | ||||
|             case BODY_RF: result = G_offset+II(22); break; //挂车*车身右1(上)
 | ||||
|             case BODY_LB: result = G_offset+II(6);  break; //挂车*车身左2(下)
 | ||||
|             case BODY_RB: result = G_offset+II(20); break; //挂车*车身右2(下)
 | ||||
|             case BODY_CF: result = G_offset+II(1);  break; //挂车*车头中心点
 | ||||
|             case BODY_CB: result = G_offset+II(13); break; //挂车*车尾中心点
 | ||||
|             default: result = INVALID_INDEX; break; | ||||
|             } | ||||
|         } | ||||
| @ -2190,12 +2181,12 @@ int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
|     { | ||||
|         switch (kind) | ||||
|         { | ||||
|         case 1:  result = II(5);  break;  //车身左1(上)
 | ||||
|         case 2:  result = II(21); break;  //车身右1(上)
 | ||||
|         case 3:  result = II(9);  break;  //车身左2(下)
 | ||||
|         case 4:  result = II(17); break;  //车身右2(下)
 | ||||
|         case 5:  result = II(1);  break;  //车头中心点
 | ||||
|         case 6:  result = II(13); break;  //车尾中心点
 | ||||
|         case BODY_LF: result = II(5);  break;  //车身左1(上)
 | ||||
|         case BODY_RF: result = II(21); break;  //车身右1(上)
 | ||||
|         case BODY_LB: result = II(9);  break;  //车身左2(下)
 | ||||
|         case BODY_RB: result = II(17); break;  //车身右2(下)
 | ||||
|         case BODY_CF: result = II(1);  break;  //车头中心点
 | ||||
|         case BODY_CB: result = II(13); break;  //车尾中心点
 | ||||
|         default: result = INVALID_INDEX; break; | ||||
|         } | ||||
|     } | ||||
| @ -2203,12 +2194,12 @@ int ExamCarSub3::GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail) | ||||
|     { | ||||
|         switch (kind) | ||||
|         { | ||||
|         case 1:  result = II(9);   break;  //车身左1(上)
 | ||||
|         case 2:  result = II(17);  break;  //车身右1(上)
 | ||||
|         case 3:  result = II(10);  break;  //车身左2(下)
 | ||||
|         case 4:  result = II(16);  break;  //车身右2(下)
 | ||||
|         case 5:  result = II(1);   break;  //车头中心点
 | ||||
|         case 6:  result = II(13);  break;  //车尾中心点
 | ||||
|         case BODY_LF: result = II(9);   break;  //车身左1(上)
 | ||||
|         case BODY_RF: result = II(17);  break;  //车身右1(上)
 | ||||
|         case BODY_LB: result = II(10);  break;  //车身左2(下)
 | ||||
|         case BODY_RB: result = II(16);  break;  //车身右2(下)
 | ||||
|         case BODY_CF: result = II(1);   break;  //车头中心点
 | ||||
|         case BODY_CB: result = II(13);  break;  //车尾中心点
 | ||||
|         default: result = INVALID_INDEX; break; | ||||
|         } | ||||
|     } | ||||
| @ -4004,10 +3995,14 @@ void ExamCarSub3::KM3EndItem(int ItemNo, bool event, bool sound) | ||||
| bool ExamCarSub3::examMarkItem(ExamItemCode itemNo, const std::string& serial, bool once, bool force, bool event, MarkType type) | ||||
| { | ||||
|     //正式考试 扣分扣到不合格为止
 | ||||
|     if(isExamMode() && !isQualified()) | ||||
|     const std::string& s302 = TableSysSet->get302(); | ||||
|     if(s302 != "0") //302=0的时候,考试结束方式:不合格继续
 | ||||
|     { | ||||
|         logtrace("is not qualified %s itemNo=%d,serial=%s", target().c_str(), itemNo, serial.c_str()); | ||||
|         return false; | ||||
|         if(isExamMode() && !isQualified()) | ||||
|         { | ||||
|             logtrace("is not qualified %s itemNo=%d,serial=%s", target().c_str(), itemNo, serial.c_str()); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     //Kind:0 自动评判  1:考车人工扣分  2:远程下发的考试扣分
 | ||||
| @ -5075,7 +5070,7 @@ void ExamCarSub3::dealItemNoIDEnd14Jjdw() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| bool ExamCarSub3::calcToDistanceArc(const TModelLine& Lxx, const TModelPolygon& poly, const Pointi& b1, const Pointi& pt, int& dm, bool cross) | ||||
| bool ExamCarSub3::calcToLaneArc(const TModelLine& Lxx, const TModelPolygon& poly, const Pointi& b1, const Pointi& pt, int& dm, bool cross) | ||||
| { | ||||
|     TModelLine line; | ||||
|     line.PtBegin = b1; //CarStatus.BasePoint1_RealTime;
 | ||||
| @ -5094,7 +5089,7 @@ bool ExamCarSub3::calcToDistanceArc(const TModelLine& Lxx, const TModelPolygon& | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| bool ExamCarSub3::calcToDistanceArc2(const TModelLine& Lxx, const TModelPolygon& area, const Pointi& b1, const Pointi& pt, int& dm, bool cross) | ||||
| bool ExamCarSub3::calcToLaneArc2(const TModelLine& Lxx, const TModelPolygon& area, const Pointi& b1, const Pointi& pt, int& dm, bool cross) | ||||
| { | ||||
|     TModelLine line; | ||||
|     line.PtBegin = b1; //CarStatus.BasePoint1_RealTime;
 | ||||
| @ -5113,7 +5108,7 @@ bool ExamCarSub3::calcToDistanceArc2(const TModelLine& Lxx, const TModelPolygon& | ||||
|     return false; | ||||
| } | ||||
| 
 | ||||
| bool ExamCarSub3::calcToDistanceLine(const TModelLine& Lxx, const std::vector<Pointi>& Pts, const Pointi& b1, const Pointi& pt, int& dm, bool cross) | ||||
| bool ExamCarSub3::calcToLaneLine(const TModelLine& Lxx, const std::vector<Pointi>& Pts, const Pointi& b1, const Pointi& pt, int& dm, bool cross) | ||||
| { | ||||
|     TModelLine line; | ||||
|     line.PtBegin = b1; | ||||
| @ -5419,7 +5414,7 @@ bool ExamCarSub3::RTKLane_Tail() | ||||
|         if(a > 0) a = a - 1; | ||||
|         for(int i = a; i <= b; i++) | ||||
|         { | ||||
|             if(i > roadSize - 1)  continue; | ||||
|             if(i >= roadSize)  continue; | ||||
| 
 | ||||
|             const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|             for(int j = 0; j < road->LaneCount; j++) | ||||
| @ -5506,7 +5501,7 @@ bool ExamCarSub3::RTKLane_Tail() | ||||
| 
 | ||||
|     for(int i = curRoadIndex; i <= curRoadIndex + 4; i++) | ||||
|     { | ||||
|         if(i > roadSize - 1)  break; | ||||
|         if(i >= roadSize)  break; | ||||
| 
 | ||||
|         const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|         //const Pointi& pt = m_cg->body.points_b[II(1)]; //CarStatus.Body_24_RealTimePt[0];
 | ||||
| @ -5678,109 +5673,88 @@ void ExamCarSub3::Calc_LaneDistance_Tail() | ||||
|     if(RTKKM3_Tail.LaneIndex == INVALID_INDEX)  return; | ||||
| 
 | ||||
|     //Kind:1: 车身左1(上)  2:车身右1(上)  3:车身左2(下)  4:车身右2(下)
 | ||||
|     int LeftFront = GetCarBodyPointNo(cartype, 1, true); | ||||
|     int LeftBack = GetCarBodyPointNo(cartype, 3, true); | ||||
|     int RightFront = GetCarBodyPointNo(cartype, 2, true); | ||||
|     int RightBack = GetCarBodyPointNo(cartype, 4, true); | ||||
|     int LF_I = GetCarBodyPointNo(cartype, BODY_LF, true); | ||||
|     int LB_I = GetCarBodyPointNo(cartype, BODY_LB, true); | ||||
|     int RF_I = GetCarBodyPointNo(cartype, BODY_RF, true); | ||||
|     int RB_I = GetCarBodyPointNo(cartype, BODY_RB, true); | ||||
| 
 | ||||
|     if(LeftFront == -1 || LeftBack == -1 || RightFront == -1 || RightBack == -1) | ||||
|     { | ||||
|         logerror("cartype=%d,LeftFront=%d, LeftBack=%d, RightFront=%d, RightBack=%d", | ||||
|                  cartype, LeftFront, LeftBack, RightFront, RightBack); | ||||
|         return; | ||||
|     } | ||||
|     TASSERT_VOID(LF_I >= 0 && LB_I >= 0 && RF_I >= 0 && RB_I >= 0, | ||||
|                  "cartype=%d, LF_I=%d, LB_I=%d, RF_I=%d, RB_I=%d", cartype, LF_I, LB_I, RF_I, RB_I); | ||||
| 
 | ||||
|     int curRoadIndex = RTKKM3_Tail.MapRoadIndex; | ||||
|     //int curLaneIndex = RTKKM3_Tail.LaneIndex;
 | ||||
|     int roadSize = FactoryRoads->size(); | ||||
|     const TCarBody& body = m_cg->body; | ||||
|     TModelLine line; | ||||
|     //判断车轮离本车道右边线距离1(左 1,左2,右1,右2)
 | ||||
|     //P-->1、车轮与本车道右侧距离  2:车轮与最右侧车道右侧距离  3:车身左侧与本车道左侧距离 4:车身右侧与本车道右侧距离
 | ||||
|     const TMeshDefine* curMesh = FactoryMesh->getMesh(m_meshIndex_Tail); | ||||
|     TASSERT_VOID(curMesh != nullptr, ""); | ||||
| 
 | ||||
|     const TModelLine* laneDriving = nullptr; | ||||
|     for(int p = 1; p <= 4; p++) | ||||
|     for(int i = curRoadIndex - 2; i <= curRoadIndex + 2; i++) | ||||
|     { | ||||
|         for(int i = curRoadIndex - 2; i <= curRoadIndex + 2; i++) | ||||
|         //1、不能大于数组的最大下标
 | ||||
|         if(i < 0) continue; | ||||
|         if(i >= roadSize) break; | ||||
|         //2、检查当前的路段是否在可视区域
 | ||||
|         if(!curMesh->has(i)) continue; | ||||
| 
 | ||||
|         const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|         int endof = road->LaneCount - 1; | ||||
|         //if(p == 2)  //车轮与最右侧车道右侧距离
 | ||||
|         //{
 | ||||
|         //    endof = 0;
 | ||||
|         //}
 | ||||
| 
 | ||||
|         //const TModelLine& L0 = road->BorderLines[0];
 | ||||
|         for(int j = 0; j <= endof; j++) | ||||
|         { | ||||
|             //1、不能大于数组的最大下标
 | ||||
|             if(i < 0) continue; | ||||
|             if(i > roadSize - 1) break; | ||||
|             //2、检查当前的路段是否在可视区域
 | ||||
|             bool findFlag = false; | ||||
|             for(int f = 0; f < curMesh->MapRoadKeyLen; f++) | ||||
|             const TModelLine& Lj = road->BorderLines[j]; | ||||
|             const TModelLine& Lj1 = road->BorderLines[j + 1]; | ||||
|             const TModelPolygon& poly = road->Lanes[j]; | ||||
|             if(poly.Pts.size() >= 5) //圆弧路段
 | ||||
|             { | ||||
|                 if(curMesh->MapRoad_Keys[f] == i) | ||||
|                 { | ||||
|                     findFlag = true; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             if(!findFlag) continue; | ||||
|                 //if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                 laneDriving = &road->BorderLines[0]; | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToRightEdge); | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToRightEdge); | ||||
| 
 | ||||
|             const TMapRoadRec* road = FactoryRoads->getRoad(i); | ||||
|             int endof = road->LaneCount - 1; | ||||
|             if(p == 2)  //车轮与最右侧车道右侧距离
 | ||||
|             { | ||||
|                 endof = 0; | ||||
|             } | ||||
|                 //else if(p == 2) //2:车轮与最右侧车道右侧距离
 | ||||
|                 if(j == 0) //j等于0,说明Lj就是最右侧车道,L0 = Lj
 | ||||
|                 { | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToBaseLine); | ||||
|                     calcToLaneArc2(Lj, road->Area, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToBaseLine); | ||||
|                 } | ||||
| 
 | ||||
|             const TModelLine& L0 = road->BorderLines[0]; | ||||
|             for(int j = 0; j <= endof; j++) | ||||
|                 //else if(p == 3) //3:车身左侧与本车道左侧距离
 | ||||
|                 calcToLaneArc(Lj1, poly, body.b1_b_G, body.b(LF_I), RTKKM3_Tail.Body_LF_ToLeftEdge); | ||||
|                 calcToLaneArc(Lj1, poly, body.b1_b_G, body.b(LB_I), RTKKM3_Tail.Body_LB_ToLeftEdge); | ||||
| 
 | ||||
|                 //else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b_G, body.b(RF_I), RTKKM3_Tail.Body_RF_ToRightEdge); | ||||
|                 calcToLaneArc(Lj, poly, body.b1_b_G, body.b(RB_I), RTKKM3_Tail.Body_RB_ToRightEdge); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 const TModelLine& Lj = road->BorderLines[j]; | ||||
|                 const TModelLine& Lj1 = road->BorderLines[j + 1]; | ||||
|                 const TModelPolygon& poly = road->Lanes[j]; | ||||
|                 if(poly.Pts.size() >= 5) //圆弧路段
 | ||||
|                 //if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                 laneDriving = &road->BorderLines[0]; | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToRightEdge); | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToRightEdge); | ||||
| 
 | ||||
|                 //else if(p == 2)  //2:车轮与最右侧车道右侧距离
 | ||||
|                 if(j == 0) //j等于0,说明Lj就是最右侧车道,L0 = Lj
 | ||||
|                 { | ||||
|                     if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                     { | ||||
|                         laneDriving = &road->BorderLines[0]; | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToRightEdge); | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToRightEdge); | ||||
|                     } | ||||
|                     else if(p == 2) //2:车轮与最右侧车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToBaseLine); | ||||
|                         calcToDistanceArc2(L0, road->Area, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToBaseLine); | ||||
|                     } | ||||
|                     else if(p == 3) //3:车身左侧与本车道左侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceArc(Lj1, poly, body.b1_b_G, body.points_b[LeftFront], RTKKM3_Tail.Body_LF_ToLeftEdge); | ||||
|                         calcToDistanceArc(Lj1, poly, body.b1_b_G, body.points_b[LeftBack],  RTKKM3_Tail.Body_LB_ToLeftEdge); | ||||
|                     } | ||||
|                     else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b_G, body.points_b[RightFront], RTKKM3_Tail.Body_RF_ToRightEdge); | ||||
|                         calcToDistanceArc(Lj, poly, body.b1_b_G, body.points_b[RightBack],  RTKKM3_Tail.Body_RB_ToRightEdge); | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|                     if(p == 1)  //1、车轮与本车道右侧距离
 | ||||
|                     { | ||||
|                         laneDriving = &road->BorderLines[0]; | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToRightEdge); | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToRightEdge); | ||||
|                     } | ||||
|                     else if(p == 2)  //2:车轮与最右侧车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToBaseLine); | ||||
|                         calcToDistanceLine(L0, road->Area.Pts, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToBaseLine); | ||||
|                     } | ||||
|                     else if(p == 3)  //3:车身左侧与本车道左侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceLine(Lj1, poly.Pts, body.b1_b_G, body.points_b[LeftFront], RTKKM3_Tail.Body_LF_ToLeftEdge); | ||||
|                         calcToDistanceLine(Lj1, poly.Pts, body.b1_b_G, body.points_b[LeftBack],  RTKKM3_Tail.Body_LB_ToLeftEdge); | ||||
|                     } | ||||
|                     else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                     { | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b_G, body.points_b[RightFront], RTKKM3_Tail.Body_RF_ToRightEdge); | ||||
|                         calcToDistanceLine(Lj, poly.Pts, body.b1_b_G, body.points_b[RightBack],  RTKKM3_Tail.Body_RB_ToRightEdge); | ||||
|                     } | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b_G, body.ZH_W_b_G, RTKKM3_Tail.Wheel_LB_ToBaseLine); | ||||
|                     calcToLaneLine(Lj, road->Area.Pts, body.b1_b_G, body.YH_W_b_G, RTKKM3_Tail.Wheel_RB_ToBaseLine); | ||||
|                 } | ||||
| 
 | ||||
|                 //else if(p == 3)  //3:车身左侧与本车道左侧距离
 | ||||
|                 calcToLaneLine(Lj1, poly.Pts, body.b1_b_G, body.b(LF_I), RTKKM3_Tail.Body_LF_ToLeftEdge); | ||||
|                 calcToLaneLine(Lj1, poly.Pts, body.b1_b_G, body.b(LB_I), RTKKM3_Tail.Body_LB_ToLeftEdge); | ||||
| 
 | ||||
|                 //else if(p == 4)  //4:车身右侧与本车道右侧距离
 | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b_G, body.b(RF_I), RTKKM3_Tail.Body_RF_ToRightEdge); | ||||
|                 calcToLaneLine(Lj, poly.Pts, body.b1_b_G, body.b(RB_I), RTKKM3_Tail.Body_RB_ToRightEdge); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -80,9 +80,9 @@ protected: | ||||
|     void dealItemNoIDEndItem(); | ||||
|     void dealItemNoIDEnd14Jjdw(); | ||||
| 
 | ||||
|     bool calcToDistanceArc(const TModelLine& Lxx, const TModelPolygon& poly, const Pointi& b1, const Pointi& pt, int& dm, bool cross=false); | ||||
|     bool calcToDistanceArc2(const TModelLine& Lxx, const TModelPolygon& area, const Pointi& b1, const Pointi& pt, int& dm, bool cross=false); | ||||
|     bool calcToDistanceLine(const TModelLine& Lxx, const std::vector<Pointi>& Pts, const Pointi& b1, const Pointi& pt, int& dm, bool cross=false); | ||||
|     bool calcToLaneArc(const TModelLine& Lxx, const TModelPolygon& poly, const Pointi& b1, const Pointi& pt, int& dm, bool cross=false); | ||||
|     bool calcToLaneArc2(const TModelLine& Lxx, const TModelPolygon& area, const Pointi& b1, const Pointi& pt, int& dm, bool cross=false); | ||||
|     bool calcToLaneLine(const TModelLine& Lxx, const std::vector<Pointi>& Pts, const Pointi& b1, const Pointi& pt, int& dm, bool cross=false); | ||||
|     //行驶方向,1正向行驶,-1逆向行驶
 | ||||
|     DriveDirType driveDirection(const TModelLine* lane); | ||||
| 
 | ||||
| @ -110,9 +110,10 @@ protected: | ||||
|     void Calc_LaneDistance(); | ||||
|     //计算车身压线
 | ||||
|     void Calc_CheShenYaXian(); | ||||
|     //1、根据车型得到考车的车身位置(其实是最靠近车轮的点)kind:1: 车身左1(上) 2:车身右1(上) 3:车身左2(下) 4:车身右2(下)
 | ||||
|     //5、车头中心点  //6、车尾中心点
 | ||||
|     int GetCarBodyPointNo(ExamCarType cartype, int8 kind, bool tail = false); | ||||
|     //1、根据车型得到考车的车身位置(其实是最靠近车轮的点)
 | ||||
|     //kind:1: 车身左1(上) 2:车身右1(上) 3:车身左2(下) 4:车身右2(下) 5、车头中心点  6、车尾中心点
 | ||||
|     enum BodyPointSite{BODY_LF=1, BODY_RF=2, BODY_LB=3, BODY_RB=4, BODY_CF=5, BODY_CB=6}; | ||||
|     int GetCarBodyPointNo(ExamCarType cartype, const BodyPointSite& kind, bool tail = false); | ||||
| 
 | ||||
|     bool DrawKM3Map(int width=IMG_SIZE_WIDTH, int height=IMG_SIZE_HEIGHT); | ||||
|     //计算考车显示网格
 | ||||
|  | ||||
| @ -18,7 +18,7 @@ public: | ||||
|     explicit ExamHistory() : m_num(N) { m_que = __NEW__(HistoryQueue); } | ||||
|     virtual ~ExamHistory() { clear();  __DELETE__(m_que); } | ||||
| 
 | ||||
|     T* operator[](int n) { int size = m_que->size(); return n < size ? (*m_que)[n] : nullptr; } | ||||
|     T* operator[](int n) { int size = m_que->size(); return n < size ? m_que->operator[](n) /* (*m_que)[n] */ : nullptr; } | ||||
| 
 | ||||
|     T* at(int n) { TASSERT(n < (int)m_que->size(), ""); return (*this)[n]; } | ||||
| 
 | ||||
|  | ||||
| @ -3,6 +3,11 @@ | ||||
| 
 | ||||
| bool ISub2JudgeWrap::pureJudgeEnter() const noexcept | ||||
| { | ||||
|     if(m_car->historyMoveState() != moveForward) //必须是前进状态进项目
 | ||||
|     { | ||||
|         //logdebug("not moveForward move=%d", m_cg->move);
 | ||||
|         return false; | ||||
|     } | ||||
|     return pureJudgeEnter(m_mod->beg()); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -97,8 +97,17 @@ bool Sub2Judge00Dcrk::dealJudgeEnter() | ||||
|     //    enter = pureCarSomeInPoly({II(4), II(22)}, m_model->poly1278());
 | ||||
|     //}
 | ||||
| 
 | ||||
|     int s686 = TableSysSet->asInt686(); | ||||
|     bool enter = false; | ||||
|     if(s686 == 1)  //1:倒车入库车头穿过10线读卡进项目
 | ||||
|     { | ||||
|         enter = this->pureJudgeEnter(); | ||||
|     } | ||||
|     else  //不配置按照0处理,686参数默认是车子在库区域内读卡
 | ||||
|     { | ||||
|         enter = pureCarSomeInPoly(m_car->carModel()->body(), m_model->poly1278()); | ||||
|     } | ||||
|     //库位两边都可以进, 防止从L12开到L78直接开过去又可以取消,会多次触发预进项目,加上车头1点必须在poly1278内过滤
 | ||||
|     bool enter = this->pureJudgeEnter() || (this->pureJudgeEnter(m_model->end()) && pureCarPointInPoly(II(1), m_model->poly1278())); | ||||
|     if(enter) | ||||
|     { | ||||
| #if JUDGE_USE_OLD | ||||
| @ -315,20 +324,25 @@ void Sub2Judge00Dcrk::divorcedItemArea() | ||||
|     bool in1 = pureInArea({cg1->body.ZH_Z_a,cg1->body.YH_Z_a}, m_model->area(), true); | ||||
|     bool out = ((!in0 && in1) || !pureCarInItemArea());  //阶段10,后轮先不在项目区域结束项目,然后才会走道这里
 | ||||
| #else | ||||
|     bool out = (!pureCarInItemArea()); | ||||
|     //bool out = (!pureCarInItemArea());
 | ||||
|     bool out = pureCarTouchSoloLine(m_model->L12_10(), II(13), 5); | ||||
| #endif | ||||
|     if(out) | ||||
|     { | ||||
|         int syset = TableSysSet->asInt606(); | ||||
|         if(syset == 1 || m_secondInverted == true || m_stage >= Sub2DcrkStage3 || m_existMark == true)  //不可以取消的
 | ||||
|         TChuanGan* cg = m_car->historyChuanGan(); | ||||
|         if(cg->move == moveForward) | ||||
|         { | ||||
|             ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_DCRK_01)); | ||||
|             setState(itemStateEnd); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             //取消倒车入库
 | ||||
|             cancelItem(); | ||||
|             int syset = TableSysSet->asInt606(); | ||||
|             if(syset == 1 || m_secondInverted == true || m_stage >= Sub2DcrkStage3 /*|| m_existMark == true*/)  //不可以取消的
 | ||||
|             { | ||||
|                 ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_DCRK_01)); | ||||
|                 setState(itemStateEnd); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 cancelItem(); //取消倒车入库
 | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -343,7 +357,9 @@ JUDGE_STAGE_IMPL(Sub2Judge00Dcrk, Sub2DcrkStage1) | ||||
|     //前进至停车线阶段
 | ||||
|     TChuanGan* cg  = m_car->historyChuanGan(); | ||||
|     TChuanGan* cg1 = m_car->historyChuanGan(1); | ||||
|     if(cg->move == moveStop && cg1->move == moveStop) | ||||
|     if((cg->move == moveStop && cg1->move == moveStop) || | ||||
|             (TableSysSet->asInt686() != 1 && cg->move == moveBackward && cg1->move == moveBackward && | ||||
|              pureCarSomeInPoly(m_car->carModel()->wheelBack(), m_model->poly1278()))) | ||||
|     { | ||||
|         m_stage = Sub2DcrkStage2; //初始停车
 | ||||
|         if(cg->rk_Shape_Status[L11] == TChuanGan::rk_Shape_1) | ||||
|  | ||||
| @ -116,8 +116,12 @@ JUDGE_STAGE_IMPL(Sub2Judge03Cftc, Sub2CftcStage0) | ||||
|     //穿越结束线了
 | ||||
|     if(m_endLineFlag == true && cgcu->move == moveForward) | ||||
|     { | ||||
|         //2025年04月15日和军华确认的原话 修改无锡地方问题
 | ||||
|         //我问:有扣分不能取消,如果有扣分之后直接开跑了怎么处理?直接判不按规定考试?@老军
 | ||||
|         //军华:我看现在评判本地给取消了。然后监管会报错,考不了下一个项目,学员要先考侧方
 | ||||
|         //备注:后又当面交流确认开回去走断点续考或者重新进项目
 | ||||
|         int s606 = TableSysSet->asInt606(); | ||||
|         if(s606 == 1 || m_existMark == true)  //不可以取消项目,或者侧方已经扣过分了
 | ||||
|         if(s606 == 1 /*|| m_existMark == true*/)  //不可以取消项目,或者侧方已经扣过分了
 | ||||
|         { | ||||
|             ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_ONCE(MARK_SUB2_CFTC_41)); | ||||
|         } | ||||
| @ -431,12 +435,6 @@ void Sub2Judge03Cftc::judgeTouchLine() | ||||
|         touchLineBody_C1C2C5(LineNum::L45_NUM); | ||||
|         touchLineBody_C1C2C5(LineNum::L56_NUM); | ||||
|         //#endif
 | ||||
| 
 | ||||
|         //车轮排线压线(道路边线,不评判库位压线,库位有4个轮子的评判)
 | ||||
|         //以下计算所有的压线扣分(这里只针对车轮排线)
 | ||||
|         touchLineWind_C1C2C5(LineNum::L23_NUM); | ||||
|         touchLineWind_C1C2C5(LineNum::L67_NUM); | ||||
|         touchLineWind_C1C2C5(LineNum::L18_NUM); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -450,7 +448,8 @@ void Sub2Judge03Cftc::touchLineWheel_C1C2C5(LineNum num) | ||||
|     static constexpr int history = 2; | ||||
| 
 | ||||
|     //2024年6月4日无锡所检测,多个轮子压线只扣1次,即:前进或者后退中只扣1次
 | ||||
|     if(pureCarTouchSomeLine(line, model->wheelAll(), history)) //前后左右轮子
 | ||||
|     if(pureCarTouchSomeLine(line, model->wheelAll(), history) || | ||||
|        pureCarTouchPairsLine(line, model->wheelWindAll())) //前后左右轮子和排线
 | ||||
|     { | ||||
|         if(!touch->wheelFlag) | ||||
|         { | ||||
| @ -458,6 +457,10 @@ void Sub2Judge03Cftc::touchLineWheel_C1C2C5(LineNum num) | ||||
|             touchLineMark(num); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         touch->wheelFlag = false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Sub2Judge03Cftc::touchLineWind_C1C2C5(LineNum num) | ||||
| @ -481,7 +484,6 @@ void Sub2Judge03Cftc::touchLineWind_C1C2C5(LineNum num) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Sub2Judge03Cftc::touchLineBody_C1C2C5(LineNum num) | ||||
| { | ||||
|     TSub2CftcTouch* touch = nullptr; | ||||
| @ -499,6 +501,10 @@ void Sub2Judge03Cftc::touchLineBody_C1C2C5(LineNum num) | ||||
|             ENTER_ITEM_AND_MARK(JUDGE_MARK_ITEM_MUST_MORE(MARK_SUB2_CFTC_203)); | ||||
|         } | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         touch->bodyFlag = false; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Sub2Judge03Cftc::touchLineMark(LineNum num) | ||||
|  | ||||
| @ -22,9 +22,9 @@ private: | ||||
|         bool rightFront = false; //右前轮压线 right front
 | ||||
|         bool leftBack   = false; //左后轮压线 left back
 | ||||
|         bool rightBack  = false; //右后轮压线 right back
 | ||||
|         bool windFlag   = false; //排线压线(道路边缘线)
 | ||||
|         bool wheelFlag  = false; //20240604 车轮前进或者后退中多个轮子压同一条线只算1次了
 | ||||
|         bool bodyFlag   = false; //20240605 车身触碰库位边线
 | ||||
|         bool windFlag   = false; //排线压线(道路边缘线)
 | ||||
|     }; | ||||
|     enum LineNum { L23_NUM, L34_NUM, L45_NUM, L56_NUM, L67_NUM, L18_NUM, L36_NUM, SIZE_NUM }; | ||||
| 
 | ||||
|  | ||||
| @ -1277,6 +1277,10 @@ void Sub3Judge11Kbtc::DoStatus_100() | ||||
|         //ToDo: 语音提示-->请起步,继续完成考试
 | ||||
|         m_car->createEventSound({itemNo(), sound::sub3_406005}); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         m_car->createEventSound({itemNo(), sound::sub3_zhpp}); //请考官综合评判
 | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| void Sub3Judge11Kbtc::Judge_KBTC_YaXian() | ||||
|  | ||||
| @ -282,6 +282,10 @@ void Sub3Judge20Comm::Init_ZongHe() | ||||
| 
 | ||||
|     //自动熄火评判方式:熄火次数扣分,1:根据PLC熄火次数  2:根据点火2,其它值:根据发动机转速为0或点火2+转速大于100
 | ||||
|     m_itemvCJH.zdxhkf = s500.size() > 1 && s500[1] != "" ? std::atoi(s500[1].c_str()) : 0; | ||||
|     if(tcar->XiHuo != INVALID_INDEX) //优先以车型代码参数NO3=70,同500参数
 | ||||
|     { | ||||
|         m_itemvCJH.zdxhkf = tcar->XiHuo; | ||||
|     } | ||||
|     //踩副刹时长
 | ||||
|     m_itemvCJH.fscys  = s500.size() > 2 && s500[2] != "" ? std::atoi(s500[2].c_str()) : 5; | ||||
|     //挡位扣分间隔
 | ||||
| @ -1316,9 +1320,23 @@ void Sub3Judge20Comm::Judge_KongDangHuaXing() | ||||
|     //空挡滑行:30115 相关评判
 | ||||
|     if(m_itemvCJH.kdhx_tk > 0) | ||||
|     { | ||||
|         if(sor.dw > 0 || cg->move != moveForward || Tools::isZero(gps.sd) || sor.lhq == SYES || | ||||
|                 (ksdd == siteof::changzhoukm3 && sor.lhq == SYES) || | ||||
|                 (ksdd == siteof::zjhz && sor.lhq == SYES)) | ||||
|         bool i = false; | ||||
|         if(sor.dw > 0 || cg->move != moveForward || Tools::isZero(gps.sd)) | ||||
|         { | ||||
|             i = true; | ||||
|         } | ||||
|         if(ksdd != siteof::scms && sor.lhq == SYES) | ||||
|         { | ||||
|             i = true; | ||||
|         } | ||||
|         const std::vector<std::string>& s507 = TableSysSet->asArray507(); | ||||
|         std::string ss507 = s507.size() > 11 ? s507[11] : ""; | ||||
|         if(ss507 != "1" && sor.lhq == SYES) | ||||
|         { | ||||
|             i = true; | ||||
|         } | ||||
| 
 | ||||
|         if(i) | ||||
|         { | ||||
|             m_itemvCJH.kdhx_tk = 0; | ||||
|         } | ||||
| @ -4334,7 +4352,7 @@ void Sub3Judge20Comm::Mark_FXD_42_43(bool Flag42) | ||||
|     else | ||||
|     { | ||||
|         bool BGCD_ItemFlag = m_car->itemsSomeExaming2(Sub3ItemType04Bgcd); //变更车道
 | ||||
|         if(BGCD_ItemFlag == true)  return; | ||||
|         if(BGCD_ItemFlag == true)  return;  //(*XLG_Modify 2024-06-04*)
 | ||||
|         if(Flag42 == true) | ||||
|         { | ||||
|             JUDGE_MARK_SUB3(4, "42", false); | ||||
| @ -4400,14 +4418,12 @@ void Sub3Judge20Comm::HandleSysSet409_1_Special() | ||||
|                 //超车项目检查
 | ||||
|                 if(item10 != nullptr) | ||||
|                 { | ||||
|                     if(item10->TestPro == ItemProFlagIdle || item10->TestPro == ItemProFlagEnd) | ||||
|                     if(!m_car->itemsSomeExaming2(item04->ItemNo)) | ||||
|                     { | ||||
|                         //ToDo1:通知上层生成当前项目的进项目事件
 | ||||
|                         //ToDo2:通知上层生成当前项目的拍照事件
 | ||||
|                         m_car->createEventEnterItem({item10->ItemNo, ""}); | ||||
|                         m_car->KM3EndItem(item10->ItemNo,true,false); | ||||
|                     } | ||||
|                     else if(item10->TestPro == ItemProFlagInit || item10->TestPro == ItemProFlagJudge) | ||||
|                     else | ||||
|                     { | ||||
|                         m_car->KM3EndItem(item10->ItemNo); | ||||
|                     } | ||||
| @ -4420,20 +4436,13 @@ void Sub3Judge20Comm::HandleSysSet409_1_Special() | ||||
|     TKM3Item* item04 = m_car->findExamItem(Sub3ItemType04Bgcd); //变更车道
 | ||||
|     if(item04 != nullptr) | ||||
|     { | ||||
|         if(item04->TestPro == ItemProFlagIdle || item04->TestPro == ItemProFlagEnd) | ||||
|         //这个参数的意思是,不在变更车道项目里面,就是说,
 | ||||
|         //我们没有读卡或者说考试员触发变更车道项目,学员自己在路上自己变道了。
 | ||||
|         //然后他变道完成的时候,我们会把变更车道项目。变成完已完成状态,就认为已经做过了。
 | ||||
|         if(!m_car->itemsSomeExaming2(item04->ItemNo) && !m_car->isItemPassed(item04->ItemNo)) //Tools::pos(',4,', ',' + Ctl.PassedItem) = 0
 | ||||
|         { | ||||
|             //ToDo1:通知上层生成当前项目的进项目事件
 | ||||
|             //ToDo2:通知上层生成当前项目的拍照事件
 | ||||
|             m_car->createEventEnterItem({item04->ItemNo, ""}); | ||||
|             m_car->KM3EndItem(item04->ItemNo,true,false); | ||||
|         } | ||||
|         else if(item04->TestPro == ItemProFlagInit || item04->TestPro == ItemProFlagJudge) | ||||
|         { | ||||
|             m_car->KM3EndItem(item04->ItemNo); | ||||
|         } | ||||
| 
 | ||||
|         if(!m_car->isItemPassed(item04->ItemNo)) //Tools::pos(',4,', ',' + Ctl.PassedItem) = 0
 | ||||
|         { | ||||
|             if(ksdd == siteof::ynljys) | ||||
|             { | ||||
|                 //ToDo:语音播报:结束变更
 | ||||
| @ -4566,6 +4575,7 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
| 
 | ||||
|     if(gps.sd < 5.0 && gps1.sd < 5.0 && gps2.sd < 5.0) return; | ||||
| 
 | ||||
|     #define HIS(x)   m_car->historySensor(x).dw | ||||
|     //SysSet[425] 一档一离合相关
 | ||||
|     // (*
 | ||||
|     // 加减档位操作挂一个挡位要松一次离合器(项目,全程)(0-否 1-是)()
 | ||||
| @ -4575,8 +4585,7 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|     TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw);//加减挡
 | ||||
|     if(item14 && item14->TestPro == ItemProFlagIdle && ss425 == "1") | ||||
|     { | ||||
|         const TSensorInfo& sor3 = m_car->historySensor(3); | ||||
|         if(sor.dw == sor1.dw && sor.dw != sor2.dw && sor.dw != sor3.dw && sor.dw > 0) | ||||
|         if(sor.dw == HIS(1) && sor.dw != HIS(2) && sor.dw != HIS(3) && sor.dw > 0) | ||||
|         { | ||||
|             int dw = sor.dw; | ||||
|             int k = 0; | ||||
| @ -4589,18 +4598,12 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|                 } | ||||
| 
 | ||||
|                 const TSensorInfo& sori = m_car->historySensor(i); | ||||
|                 int dw_i0 = sori.dw; | ||||
|                 int dw_i1 = m_car->historySensor(i + 1).dw; | ||||
|                 int dw_i2 = m_car->historySensor(i + 2).dw; | ||||
|                 int dw_i3 = m_car->historySensor(i + 3).dw; | ||||
|                 int dw_i4 = m_car->historySensor(i + 4).dw; | ||||
|                 int dw_i5 = m_car->historySensor(i + 5).dw; | ||||
|                 int dw_i6 = m_car->historySensor(i + 6).dw; | ||||
| 
 | ||||
|                 if(sori.lhq == SNOT) break; | ||||
|                 if(dw_i0 == SNOT) continue; | ||||
|                 if(dw != dw_i0 && dw_i0 == dw_i1 && dw_i0  == dw_i2 && dw_i0 == dw_i3 && | ||||
|                         dw_i0  == dw_i4 && dw_i0 == dw_i5 && dw_i0 == dw_i6) | ||||
|                 if(sori.dw == 0) continue; | ||||
|                 if(dw != sori.dw && | ||||
|                    sori.dw == HIS(i+1) && sori.dw == HIS(i+2) && sori.dw == HIS(i+3) && | ||||
|                    sori.dw == HIS(i+4) && sori.dw == HIS(i+5) && sori.dw == HIS(i+6)) | ||||
|                 { | ||||
|                     k = k + 1; | ||||
|                     dw = sori.dw; | ||||
| @ -4613,11 +4616,45 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /*
 | ||||
|      if Ctl.ksdd = 'wuxijiance' then | ||||
|       begin | ||||
|         if (cg.di_lhq = 1) and (cg.ai_dw = 3) then | ||||
|         begin | ||||
|           for i := 1 to 100 do | ||||
|           begin | ||||
|             if lscg[zj(i)].di_lhq = 0 then | ||||
|               Break; | ||||
|             if lscg[zj(i)].ai_dw > 3 then | ||||
|               Break; | ||||
|             if lscg[zj(i)].ai_dw = 1 then | ||||
|             begin | ||||
|               Mark(14, '01', True); | ||||
|               Break; | ||||
|             end; | ||||
|           end; | ||||
|         end; | ||||
|      end; | ||||
|     */ | ||||
| 
 | ||||
|     int count = m_car->historyCount(); | ||||
|     bool btempkf = false; | ||||
|     bool btemp1 = false; | ||||
|     bool btemp2 = false; | ||||
|     //越级加减档持续时间
 | ||||
|     if(m_itemvCJH.yjjdcxsj == 0) | ||||
|     { | ||||
|         if(sor.dw == sor1.dw && sor.dw == sor2.dw && sor.dw > 0 && sor.dw < 9 && | ||||
|         bool ix = 0; | ||||
|         if(sor.lhq == SNOT) | ||||
|         { | ||||
|             ix = 1; | ||||
|         } | ||||
|         if(ksdd == siteof::lfgakm3) | ||||
|         { | ||||
|             ix = 1; | ||||
|         } | ||||
| 
 | ||||
|         if(sor.dw == HIS(1) && sor.dw == HIS(2) && sor.dw > 0 && sor.dw < 9 && | ||||
|            sor.lhq == SNOT && gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType))  //增加了车速>5 20151214
 | ||||
|         { | ||||
|             for(int i = 3; i < 53; i++) | ||||
| @ -4628,31 +4665,27 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|                 } | ||||
|                 const TChuanGan* hisi = m_car->historyChuanGan(i); | ||||
|                 const TSensorInfo& sori = hisi->real.sensor; | ||||
|                 int dw_i0 = sori.dw; | ||||
|                 if(dw_i0 != 0) break; | ||||
| 
 | ||||
|                 int dw_i1 = m_car->historySensor(i + 1).dw; | ||||
|                 int dw_i2 = m_car->historySensor(i + 2).dw; | ||||
|                 if(sori.dw >= sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(sori.dw + 1 == sor.dw && sori.lhq == SNOT) break; | ||||
| 
 | ||||
|                 if(dw_i1 >= sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(dw_i1 + 1 == sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(sori.dw == 0) | ||||
|                     btemp1 = true; | ||||
|                 if(sori.lhq == SYES) | ||||
|                     btemp2 = true; | ||||
|                 if(ksdd == siteof::shandong) | ||||
|                     btemp2 = true; | ||||
|                 if(ksdd == siteof::scms || ksdd == siteof::hnay || ksdd == siteof::lfgakm3) | ||||
|                     btemp1 = true; | ||||
|                 if(btemp1 && btemp2) | ||||
|                     btempkf = true; | ||||
| 
 | ||||
|                 if(dw_i1 < sor.dw  && dw_i1 > 0 && dw_i1 == dw_i2) | ||||
|                 if(sori.dw < sor.dw && HIS(i+1) == sori.dw && sori.dw > 0) | ||||
|                 { | ||||
|                     if(sor.dw - dw_i1 > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt) | ||||
|                     if(sor.dw - sori.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt && btempkf) | ||||
|                     { | ||||
|                         bool FindFlag = false; | ||||
|                         if(ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                         { | ||||
|                             FindFlag = true; | ||||
|                         } | ||||
| 
 | ||||
|                         TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
 | ||||
|                         if(item14 && item14->TestPro > ItemProFlagIdle) | ||||
|                         { | ||||
|                             FindFlag = true; | ||||
|                         } | ||||
|                         if(FindFlag == true) | ||||
|                         if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                         { | ||||
|                             JUDGE_MARK_SUB3(14, "01", true); | ||||
|                         } | ||||
| @ -4669,12 +4702,18 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|     } | ||||
|     else if(m_itemvCJH.yjjdcxsj == 1) | ||||
|     { | ||||
|         const TSensorInfo& sor2 = m_car->historySensor(2); | ||||
|         const TSensorInfo& sor3 = m_car->historySensor(3); | ||||
|         const TSensorInfo& sor4 = m_car->historySensor(4); | ||||
|         if(sor.dw == sor1.dw && sor.dw == sor2.dw && sor.dw == sor3.dw && sor.dw == sor4.dw && | ||||
|                 sor.dw > 0 && sor.dw < 9 && sor.lhq == SNOT && sor4.lhq == SNOT && gps.sd > 5 && | ||||
|                 !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
 | ||||
|         bool ix = 0; | ||||
|         if(sor.lhq == SNOT && sor1.lhq == SNOT) | ||||
|         { | ||||
|             ix = 1; | ||||
|         } | ||||
|         if(ksdd == siteof::lfgakm3) | ||||
|         { | ||||
|             ix = 1; | ||||
|         } | ||||
|         if(sor.dw == HIS(1) && sor.dw == HIS(2) && sor.dw == HIS(3) && sor.dw == HIS(4) && | ||||
|                 sor.dw > 0 && sor.dw < 9 && sor.lhq == SNOT && sor1.lhq == SNOT && | ||||
|                 gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
 | ||||
|         { | ||||
|             for(int i = 5; i <= 55; i++) | ||||
|             { | ||||
| @ -4685,35 +4724,29 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
| 
 | ||||
|                 const TChuanGan* hisi = m_car->historyChuanGan(i); | ||||
|                 const TSensorInfo& sori  = hisi->real.sensor; | ||||
|                 int dw_i0 = sori.dw; | ||||
|                 if(dw_i0 != 0) break; | ||||
| 
 | ||||
|                 int dw_i1 = m_car->historySensor(i + 1).dw; | ||||
|                 int dw_i2 = m_car->historySensor(i + 2).dw; | ||||
|                 int dw_i3 = m_car->historySensor(i + 3).dw; | ||||
|                 int dw_i4 = m_car->historySensor(i + 4).dw; | ||||
|                 int dw_i5 = m_car->historySensor(i + 5).dw; | ||||
|                 if(sori.dw > sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(sori.dw + 1 == sor.dw && sori.lhq == SNOT) break; | ||||
| 
 | ||||
|                 if(dw_i1 > sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(dw_i1 + 1 == sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(sori.dw == 0) | ||||
|                     btemp1 = true; | ||||
|                 if(sori.lhq == SYES) | ||||
|                     btemp2 = true; | ||||
|                 if(ksdd == siteof::shandong) | ||||
|                     btemp2 = true; | ||||
|                 if(ksdd == siteof::scms || ksdd == siteof::hnay || ksdd == siteof::lfgakm3) | ||||
|                     btemp1 = true; | ||||
|                 if(btemp1 && btemp2) | ||||
|                     btempkf = true; | ||||
| 
 | ||||
|                 if(dw_i1 < sor.dw && dw_i1 > 0 && | ||||
|                    dw_i2 == dw_i1 && dw_i3 == dw_i1 && dw_i4 == dw_i1 && dw_i5 == dw_i1) | ||||
|                 if(sori.dw < sor.dw && | ||||
|                    HIS(i+1) == sori.dw && HIS(i+2) == sori.dw && | ||||
|                    HIS(i+3) == sori.dw && HIS(i+4) == sori.dw && sori.dw > 0) | ||||
|                 { | ||||
|                     if(sor.dw - dw_i1 > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt) | ||||
|                     if(sor.dw - sori.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt && btempkf) | ||||
|                     { | ||||
|                         bool FindFlag = false; | ||||
|                         if(ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                         { | ||||
|                             FindFlag = true; | ||||
|                         } | ||||
| 
 | ||||
|                         TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
 | ||||
|                         if(item14 && item14->TestPro > ItemProFlagIdle) | ||||
|                         { | ||||
|                             FindFlag = true; | ||||
|                         } | ||||
|                         if(FindFlag == true) | ||||
|                         if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                         { | ||||
|                             JUDGE_MARK_SUB3(14, "01", true); | ||||
|                         } | ||||
| @ -4730,18 +4763,20 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|     } | ||||
|     else if(m_itemvCJH.yjjdcxsj == 2) | ||||
|     { | ||||
|         const TSensorInfo& sor3 = m_car->historySensor(3); | ||||
|         const TSensorInfo& sor4 = m_car->historySensor(4); | ||||
|         const TSensorInfo& sor5 = m_car->historySensor(5); | ||||
|         const TSensorInfo& sor6 = m_car->historySensor(6); | ||||
|         const TSensorInfo& sor7 = m_car->historySensor(7); | ||||
|         const TSensorInfo& sor8 = m_car->historySensor(8); | ||||
|         bool ix = 0; | ||||
|         if(sor.lhq == SNOT && sor2.lhq == SNOT) | ||||
|         { | ||||
|             ix = 1; | ||||
|         } | ||||
|         if(ksdd == siteof::lfgakm3) | ||||
|         { | ||||
|             ix = 1; | ||||
|         } | ||||
| 
 | ||||
|         if(sor.dw == sor1.dw && sor.dw == sor2.dw && sor.dw == sor3.dw && | ||||
|                 sor.dw == sor4.dw && sor.dw == sor5.dw && sor.dw == sor6.dw && | ||||
|                 sor.dw == sor7.dw && sor.dw == sor8.dw && sor.dw > 0 && | ||||
|                 sor.dw < 9 && sor.lhq == SNOT && sor2.lhq == SNOT && | ||||
|                 gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
 | ||||
|         if(sor.dw == HIS(1) && sor.dw == HIS(2) && sor.dw == HIS(3) && | ||||
|                 sor.dw == HIS(4) && sor.dw == HIS(5) && sor.dw == HIS(6) && | ||||
|                 sor.dw == HIS(7) && sor.dw == HIS(8) && sor.dw > 0 && sor.dw < 9 && | ||||
|                 ix == 1 && gps.sd > 5 && !IS_C2(m_carType) && !IS_C5(m_carType)) //增加了车速>5 20151214
 | ||||
|         { | ||||
|             for(int i = 9; i < 59; i++) | ||||
|             { | ||||
| @ -4751,44 +4786,31 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|                 } | ||||
|                 const TChuanGan* hisi = m_car->historyChuanGan(i); | ||||
|                 const TSensorInfo& sori = hisi->real.sensor; | ||||
|                 int dw_i0 = sori.dw; | ||||
|                 if(dw_i0 != 0) break; | ||||
| 
 | ||||
|                 int dw_i1 = m_car->historySensor(i + 1).dw; | ||||
|                 int dw_i2 = m_car->historySensor(i + 2).dw; | ||||
|                 int dw_i3 = m_car->historySensor(i + 3).dw; | ||||
|                 int dw_i4 = m_car->historySensor(i + 4).dw; | ||||
|                 int dw_i5 = m_car->historySensor(i + 5).dw; | ||||
|                 int dw_i6 = m_car->historySensor(i + 6).dw; | ||||
|                 int dw_i7 = m_car->historySensor(i + 7).dw; | ||||
|                 int dw_i8 = m_car->historySensor(i + 8).dw; | ||||
|                 int dw_i9 = m_car->historySensor(i + 9).dw; | ||||
|                 int dw_i10 = m_car->historySensor(i + 10).dw; | ||||
|                 if(sori.dw > sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(sori.dw + 1 == sor.dw && sori.lhq == SNOT) break; | ||||
| 
 | ||||
|                 if(dw_i1 > sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(dw_i1 + 1 == sor.dw && sori.lhq == SNOT) break; | ||||
|                 if(sori.dw == 0) | ||||
|                     btemp1 = true; | ||||
|                 if(sori.lhq == SYES) | ||||
|                     btemp2 = true; | ||||
|                 if(ksdd == siteof::shandong) | ||||
|                     btemp2 = true; | ||||
|                 if(ksdd == siteof::scms || ksdd == siteof::hnay || ksdd == siteof::lfgakm3) | ||||
|                     btemp1 = true; | ||||
|                 if(btemp1 && btemp2) | ||||
|                     btempkf = true; | ||||
| 
 | ||||
|                 if(dw_i1 < sor.dw && dw_i1 > 0 && dw_i2 == dw_i1 && dw_i3 == dw_i1 && | ||||
|                    dw_i4 == dw_i1 && dw_i5 == dw_i1 && dw_i6 == dw_i1 && dw_i7 == dw_i1 && | ||||
|                         dw_i8 == dw_i1 && dw_i9 == dw_i1 && dw_i10 == dw_i1) | ||||
|                 if(sori.dw < sor.dw  && | ||||
|                    HIS(i+1) == sori.dw && HIS(i+2) == sori.dw && HIS(i+3) == sori.dw && | ||||
|                    HIS(i+4) == sori.dw && HIS(i+5) == sori.dw && HIS(i+6) == sori.dw && | ||||
|                    HIS(i+7) == sori.dw && HIS(i+8) == sori.dw && HIS(i+9) == sori.dw && sori.dw > 0) | ||||
|                 { | ||||
|                     if(sor.dw - dw_i1 > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt) | ||||
|                     if(sor.dw - sori.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt && btempkf) | ||||
|                     { | ||||
|                         bool FindFlag = false; | ||||
|                         if(ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                         { | ||||
|                             FindFlag = true; | ||||
|                         } | ||||
| 
 | ||||
|                         TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
 | ||||
|                         if(item14 && item14->TestPro > ItemProFlagIdle) | ||||
|                         if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                         { | ||||
|                             FindFlag = true; | ||||
|                         } | ||||
|                         if(FindFlag == true) | ||||
|                         { | ||||
|                             //安卓档位评判好像逻辑上做了优化,比方说越级加档,中间必须出现 0 才判,1 跳 3 的情况,没出现 0 不判
 | ||||
|                             //项目经理吉说的先按照这样做
 | ||||
|                             JUDGE_MARK_SUB3(14, "01", true); | ||||
|                         } | ||||
|                         else | ||||
| @ -4809,44 +4831,23 @@ void Sub3Judge20Comm::Judge_YueJi_JiaJianDang() | ||||
|                     { | ||||
|                         break; | ||||
|                     } | ||||
| 
 | ||||
|                     const TChuanGan* hisi = m_car->historyChuanGan(i); | ||||
|                     const TSensorInfo& sori = hisi->real.sensor; | ||||
|                     int dw_i0 = sori.dw; | ||||
| 
 | ||||
|                     int dw_i1 = m_car->historySensor(i + 1).dw; | ||||
|                     int dw_i2 = m_car->historySensor(i + 2).dw; | ||||
|                     int dw_i3 = m_car->historySensor(i + 3).dw; | ||||
|                     int dw_i4 = m_car->historySensor(i + 4).dw; | ||||
|                     int dw_i5 = m_car->historySensor(i + 5).dw; | ||||
|                     int dw_i6 = m_car->historySensor(i + 6).dw; | ||||
|                     int dw_i7 = m_car->historySensor(i + 7).dw; | ||||
|                     int dw_i8 = m_car->historySensor(i + 8).dw; | ||||
|                     int dw_i9 = m_car->historySensor(i + 9).dw; | ||||
| 
 | ||||
|                     if(dw_i0 == 9)  break; | ||||
|                     if(sori.dw == 9)  break; | ||||
|                     if(hisi->move != moveForward) break; | ||||
|                     if(dw_i0 < sor.dw && sori.lhq == SNOT) break; | ||||
|                     if(dw_i0 - 1 == sor.dw && sori.lhq == SNOT) break; | ||||
|                     if(sori.dw < sor.dw && sori.lhq == SNOT) break; | ||||
|                     if(sori.dw - 1 == sor.dw && sori.lhq == SNOT) break; | ||||
| 
 | ||||
|                     if(dw_i0 > sor.dw && dw_i0 > 0 && | ||||
|                             dw_i1 == dw_i0 && dw_i2 == dw_i0 && dw_i3 == dw_i0 && | ||||
|                             dw_i4 == dw_i0 && dw_i5 == dw_i0 && dw_i6 == dw_i0 && | ||||
|                             dw_i7 == dw_i0 && dw_i8 == dw_i0 && dw_i9 == dw_i0) | ||||
|                     if(sori.dw > sor.dw && | ||||
|                        HIS(i+1) == sori.dw && HIS(i+2) == sori.dw && HIS(i+3) == sori.dw && | ||||
|                        HIS(i+4) == sori.dw && HIS(i+5) == sori.dw && HIS(i+6) == sori.dw && | ||||
|                        HIS(i+7) == sori.dw && HIS(i+8) == sori.dw && HIS(i+9) == sori.dw && sori.dw > 0) | ||||
|                     { | ||||
|                         if(dw_i0 - sor.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt) | ||||
|                         if(sori.dw - sor.dw > 1 && m_itemvCJH.yjjdkfjs != hisi->tkCnt) | ||||
|                         { | ||||
|                             bool FindFlag = false; | ||||
|                             if(ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                             { | ||||
|                                 FindFlag = true; | ||||
|                             } | ||||
|                             TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //加减挡
 | ||||
|                             if(item14 && item14->TestPro > ItemProFlagIdle) | ||||
|                             { | ||||
|                                 FindFlag = true; | ||||
|                             } | ||||
|                             if(FindFlag == true) | ||||
|                             if((item14 && item14->TestPro > ItemProFlagIdle) || ksdd == siteof::JXNC || m_itemvCJH.qcyjjdkf == 1) | ||||
|                             { | ||||
|                                 JUDGE_MARK_SUB3(14, "01", true); | ||||
|                             } | ||||
|  | ||||
| @ -2439,23 +2439,35 @@ void Sub3Judge41Mndg::CheLiangGuZhang() | ||||
|                 a = 1; | ||||
|             } | ||||
|         } | ||||
|         if((a == 1) && ((ksdd != siteof::nj && sor.wd == SNOT) || ksdd == siteof::nj) && ((m_itemv.lstcstd == 1 && sor.shtd == SYES) || m_itemv.lstcstd != 1)) | ||||
|         if((a == 1) && ((ksdd != siteof::nj && sor.wd == SNOT) || ksdd == siteof::nj) && | ||||
|                 ((m_itemv.lstcstd == 1 && sor.shtd == SYES) || m_itemv.lstcstd != 1)) | ||||
|         { | ||||
|             if(m_itemv.Lt_LastChange_TM == 0) //表示没有灯光动作
 | ||||
|             { | ||||
|                 if(MilliSecondsBetween(gps.sj, m_itemv.Snd_Wav_End_TM) > m_itemv.P_CSOK_YanShi) | ||||
|                 int64 tm = MilliSecondsBetween(gps.sj, m_itemv.Snd_Wav_End_TM); | ||||
|                 if(tm > m_itemv.P_CSOK_YanShi) | ||||
|                 { | ||||
|                     m_itemv.Lt_YesID = true; | ||||
|                 } | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if(MilliSecondsBetween(gps.sj, m_itemv.Lt_LastChange_TM) >= m_itemv.P_YJGD_JT_YS) //正确的灯光持续了一段时间
 | ||||
|                 int64 tm = MilliSecondsBetween(gps.sj, m_itemv.Lt_LastChange_TM); | ||||
|                 if(tm >= m_itemv.P_YJGD_JT_YS) //正确的灯光持续了一段时间
 | ||||
|                 { | ||||
|                      m_itemv.Lt_YesID = true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         if(ksdd == siteof::shandong) | ||||
|         { | ||||
|             //地点版本shandong下,双跳灯信号开过就可以 20250415鸿蒙终端调试群说的,4月16日再次和军华当面确认的
 | ||||
|             if(sor.shtd == SYES && sor1.shtd == SYES) | ||||
|             { | ||||
|                 m_itemv.Lt_YesID = true; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         //20190308
 | ||||
|         if(ksdd == siteof::guizhou) | ||||
|         { | ||||
| @ -2469,7 +2481,8 @@ void Sub3Judge41Mndg::CheLiangGuZhang() | ||||
|             } | ||||
|         } | ||||
|         //总时间到 或 灯光操作正确
 | ||||
|         if(m_itemv.Lt_YesID == true || MilliSecondsBetween(gps.sj, m_itemv.Snd_Wav_End_TM) > m_itemv.P_zys) | ||||
|         int64 tm = MilliSecondsBetween(gps.sj, m_itemv.Snd_Wav_End_TM); | ||||
|         if(m_itemv.Lt_YesID == true || tm > m_itemv.P_zys) | ||||
|         { | ||||
|             if(m_itemv.Lt_YesID) | ||||
|             { | ||||
| @ -2495,7 +2508,8 @@ void Sub3Judge41Mndg::CheLiangGuZhang() | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if(a == 1 && ((ksdd != siteof::nj && sor.wd == 0) || ksdd == siteof::nj) && ((m_itemv.lstcstd == 1 && sor.shtd == SYES) || m_itemv.lstcstd != 1)) | ||||
|                 if(a == 1 && ((ksdd != siteof::nj && sor.wd == 0) || ksdd == siteof::nj) && | ||||
|                         ((m_itemv.lstcstd == 1 && sor.shtd == SYES) || m_itemv.lstcstd != 1)) | ||||
|                 { | ||||
|                     m_itemv.ItemNo = 0; | ||||
|                     m_itemv.stdjs = gps.sj; //20171018
 | ||||
|  | ||||
| @ -1141,6 +1141,9 @@ struct TCarBody | ||||
|     Pointi b1_b_G;    //挂车*GPS主天线
 | ||||
|     Pointi b2_b_G;    //挂车*GPS从天线
 | ||||
| 
 | ||||
|     const TGPSPoint& a(int idx) const { return points_a[idx]; } | ||||
|     const Pointi& b(int idx) const { return points_b[idx]; } | ||||
| 
 | ||||
|     TCarBody() noexcept { clean(); } | ||||
|     virtual ~TCarBody() noexcept { clean(); } | ||||
|     void clean() noexcept | ||||
| @ -1346,6 +1349,18 @@ struct TMeshDefine | ||||
|                       MapSubItemKeyLen,PointItemKeyLen,FangXiangDianKeyLen,RowNo,ColNo,Area); | ||||
| 
 | ||||
|     DISABLE_COPY_DECLARE_WITH(TMeshDefine); | ||||
| 
 | ||||
|     bool has(int roadIndex) const | ||||
|     { | ||||
|         for(int f = 0; f < MapRoadKeyLen; f++) | ||||
|         { | ||||
|             if(MapRoad_Keys[f] == roadIndex) | ||||
|             { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|         return false; | ||||
|     } | ||||
| }; | ||||
| using TMeshDefines = std::vector<TMeshDefine*>; | ||||
| 
 | ||||
| @ -1453,6 +1468,8 @@ struct TCar | ||||
| 
 | ||||
|     std::string         XSJL_Parm; | ||||
| 
 | ||||
|     int                 XiHuo = INVALID_INDEX; | ||||
| 
 | ||||
|     //档位转速比 2014111
 | ||||
|     struct TCarZsBl { int CarZsBmin = -1; int CarZsBMax = -1; }; | ||||
|     std::array<TCarZsBl, 7> DwZsBl; //20141111 档位转速比 档位转速比  array[1..5]
 | ||||
|  | ||||
| @ -26,6 +26,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) | ||||
|     int x = (sw - w) / 2; | ||||
|     int y = (sh - h) / 2; | ||||
|     setGeometry(x, y, w, h); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| MainWindow::~MainWindow() | ||||
| @ -70,6 +71,16 @@ void MainWindow::init() | ||||
|     KIT_CONNECT(updateNextDoing()); | ||||
|     KIT_CONNECT(updateCheckVersion(int, const QString&)); | ||||
| 
 | ||||
|     //connect(&m_audio, SIGNAL(QMediaPlayer::error(QMediaPlayer::Error)),
 | ||||
|     //        SLOT([&](QMediaPlayer::Error error)
 | ||||
|     //        {
 | ||||
|     //            QMediaPlayer::Error err = m_audio.error();
 | ||||
|     //            QString errStr = m_audio.errorString();
 | ||||
|     //
 | ||||
|     //            logwarning("paly-audio file:%s, err:%d-%s ",
 | ||||
|     //            filepath.toUtf8().data(), err, errStr.toUtf8().data());
 | ||||
|     //        }));
 | ||||
| 
 | ||||
|     m_ui->loop->clear(); | ||||
|     m_ui->loop->addItem(CL8("否"), false); | ||||
|     m_ui->loop->addItem(CL8("是"), true); | ||||
| @ -406,9 +417,16 @@ void MainWindow::playSoundVoice(const std::string& code) | ||||
|         logwarning("not-find-audio file:%s", filepath.toLocal8Bit().data()); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     m_audio.setMedia(QUrl::fromLocalFile(file)); | ||||
|     m_audio.play(); | ||||
| 
 | ||||
|     QMediaPlayer::Error err = m_audio.error(); | ||||
|     QString errStr = m_audio.errorString(); | ||||
|     if(err != QMediaPlayer::NoError) | ||||
|     { | ||||
|         logwarning("paly-audio file:%s, err:%d-%s ", | ||||
|                    filepath.toUtf8().data(), err, errStr.toUtf8().data()); | ||||
|     } | ||||
|     return; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -413,7 +413,7 @@ p, li { white-space: pre-wrap; } | ||||
|      <rect> | ||||
|       <x>600</x> | ||||
|       <y>180</y> | ||||
|       <width>101</width> | ||||
|       <width>111</width> | ||||
|       <height>20</height> | ||||
|      </rect> | ||||
|     </property> | ||||
| @ -426,7 +426,7 @@ p, li { white-space: pre-wrap; } | ||||
|      <rect> | ||||
|       <x>600</x> | ||||
|       <y>163</y> | ||||
|       <width>101</width> | ||||
|       <width>111</width> | ||||
|       <height>20</height> | ||||
|      </rect> | ||||
|     </property> | ||||
|  | ||||
| @ -35,9 +35,9 @@ export default class ServiceExtImpl extends IdlServiceExtStub { | ||||
|     }).catch(err => { | ||||
|       callback(0, JSON.stringify({ | ||||
|         code: 1, | ||||
|         data: JSON.stringify({ | ||||
|         data: { | ||||
|           code: 2300007 | ||||
|         }) | ||||
|         } | ||||
|       })); | ||||
|       console.log("lixiao paste error", JSON.stringify(err)) | ||||
|     }) | ||||
|  | ||||
							
								
								
									
										22
									
								
								entry/src/main/ets/common/service/logService.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								entry/src/main/ets/common/service/logService.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | ||||
| import fs from '@ohos.file.fs'; | ||||
| 
 | ||||
| 
 | ||||
| export function delLog(offset: number) { | ||||
|   try { | ||||
|     const path = "/mnt/hmdfs/100/account/device_view/local/files/duolun/logs" | ||||
|     const list = fs.listFileSync(path) | ||||
|     const now = new Date().getTime() | ||||
|     list.forEach(filename => { | ||||
|       const year = Number(filename.split("_")[0]) | ||||
|       const month = Number(filename.split("_")[1]) - 1 | ||||
|       const date = Number(filename.split("_")[2]) | ||||
|       const fileDate = new Date(year, month, date).getTime() | ||||
|       if (now - fileDate >= offset * 24 * 60 * 60 * 1000) { | ||||
|         fs.rmdirSync(path + "/" + filename) | ||||
|         console.log("lixiao delete log success path: ", path + "/" + filename) | ||||
|       } | ||||
|     }) | ||||
|   } catch (e) { | ||||
|     console.log("lixiao delete log error", JSON.stringify(e)) | ||||
|   } | ||||
| } | ||||
| @ -123,7 +123,7 @@ async function getfilehandleCode(td, param, dir, path, index) { | ||||
| 
 | ||||
| 
 | ||||
| export async function getUserAlbumItemByDisplayName(displayName: string, day?, | ||||
|   type?): Promise<photoAccessHelper.Album> { | ||||
|                                                     type?): Promise<photoAccessHelper.Album> { | ||||
|   let fetchResult = null | ||||
|   let album: photoAccessHelper.Album = null | ||||
|   try { | ||||
| @ -223,34 +223,61 @@ export async function takePhoto(param, context, dir, flag = 1, callback?) { | ||||
|   // @ts-ignore
 | ||||
|   // var snapResult = rtsp_server.getVideoSnapshot(context, video_uri, '', dir);
 | ||||
|   if (flag == 0) { | ||||
|     rtsp_server.detectVideoSnapshotSize(video_uri, fileName, (err, snapResult) => { | ||||
|       console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize); | ||||
|       callback({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode }) | ||||
|     }); | ||||
|     // return new
 | ||||
|     return new Promise<takePhotoParam>(async (resolve, reject) => { | ||||
|       rtsp_server.detectVideoSnapshotSize(video_uri, fileName, false, (err, snapResult) => { | ||||
|         console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize, snapResult.dataString); | ||||
|         callback && callback({ | ||||
|           fileSize: snapResult.fileSize, | ||||
|           errorCode: snapResult.errorCode, | ||||
|           base64: snapResult.dataString | ||||
|         }) | ||||
|         resolve({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode, base64: snapResult.dataString }) | ||||
|       }); | ||||
|     }) | ||||
| 
 | ||||
|   } else { | ||||
|     return new Promise<takePhotoParam>(async (resolve, reject) => { | ||||
|       const time = await getCurrentTime() | ||||
|       const date = time.split(' ')[0] | ||||
|       let dirName = dir ? dir : date | ||||
|       rtsp_server.getVideoSnapshot(context, video_uri, fileName, dirName, true, async (err, snapResult) => { | ||||
|       // const time = await getCurrentTime()
 | ||||
|       // const date = time.split(' ')[0]
 | ||||
|       // let dirName = dir ? dir : date
 | ||||
|       rtsp_server.detectVideoSnapshotSize(video_uri, fileName, true, (err, snapResult) => { | ||||
|         if (snapResult.result && snapResult.errorCode == 0) { | ||||
|           resolve({ | ||||
|             base64: snapResult.dataString, | ||||
|             name: snapResult.fileName, | ||||
|           console.log("baohaowen_detectLoop round end size1:" + snapResult.fileSize, snapResult.dataString); | ||||
|           callback && callback({ | ||||
|             fileSize: snapResult.fileSize, | ||||
|             errorCode: snapResult.errorCode, | ||||
|             path: snapResult.filePath | ||||
|             base64: snapResult.dataString | ||||
|           }) | ||||
|           resolve({ fileSize: snapResult.fileSize, errorCode: snapResult.errorCode, base64: snapResult.dataString }) | ||||
|         } else { | ||||
|           promptAction.showToast({ | ||||
|             message: `拍照失败`, | ||||
|             duration: 3000 | ||||
|           }); | ||||
|           reject(false) | ||||
|           // reject()
 | ||||
|         } | ||||
| 
 | ||||
|       }); | ||||
|       // rtsp_server.getVideoSnapshot(context, video_uri, fileName, dirName, true, async (err, snapResult) => {
 | ||||
|       //   if (snapResult.result && snapResult.errorCode == 0) {
 | ||||
|       //     resolve({
 | ||||
|       //       base64: snapResult.dataString,
 | ||||
|       //       name: snapResult.fileName,
 | ||||
|       //       fileSize: snapResult.fileSize,
 | ||||
|       //       errorCode: snapResult.errorCode,
 | ||||
|       //       path: snapResult.filePath
 | ||||
|       //     })
 | ||||
|       //   } else {
 | ||||
|       //     promptAction.showToast({
 | ||||
|       //       message: `拍照失败`,
 | ||||
|       //       duration: 3000
 | ||||
|       //     });
 | ||||
|       //     reject(false)
 | ||||
|       //     // reject()
 | ||||
|       //   }
 | ||||
|       //
 | ||||
|       // });
 | ||||
|     }) | ||||
|   } | ||||
| } | ||||
| @ -268,7 +295,7 @@ export async function deleteAllFileByPiC(dirName, type = 1) { | ||||
| } | ||||
| 
 | ||||
| export async function deleteAllVideos(context, type: photoAccessHelper.AlbumType, | ||||
|   subType: photoAccessHelper.AlbumSubtype): Promise<void> { | ||||
|                                       subType: photoAccessHelper.AlbumSubtype): Promise<void> { | ||||
|   let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = null; | ||||
|   try { | ||||
|     const userFileMgr = photoAccessHelper.getPhotoAccessHelper(context); | ||||
|  | ||||
| @ -3,6 +3,8 @@ import { getSyncData } from '../service/initable'; | ||||
| import hilog from '@ohos.hilog'; | ||||
| import FileUtil from '../../common/utils/File' | ||||
| import { GlobalConfig } from '../../config/index' | ||||
| const TAG = 'socketTag[TcpDemo.TcpClient]' | ||||
| 
 | ||||
| export async function getTCP(flag=false) { | ||||
|   globalThis.getCloseTcp=true | ||||
|   const fileUtil = new FileUtil(globalThis.context) | ||||
| @ -28,10 +30,16 @@ export async function getTCP(flag=false) { | ||||
|           console.log('ttttttt00') | ||||
| 
 | ||||
|           clearInterval(globalThis.intervalSendmsg) | ||||
|           globalThis.intervalSendmsg=setInterval(()=>{ | ||||
|           globalThis.intervalSendmsg=setInterval(async ()=>{ | ||||
|             console.log('getCloseTcp',globalThis.carInfo.carNo) | ||||
|             if(!globalThis.getCloseTcp){ | ||||
|               globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
 | ||||
|               await globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
 | ||||
|               globalThis.tcpStep+=1 | ||||
|               if(globalThis.tcpStep>30){ | ||||
|                 console.log(TAG,'tcp重连开始') | ||||
|                 globalThis.tcpStep=0 | ||||
|                 getTCP() | ||||
|               } | ||||
|             } | ||||
|           },1000/3) | ||||
|           globalThis.TcpClient.onError((val) => { | ||||
| @ -63,10 +71,16 @@ export async function getTCP(flag=false) { | ||||
|       console.log('ttttttt12') | ||||
| 
 | ||||
|       clearInterval(globalThis.intervalSendmsg) | ||||
|       globalThis.intervalSendmsg=setInterval(()=>{ | ||||
|       globalThis.intervalSendmsg=setInterval(async ()=>{ | ||||
|         // console.log('getCloseTcp',globalThis.getCloseTcp)
 | ||||
|         if(!globalThis.getCloseTcp){ | ||||
|           globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
 | ||||
|           await globalThis.TcpClient.sendMsg(globalThis.carInfo.carNo) //1002
 | ||||
|           globalThis.tcpStep+=1 | ||||
|           if(globalThis.tcpStep>30){ | ||||
|             globalThis.tcpStep=0 | ||||
|             getTCP() | ||||
|             console.log(TAG,'tcp重连开始') | ||||
|           } | ||||
|         } | ||||
|       },1000/3) | ||||
|       globalThis.TcpClient.onError((val) => { | ||||
|  | ||||
| @ -4,25 +4,25 @@ import { getSyncData } from '../service/initable' | ||||
| import { getChuankouFn } from '../../common/service/indexService' | ||||
| import FileUtil from '../../common/utils/File' | ||||
| import { GlobalConfig } from '../../config/index' | ||||
| import {Array2Byte,fillZero,string2Bytes}from './tools' | ||||
| import { Array2Byte, fillZero, string2Bytes } from './tools' | ||||
| import emitter from '@ohos.events.emitter'; | ||||
| 
 | ||||
| export async function sendMsg(val) { | ||||
|   // globalThis.udpClient1&&globalThis.udpClient1.sendMsg(val)
 | ||||
| } | ||||
| 
 | ||||
| export async function getUDP(context,errorFlag?) { | ||||
|   return new Promise(async (reslove,reject)=>{ | ||||
| export async function getUDP(context, errorFlag?) { | ||||
|   return new Promise(async (reslove, reject) => { | ||||
|     const fileUtil = new FileUtil(context) | ||||
|     const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt'); | ||||
|     console.log('ttttt',data) | ||||
|     console.log('ttttt', data) | ||||
|     if (data === '' || data === undefined) { | ||||
|       console.log(` getUDP  has no IPConfigTable `); | ||||
|       globalThis.udpClient = {} | ||||
|       globalThis.host = '' | ||||
|       reslove('') | ||||
|     } else { | ||||
|       const result=JSON.parse(data) | ||||
|       const result = JSON.parse(data) | ||||
|       console.log(` getUDP  has IPConfigTable `); | ||||
|       if (globalThis.udpClient && globalThis.udpClient.closeUdp) { | ||||
|         console.log(` getUDP  has udclent close and rebind `); | ||||
| @ -31,11 +31,11 @@ export async function getUDP(context,errorFlag?) { | ||||
|             globalThis.udpClient.rebindUdp(result.udplocalIp, result.udplocalIpPort, result.udpOppositeIp, result.udpOppositeIpPort) | ||||
|             globalThis.udpClient.sendMsg('111', null) | ||||
|             globalThis.host = `http://${result.centerIp}:${result.centerPort}` | ||||
|             globalThis.udpClient.onError_Callback(()=>{ | ||||
|             globalThis.udpClient.onError_Callback(() => { | ||||
|               console.log('getUDPgetUDPgetUDP') | ||||
|               getUDP(context,true) | ||||
|               if(errorFlag&&globalThis.udpClient&&globalThis.udpClient.onMessage_1){ | ||||
|                 globalThis.udpClient.onMessage_1=globalThis.udpClient.onMessage_1 | ||||
|               getUDP(context, true) | ||||
|               if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) { | ||||
|                 globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1 | ||||
|               } | ||||
|             }) | ||||
|             reslove(`http://${result.centerIp}:${result.centerPort}`) | ||||
| @ -48,21 +48,21 @@ export async function getUDP(context,errorFlag?) { | ||||
|       else { | ||||
|         // 未绑定
 | ||||
|         console.log(` getUDP  has no  udclent and  bind `); | ||||
|         console.log('ttttttdata',JSON.stringify(result)) | ||||
|         console.log('ttttttdata', JSON.stringify(result)) | ||||
|         const udpClient: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, result.udplocalIpPort, result.udpOppositeIp, result.udpOppositeIpPort) | ||||
|         udpClient.bindUdp() | ||||
|         udpClient.sendMsg('111') | ||||
|         globalThis.host = `http://${result.centerIp}:${result.centerPort}` | ||||
|         globalThis.udpClient = udpClient | ||||
| 
 | ||||
|         globalThis.udpClient.onMessage_1(()=>{ | ||||
|         globalThis.udpClient.onMessage_1(() => { | ||||
|           console.log('getUDPonMessage_1msgmsgByGloalUdp') | ||||
| 
 | ||||
|         }) | ||||
|         globalThis.udpClient.onError_Callback(()=>{ | ||||
|           getUDP(context,true) | ||||
|           if(errorFlag&&globalThis.udpClient&&globalThis.udpClient.onMessage_1){ | ||||
|             globalThis.udpClient.onMessage_1=globalThis.udpClient.onMessage_1 | ||||
|         globalThis.udpClient.onError_Callback(() => { | ||||
|           getUDP(context, true) | ||||
|           if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) { | ||||
|             globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1 | ||||
|           } | ||||
|         }) | ||||
|         getChuankouFn() | ||||
| @ -82,11 +82,11 @@ export async function getUDP(context,errorFlag?) { | ||||
|               globalThis.udpClient.rebindUdp(result[0].udplocalIp, result[0].udplocalIpPort, result[0].udpOppositeIp, result[0].udpOppositeIpPort) | ||||
|               globalThis.udpClient.sendMsg('111', null) | ||||
|               globalThis.host = `http://${result[0].centerIp}:${result[0].centerPort}` | ||||
|               globalThis.udpClient.onError_Callback(()=>{ | ||||
|               globalThis.udpClient.onError_Callback(() => { | ||||
|                 console.log('getUDPgetUDPgetUDP') | ||||
|                 getUDP(true,context) | ||||
|                 if(errorFlag&&globalThis.udpClient&&globalThis.udpClient.onMessage_1){ | ||||
|                   globalThis.udpClient.onMessage_1=globalThis.udpClient.onMessage_1 | ||||
|                 getUDP(true, context) | ||||
|                 if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) { | ||||
|                   globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1 | ||||
|                 } | ||||
|               }) | ||||
|               reslove(`http://${result[0].centerIp}:${result[0].centerPort}`) | ||||
| @ -105,14 +105,14 @@ export async function getUDP(context,errorFlag?) { | ||||
|           globalThis.host = `http://${result[0].centerIp}:${result[0].centerPort}` | ||||
|           globalThis.udpClient = udpClient | ||||
| 
 | ||||
|           globalThis.udpClient.onMessage_1(()=>{ | ||||
|           globalThis.udpClient.onMessage_1(() => { | ||||
|             console.log('getUDPonMessage_1msgmsgByGloalUdp') | ||||
| 
 | ||||
|           }) | ||||
|           globalThis.udpClient.onError_Callback(()=>{ | ||||
|             getUDP(true,context) | ||||
|             if(errorFlag&&globalThis.udpClient&&globalThis.udpClient.onMessage_1){ | ||||
|               globalThis.udpClient.onMessage_1=globalThis.udpClient.onMessage_1 | ||||
|           globalThis.udpClient.onError_Callback(() => { | ||||
|             getUDP(true, context) | ||||
|             if (errorFlag && globalThis.udpClient && globalThis.udpClient.onMessage_1) { | ||||
|               globalThis.udpClient.onMessage_1 = globalThis.udpClient.onMessage_1 | ||||
|             } | ||||
|           }) | ||||
|           // udpClient.onError_resend(globalThis.udpClient.onMessage_1?globalThis.udpClient.onMessage_1:()=>{})
 | ||||
| @ -140,25 +140,25 @@ export async function getUDP(context,errorFlag?) { | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| export async function getUDP2(context,errorFlag?) { | ||||
| export async function getUDP2(context, errorFlag?) { | ||||
|   const fileUtil = new FileUtil(context) | ||||
|   const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/ipConfig.txt'); | ||||
|   if (data === '' || data === undefined) { | ||||
|     globalThis.udpClient2 = {} | ||||
|     globalThis.udpClient2.setMsgCallBack = () => { | ||||
|     } | ||||
|   }else{ | ||||
|     const result=JSON.parse(data) | ||||
|   } else { | ||||
|     const result = JSON.parse(data) | ||||
|     console.log(` getUDP2  has IPConfigTable `); | ||||
|     if (globalThis.udpClient2 && globalThis.udpClient2.closeUdp) { | ||||
|       console.log(` getUDP2  has udclent ,close and rebind `); | ||||
|       globalThis.udpClient2.closeUdp(async () => { | ||||
|         setTimeout(() => { | ||||
|           globalThis.udpClient2.rebindUdp(result.udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort) | ||||
|           globalThis.udpClient2.onError_Callback(()=>{ | ||||
|             getUDP2(context,true); | ||||
|             if(errorFlag&&globalThis.udpClient2&&globalThis.udpClient2.onMessage_2){ | ||||
|               globalThis.udpClient2.onMessage_2=globalThis.udpClient2.onMessage_2 | ||||
|           globalThis.udpClient2.onError_Callback(() => { | ||||
|             getUDP2(context, true); | ||||
|             if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) { | ||||
|               globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2 | ||||
|             } | ||||
|           }) | ||||
|         }, 1000) | ||||
| @ -170,31 +170,32 @@ export async function getUDP2(context,errorFlag?) { | ||||
|       const udpClient2: UdpClientByCenter = new UdpClientByCenter(result.udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort) | ||||
|       console.info('surenjun udp2=> ', globalThis.carInfo?.messagePort) | ||||
|       await udpClient2.bindUdp() | ||||
|       await udpClient2.onError_Callback(()=>{ | ||||
|         getUDP2(context,true); | ||||
|         if(errorFlag&&globalThis.udpClient2&&globalThis.udpClient2.onMessage_2){ | ||||
|           globalThis.udpClient2.onMessage_2=globalThis.udpClient2.onMessage_2 | ||||
|       await udpClient2.onError_Callback(() => { | ||||
|         getUDP2(context, true); | ||||
|         if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) { | ||||
|           globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2 | ||||
|         } | ||||
|       }) | ||||
|       if(!errorFlag){ | ||||
|       if (!errorFlag) { | ||||
|         await udpClient2.onMessage_2((val) => { | ||||
|           if (val.id == '32') { | ||||
|             globalThis.signNum = val.body[1] | ||||
|             if(val.body[0] == 5){ | ||||
|             if (val.body[0] == 5) { | ||||
|               console.info('surenjun', `接收到平台扣分请求,请求指令为:${val.body[1]}`) | ||||
|               globalThis.udpEvent.sendOnKf(val.body[1]) | ||||
|             } | ||||
|             if(val.body[0] == 11){ | ||||
|               console.info('surenjun','GlobalUdp收到beginExam事件') | ||||
|             if (val.body[0] == 11) { | ||||
|               console.info('surenjun', 'GlobalUdp收到beginExam事件') | ||||
|               globalThis.udpEvent.sendBeginExam(val.body[1]) | ||||
|             } | ||||
|             if(val.body[0] == 12){ | ||||
|               console.info('surenjun','GlobalUdp收到endExam事件') | ||||
|             if (val.body[0] == 12) { | ||||
|               console.info('surenjun', 'GlobalUdp收到endExam事件') | ||||
|               globalThis.udpEvent.sendEndExam(val.body[1]) | ||||
|             } | ||||
|           }if (val.id == '36'){ | ||||
|           } | ||||
|           if (val.id == '36') { | ||||
|             //获取远程扣分内容
 | ||||
|             console.info('surenjun','考车收到远程扣分项目内容,扣分代码:' + val.body[0]) | ||||
|             console.info('surenjun', '考车收到远程扣分项目内容,扣分代码:' + val.body[0]) | ||||
|             globalThis.udpEvent.sendKfContent(val.body[0]) | ||||
|           } else if (val.id == '46') { | ||||
|             let tmpList = [] | ||||
| @ -226,10 +227,10 @@ export async function getUDP2(context,errorFlag?) { | ||||
|         globalThis.udpClient2.closeUdp(async () => { | ||||
|           setTimeout(() => { | ||||
|             globalThis.udpClient2.rebindUdp(result[0].udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort) | ||||
|             globalThis.udpClient2.onError_Callback(()=>{ | ||||
|             globalThis.udpClient2.onError_Callback(() => { | ||||
|               getUDP2(true); | ||||
|               if(errorFlag&&globalThis.udpClient2&&globalThis.udpClient2.onMessage_2){ | ||||
|                 globalThis.udpClient2.onMessage_2=globalThis.udpClient2.onMessage_2 | ||||
|               if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) { | ||||
|                 globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2 | ||||
|               } | ||||
|             }) | ||||
|           }, 1000) | ||||
| @ -240,13 +241,13 @@ export async function getUDP2(context,errorFlag?) { | ||||
|         console.log(` getUDP2  has no  udclent and  bind `); | ||||
|         const udpClient2: UdpClientByCenter = new UdpClientByCenter(result[0].udplocalIp, '8800', globalThis.carInfo?.udpAddress, globalThis.carInfo?.messagePort) | ||||
|         await udpClient2.bindUdp() | ||||
|         await udpClient2.onError_Callback(()=>{ | ||||
|         await udpClient2.onError_Callback(() => { | ||||
|           getUDP2(true); | ||||
|           if(errorFlag&&globalThis.udpClient2&&globalThis.udpClient2.onMessage_2){ | ||||
|             globalThis.udpClient2.onMessage_2=globalThis.udpClient2.onMessage_2 | ||||
|           if (errorFlag && globalThis.udpClient2 && globalThis.udpClient2.onMessage_2) { | ||||
|             globalThis.udpClient2.onMessage_2 = globalThis.udpClient2.onMessage_2 | ||||
|           } | ||||
|         }) | ||||
|         if(!errorFlag){ | ||||
|         if (!errorFlag) { | ||||
|           await udpClient2.onMessage_2((val) => { | ||||
|             if (val.id == '32') { | ||||
|               globalThis.signNum = val.body[1] | ||||
| @ -320,11 +321,13 @@ export async function setJudgeUdp() { | ||||
|       globalThis.carInfo?.udpAddress, | ||||
|       globalThis.carInfo?.hintPort | ||||
|     ) | ||||
|     console.info('surenjun hintPort=> ',globalThis.carInfo?.hintPort) | ||||
|     console.info('surenjun hintPort=> ', globalThis.carInfo?.hintPort) | ||||
| 
 | ||||
|     await udpClientbyCenter.onError_Callback(()=>{}) | ||||
|     await udpClientbyCenter.onError_Callback(() => { | ||||
|     }) | ||||
|     await udpClientbyCenter.bindUdp() | ||||
|     await udpClientbyCenter.onMessage_2((val) => {}) | ||||
|     await udpClientbyCenter.onMessage_2((val) => { | ||||
|     }) | ||||
| 
 | ||||
|     //远程监听开始考试、结束考试、扣分指令
 | ||||
| 
 | ||||
| @ -343,7 +346,7 @@ export async function setJudgeUdp() { | ||||
|       }, | ||||
| 
 | ||||
|       //申请远程扣分查询
 | ||||
|       askKf(directives){ | ||||
|       askKf(directives) { | ||||
|         globalThis.udpClient2.sendMsgExt({ | ||||
|           id: 35, | ||||
|           list: [directives], | ||||
| @ -354,17 +357,27 @@ export async function setJudgeUdp() { | ||||
|       }, | ||||
| 
 | ||||
|       //确定远程扣分
 | ||||
|       confirmKf(directives,code){ | ||||
|       confirmKf(directives, code) { | ||||
|         globalThis.udpClient2.sendMsgExt({ | ||||
|           id: 37, | ||||
|           list: Array2Byte([string2Bytes(directives,8),string2Bytes(code,8)]), | ||||
|           list: Array2Byte([string2Bytes(directives, 8), string2Bytes(code, 8)]), | ||||
|           carNo: globalThis.carInfo.carNo, | ||||
|           placeId: globalThis.carInfo.examinationRoomId | ||||
|         }) | ||||
|         console.info('surenjun', `考车发送确定扣分指令,指令为:${directives}`) | ||||
|       }, | ||||
|       //申请语音对讲
 | ||||
|       askVoice() { | ||||
|         globalThis.udpClient2.sendMsgExt({ | ||||
|           id: 49, | ||||
|           list: [], | ||||
|           carNo: globalThis.carInfo.carNo, | ||||
|           placeId: globalThis.carInfo.examinationRoomId, | ||||
|         }) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // globalThis.udpClient.bindUdp()
 | ||||
|  | ||||
| @ -156,7 +156,7 @@ export default class TcpClient { | ||||
|         //   time:dateFormat(new Date()),
 | ||||
|         //   message: `${TAG} TCPsend error ${JSON.stringify(err)}`,
 | ||||
|         // })
 | ||||
|         reslove(false) | ||||
|         reject(false) | ||||
|       }); | ||||
|     }) | ||||
|   } | ||||
| @ -167,6 +167,7 @@ export default class TcpClient { | ||||
|       //   time:dateFormat(new Date()),
 | ||||
|       //   PLC:`${TAG} Tcponmessage`,
 | ||||
|       // })
 | ||||
|       globalThis.tcpStep=0 | ||||
|       globalThis.tcpUdpError = false | ||||
| 
 | ||||
|       // console.log('messageLengt',,value.message.length))
 | ||||
|  | ||||
| @ -60,8 +60,8 @@ export const getMessageHeartbeat = async (msg) => { | ||||
|   const {fourInOneScreen:{gpsDigit}} = judgeConfig | ||||
|   const asclshArr = stringToASC(fillZero( | ||||
|     globalThis.singlePlay | ||||
|       ? '1111111111111' | ||||
|       : globalThis.lsh, | ||||
|       ? (examSubject == 2 ? '0000000000000' : '0000000000000') | ||||
|       : (globalThis.lsh ||  '0000000000000'), | ||||
|     13)); | ||||
|   const ascksyhArr = stringToASC(fillZero(examSubject == 2 ? '0000000000000':'1111111111111', 13)) | ||||
|   const ascsbxhArr = stringToASC('00000000') | ||||
|  | ||||
| @ -26,7 +26,7 @@ export const GlobalConfig={ | ||||
|     //济南
 | ||||
|     jn:{ | ||||
|       km2:[], | ||||
|       km3:['2025.04.16.01','2023.09.30.1'] | ||||
|       km3:['2023.12.13.01','2023.09.30.1'] | ||||
|     }, | ||||
|     //洛阳
 | ||||
|     ly:{ | ||||
|  | ||||
| @ -52,13 +52,11 @@ export default class EntryAbility extends UIAbility { | ||||
|     globalThis.deviceNo = ''; | ||||
|     globalThis.hasAuth = false | ||||
| 
 | ||||
|     // globalThis.judgeVersion ='2024.08.24.1' | ||||
|     // globalThis.version ='2023.12.13.01'; | ||||
|     globalThis.version = GlobalConfig.version.jn.km3[0]; | ||||
|     globalThis.judgeVersion = await examJudgeVersion(); | ||||
|     globalThis.judgeVersion = GlobalConfig.version.jn.km3[1]; | ||||
|     globalThis.tcpSendNum = 0 | ||||
|     globalThis.videoVersion = '1.0' | ||||
| 
 | ||||
|     globalThis.tcpStep=0 | ||||
|     //视频遮挡 | ||||
|     globalThis.spzd = { | ||||
|       spzd1: false, | ||||
| @ -76,15 +74,11 @@ export default class EntryAbility extends UIAbility { | ||||
|     console.info('jiangsong globalThis.pathDir = ' + globalThis.pathDir); | ||||
|     // this.requestPermission(this.context) | ||||
|     // this.featureAbilityAuth() | ||||
|     TempLogger.init() | ||||
|     // tcp创建连接 | ||||
|     // await tcpUtil.init() | ||||
| 
 | ||||
|     const windowClass = await windowStage.getMainWindow(); | ||||
|     globalThis.windowClass = windowClass | ||||
|     // await windowClass.setWindowLayoutFullScreen(true) | ||||
|     await windowClass.setWindowLayoutFullScreen(true) | ||||
|     await windowClass.setWindowSystemBarEnable([]) //全屏 | ||||
|     // await windowClass.setWindowSystemBarEnable(['navi gation']) | ||||
| 
 | ||||
|     windowStage.loadContent('pages/Index', (err, data) => { | ||||
|       if (err.code) { | ||||
|  | ||||
| @ -107,8 +107,8 @@ export const WarnFlagTipData = { | ||||
|   9: ['dianhuoVideo.wav', 'xihuoVideo.wav'], | ||||
|   10: ['check31.wav'], | ||||
|   11: ['check30.wav'], | ||||
|   12: ['check28.wav'], | ||||
|   13: ['check29.wav'], | ||||
|   12: ['check29.wav'], | ||||
|   13: ['check28.wav'], | ||||
|   14: ['check11.wav'], | ||||
|   15: ['check12.wav'], | ||||
|   16: ['check13.wav'], | ||||
| @ -136,8 +136,8 @@ export const RealNumData = { | ||||
|   8: 18, | ||||
|   9: 5, | ||||
|   10: 29, | ||||
|   11: 30, | ||||
|   12: 31, | ||||
|   11: 31, | ||||
|   12: 30, | ||||
|   13: 32, | ||||
|   14: 28, | ||||
|   15: 28, | ||||
|  | ||||
| @ -5,6 +5,9 @@ import TopLogo from './compontents/TopLogo'; | ||||
| import testNapi from '@ohos.hiserialsdk'; | ||||
| import { dateFormat } from '../common/utils/tools'; | ||||
| import { DwMapData, PassData, RealNumData, StackValueData, WarnFlagData, WarnFlagTipData } from '../mock'; | ||||
| import FileUtil from '../common/utils/File'; | ||||
| import { GlobalConfig } from '../config'; | ||||
| import common from '@ohos.app.ability.common'; | ||||
| 
 | ||||
| @Entry | ||||
| @Component | ||||
| @ -37,6 +40,7 @@ export default struct Index { | ||||
|   @State stopFlag: boolean = false | ||||
|   @State fromIndex: boolean = false | ||||
|   private vocObj = null; | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
| 
 | ||||
|   // private AccountTable = new AccountTable(()=>{},CommonConstants); | ||||
|   aboutToAppear() { | ||||
| @ -114,28 +118,66 @@ export default struct Index { | ||||
|   } | ||||
| 
 | ||||
|   // | ||||
|   carConfigurationInfoFn() { | ||||
|     // const fileUtil = new FileUtil(context) | ||||
|     // const data = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/deviceNo.txt'); | ||||
|     // if (data === '' || data === undefined) { | ||||
|     //   promptAction.showToast({ | ||||
|     //     message: `请先进行设备注册`, | ||||
|     //     duration: 3000 | ||||
|     //   }); | ||||
|     //   globalThis.type='1' | ||||
|     //   globalThis.title=decodeURIComponent('请先进行设备注册') | ||||
|     //   globalThis.errorDialog.open() | ||||
|     //   resolve('') | ||||
|     // } else { | ||||
|     //   const fileData=JSON.parse(data) | ||||
|     //   globalThis.deviceNo = fileData.deviceName | ||||
|     //   console.log('globalThis.deviceNo', globalThis.deviceNo) | ||||
|     //   // getCarInfo() | ||||
|     //   resolve(fileData.deviceName) | ||||
|     // } | ||||
|     if (globalThis.singlePlay) { | ||||
|       const str = "1:5;2:5;3:5;4:5;5:5;6:5;7:5;8:5;9:5;10:5;11:5;12:5;13:5;14:5;15:5;16:5;17:5;18:5;19:5;20:5;21:5;22:2;23:5;24:5" | ||||
|       const data = str.split(';') | ||||
|   async carConfigurationInfoFn() { | ||||
|     const fileUtil = new FileUtil(this.context) | ||||
|     const checkListStr = await fileUtil.readFile(GlobalConfig.comoonfileWriteAddress + '/config/carcheck.txt'); | ||||
| 
 | ||||
|     if (checkListStr === '' || checkListStr === undefined) { | ||||
|       //模拟真实数据 | ||||
|       const param = { | ||||
|         "body": | ||||
|         { | ||||
|           "carIdString": globalThis.carInfo.carId, //考车ID | ||||
|           "deviceNo": globalThis.deviceNo | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       carConfigurationInfo(param).then(res => { | ||||
|         // @ts-ignore | ||||
|         console.log('ES_CHECK_CAR_ITEM',JSON.stringify(res.body)) | ||||
|         // @ts-ignore | ||||
|         if(res?.body?.ES_CHECK_CAR_ITEM){ | ||||
|           // @ts-ignore | ||||
|           const data = res.body.ES_CHECK_CAR_ITEM[0].ITEMS.split(';'); | ||||
|           this.checkList = [] | ||||
|           const list = data | ||||
|           list.map(res => { | ||||
|             const arr = res.split(':') | ||||
|             this.checkList.push({ | ||||
|               'key': parseInt(arr[0]) + 2, 'time': arr[1] | ||||
|             }) | ||||
|           }) | ||||
|           this.checkListCopy = JSON.parse(JSON.stringify(this.checkList)) | ||||
|         }else{ | ||||
|           const str = "1:5;2:5;3:5;4:5;5:5;6:5;7:5;8:5;9:5;10:5;11:5;12:5;13:5;14:5;15:5;16:5;17:5;18:5;19:5;20:5;21:5;22:2;23:5;24:5" | ||||
|           const data = str.split(';') | ||||
|           this.checkList = [] | ||||
|           const list = data | ||||
|           list.map(res => { | ||||
|             const arr = res.split(':') | ||||
|             this.checkList.push({ | ||||
|               'key': parseInt(arr[0]) + 2, 'time': arr[1] | ||||
|             }) | ||||
|           }) | ||||
|           this.checkListCopy = JSON.parse(JSON.stringify(this.checkList)) | ||||
|         } | ||||
| 
 | ||||
|       }).catch((error) => { | ||||
|         console.log('error12error' + error) | ||||
|         const str = "1:5;2:5;3:5;4:5;5:5;6:5;7:5;8:5;9:5;10:5;11:5;12:5;13:5;14:5;15:5;16:5;17:5;18:5;19:5;20:5;21:5;22:2;23:5;24:5" | ||||
|         const data = str.split(';') | ||||
|         this.checkList = [] | ||||
|         const list = data | ||||
|         list.map(res => { | ||||
|           const arr = res.split(':') | ||||
|           this.checkList.push({ | ||||
|             'key': parseInt(arr[0]) + 2, 'time': arr[1] | ||||
|           }) | ||||
|         }) | ||||
|         this.checkListCopy = JSON.parse(JSON.stringify(this.checkList)) | ||||
|       }) | ||||
|     }else { | ||||
|       const data = checkListStr.split(';') | ||||
|       this.checkList = [] | ||||
|       const list = data | ||||
|       list.map(res => { | ||||
| @ -147,30 +189,7 @@ export default struct Index { | ||||
|       this.checkListCopy = JSON.parse(JSON.stringify(this.checkList)) | ||||
|       return | ||||
|     } | ||||
|     //模拟真实数据 | ||||
|     const param = { | ||||
|       "body": | ||||
|       { | ||||
|         "carIdString": globalThis.carInfo.carId, //考车ID | ||||
|         "deviceNo": globalThis.deviceNo | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     carConfigurationInfo(param).then(res => { | ||||
|       // @ts-ignore | ||||
|       const data = res.body.ES_CHECK_CAR_ITEM[0].ITEMS.split(';'); | ||||
|       this.checkList = [] | ||||
|       const list = data | ||||
|       list.map(res => { | ||||
|         const arr = res.split(':') | ||||
|         this.checkList.push({ | ||||
|           'key': parseInt(arr[0]) + 2, 'time': arr[1] | ||||
|         }) | ||||
|       }) | ||||
|       this.checkListCopy = JSON.parse(JSON.stringify(this.checkList)) | ||||
|     }).catch((error) => { | ||||
|       console.log('error12error' + error) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   async kszj() { | ||||
| @ -224,8 +243,10 @@ export default struct Index { | ||||
|           this.warnFlag[26] = '2' | ||||
|         } | ||||
|       } | ||||
| 
 | ||||
|       console.log('msgmsgmsg',msg) | ||||
|       if (that.index == 10 || that.index == 11 || that.index == 12 || that.index == 13) { | ||||
|         console.log('msgmsgmsg000',that.index,that.signArr[that.realNum[that.index]]) | ||||
| 
 | ||||
|         if (that.signArr[that.realNum[that.index]] != '1200') { | ||||
|           that.warnFlag[that.index] = '2' | ||||
|         } else { | ||||
| @ -308,37 +329,37 @@ export default struct Index { | ||||
|   } | ||||
|   initfackCheck(index){ | ||||
|     const that=this | ||||
|       setTimeout(()=>{ | ||||
|         console.log('indexindex',index) | ||||
|           if(index>=3){ | ||||
|             this.getCheckList() | ||||
|             return | ||||
|           } | ||||
|     setTimeout(()=>{ | ||||
|       console.log('indexindex',index) | ||||
|       if(index>=3){ | ||||
|         this.getCheckList() | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|         console.log('this.index',index,) | ||||
|         that.passArray[index]=true | ||||
|         if(index==2){ | ||||
|           let flag=false | ||||
|           console.log('globalThis.spzd[key]',globalThis.spzd) | ||||
|       console.log('this.index',index,) | ||||
|       that.passArray[index]=true | ||||
|       if(index==2){ | ||||
|         let flag=false | ||||
|         console.log('globalThis.spzd[key]',globalThis.spzd) | ||||
| 
 | ||||
|           for(let key in globalThis.spzd){ | ||||
|             console.log('globalThis.spzd[key]',globalThis.spzd[key]) | ||||
|             if(globalThis.spzd[key]){ | ||||
|               that.warnFlag[index]='1' | ||||
|               flag=true | ||||
|             } | ||||
|         for(let key in globalThis.spzd){ | ||||
|           console.log('globalThis.spzd[key]',globalThis.spzd[key]) | ||||
|           if(globalThis.spzd[key]){ | ||||
|             that.warnFlag[index]='1' | ||||
|             flag=true | ||||
|           } | ||||
|           if(!flag){ | ||||
|             that.warnFlag[index]='2' | ||||
|           } | ||||
|         }else{ | ||||
|         } | ||||
|         if(!flag){ | ||||
|           that.warnFlag[index]='2' | ||||
|         } | ||||
|         that.passArray=JSON.parse(JSON.stringify(that.passArray)) | ||||
|         that.warnFlag=JSON.parse(JSON.stringify(that.warnFlag)) | ||||
|         index++ | ||||
|         this.initfackCheck(index) | ||||
|       },1000) | ||||
|       }else{ | ||||
|         that.warnFlag[index]='2' | ||||
|       } | ||||
|       that.passArray=JSON.parse(JSON.stringify(that.passArray)) | ||||
|       that.warnFlag=JSON.parse(JSON.stringify(that.warnFlag)) | ||||
|       index++ | ||||
|       this.initfackCheck(index) | ||||
|     },1000) | ||||
| 
 | ||||
|   } | ||||
|   async getCheckList() { | ||||
| @ -456,14 +477,14 @@ export default struct Index { | ||||
|             } | ||||
| 
 | ||||
|             Row() { | ||||
|               Image(this.warnFlag[12] == '1' ? $r('app.media.zh_r') : this.warnFlag[12] == '2' ? $r('app.media.zh') : '') | ||||
|                 .width(103 * this.ratio) | ||||
|                 .height(118.5 * this.ratio) | ||||
|                 .visibility(this.passArray[12] ? Visibility.Visible : Visibility.Hidden) | ||||
|               Image(this.warnFlag[13] == '1' ? $r('app.media.yh_r') : this.warnFlag[13] == '2' ? $r('app.media.yh') : '') | ||||
|               Image(this.warnFlag[13] == '1' ? $r('app.media.zh_r') : this.warnFlag[13] == '2' ? $r('app.media.zh') : '') | ||||
|                 .width(103 * this.ratio) | ||||
|                 .height(118.5 * this.ratio) | ||||
|                 .visibility(this.passArray[13] ? Visibility.Visible : Visibility.Hidden) | ||||
|               Image(this.warnFlag[12] == '1' ? $r('app.media.yh_r') : this.warnFlag[12] == '2' ? $r('app.media.yh') : '') | ||||
|                 .width(103 * this.ratio) | ||||
|                 .height(118.5 * this.ratio) | ||||
|                 .visibility(this.passArray[12] ? Visibility.Visible : Visibility.Hidden) | ||||
|             } | ||||
|           } | ||||
|           .backgroundImage($r('app.media.rc')) | ||||
|  | ||||
| @ -22,12 +22,13 @@ import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; | ||||
| import IdlServiceExtProxy from '../IdlServiceExt/idl_service_ext_proxy'; | ||||
| import Want from '@ohos.app.ability.Want'; | ||||
| import emitter from '@ohos.events.emitter'; | ||||
| import { examJudgeVersion } from './judgeSDK/api'; | ||||
| import { delLog } from '../common/service/logService'; | ||||
| 
 | ||||
| @Entry | ||||
| @Component | ||||
| struct Index { | ||||
|   @State carNum: string = '' | ||||
|   @State version: string = '' | ||||
|   @State url: string = '' | ||||
|   @State hasAuth: boolean = false; | ||||
|   @State dialogVisiable: boolean = false; | ||||
| @ -58,6 +59,8 @@ struct Index { | ||||
|   private avPlayer | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
|   private serviceExtProxy: IdlServiceExtProxy | ||||
|   @State judgeVersion: string = "" | ||||
|   private version: string = "2025.04.23.01" | ||||
| 
 | ||||
|   @Styles | ||||
|   commStyle(){ | ||||
| @ -194,12 +197,12 @@ struct Index { | ||||
|       Column() { | ||||
|         Row() { | ||||
|           Column() { | ||||
|             Text('V外壳:' + globalThis.version) | ||||
|             Text('V外壳:' + this.version) | ||||
|               .fontColor('#CCAE7A') | ||||
|               .fontSize(18 * globalThis.ratio) | ||||
|               .width('30%') | ||||
|               .margin({ bottom: 10 }) | ||||
|             Text('V评判:' + globalThis.judgeVersion) | ||||
|             Text('V评判:' + this.judgeVersion) | ||||
|               .fontColor('#CCAE7A') | ||||
|               .fontSize(18 * globalThis.ratio) | ||||
|               .width('30%') | ||||
| @ -443,6 +446,7 @@ struct Index { | ||||
|           // globalThis.param854Str=sys.v_value | ||||
|           delPic(Number(sys.v_value), 1) | ||||
|           delPic(Number(sys.v_value), 2) | ||||
|           delLog(Number(sys.v_value)) | ||||
|           // this.delLoading=false | ||||
| 
 | ||||
|         } | ||||
| @ -574,10 +578,10 @@ struct Index { | ||||
|     this.fileHelper = new FileHelper(); | ||||
|     const time = await getCurrentTime() | ||||
|     const date = time.split(' ')[0] | ||||
|     this.fileHelper.createAlbum(date); | ||||
|     this.fileHelper.createAlbum('jt') | ||||
|     // this.fileHelper.createAlbum('2025-01-02') | ||||
|     this.fileHelper.createAlbum('pz'); | ||||
|     this.fileHelper.createAlbum(date); | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
| @ -611,6 +615,7 @@ struct Index { | ||||
|   } | ||||
| 
 | ||||
|   async initParams() { | ||||
|     this.judgeVersion = await examJudgeVersion() | ||||
|     await getUDP(this.context, false) | ||||
|     this.loading = false | ||||
|     await getDeviceInfo(this.context) | ||||
| @ -626,7 +631,6 @@ struct Index { | ||||
|       console.info('surenjun', 'distanceClass=>初始化完成') | ||||
|     } | ||||
|     this.carNum = globalThis.carInfo.plateNo; | ||||
|     this.version = globalThis.version; | ||||
|     this.hasAuth = globalThis.hasAuth; | ||||
|     setTimeout(() => { | ||||
|       this.initParamFlag = true | ||||
|  | ||||
| @ -42,7 +42,6 @@ struct Index { | ||||
|   } | ||||
| 
 | ||||
|   async aboutToAppear() { | ||||
|     globalThis.windowClass.setWindowSystemBarEnable([]) | ||||
|     const time = await getCurrentTime() | ||||
| 
 | ||||
|     this.startTime = time.split(' ')[1] | ||||
| @ -111,6 +110,7 @@ struct Index { | ||||
|       FLAG: carInfo.flag, | ||||
|       BK1: carInfo.bk1, | ||||
|       BK2: carInfo.bk2, | ||||
|       X_MCH: carInfo.x_mch, | ||||
|     }) | ||||
|     console.info('surenjun =>carinfoArrr',JSON.stringify( this.carinfoArr)) | ||||
|   } | ||||
|  | ||||
| @ -140,7 +140,9 @@ struct UserInfo { | ||||
|         //   同一学员连续第二次考试时不再验证身份 | ||||
|         if (this.currentUser.kssycs == '1' && this.systemParam.Param830Str == '1') { | ||||
|           this.sfbdinterfaceFn() | ||||
| 
 | ||||
|         } else { | ||||
|           this.ksksLimit = false | ||||
|           this.showFaceCompare = true | ||||
|         } | ||||
|       } else { | ||||
| @ -148,6 +150,7 @@ struct UserInfo { | ||||
|       } | ||||
|     } catch (e) { | ||||
|       console.info('Throw Error', JSON.stringify(e)) | ||||
|       this.ksksLimit = false | ||||
|     } | ||||
| 
 | ||||
|   } | ||||
| @ -881,6 +884,7 @@ struct UserInfo { | ||||
| 
 | ||||
|   //身份比对 | ||||
|   async sfbdinterfaceFn() { | ||||
|     this.ksksLimit = false | ||||
|     globalThis.statue = 4 | ||||
|     this.stepFlag = true | ||||
|     const carInfo = globalThis.carInfo; | ||||
| @ -894,7 +898,7 @@ struct UserInfo { | ||||
|         carId, | ||||
|         lsh: this.currentUser.lsh || '', | ||||
|         examinationRoomId | ||||
|       }); | ||||
|       }) | ||||
|     } | ||||
|     this.currentUser.id = '1' | ||||
|     const avPlayer = this.avPlayer; | ||||
| @ -1280,7 +1284,7 @@ struct UserInfo { | ||||
|                   return | ||||
|                 } | ||||
|                 //835参数值和预约考试次数对比 | ||||
|                 if(Number(this.systemParam.Param835)<=Number(this.currentUser.yycs)){ | ||||
|                 if(Number(this.systemParam.Param835)<=Number(this.currentUser.yycs)&&!globalThis.singlePlay){ | ||||
|                   this.type='4' | ||||
|                   this.title='当前考生预约考试次数为'+this.currentUser.yycs | ||||
|                   this.errorDialog.open() | ||||
|  | ||||
| @ -73,6 +73,7 @@ export interface CARINFO { | ||||
|   FLAG: string, | ||||
|   BK1: string, | ||||
|   BK2: string | ||||
|   X_MCH: string | ||||
| } | ||||
| 
 | ||||
| export interface MAPPOINT { | ||||
|  | ||||
| @ -329,12 +329,12 @@ export default class Judge { | ||||
|   private isEndTip: boolean = false; | ||||
|   private deductedPopShowTimer: number = 0; | ||||
|   // 校验考试是否结束
 | ||||
|   // 校验考试是否结束
 | ||||
|   checkExamIsEnd = | ||||
|     async (isManual?: boolean) => { | ||||
|       const { judgeUI, avPlayer, isExamEnd, isEndTip, ksjs } = this; | ||||
|       const { isAllProjectsEnd, examSubject, singlePlay, totalScore, judgeConfigObj, passingScore, examMileage, jl } = | ||||
|         judgeUI; | ||||
| 
 | ||||
|       const {judgeUI,avPlayer,isExamEnd,isEndTip,ksjs} = this; | ||||
|       const {isAllProjectsEnd,examSubject,singlePlay,totalScore,judgeConfigObj,passingScore,examMileage,jl} = judgeUI; | ||||
|       const param302 = judgeConfigObj['302']; | ||||
|       if (isExamEnd) { | ||||
|         return | ||||
|       } | ||||
| @ -346,24 +346,21 @@ export default class Judge { | ||||
|         this.isExamEnd = true | ||||
|         this.isManual = true | ||||
|       } else { | ||||
|         const param302 = judgeConfigObj['302']; | ||||
|         const param342 = judgeConfigObj['342']; | ||||
|         const param512 = (judgeConfigObj['512'] || '').split(','); | ||||
| 
 | ||||
|         //单机模式
 | ||||
|         if (singlePlay) { | ||||
|           console.info(judgeTag + ' isAllProjectsEnd => ', isAllProjectsEnd) | ||||
|           if (isAllProjectsEnd && jl >= examMileage) { | ||||
|             //成绩合格
 | ||||
|             if (totalScore >= passingGrade && !isEndTip) { | ||||
|               if (examSubject == 3 && (param342 == 0 || param342 == 2) && | ||||
|                 (param302 != 6 || param302 != 7 || param302 != 8)) { | ||||
|               if (examSubject == 3 && (param342 == 0 || param342 == 2) && (param302 != 6 || param302 != 7 || param302 != 8)) { | ||||
|                 if (param512[7] != 0) { | ||||
|                   clearTimeout(this.deductedPopShowTimer) | ||||
|                   avPlayer.playAudio(['voice/综合评判.mp3']) | ||||
|                   this.judgeUI.isDeductedPopShow = true | ||||
|                   this.judgeUI.defaultTabIndex = 1 | ||||
|                   this.isEndTip = true | ||||
|                   // clearTimeout(this.deductedPopShowTimer)
 | ||||
|                   // avPlayer.playAudio(['voice/综合评判.mp3'])
 | ||||
|                   // this.judgeUI.isDeductedPopShow = true
 | ||||
|                   // this.judgeUI.defaultTabIndex = 1
 | ||||
|                   // this.isEndTip = true
 | ||||
|                   return | ||||
|                 } | ||||
|               } else { | ||||
| @ -385,15 +382,17 @@ export default class Judge { | ||||
|           //成绩不合格
 | ||||
|           if (totalScore < passingGrade) { | ||||
|             //科目三不合格报靠边停车
 | ||||
|             if (examSubject == 3 && param302 == 1) { | ||||
|               avPlayer.playAudio([`voice/考试结束.mp3`]); | ||||
|               return | ||||
|             if (examSubject == 3 ) { | ||||
|               if( param302 == 1){ | ||||
|                 avPlayer.playAudio([`voice/考试结束.mp3`]); | ||||
|               }else if(param302 == 0){ | ||||
|                 return | ||||
|               } | ||||
|             } | ||||
|             await examJudgeEndExam() | ||||
|             this.isExamEnd = true | ||||
|             return | ||||
|           } | ||||
| 
 | ||||
|           //成绩合格
 | ||||
|           if (isAllProjectsEnd && totalScore >= passingGrade && !isEndTip) { | ||||
|             if (examSubject == 2) { | ||||
| @ -414,8 +413,7 @@ export default class Judge { | ||||
|               return | ||||
|             } | ||||
| 
 | ||||
|             if (examSubject == 3 && (param342 == 0 || param342 == 2) && | ||||
|               (param302 != 6 || param302 != 7 || param302 != 8)) { | ||||
|             if (examSubject == 3 && (param342 == 0 || param342 == 2) && (param302 != 6 || param302 != 7 || param302 != 8)) { | ||||
|               if (param512[7] != 0) { | ||||
|                 clearTimeout(this.deductedPopShowTimer) | ||||
|                 this.judgeUI.isDeductedPopShow = false | ||||
| @ -492,7 +490,6 @@ export default class Judge { | ||||
|       const msgStr = strArr[num]; | ||||
|       if (msgStr == '') { | ||||
|         console.info(judgeTag, '模拟数据考试结束') | ||||
|         globalThis.windowClass.setWindowSystemBarEnable([]) | ||||
|         clearInterval(judgeTimer) | ||||
|         this.checkExamIsEnd(true) | ||||
|         return | ||||
| @ -696,13 +693,13 @@ export default class Judge { | ||||
|     if (this.disConnectNum < 5 && this.disConnectNum > 0) { | ||||
|       console.log("wzj", "第" + this.disConnectNum + "次重新发送", JSON.stringify(data)) | ||||
|     } | ||||
|     //断网&网络超时次数计算
 | ||||
|     if (temp.code == 2300007 || temp.code == 2300028) { | ||||
|     if ( | ||||
|     //后台连接中心异常
 | ||||
|       temp.code == -1 || temp.code == 0 || | ||||
|         //断网&网络超时次数计算
 | ||||
|         temp.code == 2300007 || temp.code == 2300028) { | ||||
|       this.disConnectNum += 1; | ||||
|       if (this.disConnectNum < 5) { | ||||
|         if (temp.code == 2300028) { | ||||
|           await new Promise(resolve => setTimeout(resolve, 1000)); // 延迟1秒
 | ||||
|         } | ||||
|         return await this.sendWriteObjectOut(data, filePath) | ||||
|       } | ||||
|     } | ||||
| @ -1225,6 +1222,13 @@ export default class Judge { | ||||
|         }) | ||||
|       }) | ||||
|     } else { | ||||
|       //收到综合评判语音时,显示综合评判弹窗
 | ||||
|       if(code[0] == 'zhpp'){ | ||||
|         clearTimeout(this.deductedPopShowTimer) | ||||
|         this.judgeUI.isDeductedPopShow = true | ||||
|         this.judgeUI.defaultTabIndex = 1 | ||||
|         this.isEndTip = true | ||||
|       } | ||||
|       avPlayer.playAudio([`voice/${code[0]}.mp3`]) | ||||
|     } | ||||
|   } | ||||
| @ -1241,15 +1245,14 @@ export default class Judge { | ||||
|     // this.judgeUI.totalScore = isAllProjectsEnd ? totalScore : 0;
 | ||||
|     const singlePlay = globalThis.singlePlay | ||||
|     const param302 = judgeConfigObj['302']; | ||||
|     // globalThis.windowClass.setWindowSystemBarEnable(['navigation'])
 | ||||
| 
 | ||||
|     //自动退出待验证并且不合格
 | ||||
|     if (!isManual && examSubject == 3 && (param302 == 1 || (singlePlay && param302 == 2)) && | ||||
|       totalScore < passingScore) { | ||||
|       avPlayer.playAudio([`voice/考试结束.mp3`]) | ||||
|     } | ||||
|     //联网模式下手动结束的直接退出
 | ||||
|     if (!singlePlay && isManual && !isAllProjectsEnd) { | ||||
|     //联网模式下:项目没有做完、当前分数大于及格分;手动结束直接退出
 | ||||
|     if (!singlePlay && isManual && !isAllProjectsEnd && totalScore >= passingScore) { | ||||
|       avPlayer.playAudio(['voice/empty.mp3'], true, () => { | ||||
|         this.isUdpEnd = true; | ||||
|         closeAllFiles() | ||||
|  | ||||
| @ -7,22 +7,22 @@ export const judgeConfig = { | ||||
|   //扣分语音是否强制开启
 | ||||
|   kfVoiceOpen: false, | ||||
|   //忽略的考试项目
 | ||||
|   ignoreProjects:[], | ||||
|   ignoreProjects: [], | ||||
|   // 是否忽略考试前熄火、车门检查
 | ||||
|   isCheckFireOpen: false, | ||||
|   //轨迹回放是否开启Udp
 | ||||
|   udpOpen:true, | ||||
|   udpOpen: true, | ||||
|   // 本地模型地址
 | ||||
|   modelPath: 'models/model_enc', | ||||
|   // 济南科目三
 | ||||
|   trajectoryPath: 'logs/2024_12_26/2024_12_26_14_12_51_2412505941910_370125200404041910_赵宇/judge_exam_data.txt', | ||||
|   trajectoryPath: 'logs/2024_10_12/2024_10_12_11_50_10_9999427676823_744299437502336256_隋统/judge_exam_data.txt', | ||||
|   //四合一画面配置
 | ||||
|   fourInOneScreen:{ | ||||
|   fourInOneScreen: { | ||||
|     //gps位数
 | ||||
|     gpsDigit:6 | ||||
|     gpsDigit: 6 | ||||
|   }, | ||||
|   // 杭州科目二
 | ||||
|   // trajectoryPath: 'logs/2024_07_19/0000000000001_342323199501470011_测试学员1_2024_07_19_06_49_12/judge_exam_data.txt',
 | ||||
|   //TODO 济南临时特殊配置
 | ||||
|   systemParamConfig:{} | ||||
|   systemParamConfig: {} | ||||
| } | ||||
| @ -1,14 +1,15 @@ | ||||
| -----BEGIN CERTIFICATE----- | ||||
| MIICFTCCAZugAwIBAgIIDwIlwC9KCAgwCgYIKoZIzj0EAwMwYzELMAkGA1UEBhMC | ||||
| Q04xFDASBgNVBAoTC09wZW5IYXJtb255MRkwFwYDVQQLExBPcGVuSGFybW9ueSBU | ||||
| ZWFtMSMwIQYDVQQDExpPcGVuSGFybW9ueSBBcHBsaWNhdGlvbiBDQTAeFw0yNTAz | ||||
| MjcwMTM0MzFaFw0zNTAzMjUwMTM0MzFaMEoxFTATBgNVBAMMDGlkZV9kZW1vX2Fw | ||||
| cDENMAsGA1UECxMEVW5pdDEVMBMGA1UEChMMT3JnYW5pemF0aW9uMQswCQYDVQQG | ||||
| EwJDTjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABOFM709v5dpRw1u42nrUPbxe | ||||
| UZ2iCXWEgpO3ySIfLdm+t5b23QqTp5cSPu1faM9Exy6PqxaO2zzGFt2Eb3AKqLyj | ||||
| UjBQMB0GA1UdDgQWBBSubxhAdyUr8mSVCpjOak70J/8yoTAOBgNVHQ8BAf8EBAMC | ||||
| B4AwHwYDVR0jBBgwFoAU24a3IhbVC6FLt90le7nxBX2iLUcwCgYIKoZIzj0EAwMD | ||||
| aAAwZQIwevtGwM7A4Cj5foXfOCAV8RU0o3NAKBIxXIWbnk2h+BPiwHRvV9BvHv+T | ||||
| k4Qssp04AjEAwPaguX2Iu6DY8Y+u0lq1gEc62lnSjzAHDr7SItcAOjHd0IWwubpK | ||||
| JD1PtKpp/POt | ||||
| MIICFzCCAZygAwIBAgIJAO9FWZQgKzxyMAoGCCqGSM49BAMDMGMxCzAJBgNVBAYT | ||||
| AkNOMRQwEgYDVQQKEwtPcGVuSGFybW9ueTEZMBcGA1UECxMQT3Blbkhhcm1vbnkg | ||||
| VGVhbTEjMCEGA1UEAxMaT3Blbkhhcm1vbnkgQXBwbGljYXRpb24gQ0EwHhcNMjUw | ||||
| NDIyMDc1NDI2WhcNMzUwNDIwMDc1NDI2WjBKMRUwEwYDVQQDDAxpZGVfZGVtb19h | ||||
| cHAxDTALBgNVBAsTBFVuaXQxFTATBgNVBAoTDE9yZ2FuaXphdGlvbjELMAkGA1UE | ||||
| BhMCQ04wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUPoxdYBvC4QlondlBnCEe | ||||
| oxxkFKTZwhcA+xW31gNCOOwboVPyCB++6EuUa/0fJ/jlEeyNzErXflXkGG7GZVPa | ||||
| o1IwUDAdBgNVHQ4EFgQUrAmchwjJTxwrv09H+c4xS7+oEvIwDgYDVR0PAQH/BAQD | ||||
| AgeAMB8GA1UdIwQYMBaAFNuGtyIW1QuhS7fdJXu58QV9oi1HMAoGCCqGSM49BAMD | ||||
| A2kAMGYCMQCZzMs9H/mMi+59hO4EfDHTXChO6QoBYH+pwB66g7dw7apGXhayBIwq | ||||
| qOeVnlTVbPkCMQCc2hQf+ypiZpZQog1dMSGdlNs8heypj97d7DahjTgEzrxGxcZK | ||||
| PtMtg35cJa+JtN4= | ||||
| -----END CERTIFICATE----- | ||||
| 071A11E92B83EE8977A794F1B387ADA40780BFF19C301A5C63F407531B2C2C1A | ||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/end_tip.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/end_tip.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/zhpp.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/zhpp.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user