衝突解決

This commit is contained in:
lvyuankang 2024-08-12 14:54:10 +08:00
commit 1b3093b067
53 changed files with 1081 additions and 561 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
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=24个点关联的比如斑马线、公交站台
//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,31 +2423,54 @@ 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;
}
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;
flag = true; //break;
}
//20240801
if(GpsMath::IsLineCrossPoly(subItem->Line1, polyW))
{
RTKKM3.ShapeNoWheel = SNO;
flag = true; //break;
}
if(flag)
{
break;
}
}
@ -3311,7 +3407,12 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo)
//线路不允许为空
if(m_stuInfo.wayno <= 0) return;
//1、查找项目信息
const TMap_Point_Item* mapPointItem = TableMapPointItem->findMapPointItem(crossPointNo);
const std::vector<const TMap_Point_Item*> mapPointItems = TableMapPointItem->findMapPointItem(crossPointNo);
for(size_t i = 0; i < mapPointItems.size(); i++)
{
const TMap_Point_Item* mapPointItem= mapPointItems[i];
if(nullptr == mapPointItem) return;
ExamItemCode readItemNo = mapPointItem->itemno;
@ -3351,10 +3452,13 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo)
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 == "1")
{
if(!isMileage()) return;
}
if(s319 == "2")
{
if(m_pub.m_KsLjLc < m_car.XSJL) return;
if(!isMileage()) return;
bool unfinished = false;
for(auto it = m_sub3Items.begin(); it != m_sub3Items.end(); it++)
{
@ -3377,6 +3481,7 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo)
if(item->Item_Color == itemStateZk)
{
unfinished = true;
break;
}
}
}
@ -3441,6 +3546,7 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo)
//(*2024-03-05*)
if(KM3Item.Gps_Itemno1 != 1)
{
//continue; //20240809
TKM3Item* item = findExamItem(ItemNo);
if(item && item->TestPro == ItemProFlagIdle)
{
@ -3454,6 +3560,7 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo)
{
if(KM3Item.Gps_Itemno1 != 1)
{
//continue; //20240809
TKM3Item* item = findExamItem(ItemNo);
if(item && item->TestPro == ItemProFlagIdle)
{
@ -3543,6 +3650,7 @@ void ExamCarSub3::ReadItemByPoint(int crossPointNo)
}
}
}
}
}
bool ExamCarSub3::IsValid_Km3NewEnterItem(int ItemNo, const std::string& ItemSNo) //20150910
@ -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;
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -38,7 +38,7 @@ bool Sub3Judge01Sczb::dealJudgeEnter()
const std::vector<std::string>& s512 = TableSysSet->asArray512();
std::string Temp512_9 = s512.size() > 8 && s512[8] != "" ? s512[8].c_str() : "";
const std::vector<std::string>& s512_9 = Tools::split(Temp512_9, "^");
const std::vector<std::string> s512_9 = Tools::split(Temp512_9, "^");
m_itemv.newtype = s512_9.size() > 0 && s512_9[0] != "" ? std::atoi(s512_9[0].c_str()) : 0;
m_itemv.time_tishi = s512_9.size() > 1 && s512_9[1] != "" ? std::atoi(s512_9[1].c_str()) : 0;
m_itemv.time_raoche = s512_9.size() > 2 && s512_9[2] != "" ? std::atoi(s512_9[2].c_str()) : 0;
@ -495,6 +495,18 @@ void Sub3Judge01Sczb::AddCSBData(CsbType csb)
if(m_csb.empty())
{
m_csb.push_back(csb);
std::string sou;
switch(csb)
{
case CsbType::ZQ: sou = sound::sub3_401001; break;
case CsbType::ZH: sou = sound::sub3_401002; break;
case CsbType::YH: sou = sound::sub3_401003; break;
case CsbType::YQ: sou = sound::sub3_401004; break;
default: break;
}
//ToDo:语音提示,
m_car->createEventSound({itemNo(), sou});
}
else
{

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -159,7 +159,6 @@ 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")
{
@ -172,9 +171,9 @@ void Sub3Judge20Comm::Init_ZongHe()
{
m_itemvCJH.bZdKbTc = false;
m_itemvCJH.ZdKbTcJl = 1;
m_itemvCJH.KbTcJl = -1;
}
//溜车变量初始化
//SysSet[529]:模拟灯光是否需要人脸验证
//说明:这个参数目前我没有实际的用到
m_sfyz_state = 0;
@ -213,7 +212,7 @@ void Sub3Judge20Comm::Init_ZongHe()
if(str2 == "") continue;
int dw = std::atoi(str1.c_str());
const std::vector<std::string>& stmp = Tools::split(str2, "-");
const std::vector<std::string> stmp = Tools::split(str2, "-");
itemv14->DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
itemv14->DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 100;
}
@ -243,7 +242,7 @@ void Sub3Judge20Comm::Init_ZongHe()
//评判半联动用的比如前进状态下离合器连续30秒
const std::vector<std::string>& s500 = TableSysSet->asArray500();
std::string s500_1 = s500.size() > 0 ? s500[0] : "";
const std::vector<std::string>& ss500_1 = Tools::split(s500_1, "^");
const std::vector<std::string> ss500_1 = Tools::split(s500_1, "^");
m_itemvCJH.lhqxs = ss500_1.size() > 0 && ss500_1[0] != "" ? std::atoi(ss500_1[0].c_str()) : 30;
//离合器距离
@ -260,14 +259,14 @@ void Sub3Judge20Comm::Init_ZongHe()
m_itemvCJH.DWKF_SJ = (s500.size() > 3 && s500[3] != "" ? std::atoi(s500[3].c_str()) : 20) * SECOND;
//加速发动机转速阀值^加速发动机变化倍数^
std::string Str = s500.size() > 4 && s500[4] != "" ? s500[4] : "";
const std::vector<std::string>& s500_4 = Tools::split(Str, "^");
const std::vector<std::string> s500_4 = Tools::split(Str, "^");
m_itemvCJH.KongYouMen_FDJ_YZ = s500_4.size() > 0 && s500_4[0] != "" ? std::atoi(s500_4[0].c_str()) : 3000;
//变化倍数
m_itemvCJH.KonbYouMen_FDJ_BS = s500_4.size() > 1 && s500_4[1] != "" ? std::atoi(s500_4[1].c_str()) : 3;
//转向灯不关闭距离^项目结束后不关闭时间
Str = s500.size() > 5 && s500[5] != "" ? s500[5] : "";
const std::vector<std::string>& s500_5 = Tools::split(Str, "^");
const std::vector<std::string> s500_5 = Tools::split(Str, "^");
m_itemvCJH.ZXD_BGB_JL = s500_5.size() > 0 && s500_5[0] != "" ? std::atoi(s500_5[0].c_str()) : 3000;
m_itemvCJH.ZXD_BGB_SJ = s500_5.size() > 1 && s500_5[1] != "" ? std::atoi(s500_5[1].c_str()) : 0;
@ -341,8 +340,8 @@ void Sub3Judge20Comm::Init_ZongHe()
//条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^
//条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^
const std::vector<std::vector<std::string>>& s301 = TableSysSet->asArray2_301();
const std::vector<std::string>& s301_1 = s301.size() > 0 ? s301[0] : std::vector<std::string>();
const std::vector<std::string>& s301 = TableSysSet->asArray301();
const std::vector<std::string> s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector<std::string>();
if(!s301_1.empty())
{
m_itemvCJH.dw_cs_dw1 = s301_1.size() > 0 && s301_1[0] != "" ? std::atoi(s301_1[0].c_str()) : 1;
@ -358,7 +357,7 @@ void Sub3Judge20Comm::Init_ZongHe()
m_itemvCJH.dw_cs_sl1 = 0;
}
const std::vector<std::string>& s301_2 = s301.size() > 1 ? s301[1] : std::vector<std::string>();
const std::vector<std::string>& s301_2 = s301.size() > 1 ? Tools::split(s301[1], ",") : std::vector<std::string>();
if(!s301_2.empty())
{
m_itemvCJH.dw_cs_dw2 = s301_2.size() > 0 && s301_2[0] != "" ? std::atoi(s301_2[0].c_str()) : 1;
@ -375,9 +374,9 @@ void Sub3Judge20Comm::Init_ZongHe()
m_itemvCJH.dw_cs_sl2 = 0;
}
std::vector<std::string> s301_3 = s301.size() > 2 ? s301[2] : std::vector<std::string>();
std::string s301_3 = s301.size() > 2 ? s301[2] : "";
//301评判时间0-结束考试时评判1-里程达标就评判 100-表示已评判过 20140630 //yhyflag
ctl->dw_kf_sj = s301_3.size() > 0 && s301_3[0] != "" ? std::atoi(s301_3[0].c_str()) : 1; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
ctl->dw_kf_sj = s301_3 != "" ? std::atoi(s301_3.c_str()) : 0; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
//SysSet[530]:环境感知相关参数(原封不动翻译即可,前期用不到,赞不考虑)
const std::vector<std::string>& s530 = TableSysSet->asArray530();
@ -385,7 +384,7 @@ void Sub3Judge20Comm::Init_ZongHe()
m_itemvCJH.sslkfxp_sj = s530.size() > 0 && s530[0] != "" ? std::atoi(s530[0].c_str()) : 15; //StrToIntdef(GetDotStr(1, Sysset[530] + '^', '^'), 15);
//单手离开方向盘时间秒右边距离偏差cm
const std::string& ss530 = s530.size() > 1 && s530[1] != "" ? s530[1] : "";
const std::vector<std::string>& s530_2 = Tools::split(ss530, ",");
const std::vector<std::string> s530_2 = Tools::split(ss530, ",");
m_itemvCJH.dslkfxp_sj = s530_2.size() > 0 && s530_2[0] != "" ? std::atoi(s530_2[0].c_str()) : 60;
m_itemvCJH.dslkfxp_jlpc = s530_2.size() > 1 && s530_2[1] != "" ? std::atoi(s530_2[1].c_str()) : 30;
@ -567,7 +566,7 @@ void Sub3Judge20Comm::Init_ZongHe()
std::string str2 = s394i.size() > 1 ? s394i[1] : ""; //GetDotStr(2, Str + ':', ':');
int dw = std::atoi(str1.c_str());
const std::vector<std::string>& stmp = Tools::split(str2, "-");
const std::vector<std::string> stmp = Tools::split(str2, "-");
m_itemvCJH.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
m_itemvCJH.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0;
}
@ -756,11 +755,16 @@ void Sub3Judge20Comm::CallMoNiDengGuang()
return; //屏蔽模拟灯光
#endif
const std::string& s386 = TableSysSet->get386();
//模拟灯光参数386=0,开始考试后,就触发模拟灯光
if(s386 != "0")
{
TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg)
{
return;
}
}
TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg);
if(item41 == nullptr) //有可能免考,可能没这个项目
@ -782,7 +786,6 @@ void Sub3Judge20Comm::CallMoNiDengGuang()
const TSensorInfo& sor3 = his3->real.sensor;
const std::string& ksdd = TableSysSet->get211();
const std::string& s386 = TableSysSet->get386();
const std::string& s322 = TableSysSet->get322();
TCar* tcar = m_car->getTCar();
@ -2464,7 +2467,7 @@ void Sub3Judge20Comm::Judge_LianXuBianDao()
//获取连续变道超车参数
std::string Temp = s512.size() > 1 && s512[1] != "" ? s512[1] : "";
const std::vector<std::string>& ss = Tools::split(Temp, "^");
const std::vector<std::string> ss = Tools::split(Temp, "^");
//0:abc 1:aba和abc都判
ctl->LianXuBianDaoKind = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0;
@ -3439,7 +3442,7 @@ void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2()
//标准 20180416
if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 &&
RTKKM3.FrontPointLaneNo != RTKKM3_1.FrontPointLaneNo &&
RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6 )
RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6)
{
//变道判方向灯
Tag = 0;
@ -4354,9 +4357,16 @@ void Sub3Judge20Comm::Judge_DW_KongDang()
//启动发动机时,挡位未至于空挡(驻车挡)
if(sor.dh2 == SYES && sor1.dh2 == SNOT && sor2.dh2 == SNOT)
{
if(sor.dw_plc != 0) //(sor.dw != 0) //用原始档位无锡所
if(sor.dw_plc != 0 && sor.dw_plc != 10) //C2自动挡10档是驻车档P档0档是空挡 //(sor.dw != 0) //用原始档位无锡所
{
JUDGE_MARK_SUB3(2, "04", false);
if(m_car->itemsSomeExaming2(Sub3ItemType02Qbxx))
{
JUDGE_MARK_SUB3(2, "04", false); //如果起步项目正在考就扣这个分
}
else
{
JUDGE_MARK_SUB3(20, "05", false);
}
}
}
}
@ -4602,8 +4612,11 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
const TChuanGan* his6 = m_car->historyChuanGan(6);
//旧规则评判
int TempCS = std::round(gps.sd);
const std::vector<std::string>& s507 = TableSysSet->asArray507();
std::string lhq = s507.size() > 9 ? s507[9] : ""; //507第10个参数 设置为1不管踩没踩离合器都判否则踩离合器不判
///////////////////////////////////////////////////////////////////////////
if(sor.lhq == SYES || Tools::less(std::round(gps.sd), 5) ||
if((lhq != "1" && sor.lhq == SYES) || Tools::less(std::round(gps.sd), 5) ||
(ksdd != siteof::nj && (cg->move != moveForward || his1->move != moveForward ||
his2->move != moveForward || his3->move != moveForward || his4->move != moveForward ||
his5->move != moveForward || his6->move != moveForward)))
@ -4799,7 +4812,27 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
//24、全程次高挡评判
void Sub3Judge20Comm::Judge_CiGaoDang()
{
if(m_car->allItemFinish() && m_car->isQualified()) //全程次高挡评判 KM3AllPass()
//按照军华说的 在行驶距离达到的实际判断全程次高档 20240731
//301 第3个^参数 1:达到行驶里程 非1靠边停车开始前 20240805
bool timing = false; //次高档时机
TTestCtl* ctl = m_car->getTTestCtl();
if(ctl->dw_kf_sj == 1) //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前
{
if(m_car->isMileage())
{
timing = true;
}
}
else
{
TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc);
if(item && item->TestPro == ItemProFlagInit)
{
timing = true;
}
}
if(timing)
{
if(m_itemvXLG.CGD_Nums == 0)
{
@ -4815,51 +4848,23 @@ void Sub3Judge20Comm::Judge_CiGaoDang()
//25、自动靠边停车重点
void Sub3Judge20Comm::Call_Auto_KBTC()
{
//SysSet[319]:里程不够不报靠边停车0-否 1-是 2-必考项目完成,并且里程满足要求)
//SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
const std::string& s319 = TableSysSet->get319();
TCar* tcar = m_car->getTCar();
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
//自动靠边停车
if(s319 == "1" && m_car->getKsLjLc() < tcar->XSJL)
if(s319 == "1")
{
return;
if(!m_car->isMileage()) return;
}
if(s319 == "2")
{
if(m_car->getKsLjLc() < tcar->XSJL) return;
bool ErrorFlag = false;
for(auto it = all.begin(); it != all.end(); it++)
{
TKM3Item* item = it->second->getExamItem();
if(item->NoID == true)
{
if(item->FinishFlag == false)
{
m_car->KM3EndItem(item->ItemNo);
ErrorFlag = true;
}
}
}
if(!m_car->isMileage()) 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)
{
const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
//必考项目未完成
for(auto it = all.begin(); it != all.end(); it++)
{
@ -4879,15 +4884,7 @@ void Sub3Judge20Comm::Call_Auto_KBTC()
}
}
}
//SysSet[319]:里程不够不报靠边停车0-否 1-是 2-必考项目完成,并且里程满足要求)
//SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
const std::string& s319 = TableSysSet->get319();
const std::string& ksdd = TableSysSet->get211();
if(s319 == "2")
{
const TChuanGan* cg = m_car->historyChuanGan();
if(m_itemvCJH.KbTcJl == -1)
{
m_itemvCJH.KbTcJl = cg->ai_ljjl;
@ -4895,6 +4892,7 @@ void Sub3Judge20Comm::Call_Auto_KBTC()
if(cg->ai_ljjl - m_itemvCJH.KbTcJl >= m_itemvCJH.ZdKbTcJl)
{
//20171008
const std::string& ksdd = TableSysSet->get211();
if(ksdd == siteof::changzhoukm3)
{
if(cg->RTKKM3.BaseLaneCount > 0)
@ -4952,6 +4950,7 @@ void Sub3Judge20Comm::Judge_Extra()
//m_car->createEventEnterItem({item13->ItemNo, ""});
}
/*
//自动触发加减挡位
bool FindSCZB = false;
bool FindMNDG = false;
@ -4990,21 +4989,18 @@ void Sub3Judge20Comm::Judge_Extra()
if((SCZBFinishFlag == true || FindSCZB == false) && (MNDGFinishFlag == true || FindMNDG == false))
{
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw);
TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //20240731
if(item14 && item14->NoID == true) //免考加减挡的
{
if(item14->Item_Color == itemStateWk)
{
//ToDo1:生成 全程加减挡 进项目事件
//item14->Item_Color = itemStateZk;
//item14->TestPro = ItemProFlagInit;
//item14->FinishFlag = false;
m_car->createEventEnterItem({item14->ItemNo, ""});
m_car->KM3EndItem(item14->ItemNo);
}
}
}
*/
m_DiaoTou_ID = 0;
std::string CurrentRoadData = cg->MapPoint_Road_Code;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -75,6 +75,7 @@ struct UserInfo {
@State FaceOpenStatue: string = '0'; //是否开启人脸识别
subscriber;
@State faceCatchImg: string = ''
@State Param803Str:string = ''
// 过程照片拍照
getPhoto = async (empty?: boolean) => {
const singlePlay = globalThis.singlePlay
@ -105,13 +106,11 @@ struct UserInfo {
new WebRTCVoice(this.context);
//初始化数据
this.initData()
//身份证读卡器初始化
// this.openDeviceByIDCard()
// 如果是单机模式则模拟假数据
//获取sysset表数据
this.initSysset()
//心跳处理
this.heartMsg()
this.isExamStart = false
@ -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,18 +550,38 @@ struct UserInfo {
// 检测车门、熄火信号
async checkSignal(): Promise<boolean> {
const {isCheckFireOpen} = judgeConfig
const {Param803Str,isBoardPrePareSetPopupOpen} = this;
if(Param803Str === ''){
return true
}
return new Promise((resolve,reject)=>{
if(isCheckFireOpen){
resolve(true)
// return
return
}
console.info('socketTag[PLC.UdpClient]', '注册udp回调')
let plcValue = globalThis.udpClient.getCurrentMessage();
console.info('surenjun',plcValue)
const msgArr = plcValue.split(',') || ''
const mkg = msgArr[14];
const fdjzs = msgArr[25];
if(mkg == 1){
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:'请关闭车门',
@ -566,6 +589,47 @@ struct UserInfo {
})
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(isBoardPrePareSetPopupOpen){
//请熄火
if(fdjzs*1 > 0){
this.avPlayer.playAudio(['voice/熄火.mp3'])
promptAction.showToast({
@ -574,6 +638,16 @@ struct UserInfo {
})
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))
}
})

View File

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

View File

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

View File

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

View File

@ -35,7 +35,8 @@ import {
plcStrToJson,
plcStrToWXJson,
promptWxCode,
senorToWXDataStr
senorToWXDataStr,
getKmProjectCancelVoice
} from './utils/judgeCommon';
import {
@ -159,7 +160,8 @@ export default class Judge {
// 3.开始考试
let beginExamInfo = isTrajectoryOpen ? {
...JSON.parse(strArr[1]),
replay: 1
replay: 1,
ykxm:judgeConfig.ignoreProjects
} : await getJudgeBeginData()
await fileLog.setExamJudgeData(beginExamInfo)
@ -291,8 +293,9 @@ export default class Judge {
//处理评判过程回调
handleRealExam = async (strData, callBack) => {
let examData: EXAMDATA = JSON.parse(strData);
const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,setRoadAndLane,judgeUI} = this;
const {carzt,xmks,kf,event,xmjs,ksjs,sound,mndg,lane} = examData
const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,avPlayer,judgeUI} = this;
const {carzt,xmks,kf,event,xmjs,xmqx,ksjs,sound,mndg,lane} = examData
const param512 = (judgeUI.judgeConfigObj['512'] || '').split(',');
//获取项目结束、项目开始代码
const xmdm = event == 2 ? xmjs.xmdm : xmks.xmdm
const xmxh = event == 2 ? xmjs.xmxh : xmks.xmxh;
@ -301,7 +304,6 @@ export default class Judge {
switch (event) {
//项目开始
case 1:
console.info(judgeTag,'项目开始开始1')
judgeUI.projectsObj[xmdm].type = '2';
if (isManualProjectIn) {
//手动项目是否在进行中
@ -322,8 +324,9 @@ export default class Judge {
this.xmdm = xmdm;
this.xmxh = xmxh;
this.judgeUI.isProjectIn = true
if(param512[7] != 0){
this.judgeUI.isDeductedPopShow = true
console.info(judgeTag,'项目开始开始2')
}
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,11 +724,7 @@ export default class Judge {
const {xmdm,code,type} = sound;
//判断是不是模拟灯光语音
if (type == 1) {
// console.info(judgeTag, '模拟灯光开始播放:' + code)
}
avPlayer.playAudio([`voice/${code}.mp3`], false, () => {
if (type == 1) {
// console.info(judgeTag, '播放结束:' + code)
examJudgeSoundEnd({
itemno: xmdm, code, type
})
@ -728,13 +734,15 @@ export default class Judge {
code,
type,
})
}
})
}else{
avPlayer.playAudio([`voice/${code}.mp3`])
}
}
// 校验考试是否结束
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)) {
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}`)
if(!singlePlay){
await uploadProgressData();
}
//语音播放扣分项
let score = 0;
@ -923,7 +946,7 @@ export default class Judge {
}
})
} catch (e) {
console.info(judgeTag,JSON.stringify(e))
}
})
@ -1059,8 +1082,12 @@ export default class Judge {
getSbbm = (ksxm, xmxh) => {
const {judgeUI} = this;
const {cdsbInfoObj,projectsObj} = judgeUI;
const {cdsbInfoObj,projectsObj,examSubject} = judgeUI;
const project = projectsObj[ksxm]
//科目三不需要
if(examSubject == 3){
return undefined
}
if (project === undefined) {
return '00000000'
}
@ -1280,6 +1307,7 @@ export default class Judge {
return tempData
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr) => {
const {fileLog,setJudgeItem,setJudgeMark,endExam} = this;
@ -1290,7 +1318,9 @@ export default class Judge {
console.info(judgeTag, '模拟数据考试结束')
globalThis.windowClass.setWindowSystemBarEnable(['navigation'])
clearInterval(judgeTimer)
this.checkExamIsEnd(true)
await examJudgeEndExam()
this.isExamEnd = true
this.isManual = true
return
}
const msg = JSON.parse(strArr[num]);
@ -1310,7 +1340,7 @@ export default class Judge {
}
await examJudgeRealExam(msg)
num++
}, 200)
}, 50)
globalThis.judgeTimer = judgeTimer;
}
// 统计必考项目、所有项目、已考数量
@ -1324,7 +1354,6 @@ export default class Judge {
let allProjectNum = 0, allEndProjectsNum = 0;
Reflect.ownKeys(projectsObj).forEach(projectKey => {
const {type,isRequired} = projectsObj[projectKey];
allProjectNum += 1;
if (type == 3 || type == 4) {
allEndProjectsNum += 1;
@ -1336,8 +1365,9 @@ export default class Judge {
endProjectsNum += 1;
}
}
})
console.info(judgeTag,'必考项目数量:' + projectNum)
console.info(judgeTag,'必考项目已考数量:' + endProjectsNum)
//必考项目除靠边停车是否全部完成
this.judgeUI.isRequiredProjectsEnd = (projectNum - endProjectsNum === 0)
this.judgeUI.isAllProjectsEnd = (allProjectNum - allEndProjectsNum === 0)
@ -1384,6 +1414,7 @@ export default class Judge {
private judgeTask: JudgeTask
private tempData: any
private performInfo: any
private isEndTip:boolean = false;
private ksjs: {
// 累计前进距离
qjjl: number,

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Binary file not shown.