From 1704325d8795daf379cb0d3fe162cd5f6b7eafd9 Mon Sep 17 00:00:00 2001 From: surenjun Date: Mon, 12 Aug 2024 10:19:31 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat=EF=BC=9A=E7=A7=91=E7=9B=AE=E4=B8=89?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/cpp/sdk/common/HSystem.h | 35 +- .../sdk/database/mappoint/MapPointItemTable.h | 7 +- .../cpp/sdk/database/sysparm/SysParmTable.h | 5 + .../cpp/sdk/database/sysset/SysSetTable.h | 2 +- entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp | 5 +- entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp | 756 +++++++++------ entry/src/main/cpp/sdk/exam/ExamCarSub3.h | 12 + entry/src/main/cpp/sdk/exam/ExamSensor.cpp | 16 +- entry/src/main/cpp/sdk/exam/ExamService.cpp | 5 +- entry/src/main/cpp/sdk/exam/IExamCar.cpp | 10 +- entry/src/main/cpp/sdk/exam/IExamCar.h | 4 +- entry/src/main/cpp/sdk/graphic/GraphicImage.h | 2 +- entry/src/main/cpp/sdk/judge/HJudgeItem.h | 2 + .../cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp | 34 + .../main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.h | 2 + .../cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp | 14 +- .../cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp | 6 +- .../cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp | 4 +- .../cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp | 25 +- .../main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.h | 7 + .../cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp | 4 +- .../cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp | 28 +- .../cpp/sdk/judge/sub3/Sub3Judge14Jjdw.cpp | 2 +- .../cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp | 178 ++-- entry/src/main/cpp/sdk/utility/GpsMath.cpp | 50 +- entry/src/main/cpp/sdk/utility/GpsMath.h | 3 + entry/src/main/cpp/sdk/utility/HBean.h | 8 + entry/src/main/cpp/sdk/utility/HTypes.h | 9 +- entry/src/main/ets/api/judge.ts | 10 +- entry/src/main/ets/api/judgeNew.ts | 6 +- entry/src/main/ets/common/utils/File.ts | 1 + entry/src/main/ets/common/utils/UdpJudge.ts | 2 - entry/src/main/ets/common/utils/request.ts | 12 +- entry/src/main/ets/pages/Judge.ets | 43 +- entry/src/main/ets/pages/UserInfo.ets | 154 ++- entry/src/main/ets/pages/UserInfo1.ets | 918 ++++++++++++++++++ .../judge/BoardPrePareSetPopup.ets | 6 +- .../ets/pages/compontents/judge/RealTime.ets | 24 + .../main/ets/pages/judgeSDK/dataTest/index.ts | 3 +- entry/src/main/ets/pages/judgeSDK/judge.ts | 127 ++- .../ets/pages/judgeSDK/utils/judgeCommon.ts | 13 + .../ets/pages/judgeSDK/utils/judgeConfig.ts | 10 +- .../ets/pages/judgeSDK/utils/judgeReal.ts | 2 +- .../judgeSDK/utils/voiceAnnouncements.ts | 22 +- .../src/main/resources/rawfile/judge/big.png | Bin 0 -> 9021 bytes .../main/resources/rawfile/judge/small.png | Bin 0 -> 8586 bytes .../main/resources/rawfile/voice/404004.mp3 | Bin 0 -> 37706 bytes .../main/resources/rawfile/voice/414005.mp3 | Bin 10944 -> 31692 bytes .../main/resources/rawfile/voice/empty.mp3 | Bin 4595 -> 76 bytes .../src/main/resources/rawfile/voice/点火.mp3 | Bin 0 -> 48182 bytes .../rawfile/voice/请关闭远近光灯.mp3 | Bin 0 -> 62324 bytes .../main/resources/rawfile/voice/请拉手刹.mp3 | Bin 0 -> 31312 bytes .../main/resources/rawfile/voice/请置空档.mp3 | Bin 0 -> 29594 bytes .../resources/rawfile/voice/请解开安全带.mp3 | Bin 0 -> 40592 bytes 54 files changed, 2013 insertions(+), 575 deletions(-) create mode 100644 entry/src/main/ets/pages/UserInfo1.ets create mode 100644 entry/src/main/resources/rawfile/judge/big.png create mode 100644 entry/src/main/resources/rawfile/judge/small.png create mode 100644 entry/src/main/resources/rawfile/voice/404004.mp3 create mode 100644 entry/src/main/resources/rawfile/voice/点火.mp3 create mode 100644 entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3 create mode 100644 entry/src/main/resources/rawfile/voice/请拉手刹.mp3 create mode 100644 entry/src/main/resources/rawfile/voice/请置空档.mp3 create mode 100644 entry/src/main/resources/rawfile/voice/请解开安全带.mp3 diff --git a/entry/src/main/cpp/sdk/common/HSystem.h b/entry/src/main/cpp/sdk/common/HSystem.h index 18a7ef58..c622ff38 100644 --- a/entry/src/main/cpp/sdk/common/HSystem.h +++ b/entry/src/main/cpp/sdk/common/HSystem.h @@ -107,6 +107,7 @@ *** JUDGE_USE_MEMORY //是否启用内存操作检查 *** JUDGE_USE_POOL //是否启用内存池调试信息 *** JUDGE_USE_ASSERT //是否启用断言提示 + *** JUDGE_USE_NICE //是否启用调试测试代码 *** JUDGE_USE_PERF //是否启用CPU性能分析 *** JUDGE_USE_LEAK //是否启用内存泄露检测 *** JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作 @@ -119,20 +120,26 @@ #define JUDGE_USE_LOG /* - * 是否启用一些调试用的信息,开发用 + * 是否启用外壳APP侧传入参数严格检查 */ #if defined(JUDGE_OS_OHOS) || defined(JUDGE_OS_ANDROID) || defined(JUDGE_DEBUG__) - - #define JUDGE_USE_STRICT //是否启用外壳APP侧传入参数严格检查 - + #define JUDGE_USE_STRICT #endif -#define JUDGE_USE_CODE //是否启用系统在返回错误码的时候输出日志 +/* + * 是否启用系统在返回错误码的时候输出日志 + */ +#define JUDGE_USE_CODE +/* + * 是否启用函数执行耗时检测 + * 是否启用内存操作检查 + * 是否启用内存池调试信息 + */ #if 0 - #define JUDGE_USE_COST //是否启用函数执行耗时检测 - #define JUDGE_USE_MEMORY //是否启用内存操作检查 - #define JUDGE_USE_POOL //是否启用内存池调试信息 + #define JUDGE_USE_COST + #define JUDGE_USE_MEMORY + #define JUDGE_USE_POOL #endif /* @@ -143,6 +150,11 @@ #define JUDGE_USE_ASSERT //是否启用断言提示 #endif +/* + * 是否启用测试调试代码 + */ +#define JUDGE_USE_NICE + /* * 是否启用CPU性能分析和内存泄露检测 * 注意:目前只在linux系统并且在编译测试工程时前提下条件下才能开启 @@ -159,6 +171,7 @@ //#define JUDGE_USE_TCMALLOC //是否启用tcmalloc优化内存使用操作 #endif + /* * 是否启用无锡科研所送检模式 * 作者: 杨海洋 @@ -189,12 +202,14 @@ * 7.下一次再去无锡所检测,左转弯要用原始的ret2000 * * - * */ -//#define JUDGE_USE_INSPECT +//#define JUDGE_USE_INSPECT +//********************************以上是预编译定义*************************************** + + /* * 基础整数类型定义 * diff --git a/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.h b/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.h index b5dd575f..f3a6f2e0 100644 --- a/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.h +++ b/entry/src/main/cpp/sdk/database/mappoint/MapPointItemTable.h @@ -18,18 +18,19 @@ public: bool load(const TMap_Point_Items& mapPointItem); void unload(); - const TMap_Point_Item* findMapPointItem(int ptNo) const + const std::vector findMapPointItem(int ptNo) const { + std::vector items; int ssize = size(); for(int i = 0 ; i < ssize; i++) { const TMap_Point_Item* mapPointItem = getMapPointItem(i); if(mapPointItem && mapPointItem->point_no == ptNo) { - return mapPointItem; + items.push_back(mapPointItem); } } - return nullptr; + return items; } const TMap_Point_Item* getMapPointItem(int idx) const { TASSERT_NULL(idx >= 0 && idx < size(), ""); return &m_mapPointItem[idx]; } const TMap_Point_Items& getMapPointItems() const noexcept { return m_mapPointItem; } diff --git a/entry/src/main/cpp/sdk/database/sysparm/SysParmTable.h b/entry/src/main/cpp/sdk/database/sysparm/SysParmTable.h index 4a9438c4..67b0414b 100644 --- a/entry/src/main/cpp/sdk/database/sysparm/SysParmTable.h +++ b/entry/src/main/cpp/sdk/database/sysparm/SysParmTable.h @@ -3,6 +3,11 @@ * * 作者: 杨海洋 * 日期: 2024-01-03 + * + ****************************************************************************** + * 1、免考项目参数设置:systemparm表: NO1=1并且TXT3=1的是免考的,NO2是项目代码 + * + * */ #ifndef SYSPARMTABLE_H diff --git a/entry/src/main/cpp/sdk/database/sysset/SysSetTable.h b/entry/src/main/cpp/sdk/database/sysset/SysSetTable.h index 5a623ec9..500b7e03 100644 --- a/entry/src/main/cpp/sdk/database/sysset/SysSetTable.h +++ b/entry/src/main/cpp/sdk/database/sysset/SysSetTable.h @@ -147,7 +147,7 @@ class JUDGE_API SysSetTable : public IDBTable SYSSET_DECLARE(19, type_array, ":"); //夜间考试考试时间 SYSSET_DECLARE(211); //考试地点参数 - SYSSET_DECLARE(301, type_array2, "^", ","); //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ //示例:4,35,3,0,1,^5,50,3,0,1,^ + SYSSET_DECLARE(301, type_array, "^"); //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ //示例:4,35,3,0,1,^5,50,3,0,1,^ SYSSET_DECLARE(303); //行驶距离限制(米) //3000 SYSSET_DECLARE(306); //直行键(0-直行,1-加速行驶) //1 SYSSET_DECLARE(307); //只考一次的项目 //5,15,16 diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp index 7edc1b28..1b15c653 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub2.cpp @@ -59,6 +59,7 @@ ErrorCode ExamCarSub2::examGoonExam() { if(m_stuInfo.ddxk) { + m_disForward = m_stuInfo.yklc; for(size_t i = 0; i < m_stuInfo.ykxm.size(); i++) { int itemNo = m_stuInfo.ykxm[i]; @@ -365,7 +366,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem() //必须是前进状态进项目 if(historyMoveState() != moveForward) { - logdebug("not moveForward move=%d", m_cg->move); + //logdebug("not moveForward move=%d", m_cg->move); return nullptr; } for(auto k = m_itemsAll.begin(); k != m_itemsAll.end(); k++) @@ -389,7 +390,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem() if(examItem->isFlagEnd()) { //已经考过,略过 - logdebug("exam already itemNo=%d.", itemEnter->itemNo()); + //logdebug("exam already itemNo=%d.", itemEnter->itemNo()); continue; } #endif diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp index 3a959e59..8a34692b 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.cpp @@ -38,6 +38,7 @@ ErrorCode ExamCarSub3::examBeginExam() // loginfo("exam-item xmdm=%d", item.xmdm); //} + m_disOffset = false; m_pub = TPubKM3(); std::string sError; if(!Init_KM3_Global(sError)) @@ -73,6 +74,7 @@ ErrorCode ExamCarSub3::examGoonExam() if(m_stuInfo.ddxk) { + m_disForward = m_stuInfo.yklc; //1、项目更改颜色 for(size_t i = 0; i < m_stuInfo.ykxm.size(); i++) { @@ -285,7 +287,7 @@ bool ExamCarSub3::Init_KM3_Global(std::string& sError) } else { - m_ctl.RtkOffset = 2; + m_ctl.RtkOffset = 0; //20240807 之前是2 } //2、强制启用139号部令 @@ -596,9 +598,7 @@ bool ExamCarSub3::Init_KM3_Global(std::string& sError) const TSystemparm* parm6 = TableSysParm->findParm6(itemNo); examItem->Item_Code = (parm6 != nullptr ? parm6->TXT2 : ""); examItem->Item_Color = itemStateWk; - examItem->NoID = (parm1->TXT3 != "" ? true : false); //20180508 免考 - - //logdebug("ItemNo=%d,NoID=%s,TXT3=%s", examItem->ItemNo, examItem->NoID ? "true":"false", parm1->TXT3.c_str()); + examItem->NoID = (parm1->TXT3 == "1" ? true : false); //20180508 免考 //systemparm表: NO1=1并且TXT3=1的是免考的 20240731 //加减挡免考 if(ksdd != siteof::chongqingkm3 && ksdd != siteof::jilinsongyuan && itemNo == Sub3ItemType14Jjdw) @@ -1183,37 +1183,15 @@ void ExamCarSub3::Deal_KM3_Judge() } } - m_pub.m_KsLjLc = m_stuInfo.yklc/100 + m_cg->ai_ljjl; - m_cg->tkCnt = GetCurrentTick2(); - m_cg->RTKKM3.CrossPointNo = lastCrossPtNo(); + dealOffset(); //ToDo1:执行通用评判 m_commItem->dealJudgeItem(); - //(*2024-03-06*) - //ExamItemCode mitemno = m_cg->real.sensor.mitemno; - //if(mitemno != 0) - //{ - // CallRenGongEnterItem(mitemno); - //} - - //240710 - //if(m_cg->real.sensor.rmndg == SYES) - //{ - // TKM3Item* item = findExamItem(Sub3ItemType41Mndg); - // if(item && item->TestPro == ItemProFlagIdle) - // { - // item->Item_Color = itemStateZk; - // item->TestPro = ItemProFlagInit; - // item->FinishFlag = false; - // //item->StartTime = GetCurrentTime2(); - // //item->EndTime = 0; - // //item->MsgData = ""; - // //createEventEnterItem({item->ItemNo, ""}); - // } - //} - m_curItem = nullptr; + + dealItemNoIDEnd14Jjdw(); //必须放这里 + dealItemNoIDEndItem(); //必须放这里 //执行具体的专项评判 std::string msg; for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) @@ -1336,6 +1314,17 @@ void ExamCarSub3::ClearRecord() RTKKM3.Wheel_RB_ToRightEdge = 0; RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr0; + + + //20240801 + RTKKM3.TouchLineDirCS = TRTKResult::TouchDir0; + RTKKM3.BackPointLaneNo = 0; + RTKKM3.BackPointLaneCount = 0; + RTKKM3.Body_RF_ToBaseLine = 0; + RTKKM3.Body_RB_ToBaseLine = 0; + + RTKKM3.DirInverse = 0; + RTKKM3.ShapeNoWheel = 0; } void ExamCarSub3::GetMeshIndex() @@ -1508,27 +1497,56 @@ bool ExamCarSub3::RTKLane() if(i > roadSize - 1) break; const TMapRoadRec* road = FactoryRoads->getRoad(i); - const Pointi& pt = m_cg->body.points_b[0]; //CarStatus.Body_24_RealTimePt[0]; + const Pointi& pt = m_cg->body.points_b[II(1)]; //CarStatus.Body_24_RealTimePt[0]; + const Pointi& ptBack = m_cg->body.points_b[II(13)]; for(int j = 0; j < road->LaneCount; j++) { const TModelPolygon& poly = road->Lanes[j]; if(poly.Pts.size() >= 5) { + bool flag1 = false; if(GpsMath::IsPtInArcLane(pt, poly)) { RTKKM3.FrontPointLaneNo = std::atoi(poly.LaneNo.c_str()); //共有几股车道 RTKKM3.FrontPointLaneCount = road->LaneCount; + flag1 = true; //break; + } + + bool flag2 = false; + if(GpsMath::IsPtInArcLane(ptBack, poly)) //20240801 yhy add + { + RTKKM3.BackPointLaneNo = std::atoi(poly.LaneNo.c_str()); + //共有几股车道 + RTKKM3.BackPointLaneCount = road->LaneCount; + flag2 = true; //break; + } + if(flag1 && flag2) + { break; } } else { + bool flag1 = false; if(GpsMath::IsPtInPoly(pt.x, pt.y, poly.Pts)) { RTKKM3.FrontPointLaneNo = std::atoi(poly.LaneNo.c_str()); //共有几股车道 RTKKM3.FrontPointLaneCount = road->LaneCount; + flag1 = true; //break; + } + + bool flag2 = false; + if(GpsMath::IsPtInPoly(ptBack.x, ptBack.y, poly.Pts)) //20240801 yhy add + { + RTKKM3.BackPointLaneNo = std::atoi(poly.LaneNo.c_str()); + //共有几股车道 + RTKKM3.BackPointLaneCount = road->LaneCount; + flag2 = true; //break; + } + if(flag1 && flag2) + { break; } } @@ -1538,7 +1556,7 @@ bool ExamCarSub3::RTKLane() //判断车轮压线类型 RTKKM3.TouchLineType = LineTag0; //2019-4-22 - RTKKM3.TouchDir = 0; + RTKKM3.TouchDir = TRTKResult::TouchDir0; for(int p = curRoadIndex - 1; p <= curRoadIndex + 1; p++) { if(p < 0 || p > roadSize - 1) continue; @@ -1851,6 +1869,7 @@ void ExamCarSub3::Calc_LaneDistance() const TMeshDefine* curMesh = FactoryMesh->getMesh(m_meshIndex); TASSERT_VOID(curMesh != nullptr, ""); + const TModelLine* laneDriving = nullptr; for(int p = 1; p <= 4; p++) { for(int i = curRoadIndex - 2; i <= curRoadIndex + 2; i++) @@ -1887,6 +1906,7 @@ void ExamCarSub3::Calc_LaneDistance() { if(p == 1) //1、车轮与本车道右侧距离 { + laneDriving = &road->BorderLines[0]; for(int k = 1; k <= 4; k++) { Pointi pt; @@ -1921,7 +1941,7 @@ void ExamCarSub3::Calc_LaneDistance() } else if(p == 2) //2:车轮与最右侧车道右侧距离 { - for(int k = 1; k <= 4; k++) + for(int k = 1; k <= 6; k++) { Pointi pt; switch(k) @@ -1930,6 +1950,8 @@ void ExamCarSub3::Calc_LaneDistance() case 2: pt = body.YQ_W_b; break; //CarStatus.CheLun_Wai_YQ_RealTime; case 3: pt = body.ZH_W_b; break; //CarStatus.CheLun_Wai_ZH_RealTime; case 4: pt = body.YH_W_b; break; //CarStatus.CheLun_Wai_YH_RealTime; + case 5: pt = body.points_b[RightBody1]; break; //20240801 + case 6: pt = body.points_b[RightBody2]; break; //20240801 default: break; } line.PtBegin = body.b1_b; // CarStatus.BasePoint1_RealTime; @@ -1948,6 +1970,8 @@ void ExamCarSub3::Calc_LaneDistance() case 2: RTKKM3.Wheel_RF_ToBaseLine = distance; break; case 3: RTKKM3.Wheel_LB_ToBaseLine = distance; break; case 4: RTKKM3.Wheel_RB_ToBaseLine = distance; break; + case 5: RTKKM3.Body_RF_ToBaseLine = distance; break; //20240801 + case 6: RTKKM3.Body_RB_ToBaseLine = distance; break; //20240801 default: break; } } @@ -2018,6 +2042,7 @@ void ExamCarSub3::Calc_LaneDistance() { if(p == 1) //1、车轮与本车道右侧距离 { + laneDriving = &road->BorderLines[0]; for(int k = 1; k <= 4; k++) { Pointi pt; @@ -2055,7 +2080,7 @@ void ExamCarSub3::Calc_LaneDistance() } else if(p == 2) //2:车轮与最右侧车道右侧距离 { - for(int k = 1; k <= 4; k++) + for(int k = 1; k <= 6; k++) { Pointi pt; switch(k) @@ -2064,6 +2089,8 @@ void ExamCarSub3::Calc_LaneDistance() case 2: pt = body.YQ_W_b; break; //CarStatus.CheLun_Wai_YQ_RealTime; case 3: pt = body.ZH_W_b; break; //CarStatus.CheLun_Wai_ZH_RealTime; case 4: pt = body.YH_W_b; break; //CarStatus.CheLun_Wai_YH_RealTime; + case 5: pt = body.points_b[RightBody1]; break; //20240801 + case 6: pt = body.points_b[RightBody2]; break; //20240801 default: break; } line.PtBegin = body.b1_b; @@ -2085,6 +2112,8 @@ void ExamCarSub3::Calc_LaneDistance() case 2: RTKKM3.Wheel_RF_ToBaseLine = distance; break; case 3: RTKKM3.Wheel_LB_ToBaseLine = distance; break; case 4: RTKKM3.Wheel_RB_ToBaseLine = distance; break; + case 5: RTKKM3.Body_RF_ToBaseLine = distance; break; //20240801 + case 6: RTKKM3.Body_RB_ToBaseLine = distance; break; //20240801 default: break; } } @@ -2155,17 +2184,22 @@ void ExamCarSub3::Calc_LaneDistance() } } } - } ///////////////////////////////////////////////////////////////////////// + } } } } } + + //计算是否逆向行驶1正向行驶 -1逆向行驶 + RTKKM3.DirInverse = driveDirection(laneDriving); + } //计算车身压线 void ExamCarSub3::Calc_CheShenYaXian() { TRTKResult& RTKKM3 = m_cg->RTKKM3; + int curLaneIndex = RTKKM3.LaneIndex; RTKKM3.TouchLineTypeCS = LineTag0; if(RTKKM3.MapRoadIndex == INVALID_INDEX) return; if(RTKKM3.LaneIndex == INVALID_INDEX) return; @@ -2178,7 +2212,7 @@ void ExamCarSub3::Calc_CheShenYaXian() poly.Pts[i] = ps[i]; } const TMapRoadRec* road = FactoryRoads->getRoad(RTKKM3.MapRoadIndex); - for(int i = RTKKM3.LaneIndex; i <= RTKKM3.LaneIndex + 1; i++) + for(int i = curLaneIndex; i <= curLaneIndex + 1; i++) { const TModelLine& line = road->BorderLines[i]; if(line.Radius == 0) @@ -2186,6 +2220,7 @@ void ExamCarSub3::Calc_CheShenYaXian() if(GpsMath::IsLineCrossPoly(line, poly)) { RTKKM3.TouchLineTypeCS = line.tag1; + RTKKM3.TouchLineDirCS = (i == curLaneIndex ? TRTKResult::TouchDir1 : TRTKResult::TouchDir_1); //20240801 yhy add break; } } @@ -2194,6 +2229,7 @@ void ExamCarSub3::Calc_CheShenYaXian() if(GpsMath::IsPolyCrossArc(poly, line)) { RTKKM3.TouchLineTypeCS = line.tag1; + RTKKM3.TouchLineDirCS = (i == curLaneIndex ? TRTKResult::TouchDir1 : TRTKResult::TouchDir_1); //20240801 yhy add break; } } @@ -2255,24 +2291,43 @@ void ExamCarSub3::RTKJudge_SubItem() if(curMesh->MapSubItemKeyLen == 0) return; TChuanGan* his = historyChuanGan(1); - //TASSERT_VOID(his != nullptr, ""); if(his == nullptr) return; - //if(CarStatus.Body_24_RealTimePt_LS[0].X = 0) and (CarStatus.Body_24_RealTimePt_LS[0].Y = 0) then Exit; TModelLine line; - line.PtBegin = m_cg->body.points_b[0]; //CarStatus.Body_24_RealTimePt[0].X; - line.PtEnd = his->body.points_b[0]; //CarStatus.Body_24_RealTimePt_LS[0].X; + line.PtBegin = m_cg->body.points_b[II(1)]; + line.PtEnd = his->body.points_b[II(1)]; + + //20240801 begin + TModelLine lineWF; + lineWF.PtBegin = GpsMath::calcCenterPoint(m_cg->body.ZQ_W_b, m_cg->body.YQ_W_b); + lineWF.PtEnd = GpsMath::calcCenterPoint(his->body.ZQ_W_b, his->body.YQ_W_b); + + //TModelLine lineWB; + //lineWB.PtBegin = GpsMath::calcCenterPoint(m_cg->body.ZH_W_b, m_cg->body.YH_W_b); + //lineWB.PtEnd = GpsMath::calcCenterPoint(his->body.ZH_W_b, his->body.YH_W_b); + + //TModelLine lineWZ; + //lineWZ.PtBegin = GpsMath::calcCenterPoint(m_cg->body.ZQ_W_b, m_cg->body.YQ_W_b); + //lineWZ.PtEnd = GpsMath::calcCenterPoint(m_cg->body.ZH_W_b, m_cg->body.YH_W_b); + + TModelPolygon polyW; + polyW.Pts.resize(4); + polyW.Pts[0] = m_cg->body.ZQ_W_b; + polyW.Pts[1] = m_cg->body.YQ_W_b; + polyW.Pts[2] = m_cg->body.YH_W_b; + polyW.Pts[3] = m_cg->body.ZH_W_b; + //20240801 end //车身24点 TModelPolygon poly1; - poly1.Pts.resize(24); //SetLength(TempPolygon1.Pts, 24); - for(int I = 0; I < 24; I++) + poly1.Pts.resize(24); + for(int i = 0; i < 24; i++) { - poly1.Pts[I] = m_cg->body.points_b[I]; + poly1.Pts[i] = m_cg->body.points_b[i]; } - for(int I = 0; I < curMesh->MapSubItemKeyLen; I++) + for(int i = 0; i < curMesh->MapSubItemKeyLen; i++) { //CrossLineAttr //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 - int idx = curMesh->MapSubItem_Keys[I]; + int idx = curMesh->MapSubItem_Keys[i]; const TMapSubItemRec* subItem = FactorySharps->getSharp(idx); SubNameTag subName = (SubNameTag)std::atoi(subItem->SubName.c_str()); int SNO = subItem->SNO; @@ -2283,65 +2338,83 @@ void ExamCarSub3::RTKJudge_SubItem() //如果subName=4 2个点关联的路口环岛线,外面几乎用不到,用于路口项目,不能读到这个路口环岛线,否则压扣分(Mark(5,'5'); if(subName == SubNameTag0) { + bool flag = false; if(GpsMath::IsCross(line, subItem->Line1)) { //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr1; RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = 0; m_pub.m_SNO = 0; - break; + flag = true; //break; + } + //20240801 + if(GpsMath::IsCross(lineWF, subItem->Line1)) + { + RTKKM3.ShapeNoWheel = SNO; + flag = true; //break; + } + if(flag) + { + break; } } else if(subName == SubNameTag1) //3个点关联 { + bool flag = false; if(GpsMath::IsCross(line, subItem->Line1)) { //0-未越线 1-停车线 2-中心点右侧线 3-等待控制线 20150119 RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr1; RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = SNO; m_pub.m_SNO = SNO; RTKKM3.CrossPoint = subItem->Point2; - const Pointi& p1 = subItem->Line3.PtBegin; const Pointi& p2 = subItem->Line3.PtEnd; - // Result := Round(SQRT(SQR(pt2.X - pt1.X) + SQR(pt2.Y - pt1.Y))); int x = p1.x - p2.x; int y = p1.y - p2.y; RTKKM3.CrossShapeLength = std::round(std::sqrt(x*x + y*y)); - break; + flag = true; //break; } + //20240801 + if(GpsMath::IsCross(lineWF, subItem->Line1)) + { + RTKKM3.ShapeNoWheel = SNO; + flag = true; //break; + } + if(m_pub.m_SNO == SNO) //RTKKM3.LS_ShapeNo == SNO { if(GpsMath::IsCross(line, subItem->Line3)) { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr2; //中心点右侧 RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = 0; m_pub.m_SNO = 0; } else if(GpsMath::IsCross(line, subItem->Line2)) { - //RTKKM3.LS_ShapeNo = 0; m_pub.m_SNO = 0; } const Pointi& p1 = RTKKM3.CrossPoint; - const Pointi& p2 = m_cg->body.b1_b; //CarStatus.BasePoint1_RealTime; + const Pointi& p2 = m_cg->body.b1_b; int x = p1.x - p2.x; int y = p1.y - p2.y; - int dis = std::round(std::sqrt(x*x + y*y)); //TempDis = Round(SQRT(SQR(TempPt1.X - TempPt2.X) + SQR(TempPt1.Y - TempPt2.Y))); + int dis = std::round(std::sqrt(x*x + y*y)); if(dis > RTKKM3.CrossShapeLength * 3) //3--6 20170924 { - //RTKKM3.LS_ShapeNo = 0; m_pub.m_SNO = 0; } } + + if(flag) + { + break; + } } else if(subName == SubNameTag2) //4个点关联 { + bool flag = false; //SubName=2,4个点关联的,比如:斑马线、公交站台 //ItemNo:6 斑马线,4个点关联 (需要减速、不能停车、夜考的时候,需要远近光灯交替) //ItemNo:53 黄色网格线(类似公交站台),禁止停车 - const Pointi& p = m_cg->body.b1_b; // CarStatus.BasePoint1_RealTime; + const Pointi& p = m_cg->body.b1_b; const TModelPolygon& poly2 = subItem->Polygon; if(GpsMath::IsIntersect(poly1, poly2) || GpsMath::IsPtInPoly(p.x, p.y, poly2.Pts)) { @@ -2350,32 +2423,55 @@ void ExamCarSub3::RTKJudge_SubItem() { RTKKM3.InShapeAttr = TRTKResult::InShapeAttr1; //0-不在形状里 1-在人行道内 2-在网格线内 RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = 0; } else if(itemNo == ItemNoTag53) //黄色网格线 { RTKKM3.InShapeAttr = TRTKResult::InShapeAttr2; RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = 0; } - break; + flag = true; //break; + } + + //20240801 + if(GpsMath::IsIntersect(polyW, poly2) + || GpsMath::IsPtInPoly(polyW.Pts[0], poly2.Pts) + || GpsMath::IsPtInPoly(polyW.Pts[1], poly2.Pts) + || GpsMath::IsPtInPoly(polyW.Pts[2], poly2.Pts) + || GpsMath::IsPtInPoly(polyW.Pts[3], poly2.Pts)) + { + RTKKM3.ShapeNoWheel = SNO; + flag = true; //break; + } + if(flag) + { + break; } } - else if(subName == SubNameTag3) //2个点关联的等待控制线 + else if(subName == SubNameTag3) //2个点关联的等待控制线 (深圳,在这个线上,处理特殊的等待业务) { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr3; RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = 0; + RTKKM3.ShapeNoWheel = SNO; //20240801 break; } else if(subName == SubNameTag4) //2个点关联的路口环岛线,外面几乎用不到,用于路口项目,不能读到这个路口环岛线,否则压扣分(Mark(5,'5'); { + bool flag = false; if(GpsMath::IsLineCrossPoly(subItem->Line1, poly1)) { RTKKM3.CrossLineAttr = TRTKResult::CrossLineAttr4; RTKKM3.ShapeNo = SNO; - //RTKKM3.LS_ShapeNo = 0; - break; + flag = true; //break; + } + //20240801 + if(GpsMath::IsLineCrossPoly(subItem->Line1, polyW)) + { + RTKKM3.ShapeNoWheel = SNO; + flag = true; //break; + } + if(flag) + { + break; } } } @@ -3311,234 +3407,246 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo) //线路不允许为空 if(m_stuInfo.wayno <= 0) return; //1、查找项目信息 - const TMap_Point_Item* mapPointItem = TableMapPointItem->findMapPointItem(crossPointNo); - if(nullptr == mapPointItem) return; - ExamItemCode readItemNo = mapPointItem->itemno; + const std::vector mapPointItems = TableMapPointItem->findMapPointItem(crossPointNo); - //2、查找通用参数 - const TSystemparm* parm1 = TableSysParm->findParm1(readItemNo); - if(nullptr == parm1) return; - const std::string& TXT2 = parm1->TXT2; - - //3、得到通用的参数 - TKM3Item* readItem = findExamItem(readItemNo); - if(nullptr == readItem) return; - TKM3Item KM3Item = *readItem; - - //4、得到当前的子项目(比如:通过路口,一般有3个测绘点,那么序号就是1,2,3 中的1个) - //下面这个信息非常重要 - KM3Item.Gps_Itemno1 = mapPointItem->itemno1; - //中途进复合项目时(直线行驶),不进项目 - //***注释掉用不到了 - //{ - // if(KM3Item.ItemNo == Sub3ItemType03Zxxs && KM3Item.Gps_Itemno1 != 1) - // { - // return; - // } - // //南京的路口项目特殊处理 - // const std::string ksdd = TableSysSet->getSysSet211(); - // if(ksdd == siteof::nj && KM3Item.ItemNo == Sub3ItemType05Lkzx && KM3Item.Gps_Itemno1 != 1) - // { - // return; - // } - //} - - //靠边停车项目特殊处理 - //免考项目 - //靠边停车免考项目处理 - if(KM3Item.ItemNo == Sub3ItemType11Kbtc) + for(size_t i = 0; i < mapPointItems.size(); i++) { - const std::string& s319 = TableSysSet->get319(); - //SysSet[319]: 1:必须达到里程,才能进入靠边停车 - //SysSet[319]: 2:必须达到里程,并且完成必考项目。才能进入靠边停车 - if(s319 == "1" && m_pub.m_KsLjLc < m_car.XSJL) return; - if(s319 == "2") + const TMap_Point_Item* mapPointItem= mapPointItems[i]; + + if(nullptr == mapPointItem) return; + ExamItemCode readItemNo = mapPointItem->itemno; + + //2、查找通用参数 + const TSystemparm* parm1 = TableSysParm->findParm1(readItemNo); + if(nullptr == parm1) return; + const std::string& TXT2 = parm1->TXT2; + + //3、得到通用的参数 + TKM3Item* readItem = findExamItem(readItemNo); + if(nullptr == readItem) return; + TKM3Item KM3Item = *readItem; + + //4、得到当前的子项目(比如:通过路口,一般有3个测绘点,那么序号就是1,2,3 中的1个) + //下面这个信息非常重要 + KM3Item.Gps_Itemno1 = mapPointItem->itemno1; + //中途进复合项目时(直线行驶),不进项目 + //***注释掉用不到了 + //{ + // if(KM3Item.ItemNo == Sub3ItemType03Zxxs && KM3Item.Gps_Itemno1 != 1) + // { + // return; + // } + // //南京的路口项目特殊处理 + // const std::string ksdd = TableSysSet->getSysSet211(); + // if(ksdd == siteof::nj && KM3Item.ItemNo == Sub3ItemType05Lkzx && KM3Item.Gps_Itemno1 != 1) + // { + // return; + // } + //} + + //靠边停车项目特殊处理 + //免考项目 + //靠边停车免考项目处理 + if(KM3Item.ItemNo == Sub3ItemType11Kbtc) { - if(m_pub.m_KsLjLc < m_car.XSJL) return; - bool unfinished = false; - for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) + const std::string& s319 = TableSysSet->get319(); + //SysSet[319]: 1:必须达到里程,才能进入靠边停车 + //SysSet[319]: 2:必须达到里程,并且完成必考项目。才能进入靠边停车 + if(s319 == "1") { - const TKM3Item* item = it->second->getExamItem(); - if(item->NoID == false) - { - if(item->FinishFlag == false) - { - unfinished = true; - break; - } - if(item->Item_Color == itemStateWk || item->Item_Color == itemStateZk) - { - unfinished = true; - break; - } - } - else - { - if(item->Item_Color == itemStateZk) - { - unfinished = true; - } - } + if(!isMileage()) return; } - if(unfinished == true) return; - } - } - - KM3Item.SubName = mapPointItem->subname; - KM3Item.ItemSNO = KM3Item.SubName != "" ? std::to_string(readItemNo) + '~' + mapPointItem->subname : - std::to_string(readItemNo) + '~' + std::to_string(crossPointNo); //如果项目,只有1个项目点 - - std::vector val = Tools::split(TXT2, "^"); - int size = val.size(); - KM3Item.SetUp1 = (size > II(1) ? val[II(1)] : ""); //GetDotStr(1, TempTXT2, '^'); - KM3Item.SetUp2 = (size > II(2) ? val[II(2)] : ""); //GetDotStr(2, TempTXT2, '^'); - KM3Item.SetUp3 = (size > II(3) ? val[II(3)] : ""); //GetDotStr(3, TempTXT2, '^'); - KM3Item.SetUp4 = (size > II(4) ? val[II(4)] : ""); //GetDotStr(4, TempTXT2, '^'); - KM3Item.SetUp5 = (size > II(5) ? val[II(5)] : ""); //GetDotStr(5, TempTXT2, '^'); - KM3Item.SetUp6 = (size > II(6) ? val[II(6)] : ""); //GetDotStr(6, TempTXT2, '^'); - KM3Item.SetUp7 = (size > II(7) ? val[II(7)] : ""); //GetDotStr(7, TempTXT2, '^'); - KM3Item.SetUp8 = (size > II(8) ? val[II(8)] : ""); //GetDotStr(8, TempTXT2, '^'); - //下面这个参数可以忽略了 - //KM3Item.SetUp9 := IntToStr(Tds.Items[ItemIndex].Item_Color); - //从systemparm.no1=8表中取个性化的项目参数(如果有) qssf 2010-6-28 - KM3Item.Txt2 = ""; - KM3Item.Txt3 = ""; - const TSystemparm* parm8 = TableSysParm->findParm8(KM3Item.ItemSNO); - if(nullptr != parm8) - { - KM3Item.Txt2 = parm8->TXT2; - KM3Item.Txt3 = parm8->TXT3; - } - - int multiPosI = INVALID_INDEX; - bool multiFlag = false; - //如果是通过路口项目 - if(KM3Item.ItemNo == Sub3ItemType05Lkzx) //通过路口 - { - multiFlag = false; - std::string detail, dir, parm; - if(!FactoryMesh->GetLuKouInfo_New(m_stuInfo.wayno, KM3Item.ItemSNO, detail, dir, parm, multiPosI)) - return; - if(detail == "") return; - if(parm == "") parm = "0"; - - std::vector val = Tools::split(detail , ","); - KM3Item.SetUp1 = val[II(1)]; //SetUp1:路口类型 1:平交 2:环岛 - KM3Item.SetUp3 = val[II(2)] + "-" + parm; //正确方向项目点-方向值-停车让行标志 //20170729 增加停车让行标记 - KM3Item.SetUp4 = val[II(3)]; //方向文字描述,比如:左转 - //KM3Item.SetUp9 := IntToStr(Tds.Items[ItemIndex].Item_Color); - } - - //下面这个规则,原封不动翻译即可。 - int ItemNo = KM3Item.ItemNo; - if(KM3Item.ItemNo == Sub3ItemType05Lkzx) - { - std::vector setup3 = Tools::split(KM3Item.SetUp3 + "-", "-"); - const std::string& type = setup3.size() > II(2) ? setup3[II(2)] : ""; - if (type == "1") ItemNo = Sub3ItemType16Lkyz; - else if(type == "3") ItemNo = Sub3ItemType15Lkzz; - else if(type == "4") ItemNo = Sub3ItemType12Dtxx; //掉头 - //(*2024-03-05*) - if(KM3Item.Gps_Itemno1 != 1) - { - TKM3Item* item = findExamItem(ItemNo); - if(item && item->TestPro == ItemProFlagIdle) + if(s319 == "2") { - return; - } - } - } - - //(*2024-03-05*) - if(KM3Item.ItemNo == Sub3ItemType03Zxxs) - { - if(KM3Item.Gps_Itemno1 != 1) - { - TKM3Item* item = findExamItem(ItemNo); - if(item && item->TestPro == ItemProFlagIdle) - { - return; - } - } - } - - //(*2024-03-06*) - if(!If_EnterItem(ItemNo)) return; - - //15:左转弯 16:右转弯 - std::string itemSNO = std::to_string(KM3Item.ItemNo) + "~" + KM3Item.SubName; - bool success = IsValid_Km3NewEnterItem(ItemNo, itemSNO); - if(success) //20150910 - { - const std::string& s373 = TableSysSet->get373(); - if((s373 != "1") || (s373 == "1" && (isExamDrill() || isQualified() || (KM3Item.ItemNo == Sub3ItemType05Lkzx || KM3Item.ItemNo == Sub3ItemType69Xxxx)))) - { - if(KM3Item.ItemNo != Sub3ItemType05Lkzx) - { - KM3Item.EnterItemFromLuKou5 = false; - } - else //路口项目 - { - KM3Item.EnterItemFromLuKou5 = true; - - //if(MultiFlag == true) //通过路口 - //{ - if(multiPosI >= 0) + if(!isMileage()) return; + bool unfinished = false; + for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) { - //Arr_Systemparm4[MultiPosI].Muliti_EnterFlag = true; - const TSystemparm* parm4 = TableSysParm->parm4By(multiPosI); - TASSERT(parm4 != nullptr, ""); - parm4->Muliti_EnterFlag = true; - } - //} - - //下面这段代码好像是废代码,没用? yhy 2-24-03-04 - if(ItemNo == Sub3ItemType16Lkyz || ItemNo == Sub3ItemType15Lkzz || ItemNo == Sub3ItemType12Dtxx) //右转 - { - readItem = findExamItem(ItemNo); - if(nullptr != readItem) + const TKM3Item* item = it->second->getExamItem(); + if(item->NoID == false) { - TASSERT(readItem->ItemNo = ItemNo, ""); - KM3Item.ItemNo = ItemNo; + if(item->FinishFlag == false) + { + unfinished = true; + break; + } + if(item->Item_Color == itemStateWk || item->Item_Color == itemStateZk) + { + unfinished = true; + break; + } } else { - TASSERT(false, ""); + if(item->Item_Color == itemStateZk) + { + unfinished = true; + break; + } } } + if(unfinished == true) return; } + } - readItem->Gps_Itemno1 = KM3Item.Gps_Itemno1; - readItem->EnterItemFromLuKou5 = KM3Item.EnterItemFromLuKou5; + KM3Item.SubName = mapPointItem->subname; + KM3Item.ItemSNO = KM3Item.SubName != "" ? std::to_string(readItemNo) + '~' + mapPointItem->subname : + std::to_string(readItemNo) + '~' + std::to_string(crossPointNo); //如果项目,只有1个项目点 - if(readItem->TestPro != ItemProFlagJudge) + std::vector val = Tools::split(TXT2, "^"); + int size = val.size(); + KM3Item.SetUp1 = (size > II(1) ? val[II(1)] : ""); //GetDotStr(1, TempTXT2, '^'); + KM3Item.SetUp2 = (size > II(2) ? val[II(2)] : ""); //GetDotStr(2, TempTXT2, '^'); + KM3Item.SetUp3 = (size > II(3) ? val[II(3)] : ""); //GetDotStr(3, TempTXT2, '^'); + KM3Item.SetUp4 = (size > II(4) ? val[II(4)] : ""); //GetDotStr(4, TempTXT2, '^'); + KM3Item.SetUp5 = (size > II(5) ? val[II(5)] : ""); //GetDotStr(5, TempTXT2, '^'); + KM3Item.SetUp6 = (size > II(6) ? val[II(6)] : ""); //GetDotStr(6, TempTXT2, '^'); + KM3Item.SetUp7 = (size > II(7) ? val[II(7)] : ""); //GetDotStr(7, TempTXT2, '^'); + KM3Item.SetUp8 = (size > II(8) ? val[II(8)] : ""); //GetDotStr(8, TempTXT2, '^'); + //下面这个参数可以忽略了 + //KM3Item.SetUp9 := IntToStr(Tds.Items[ItemIndex].Item_Color); + //从systemparm.no1=8表中取个性化的项目参数(如果有) qssf 2010-6-28 + KM3Item.Txt2 = ""; + KM3Item.Txt3 = ""; + const TSystemparm* parm8 = TableSysParm->findParm8(KM3Item.ItemSNO); + if(nullptr != parm8) + { + KM3Item.Txt2 = parm8->TXT2; + KM3Item.Txt3 = parm8->TXT3; + } + + int multiPosI = INVALID_INDEX; + bool multiFlag = false; + //如果是通过路口项目 + if(KM3Item.ItemNo == Sub3ItemType05Lkzx) //通过路口 + { + multiFlag = false; + std::string detail, dir, parm; + if(!FactoryMesh->GetLuKouInfo_New(m_stuInfo.wayno, KM3Item.ItemSNO, detail, dir, parm, multiPosI)) + return; + if(detail == "") return; + if(parm == "") parm = "0"; + + std::vector val = Tools::split(detail , ","); + KM3Item.SetUp1 = val[II(1)]; //SetUp1:路口类型 1:平交 2:环岛 + KM3Item.SetUp3 = val[II(2)] + "-" + parm; //正确方向项目点-方向值-停车让行标志 //20170729 增加停车让行标记 + KM3Item.SetUp4 = val[II(3)]; //方向文字描述,比如:左转 + //KM3Item.SetUp9 := IntToStr(Tds.Items[ItemIndex].Item_Color); + } + + //下面这个规则,原封不动翻译即可。 + int ItemNo = KM3Item.ItemNo; + if(KM3Item.ItemNo == Sub3ItemType05Lkzx) + { + std::vector setup3 = Tools::split(KM3Item.SetUp3 + "-", "-"); + const std::string& type = setup3.size() > II(2) ? setup3[II(2)] : ""; + if (type == "1") ItemNo = Sub3ItemType16Lkyz; + else if(type == "3") ItemNo = Sub3ItemType15Lkzz; + else if(type == "4") ItemNo = Sub3ItemType12Dtxx; //掉头 + //(*2024-03-05*) + if(KM3Item.Gps_Itemno1 != 1) { - readItem->SetUp1 = KM3Item.SetUp1; - readItem->SetUp2 = KM3Item.SetUp2; - readItem->SetUp3 = KM3Item.SetUp3; - readItem->SetUp4 = KM3Item.SetUp4; - readItem->SetUp5 = KM3Item.SetUp5; - readItem->SetUp6 = KM3Item.SetUp6; - readItem->SetUp7 = KM3Item.SetUp7; - readItem->SetUp8 = KM3Item.SetUp8; - //Tds.Items[ItemIndex].SetUp9 := KM3Item.SetUp9; - readItem->Txt2 = KM3Item.Txt2; - readItem->Txt3 = KM3Item.Txt3; - readItem->SubName = KM3Item.SubName; - readItem->ItemSNO = KM3Item.ItemSNO; - readItem->GPS_e = std::round(m_cg->real.gps.jd * 1000000.0); - readItem->GPS_n = std::round(m_cg->real.gps.wd * 1000000.0); - - int c = readItem->Item_Color; - if(c == itemStateWk || ((c == itemStateHg || c == itemStateBhg) && readItem->FinishFlag == true)) + //continue; //20240809 + TKM3Item* item = findExamItem(ItemNo); + if(item && item->TestPro == ItemProFlagIdle) { - readItem->Item_Color = itemStateZk; - readItem->TestPro = ItemProFlagInit; - readItem->FinishFlag = false; - //readItem->StartTime = GetCurrentTime2(); - //readItem->EndTime = 0; - //readItem->MsgData = ""; - //createEventEnterItem({readItem->ItemNo, ""}); + return; + } + } + } + + //(*2024-03-05*) + if(KM3Item.ItemNo == Sub3ItemType03Zxxs) + { + if(KM3Item.Gps_Itemno1 != 1) + { + //continue; //20240809 + TKM3Item* item = findExamItem(ItemNo); + if(item && item->TestPro == ItemProFlagIdle) + { + return; + } + } + } + + //(*2024-03-06*) + if(!If_EnterItem(ItemNo)) return; + + //15:左转弯 16:右转弯 + std::string itemSNO = std::to_string(KM3Item.ItemNo) + "~" + KM3Item.SubName; + bool success = IsValid_Km3NewEnterItem(ItemNo, itemSNO); + if(success) //20150910 + { + const std::string& s373 = TableSysSet->get373(); + if((s373 != "1") || (s373 == "1" && (isExamDrill() || isQualified() || (KM3Item.ItemNo == Sub3ItemType05Lkzx || KM3Item.ItemNo == Sub3ItemType69Xxxx)))) + { + if(KM3Item.ItemNo != Sub3ItemType05Lkzx) + { + KM3Item.EnterItemFromLuKou5 = false; + } + else //路口项目 + { + KM3Item.EnterItemFromLuKou5 = true; + + //if(MultiFlag == true) //通过路口 + //{ + if(multiPosI >= 0) + { + //Arr_Systemparm4[MultiPosI].Muliti_EnterFlag = true; + const TSystemparm* parm4 = TableSysParm->parm4By(multiPosI); + TASSERT(parm4 != nullptr, ""); + parm4->Muliti_EnterFlag = true; + } + //} + + //下面这段代码好像是废代码,没用? yhy 2-24-03-04 + if(ItemNo == Sub3ItemType16Lkyz || ItemNo == Sub3ItemType15Lkzz || ItemNo == Sub3ItemType12Dtxx) //右转 + { + readItem = findExamItem(ItemNo); + if(nullptr != readItem) + { + TASSERT(readItem->ItemNo = ItemNo, ""); + KM3Item.ItemNo = ItemNo; + } + else + { + TASSERT(false, ""); + } + } + } + + readItem->Gps_Itemno1 = KM3Item.Gps_Itemno1; + readItem->EnterItemFromLuKou5 = KM3Item.EnterItemFromLuKou5; + + if(readItem->TestPro != ItemProFlagJudge) + { + readItem->SetUp1 = KM3Item.SetUp1; + readItem->SetUp2 = KM3Item.SetUp2; + readItem->SetUp3 = KM3Item.SetUp3; + readItem->SetUp4 = KM3Item.SetUp4; + readItem->SetUp5 = KM3Item.SetUp5; + readItem->SetUp6 = KM3Item.SetUp6; + readItem->SetUp7 = KM3Item.SetUp7; + readItem->SetUp8 = KM3Item.SetUp8; + //Tds.Items[ItemIndex].SetUp9 := KM3Item.SetUp9; + readItem->Txt2 = KM3Item.Txt2; + readItem->Txt3 = KM3Item.Txt3; + readItem->SubName = KM3Item.SubName; + readItem->ItemSNO = KM3Item.ItemSNO; + readItem->GPS_e = std::round(m_cg->real.gps.jd * 1000000.0); + readItem->GPS_n = std::round(m_cg->real.gps.wd * 1000000.0); + + int c = readItem->Item_Color; + if(c == itemStateWk || ((c == itemStateHg || c == itemStateBhg) && readItem->FinishFlag == true)) + { + readItem->Item_Color = itemStateZk; + readItem->TestPro = ItemProFlagInit; + readItem->FinishFlag = false; + //readItem->StartTime = GetCurrentTime2(); + //readItem->EndTime = 0; + //readItem->MsgData = ""; + //createEventEnterItem({readItem->ItemNo, ""}); + } } } } @@ -3746,8 +3854,7 @@ bool ExamCarSub3::KM3AllPass() //里程不够 if(isQualified()) //当前是合格的 { - int s336 = TableSysSet->asInt336(); - if(m_pub.m_KsLjLc + s336 < m_car.XSJL) + if(!isMileage()) //里程不够 { return false; } @@ -3767,7 +3874,7 @@ bool ExamCarSub3::KM3AllPass() } //科目三项目结束,免考项目处理 //重要流程 - if(item->NoID == true) + if(item->NoID == true) //20240731 { if(item->FinishFlag == false) { @@ -3980,7 +4087,7 @@ bool ExamCarSub3::examMarkItem(int itemNo, const std::string& serial, bool once, (itemNo == Sub3ItemType04Bgcd && serial == "43") ) { if(m_cg->ai_ljjl < 500) return result; - if(m_pub.m_KsLjLc + TableSysSet->asInt336() >= m_car.XSJL) return result; + if(isMileage()) return result; } } @@ -4496,3 +4603,96 @@ bool ExamCarSub3::itemsSomeExaming2(ExamItemCode itemno) const TKM3Item* item = findExamItem(itemno); return item && (item->TestPro == ItemProFlagInit || item->TestPro == ItemProFlagJudge); } + +bool ExamCarSub3::isMileage() const +{ + return m_pub.m_KsLjLc > m_car.XSJL; +} + +void ExamCarSub3::dealOffset() +{ + m_pub.m_KsLjLc = m_cg->ai_ljjl; + m_cg->tkCnt = GetCurrentTick2(); + m_cg->RTKKM3.CrossPointNo = lastCrossPtNo(); + + int s336 = TableSysSet->asInt336(); + if(m_disOffset == false && s336 > 0 && m_pub.m_KsLjLc + s336 >= m_car.XSJL) + { + m_disOffset = true; + m_disForward += (s336*100); //基础里程设置补偿 + m_cg->ai_ljjl_cm = m_disForward; + m_cg->ai_ljjl = m_disForward/100.0; + m_pub.m_KsLjLc = m_cg->ai_ljjl; + } +} + +void ExamCarSub3::dealItemNoIDEndItem() +{ + if(isMileage()) + { + for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++) + { + TKM3Item* item = it->second->getExamItem(); + if(item->NoID == true && item->ItemNo != Sub3ItemType14Jjdw) //20240731 + { + if(item->FinishFlag == false) + { + KM3EndItem(item->ItemNo); + } + } + } + } +} + +void ExamCarSub3::dealItemNoIDEnd14Jjdw() +{ + TKM3Item* item14 = findExamItem(Sub3ItemType14Jjdw); //20240731 + if(item14 && item14->NoID == true) //免考加减挡的 即:全程加减档 + { + if(item14->Item_Color == itemStateWk) + { + TTestCtl* ctl = getTTestCtl(); + if(ctl->dw_kf_sj == 1) //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前 + { + if(isMileage()) + { + //ToDo1:生成 全程加减挡 进项目事件 + //createEventEnterItem({item14->ItemNo, ""}); + KM3EndItem(item14->ItemNo); + } + } + else + { + TKM3Item* item = findExamItem(Sub3ItemType11Kbtc); + if(item && item->TestPro == ItemProFlagInit) + { + //ToDo1:生成 全程加减挡 进项目事件 + //createEventEnterItem({item14->ItemNo, ""}); + KM3EndItem(item14->ItemNo); + } + } + } + } +} + +DriveDirType ExamCarSub3::driveDirection(const TModelLine* lane) +{ + //ptBegin 车道线起始点 + //ptEnd 车道线起终点点 + //double angle1 = GpsMath::getAngle(lane->PtBegin, lane->PtEnd); + //double angle2 = GpsMath::getAngle(m_cg->body.points_b[II(13)], m_cg->body.points_b[II(1)]); + double a1 = GpsMath::GetAngle_HQ(lane->PtBegin, lane->PtEnd, -1); + double a2 = GpsMath::GetAngle_HQ(m_cg->body.points_b[II(13)], m_cg->body.points_b[II(1)], -1); + + DriveDirType dir = DriveDirX; + int angle = ((int)std::round(a1 - a2) + 360) % 360; + if(angle < 60 || angle > 300) + { + dir = DriveDirY; + } + else if(angle < 240 && angle > 120) + { + dir = DriveDirN; + } + return dir; +} diff --git a/entry/src/main/cpp/sdk/exam/ExamCarSub3.h b/entry/src/main/cpp/sdk/exam/ExamCarSub3.h index b96a6e99..924cc3a3 100644 --- a/entry/src/main/cpp/sdk/exam/ExamCarSub3.h +++ b/entry/src/main/cpp/sdk/exam/ExamCarSub3.h @@ -49,6 +49,9 @@ public: //for IExamCarSub3 override virtual bool isExamAlready(ExamItemCode ItemNo) const override { return m_ctl.PassedItem.find(ItemNo) != m_ctl.PassedItem.end();}; + virtual bool isMileage() const override; + + virtual TCar* getTCar() override { return &m_car; } virtual TTestCtl* getTTestCtl() override { return &m_ctl; } @@ -73,6 +76,14 @@ public: //for IExamCarSub3 override virtual bool getyjdg_road_code_kf() const override { return m_pub.yjdg_road_code_kf; } protected: + void dealOffset(); //行驶距离补偿 + + void dealItemNoIDEndItem(); + void dealItemNoIDEnd14Jjdw(); + + //行驶方向,1正向行驶,-1逆向行驶 + DriveDirType driveDirection(const TModelLine* lane); + bool Init_KM3_Global(std::string& sError); void UpdateCarParmWithSystemParm(); bool Init_KM3_Special(); @@ -160,6 +171,7 @@ private: int E_1Deg2Cm = 0; //经度1度=多少厘米 const int N_1Deg2Cm = 11110792; //北纬1度=X cm + bool m_disOffset = false; //TCarStatus m_carStatus; //int64 m_ContinuedStartTime = 0; //续考的上次开始考试时间 20150205 diff --git a/entry/src/main/cpp/sdk/exam/ExamSensor.cpp b/entry/src/main/cpp/sdk/exam/ExamSensor.cpp index a1f50659..6639c599 100644 --- a/entry/src/main/cpp/sdk/exam/ExamSensor.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamSensor.cpp @@ -175,6 +175,15 @@ bool ExamSensor::convertDatas(TChuanGan* cg) TGpsInfo& gps = cg->real.gps; gps.errorFlag = true; + + //测试是否逆向行驶 + //static int s_count = 0; + //int ny = s_count++ % 10; + //if(ny < 5) + //{ + // gps.hxj += 180.0; + //} + //航向角(默认是按诺瓦泰的数据格式定义的,所以要加上180度) 1:天宝(北云)/C1 2:诺瓦泰 if(gps.bklx == boardTypeTB) { @@ -290,15 +299,16 @@ bool ExamSensor::calcCarBody(TChuanGan* cg) int x = 0, y = 0; GpsMath::calcEastAndNorthDistanceCM(m_basePoint, ps[II(33)], m_basePoint.gc, x, y); - if(cg->real.gps.rtkEnabled) + TGpsInfo& gps = cg->real.gps; + if(gps.rtkEnabled && gps.jd > 1 && gps.wd > 1) { - cg->real.gps.ai_gps = Pointi(x, y); + gps.ai_gps = Pointi(x, y); } else { if(m_car->historyCount() > 0) { - cg->real.gps.ai_gps = m_car->historyAiGps(); //20240702 yhy + gps.ai_gps = m_car->historyAiGps(); //20240702 yhy //return false; //这里不能返回false 第一帧数据就是非差分状态?如果做模拟灯光的时候一直没差分进不了项目了 } } diff --git a/entry/src/main/cpp/sdk/exam/ExamService.cpp b/entry/src/main/cpp/sdk/exam/ExamService.cpp index 4e58164b..3b17cfd1 100644 --- a/entry/src/main/cpp/sdk/exam/ExamService.cpp +++ b/entry/src/main/cpp/sdk/exam/ExamService.cpp @@ -45,7 +45,8 @@ int ExamService::examJudgeInit(const char* data, int len) //logdebug("MemorySpace [spaceTotal=%lld MB] [spaceFree=%lld MB], [spaceAvailable=%lld MB], [spaceSelf=%lld MB]", // space.spaceTotal, space.spaceFree, space.spaceAvailable, space.spaceSelf); - logdebug("call examJudgeInit."); + //logdebug("call examJudgeInit."); + logtrace("exam-init version=%s.", JUDGE_VERSION_INFO); if(m_init) { //已经初始化过了,不能重复初始化 @@ -105,7 +106,7 @@ int ExamService::examJudgeInit(const char* data, int len) return QE(code); } m_init = true; - loginfo("exam-init success version=%s.", JUDGE_VERSION_INFO); + logtrace("exam-init success kchp=%s,kchm=%d,kscx=%s.", m_initInfo->kchp.c_str(), m_initInfo->kchm, m_initInfo->kscx.c_str()); return QE(codeSuccess); } diff --git a/entry/src/main/cpp/sdk/exam/IExamCar.cpp b/entry/src/main/cpp/sdk/exam/IExamCar.cpp index 99718481..9176dc27 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCar.cpp +++ b/entry/src/main/cpp/sdk/exam/IExamCar.cpp @@ -43,6 +43,7 @@ int IExamCar::examJudgeBeginExam(const char* data, int len) { HELP_COST_TIME(""); IAutoLock(m_mtx); + logtrace("begin-exam version=%s", JUDGE_VERSION_INFO); if(m_examState != examStateEnd) { logerror("error begin exam not end."); @@ -489,17 +490,17 @@ void IExamCar::doExamDatagram(Package* pkg) } -void IExamCar::calcDistance() +int IExamCar::calcDistance() { if(m_history->size() <= 1) { - return; + return 0; } const Pointi& h = historyAiGps(1); const Pointi& c = historyAiGps(); if( (c.x == 0 && c.y == 0) || (h.x == 0 && h.y == 0) ) { - return; + return 0; } double x = h.x - c.x; double y = h.y - c.y; @@ -517,11 +518,12 @@ void IExamCar::calcDistance() if(m_cg->move == moveForward) { - int gear = m_cg->real.sensor.dw; + int gear = m_cg->real.sensor.dw; //只有科三用到 m_disGears[gear] += a; } //logdebug("move=%d,dis=%dCM", state, a); + return a; } int64 IExamCar::GetCurrentTime2() const diff --git a/entry/src/main/cpp/sdk/exam/IExamCar.h b/entry/src/main/cpp/sdk/exam/IExamCar.h index 5cf63449..6b24df0f 100644 --- a/entry/src/main/cpp/sdk/exam/IExamCar.h +++ b/entry/src/main/cpp/sdk/exam/IExamCar.h @@ -127,7 +127,7 @@ public: //执行处理每一帧的GPS传感数据 virtual void doExamDatagram(Package* pkg); //前进 后退 距离计算 - virtual void calcDistance(); + virtual int calcDistance(); //当前系统时间(回放取的事GPS时间) virtual int64 GetCurrentTime2() const; @@ -219,6 +219,8 @@ public: virtual bool itemsSomeExaming2(ExamItemCode itemno) const = 0; //是否已考 virtual bool isExamAlready(ExamItemCode ItemNo) const = 0; + //里程是否满足 + virtual bool isMileage() const = 0; //获取TCar diff --git a/entry/src/main/cpp/sdk/graphic/GraphicImage.h b/entry/src/main/cpp/sdk/graphic/GraphicImage.h index ebb1ae16..33a579c2 100644 --- a/entry/src/main/cpp/sdk/graphic/GraphicImage.h +++ b/entry/src/main/cpp/sdk/graphic/GraphicImage.h @@ -70,7 +70,7 @@ private: const int m_channel = 4; const unsigned char m_default = 255; //默认底色 白色 bool m_showVersion = true; - bool m_showTime = false; + bool m_showTime = true; }; diff --git a/entry/src/main/cpp/sdk/judge/HJudgeItem.h b/entry/src/main/cpp/sdk/judge/HJudgeItem.h index 92be9c96..dd369b9b 100644 --- a/entry/src/main/cpp/sdk/judge/HJudgeItem.h +++ b/entry/src/main/cpp/sdk/judge/HJudgeItem.h @@ -373,6 +373,8 @@ struct TSub3Item08Gjzt //公交站台 8 bool Must_JianSu_Flag = false; //必须减速标志 bool EndXMJL_Flag = false; //结束项目距离标志 int WavKind = 0; //SysSet[512]-->3 学校、公交、人行横道模拟项目是否语音标识,0:不需要 1:需要 2024-03-18 yhy 增加 + + int s509_10 = 0; #ifdef JUDGE_USE_INSPECT bool inspectJSC = false; //完成脚刹车动作 #endif diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp index c967a8b9..6799163b 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.cpp @@ -33,6 +33,40 @@ void Sub2Judge00Dcrk::dealDrawItem() drawGpsSign(m_model->F8(), "F8", false); drawGpsSign(m_model->F9(), "F9", false); +#ifdef JUDGE_USE_NICE + + if(pureCarPointInItemArea(II(33))) + { + TChuanGan* cg = m_car->historyChuanGan(); + nice(cg->body.b1_a, cg->body.b2_a, RGB_RED); + nice(cg->body.points_a[II(8)], cg->body.points_a[II(18)], RGB_RED); + + TGPSPoint z1 = GpsMath::GetChuiZhu(cg->body.b1_a, cg->body.points_a[II(6)], cg->body.points_a[II(8)]); + nice(cg->body.b1_a, z1, RGB_PURPLE); + + TGPSPoint z2 = GpsMath::GetChuiZhu(cg->body.points_a[II(25)], m_model->P3(),m_model->P4()); + nice(cg->body.points_a[II(25)], z2, RGB_RED); + + TGPSPoint z3 = GpsMath::GetChuiZhu(cg->body.points_a[II(27)], m_model->P3(),m_model->P4()); + nice(cg->body.points_a[II(27)], z3, RGB_RED); + + nice(cg->body.points_a[II(1)], cg->body.points_a[II(13)], RGB_GREEN); + TGPSPoint z4 = GpsMath::GetChuiZhu(cg->body.points_a[II(13)], m_model->P4(), m_model->P5()); + nice(cg->body.points_a[II(13)], z4, RGB_RED); + } + +#endif + +} + +void Sub2Judge00Dcrk::nice(const TGPSPoint& p1, const TGPSPoint& p2, const RgbColor& color) +{ + int cm = GpsMath::calcGpsDistanceCM(p1,p2); + TGPSPoint c = GpsMath::calcCenterPoint(p1,p2); + char buf[32] = {0}; + SafeSprintf(buf, sizeof(buf), "%dcm", cm); + drawGpsLine(p1, p2, false, color, 16); + drawGpsText(c, buf, color, 16); } void Sub2Judge00Dcrk::dealJudgeItem() diff --git a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.h b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.h index d3cc4d5a..8fa604ae 100644 --- a/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.h +++ b/entry/src/main/cpp/sdk/judge/sub2/Sub2Judge00Dcrk.h @@ -38,6 +38,8 @@ private: //判断考试用时是否超时 bool examTimeout(); + void nice(const TGPSPoint& p1, const TGPSPoint& p2, const RgbColor& color); + private: enum{L1=1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11}; int64 m_dcrkTime = 0; //开始时间(从倒库开始计时) diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp index 9bcda5fe..ad08b7d0 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge01Sczb.cpp @@ -38,7 +38,7 @@ bool Sub3Judge01Sczb::dealJudgeEnter() const std::vector& s512 = TableSysSet->asArray512(); std::string Temp512_9 = s512.size() > 8 && s512[8] != "" ? s512[8].c_str() : ""; - const std::vector& s512_9 = Tools::split(Temp512_9, "^"); + const std::vector s512_9 = Tools::split(Temp512_9, "^"); m_itemv.newtype = s512_9.size() > 0 && s512_9[0] != "" ? std::atoi(s512_9[0].c_str()) : 0; m_itemv.time_tishi = s512_9.size() > 1 && s512_9[1] != "" ? std::atoi(s512_9[1].c_str()) : 0; m_itemv.time_raoche = s512_9.size() > 2 && s512_9[2] != "" ? std::atoi(s512_9[2].c_str()) : 0; @@ -495,6 +495,18 @@ void Sub3Judge01Sczb::AddCSBData(CsbType csb) if(m_csb.empty()) { m_csb.push_back(csb); + + std::string sou; + switch(csb) + { + case CsbType::ZQ: sou = sound::sub3_401001; break; + case CsbType::ZH: sou = sound::sub3_401002; break; + case CsbType::YH: sou = sound::sub3_401003; break; + case CsbType::YQ: sou = sound::sub3_401004; break; + default: break; + } + //ToDo:语音提示, + m_car->createEventSound({itemNo(), sou}); } else { diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp index 470556b6..02299fdf 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge02Qbxx.cpp @@ -20,7 +20,7 @@ bool Sub3Judge02Qbxx::dealJudgeEnter() //10s内未起步只评判第一次^第一次起步以打左方向灯开始计时^ const std::vector& s502 = TableSysSet->asArray502(); std::string str = s502.size() > 7 ? s502[7] : ""; - const std::vector& ss = Tools::split(str, "^"); + const std::vector ss = Tools::split(str, "^"); m_itemv.sys502_8_1 = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0; m_itemv.sys502_8_2 = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 0; //StrToIntDef(GetDotStr(2, tempstr + '^', '^'), 0); @@ -219,10 +219,10 @@ void Sub3Judge02Qbxx::nogo_timeout() { const TSensorInfo& sor2 = m_car->historySensor(2); - if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9) || + if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9 && sor.dw != 10) || (sor.ssc == SNOT && sor1.ssc == SYES)) { - if(sor.dw >= 1 && sor.dw != 9 && sor.ssc == SNOT) + if(sor.dw >= 1 && sor.dw != 9 && sor.dw != 10 && sor.ssc == SNOT) { m_itemv.ZhunBeiQiBuTK = cg->tkCnt; } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp index 53be5f18..3de17402 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge03Zxxs.cpp @@ -390,10 +390,10 @@ void Sub3Judge03Zxxs::dealJudgeItem() } char buf[256] = {0}; - SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d,项目距离=%d,已行驶=%d,角度变化=%0.2f"), + SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d-%d,项目距离=%d,已行驶=%d,角度变化=%0.2f"), m_itemv.Kind == 0 ? "右边线" : "左边线", Temp_Gps_Itemno1, - m_itemv.Init_D,m_itemv.parm_hcjl, + m_itemv.Init_D,m_itemv.parm_hcjl,m_itemv.Gps_Offset, (int)std::abs(m_itemv.Kind == 0 ? RightJL0 - m_itemv.Init_D : LeftJL0 - m_itemv.Init_D), m_itemv.parm_xmjl,cg->ai_ljjl - m_itemv.Init_LJJL,Jdbh ); diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp index 85e051f1..9b45925c 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.cpp @@ -37,13 +37,15 @@ bool Sub3Judge08Gjzt::dealJudgeEnter() { m_itemv.Temp_XS = 30; } - //是否评判脚刹车 + //是否评判脚刹车 1速度+刹车同时满足 其他只判刹车 m_itemv.Judge_JSC = s509.size() > 5 && s509[5] != "" ? std::atoi(s509[5].c_str()) == 1 : false; //是否必须减速 m_itemv.Must_JianSu_Flag = s509.size() > 7 && s509[7] != "" ? std::atoi(s509[7].c_str()) == 1 : false; //默认:需要评判减速相关的 m_itemv.JudgeKind = 1; + m_itemv.s509_10 = s509.size() > 9 && s509[9] != "" ? std::atoi(s509[9].c_str()) : 0; + if(ksdd == siteof::nj || ksdd == siteof::njdckm3) { //ToDo:语音播报-->通过公交站台 @@ -118,7 +120,7 @@ void Sub3Judge08Gjzt::dealJudgeItem() //SysSet[342]:车上是否能进行人工操作(0-能扣分和进项目 1-不能人工评判 2-可以人工评判 3-都不能) //如果是人工扣分或者人工评判的,自动评判就不触发 需要评判减速相关的 const std::string& s342 = TableSysSet->get342(); - if(s342 == "0" || s342 == "2") + if(s342 == "0" || s342 == "2" || m_itemv.s509_10 == 1) { m_itemv.JudgeKind = 0; //科研所规定,公交站台当前车辆的车道号在3车道及以上的,不需要评判减速相关的 } @@ -209,9 +211,11 @@ void Sub3Judge08Gjzt::dealJudgeItem() JUDGE_MARK_SUB3(8, "03", true); } TTestCtl* ctl = m_car->getTTestCtl(); + //新的减速规则 if(ctl->JianSuLeiXing == 2) { + //500-13为2,按科研所规则判断是否减速 if(m_itemv.JudgeKind == 1) //需要评判减速相关的 { #ifdef JUDGE_USE_INSPECT @@ -251,6 +255,7 @@ void Sub3Judge08Gjzt::dealJudgeItem() { if(m_itemv.Judge_JSC == true) { + // 509-6为1,同时满足刹车和速度小于阈值(509-5); if(m_itemv.Finish_JSC == false || m_itemv.Finish_JianSu == false) { JUDGE_MARK_SUB3(8, "02", false); @@ -258,9 +263,21 @@ void Sub3Judge08Gjzt::dealJudgeItem() } else { - if(m_itemv.Finish_JianSu == false) + if(ctl->JianSuLeiXing == 1) { - JUDGE_MARK_SUB3(8, "02", false); + //500-13为1,刹车和速度小于阈值,满足其中一个就不扣分; + if(m_itemv.Finish_JSC == false && m_itemv.Finish_JianSu == false) + { + JUDGE_MARK_SUB3(8, "02", false); + } + } + else + { + //5、无上述参数,只判断刹车 + if(m_itemv.Finish_JSC == false) + { + JUDGE_MARK_SUB3(8, "02", false); + } } } } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.h b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.h index f2f4e43f..40bdce4d 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.h +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge08Gjzt.h @@ -68,6 +68,13 @@ * * 快进到1840帧,然后步进跟踪项目。 * + * 公交判断规则: + * 1、509-8不为1 and 当前车道大于2,and (342参数为0,或为2,509-10为1):不扣分 + * 2、500-13为2,按科研所规则判断是否减速; + * 3、509-6为1,同时满足刹车和速度小于阈值(509-5); + * 4、500-13为1,刹车和速度小于阈值,满足其中一个就不扣分; + * 5、无上述参数,只判断刹车 + * */ #ifndef SUB3JUDGE08GJZT_H diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp index 1d6a988e..a83b7dae 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge10Ccxx.cpp @@ -375,7 +375,7 @@ void Sub3Judge10Ccxx::dealJudgeItem() m_car->setChaoChe_Start_TM(0); //ToDo:语音播报:取消变更车道或者取消超车 m_car->createEventCancelItem({m_exam->ItemNo, ""}); - m_car->createEventSound({itemNo(), sound::sub3_414004}); + //m_car->createEventSound({itemNo(), sound::sub3_414004}); return; } } @@ -396,7 +396,7 @@ void Sub3Judge10Ccxx::dealJudgeItem() m_car->setChaoChe_Start_TM(0); //ToDo:语音播报:取消变更车道或者取消超车 m_car->createEventCancelItem({m_exam->ItemNo, ""}); - m_car->createEventSound({itemNo(), sound::sub3_414004}); + //m_car->createEventSound({itemNo(), sound::sub3_414004}); } else { diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp index e829813f..f04e4427 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge11Kbtc.cpp @@ -712,8 +712,8 @@ void Sub3Judge11Kbtc::DoStatus_3() //特殊地点业务翻译 TTestCtl* ctl = m_car->getTTestCtl(); - const std::vector>& s301 = TableSysSet->asArray2_301(); - const std::vector& s301_1 = s301.size() > 0 ? s301[0] : std::vector(); + const std::vector& s301 = TableSysSet->asArray301(); + const std::vector s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector(); const std::string s301_1_3 = s301_1.size() > 3 && s301_1[3] != "" ? s301_1[3] : ""; if(!ctl->Dw_Cs_Ok1 && s301_1_3 != "0" && ctl->dw_kf_sj == 0 && ksdd == siteof::zjwz) { @@ -1295,24 +1295,24 @@ void Sub3Judge11Kbtc::Judge_KBTC_YaXian() const std::string& s411 = TableSysSet->get411(); if(s411 != "1") { - RightJL0_RF = RTKKM3_0.Body_RF_ToRightEdge; - RightJL1_RF = RTKKM3_1.Body_RF_ToRightEdge; - RightJL2_RF = RTKKM3_2.Body_RF_ToRightEdge; + RightJL0_RF = RTKKM3_0.Body_RF_ToBaseLine; + RightJL1_RF = RTKKM3_1.Body_RF_ToBaseLine; + RightJL2_RF = RTKKM3_2.Body_RF_ToBaseLine; - RightJL0_RB = RTKKM3_0.Body_RB_ToRightEdge; - RightJL1_RB = RTKKM3_1.Body_RB_ToRightEdge; - RightJL2_RB = RTKKM3_2.Body_RB_ToRightEdge; + RightJL0_RB = RTKKM3_0.Body_RB_ToBaseLine; + RightJL1_RB = RTKKM3_1.Body_RB_ToBaseLine; + RightJL2_RB = RTKKM3_2.Body_RB_ToBaseLine; } else { - RightJL0_RF = RTKKM3_0.Wheel_RF_ToRightEdge; - RightJL1_RF = RTKKM3_1.Wheel_RF_ToRightEdge; - RightJL2_RF = RTKKM3_2.Wheel_RF_ToRightEdge; + RightJL0_RF = RTKKM3_0.Wheel_RF_ToBaseLine; + RightJL1_RF = RTKKM3_1.Wheel_RF_ToBaseLine; + RightJL2_RF = RTKKM3_2.Wheel_RF_ToBaseLine; - RightJL0_RB = RTKKM3_0.Wheel_RB_ToRightEdge; - RightJL1_RB = RTKKM3_1.Wheel_RB_ToRightEdge; - RightJL2_RB = RTKKM3_2.Wheel_RB_ToRightEdge; + RightJL0_RB = RTKKM3_0.Wheel_RB_ToBaseLine; + RightJL1_RB = RTKKM3_1.Wheel_RB_ToBaseLine; + RightJL2_RB = RTKKM3_2.Wheel_RB_ToBaseLine; } //ZXD_JL0 := (RightJL0_RF + RightJL0_RB) div 2; diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge14Jjdw.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge14Jjdw.cpp index 36b83a91..3c0de3d7 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge14Jjdw.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge14Jjdw.cpp @@ -256,7 +256,7 @@ void Sub3Judge14Jjdw::CSH_Itmv14() std::string str2 = Str.size() > 1 ? Str[1] : ""; //GetDotStr(2, Str + ':', ':'); int dw = std::atoi(str1.c_str()); - const std::vector& stmp = Tools::split(str2, "-"); + const std::vector stmp = Tools::split(str2, "-"); m_itemv.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0; m_itemv.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0; } diff --git a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp index b4de8cc7..fb5eabfb 100644 --- a/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp +++ b/entry/src/main/cpp/sdk/judge/sub3/Sub3Judge20Comm.cpp @@ -159,22 +159,21 @@ void Sub3Judge20Comm::Init_ZongHe() //自动靠边停车参数 //SysSet[319]:里程不够不报靠边停车(0-否 1-是 2-必考项目完成,并且里程满足要求) //SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效 - const std::string& s319 = TableSysSet->get319(); if(s319 == "2") { const std::vector& s415 = TableSysSet->asArray415(); m_itemvCJH.bZdKbTc = s415.size() > 0 && s415[0] == "1"; //getdotstr(1, sysset[415] + '^', '^') = '1'); - m_itemvCJH.ZdKbTcJl = s415.size() > 1 && s415[1] != "" ? std::atoi(s415[1].c_str()) : 1; //strtointdef(getdotstr(2, sysset[415] + '^', '^'), 1); + m_itemvCJH.ZdKbTcJl = s415.size() > 1 && s415[1] != "" ? std::atoi(s415[1].c_str()) : 1; //strtointdef(getdotstr(2, sysset[415] + '^', '^'), 1); m_itemvCJH.KbTcJl = -1; } else { m_itemvCJH.bZdKbTc = false; m_itemvCJH.ZdKbTcJl = 1; + m_itemvCJH.KbTcJl = -1; } //溜车变量初始化 - //SysSet[529]:模拟灯光是否需要人脸验证 //说明:这个参数目前我没有实际的用到 m_sfyz_state = 0; @@ -213,7 +212,7 @@ void Sub3Judge20Comm::Init_ZongHe() if(str2 == "") continue; int dw = std::atoi(str1.c_str()); - const std::vector& stmp = Tools::split(str2, "-"); + const std::vector stmp = Tools::split(str2, "-"); itemv14->DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0; itemv14->DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 100; } @@ -243,7 +242,7 @@ void Sub3Judge20Comm::Init_ZongHe() //评判半联动用的,比如:前进状态下,离合器连续30秒 const std::vector& s500 = TableSysSet->asArray500(); std::string s500_1 = s500.size() > 0 ? s500[0] : ""; - const std::vector& ss500_1 = Tools::split(s500_1, "^"); + const std::vector ss500_1 = Tools::split(s500_1, "^"); m_itemvCJH.lhqxs = ss500_1.size() > 0 && ss500_1[0] != "" ? std::atoi(ss500_1[0].c_str()) : 30; //离合器距离 @@ -260,14 +259,14 @@ void Sub3Judge20Comm::Init_ZongHe() m_itemvCJH.DWKF_SJ = (s500.size() > 3 && s500[3] != "" ? std::atoi(s500[3].c_str()) : 20) * SECOND; //加速发动机转速阀值^加速发动机变化倍数^ std::string Str = s500.size() > 4 && s500[4] != "" ? s500[4] : ""; - const std::vector& s500_4 = Tools::split(Str, "^"); + const std::vector s500_4 = Tools::split(Str, "^"); m_itemvCJH.KongYouMen_FDJ_YZ = s500_4.size() > 0 && s500_4[0] != "" ? std::atoi(s500_4[0].c_str()) : 3000; //变化倍数 m_itemvCJH.KonbYouMen_FDJ_BS = s500_4.size() > 1 && s500_4[1] != "" ? std::atoi(s500_4[1].c_str()) : 3; //转向灯不关闭距离^项目结束后不关闭时间 Str = s500.size() > 5 && s500[5] != "" ? s500[5] : ""; - const std::vector& s500_5 = Tools::split(Str, "^"); + const std::vector s500_5 = Tools::split(Str, "^"); m_itemvCJH.ZXD_BGB_JL = s500_5.size() > 0 && s500_5[0] != "" ? std::atoi(s500_5[0].c_str()) : 3000; m_itemvCJH.ZXD_BGB_SJ = s500_5.size() > 1 && s500_5[1] != "" ? std::atoi(s500_5[1].c_str()) : 0; @@ -341,8 +340,8 @@ void Sub3Judge20Comm::Init_ZongHe() //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^ //条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ - const std::vector>& s301 = TableSysSet->asArray2_301(); - const std::vector& s301_1 = s301.size() > 0 ? s301[0] : std::vector(); + const std::vector& s301 = TableSysSet->asArray301(); + const std::vector s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector(); if(!s301_1.empty()) { m_itemvCJH.dw_cs_dw1 = s301_1.size() > 0 && s301_1[0] != "" ? std::atoi(s301_1[0].c_str()) : 1; @@ -358,7 +357,7 @@ void Sub3Judge20Comm::Init_ZongHe() m_itemvCJH.dw_cs_sl1 = 0; } - const std::vector& s301_2 = s301.size() > 1 ? s301[1] : std::vector(); + const std::vector& s301_2 = s301.size() > 1 ? Tools::split(s301[1], ",") : std::vector(); if(!s301_2.empty()) { m_itemvCJH.dw_cs_dw2 = s301_2.size() > 0 && s301_2[0] != "" ? std::atoi(s301_2[0].c_str()) : 1; @@ -375,9 +374,9 @@ void Sub3Judge20Comm::Init_ZongHe() m_itemvCJH.dw_cs_sl2 = 0; } - std::vector s301_3 = s301.size() > 2 ? s301[2] : std::vector(); + std::string s301_3 = s301.size() > 2 ? s301[2] : ""; //301评判时间,0-结束考试时评判,1-里程达标就评判 100-表示已评判过 20140630 //yhyflag - ctl->dw_kf_sj = s301_3.size() > 0 && s301_3[0] != "" ? std::atoi(s301_3[0].c_str()) : 1; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1); + ctl->dw_kf_sj = s301_3 != "" ? std::atoi(s301_3.c_str()) : 0; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1); //SysSet[530]:环境感知相关参数(原封不动翻译即可,前期用不到,赞不考虑) const std::vector& s530 = TableSysSet->asArray530(); @@ -385,7 +384,7 @@ void Sub3Judge20Comm::Init_ZongHe() m_itemvCJH.sslkfxp_sj = s530.size() > 0 && s530[0] != "" ? std::atoi(s530[0].c_str()) : 15; //StrToIntdef(GetDotStr(1, Sysset[530] + '^', '^'), 15); //单手离开方向盘时间秒,右边距离偏差cm const std::string& ss530 = s530.size() > 1 && s530[1] != "" ? s530[1] : ""; - const std::vector& s530_2 = Tools::split(ss530, ","); + const std::vector s530_2 = Tools::split(ss530, ","); m_itemvCJH.dslkfxp_sj = s530_2.size() > 0 && s530_2[0] != "" ? std::atoi(s530_2[0].c_str()) : 60; m_itemvCJH.dslkfxp_jlpc = s530_2.size() > 1 && s530_2[1] != "" ? std::atoi(s530_2[1].c_str()) : 30; @@ -567,7 +566,7 @@ void Sub3Judge20Comm::Init_ZongHe() std::string str2 = s394i.size() > 1 ? s394i[1] : ""; //GetDotStr(2, Str + ':', ':'); int dw = std::atoi(str1.c_str()); - const std::vector& stmp = Tools::split(str2, "-"); + const std::vector stmp = Tools::split(str2, "-"); m_itemvCJH.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0; m_itemvCJH.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0; } @@ -756,10 +755,15 @@ void Sub3Judge20Comm::CallMoNiDengGuang() return; //屏蔽模拟灯光 #endif - TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备 - if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg) + const std::string& s386 = TableSysSet->get386(); + //模拟灯光:参数386=0,开始考试后,就触发模拟灯光 + if(s386 != "0") { - return; + TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备 + if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg) + { + return; + } } TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg); @@ -782,7 +786,6 @@ void Sub3Judge20Comm::CallMoNiDengGuang() const TSensorInfo& sor3 = his3->real.sensor; const std::string& ksdd = TableSysSet->get211(); - const std::string& s386 = TableSysSet->get386(); const std::string& s322 = TableSysSet->get322(); TCar* tcar = m_car->getTCar(); @@ -2464,7 +2467,7 @@ void Sub3Judge20Comm::Judge_LianXuBianDao() //获取连续变道超车参数 std::string Temp = s512.size() > 1 && s512[1] != "" ? s512[1] : ""; - const std::vector& ss = Tools::split(Temp, "^"); + const std::vector ss = Tools::split(Temp, "^"); //0:abc 1:aba和abc都判 ctl->LianXuBianDaoKind = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0; @@ -3437,9 +3440,9 @@ void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2() else { //标准 20180416 - if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 && + if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 && RTKKM3.FrontPointLaneNo != RTKKM3_1.FrontPointLaneNo && - RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6 ) + RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6) { //变道判方向灯 Tag = 0; @@ -4354,9 +4357,16 @@ void Sub3Judge20Comm::Judge_DW_KongDang() //启动发动机时,挡位未至于空挡(驻车挡) if(sor.dh2 == SYES && sor1.dh2 == SNOT && sor2.dh2 == SNOT) { - if(sor.dw_plc != 0) //(sor.dw != 0) //用原始档位无锡所 + if(sor.dw_plc != 0 && sor.dw_plc != 10) //C2自动挡10档是驻车档P档,0档是空挡 //(sor.dw != 0) //用原始档位无锡所 { - JUDGE_MARK_SUB3(2, "04", false); + if(m_car->itemsSomeExaming2(Sub3ItemType02Qbxx)) + { + JUDGE_MARK_SUB3(2, "04", false); //如果起步项目正在考就扣这个分 + } + else + { + JUDGE_MARK_SUB3(20, "05", false); + } } } } @@ -4602,8 +4612,11 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS() const TChuanGan* his6 = m_car->historyChuanGan(6); //旧规则评判 int TempCS = std::round(gps.sd); + + const std::vector& s507 = TableSysSet->asArray507(); + std::string lhq = s507.size() > 9 ? s507[9] : ""; //507第10个参数 设置为1不管踩没踩离合器都判,否则踩离合器不判 /////////////////////////////////////////////////////////////////////////// - if(sor.lhq == SYES || Tools::less(std::round(gps.sd), 5) || + if((lhq != "1" && sor.lhq == SYES) || Tools::less(std::round(gps.sd), 5) || (ksdd != siteof::nj && (cg->move != moveForward || his1->move != moveForward || his2->move != moveForward || his3->move != moveForward || his4->move != moveForward || his5->move != moveForward || his6->move != moveForward))) @@ -4799,7 +4812,27 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS() //24、全程次高挡评判 void Sub3Judge20Comm::Judge_CiGaoDang() { - if(m_car->allItemFinish() && m_car->isQualified()) //全程次高挡评判 KM3AllPass() + //按照军华说的 在行驶距离达到的实际判断全程次高档 20240731 + //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前 20240805 + bool timing = false; //次高档时机 + TTestCtl* ctl = m_car->getTTestCtl(); + if(ctl->dw_kf_sj == 1) //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前 + { + if(m_car->isMileage()) + { + timing = true; + } + } + else + { + TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc); + if(item && item->TestPro == ItemProFlagInit) + { + timing = true; + } + } + + if(timing) { if(m_itemvXLG.CGD_Nums == 0) { @@ -4815,79 +4848,43 @@ void Sub3Judge20Comm::Judge_CiGaoDang() //25、自动靠边停车(重点) void Sub3Judge20Comm::Call_Auto_KBTC() { + //SysSet[319]:里程不够不报靠边停车(0-否 1-是 2-必考项目完成,并且里程满足要求) + //SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效 const std::string& s319 = TableSysSet->get319(); - TCar* tcar = m_car->getTCar(); - const std::map& all = m_car->allExamItem(); //自动靠边停车 - if(s319 == "1" && m_car->getKsLjLc() < tcar->XSJL) + if(s319 == "1") { - return; + if(!m_car->isMileage()) return; } if(s319 == "2") { - if(m_car->getKsLjLc() < tcar->XSJL) return; - bool ErrorFlag = false; - for(auto it = all.begin(); it != all.end(); it++) + if(!m_car->isMileage()) return; + + //自动靠边停车计算 + //自动靠边停车 + if(m_itemvCJH.bZdKbTc) { - TKM3Item* item = it->second->getExamItem(); - if(item->NoID == true) + const std::map& all = m_car->allExamItem(); + //必考项目未完成 + for(auto it = all.begin(); it != all.end(); it++) { - if(item->FinishFlag == false) + TKM3Item* item = it->second->getExamItem(); + if(item->ItemNo == Sub3ItemType11Kbtc) { - m_car->KM3EndItem(item->ItemNo); - ErrorFlag = true; + if(item->Item_Color != itemStateWk) + { + return; + } + } + else + { + if(item->NoID == false && (item->Item_Color == itemStateWk || item->Item_Color == itemStateZk)) + { + return; + } } } - } - - if(ErrorFlag == true) - { - return; - } - - for(auto it = all.begin(); it != all.end(); it++) - { - TKM3Item* item = it->second->getExamItem(); - if(item->ItemNo == Sub3ItemType11Kbtc) continue; - if(item->FinishFlag == false) - { - return; - } - } - - } - //自动靠边停车计算 - //自动靠边停车 - if(m_itemvCJH.bZdKbTc) - { - //必考项目未完成 - for(auto it = all.begin(); it != all.end(); it++) - { - TKM3Item* item = it->second->getExamItem(); - if(item->ItemNo == Sub3ItemType11Kbtc) - { - if(item->Item_Color != itemStateWk) - { - return; - } - } - else - { - if(item->NoID == false && (item->Item_Color == itemStateWk || item->Item_Color == itemStateZk)) - { - return; - } - } - } - - //SysSet[319]:里程不够不报靠边停车(0-否 1-是 2-必考项目完成,并且里程满足要求) - //SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效 - const std::string& s319 = TableSysSet->get319(); - const std::string& ksdd = TableSysSet->get211(); - if(s319 == "2") - { const TChuanGan* cg = m_car->historyChuanGan(); - if(m_itemvCJH.KbTcJl == -1) { m_itemvCJH.KbTcJl = cg->ai_ljjl; @@ -4895,6 +4892,7 @@ void Sub3Judge20Comm::Call_Auto_KBTC() if(cg->ai_ljjl - m_itemvCJH.KbTcJl >= m_itemvCJH.ZdKbTcJl) { //20171008 + const std::string& ksdd = TableSysSet->get211(); if(ksdd == siteof::changzhoukm3) { if(cg->RTKKM3.BaseLaneCount > 0) @@ -4952,6 +4950,7 @@ void Sub3Judge20Comm::Judge_Extra() //m_car->createEventEnterItem({item13->ItemNo, ""}); } + /* //自动触发加减挡位 bool FindSCZB = false; bool FindMNDG = false; @@ -4990,21 +4989,18 @@ void Sub3Judge20Comm::Judge_Extra() if((SCZBFinishFlag == true || FindSCZB == false) && (MNDGFinishFlag == true || FindMNDG == false)) { - TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); + TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //20240731 if(item14 && item14->NoID == true) //免考加减挡的 { if(item14->Item_Color == itemStateWk) { //ToDo1:生成 全程加减挡 进项目事件 - //item14->Item_Color = itemStateZk; - //item14->TestPro = ItemProFlagInit; - //item14->FinishFlag = false; - m_car->createEventEnterItem({item14->ItemNo, ""}); m_car->KM3EndItem(item14->ItemNo); } } } + */ m_DiaoTou_ID = 0; std::string CurrentRoadData = cg->MapPoint_Road_Code; diff --git a/entry/src/main/cpp/sdk/utility/GpsMath.cpp b/entry/src/main/cpp/sdk/utility/GpsMath.cpp index 32bc8171..960e607e 100644 --- a/entry/src/main/cpp/sdk/utility/GpsMath.cpp +++ b/entry/src/main/cpp/sdk/utility/GpsMath.cpp @@ -566,27 +566,59 @@ inline void GpsMath::getDimensionalCoordinate(const double& E1, const double& N1 ///以下是科目三的函数 2024-01-12 /////////////////////////////////////////////////// +/* +double GpsMath::getAngle(const Pointi& p1, const Pointi& p2) +{ + double angle = 0; + //修改坐标系 + if(p1.x == p2.x) + { + if(p1.y < p2.y) + { + angle = PI / 2; + } + else if(p1.y >= p2.y) + { + angle = PI * 3 / 2; + } + } + else + { + angle = std::atan2(p2.y - p1.y, p2.x - p1.x); + } + + if(angle < 0) + { + angle = angle + 2 * PI; + } + angle = angle / PI * 180; + return angle; +} +*/ + //1、获得点1指向点2的角度0-360度,该角度是X轴正方向顺时针旋转到有向线段(由点1指向点2所确定)的角度,例如:正东=0度,正北=270 double GpsMath::GetAngle_HQ(const Pointi& p1, const Pointi& p2, int MinusY) { - int result = 0; + double angle = 0; if(p1.x == p2.x) { if(p1.y * MinusY < p2.y * MinusY) - result = PI * 3 / 2; + angle = PI * 3 / 2; else if (p1.y * MinusY > p2.y * MinusY) - result = PI / 2; + angle = PI / 2; else - result = 0; + angle = 0; } else - result = std::atan2(p1.y * MinusY - p2.y * MinusY, p2.x - p1.x); //???yhyflag + { + angle = std::atan2(p1.y * MinusY - p2.y * MinusY, p2.x - p1.x); + } - if(result < 0) - result = result + 2 * PI; + if(angle < 0) + angle = angle + 2 * PI; - result = result / PI * 180; - return result; + angle = angle / PI * 180; + return angle; } diff --git a/entry/src/main/cpp/sdk/utility/GpsMath.h b/entry/src/main/cpp/sdk/utility/GpsMath.h index c4e73478..374d77b3 100644 --- a/entry/src/main/cpp/sdk/utility/GpsMath.h +++ b/entry/src/main/cpp/sdk/utility/GpsMath.h @@ -137,7 +137,10 @@ private: public: //科目三 + //计算角度 逆时针 + //static double getAngle(const Pointi& point1, const Pointi& point2); //1、获得点1指向点2的角度0-360度,该角度是X轴正方向顺时针旋转到有向线段(由点1指向点2所确定)的角度,例如:正东=0度,正北=270 + //MinusY= 1顺时针, -1逆时针 static double GetAngle_HQ(const Pointi& p1, const Pointi& p2, int MinusY = 1); //计算两点距离 static int PointDistance(const Pointi& p1, const Pointi& p2); diff --git a/entry/src/main/cpp/sdk/utility/HBean.h b/entry/src/main/cpp/sdk/utility/HBean.h index 88d5683b..8b292ab1 100644 --- a/entry/src/main/cpp/sdk/utility/HBean.h +++ b/entry/src/main/cpp/sdk/utility/HBean.h @@ -148,6 +148,14 @@ enum PlaySoundType PlaySoundEndNotify = 1, //1:表示是模拟灯光项目的语音,语音播报结束需要调用examJudgeSoundEnd通知评判。 }; +//行驶方向,***注意:枚举不能变,和外壳有对应关系 +enum DriveDirType +{ + DriveDirN = -1, //-1:逆向行驶 + DriveDirX = 0, //0:未知 + DriveDirY = 1, //1:正向行驶 +}; + //Tag1=0-无标线 //Tag1=1-中心线(黄色实线) diff --git a/entry/src/main/cpp/sdk/utility/HTypes.h b/entry/src/main/cpp/sdk/utility/HTypes.h index 79606121..489a5d83 100644 --- a/entry/src/main/cpp/sdk/utility/HTypes.h +++ b/entry/src/main/cpp/sdk/utility/HTypes.h @@ -334,7 +334,7 @@ struct TStuInfo int64 ddkssj = 0; //考试中断那次考试开始考试时间 1970年到现在的毫秒数 std::vector ykxm = {}; //已考项目 "1,3" 对应枚举 ExamItemCode DuanDian_FinishItems std::vector kfxm = {}; //扣分项目 "20,01;" 对应枚举 ExamItemCode DuanDian_Marks - int32 yklc = 0; //已考里程,单位米 + int32 yklc = 0; //已考里程,单位厘米 int8 sczb = 0; //CS_Finish_SCZB_Flag:Boolan; //yhy22 初始完成上车准备标志(外壳传递的)Boolan std::vector sczbkf = {}; //SCZBKouFenData:String[200]; //格式: ItemNo,MarkSerial; ItemNo,MarkSerial; @@ -850,15 +850,14 @@ struct TRTKResult int CrossPointNo = 0; //穿越点 - - //20240730 新增 还没计算 - int TouchLineDirCS = 0; //车身碰线 车身碰线方向 + //20240801 新增 还没计算 + int TouchLineDirCS = TouchDir0; //车身碰线 车身碰线方向 int BackPointLaneNo = 0; //后点车道 后点所在车道号 int BackPointLaneCount = 0; //后点车道 后点天线共有几股车道 int Body_RF_ToBaseLine = 0; //右前车身边线 指车身离右侧路边缘线距离 int Body_RB_ToBaseLine = 0; //右后车身边线 指车身离右侧路边缘线距离 - int DirInverse = 0; //车道属性 是否逆向行驶 + int DirInverse = 0; //车道属性 是否逆向行驶 对应DriveDirType枚举 int ShapeNoWheel = 0; //形状 车轮相交的形状线号 #ifdef JUDGE_USE_INSPECT diff --git a/entry/src/main/ets/api/judge.ts b/entry/src/main/ets/api/judge.ts index e0782c76..25a27c3d 100644 --- a/entry/src/main/ets/api/judge.ts +++ b/entry/src/main/ets/api/judge.ts @@ -16,11 +16,15 @@ export async function download() { }) } +interface WR{ + message?:string + code:number +} // 通用监管接口 -export async function writeObjectOut(params,filePath?:string): Promise { +export async function writeObjectOut(params,filePath?:string): Promise { const singlePlay = globalThis.singlePlay if (singlePlay) { - return 1 + return {code:1} } //获取监管接口地址路径 @@ -42,6 +46,7 @@ export async function writeObjectOut(params,filePath?:string): Promise { if (globalThis.isJGNew) { return await writeObjectOutNew(params,filePath) } + drvexam.zp = drvexam.zp === undefined ? undefined : encodeURIComponent( drvexam.zp) const drvexamArrs = Reflect.ownKeys(drvexam).map((key: string) => (`<${key}>${drvexam[key]}`)); if(filePath){ @@ -52,6 +57,7 @@ export async function writeObjectOut(params,filePath?:string): Promise { })); } + console.info('surenjun','调用旧监管') //对象转换成xml const temp = await request({ host: globalThis.JGHOST, diff --git a/entry/src/main/ets/api/judgeNew.ts b/entry/src/main/ets/api/judgeNew.ts index 2552974e..5c8682c7 100644 --- a/entry/src/main/ets/api/judgeNew.ts +++ b/entry/src/main/ets/api/judgeNew.ts @@ -17,7 +17,11 @@ const gjxlhObj = { '17C56': '02-21-000014', } -export default async function writeObjectOutNew(data,filePath): Promise { +interface WR{ + message?:string + code:number +} +export default async function writeObjectOutNew(data,filePath): Promise { const fileUtil = new FileUtil(globalThis.context); const {jkid , drvexam} = data; const basic = await getBasicConfig(jkid); diff --git a/entry/src/main/ets/common/utils/File.ts b/entry/src/main/ets/common/utils/File.ts index be17fd93..d13676dc 100644 --- a/entry/src/main/ets/common/utils/File.ts +++ b/entry/src/main/ets/common/utils/File.ts @@ -39,6 +39,7 @@ export default class FileUtil{ fs.mkdirSync(path) } } catch (e) { + console.info('初始化文件夹失败',path) promptAction.showToast({ message:`初始化文件夹失败`+JSON.stringify(e), duration:4000, diff --git a/entry/src/main/ets/common/utils/UdpJudge.ts b/entry/src/main/ets/common/utils/UdpJudge.ts index 1832c3c6..d4dbc772 100644 --- a/entry/src/main/ets/common/utils/UdpJudge.ts +++ b/entry/src/main/ets/common/utils/UdpJudge.ts @@ -4,8 +4,6 @@ import { testKm2Items,testKm3Items } from '../../pages/judgeSDK/dataTest/index' import { judgeConfig } from '../../pages/judgeSDK/utils/judgeConfig'; import { setJudgeUdp, setTopLineUdp } from './GlobalUdp'; import { convertGpsCoord2 } from '../utils/tools'; -import common from '@ohos.app.ability.common'; - export const initJudgeUdp = async () => { globalThis.serialIndex = 0; diff --git a/entry/src/main/ets/common/utils/request.ts b/entry/src/main/ets/common/utils/request.ts index 381c1c0d..67b8dd70 100644 --- a/entry/src/main/ets/common/utils/request.ts +++ b/entry/src/main/ets/common/utils/request.ts @@ -131,12 +131,14 @@ function handleCenterCode(msgXml,isNewCenter){ if(result){ const {code,message} = result if(code != '1'){ + const rMessage = decodeURIComponent(message as string) prompt.showToast({ - message, duration: 3000 + message:rMessage, + duration: 3000 }); - return + return {code,message} }else{ - return code + return { code } } } } @@ -152,9 +154,9 @@ function handleCenterCode(msgXml,isNewCenter){ message: decodeURIComponent(message as string), duration: 3000 }); - return + return {code,message:decodeURIComponent(message)} }else{ - return code + return { code } } } diff --git a/entry/src/main/ets/pages/Judge.ets b/entry/src/main/ets/pages/Judge.ets index e55f0367..7567ef81 100644 --- a/entry/src/main/ets/pages/Judge.ets +++ b/entry/src/main/ets/pages/Judge.ets @@ -115,7 +115,6 @@ struct Index { async initStudent() { const students = await getSyncData('USER') const stuInfo = students[0] || {}; - console.info('surenjun stuInfo=>', JSON.stringify(stuInfo)) const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx,ksxl} = stuInfo; this.name = xm || '测试考生'; this.idCard = sfzmhm || '01234567891010'; @@ -279,8 +278,8 @@ struct Index { abbreviation: decodeURI(systemParm.txt3), projectCode: no2, projectCodeCenter: txt2, - //是否是必考 - isRequired: allItems.includes(no2 + ''), + //是否是必考 加减档设置成非必考 + isRequired: no2== 14?false:allItems.includes(no2 + ''), //是否考过了 isEnd: false, //项目开始数据是否上传过 @@ -300,8 +299,6 @@ struct Index { }) }) const projects = this.projects; - console.info('surenjun',JSON.stringify(this.projectsObj)) - if (!projects.length) { Prompt.showToast({ message: '读取数据库信息失败,请重新联网更新!', @@ -465,6 +462,7 @@ struct Index { this.examSubject = isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject; globalThis.carInfo.examSubject = this.examSubject this.singlePlay = beginDataObj.exam == 0; + this.carName = initDataObj.name; globalThis.singlePlay = beginDataObj.exam == 0; await this.initSystemParam(initDataObj.systemparm) await this.initMarkRules(initDataObj.mark); @@ -748,7 +746,7 @@ struct Index { } Column() { - if (this.examSubject == 3) { + if (this.examSubject == 3 && this.judgeConfigObj['342'] == 0) { Row() { Row() { } @@ -767,14 +765,7 @@ struct Index { .backgroundImageSize({ width: '100%', height: '100%' }) .margin({ bottom: 10 }) .onClick(() => { - if (this.judgeConfigObj['342'] == 0) { - this.isDeductedPopShow = true - } else { - Prompt.showToast({ - message: '平台配置不允许人工评判!', - duration: 4000 - }); - } + this.isDeductedPopShow = true }) } @@ -844,7 +835,7 @@ struct Index { } //科目三人工扣分弹窗 - if (this.isDeductedPopShow && this.examSubject == 3) { + if (this.isDeductedPopShow && this.examSubject == 3 && this.judgeConfigObj['342'] == 0) { DeductedPopup({ defaultTabIndex: this.defaultTabIndex, currentItems: Reflect.ownKeys(this.projectsObj).map(projectKey => { @@ -945,12 +936,11 @@ struct Index { currentXmdm, } = this; const projectCode = artSubject3ProjectsCodesArr[index]; - console.info('surenjun',getIsExitManualProject(index)) + if(index === 5) { + console.info('surenjun 靠边停车状态=> ',getIsExitManualProject(index)) + } if (getIsExitManualProject(index)) { // 正在进行的项目 取消项目 - console.info('surenjun isManualProjectIn=>',isManualProjectIn) - console.info('surenjun projectCode=>',projectCode) - console.info('surenjun currentXmdm=>',currentXmdm) if (isManualProjectIn && projectCode === currentXmdm) { await this.judge.setJudgeItem(currentXmdm, 2); Prompt.showToast({ @@ -964,8 +954,15 @@ struct Index { if (judgeConfigObj['343'] == 0) { const xmmcStr = this.xmmcStr; if (xmmcStr == '无' || xmmcStr == '') { - this.amplifiedImgIndex = index; - this.isAmplifyPopShow = true + //512[6] 人工项目按钮放大确认 + const param512 = (judgeConfigObj['512'] || '').split(','); + if(param512[6] != 0){ + this.amplifiedImgIndex = index; + this.isAmplifyPopShow = true + }else{ + const judge = this.judge + await judge.setJudgeItem(projectCode, 1); + } } else { if (index === 5) { Prompt.showToast({ @@ -1086,6 +1083,10 @@ struct Index { return false } + if(projectRoads[projectCode].length == 0){ + return true + } + //设置了514-519参数,只能在设置的路段触发对应项目 if (projectRoads[projectCode].includes(road)) { //如果525为1,则514-519设置的路段不能触发对应项目 diff --git a/entry/src/main/ets/pages/UserInfo.ets b/entry/src/main/ets/pages/UserInfo.ets index e04a2779..87eb6829 100644 --- a/entry/src/main/ets/pages/UserInfo.ets +++ b/entry/src/main/ets/pages/UserInfo.ets @@ -75,6 +75,7 @@ struct UserInfo { @State FaceOpenStatue: string = '0'; //是否开启人脸识别 subscriber; @State faceCatchImg: string = '' + @State Param803Str:string = '' // 过程照片拍照 getPhoto = async (empty?: boolean) => { const singlePlay = globalThis.singlePlay @@ -105,13 +106,11 @@ struct UserInfo { new WebRTCVoice(this.context); //初始化数据 this.initData() - //身份证读卡器初始化 // this.openDeviceByIDCard() // 如果是单机模式则模拟假数据 //获取sysset表数据 this.initSysset() - //心跳处理 this.heartMsg() this.isExamStart = false @@ -164,6 +163,7 @@ struct UserInfo { return } + this.showFaceCompare = true this.pageIndex = Math.floor(index / 4) } }) @@ -260,9 +260,13 @@ struct UserInfo { //@ts-ignore syssetParams.forEach(sys => { //364 绕车一周评判时机(1-开始考试后判 2-开始考试前判) - if (sys.v_no === '364') { + if (sys.v_no === '364' && decodeURIComponent(sys.v_value) == '2') { this.isBoardPrePareSetPopupOpen = true; } + // 开始考试前必须解开安全带或关车门 + if (sys.v_no === '803'){ + this.Param803Str = sys.v_value+''; + } }) } @@ -312,8 +316,8 @@ struct UserInfo { that.studentRefreshStatue = studentRefreshParam?.[0]?.v_value || '0' const faceParam = syssetParams.filter(sys => sys.v_no == '2413') that.FaceOpenStatue = faceParam?.[0]?.v_value == '3' ? '1' : '0' - that.FaceOpenStatue = '0' - // that.FaceOpenStatue = '0' + that.FaceOpenStatue = '0' + console.log('that.FaceOpenStatue', that.FaceOpenStatue) // faceParam?.[0]?.v_value || // 1身份证读卡器 2指纹 3人脸 this.faceFlag = faceParam?.[0]?.v_value || '0' @@ -367,6 +371,13 @@ struct UserInfo { } this.pageIndex--; this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) + this.dataList.forEach(listData => { + for (let i in listData) { + listData[i] = decodeURI(listData[i]) + } + listData.kszp = this.photo + listData.kszp + listData.ksmjzp = this.photo + listData.ksmjzp + }) } //获取下载考生 @@ -375,7 +386,7 @@ struct UserInfo { return } const param = `${Md5.Instance.get_md5(globalThis.carInfo.carId + globalThis.carInfo.examinationRoomId + globalThis.username)}${globalThis.carInfo.carId}${globalThis.carInfo.examinationRoomId}${globalThis.username}` - getExaminationStudentInfo(param).then(async(res) => { + getExaminationStudentInfo(param).then(async res => { setTimeout(() => { this.updateTimeLimit = true }, 30000) @@ -402,15 +413,7 @@ struct UserInfo { } this.list = JSON.parse(JSON.stringify(dataList)) - this.list.forEach(listData => { - for (let i in listData) { - listData[i] = decodeURI(listData[i]) - } - listData.kszp = this.photo + listData.kszp - listData.ksmjzp = this.photo + listData.ksmjzp - }) dataList = this.list.length > 4 ? this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) : this.list; - this.dataList = dataList if (this.dataList.length) { this.currentUser = this.dataList[0] @@ -426,7 +429,6 @@ struct UserInfo { getSyncData('USER').then(data=>{ if(data?.[0]){ this.getCurrentStudent(data[0].sfzmhm) - } }) }).catch((error) => { @@ -513,10 +515,11 @@ struct UserInfo { const avPlayer = this.avPlayer; this.isLoadingPopupVisible = true avPlayer.playAudio([`voice/监管通信中.mp3`],false,async ()=>{ - const code = await this.beginExam(); - if (code != 1) { + const temp = await this.beginExam(); + console.info('surenjun',JSON.stringify(temp)) + if (temp.code != 1) { promptAction.showToast({ - message:'开始考试接口调用失败!', + message:temp.message, duration:4000 }) return @@ -541,33 +544,104 @@ struct UserInfo { // 检测车门、熄火信号 async checkSignal(): Promise { const {isCheckFireOpen} = judgeConfig + const {Param803Str,isBoardPrePareSetPopupOpen} = this; + + if(Param803Str === ''){ + return true + } return new Promise((resolve,reject)=>{ if(isCheckFireOpen){ resolve(true) - // return + return } - console.info('socketTag[PLC.UdpClient]', '注册udp回调') let plcValue = globalThis.udpClient.getCurrentMessage(); - console.info('surenjun',plcValue) const msgArr = plcValue.split(',') || '' const mkg = msgArr[14]; const fdjzs = msgArr[25]; - if(mkg == 1){ - this.avPlayer.playAudio(['voice/关门.mp3']) - promptAction.showToast({ - message:'请关闭车门', - duration:4000 - }) - reject(false) + const aqd = msgArr[19]; + const jgd = msgArr[7]; + const ygd = msgArr[8]; + const ssc = msgArr[13]; + const dw = msgArr[28]; + // 开始考试信号检测 + if(Param803Str !== ''){ + //安全带 + if(aqd == 1 && Param803Str.includes('1')){ + this.avPlayer.playAudio(['voice/请解开安全带.mp3']) + promptAction.showToast({ + message:'请解开安全带', + duration:4000 + }) + reject(false) + } + //门开关 + if(mkg == 1 && Param803Str.includes('2')){ + this.avPlayer.playAudio(['voice/关门.mp3']) + promptAction.showToast({ + message:'请关闭车门', + duration:4000 + }) + reject(false) + } + //远、近光灯 + if((jgd == 1 || ygd == 1) && Param803Str.includes('3')){ + this.avPlayer.playAudio(['voice/请关闭远近光灯.mp3']) + promptAction.showToast({ + message:'请关闭远近光灯', + duration:4000 + }) + reject(false) + } + //拉手刹 + if(ssc == 0 && Param803Str.includes('4')){ + this.avPlayer.playAudio(['voice/请拉手刹.mp3']) + promptAction.showToast({ + message:'请拉手刹', + duration:4000 + }) + reject(false) + + } + //请点火 + if(fdjzs*1 <=0 && Param803Str.includes('5')){ + this.avPlayer.playAudio(['voice/点火.mp3']) + promptAction.showToast({ + message:'请点火', + duration:4000 + }) + reject(false) + } + //置空档 + if(dw != 0 && Param803Str.includes('6')){ + this.avPlayer.playAudio(['voice/请置空档.mp3']) + promptAction.showToast({ + message:'请置空档', + duration:4000 + }) + reject(false) + } } - if(fdjzs*1 > 0){ - this.avPlayer.playAudio(['voice/熄火.mp3']) - promptAction.showToast({ - message:'请熄火', - duration:4000 - }) - reject(false) + // 考前绕车一周信号检测 + if(isBoardPrePareSetPopupOpen){ + //请熄火 + if(fdjzs*1 > 0){ + this.avPlayer.playAudio(['voice/熄火.mp3']) + promptAction.showToast({ + message:'请熄火', + duration:4000 + }) + reject(false) + } + if(mkg == 1){ + this.avPlayer.playAudio(['voice/关门.mp3']) + promptAction.showToast({ + message:'请关闭车门', + duration:4000 + }) + reject(false) + } } + resolve(true) }) } @@ -600,10 +674,11 @@ struct UserInfo { //接口标识 jkid: '17C51', } - const code = await writeObjectOut(param); + console.info('surenjun',JSON.stringify(param)) + const temp = await writeObjectOut(param); globalThis.lsh = this.currentUser.lsh globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm; - return code + return temp } aboutToDisappear() { @@ -752,7 +827,7 @@ struct UserInfo { .commStyle() .onClick(async () => { try { - // await this.checkSignal() + await this.checkSignal() this.faceCompareSucess = 0 globalThis.statue = 2 if (!this.currentUser.xm) { @@ -771,7 +846,6 @@ struct UserInfo { this.stopDeviceById() return } - console.log('this.FaceOpenStatue',this.FaceOpenStatue) if (this.FaceOpenStatue != '0') { this.showFaceCompare = true } else { @@ -779,7 +853,7 @@ struct UserInfo { this.sfbdinterfaceFn() } } catch (e) { - + console.info('Throw Error',JSON.stringify(e)) } }) diff --git a/entry/src/main/ets/pages/UserInfo1.ets b/entry/src/main/ets/pages/UserInfo1.ets new file mode 100644 index 00000000..e04a2779 --- /dev/null +++ b/entry/src/main/ets/pages/UserInfo1.ets @@ -0,0 +1,918 @@ +import { examinationStuAbsent, getExaminationItem, getExaminationStudentInfo } from '../api/userInfo'; +import router from '@ohos.router'; +import TopLogo from './compontents/TopLogo'; +import Md5 from '../common/utils/md5'; +import AccountTable from '../common/database/tables/AccountTable'; +import USER from '../common/constants/USER'; +import { dateFormat, getCurrentTime, string2Bytes } from '../common/utils/tools'; +import MA_SYSSET from '../common//constants/MA_SYSSET'; +import FaceCompare from './compontents/FaceCompare'; +// import { initJudgeUdp } from '../common/utils/UdpJudge' +import { writeObjectOut } from '../api/judge'; +import testNapi from '@ohos.idcard'; +import common from '@ohos.app.ability.common'; +import { User } from './interfaces'; +import WebRTCVoice from './webRTC/'; +import promptAction from '@ohos.promptAction'; +import FilePhoto from './judgeSDK/utils/filePhoto'; +import { getSyncData, upDateTableByArray } from '../common/service/initable'; +import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData'; +import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup' +import LoadingPopup from './compontents/judge/LoadingPopup'; +import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; +import { JudgeConfig } from '../config/judge'; +import { judgeConfig } from './judgeSDK/utils/judgeConfig'; +import { initJudgeUdp } from '../common/utils/UdpJudge'; +@Entry +@Component +struct UserInfo { + private filePhoto: FilePhoto + private avPlayer + + @State pageIndex: number = 0 + @State ratio: number = 1700 / 960 + @State index: number = 0 + @State stepFlag: boolean = false; + @State errorMsg: string = '' + @State ksxtbh: string = '' + @State pic: string = '' + @State jkxlh: string = '' + @State @Watch('changeFaceCompareSuccess') faceCompareSucess: number = 0; + @State @Watch('changeQkfn') getqkFlag: boolean = false; + @State @Watch('outClick') outFlag: boolean = false; + @State showFaceCompare: boolean = false; + @State url: string = '' + @State lsh: string = '' + @State qkFlag: boolean = false + @State isBoardPrePareSetPopupOpen: boolean = false + @State isFirstBoardPrePareSetPopupBtnShow: boolean = false + @State isBoardPrePareSetPopupShow: boolean = false + @State isLoadingPopupVisible:boolean = false; + @State loadingText:string = '正在认证监管信息,请稍后...' + @State sczbkf:{xmdm:number,kfdm:string}[] = [] + @State currentUser: User = EmptyCandidateObject + @State dataList: Array = [] + @State list: Array = [] + @State name: string = 'initName'; + @State sex: string = ''; + @State callBackFlag: boolean = false; + @State born?: string = ''; + @State address: string = ''; + @State nation: string = ''; + @State idCard: string = ''; + @State grantDept: string = ''; + //是否已经开始考试 + @State isExamStart:boolean = false; + @State effectDate: string = ''; + @State interval: any = null; + @State studentRefreshStatue: string = '0'; + @State photo: string = 'data:image/bmp;base64,'; + @State numCount: number = 0; + @State signNum: number = 0; + @State isCanClick: boolean = true; + @State updateTimeLimit: boolean = true + @State faceFlag: string = '0'; + @State FaceOpenStatue: string = '0'; //是否开启人脸识别 + subscriber; + @State faceCatchImg: string = '' + // 过程照片拍照 + getPhoto = async (empty?: boolean) => { + const singlePlay = globalThis.singlePlay + //单机模式返回空照片 + if (singlePlay) { + return '' + } else { + const {filePhoto} = this; + const photoBase64 = await filePhoto.getPhoto(); + return photoBase64 + } + } + private AccountTable = new AccountTable(() => {}, USER); + private context = getContext(this) as common.UIAbilityContext; + private labelBlocks = [ + { label: '考生姓名', key: 'xm' }, + { label: '身份证号', key: 'sfzmhm' }, + { label: ' 流 水 号 ', key: 'lsh' }, + { label: '考试路线', key: 'ksxl' }, + { label: '待考次数', key: 'kssycs' }, + { label: '考官姓名', key: 'ksy1' }, + ] + + async onPageShow() { + const mediaTest = new FilePhoto(this.context); + this.filePhoto = new FilePhoto(this.context); + //语音功能 + new WebRTCVoice(this.context); + //初始化数据 + this.initData() + + //身份证读卡器初始化 + // this.openDeviceByIDCard() + // 如果是单机模式则模拟假数据 + //获取sysset表数据 + this.initSysset() + + //心跳处理 + this.heartMsg() + this.isExamStart = false + this.sczbkf = []; + this.avPlayer = new VoiceAnnounce(); + } + + //身份证读卡器初始化 + openDeviceByIDCard() { + globalThis.indexComponent = this; + // 应用启动时打开读卡设备 + let ret = testNapi.OpenDevice(); + if (ret == 0) { + testNapi.StartReadCard(this.onReadCard); + } else { + console.error("zzctest Failed to Open Device"); + } + } + + stopDeviceById() { + if (this.faceFlag == '1') { + testNapi && testNapi.StopReadCard() + } + } + + // 通过身份证获取当前学员 + getCurrentStudent(id) { + let flag = false + this.pageIndex + this.list.map((res, index) => { + if (res.sfzmhm == id) { + flag = true + this.currentUser = res + this.lsh = this.currentUser.lsh + globalThis.lsh = this.currentUser.lsh + globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm + const {examSubject} = globalThis.carInfo; + // this.currentUser.kszp=this.photo+res.kszp + // this.currentUser.ksmjzp=this.photo+this.currentUser.ksmjzp + if (globalThis.singlePlay) { + this.stopDeviceById() + // globalThis.statue=4 + router.pushUrl({ + url: examSubject == 3 ? 'pages/Roads' : 'pages/Judge', + params: { + sczb: Number(this.isBoardPrePareSetPopupOpen), + kfdm: this.sczbkf + } + }, router.RouterMode.Single); + return + } + + this.pageIndex = Math.floor(index / 4) + } + }) + this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) + if (!flag) { + promptAction.showToast({ + message: '未匹配到对应下载学员', + duration: 3000 + }); + } + } + + onReadCard(ret) { + console.info(`zzctest xx Read Card ret =${ret.status}`) + let thisVar = globalThis.indexComponent; + + if (ret.status == 0) { // status = 1 为读到身份证信息; status = 1 为身份证离开读卡器 + // 收到身份证离开读卡器的事件通知,根据实际业务需要决定是否需要清空之前已读取的身份证信息。 + // 如果身份证卡片离开读卡器时,需要继续保留UI界面上已读取到的身份信息,以下代码可以注释掉。 + thisVar.name = ""; + thisVar.sex = ""; + thisVar.nation = ""; + thisVar.born = ""; + thisVar.address = ""; + thisVar.idCard = ""; + thisVar.photo = ""; + + return true; + } + + if (ret.baseInfo.length > 2) { + // 收到身份证信息,填充页面 + console.info(`zzctest Read Card 1`); + let subIndex = ret.baseInfo.indexOf(":") + let baseInfo: string = ret.baseInfo.substring(subIndex + 1, ret.baseInfo.length - 1); + console.info(`zzctest Read Card 2 baseInfo=${baseInfo}`); + let baseInfos: string[] = baseInfo.split("|"); + thisVar.name = baseInfos[0]; + thisVar.sex = baseInfos[1]; + thisVar.nation = baseInfos[2]; + thisVar.born = baseInfos[3]; + thisVar.address = baseInfos[4]; + thisVar.idCard = baseInfos[5]; + setTimeout(() => { + thisVar.getCurrentStudent(baseInfos[5]) + }, 1000) + } + + // 身份证照片数据处理 + if (ret.photo instanceof ArrayBuffer) { + let dataView = new DataView(ret.photo) + console.info(`Read Card ret = length = ${dataView.byteLength}`) + let str = "" + for (let i = 0; i < dataView.byteLength; ++i) { + let c = String.fromCharCode(dataView.getUint8(i)) + if (c !== "\n") { + str += c + } + } + thisVar.photo += str; + } + console.info(`zzctest Read Card end`); + return true; + } + + changeQkfn() { + this.qkFn() + } + + async initData() { + this.isFirstBoardPrePareSetPopupBtnShow = false; + this.stepFlag = false + this.faceCompareSucess = 0 + this.showFaceCompare = false + this.lsh = '0000000000000' + this.callBackFlag = false + globalThis.lsh = this.lsh + // this.currentUser = EmptyCandidateObject + globalThis.statue = 2 + this.numCount = 0 + if (globalThis.singlePlay) { + // TODO 模拟假数据 + this.list = CandidateData + this.pageIndex = 0 + this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) + this.currentUser = this.dataList[0] + this.lsh = this.currentUser.lsh + globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm + globalThis.lsh = this.lsh + } else { + this.getExaminationStudentInfoFn() + } + const syssetParams = await getSyncData('MA_SYSSET'); + //@ts-ignore + syssetParams.forEach(sys => { + //364 绕车一周评判时机(1-开始考试后判 2-开始考试前判) + if (sys.v_no === '364') { + this.isBoardPrePareSetPopupOpen = true; + } + }) + + } + + async heartMsg() { + globalThis.udpClient2 & globalThis.udpClient2.setMsgCallBack((val) => { + if (val.id == '32') { + globalThis.signNum = val.body[1] + if (val.body[0] == '7') { + //缺考处理 + this.getqkFn() + this.signNum = val.body[1] + } + } else if (val.id == '42') { + //收到中心缺考确认消息 + console.log('qkfnqkfn', val.body[0]) + this.qkFn() + } + }) + } + + //考点端查询缺考指令内容消息请求 + getqkFn() { + let tmpList = []; + tmpList.push(string2Bytes(globalThis.signNum, 1 * 8)[0]) + const param = { + id: 41, + list: tmpList, + carNo: globalThis.carInfo.carNo, + placeId: globalThis.carInfo.examinationRoomId + } + + globalThis.udpClient2.sendMsgExt(param, this.context) + } + + async initSysset() { + const that = this; + const db = new AccountTable(() => { + }, MA_SYSSET); + db.getRdbStore(() => { + db.query('0', (syssetParams) => { + const serialNumberArr = syssetParams.filter(sys => sys.v_no === '901') + that.jkxlh = serialNumberArr?.[0]?.v_value || '1234567' + const ksxtbhArr = syssetParams.filter(sys => sys.v_no === '902') + that.ksxtbh = ksxtbhArr?.[0]?.v_value || '222' + const studentRefreshParam = syssetParams.filter(sys => sys.v_no === '452') + that.studentRefreshStatue = studentRefreshParam?.[0]?.v_value || '0' + const faceParam = syssetParams.filter(sys => sys.v_no == '2413') + that.FaceOpenStatue = faceParam?.[0]?.v_value == '3' ? '1' : '0' + that.FaceOpenStatue = '0' + // that.FaceOpenStatue = '0' + // faceParam?.[0]?.v_value || + // 1身份证读卡器 2指纹 3人脸 + this.faceFlag = faceParam?.[0]?.v_value || '0' + if (faceParam?.[0]?.v_value == '1') { + that.openDeviceByIDCard() + } + //0不自动更新 1自动更新(不限次数) 2没有考生更新2次 + if (that.studentRefreshStatue == '2') { + clearInterval(that.interval) + that.interval = setInterval(() => { + if (that.dataList.length == 0 && that.numCount < 3) { + that.numCount++ + that.getExaminationStudentInfoFn() + } + }, 5000) + } else if (that.studentRefreshStatue == '1') { + clearInterval(that.interval) + that.interval = setInterval(() => { + if (that.dataList.length == 0) { + that.getExaminationStudentInfoFn() + } + }, 5000) + } else { + this.getExaminationItemFn() + } + + }) + }) + } + + //人脸比对窗口关闭 + changeFaceCompareSuccess() { + console.log('this.faceCompareSuces', this.faceCompareSucess, JSON.stringify(this.currentUser)) + if (this.faceCompareSucess > 0) { + //人脸比对通过 + this.sfbdinterfaceFn() + } + } + + nextClick() { + if (this.list.length <= 4 || this.pageIndex == Math.floor(this.list.length / 4)) { + return + } + this.pageIndex++; + this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) + } + + prevClick() { + if (this.list.length <= 4 || this.pageIndex == 0) { + return + } + this.pageIndex--; + this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) + } + + //获取下载考生 + getExaminationStudentInfoFn() { + if (globalThis.singlePlay && this.updateTimeLimit) { + return + } + const param = `${Md5.Instance.get_md5(globalThis.carInfo.carId + globalThis.carInfo.examinationRoomId + globalThis.username)}${globalThis.carInfo.carId}${globalThis.carInfo.examinationRoomId}${globalThis.username}` + getExaminationStudentInfo(param).then(async(res) => { + setTimeout(() => { + this.updateTimeLimit = true + }, 30000) + this.updateTimeLimit = false + if (!res) { + this.dataList = [] + this.currentUser = EmptyCandidateObject + this.errorMsg = decodeURI(res.getExaminationStudentInfoRsp.head.resultMessage) + return + } + let dataList = [] + this.list = [] + + for (let key in res.getExaminationStudentInfoRsp.body) { + const a = res.getExaminationStudentInfoRsp.body[key] + if (a instanceof Array) { + dataList = a + } else { + dataList = [a] + } + } + if (dataList.length) { + this.numCount = 0 + } + + this.list = JSON.parse(JSON.stringify(dataList)) + this.list.forEach(listData => { + for (let i in listData) { + listData[i] = decodeURI(listData[i]) + } + listData.kszp = this.photo + listData.kszp + listData.ksmjzp = this.photo + listData.ksmjzp + }) + dataList = this.list.length > 4 ? this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) : this.list; + + this.dataList = dataList + if (this.dataList.length) { + this.currentUser = this.dataList[0] + } else { + this.currentUser = EmptyCandidateObject + } + + this.lsh = this.currentUser.lsh + globalThis.lsh = this.lsh + globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm + console.log('this.currentUse3' + JSON.stringify(this.currentUser)) + this.pageIndex = 0 + getSyncData('USER').then(data=>{ + if(data?.[0]){ + this.getCurrentStudent(data[0].sfzmhm) + + } + }) + }).catch((error) => { + console.log('error12error' + error) + }) + } + + qkFn() { + this.faceCompareSucess = 0 + if (globalThis.singlePlay) { + this.qkFlag = false + return + } + console.log('JsonJson', JSON.stringify(this.currentUser)) + const param = `${globalThis.carInfo.carId}${this.currentUser.sfzmhm}${globalThis.carInfo.examinationRoomId}${globalThis.username}${this.lsh}` + console.log('carNo1111', param) + + examinationStuAbsent(param).then(res => { + const arr = [this.signNum || 0, 1] + let tmpList = []; + tmpList.push(string2Bytes(arr[0], 1 * 8)[0]) + tmpList.push(string2Bytes(arr[1], 1 * 8)[0]) + console.log('globalThis.signNum', globalThis.signNum) + const param = { + id: 43, + list: tmpList, + carNo: globalThis.carInfo.carNo, + placeId: globalThis.carInfo.examinationRoomId + } + + globalThis.udpClient2.sendMsgExt(param, this.context) + if (res.examinationStuAbsentRsp.head.resultCode == '0') { + this.pageIndex = 0 + this.qkFlag = false + this.currentUser = EmptyCandidateObject + this.getExaminationStudentInfoFn() + return + } + }).catch((error) => { + console.log('error12error' + error) + }) + + } + + async getExaminationItemFn() { + if (!this.currentUser.lsh || globalThis.singlePlay) { + return + } + const carInfo = globalThis.carInfo; + const {carId,examinationRoomId} = carInfo; + const examItems = await getExaminationItem({ + time: getCurrentTime(), + carId, + lsh: this.currentUser.lsh || '', + examinationRoomId + }); + + if (examItems?.getExaminationItemRsp?.body?.kssycs != 0) { + this.getExaminationStudentInfoFn() + } else { + this.dataList = [] + this.currentUser = EmptyCandidateObject + } + + } + + //身份比对 + async sfbdinterfaceFn() { + this.stepFlag = true + const carInfo = globalThis.carInfo; + const {carId,examinationRoomId} = carInfo; + this.showFaceCompare = false + let examItems = { getExaminationItemRsp: { body: { ykxx: '' } } }; + if (!globalThis.singlePlay) { + //获取已考项目 + examItems = await getExaminationItem({ + time: getCurrentTime(), + carId, + lsh: this.currentUser.lsh || '', + examinationRoomId + }); + } + this.currentUser.id = '1' + const avPlayer = this.avPlayer; + this.isLoadingPopupVisible = true + avPlayer.playAudio([`voice/监管通信中.mp3`],false,async ()=>{ + const code = await this.beginExam(); + if (code != 1) { + promptAction.showToast({ + message:'开始考试接口调用失败!', + duration:4000 + }) + return + } + await upDateTableByArray('USER', [this.currentUser]) + globalThis.statue = 4 + this.stepFlag = false + this.isLoadingPopupVisible = false + router.pushUrl({ + url: 'pages/Judge', + params: { + examItems: examItems?.getExaminationItemRsp?.body?.ykxx, + sczb: Number(this.isBoardPrePareSetPopupOpen), + kfdm: this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + this.stepFlag = false + }) + } + + // 检测车门、熄火信号 + async checkSignal(): Promise { + const {isCheckFireOpen} = judgeConfig + return new Promise((resolve,reject)=>{ + if(isCheckFireOpen){ + resolve(true) + // return + } + console.info('socketTag[PLC.UdpClient]', '注册udp回调') + let plcValue = globalThis.udpClient.getCurrentMessage(); + console.info('surenjun',plcValue) + const msgArr = plcValue.split(',') || '' + const mkg = msgArr[14]; + const fdjzs = msgArr[25]; + if(mkg == 1){ + this.avPlayer.playAudio(['voice/关门.mp3']) + promptAction.showToast({ + message:'请关闭车门', + duration:4000 + }) + reject(false) + } + if(fdjzs*1 > 0){ + this.avPlayer.playAudio(['voice/熄火.mp3']) + promptAction.showToast({ + message:'请熄火', + duration:4000 + }) + reject(false) + } + }) + } + + // 开始考试 + async beginExam() { + const carInfo = globalThis.carInfo; + const {carId,examinationRoomId} = carInfo; + const { examSubject,plateNo } = carInfo; + const date = new Date() + console.info('surenjun', 'photoBase64') + const photoBase64 = await this.getPhoto(); + console.info('surenjun', 'photoBase64End') + const drvexam = { + lsh: this.currentUser.lsh || '', + kskm: examSubject, + ksxtbh: this.ksxtbh || '222', + sfzmhm: this.currentUser.sfzmhm || '', + ksysfzmhm: this.currentUser.ksy1sfzmhm || '', + ksxl: this.currentUser.ksxl, + zp: photoBase64, + kssj: dateFormat(date) || '', + kchp: decodeURI(plateNo), + Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' + } + const param = { + drvexam, + xtlb: '17', + //接口序列号 + jkxlh: this.jkxlh || '1234567', + //接口标识 + jkid: '17C51', + } + const code = await writeObjectOut(param); + globalThis.lsh = this.currentUser.lsh + globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm; + return code + } + + aboutToDisappear() { + this.outClick() + } + + outClick() { + clearInterval(this.interval) + this.stopDeviceById() + globalThis.udpClient2 && globalThis.udpClient2?.setMsgCallBack(() => { + }) + } + + // 几个按钮公共样式 + @Styles + commStyle(){ + .width(220 * this.ratio) + .height(69 * this.ratio) + .backgroundImage($r('app.media.button_nor')) + .backgroundImageSize({ width: '100%', height: '100%' }) + .margin({ bottom: 12 * this.ratio }) + } + + build() { + Column() { + + TopLogo({ outFlag: $outFlag }).margin({ bottom: 10 }) + Row() { + Row() { + ForEach(this.dataList, (item) => { + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Column() { + CommText({ + ratio: this.ratio, + color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000', + text: item.lsh + }) + CommText({ + ratio: this.ratio, + color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000', + text: decodeURIComponent(item.xm) + }) + } + } + .width(165 * this.ratio) + .height(85 * this.ratio) + .backgroundImage(item.sfzmhm != this.currentUser.sfzmhm ? $r('app.media.userbox2') : $r('app.media.userboxbg')) + .backgroundImageSize({ width: '100%', height: '100%' }) + .onClick(() => { + if(this.isExamStart){ + return + } + this.currentUser = item + }) + }) + }.width(640 * this.ratio).margin({ left: 30 * this.ratio }) + + Image($r('app.media.dk_prev')) + .width(90 * this.ratio) + .height(70 * this.ratio) + .margin({ left: 65 * this.ratio, right: 10 * this.ratio }) + .onClick(() => { + this.prevClick() + }) + Image($r('app.media.dk_next')).width(90 * this.ratio).height(70 * this.ratio).onClick(() => { + this.nextClick() + }) + }.margin({ top: 40 * this.ratio, bottom: 10 * this.ratio }) + + Flex({ justifyContent: FlexAlign.SpaceBetween }) { + Row() { + Column() { + if (this.currentUser['kszp']) { + + Avatar({ + ratio: this.ratio, + url: this.currentUser['kszp'] ? this.currentUser['kszp'] : '' + }) + } else { + Avatar({ + ratio: this.ratio, + url: "" + }) + } + if (this.currentUser['ksmjzp']) { + Avatar({ + ratio: this.ratio, + url: this.currentUser['ksmjzp'] ? this.currentUser['ksmjzp'] : '' + }) + } else { + + Avatar({ + ratio: this.ratio, + url: "" + }) + } + } + + Column() { + ForEach(this.labelBlocks, (item) => { + LabelBlock({ label: item.label, ratio: this.ratio, value: this.currentUser[item.key] }) + }) + } + } + .width(664 * this.ratio) + .height(339 * this.ratio) + .backgroundImage($r('app.media.dkbg')) + .backgroundImageSize({ width: '100%', height: '100%' }) + .margin({ left: 53 * this.ratio }) + + Column() { + Image($r('app.media.yydj_btn')) + .commStyle() + Image($r('app.media.gx_btn')) + .commStyle() + .onClick(() => { + this.faceCompareSucess = 0 + this.numCount = 0 + this.getExaminationStudentInfoFn() + }) + Image($r('app.media.qk_btn')) + .commStyle() + .onClick(() => { + this.qkFlag = true + }) + + if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) { + //上车准备 + Image($r('app.media.sczb_btn')).commStyle().onClick(async () => { + try { + await this.checkSignal() + this.isExamStart = true + await upDateTableByArray('USER', [this.currentUser]) + globalThis.statue = 4 + this.isBoardPrePareSetPopupShow = true; + this.isFirstBoardPrePareSetPopupBtnShow = true; + this.stepFlag = false + this.stopDeviceById() + initJudgeUdp() + } catch (e) { + + } + }) + } else { + Image($r('app.media.ksks_btn')) + .commStyle() + .onClick(async () => { + try { + // await this.checkSignal() + this.faceCompareSucess = 0 + globalThis.statue = 2 + if (!this.currentUser.xm) { + return + } + if (globalThis.singlePlay) { + const {examSubject} = globalThis.carInfo; + await upDateTableByArray('USER', [this.currentUser]) + router.pushUrl({ + url: examSubject == 3 ? 'pages/Roads' : 'pages/Judge', + params: { + sczb: Number(this.isBoardPrePareSetPopupOpen), + kfdm: this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + return + } + console.log('this.FaceOpenStatue',this.FaceOpenStatue) + if (this.FaceOpenStatue != '0') { + this.showFaceCompare = true + } else { + initJudgeUdp() + this.sfbdinterfaceFn() + } + } catch (e) { + + } + + }) + } + } + } + + if (this.showFaceCompare) { + FaceCompare({ + sfzh: this.currentUser.sfzmhm, + firstImage: this.currentUser.kszp, + faceCompareSucess: $faceCompareSucess, + getqkFlag: $getqkFlag, + faceCatchImg: $faceCatchImg, + showFaceCompare: $showFaceCompare, + lsh: globalThis.lsh, + }) + } + if (this.qkFlag) { + Column() { + Text('确认考生:' + this.currentUser.xm + '是否缺考') + .fontSize(28 * this.ratio) + .position({ x: 160 * this.ratio, y: 122 * this.ratio }) + Row() { + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text(' 取 消 ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio) + } + .commStyle() + .onClick(() => { + this.qkFlag = false + }) + + Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { + Text(' 确 定 ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio) + } + .commStyle() + .onClick(() => { + this.qkFn() + }) + }.position({ y: 265 * this.ratio, x: 115 * this.ratio }) + + } + .width(660 * this.ratio) + .height(360 * this.ratio) + .position({ x: 150 * this.ratio, y: 98 * this.ratio }) + .backgroundColor('#E6E3DF') + .borderRadius(19 * this.ratio) + } + + // 上车准备弹窗 + if (this.isBoardPrePareSetPopupShow) { + BoardPrePareSetPopup({ + closePopup: (bool) => { + this.isBoardPrePareSetPopupShow = false; + }, + confirmMark: (kfdm) => { + this.sczbkf = kfdm + } + }) + } + + // loading + if(this.isLoadingPopupVisible){ + LoadingPopup({ + title: this.loadingText, + }) + } + } + .height('100%') + .width('100%') + .backgroundImage($r('app.media.bg')) + .backgroundImageSize({ width: '100%', height: '100%' }) + } +} + +// 头像组件 +@Component +struct Avatar { + @State ratio: number = 0 + @State url: string = "" + + build() { + Row() { + Image(this.url) + .width(93 * this.ratio) + .height(130.5 * this.ratio) + .margin({ bottom: 10 * this.ratio, right: 58 * this.ratio, left: 55 * this.ratio }) + .backgroundColor('orange') + .border({ color: '#fff', width: 1, style: BorderStyle.Solid }) + } + } +} + +// 横向滚动学员列表里面文字 +@Component +struct CommText { + @Prop text: string + @Prop color: string + @Prop ratio: number + + build() { + Text(this.text) + .fontSize(16 * this.ratio) + .lineHeight(30 * this.ratio) + .fontWeight(500) + .fontColor(this.color) + } +} + +// 考生信息的labelBlock组件 +@Component +struct LabelBlock { + @State label: string = '' + @State ratio: number = 0 + @Prop value: string = '' + + @Styles + commLabelStyle(){ + .width(280 * this.ratio) + .height(35 * this.ratio) + .backgroundImageSize({ width: '100%', height: '100%' }) + .backgroundImage($r('app.media.userbox')) + .margin({ left: 8 * this.ratio }) + .align(Alignment.Center) + } + + build() { + Row() { + Text(this.label).fontSize(16 * this.ratio).fontColor('#99948A') + Row() { + Text(decodeURIComponent(this.value)).fontColor('#fff').textAlign(TextAlign.Center).width('100%') + } + .commLabelStyle() + }.margin({ bottom: 10 * this.ratio }) + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets index a1d72ca5..5050625d 100644 --- a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets +++ b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets @@ -226,9 +226,9 @@ export default struct DeductedPopup { } const code = await writeObjectOut(beginData) //TODO code待处理 - if (code == 1) { - - } + // if (code == 1) { + // + // } } //过程照片 diff --git a/entry/src/main/ets/pages/compontents/judge/RealTime.ets b/entry/src/main/ets/pages/compontents/judge/RealTime.ets index 28b87539..7ab9c45f 100644 --- a/entry/src/main/ets/pages/compontents/judge/RealTime.ets +++ b/entry/src/main/ets/pages/compontents/judge/RealTime.ets @@ -2,6 +2,9 @@ import apiJudgeSdk from 'libJudgeSdk.so'; import Judge from '../../judgeSDK/utils/judgeReal'; import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d'; import common from '@ohos.app.ability.common'; +import { + examJudgeMapSetScaling +} from '../../judgeSDK/api' interface RoadDataType { name: string, @@ -19,6 +22,7 @@ export default struct RealTime { @State projects: Project[] = [] @State projectsObj: ProjectObj = {} @State markRuleListObj: MarkRule = {} + @State scaleNum: number = 100 @State gpsActive: number = 1 private widthNumber: string | number | Resource = 0 private heightNumber: string | number | Resource = 0 @@ -88,6 +92,11 @@ export default struct RealTime { } .width('100%') .backgroundColor('#fff') + + Row(){ + Image($rawfile('judge/big.png')).width(60).onClick(()=>{this.scaleFn(-10)}) + Image($rawfile('judge/small.png')).width(60).onClick(()=>{this.scaleFn(10)}).margin({left:20}) + }.position({x:'32%',y:60}) } .height('100%') } @@ -136,5 +145,20 @@ export default struct RealTime { { name: '形状', key: ['InShapeAttr', 'ShapeNo','ShapeNoWheel'] }, { name: '路段点', key: ['CrossPointNo'] }, ] + + scaleFn = async (num)=>{ + const scaleNum = this.scaleNum + if(scaleNum >0 && scaleNum < 200){ + this.scaleNum += num; + } + if(scaleNum === 0 && num > 0){ + this.scaleNum += num; + } + if(scaleNum === 200 && num < 0){ + this.scaleNum += num; + } + await examJudgeMapSetScaling(this.scaleNum); + + } } diff --git a/entry/src/main/ets/pages/judgeSDK/dataTest/index.ts b/entry/src/main/ets/pages/judgeSDK/dataTest/index.ts index fc7e9696..803bef85 100644 --- a/entry/src/main/ets/pages/judgeSDK/dataTest/index.ts +++ b/entry/src/main/ets/pages/judgeSDK/dataTest/index.ts @@ -558,6 +558,7 @@ export const testUIAllitems = [ ] export const wuxiKm3Items = [ + //3,5,9,12,14,15,16, {projectCode:'1',projectCodeCenter:'40100',name:'上车准备',abbreviation:'上车准备'}, {projectCode:'2',projectCodeCenter:'40200',name:'起步',abbreviation:'起步'}, {projectCode:'3',projectCodeCenter:'40300',name:'直线行驶',abbreviation:'直线行驶'}, @@ -570,7 +571,7 @@ export const wuxiKm3Items = [ {projectCode:'10',projectCodeCenter:'41400',name:'超车',abbreviation:'超车'}, {projectCode:'11',projectCodeCenter:'40600',name:'靠边停车',abbreviation:'靠边停车'}, {projectCode:'12',projectCodeCenter:'41500',name:'掉头',abbreviation:'掉头'}, - {projectCode:'13',projectCodeCenter:'41600',name:'夜间行驶',abbreviation:'夜间行驶'}, + {projectCode:'41',projectCodeCenter:'41600',name:'夜间行驶',abbreviation:'夜间行驶'}, {projectCode:'14',projectCodeCenter:'40400',name:'加减档位操作',abbreviation:'加减档位操作'}, {projectCode:'15',projectCodeCenter:'40800',name:'路口左转弯',abbreviation:'路口左转弯'}, {projectCode:'16',projectCodeCenter:'40900',name:'路口右转弯',abbreviation:'路口右转弯'}, diff --git a/entry/src/main/ets/pages/judgeSDK/judge.ts b/entry/src/main/ets/pages/judgeSDK/judge.ts index 1f6f65d4..d6db1422 100644 --- a/entry/src/main/ets/pages/judgeSDK/judge.ts +++ b/entry/src/main/ets/pages/judgeSDK/judge.ts @@ -35,7 +35,8 @@ import { plcStrToJson, plcStrToWXJson, promptWxCode, - senorToWXDataStr + senorToWXDataStr, + getKmProjectCancelVoice } from './utils/judgeCommon'; import { @@ -159,7 +160,8 @@ export default class Judge { // 3.开始考试 let beginExamInfo = isTrajectoryOpen ? { ...JSON.parse(strArr[1]), - replay: 1 + replay: 1, + ykxm:judgeConfig.ignoreProjects } : await getJudgeBeginData() await fileLog.setExamJudgeData(beginExamInfo) @@ -291,8 +293,9 @@ export default class Judge { //处理评判过程回调 handleRealExam = async (strData, callBack) => { let examData: EXAMDATA = JSON.parse(strData); - const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,setRoadAndLane,judgeUI} = this; - const {carzt,xmks,kf,event,xmjs,ksjs,sound,mndg,lane} = examData + const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,avPlayer,judgeUI} = this; + const {carzt,xmks,kf,event,xmjs,xmqx,ksjs,sound,mndg,lane} = examData + const param512 = (judgeUI.judgeConfigObj['512'] || '').split(','); //获取项目结束、项目开始代码 const xmdm = event == 2 ? xmjs.xmdm : xmks.xmdm const xmxh = event == 2 ? xmjs.xmxh : xmks.xmxh; @@ -301,7 +304,6 @@ export default class Judge { switch (event) { //项目开始 case 1: - console.info(judgeTag,'项目开始开始1') judgeUI.projectsObj[xmdm].type = '2'; if (isManualProjectIn) { //手动项目是否在进行中 @@ -322,8 +324,9 @@ export default class Judge { this.xmdm = xmdm; this.xmxh = xmxh; this.judgeUI.isProjectIn = true - this.judgeUI.isDeductedPopShow = true - console.info(judgeTag,'项目开始开始2') + if(param512[7] != 0){ + this.judgeUI.isDeductedPopShow = true + } break; //项目结束 @@ -380,8 +383,16 @@ export default class Judge { break; //项目取消 - case 6: + case 6:{ + console.info(judgeTag,'项目取消'); + const xmdm = xmqx.xmdm; + const xmmcCode = judgeUI.projectsObj[xmdm].projectCodeCenter; + const voiceCode = getKmProjectCancelVoice(xmmcCode); + avPlayer.playAudio([`voice/${voiceCode}.mp3`],true) + this.judgeUI.projectsObj[xmdm].type = '1'; + this.testKmItems[xmmcCode].status = '1'; break; + } //语音播放和提示 case 7: @@ -414,7 +425,7 @@ export default class Judge { this.goVoiceAnnounce(event, xmdm, this.kfArr, xmjs, ksjs) //更新UI - if (event == 1 || event == 2 || event == 3) { + if (event == 1 || event == 2 || event == 3 || event == 6) { const copyProjectsObj = this.judgeUI.projectsObj; judgeUI.projectsObj = deepClone(copyProjectsObj); } @@ -447,7 +458,7 @@ export default class Judge { const isEnd = projectsObj[xmdm].isEnd; const kmCode = getKmProjectVoice(code, 1, judgeConfigObj, lane) if (!ignoreVoiceCodeArr.includes(code)) { - kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`]) + kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`],true) } //项目已考不上传监管信息 if (!isEnd) { @@ -490,11 +501,10 @@ export default class Judge { case 3: //扣分时实时播报语音(0-否+1-是) const currentKf = kf[kfLen -1]; - if (judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen) { + if (judgeConfigObj['418'] == '1' && judgeConfig.kfVoiceOpen) { avPlayer.playAudio([`voice/${currentKf.markcatalog}.mp3`]) } const isStart = await checkProjectIsStart(currentKf.xmdm,2,currentKf); - console.info(judgeTag + '扣分 isStart=>',isStart) if(isStart){ await judgeTask.addTask(async () => { console.info(judgeTag, `项目扣分-${currentKf.markcatalog}-${currentKf.desc}`) @@ -593,7 +603,7 @@ export default class Judge { kssj: time } } - const code = await writeObjectOut(data,filePath) + const {code} = await writeObjectOut(data,filePath) console.info(judgeTag, '项目开始 end') if (code === 2300007) { this.isJudgeDisConnect = true; @@ -629,7 +639,7 @@ export default class Judge { jssj: time } } - const code = await writeObjectOut(data,filePath) + const {code} = await writeObjectOut(data,filePath) if (code === 2300007) { this.isJudgeDisConnect = true; } @@ -666,7 +676,7 @@ export default class Judge { kfsj: time } } - const code = await writeObjectOut(data,filePath); + const {code} = await writeObjectOut(data,filePath); if (code === 2300007) { this.isJudgeDisConnect = true } @@ -700,7 +710,7 @@ export default class Judge { ksdd: encodeURI(ksdd) } }; - const code = await writeObjectOut(data,filePath); + const {code} = await writeObjectOut(data,filePath); if (code === 2300007) { this.isJudgeDisConnect = true } @@ -714,27 +724,25 @@ export default class Judge { const {xmdm,code,type} = sound; //判断是不是模拟灯光语音 if (type == 1) { - // console.info(judgeTag, '模拟灯光开始播放:' + code) + avPlayer.playAudio([`voice/${code}.mp3`], false, () => { + examJudgeSoundEnd({ + itemno: xmdm, code, type + }) + fileLog.setExamJudgeData({ + method: 'examJudgeSoundEnd', + itemno: xmdm, + code, + type, + }) + }) + }else{ + avPlayer.playAudio([`voice/${code}.mp3`]) } - avPlayer.playAudio([`voice/${code}.mp3`], false, () => { - if (type == 1) { - // console.info(judgeTag, '播放结束:' + code) - examJudgeSoundEnd({ - itemno: xmdm, code, type - }) - fileLog.setExamJudgeData({ - method: 'examJudgeSoundEnd', - itemno: xmdm, - code, - type, - }) - } - }) } // 校验考试是否结束 checkExamIsEnd = async (isManual?: boolean) => { - const {judgeUI,avPlayer,isExamEnd,} = this; + const {judgeUI,avPlayer,isExamEnd,isEndTip} = this; const {isAllProjectsEnd,examSubject,singlePlay,totalScore,judgeConfigObj,passingScore} = judgeUI; if (isExamEnd) { @@ -773,12 +781,18 @@ export default class Judge { return } //成绩合格 - if (isAllProjectsEnd && totalScore >= passingGrade) { + if (isAllProjectsEnd && totalScore >= passingGrade && isEndTip) { const param302 = judgeConfigObj['302']; - if (examSubject == 3 && (param302 != 6 || param302 != 7 || param302 != 8)) { - avPlayer.playAudio(['voice/综合评判.mp3']) - this.judgeUI.isDeductedPopShow = true - this.judgeUI.defaultTabIndex = 1 + const param342 = judgeConfigObj['342']; + const param512 = (judgeUI.judgeConfigObj['512'] || '').split(','); + if (examSubject == 3 && param342 != 0 && (param302 != 6 || param302 != 7 || param302 != 8)) { + if(param512[7] != 0){ + avPlayer.playAudio(['voice/综合评判.mp3']) + this.judgeUI.isDeductedPopShow = true + this.judgeUI.defaultTabIndex = 1 + this.isEndTip = true + } + } else { await examJudgeEndExam() this.isExamEnd = true @@ -794,20 +808,23 @@ export default class Judge { this.judgeUI.endPopupVisible = false; this.judgeUI.isDeductedPopShow = false; + console.info(judgeTag,1) const {qjjl,dcjl} = ksjs const {judgeUI,endExam,handleSEP,kfArr,avPlayer,judgeTask,isManual} = this; const {judgeConfigObj,examSubject,isAllProjectsEnd,totalScore,passingScore} = judgeUI; //计算考试分数 + console.info(judgeTag,2) this.judgeUI.totalScore = isAllProjectsEnd ? totalScore : 0; const singlePlay = globalThis.singlePlay const param302 = judgeConfigObj['302']; globalThis.windowClass.setWindowSystemBarEnable(['navigation']) + console.info(judgeTag,3) //自动退出待验证并且不合格 if (!isManual && examSubject == 3 && (param302 == 1 || (singlePlay && param302 == 2)) && totalScore < passingScore) { avPlayer.playAudio([`voice/考试结束.mp3`]) } - + console.info(judgeTag,4) //联网模式下手动结束的直接退出 if (!singlePlay && isManual && !isAllProjectsEnd) { avPlayer.playAudio(['voice/empty.mp3'], true, () => { @@ -815,18 +832,21 @@ export default class Judge { }) return } - + console.info(judgeTag,5) if (examSubject == 3) { const param302 = judgeConfigObj['302']; if (totalScore < passingScore) { //考试不合格;考试模式,自动退出; if (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8) { + } } else { //考试合格 } } + console.info(judgeTag,6) await handleSEP(306); + console.info(judgeTag,7) avPlayer.playAudio(['voice/exam_waiting.mp3'], true, async () => { try { if (!singlePlay) { @@ -837,6 +857,7 @@ export default class Judge { //TODO endExam函数逻辑待验证 await endExam() } catch (e) { + console.info(judgeTag,JSON.stringify(e)) // setTimeout(() => { // // avPlayer.avPlayerStop(); // router.back(); @@ -873,8 +894,8 @@ export default class Judge { dwlc: [d1,d2,d3,d4,d5].map((d,index) => `${index},${Math.floor(d /100)}`).join(';'), } } - const code = await writeObjectOut(data,filePath); - promptWxCode('17C56', code) + const temp = await writeObjectOut(data,filePath); + promptWxCode('17C56', temp.code) console.info(judgeTag, '考试结束 end') const param302 = judgeConfigObj['302']; judgeUI.loadingPopupVisible = true; @@ -897,7 +918,9 @@ export default class Judge { } console.info(judgeTag, `考试成绩:${totalScore}`) - await uploadProgressData(); + if(!singlePlay){ + await uploadProgressData(); + } //语音播放扣分项 let score = 0; @@ -923,7 +946,7 @@ export default class Judge { } }) } catch (e) { - + console.info(judgeTag,JSON.stringify(e)) } }) @@ -1059,8 +1082,12 @@ export default class Judge { getSbbm = (ksxm, xmxh) => { const {judgeUI} = this; - const {cdsbInfoObj,projectsObj} = judgeUI; + const {cdsbInfoObj,projectsObj,examSubject} = judgeUI; const project = projectsObj[ksxm] + //科目三不需要 + if(examSubject == 3){ + return undefined + } if (project === undefined) { return '00000000' } @@ -1280,6 +1307,7 @@ export default class Judge { return tempData } + // 处理轨迹plc信号 handleTrajectoryUdp = async (strArr) => { const {fileLog,setJudgeItem,setJudgeMark,endExam} = this; @@ -1290,7 +1318,9 @@ export default class Judge { console.info(judgeTag, '模拟数据考试结束') globalThis.windowClass.setWindowSystemBarEnable(['navigation']) clearInterval(judgeTimer) - this.checkExamIsEnd(true) + await examJudgeEndExam() + this.isExamEnd = true + this.isManual = true return } const msg = JSON.parse(strArr[num]); @@ -1310,7 +1340,7 @@ export default class Judge { } await examJudgeRealExam(msg) num++ - }, 200) + }, 50) globalThis.judgeTimer = judgeTimer; } // 统计必考项目、所有项目、已考数量 @@ -1324,7 +1354,6 @@ export default class Judge { let allProjectNum = 0, allEndProjectsNum = 0; Reflect.ownKeys(projectsObj).forEach(projectKey => { const {type,isRequired} = projectsObj[projectKey]; - allProjectNum += 1; if (type == 3 || type == 4) { allEndProjectsNum += 1; @@ -1336,8 +1365,9 @@ export default class Judge { endProjectsNum += 1; } } - }) + console.info(judgeTag,'必考项目数量:' + projectNum) + console.info(judgeTag,'必考项目已考数量:' + endProjectsNum) //必考项目除靠边停车是否全部完成 this.judgeUI.isRequiredProjectsEnd = (projectNum - endProjectsNum === 0) this.judgeUI.isAllProjectsEnd = (allProjectNum - allEndProjectsNum === 0) @@ -1384,6 +1414,7 @@ export default class Judge { private judgeTask: JudgeTask private tempData: any private performInfo: any + private isEndTip:boolean = false; private ksjs: { // 累计前进距离 qjjl: number, diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts index 5fd39c46..ba97bb3c 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts @@ -136,6 +136,19 @@ export function getKmProjectVoice( } + +//获取科目三取消项目语音 +export function getKmProjectCancelVoice(projectCode){ + switch (projectCode*1){ + //变更车道 + case 40500: return 405004 + //加减档 + case 40400: return 404004 + //超车 + case 41400: return 414004 + default :return 'empty' + } +} // 上传监管数据code转换 export function promptWxCode( jkid:'17C52' | '17C54' |'17C55' | '17C53' | '17C56', diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts index a5cb5d8d..e50ad310 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts @@ -2,11 +2,13 @@ //考试回放开关 export const judgeConfig = { //本地目录开关 - isTrajectoryOpen: false, + isTrajectoryOpen: true, //是否开启拍照 - isPhotoOpen: true, + isPhotoOpen: false, //扣分语音是否强制开启 - kfVoiceOpen: true, + kfVoiceOpen: false, + //忽略的考试项目 + ignoreProjects:[41], // 是否忽略考试前熄火、车门检查 isCheckFireOpen: true, //是否开启Udp @@ -14,7 +16,7 @@ export const judgeConfig = { // 本地模型地址 modelPath: 'models/model_enc', // 济南科目三 - trajectoryPath: 'logs/2024_08_07/2024_08_07_11_35_39_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt', + trajectoryPath: 'logs/2024_08_10/2024_08_10_14_24_20_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt', //四合一画面配置 fourInOneScreen:{ //gps位数 diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts index 931cb599..24a1def4 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts @@ -34,7 +34,7 @@ export default class JudgeImg { setTimeout(async ()=>{ console.info(judgeTag,'1.进入评判入口') await examJudgeMapSetParam(640, 480); //设置参数宽、高 - await examJudgeMapSetScaling(120); //设置缩放比例,一般默认填100(就是100%的意思) ,数字越大视野越大,数字越小视野越小,不能为0 + await examJudgeMapSetScaling(100); //设置缩放比例,一般默认填100(就是100%的意思) ,数字越大视野越大,数字越小视野越小,不能为0 }) judgeUI.draw = true diff --git a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts index 0f01fb4f..9d183d40 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts @@ -42,17 +42,18 @@ export default class VoiceAnnounce{ if(queue.length){ //队列续上 this.queue = this.queue.concat(tempUrls) - + // console.info(TAG,'语音队列开始'+shit + JSON.stringify( this.queue)) }else{ this.queue = tempUrls + // console.info(TAG,'语音队列开始' + shit+JSON.stringify( this.queue)) await this.executeQueue() } } async executeQueue(){ - const avPlayer = new AVPlayer(); const go = async () => { const {queue,isStopped,newQueue} = this; + const avPlayer = new AVPlayer(); if(isStopped){ //清空原来队列 this.queue = newQueue @@ -60,16 +61,16 @@ export default class VoiceAnnounce{ await go() return } - + console.info(TAG,'当前播放队列' + JSON.stringify( queue)) await avPlayer.play(queue[0].url,queue[0].callback); this.queue.shift(); - console.info(TAG,JSON.stringify(this.queue),'堆栈弹出'); + console.info(TAG,'当前播放队列播放完成退出'); + avPlayer.avPlayerStop(); if(this.queue.length){ await go() } } await go() - avPlayer.avPlayerStop(); } } @@ -116,8 +117,7 @@ class AVPlayer { }catch (e){ //检查SD中的语音 this.endCallback = callback - const avPlayer = await media.createAVPlayer(); - this.avPlayer = avPlayer; + this.avPlayer = await media.createAVPlayer(); return new Promise(async (resolve,reject) => { await this.setAVPlayerCallback(()=>{ //@ts-ignore @@ -189,6 +189,7 @@ class AVPlayer { this.avPlayer.prepare() break; case 'prepared': // prepare调用成功后上报该状态机 + console.info(TAG,'播放资源播放') this.avPlayer.play(); this.voiceStatus = 'playing' break; @@ -199,12 +200,13 @@ class AVPlayer { case 'completed': // 播放结束后触发该状态机上报 this.voiceStatus = 'completed' this.avPlayer.stop(); //调用播放结束接口 - if(endCallback){ - endCallback() - } break; case 'stopped': // stop接口成功调用后触发该状态机上报 this.avPlayer.reset(); // 调用reset接口初始化avplayer状态 + console.info(TAG,'播放资源释放') + if(endCallback){ + endCallback() + } callBack() break; case 'released': diff --git a/entry/src/main/resources/rawfile/judge/big.png b/entry/src/main/resources/rawfile/judge/big.png new file mode 100644 index 0000000000000000000000000000000000000000..c8489a07ccee1c457a5f757cd4934084c3ebbdd4 GIT binary patch literal 9021 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 Umqw23w-5`m!+NkK*sB&EBX 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 LtgZA#0TujzRZAPN literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/rawfile/voice/404004.mp3 b/entry/src/main/resources/rawfile/voice/404004.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..bd8896c6de9cb565c1ea4e5ea1deb65ab0e0f3fa GIT binary patch literal 37706 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 literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/rawfile/voice/414005.mp3 b/entry/src/main/resources/rawfile/voice/414005.mp3 index 643ab3d5017916389f788c116b3db48cee1df185..55eec79ba76a97431ed85438c9d254419eff59de 100644 GIT binary patch literal 31692 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 literal 10944 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ⓈyJ>*d$9sqs3r1>Vm$iPAM}K6J)pO4a1&6!G== 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: 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 DJctP| literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3 b/entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f0f4ebba9ce8dcb7c8cfa6db16de1e1ba3e94768 GIT binary patch literal 62324 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

}84m3kaB3z4eIvpDK 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

