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 b49b5cca..83a6721e 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 @@ -260,9 +259,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+''; + } }) } @@ -432,7 +435,6 @@ struct UserInfo { getSyncData('USER').then(data=>{ if(data?.[0]){ this.getCurrentStudent(data[0].sfzmhm) - } }) }).catch((error) => { @@ -519,10 +521,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 @@ -547,33 +550,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) }) } @@ -606,10 +680,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() { @@ -758,7 +833,7 @@ struct UserInfo { .commStyle() .onClick(async () => { try { - // await this.checkSignal() + await this.checkSignal() this.faceCompareSucess = 0 globalThis.statue = 2 if (!this.currentUser.xm) { @@ -777,7 +852,6 @@ struct UserInfo { this.stopDeviceById() return } - console.log('this.FaceOpenStatue',this.FaceOpenStatue) if (this.FaceOpenStatue != '0') { this.showFaceCompare = true } else { @@ -785,7 +859,7 @@ struct UserInfo { this.sfbdinterfaceFn() } } catch (e) { - + console.info('Throw Error',JSON.stringify(e)) } }) 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..4a861d1f 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts @@ -7,6 +7,8 @@ export const judgeConfig = { isPhotoOpen: true, //扣分语音是否强制开启 kfVoiceOpen: true, + //忽略的考试项目 + ignoreProjects:[41], // 是否忽略考试前熄火、车门检查 isCheckFireOpen: true, //是否开启Udp @@ -14,7 +16,7 @@ export const judgeConfig = { // 本地模型地址 modelPath: 'models/model_enc', // 济南科目三 - trajectoryPath: 'logs/2024_08_07/2024_08_07_11_35_39_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt', + trajectoryPath: 'logs/2024_08_10/2024_08_10_14_24_20_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt', //四合一画面配置 fourInOneScreen:{ //gps位数 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 00000000..c8489a07 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/big.png differ diff --git a/entry/src/main/resources/rawfile/judge/small.png b/entry/src/main/resources/rawfile/judge/small.png new file mode 100644 index 00000000..afcdc349 Binary files /dev/null and b/entry/src/main/resources/rawfile/judge/small.png differ 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 00000000..bd8896c6 Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/404004.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/414005.mp3 b/entry/src/main/resources/rawfile/voice/414005.mp3 index 643ab3d5..55eec79b 100644 Binary files a/entry/src/main/resources/rawfile/voice/414005.mp3 and b/entry/src/main/resources/rawfile/voice/414005.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/empty.mp3 b/entry/src/main/resources/rawfile/voice/empty.mp3 index 745724f9..66de10a0 100644 Binary files a/entry/src/main/resources/rawfile/voice/empty.mp3 and b/entry/src/main/resources/rawfile/voice/empty.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/点火.mp3 b/entry/src/main/resources/rawfile/voice/点火.mp3 new file mode 100644 index 00000000..3d011308 Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/点火.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3 b/entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3 new file mode 100644 index 00000000..f0f4ebba Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/请拉手刹.mp3 b/entry/src/main/resources/rawfile/voice/请拉手刹.mp3 new file mode 100644 index 00000000..b10d9b68 Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/请拉手刹.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/请置空档.mp3 b/entry/src/main/resources/rawfile/voice/请置空档.mp3 new file mode 100644 index 00000000..b002763e Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/请置空档.mp3 differ diff --git a/entry/src/main/resources/rawfile/voice/请解开安全带.mp3 b/entry/src/main/resources/rawfile/voice/请解开安全带.mp3 new file mode 100644 index 00000000..7ed312cd Binary files /dev/null and b/entry/src/main/resources/rawfile/voice/请解开安全带.mp3 differ