^>-NwU~ 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 lt_h={}1E7@%I1# literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/rawfile/voice/请置空档.mp3 b/entry/src/main/resources/rawfile/voice/请置空档.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b002763e69bb542a8c523b5ebae1fda23632a431 GIT binary patch literal 29594 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 literal 0 HcmV?d00001 diff --git a/entry/src/main/resources/rawfile/voice/请解开安全带.mp3 b/entry/src/main/resources/rawfile/voice/请解开安全带.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..7ed312cdaf6603cc7125a660be74c58a175d15d3 GIT binary patch literal 40592 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 literal 0 HcmV?d00001 From 6d7e173080f003eb9f7e6f0b6b0468ec288a7f4b Mon Sep 17 00:00:00 2001 From: surenjun Date: Mon, 12 Aug 2024 10:21:40 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat=EF=BC=9A=E5=88=A0=E9=99=A4=E5=A4=9A?= =?UTF-8?q?=E4=BD=99=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/pages/UserInfo1.ets | 918 ------------------ .../ets/pages/judgeSDK/utils/judgeConfig.ts | 6 +- 2 files changed, 3 insertions(+), 921 deletions(-) delete mode 100644 entry/src/main/ets/pages/UserInfo1.ets diff --git a/entry/src/main/ets/pages/UserInfo1.ets b/entry/src/main/ets/pages/UserInfo1.ets deleted file mode 100644 index e04a2779..00000000 --- a/entry/src/main/ets/pages/UserInfo1.ets +++ /dev/null @@ -1,918 +0,0 @@ -import { examinationStuAbsent, getExaminationItem, getExaminationStudentInfo } from '../api/userInfo'; -import router from '@ohos.router'; -import TopLogo from './compontents/TopLogo'; -import Md5 from '../common/utils/md5'; -import AccountTable from '../common/database/tables/AccountTable'; -import USER from '../common/constants/USER'; -import { dateFormat, getCurrentTime, string2Bytes } from '../common/utils/tools'; -import MA_SYSSET from '../common//constants/MA_SYSSET'; -import FaceCompare from './compontents/FaceCompare'; -// import { initJudgeUdp } from '../common/utils/UdpJudge' -import { writeObjectOut } from '../api/judge'; -import testNapi from '@ohos.idcard'; -import common from '@ohos.app.ability.common'; -import { User } from './interfaces'; -import WebRTCVoice from './webRTC/'; -import promptAction from '@ohos.promptAction'; -import FilePhoto from './judgeSDK/utils/filePhoto'; -import { getSyncData, upDateTableByArray } from '../common/service/initable'; -import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData'; -import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup' -import LoadingPopup from './compontents/judge/LoadingPopup'; -import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; -import { JudgeConfig } from '../config/judge'; -import { judgeConfig } from './judgeSDK/utils/judgeConfig'; -import { initJudgeUdp } from '../common/utils/UdpJudge'; -@Entry -@Component -struct UserInfo { - private filePhoto: FilePhoto - private avPlayer - - @State pageIndex: number = 0 - @State ratio: number = 1700 / 960 - @State index: number = 0 - @State stepFlag: boolean = false; - @State errorMsg: string = '' - @State ksxtbh: string = '' - @State pic: string = '' - @State jkxlh: string = '' - @State @Watch('changeFaceCompareSuccess') faceCompareSucess: number = 0; - @State @Watch('changeQkfn') getqkFlag: boolean = false; - @State @Watch('outClick') outFlag: boolean = false; - @State showFaceCompare: boolean = false; - @State url: string = '' - @State lsh: string = '' - @State qkFlag: boolean = false - @State isBoardPrePareSetPopupOpen: boolean = false - @State isFirstBoardPrePareSetPopupBtnShow: boolean = false - @State isBoardPrePareSetPopupShow: boolean = false - @State isLoadingPopupVisible:boolean = false; - @State loadingText:string = '正在认证监管信息,请稍后...' - @State sczbkf:{xmdm:number,kfdm:string}[] = [] - @State currentUser: User = EmptyCandidateObject - @State dataList: Array = [] - @State list: Array = [] - @State name: string = 'initName'; - @State sex: string = ''; - @State callBackFlag: boolean = false; - @State born?: string = ''; - @State address: string = ''; - @State nation: string = ''; - @State idCard: string = ''; - @State grantDept: string = ''; - //是否已经开始考试 - @State isExamStart:boolean = false; - @State effectDate: string = ''; - @State interval: any = null; - @State studentRefreshStatue: string = '0'; - @State photo: string = 'data:image/bmp;base64,'; - @State numCount: number = 0; - @State signNum: number = 0; - @State isCanClick: boolean = true; - @State updateTimeLimit: boolean = true - @State faceFlag: string = '0'; - @State FaceOpenStatue: string = '0'; //是否开启人脸识别 - subscriber; - @State faceCatchImg: string = '' - // 过程照片拍照 - getPhoto = async (empty?: boolean) => { - const singlePlay = globalThis.singlePlay - //单机模式返回空照片 - if (singlePlay) { - return '' - } else { - const {filePhoto} = this; - const photoBase64 = await filePhoto.getPhoto(); - return photoBase64 - } - } - private AccountTable = new AccountTable(() => {}, USER); - private context = getContext(this) as common.UIAbilityContext; - private labelBlocks = [ - { label: '考生姓名', key: 'xm' }, - { label: '身份证号', key: 'sfzmhm' }, - { label: ' 流 水 号 ', key: 'lsh' }, - { label: '考试路线', key: 'ksxl' }, - { label: '待考次数', key: 'kssycs' }, - { label: '考官姓名', key: 'ksy1' }, - ] - - async onPageShow() { - const mediaTest = new FilePhoto(this.context); - this.filePhoto = new FilePhoto(this.context); - //语音功能 - new WebRTCVoice(this.context); - //初始化数据 - this.initData() - - //身份证读卡器初始化 - // this.openDeviceByIDCard() - // 如果是单机模式则模拟假数据 - //获取sysset表数据 - this.initSysset() - - //心跳处理 - this.heartMsg() - this.isExamStart = false - this.sczbkf = []; - this.avPlayer = new VoiceAnnounce(); - } - - //身份证读卡器初始化 - openDeviceByIDCard() { - globalThis.indexComponent = this; - // 应用启动时打开读卡设备 - let ret = testNapi.OpenDevice(); - if (ret == 0) { - testNapi.StartReadCard(this.onReadCard); - } else { - console.error("zzctest Failed to Open Device"); - } - } - - stopDeviceById() { - if (this.faceFlag == '1') { - testNapi && testNapi.StopReadCard() - } - } - - // 通过身份证获取当前学员 - getCurrentStudent(id) { - let flag = false - this.pageIndex - this.list.map((res, index) => { - if (res.sfzmhm == id) { - flag = true - this.currentUser = res - this.lsh = this.currentUser.lsh - globalThis.lsh = this.currentUser.lsh - globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm - const {examSubject} = globalThis.carInfo; - // this.currentUser.kszp=this.photo+res.kszp - // this.currentUser.ksmjzp=this.photo+this.currentUser.ksmjzp - if (globalThis.singlePlay) { - this.stopDeviceById() - // globalThis.statue=4 - router.pushUrl({ - url: examSubject == 3 ? 'pages/Roads' : 'pages/Judge', - params: { - sczb: Number(this.isBoardPrePareSetPopupOpen), - kfdm: this.sczbkf - } - }, router.RouterMode.Single); - return - } - - this.pageIndex = Math.floor(index / 4) - } - }) - this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) - if (!flag) { - promptAction.showToast({ - message: '未匹配到对应下载学员', - duration: 3000 - }); - } - } - - onReadCard(ret) { - console.info(`zzctest xx Read Card ret =${ret.status}`) - let thisVar = globalThis.indexComponent; - - if (ret.status == 0) { // status = 1 为读到身份证信息; status = 1 为身份证离开读卡器 - // 收到身份证离开读卡器的事件通知,根据实际业务需要决定是否需要清空之前已读取的身份证信息。 - // 如果身份证卡片离开读卡器时,需要继续保留UI界面上已读取到的身份信息,以下代码可以注释掉。 - thisVar.name = ""; - thisVar.sex = ""; - thisVar.nation = ""; - thisVar.born = ""; - thisVar.address = ""; - thisVar.idCard = ""; - thisVar.photo = ""; - - return true; - } - - if (ret.baseInfo.length > 2) { - // 收到身份证信息,填充页面 - console.info(`zzctest Read Card 1`); - let subIndex = ret.baseInfo.indexOf(":") - let baseInfo: string = ret.baseInfo.substring(subIndex + 1, ret.baseInfo.length - 1); - console.info(`zzctest Read Card 2 baseInfo=${baseInfo}`); - let baseInfos: string[] = baseInfo.split("|"); - thisVar.name = baseInfos[0]; - thisVar.sex = baseInfos[1]; - thisVar.nation = baseInfos[2]; - thisVar.born = baseInfos[3]; - thisVar.address = baseInfos[4]; - thisVar.idCard = baseInfos[5]; - setTimeout(() => { - thisVar.getCurrentStudent(baseInfos[5]) - }, 1000) - } - - // 身份证照片数据处理 - if (ret.photo instanceof ArrayBuffer) { - let dataView = new DataView(ret.photo) - console.info(`Read Card ret = length = ${dataView.byteLength}`) - let str = "" - for (let i = 0; i < dataView.byteLength; ++i) { - let c = String.fromCharCode(dataView.getUint8(i)) - if (c !== "\n") { - str += c - } - } - thisVar.photo += str; - } - console.info(`zzctest Read Card end`); - return true; - } - - changeQkfn() { - this.qkFn() - } - - async initData() { - this.isFirstBoardPrePareSetPopupBtnShow = false; - this.stepFlag = false - this.faceCompareSucess = 0 - this.showFaceCompare = false - this.lsh = '0000000000000' - this.callBackFlag = false - globalThis.lsh = this.lsh - // this.currentUser = EmptyCandidateObject - globalThis.statue = 2 - this.numCount = 0 - if (globalThis.singlePlay) { - // TODO 模拟假数据 - this.list = CandidateData - this.pageIndex = 0 - this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) - this.currentUser = this.dataList[0] - this.lsh = this.currentUser.lsh - globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm - globalThis.lsh = this.lsh - } else { - this.getExaminationStudentInfoFn() - } - const syssetParams = await getSyncData('MA_SYSSET'); - //@ts-ignore - syssetParams.forEach(sys => { - //364 绕车一周评判时机(1-开始考试后判 2-开始考试前判) - if (sys.v_no === '364') { - this.isBoardPrePareSetPopupOpen = true; - } - }) - - } - - async heartMsg() { - globalThis.udpClient2 & globalThis.udpClient2.setMsgCallBack((val) => { - if (val.id == '32') { - globalThis.signNum = val.body[1] - if (val.body[0] == '7') { - //缺考处理 - this.getqkFn() - this.signNum = val.body[1] - } - } else if (val.id == '42') { - //收到中心缺考确认消息 - console.log('qkfnqkfn', val.body[0]) - this.qkFn() - } - }) - } - - //考点端查询缺考指令内容消息请求 - getqkFn() { - let tmpList = []; - tmpList.push(string2Bytes(globalThis.signNum, 1 * 8)[0]) - const param = { - id: 41, - list: tmpList, - carNo: globalThis.carInfo.carNo, - placeId: globalThis.carInfo.examinationRoomId - } - - globalThis.udpClient2.sendMsgExt(param, this.context) - } - - async initSysset() { - const that = this; - const db = new AccountTable(() => { - }, MA_SYSSET); - db.getRdbStore(() => { - db.query('0', (syssetParams) => { - const serialNumberArr = syssetParams.filter(sys => sys.v_no === '901') - that.jkxlh = serialNumberArr?.[0]?.v_value || '1234567' - const ksxtbhArr = syssetParams.filter(sys => sys.v_no === '902') - that.ksxtbh = ksxtbhArr?.[0]?.v_value || '222' - const studentRefreshParam = syssetParams.filter(sys => sys.v_no === '452') - that.studentRefreshStatue = studentRefreshParam?.[0]?.v_value || '0' - const faceParam = syssetParams.filter(sys => sys.v_no == '2413') - that.FaceOpenStatue = faceParam?.[0]?.v_value == '3' ? '1' : '0' - that.FaceOpenStatue = '0' - // that.FaceOpenStatue = '0' - // faceParam?.[0]?.v_value || - // 1身份证读卡器 2指纹 3人脸 - this.faceFlag = faceParam?.[0]?.v_value || '0' - if (faceParam?.[0]?.v_value == '1') { - that.openDeviceByIDCard() - } - //0不自动更新 1自动更新(不限次数) 2没有考生更新2次 - if (that.studentRefreshStatue == '2') { - clearInterval(that.interval) - that.interval = setInterval(() => { - if (that.dataList.length == 0 && that.numCount < 3) { - that.numCount++ - that.getExaminationStudentInfoFn() - } - }, 5000) - } else if (that.studentRefreshStatue == '1') { - clearInterval(that.interval) - that.interval = setInterval(() => { - if (that.dataList.length == 0) { - that.getExaminationStudentInfoFn() - } - }, 5000) - } else { - this.getExaminationItemFn() - } - - }) - }) - } - - //人脸比对窗口关闭 - changeFaceCompareSuccess() { - console.log('this.faceCompareSuces', this.faceCompareSucess, JSON.stringify(this.currentUser)) - if (this.faceCompareSucess > 0) { - //人脸比对通过 - this.sfbdinterfaceFn() - } - } - - nextClick() { - if (this.list.length <= 4 || this.pageIndex == Math.floor(this.list.length / 4)) { - return - } - this.pageIndex++; - this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) - } - - prevClick() { - if (this.list.length <= 4 || this.pageIndex == 0) { - return - } - this.pageIndex--; - this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) - } - - //获取下载考生 - getExaminationStudentInfoFn() { - if (globalThis.singlePlay && this.updateTimeLimit) { - return - } - const param = `${Md5.Instance.get_md5(globalThis.carInfo.carId + globalThis.carInfo.examinationRoomId + globalThis.username)}${globalThis.carInfo.carId}${globalThis.carInfo.examinationRoomId}${globalThis.username}` - getExaminationStudentInfo(param).then(async(res) => { - setTimeout(() => { - this.updateTimeLimit = true - }, 30000) - this.updateTimeLimit = false - if (!res) { - this.dataList = [] - this.currentUser = EmptyCandidateObject - this.errorMsg = decodeURI(res.getExaminationStudentInfoRsp.head.resultMessage) - return - } - let dataList = [] - this.list = [] - - for (let key in res.getExaminationStudentInfoRsp.body) { - const a = res.getExaminationStudentInfoRsp.body[key] - if (a instanceof Array) { - dataList = a - } else { - dataList = [a] - } - } - if (dataList.length) { - this.numCount = 0 - } - - this.list = JSON.parse(JSON.stringify(dataList)) - this.list.forEach(listData => { - for (let i in listData) { - listData[i] = decodeURI(listData[i]) - } - listData.kszp = this.photo + listData.kszp - listData.ksmjzp = this.photo + listData.ksmjzp - }) - dataList = this.list.length > 4 ? this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) : this.list; - - this.dataList = dataList - if (this.dataList.length) { - this.currentUser = this.dataList[0] - } else { - this.currentUser = EmptyCandidateObject - } - - this.lsh = this.currentUser.lsh - globalThis.lsh = this.lsh - globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm - console.log('this.currentUse3' + JSON.stringify(this.currentUser)) - this.pageIndex = 0 - getSyncData('USER').then(data=>{ - if(data?.[0]){ - this.getCurrentStudent(data[0].sfzmhm) - - } - }) - }).catch((error) => { - console.log('error12error' + error) - }) - } - - qkFn() { - this.faceCompareSucess = 0 - if (globalThis.singlePlay) { - this.qkFlag = false - return - } - console.log('JsonJson', JSON.stringify(this.currentUser)) - const param = `${globalThis.carInfo.carId}${this.currentUser.sfzmhm}${globalThis.carInfo.examinationRoomId}${globalThis.username}${this.lsh}` - console.log('carNo1111', param) - - examinationStuAbsent(param).then(res => { - const arr = [this.signNum || 0, 1] - let tmpList = []; - tmpList.push(string2Bytes(arr[0], 1 * 8)[0]) - tmpList.push(string2Bytes(arr[1], 1 * 8)[0]) - console.log('globalThis.signNum', globalThis.signNum) - const param = { - id: 43, - list: tmpList, - carNo: globalThis.carInfo.carNo, - placeId: globalThis.carInfo.examinationRoomId - } - - globalThis.udpClient2.sendMsgExt(param, this.context) - if (res.examinationStuAbsentRsp.head.resultCode == '0') { - this.pageIndex = 0 - this.qkFlag = false - this.currentUser = EmptyCandidateObject - this.getExaminationStudentInfoFn() - return - } - }).catch((error) => { - console.log('error12error' + error) - }) - - } - - async getExaminationItemFn() { - if (!this.currentUser.lsh || globalThis.singlePlay) { - return - } - const carInfo = globalThis.carInfo; - const {carId,examinationRoomId} = carInfo; - const examItems = await getExaminationItem({ - time: getCurrentTime(), - carId, - lsh: this.currentUser.lsh || '', - examinationRoomId - }); - - if (examItems?.getExaminationItemRsp?.body?.kssycs != 0) { - this.getExaminationStudentInfoFn() - } else { - this.dataList = [] - this.currentUser = EmptyCandidateObject - } - - } - - //身份比对 - async sfbdinterfaceFn() { - this.stepFlag = true - const carInfo = globalThis.carInfo; - const {carId,examinationRoomId} = carInfo; - this.showFaceCompare = false - let examItems = { getExaminationItemRsp: { body: { ykxx: '' } } }; - if (!globalThis.singlePlay) { - //获取已考项目 - examItems = await getExaminationItem({ - time: getCurrentTime(), - carId, - lsh: this.currentUser.lsh || '', - examinationRoomId - }); - } - this.currentUser.id = '1' - const avPlayer = this.avPlayer; - this.isLoadingPopupVisible = true - avPlayer.playAudio([`voice/监管通信中.mp3`],false,async ()=>{ - const code = await this.beginExam(); - if (code != 1) { - promptAction.showToast({ - message:'开始考试接口调用失败!', - duration:4000 - }) - return - } - await upDateTableByArray('USER', [this.currentUser]) - globalThis.statue = 4 - this.stepFlag = false - this.isLoadingPopupVisible = false - router.pushUrl({ - url: 'pages/Judge', - params: { - examItems: examItems?.getExaminationItemRsp?.body?.ykxx, - sczb: Number(this.isBoardPrePareSetPopupOpen), - kfdm: this.sczbkf - } - }, router.RouterMode.Single); - this.stopDeviceById() - this.stepFlag = false - }) - } - - // 检测车门、熄火信号 - async checkSignal(): Promise { - const {isCheckFireOpen} = judgeConfig - return new Promise((resolve,reject)=>{ - if(isCheckFireOpen){ - resolve(true) - // return - } - console.info('socketTag[PLC.UdpClient]', '注册udp回调') - let plcValue = globalThis.udpClient.getCurrentMessage(); - console.info('surenjun',plcValue) - const msgArr = plcValue.split(',') || '' - const mkg = msgArr[14]; - const fdjzs = msgArr[25]; - if(mkg == 1){ - this.avPlayer.playAudio(['voice/关门.mp3']) - promptAction.showToast({ - message:'请关闭车门', - duration:4000 - }) - reject(false) - } - if(fdjzs*1 > 0){ - this.avPlayer.playAudio(['voice/熄火.mp3']) - promptAction.showToast({ - message:'请熄火', - duration:4000 - }) - reject(false) - } - }) - } - - // 开始考试 - async beginExam() { - const carInfo = globalThis.carInfo; - const {carId,examinationRoomId} = carInfo; - const { examSubject,plateNo } = carInfo; - const date = new Date() - console.info('surenjun', 'photoBase64') - const photoBase64 = await this.getPhoto(); - console.info('surenjun', 'photoBase64End') - const drvexam = { - lsh: this.currentUser.lsh || '', - kskm: examSubject, - ksxtbh: this.ksxtbh || '222', - sfzmhm: this.currentUser.sfzmhm || '', - ksysfzmhm: this.currentUser.ksy1sfzmhm || '', - ksxl: this.currentUser.ksxl, - zp: photoBase64, - kssj: dateFormat(date) || '', - kchp: decodeURI(plateNo), - Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' - } - const param = { - drvexam, - xtlb: '17', - //接口序列号 - jkxlh: this.jkxlh || '1234567', - //接口标识 - jkid: '17C51', - } - const code = await writeObjectOut(param); - globalThis.lsh = this.currentUser.lsh - globalThis.ksyh = this.currentUser.ksy1sfzmhm || this.currentUser.ksy2sfzmhm; - return code - } - - aboutToDisappear() { - this.outClick() - } - - outClick() { - clearInterval(this.interval) - this.stopDeviceById() - globalThis.udpClient2 && globalThis.udpClient2?.setMsgCallBack(() => { - }) - } - - // 几个按钮公共样式 - @Styles - commStyle(){ - .width(220 * this.ratio) - .height(69 * this.ratio) - .backgroundImage($r('app.media.button_nor')) - .backgroundImageSize({ width: '100%', height: '100%' }) - .margin({ bottom: 12 * this.ratio }) - } - - build() { - Column() { - - TopLogo({ outFlag: $outFlag }).margin({ bottom: 10 }) - Row() { - Row() { - ForEach(this.dataList, (item) => { - Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Column() { - CommText({ - ratio: this.ratio, - color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000', - text: item.lsh - }) - CommText({ - ratio: this.ratio, - color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000', - text: decodeURIComponent(item.xm) - }) - } - } - .width(165 * this.ratio) - .height(85 * this.ratio) - .backgroundImage(item.sfzmhm != this.currentUser.sfzmhm ? $r('app.media.userbox2') : $r('app.media.userboxbg')) - .backgroundImageSize({ width: '100%', height: '100%' }) - .onClick(() => { - if(this.isExamStart){ - return - } - this.currentUser = item - }) - }) - }.width(640 * this.ratio).margin({ left: 30 * this.ratio }) - - Image($r('app.media.dk_prev')) - .width(90 * this.ratio) - .height(70 * this.ratio) - .margin({ left: 65 * this.ratio, right: 10 * this.ratio }) - .onClick(() => { - this.prevClick() - }) - Image($r('app.media.dk_next')).width(90 * this.ratio).height(70 * this.ratio).onClick(() => { - this.nextClick() - }) - }.margin({ top: 40 * this.ratio, bottom: 10 * this.ratio }) - - Flex({ justifyContent: FlexAlign.SpaceBetween }) { - Row() { - Column() { - if (this.currentUser['kszp']) { - - Avatar({ - ratio: this.ratio, - url: this.currentUser['kszp'] ? this.currentUser['kszp'] : '' - }) - } else { - Avatar({ - ratio: this.ratio, - url: "" - }) - } - if (this.currentUser['ksmjzp']) { - Avatar({ - ratio: this.ratio, - url: this.currentUser['ksmjzp'] ? this.currentUser['ksmjzp'] : '' - }) - } else { - - Avatar({ - ratio: this.ratio, - url: "" - }) - } - } - - Column() { - ForEach(this.labelBlocks, (item) => { - LabelBlock({ label: item.label, ratio: this.ratio, value: this.currentUser[item.key] }) - }) - } - } - .width(664 * this.ratio) - .height(339 * this.ratio) - .backgroundImage($r('app.media.dkbg')) - .backgroundImageSize({ width: '100%', height: '100%' }) - .margin({ left: 53 * this.ratio }) - - Column() { - Image($r('app.media.yydj_btn')) - .commStyle() - Image($r('app.media.gx_btn')) - .commStyle() - .onClick(() => { - this.faceCompareSucess = 0 - this.numCount = 0 - this.getExaminationStudentInfoFn() - }) - Image($r('app.media.qk_btn')) - .commStyle() - .onClick(() => { - this.qkFlag = true - }) - - if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) { - //上车准备 - Image($r('app.media.sczb_btn')).commStyle().onClick(async () => { - try { - await this.checkSignal() - this.isExamStart = true - await upDateTableByArray('USER', [this.currentUser]) - globalThis.statue = 4 - this.isBoardPrePareSetPopupShow = true; - this.isFirstBoardPrePareSetPopupBtnShow = true; - this.stepFlag = false - this.stopDeviceById() - initJudgeUdp() - } catch (e) { - - } - }) - } else { - Image($r('app.media.ksks_btn')) - .commStyle() - .onClick(async () => { - try { - // await this.checkSignal() - this.faceCompareSucess = 0 - globalThis.statue = 2 - if (!this.currentUser.xm) { - return - } - if (globalThis.singlePlay) { - const {examSubject} = globalThis.carInfo; - await upDateTableByArray('USER', [this.currentUser]) - router.pushUrl({ - url: examSubject == 3 ? 'pages/Roads' : 'pages/Judge', - params: { - sczb: Number(this.isBoardPrePareSetPopupOpen), - kfdm: this.sczbkf - } - }, router.RouterMode.Single); - this.stopDeviceById() - return - } - console.log('this.FaceOpenStatue',this.FaceOpenStatue) - if (this.FaceOpenStatue != '0') { - this.showFaceCompare = true - } else { - initJudgeUdp() - this.sfbdinterfaceFn() - } - } catch (e) { - - } - - }) - } - } - } - - if (this.showFaceCompare) { - FaceCompare({ - sfzh: this.currentUser.sfzmhm, - firstImage: this.currentUser.kszp, - faceCompareSucess: $faceCompareSucess, - getqkFlag: $getqkFlag, - faceCatchImg: $faceCatchImg, - showFaceCompare: $showFaceCompare, - lsh: globalThis.lsh, - }) - } - if (this.qkFlag) { - Column() { - Text('确认考生:' + this.currentUser.xm + '是否缺考') - .fontSize(28 * this.ratio) - .position({ x: 160 * this.ratio, y: 122 * this.ratio }) - Row() { - Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Text(' 取 消 ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio) - } - .commStyle() - .onClick(() => { - this.qkFlag = false - }) - - Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { - Text(' 确 定 ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio) - } - .commStyle() - .onClick(() => { - this.qkFn() - }) - }.position({ y: 265 * this.ratio, x: 115 * this.ratio }) - - } - .width(660 * this.ratio) - .height(360 * this.ratio) - .position({ x: 150 * this.ratio, y: 98 * this.ratio }) - .backgroundColor('#E6E3DF') - .borderRadius(19 * this.ratio) - } - - // 上车准备弹窗 - if (this.isBoardPrePareSetPopupShow) { - BoardPrePareSetPopup({ - closePopup: (bool) => { - this.isBoardPrePareSetPopupShow = false; - }, - confirmMark: (kfdm) => { - this.sczbkf = kfdm - } - }) - } - - // loading - if(this.isLoadingPopupVisible){ - LoadingPopup({ - title: this.loadingText, - }) - } - } - .height('100%') - .width('100%') - .backgroundImage($r('app.media.bg')) - .backgroundImageSize({ width: '100%', height: '100%' }) - } -} - -// 头像组件 -@Component -struct Avatar { - @State ratio: number = 0 - @State url: string = "" - - build() { - Row() { - Image(this.url) - .width(93 * this.ratio) - .height(130.5 * this.ratio) - .margin({ bottom: 10 * this.ratio, right: 58 * this.ratio, left: 55 * this.ratio }) - .backgroundColor('orange') - .border({ color: '#fff', width: 1, style: BorderStyle.Solid }) - } - } -} - -// 横向滚动学员列表里面文字 -@Component -struct CommText { - @Prop text: string - @Prop color: string - @Prop ratio: number - - build() { - Text(this.text) - .fontSize(16 * this.ratio) - .lineHeight(30 * this.ratio) - .fontWeight(500) - .fontColor(this.color) - } -} - -// 考生信息的labelBlock组件 -@Component -struct LabelBlock { - @State label: string = '' - @State ratio: number = 0 - @Prop value: string = '' - - @Styles - commLabelStyle(){ - .width(280 * this.ratio) - .height(35 * this.ratio) - .backgroundImageSize({ width: '100%', height: '100%' }) - .backgroundImage($r('app.media.userbox')) - .margin({ left: 8 * this.ratio }) - .align(Alignment.Center) - } - - build() { - Row() { - Text(this.label).fontSize(16 * this.ratio).fontColor('#99948A') - Row() { - Text(decodeURIComponent(this.value)).fontColor('#fff').textAlign(TextAlign.Center).width('100%') - } - .commLabelStyle() - }.margin({ bottom: 10 * this.ratio }) - } -} \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts index e50ad310..4a861d1f 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts @@ -2,11 +2,11 @@ //考试回放开关 export const judgeConfig = { //本地目录开关 - isTrajectoryOpen: true, + isTrajectoryOpen: false, //是否开启拍照 - isPhotoOpen: false, + isPhotoOpen: true, //扣分语音是否强制开启 - kfVoiceOpen: false, + kfVoiceOpen: true, //忽略的考试项目 ignoreProjects:[41], // 是否忽略考试前熄火、车门检查