lv_chengmai #55
@ -107,6 +107,7 @@
 | 
			
		||||
 ***  JUDGE_USE_MEMORY      //是否启用内存操作检查
 | 
			
		||||
 ***  JUDGE_USE_POOL        //是否启用内存池调试信息
 | 
			
		||||
 ***  JUDGE_USE_ASSERT      //是否启用断言提示
 | 
			
		||||
 ***  JUDGE_USE_NICE        //是否启用调试测试代码
 | 
			
		||||
 ***  JUDGE_USE_PERF        //是否启用CPU性能分析
 | 
			
		||||
 ***  JUDGE_USE_LEAK        //是否启用内存泄露检测
 | 
			
		||||
 ***  JUDGE_USE_TCMALLOC    //是否启用tcmalloc优化内存使用操作
 | 
			
		||||
@ -119,20 +120,26 @@
 | 
			
		||||
#define JUDGE_USE_LOG
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 是否启用一些调试用的信息,开发用
 | 
			
		||||
 * 是否启用外壳APP侧传入参数严格检查
 | 
			
		||||
 */
 | 
			
		||||
#if defined(JUDGE_OS_OHOS) || defined(JUDGE_OS_ANDROID) || defined(JUDGE_DEBUG__)
 | 
			
		||||
 | 
			
		||||
    #define JUDGE_USE_STRICT    //是否启用外壳APP侧传入参数严格检查
 | 
			
		||||
 | 
			
		||||
    #define JUDGE_USE_STRICT
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define JUDGE_USE_CODE      //是否启用系统在返回错误码的时候输出日志
 | 
			
		||||
/*
 | 
			
		||||
 * 是否启用系统在返回错误码的时候输出日志
 | 
			
		||||
 */
 | 
			
		||||
#define JUDGE_USE_CODE
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 是否启用函数执行耗时检测
 | 
			
		||||
 * 是否启用内存操作检查
 | 
			
		||||
 * 是否启用内存池调试信息
 | 
			
		||||
 */
 | 
			
		||||
#if 0
 | 
			
		||||
    #define JUDGE_USE_COST      //是否启用函数执行耗时检测
 | 
			
		||||
    #define JUDGE_USE_MEMORY    //是否启用内存操作检查
 | 
			
		||||
    #define JUDGE_USE_POOL      //是否启用内存池调试信息
 | 
			
		||||
    #define JUDGE_USE_COST
 | 
			
		||||
    #define JUDGE_USE_MEMORY
 | 
			
		||||
    #define JUDGE_USE_POOL
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
@ -143,6 +150,11 @@
 | 
			
		||||
    #define JUDGE_USE_ASSERT   //是否启用断言提示
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 是否启用测试调试代码
 | 
			
		||||
 */
 | 
			
		||||
#define JUDGE_USE_NICE
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 是否启用CPU性能分析和内存泄露检测
 | 
			
		||||
 * 注意:目前只在linux系统并且在编译测试工程时前提下条件下才能开启
 | 
			
		||||
@ -159,6 +171,7 @@
 | 
			
		||||
    //#define JUDGE_USE_TCMALLOC     //是否启用tcmalloc优化内存使用操作
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 是否启用无锡科研所送检模式
 | 
			
		||||
 * 作者: 杨海洋
 | 
			
		||||
@ -189,12 +202,14 @@
 | 
			
		||||
 * 7.下一次再去无锡所检测,左转弯要用原始的ret2000
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
//#define  JUDGE_USE_INSPECT
 | 
			
		||||
//#define JUDGE_USE_INSPECT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//********************************以上是预编译定义***************************************
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 基础整数类型定义
 | 
			
		||||
 *
 | 
			
		||||
 | 
			
		||||
@ -18,18 +18,19 @@ public:
 | 
			
		||||
    bool load(const TMap_Point_Items& mapPointItem);
 | 
			
		||||
    void unload();
 | 
			
		||||
 | 
			
		||||
    const TMap_Point_Item* findMapPointItem(int ptNo) const
 | 
			
		||||
    const std::vector<const TMap_Point_Item*> findMapPointItem(int ptNo) const
 | 
			
		||||
    {
 | 
			
		||||
        std::vector<const TMap_Point_Item*> items;
 | 
			
		||||
        int ssize = size();
 | 
			
		||||
        for(int i = 0 ; i < ssize; i++)
 | 
			
		||||
        {
 | 
			
		||||
            const TMap_Point_Item* mapPointItem = getMapPointItem(i);
 | 
			
		||||
            if(mapPointItem && mapPointItem->point_no == ptNo)
 | 
			
		||||
            {
 | 
			
		||||
                return mapPointItem;
 | 
			
		||||
                items.push_back(mapPointItem);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return nullptr;
 | 
			
		||||
        return items;
 | 
			
		||||
    }
 | 
			
		||||
    const TMap_Point_Item* getMapPointItem(int idx) const { TASSERT_NULL(idx >= 0 && idx < size(), ""); return &m_mapPointItem[idx]; }
 | 
			
		||||
    const TMap_Point_Items& getMapPointItems() const noexcept { return m_mapPointItem; }
 | 
			
		||||
 | 
			
		||||
@ -3,6 +3,11 @@
 | 
			
		||||
 *
 | 
			
		||||
 *  作者: 杨海洋
 | 
			
		||||
 *  日期: 2024-01-03
 | 
			
		||||
 *
 | 
			
		||||
 ******************************************************************************
 | 
			
		||||
 *  1、免考项目参数设置:systemparm表: NO1=1并且TXT3=1的是免考的,NO2是项目代码
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef SYSPARMTABLE_H
 | 
			
		||||
 | 
			
		||||
@ -147,7 +147,7 @@ class JUDGE_API SysSetTable : public IDBTable
 | 
			
		||||
 | 
			
		||||
    SYSSET_DECLARE(19, type_array, ":");             //夜间考试考试时间
 | 
			
		||||
    SYSSET_DECLARE(211);                             //考试地点参数
 | 
			
		||||
    SYSSET_DECLARE(301, type_array2, "^", ",");      //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ //示例:4,35,3,0,1,^5,50,3,0,1,^
 | 
			
		||||
    SYSSET_DECLARE(301, type_array, "^");            //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^ //示例:4,35,3,0,1,^5,50,3,0,1,^
 | 
			
		||||
    SYSSET_DECLARE(303);                             //行驶距离限制(米)  //3000
 | 
			
		||||
    SYSSET_DECLARE(306);                             //直行键(0-直行,1-加速行驶)	//1
 | 
			
		||||
    SYSSET_DECLARE(307);                             //只考一次的项目 //5,15,16
 | 
			
		||||
 | 
			
		||||
@ -59,6 +59,7 @@ ErrorCode ExamCarSub2::examGoonExam()
 | 
			
		||||
{
 | 
			
		||||
    if(m_stuInfo.ddxk)
 | 
			
		||||
    {
 | 
			
		||||
        m_disForward = m_stuInfo.yklc;
 | 
			
		||||
        for(size_t i = 0; i < m_stuInfo.ykxm.size(); i++)
 | 
			
		||||
        {
 | 
			
		||||
            int itemNo = m_stuInfo.ykxm[i];
 | 
			
		||||
@ -365,7 +366,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem()
 | 
			
		||||
    //必须是前进状态进项目
 | 
			
		||||
    if(historyMoveState() != moveForward)
 | 
			
		||||
    {
 | 
			
		||||
        logdebug("not moveForward move=%d", m_cg->move);
 | 
			
		||||
        //logdebug("not moveForward move=%d", m_cg->move);
 | 
			
		||||
        return nullptr;
 | 
			
		||||
    }
 | 
			
		||||
    for(auto k = m_itemsAll.begin(); k != m_itemsAll.end(); k++)
 | 
			
		||||
@ -389,7 +390,7 @@ ISub2JudgeItem* ExamCarSub2::readEnterItem()
 | 
			
		||||
        if(examItem->isFlagEnd())
 | 
			
		||||
        {
 | 
			
		||||
            //已经考过,略过
 | 
			
		||||
            logdebug("exam already itemNo=%d.", itemEnter->itemNo());
 | 
			
		||||
            //logdebug("exam already itemNo=%d.", itemEnter->itemNo());
 | 
			
		||||
            continue;
 | 
			
		||||
        }
 | 
			
		||||
     #endif
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -49,6 +49,9 @@ public:  //for IExamCarSub3 override
 | 
			
		||||
 | 
			
		||||
    virtual bool isExamAlready(ExamItemCode ItemNo) const override { return m_ctl.PassedItem.find(ItemNo) != m_ctl.PassedItem.end();};
 | 
			
		||||
 | 
			
		||||
    virtual bool isMileage() const override;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    virtual TCar*      getTCar()       override { return &m_car; }
 | 
			
		||||
    virtual TTestCtl*  getTTestCtl()   override { return &m_ctl; }
 | 
			
		||||
 | 
			
		||||
@ -73,6 +76,14 @@ public:  //for IExamCarSub3 override
 | 
			
		||||
    virtual bool       getyjdg_road_code_kf() const override { return m_pub.yjdg_road_code_kf; }
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    void dealOffset(); //行驶距离补偿
 | 
			
		||||
 | 
			
		||||
    void dealItemNoIDEndItem();
 | 
			
		||||
    void dealItemNoIDEnd14Jjdw();
 | 
			
		||||
 | 
			
		||||
    //行驶方向,1正向行驶,-1逆向行驶
 | 
			
		||||
    DriveDirType driveDirection(const TModelLine* lane);
 | 
			
		||||
 | 
			
		||||
    bool Init_KM3_Global(std::string& sError);
 | 
			
		||||
    void UpdateCarParmWithSystemParm();
 | 
			
		||||
    bool Init_KM3_Special();
 | 
			
		||||
@ -160,6 +171,7 @@ private:
 | 
			
		||||
    int E_1Deg2Cm = 0; //经度1度=多少厘米
 | 
			
		||||
    const int N_1Deg2Cm = 11110792; //北纬1度=X cm
 | 
			
		||||
 | 
			
		||||
    bool m_disOffset = false;
 | 
			
		||||
    //TCarStatus m_carStatus;
 | 
			
		||||
 | 
			
		||||
    //int64 m_ContinuedStartTime = 0; //续考的上次开始考试时间  20150205
 | 
			
		||||
 | 
			
		||||
@ -175,6 +175,15 @@ bool ExamSensor::convertDatas(TChuanGan* cg)
 | 
			
		||||
 | 
			
		||||
    TGpsInfo& gps = cg->real.gps;
 | 
			
		||||
    gps.errorFlag = true;
 | 
			
		||||
 | 
			
		||||
    //测试是否逆向行驶
 | 
			
		||||
    //static int s_count = 0;
 | 
			
		||||
    //int ny = s_count++ % 10;
 | 
			
		||||
    //if(ny < 5)
 | 
			
		||||
    //{
 | 
			
		||||
    //    gps.hxj += 180.0;
 | 
			
		||||
    //}
 | 
			
		||||
 | 
			
		||||
    //航向角(默认是按诺瓦泰的数据格式定义的,所以要加上180度) 1:天宝(北云)/C1 2:诺瓦泰
 | 
			
		||||
    if(gps.bklx == boardTypeTB)
 | 
			
		||||
    {
 | 
			
		||||
@ -290,15 +299,16 @@ bool ExamSensor::calcCarBody(TChuanGan* cg)
 | 
			
		||||
        int x = 0, y = 0;
 | 
			
		||||
        GpsMath::calcEastAndNorthDistanceCM(m_basePoint, ps[II(33)], m_basePoint.gc, x, y);
 | 
			
		||||
 | 
			
		||||
        if(cg->real.gps.rtkEnabled)
 | 
			
		||||
        TGpsInfo& gps = cg->real.gps;
 | 
			
		||||
        if(gps.rtkEnabled && gps.jd > 1 && gps.wd > 1)
 | 
			
		||||
        {
 | 
			
		||||
            cg->real.gps.ai_gps = Pointi(x, y);
 | 
			
		||||
            gps.ai_gps = Pointi(x, y);
 | 
			
		||||
        }
 | 
			
		||||
        else
 | 
			
		||||
        {
 | 
			
		||||
            if(m_car->historyCount() > 0)
 | 
			
		||||
            {
 | 
			
		||||
                cg->real.gps.ai_gps = m_car->historyAiGps();  //20240702 yhy
 | 
			
		||||
                gps.ai_gps = m_car->historyAiGps();  //20240702 yhy
 | 
			
		||||
                //return false; //这里不能返回false 第一帧数据就是非差分状态?如果做模拟灯光的时候一直没差分进不了项目了
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,8 @@ int ExamService::examJudgeInit(const char* data, int len)
 | 
			
		||||
    //logdebug("MemorySpace [spaceTotal=%lld MB] [spaceFree=%lld MB], [spaceAvailable=%lld MB], [spaceSelf=%lld MB]",
 | 
			
		||||
    //         space.spaceTotal, space.spaceFree, space.spaceAvailable, space.spaceSelf);
 | 
			
		||||
 | 
			
		||||
    logdebug("call examJudgeInit.");
 | 
			
		||||
    //logdebug("call examJudgeInit.");
 | 
			
		||||
    logtrace("exam-init version=%s.", JUDGE_VERSION_INFO);
 | 
			
		||||
    if(m_init)
 | 
			
		||||
    {
 | 
			
		||||
        //已经初始化过了,不能重复初始化
 | 
			
		||||
@ -105,7 +106,7 @@ int ExamService::examJudgeInit(const char* data, int len)
 | 
			
		||||
        return QE(code);
 | 
			
		||||
    }
 | 
			
		||||
    m_init = true;
 | 
			
		||||
    loginfo("exam-init success version=%s.", JUDGE_VERSION_INFO);
 | 
			
		||||
    logtrace("exam-init success kchp=%s,kchm=%d,kscx=%s.", m_initInfo->kchp.c_str(), m_initInfo->kchm, m_initInfo->kscx.c_str());
 | 
			
		||||
    return QE(codeSuccess);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -43,6 +43,7 @@ int IExamCar::examJudgeBeginExam(const char* data, int len)
 | 
			
		||||
{
 | 
			
		||||
    HELP_COST_TIME("");
 | 
			
		||||
    IAutoLock(m_mtx);
 | 
			
		||||
    logtrace("begin-exam version=%s", JUDGE_VERSION_INFO);
 | 
			
		||||
    if(m_examState != examStateEnd)
 | 
			
		||||
    {
 | 
			
		||||
        logerror("error begin exam not end.");
 | 
			
		||||
@ -489,17 +490,17 @@ void IExamCar::doExamDatagram(Package* pkg)
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void IExamCar::calcDistance()
 | 
			
		||||
int IExamCar::calcDistance()
 | 
			
		||||
{
 | 
			
		||||
    if(m_history->size() <= 1)
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    const Pointi& h = historyAiGps(1);
 | 
			
		||||
    const Pointi& c = historyAiGps();
 | 
			
		||||
    if( (c.x == 0 && c.y == 0) || (h.x == 0 && h.y == 0) )
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
        return 0;
 | 
			
		||||
    }
 | 
			
		||||
    double x = h.x - c.x;
 | 
			
		||||
    double y = h.y - c.y;
 | 
			
		||||
@ -517,11 +518,12 @@ void IExamCar::calcDistance()
 | 
			
		||||
 | 
			
		||||
    if(m_cg->move == moveForward)
 | 
			
		||||
    {
 | 
			
		||||
        int gear = m_cg->real.sensor.dw;
 | 
			
		||||
        int gear = m_cg->real.sensor.dw; //只有科三用到
 | 
			
		||||
        m_disGears[gear] += a;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //logdebug("move=%d,dis=%dCM", state, a);
 | 
			
		||||
    return a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64 IExamCar::GetCurrentTime2() const
 | 
			
		||||
 | 
			
		||||
@ -127,7 +127,7 @@ public:
 | 
			
		||||
    //执行处理每一帧的GPS传感数据
 | 
			
		||||
    virtual void doExamDatagram(Package* pkg);
 | 
			
		||||
    //前进 后退 距离计算
 | 
			
		||||
    virtual void calcDistance();
 | 
			
		||||
    virtual int calcDistance();
 | 
			
		||||
 | 
			
		||||
    //当前系统时间(回放取的事GPS时间)
 | 
			
		||||
    virtual int64 GetCurrentTime2() const;
 | 
			
		||||
@ -219,6 +219,8 @@ public:
 | 
			
		||||
    virtual bool itemsSomeExaming2(ExamItemCode itemno) const = 0;
 | 
			
		||||
    //是否已考
 | 
			
		||||
    virtual bool isExamAlready(ExamItemCode ItemNo) const = 0;
 | 
			
		||||
    //里程是否满足
 | 
			
		||||
    virtual bool isMileage() const = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //获取TCar
 | 
			
		||||
 | 
			
		||||
@ -70,7 +70,7 @@ private:
 | 
			
		||||
    const int m_channel = 4;
 | 
			
		||||
    const unsigned char m_default = 255; //默认底色 白色
 | 
			
		||||
    bool m_showVersion = true;
 | 
			
		||||
    bool m_showTime = false;
 | 
			
		||||
    bool m_showTime = true;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -373,6 +373,8 @@ struct TSub3Item08Gjzt  //公交站台  8
 | 
			
		||||
    bool  Must_JianSu_Flag = false; //必须减速标志
 | 
			
		||||
    bool  EndXMJL_Flag     = false; //结束项目距离标志
 | 
			
		||||
    int   WavKind          = 0; //SysSet[512]-->3 学校、公交、人行横道模拟项目是否语音标识,0:不需要 1:需要  2024-03-18 yhy 增加
 | 
			
		||||
 | 
			
		||||
    int   s509_10          = 0;
 | 
			
		||||
#ifdef JUDGE_USE_INSPECT
 | 
			
		||||
    bool  inspectJSC       = false; //完成脚刹车动作
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -33,6 +33,40 @@ void Sub2Judge00Dcrk::dealDrawItem()
 | 
			
		||||
    drawGpsSign(m_model->F8(), "F8", false);
 | 
			
		||||
    drawGpsSign(m_model->F9(), "F9", false);
 | 
			
		||||
 | 
			
		||||
#ifdef JUDGE_USE_NICE
 | 
			
		||||
 | 
			
		||||
    if(pureCarPointInItemArea(II(33)))
 | 
			
		||||
    {
 | 
			
		||||
        TChuanGan* cg = m_car->historyChuanGan();
 | 
			
		||||
        nice(cg->body.b1_a, cg->body.b2_a, RGB_RED);
 | 
			
		||||
        nice(cg->body.points_a[II(8)], cg->body.points_a[II(18)], RGB_RED);
 | 
			
		||||
 | 
			
		||||
        TGPSPoint z1 = GpsMath::GetChuiZhu(cg->body.b1_a, cg->body.points_a[II(6)], cg->body.points_a[II(8)]);
 | 
			
		||||
        nice(cg->body.b1_a, z1, RGB_PURPLE);
 | 
			
		||||
 | 
			
		||||
        TGPSPoint z2 = GpsMath::GetChuiZhu(cg->body.points_a[II(25)], m_model->P3(),m_model->P4());
 | 
			
		||||
        nice(cg->body.points_a[II(25)], z2, RGB_RED);
 | 
			
		||||
 | 
			
		||||
        TGPSPoint z3 = GpsMath::GetChuiZhu(cg->body.points_a[II(27)], m_model->P3(),m_model->P4());
 | 
			
		||||
        nice(cg->body.points_a[II(27)], z3, RGB_RED);
 | 
			
		||||
 | 
			
		||||
        nice(cg->body.points_a[II(1)], cg->body.points_a[II(13)], RGB_GREEN);
 | 
			
		||||
        TGPSPoint z4 = GpsMath::GetChuiZhu(cg->body.points_a[II(13)], m_model->P4(), m_model->P5());
 | 
			
		||||
        nice(cg->body.points_a[II(13)], z4, RGB_RED);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Sub2Judge00Dcrk::nice(const TGPSPoint& p1, const TGPSPoint& p2, const RgbColor& color)
 | 
			
		||||
{
 | 
			
		||||
    int cm = GpsMath::calcGpsDistanceCM(p1,p2);
 | 
			
		||||
    TGPSPoint c = GpsMath::calcCenterPoint(p1,p2);
 | 
			
		||||
    char buf[32] = {0};
 | 
			
		||||
    SafeSprintf(buf, sizeof(buf), "%dcm", cm);
 | 
			
		||||
    drawGpsLine(p1, p2, false, color, 16);
 | 
			
		||||
    drawGpsText(c, buf, color, 16);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Sub2Judge00Dcrk::dealJudgeItem()
 | 
			
		||||
 | 
			
		||||
@ -38,6 +38,8 @@ private:
 | 
			
		||||
    //判断考试用时是否超时
 | 
			
		||||
    bool examTimeout();
 | 
			
		||||
 | 
			
		||||
    void nice(const TGPSPoint& p1, const TGPSPoint& p2, const RgbColor& color);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    enum{L1=1, L2, L3, L4, L5, L6, L7, L8, L9, L10, L11};
 | 
			
		||||
    int64 m_dcrkTime          = 0;      //开始时间(从倒库开始计时)
 | 
			
		||||
 | 
			
		||||
@ -38,7 +38,7 @@ bool Sub3Judge01Sczb::dealJudgeEnter()
 | 
			
		||||
    const std::vector<std::string>& s512 = TableSysSet->asArray512();
 | 
			
		||||
    std::string Temp512_9 = s512.size() > 8 && s512[8] != "" ? s512[8].c_str() : "";
 | 
			
		||||
 | 
			
		||||
    const std::vector<std::string>& s512_9 = Tools::split(Temp512_9, "^");
 | 
			
		||||
    const std::vector<std::string> s512_9 = Tools::split(Temp512_9, "^");
 | 
			
		||||
    m_itemv.newtype     = s512_9.size() > 0 && s512_9[0] != "" ? std::atoi(s512_9[0].c_str()) : 0;
 | 
			
		||||
    m_itemv.time_tishi  = s512_9.size() > 1 && s512_9[1] != "" ? std::atoi(s512_9[1].c_str()) : 0;
 | 
			
		||||
    m_itemv.time_raoche = s512_9.size() > 2 && s512_9[2] != "" ? std::atoi(s512_9[2].c_str()) : 0;
 | 
			
		||||
@ -495,6 +495,18 @@ void Sub3Judge01Sczb::AddCSBData(CsbType csb)
 | 
			
		||||
    if(m_csb.empty())
 | 
			
		||||
    {
 | 
			
		||||
        m_csb.push_back(csb);
 | 
			
		||||
 | 
			
		||||
        std::string sou;
 | 
			
		||||
        switch(csb)
 | 
			
		||||
        {
 | 
			
		||||
        case CsbType::ZQ: sou = sound::sub3_401001; break;
 | 
			
		||||
        case CsbType::ZH: sou = sound::sub3_401002; break;
 | 
			
		||||
        case CsbType::YH: sou = sound::sub3_401003; break;
 | 
			
		||||
        case CsbType::YQ: sou = sound::sub3_401004; break;
 | 
			
		||||
        default: break;
 | 
			
		||||
        }
 | 
			
		||||
        //ToDo:语音提示,
 | 
			
		||||
        m_car->createEventSound({itemNo(), sou});
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ bool Sub3Judge02Qbxx::dealJudgeEnter()
 | 
			
		||||
    //10s内未起步只评判第一次^第一次起步以打左方向灯开始计时^
 | 
			
		||||
    const std::vector<std::string>& s502 = TableSysSet->asArray502();
 | 
			
		||||
    std::string str = s502.size() > 7 ? s502[7] : "";
 | 
			
		||||
    const std::vector<std::string>& ss = Tools::split(str, "^");
 | 
			
		||||
    const std::vector<std::string> ss = Tools::split(str, "^");
 | 
			
		||||
    m_itemv.sys502_8_1 = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0;
 | 
			
		||||
    m_itemv.sys502_8_2 = ss.size() > 1 && ss[1] != "" ? std::atoi(ss[1].c_str()) : 0; //StrToIntDef(GetDotStr(2, tempstr + '^', '^'), 0);
 | 
			
		||||
 | 
			
		||||
@ -219,10 +219,10 @@ void Sub3Judge02Qbxx::nogo_timeout()
 | 
			
		||||
    {
 | 
			
		||||
        const TSensorInfo& sor2 = m_car->historySensor(2);
 | 
			
		||||
 | 
			
		||||
        if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9) ||
 | 
			
		||||
        if((sor.dw != 0 && sor1.dw != 0 && sor.dw != sor2.dw && sor.dw >= 1 && sor.dw != 9 && sor.dw != 10) ||
 | 
			
		||||
                (sor.ssc == SNOT && sor1.ssc == SYES))
 | 
			
		||||
        {
 | 
			
		||||
            if(sor.dw >= 1 && sor.dw != 9 && sor.ssc == SNOT)
 | 
			
		||||
            if(sor.dw >= 1 && sor.dw != 9 && sor.dw != 10 && sor.ssc == SNOT)
 | 
			
		||||
            {
 | 
			
		||||
                m_itemv.ZhunBeiQiBuTK = cg->tkCnt;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -390,10 +390,10 @@ void Sub3Judge03Zxxs::dealJudgeItem()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    char buf[256] = {0};
 | 
			
		||||
    SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d,项目距离=%d,已行驶=%d,角度变化=%0.2f"),
 | 
			
		||||
    SafeSprintf(buf, sizeof(buf), XCharacter("%s-->St:%d,边线参考距离=%d,缓冲距离=%d,距离偏差=%d-%d,项目距离=%d,已行驶=%d,角度变化=%0.2f"),
 | 
			
		||||
                m_itemv.Kind == 0 ? "右边线" : "左边线",
 | 
			
		||||
                Temp_Gps_Itemno1,
 | 
			
		||||
                m_itemv.Init_D,m_itemv.parm_hcjl,
 | 
			
		||||
                m_itemv.Init_D,m_itemv.parm_hcjl,m_itemv.Gps_Offset,
 | 
			
		||||
                (int)std::abs(m_itemv.Kind == 0 ? RightJL0 - m_itemv.Init_D : LeftJL0 - m_itemv.Init_D),
 | 
			
		||||
                m_itemv.parm_xmjl,cg->ai_ljjl - m_itemv.Init_LJJL,Jdbh
 | 
			
		||||
                );
 | 
			
		||||
 | 
			
		||||
@ -37,13 +37,15 @@ bool Sub3Judge08Gjzt::dealJudgeEnter()
 | 
			
		||||
    {
 | 
			
		||||
        m_itemv.Temp_XS = 30;
 | 
			
		||||
    }
 | 
			
		||||
    //是否评判脚刹车
 | 
			
		||||
    //是否评判脚刹车 1速度+刹车同时满足 其他只判刹车
 | 
			
		||||
    m_itemv.Judge_JSC = s509.size() > 5 && s509[5] != "" ? std::atoi(s509[5].c_str()) == 1 : false;
 | 
			
		||||
    //是否必须减速
 | 
			
		||||
    m_itemv.Must_JianSu_Flag = s509.size() > 7 && s509[7] != "" ? std::atoi(s509[7].c_str()) == 1 : false;
 | 
			
		||||
    //默认:需要评判减速相关的
 | 
			
		||||
    m_itemv.JudgeKind = 1;
 | 
			
		||||
 | 
			
		||||
    m_itemv.s509_10 = s509.size() > 9 && s509[9] != "" ? std::atoi(s509[9].c_str()) : 0;
 | 
			
		||||
 | 
			
		||||
    if(ksdd == siteof::nj || ksdd == siteof::njdckm3)
 | 
			
		||||
    {
 | 
			
		||||
        //ToDo:语音播报-->通过公交站台
 | 
			
		||||
@ -118,7 +120,7 @@ void Sub3Judge08Gjzt::dealJudgeItem()
 | 
			
		||||
            //SysSet[342]:车上是否能进行人工操作(0-能扣分和进项目 1-不能人工评判 2-可以人工评判  3-都不能)
 | 
			
		||||
            //如果是人工扣分或者人工评判的,自动评判就不触发 需要评判减速相关的
 | 
			
		||||
            const std::string& s342 = TableSysSet->get342();
 | 
			
		||||
            if(s342 == "0" || s342 == "2")
 | 
			
		||||
            if(s342 == "0" || s342 == "2" || m_itemv.s509_10 == 1)
 | 
			
		||||
            {
 | 
			
		||||
                m_itemv.JudgeKind = 0; //科研所规定,公交站台当前车辆的车道号在3车道及以上的,不需要评判减速相关的
 | 
			
		||||
            }
 | 
			
		||||
@ -209,9 +211,11 @@ void Sub3Judge08Gjzt::dealJudgeItem()
 | 
			
		||||
            JUDGE_MARK_SUB3(8, "03", true);
 | 
			
		||||
        }
 | 
			
		||||
        TTestCtl* ctl = m_car->getTTestCtl();
 | 
			
		||||
 | 
			
		||||
        //新的减速规则
 | 
			
		||||
        if(ctl->JianSuLeiXing == 2)
 | 
			
		||||
        {
 | 
			
		||||
            //500-13为2,按科研所规则判断是否减速
 | 
			
		||||
            if(m_itemv.JudgeKind == 1)  //需要评判减速相关的
 | 
			
		||||
            {
 | 
			
		||||
            #ifdef JUDGE_USE_INSPECT
 | 
			
		||||
@ -251,6 +255,7 @@ void Sub3Judge08Gjzt::dealJudgeItem()
 | 
			
		||||
                    {
 | 
			
		||||
                        if(m_itemv.Judge_JSC == true)
 | 
			
		||||
                        {
 | 
			
		||||
                            // 509-6为1,同时满足刹车和速度小于阈值(509-5);
 | 
			
		||||
                            if(m_itemv.Finish_JSC == false || m_itemv.Finish_JianSu == false)
 | 
			
		||||
                            {
 | 
			
		||||
                                JUDGE_MARK_SUB3(8, "02", false);
 | 
			
		||||
@ -258,9 +263,21 @@ void Sub3Judge08Gjzt::dealJudgeItem()
 | 
			
		||||
                        }
 | 
			
		||||
                        else
 | 
			
		||||
                        {
 | 
			
		||||
                            if(m_itemv.Finish_JianSu == false)
 | 
			
		||||
                            if(ctl->JianSuLeiXing == 1)
 | 
			
		||||
                            {
 | 
			
		||||
                                JUDGE_MARK_SUB3(8, "02", false);
 | 
			
		||||
                                //500-13为1,刹车和速度小于阈值,满足其中一个就不扣分;
 | 
			
		||||
                                if(m_itemv.Finish_JSC == false && m_itemv.Finish_JianSu == false)
 | 
			
		||||
                                {
 | 
			
		||||
                                    JUDGE_MARK_SUB3(8, "02", false);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            else
 | 
			
		||||
                            {
 | 
			
		||||
                                //5、无上述参数,只判断刹车
 | 
			
		||||
                                if(m_itemv.Finish_JSC == false)
 | 
			
		||||
                                {
 | 
			
		||||
                                    JUDGE_MARK_SUB3(8, "02", false);
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
@ -68,6 +68,13 @@
 | 
			
		||||
 *
 | 
			
		||||
 *        快进到1840帧,然后步进跟踪项目。
 | 
			
		||||
 *
 | 
			
		||||
 * 公交判断规则:
 | 
			
		||||
 *  1、509-8不为1 and 当前车道大于2,and (342参数为0,或为2,509-10为1):不扣分
 | 
			
		||||
 *  2、500-13为2,按科研所规则判断是否减速;
 | 
			
		||||
 *  3、509-6为1,同时满足刹车和速度小于阈值(509-5);
 | 
			
		||||
 *  4、500-13为1,刹车和速度小于阈值,满足其中一个就不扣分;
 | 
			
		||||
 *  5、无上述参数,只判断刹车
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef SUB3JUDGE08GJZT_H
 | 
			
		||||
 | 
			
		||||
@ -375,7 +375,7 @@ void Sub3Judge10Ccxx::dealJudgeItem()
 | 
			
		||||
                m_car->setChaoChe_Start_TM(0);
 | 
			
		||||
                //ToDo:语音播报:取消变更车道或者取消超车
 | 
			
		||||
                m_car->createEventCancelItem({m_exam->ItemNo, ""});
 | 
			
		||||
                m_car->createEventSound({itemNo(), sound::sub3_414004});
 | 
			
		||||
                //m_car->createEventSound({itemNo(), sound::sub3_414004});
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@ -396,7 +396,7 @@ void Sub3Judge10Ccxx::dealJudgeItem()
 | 
			
		||||
                m_car->setChaoChe_Start_TM(0);
 | 
			
		||||
                //ToDo:语音播报:取消变更车道或者取消超车
 | 
			
		||||
                m_car->createEventCancelItem({m_exam->ItemNo, ""});
 | 
			
		||||
                m_car->createEventSound({itemNo(), sound::sub3_414004});
 | 
			
		||||
                //m_car->createEventSound({itemNo(), sound::sub3_414004});
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
 | 
			
		||||
@ -712,8 +712,8 @@ void Sub3Judge11Kbtc::DoStatus_3()
 | 
			
		||||
        //特殊地点业务翻译
 | 
			
		||||
        TTestCtl* ctl = m_car->getTTestCtl();
 | 
			
		||||
 | 
			
		||||
        const std::vector<std::vector<std::string>>& s301 = TableSysSet->asArray2_301();
 | 
			
		||||
        const std::vector<std::string>& s301_1 = s301.size() > 0 ? s301[0] : std::vector<std::string>();
 | 
			
		||||
        const std::vector<std::string>& s301 = TableSysSet->asArray301();
 | 
			
		||||
        const std::vector<std::string> s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector<std::string>();
 | 
			
		||||
        const std::string s301_1_3 = s301_1.size() > 3 && s301_1[3] != "" ? s301_1[3] : "";
 | 
			
		||||
        if(!ctl->Dw_Cs_Ok1 && s301_1_3 != "0" && ctl->dw_kf_sj == 0 && ksdd == siteof::zjwz)
 | 
			
		||||
        {
 | 
			
		||||
@ -1295,24 +1295,24 @@ void Sub3Judge11Kbtc::Judge_KBTC_YaXian()
 | 
			
		||||
    const std::string& s411 = TableSysSet->get411();
 | 
			
		||||
    if(s411 != "1")
 | 
			
		||||
    {
 | 
			
		||||
        RightJL0_RF = RTKKM3_0.Body_RF_ToRightEdge;
 | 
			
		||||
        RightJL1_RF = RTKKM3_1.Body_RF_ToRightEdge;
 | 
			
		||||
        RightJL2_RF = RTKKM3_2.Body_RF_ToRightEdge;
 | 
			
		||||
        RightJL0_RF = RTKKM3_0.Body_RF_ToBaseLine;
 | 
			
		||||
        RightJL1_RF = RTKKM3_1.Body_RF_ToBaseLine;
 | 
			
		||||
        RightJL2_RF = RTKKM3_2.Body_RF_ToBaseLine;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        RightJL0_RB = RTKKM3_0.Body_RB_ToRightEdge;
 | 
			
		||||
        RightJL1_RB = RTKKM3_1.Body_RB_ToRightEdge;
 | 
			
		||||
        RightJL2_RB = RTKKM3_2.Body_RB_ToRightEdge;
 | 
			
		||||
        RightJL0_RB = RTKKM3_0.Body_RB_ToBaseLine;
 | 
			
		||||
        RightJL1_RB = RTKKM3_1.Body_RB_ToBaseLine;
 | 
			
		||||
        RightJL2_RB = RTKKM3_2.Body_RB_ToBaseLine;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        RightJL0_RF = RTKKM3_0.Wheel_RF_ToRightEdge;
 | 
			
		||||
        RightJL1_RF = RTKKM3_1.Wheel_RF_ToRightEdge;
 | 
			
		||||
        RightJL2_RF = RTKKM3_2.Wheel_RF_ToRightEdge;
 | 
			
		||||
        RightJL0_RF = RTKKM3_0.Wheel_RF_ToBaseLine;
 | 
			
		||||
        RightJL1_RF = RTKKM3_1.Wheel_RF_ToBaseLine;
 | 
			
		||||
        RightJL2_RF = RTKKM3_2.Wheel_RF_ToBaseLine;
 | 
			
		||||
 | 
			
		||||
        RightJL0_RB = RTKKM3_0.Wheel_RB_ToRightEdge;
 | 
			
		||||
        RightJL1_RB = RTKKM3_1.Wheel_RB_ToRightEdge;
 | 
			
		||||
        RightJL2_RB = RTKKM3_2.Wheel_RB_ToRightEdge;
 | 
			
		||||
        RightJL0_RB = RTKKM3_0.Wheel_RB_ToBaseLine;
 | 
			
		||||
        RightJL1_RB = RTKKM3_1.Wheel_RB_ToBaseLine;
 | 
			
		||||
        RightJL2_RB = RTKKM3_2.Wheel_RB_ToBaseLine;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //ZXD_JL0 := (RightJL0_RF + RightJL0_RB) div 2;
 | 
			
		||||
 | 
			
		||||
@ -256,7 +256,7 @@ void Sub3Judge14Jjdw::CSH_Itmv14()
 | 
			
		||||
                std::string str2 = Str.size() > 1 ? Str[1] : "";  //GetDotStr(2, Str + ':', ':');
 | 
			
		||||
 | 
			
		||||
                int dw = std::atoi(str1.c_str());
 | 
			
		||||
                const std::vector<std::string>& stmp = Tools::split(str2, "-");
 | 
			
		||||
                const std::vector<std::string> stmp = Tools::split(str2, "-");
 | 
			
		||||
                m_itemv.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
 | 
			
		||||
                m_itemv.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -159,22 +159,21 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
    //自动靠边停车参数
 | 
			
		||||
    //SysSet[319]:里程不够不报靠边停车(0-否 1-是 2-必考项目完成,并且里程满足要求)
 | 
			
		||||
    //SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
 | 
			
		||||
 | 
			
		||||
    const std::string& s319 = TableSysSet->get319();
 | 
			
		||||
    if(s319 == "2")
 | 
			
		||||
    {
 | 
			
		||||
        const std::vector<std::string>& s415 = TableSysSet->asArray415();
 | 
			
		||||
        m_itemvCJH.bZdKbTc = s415.size() > 0 && s415[0] == "1";  //getdotstr(1, sysset[415] + '^', '^') = '1');
 | 
			
		||||
        m_itemvCJH.ZdKbTcJl = s415.size() > 1 && s415[1] != "" ? std::atoi(s415[1].c_str()) : 1;    //strtointdef(getdotstr(2, sysset[415] + '^', '^'), 1);
 | 
			
		||||
        m_itemvCJH.ZdKbTcJl = s415.size() > 1 && s415[1] != "" ? std::atoi(s415[1].c_str()) : 1;  //strtointdef(getdotstr(2, sysset[415] + '^', '^'), 1);
 | 
			
		||||
        m_itemvCJH.KbTcJl = -1;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        m_itemvCJH.bZdKbTc = false;
 | 
			
		||||
        m_itemvCJH.ZdKbTcJl = 1;
 | 
			
		||||
        m_itemvCJH.KbTcJl = -1;
 | 
			
		||||
    }
 | 
			
		||||
    //溜车变量初始化
 | 
			
		||||
 | 
			
		||||
    //SysSet[529]:模拟灯光是否需要人脸验证
 | 
			
		||||
    //说明:这个参数目前我没有实际的用到
 | 
			
		||||
    m_sfyz_state = 0;
 | 
			
		||||
@ -213,7 +212,7 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
                    if(str2 == "") continue;
 | 
			
		||||
 | 
			
		||||
                    int dw = std::atoi(str1.c_str());
 | 
			
		||||
                    const std::vector<std::string>& stmp = Tools::split(str2, "-");
 | 
			
		||||
                    const std::vector<std::string> stmp = Tools::split(str2, "-");
 | 
			
		||||
                    itemv14->DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
 | 
			
		||||
                    itemv14->DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 100;
 | 
			
		||||
                }
 | 
			
		||||
@ -243,7 +242,7 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
    //评判半联动用的,比如:前进状态下,离合器连续30秒
 | 
			
		||||
    const std::vector<std::string>& s500 = TableSysSet->asArray500();
 | 
			
		||||
    std::string s500_1 = s500.size() > 0 ? s500[0] : "";
 | 
			
		||||
    const std::vector<std::string>& ss500_1 = Tools::split(s500_1, "^");
 | 
			
		||||
    const std::vector<std::string> ss500_1 = Tools::split(s500_1, "^");
 | 
			
		||||
    m_itemvCJH.lhqxs = ss500_1.size() > 0 && ss500_1[0] != "" ? std::atoi(ss500_1[0].c_str()) : 30;
 | 
			
		||||
 | 
			
		||||
    //离合器距离
 | 
			
		||||
@ -260,14 +259,14 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
    m_itemvCJH.DWKF_SJ = (s500.size() > 3 && s500[3] != "" ? std::atoi(s500[3].c_str()) : 20) * SECOND;
 | 
			
		||||
    //加速发动机转速阀值^加速发动机变化倍数^
 | 
			
		||||
    std::string Str = s500.size() > 4 && s500[4] != "" ? s500[4] : "";
 | 
			
		||||
    const std::vector<std::string>& s500_4 = Tools::split(Str, "^");
 | 
			
		||||
    const std::vector<std::string> s500_4 = Tools::split(Str, "^");
 | 
			
		||||
    m_itemvCJH.KongYouMen_FDJ_YZ = s500_4.size() > 0 && s500_4[0] != "" ? std::atoi(s500_4[0].c_str()) : 3000;
 | 
			
		||||
    //变化倍数
 | 
			
		||||
    m_itemvCJH.KonbYouMen_FDJ_BS = s500_4.size() > 1 && s500_4[1] != "" ? std::atoi(s500_4[1].c_str()) : 3;
 | 
			
		||||
 | 
			
		||||
    //转向灯不关闭距离^项目结束后不关闭时间
 | 
			
		||||
    Str = s500.size() > 5 && s500[5] != "" ? s500[5] : "";
 | 
			
		||||
    const std::vector<std::string>& s500_5 = Tools::split(Str, "^");
 | 
			
		||||
    const std::vector<std::string> s500_5 = Tools::split(Str, "^");
 | 
			
		||||
 | 
			
		||||
    m_itemvCJH.ZXD_BGB_JL = s500_5.size() > 0 && s500_5[0] != "" ? std::atoi(s500_5[0].c_str()) : 3000;
 | 
			
		||||
    m_itemvCJH.ZXD_BGB_SJ = s500_5.size() > 1 && s500_5[1] != "" ? std::atoi(s500_5[1].c_str()) : 0;
 | 
			
		||||
@ -341,8 +340,8 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
    //条件1:档位,车速,持续时间,结束标志(0-不结束,1红闪,2黑闪),距离,^
 | 
			
		||||
    //条件2:档位,车速,持续时间,0,距离,^评判时间(0-最后评判,1-里程达到就评判)^
 | 
			
		||||
 | 
			
		||||
    const std::vector<std::vector<std::string>>& s301 = TableSysSet->asArray2_301();
 | 
			
		||||
    const std::vector<std::string>& s301_1 = s301.size() > 0 ? s301[0] : std::vector<std::string>();
 | 
			
		||||
    const std::vector<std::string>& s301 = TableSysSet->asArray301();
 | 
			
		||||
    const std::vector<std::string> s301_1 = s301.size() > 0 ? Tools::split(s301[0], ",") : std::vector<std::string>();
 | 
			
		||||
    if(!s301_1.empty())
 | 
			
		||||
    {
 | 
			
		||||
        m_itemvCJH.dw_cs_dw1 = s301_1.size() > 0 && s301_1[0] != "" ? std::atoi(s301_1[0].c_str()) : 1;
 | 
			
		||||
@ -358,7 +357,7 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
        m_itemvCJH.dw_cs_sl1 = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const std::vector<std::string>& s301_2 = s301.size() > 1 ? s301[1] : std::vector<std::string>();
 | 
			
		||||
    const std::vector<std::string>& s301_2 = s301.size() > 1 ? Tools::split(s301[1], ",") : std::vector<std::string>();
 | 
			
		||||
    if(!s301_2.empty())
 | 
			
		||||
    {
 | 
			
		||||
        m_itemvCJH.dw_cs_dw2 = s301_2.size() > 0 && s301_2[0] != "" ? std::atoi(s301_2[0].c_str()) : 1;
 | 
			
		||||
@ -375,9 +374,9 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
        m_itemvCJH.dw_cs_sl2 = 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<std::string> s301_3 = s301.size() > 2 ? s301[2] : std::vector<std::string>();
 | 
			
		||||
    std::string s301_3 = s301.size() > 2 ? s301[2] : "";
 | 
			
		||||
    //301评判时间,0-结束考试时评判,1-里程达标就评判 100-表示已评判过    20140630 //yhyflag
 | 
			
		||||
    ctl->dw_kf_sj =  s301_3.size() > 0 && s301_3[0] != "" ? std::atoi(s301_3[0].c_str()) : 1; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
 | 
			
		||||
    ctl->dw_kf_sj = s301_3 != "" ? std::atoi(s301_3.c_str()) : 0; // StrToIntdef(GetDotStr(3, Sysset[301] + '^', '^'), 1);
 | 
			
		||||
 | 
			
		||||
    //SysSet[530]:环境感知相关参数(原封不动翻译即可,前期用不到,赞不考虑)
 | 
			
		||||
    const std::vector<std::string>& s530 = TableSysSet->asArray530();
 | 
			
		||||
@ -385,7 +384,7 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
    m_itemvCJH.sslkfxp_sj = s530.size() > 0 && s530[0] != "" ? std::atoi(s530[0].c_str()) : 15; //StrToIntdef(GetDotStr(1, Sysset[530] + '^', '^'), 15);
 | 
			
		||||
    //单手离开方向盘时间秒,右边距离偏差cm
 | 
			
		||||
    const std::string& ss530 = s530.size() > 1 && s530[1] != "" ? s530[1] : "";
 | 
			
		||||
    const std::vector<std::string>& s530_2 = Tools::split(ss530, ",");
 | 
			
		||||
    const std::vector<std::string> s530_2 = Tools::split(ss530, ",");
 | 
			
		||||
 | 
			
		||||
    m_itemvCJH.dslkfxp_sj =  s530_2.size() > 0 && s530_2[0] != "" ? std::atoi(s530_2[0].c_str()) : 60;
 | 
			
		||||
    m_itemvCJH.dslkfxp_jlpc = s530_2.size() > 1 && s530_2[1] != "" ? std::atoi(s530_2[1].c_str()) : 30;
 | 
			
		||||
@ -567,7 +566,7 @@ void Sub3Judge20Comm::Init_ZongHe()
 | 
			
		||||
            std::string str2 = s394i.size() > 1 ? s394i[1] : "";  //GetDotStr(2, Str + ':', ':');
 | 
			
		||||
 | 
			
		||||
            int dw = std::atoi(str1.c_str());
 | 
			
		||||
            const std::vector<std::string>& stmp = Tools::split(str2, "-");
 | 
			
		||||
            const std::vector<std::string> stmp = Tools::split(str2, "-");
 | 
			
		||||
            m_itemvCJH.DwCs_Range[dw].Low_Cs = stmp.size() > 0 ? std::atoi(stmp[0].c_str()) : 0;
 | 
			
		||||
            m_itemvCJH.DwCs_Range[dw].High_Cs = stmp.size() > 1 ? std::atoi(stmp[1].c_str()) : 0;
 | 
			
		||||
        }
 | 
			
		||||
@ -756,10 +755,15 @@ void Sub3Judge20Comm::CallMoNiDengGuang()
 | 
			
		||||
    return;  //屏蔽模拟灯光
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
 | 
			
		||||
    if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg)
 | 
			
		||||
    const std::string& s386 = TableSysSet->get386();
 | 
			
		||||
    //模拟灯光:参数386=0,开始考试后,就触发模拟灯光
 | 
			
		||||
    if(s386 != "0")
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
        TKM3Item* item01 = m_car->findExamItem(Sub3ItemType01Sczb); //上车准备
 | 
			
		||||
        if(item01 && item01->Item_Color != itemStateHg && item01->Item_Color != itemStateBhg)
 | 
			
		||||
        {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    TKM3Item* item41 = m_car->findExamItem(Sub3ItemType41Mndg);
 | 
			
		||||
@ -782,7 +786,6 @@ void Sub3Judge20Comm::CallMoNiDengGuang()
 | 
			
		||||
    const TSensorInfo& sor3 = his3->real.sensor;
 | 
			
		||||
 | 
			
		||||
    const std::string& ksdd = TableSysSet->get211();
 | 
			
		||||
    const std::string& s386 = TableSysSet->get386();
 | 
			
		||||
    const std::string& s322 = TableSysSet->get322();
 | 
			
		||||
 | 
			
		||||
    TCar* tcar = m_car->getTCar();
 | 
			
		||||
@ -2464,7 +2467,7 @@ void Sub3Judge20Comm::Judge_LianXuBianDao()
 | 
			
		||||
    //获取连续变道超车参数
 | 
			
		||||
    std::string Temp = s512.size() > 1 && s512[1] != "" ? s512[1] : "";
 | 
			
		||||
 | 
			
		||||
    const std::vector<std::string>& ss = Tools::split(Temp, "^");
 | 
			
		||||
    const std::vector<std::string> ss = Tools::split(Temp, "^");
 | 
			
		||||
 | 
			
		||||
    //0:abc 1:aba和abc都判
 | 
			
		||||
    ctl->LianXuBianDaoKind = ss.size() > 0 && ss[0] != "" ? std::atoi(ss[0].c_str()) : 0;
 | 
			
		||||
@ -3437,9 +3440,9 @@ void Sub3Judge20Comm::Judge_BianDaoFangXiangDeng2()
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                //标准    20180416
 | 
			
		||||
                if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0  &&
 | 
			
		||||
                if(RTKKM3.FrontPointLaneNo > 0 && RTKKM3_1.FrontPointLaneNo > 0 &&
 | 
			
		||||
                        RTKKM3.FrontPointLaneNo != RTKKM3_1.FrontPointLaneNo &&
 | 
			
		||||
                        RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6 )
 | 
			
		||||
                        RTKKM3.TouchLineType > 0 && RTKKM3.TouchLineType != 6)
 | 
			
		||||
                {
 | 
			
		||||
                    //变道判方向灯
 | 
			
		||||
                    Tag = 0;
 | 
			
		||||
@ -4354,9 +4357,16 @@ void Sub3Judge20Comm::Judge_DW_KongDang()
 | 
			
		||||
    //启动发动机时,挡位未至于空挡(驻车挡)
 | 
			
		||||
    if(sor.dh2 == SYES && sor1.dh2 == SNOT && sor2.dh2 == SNOT)
 | 
			
		||||
    {
 | 
			
		||||
        if(sor.dw_plc != 0)   //(sor.dw != 0) //用原始档位无锡所
 | 
			
		||||
        if(sor.dw_plc != 0 && sor.dw_plc != 10) //C2自动挡10档是驻车档P档,0档是空挡   //(sor.dw != 0) //用原始档位无锡所
 | 
			
		||||
        {
 | 
			
		||||
            JUDGE_MARK_SUB3(2, "04", false);
 | 
			
		||||
            if(m_car->itemsSomeExaming2(Sub3ItemType02Qbxx))
 | 
			
		||||
            {
 | 
			
		||||
                JUDGE_MARK_SUB3(2, "04", false); //如果起步项目正在考就扣这个分
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                JUDGE_MARK_SUB3(20, "05", false);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -4602,8 +4612,11 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
 | 
			
		||||
        const TChuanGan* his6 = m_car->historyChuanGan(6);
 | 
			
		||||
        //旧规则评判
 | 
			
		||||
        int TempCS = std::round(gps.sd);
 | 
			
		||||
 | 
			
		||||
        const std::vector<std::string>& s507 = TableSysSet->asArray507();
 | 
			
		||||
        std::string lhq = s507.size() > 9 ? s507[9] : ""; //507第10个参数 设置为1不管踩没踩离合器都判,否则踩离合器不判
 | 
			
		||||
        ///////////////////////////////////////////////////////////////////////////
 | 
			
		||||
        if(sor.lhq == SYES || Tools::less(std::round(gps.sd), 5) ||
 | 
			
		||||
        if((lhq != "1" && sor.lhq == SYES) || Tools::less(std::round(gps.sd), 5) ||
 | 
			
		||||
                (ksdd != siteof::nj && (cg->move != moveForward || his1->move != moveForward ||
 | 
			
		||||
                                        his2->move != moveForward || his3->move != moveForward || his4->move != moveForward ||
 | 
			
		||||
                                        his5->move != moveForward || his6->move != moveForward)))
 | 
			
		||||
@ -4799,7 +4812,27 @@ void Sub3Judge20Comm::Judge_DangWei_CS_ZS()
 | 
			
		||||
//24、全程次高挡评判
 | 
			
		||||
void Sub3Judge20Comm::Judge_CiGaoDang()
 | 
			
		||||
{
 | 
			
		||||
    if(m_car->allItemFinish() && m_car->isQualified())  //全程次高挡评判 KM3AllPass()
 | 
			
		||||
    //按照军华说的 在行驶距离达到的实际判断全程次高档 20240731
 | 
			
		||||
    //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前 20240805
 | 
			
		||||
    bool timing = false; //次高档时机
 | 
			
		||||
    TTestCtl* ctl = m_car->getTTestCtl();
 | 
			
		||||
    if(ctl->dw_kf_sj == 1) //301 第3个^参数 1:达到行驶里程 非1靠边停车开始前
 | 
			
		||||
    {
 | 
			
		||||
        if(m_car->isMileage())
 | 
			
		||||
        {
 | 
			
		||||
            timing = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        TKM3Item* item = m_car->findExamItem(Sub3ItemType11Kbtc);
 | 
			
		||||
        if(item && item->TestPro == ItemProFlagInit)
 | 
			
		||||
        {
 | 
			
		||||
            timing = true;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(timing)
 | 
			
		||||
    {
 | 
			
		||||
        if(m_itemvXLG.CGD_Nums == 0)
 | 
			
		||||
        {
 | 
			
		||||
@ -4815,79 +4848,43 @@ void Sub3Judge20Comm::Judge_CiGaoDang()
 | 
			
		||||
//25、自动靠边停车(重点)
 | 
			
		||||
void Sub3Judge20Comm::Call_Auto_KBTC()
 | 
			
		||||
{
 | 
			
		||||
    //SysSet[319]:里程不够不报靠边停车(0-否 1-是 2-必考项目完成,并且里程满足要求)
 | 
			
		||||
    //SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
 | 
			
		||||
    const std::string& s319 = TableSysSet->get319();
 | 
			
		||||
    TCar* tcar = m_car->getTCar();
 | 
			
		||||
    const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
 | 
			
		||||
    //自动靠边停车
 | 
			
		||||
    if(s319 == "1" && m_car->getKsLjLc() < tcar->XSJL)
 | 
			
		||||
    if(s319 == "1")
 | 
			
		||||
    {
 | 
			
		||||
        return;
 | 
			
		||||
        if(!m_car->isMileage()) return;
 | 
			
		||||
    }
 | 
			
		||||
    if(s319 == "2")
 | 
			
		||||
    {
 | 
			
		||||
        if(m_car->getKsLjLc() < tcar->XSJL) return;
 | 
			
		||||
        bool ErrorFlag = false;
 | 
			
		||||
        for(auto it = all.begin(); it != all.end(); it++)
 | 
			
		||||
        if(!m_car->isMileage()) return;
 | 
			
		||||
 | 
			
		||||
        //自动靠边停车计算
 | 
			
		||||
        //自动靠边停车
 | 
			
		||||
        if(m_itemvCJH.bZdKbTc)
 | 
			
		||||
        {
 | 
			
		||||
            TKM3Item* item = it->second->getExamItem();
 | 
			
		||||
            if(item->NoID == true)
 | 
			
		||||
            const std::map<ExamItemCode, ISub3JudgeItem*>& all = m_car->allExamItem();
 | 
			
		||||
            //必考项目未完成
 | 
			
		||||
            for(auto it = all.begin(); it != all.end(); it++)
 | 
			
		||||
            {
 | 
			
		||||
                if(item->FinishFlag == false)
 | 
			
		||||
                TKM3Item* item = it->second->getExamItem();
 | 
			
		||||
                if(item->ItemNo == Sub3ItemType11Kbtc)
 | 
			
		||||
                {
 | 
			
		||||
                    m_car->KM3EndItem(item->ItemNo);
 | 
			
		||||
                    ErrorFlag = true;
 | 
			
		||||
                    if(item->Item_Color != itemStateWk)
 | 
			
		||||
                    {
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if(item->NoID == false && (item->Item_Color == itemStateWk || item->Item_Color == itemStateZk))
 | 
			
		||||
                    {
 | 
			
		||||
                        return;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if(ErrorFlag == true)
 | 
			
		||||
        {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for(auto it = all.begin(); it != all.end(); it++)
 | 
			
		||||
        {
 | 
			
		||||
            TKM3Item* item = it->second->getExamItem();
 | 
			
		||||
            if(item->ItemNo == Sub3ItemType11Kbtc) continue;
 | 
			
		||||
            if(item->FinishFlag == false)
 | 
			
		||||
            {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    //自动靠边停车计算
 | 
			
		||||
    //自动靠边停车
 | 
			
		||||
    if(m_itemvCJH.bZdKbTc)
 | 
			
		||||
    {
 | 
			
		||||
        //必考项目未完成
 | 
			
		||||
        for(auto it = all.begin(); it != all.end(); it++)
 | 
			
		||||
        {
 | 
			
		||||
            TKM3Item* item = it->second->getExamItem();
 | 
			
		||||
            if(item->ItemNo == Sub3ItemType11Kbtc)
 | 
			
		||||
            {
 | 
			
		||||
                if(item->Item_Color != itemStateWk)
 | 
			
		||||
                {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if(item->NoID == false && (item->Item_Color == itemStateWk || item->Item_Color == itemStateZk))
 | 
			
		||||
                {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //SysSet[319]:里程不够不报靠边停车(0-否 1-是 2-必考项目完成,并且里程满足要求)
 | 
			
		||||
        //SysSet[415]:自动报靠边停车(启用标记^全部结束n米报^)启用标记:0-否 1-是 319参数为2有效
 | 
			
		||||
        const std::string& s319 = TableSysSet->get319();
 | 
			
		||||
        const std::string& ksdd = TableSysSet->get211();
 | 
			
		||||
        if(s319 == "2")
 | 
			
		||||
        {
 | 
			
		||||
            const TChuanGan* cg = m_car->historyChuanGan();
 | 
			
		||||
 | 
			
		||||
            if(m_itemvCJH.KbTcJl == -1)
 | 
			
		||||
            {
 | 
			
		||||
                m_itemvCJH.KbTcJl = cg->ai_ljjl;
 | 
			
		||||
@ -4895,6 +4892,7 @@ void Sub3Judge20Comm::Call_Auto_KBTC()
 | 
			
		||||
            if(cg->ai_ljjl - m_itemvCJH.KbTcJl >= m_itemvCJH.ZdKbTcJl)
 | 
			
		||||
            {
 | 
			
		||||
                //20171008
 | 
			
		||||
                const std::string& ksdd = TableSysSet->get211();
 | 
			
		||||
                if(ksdd == siteof::changzhoukm3)
 | 
			
		||||
                {
 | 
			
		||||
                    if(cg->RTKKM3.BaseLaneCount > 0)
 | 
			
		||||
@ -4952,6 +4950,7 @@ void Sub3Judge20Comm::Judge_Extra()
 | 
			
		||||
        //m_car->createEventEnterItem({item13->ItemNo, ""});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /*
 | 
			
		||||
    //自动触发加减挡位
 | 
			
		||||
    bool FindSCZB = false;
 | 
			
		||||
    bool FindMNDG = false;
 | 
			
		||||
@ -4990,21 +4989,18 @@ void Sub3Judge20Comm::Judge_Extra()
 | 
			
		||||
 | 
			
		||||
    if((SCZBFinishFlag == true || FindSCZB == false) && (MNDGFinishFlag == true || FindMNDG == false))
 | 
			
		||||
    {
 | 
			
		||||
        TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw);
 | 
			
		||||
        TKM3Item* item14 = m_car->findExamItem(Sub3ItemType14Jjdw); //20240731
 | 
			
		||||
        if(item14 && item14->NoID == true) //免考加减挡的
 | 
			
		||||
        {
 | 
			
		||||
            if(item14->Item_Color == itemStateWk)
 | 
			
		||||
            {
 | 
			
		||||
                //ToDo1:生成 全程加减挡 进项目事件
 | 
			
		||||
                //item14->Item_Color = itemStateZk;
 | 
			
		||||
                //item14->TestPro = ItemProFlagInit;
 | 
			
		||||
                //item14->FinishFlag = false;
 | 
			
		||||
 | 
			
		||||
                m_car->createEventEnterItem({item14->ItemNo, ""});
 | 
			
		||||
                m_car->KM3EndItem(item14->ItemNo);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
    m_DiaoTou_ID = 0;
 | 
			
		||||
    std::string CurrentRoadData = cg->MapPoint_Road_Code;
 | 
			
		||||
 | 
			
		||||
@ -566,27 +566,59 @@ inline void GpsMath::getDimensionalCoordinate(const double& E1, const double& N1
 | 
			
		||||
///以下是科目三的函数 2024-01-12
 | 
			
		||||
///////////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
double GpsMath::getAngle(const Pointi& p1, const Pointi& p2)
 | 
			
		||||
{
 | 
			
		||||
    double angle = 0;
 | 
			
		||||
    //修改坐标系
 | 
			
		||||
    if(p1.x == p2.x)
 | 
			
		||||
    {
 | 
			
		||||
        if(p1.y < p2.y)
 | 
			
		||||
        {
 | 
			
		||||
            angle = PI / 2;
 | 
			
		||||
        }
 | 
			
		||||
        else if(p1.y >= p2.y)
 | 
			
		||||
        {
 | 
			
		||||
            angle = PI * 3 / 2;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
        angle = std::atan2(p2.y - p1.y, p2.x - p1.x);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(angle < 0)
 | 
			
		||||
    {
 | 
			
		||||
        angle = angle + 2 * PI;
 | 
			
		||||
    }
 | 
			
		||||
    angle = angle / PI * 180;
 | 
			
		||||
    return angle;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
//1、获得点1指向点2的角度0-360度,该角度是X轴正方向顺时针旋转到有向线段(由点1指向点2所确定)的角度,例如:正东=0度,正北=270
 | 
			
		||||
double GpsMath::GetAngle_HQ(const Pointi& p1, const Pointi& p2, int MinusY)
 | 
			
		||||
{
 | 
			
		||||
    int result = 0;
 | 
			
		||||
    double angle = 0;
 | 
			
		||||
    if(p1.x == p2.x)
 | 
			
		||||
    {
 | 
			
		||||
        if(p1.y * MinusY < p2.y * MinusY)
 | 
			
		||||
            result = PI * 3 / 2;
 | 
			
		||||
            angle = PI * 3 / 2;
 | 
			
		||||
        else if (p1.y * MinusY > p2.y * MinusY)
 | 
			
		||||
            result = PI / 2;
 | 
			
		||||
            angle = PI / 2;
 | 
			
		||||
        else
 | 
			
		||||
            result = 0;
 | 
			
		||||
            angle = 0;
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
        result = std::atan2(p1.y * MinusY - p2.y * MinusY, p2.x - p1.x); //???yhyflag
 | 
			
		||||
    {
 | 
			
		||||
        angle = std::atan2(p1.y * MinusY - p2.y * MinusY, p2.x - p1.x);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(result < 0)
 | 
			
		||||
        result = result + 2 * PI;
 | 
			
		||||
    if(angle < 0)
 | 
			
		||||
        angle = angle + 2 * PI;
 | 
			
		||||
 | 
			
		||||
    result = result / PI * 180;
 | 
			
		||||
    return result;
 | 
			
		||||
    angle = angle / PI * 180;
 | 
			
		||||
    return angle;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -137,7 +137,10 @@ private:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
public:   //科目三
 | 
			
		||||
    //计算角度 逆时针
 | 
			
		||||
    //static double getAngle(const Pointi& point1, const Pointi& point2);
 | 
			
		||||
    //1、获得点1指向点2的角度0-360度,该角度是X轴正方向顺时针旋转到有向线段(由点1指向点2所确定)的角度,例如:正东=0度,正北=270
 | 
			
		||||
    //MinusY= 1顺时针, -1逆时针
 | 
			
		||||
    static double GetAngle_HQ(const Pointi& p1, const Pointi& p2, int MinusY = 1);
 | 
			
		||||
    //计算两点距离
 | 
			
		||||
    static int PointDistance(const Pointi& p1, const Pointi& p2);
 | 
			
		||||
 | 
			
		||||
@ -148,6 +148,14 @@ enum PlaySoundType
 | 
			
		||||
    PlaySoundEndNotify = 1, //1:表示是模拟灯光项目的语音,语音播报结束需要调用examJudgeSoundEnd通知评判。
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//行驶方向,***注意:枚举不能变,和外壳有对应关系
 | 
			
		||||
enum DriveDirType
 | 
			
		||||
{
 | 
			
		||||
    DriveDirN = -1, //-1:逆向行驶
 | 
			
		||||
    DriveDirX =  0, //0:未知
 | 
			
		||||
    DriveDirY =  1, //1:正向行驶
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//Tag1=0-无标线
 | 
			
		||||
//Tag1=1-中心线(黄色实线)
 | 
			
		||||
 | 
			
		||||
@ -334,7 +334,7 @@ struct TStuInfo
 | 
			
		||||
    int64              ddkssj    = 0;   //考试中断那次考试开始考试时间 1970年到现在的毫秒数
 | 
			
		||||
    std::vector<int32> ykxm      = {};  //已考项目 "1,3" 对应枚举 ExamItemCode      DuanDian_FinishItems
 | 
			
		||||
    std::vector<TKfXm> kfxm      = {};  //扣分项目 "20,01;" 对应枚举 ExamItemCode   DuanDian_Marks
 | 
			
		||||
    int32              yklc      = 0;   //已考里程,单位米
 | 
			
		||||
    int32              yklc      = 0;   //已考里程,单位厘米
 | 
			
		||||
 | 
			
		||||
    int8               sczb      = 0;   //CS_Finish_SCZB_Flag:Boolan;  //yhy22 初始完成上车准备标志(外壳传递的)Boolan
 | 
			
		||||
    std::vector<TKfXm> sczbkf    = {};  //SCZBKouFenData:String[200];  //格式:  ItemNo,MarkSerial; ItemNo,MarkSerial;
 | 
			
		||||
@ -850,15 +850,14 @@ struct TRTKResult
 | 
			
		||||
 | 
			
		||||
    int CrossPointNo = 0; //穿越点
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    //20240730 新增  还没计算
 | 
			
		||||
    int TouchLineDirCS = 0; //车身碰线	车身碰线方向
 | 
			
		||||
    //20240801 新增  还没计算
 | 
			
		||||
    int TouchLineDirCS = TouchDir0; //车身碰线	车身碰线方向
 | 
			
		||||
    int BackPointLaneNo = 0; //后点车道	后点所在车道号
 | 
			
		||||
    int BackPointLaneCount = 0; //后点车道	后点天线共有几股车道
 | 
			
		||||
    int Body_RF_ToBaseLine = 0; //右前车身边线	指车身离右侧路边缘线距离
 | 
			
		||||
    int Body_RB_ToBaseLine = 0; //右后车身边线	指车身离右侧路边缘线距离
 | 
			
		||||
 | 
			
		||||
    int DirInverse = 0;   //车道属性 是否逆向行驶
 | 
			
		||||
    int DirInverse = 0;   //车道属性 是否逆向行驶  对应DriveDirType枚举
 | 
			
		||||
    int ShapeNoWheel = 0; //形状	车轮相交的形状线号
 | 
			
		||||
 | 
			
		||||
#ifdef JUDGE_USE_INSPECT
 | 
			
		||||
 | 
			
		||||
@ -16,11 +16,15 @@ export async function download() {
 | 
			
		||||
  })
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface WR{
 | 
			
		||||
  message?:string
 | 
			
		||||
  code:number
 | 
			
		||||
}
 | 
			
		||||
// 通用监管接口
 | 
			
		||||
export async function writeObjectOut(params,filePath?:string): Promise<number> {
 | 
			
		||||
export async function writeObjectOut(params,filePath?:string): Promise<WR> {
 | 
			
		||||
  const singlePlay = globalThis.singlePlay
 | 
			
		||||
  if (singlePlay) {
 | 
			
		||||
    return 1
 | 
			
		||||
    return {code:1}
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //获取监管接口地址路径
 | 
			
		||||
@ -42,6 +46,7 @@ export async function writeObjectOut(params,filePath?:string): Promise<number> {
 | 
			
		||||
  if (globalThis.isJGNew) {
 | 
			
		||||
    return await writeObjectOutNew(params,filePath)
 | 
			
		||||
  }
 | 
			
		||||
  drvexam.zp = drvexam.zp === undefined ? undefined : encodeURIComponent( drvexam.zp)
 | 
			
		||||
  const drvexamArrs = Reflect.ownKeys(drvexam).map((key: string) => (`<${key}>${drvexam[key]}</${key}>`));
 | 
			
		||||
 | 
			
		||||
  if(filePath){
 | 
			
		||||
@ -52,6 +57,7 @@ export async function writeObjectOut(params,filePath?:string): Promise<number> {
 | 
			
		||||
    }));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  console.info('surenjun','调用旧监管')
 | 
			
		||||
  //对象转换成xml
 | 
			
		||||
  const temp = await request({
 | 
			
		||||
    host: globalThis.JGHOST,
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,11 @@ const gjxlhObj = {
 | 
			
		||||
  '17C56': '02-21-000014',
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default async function writeObjectOutNew(data,filePath): Promise<number> {
 | 
			
		||||
interface WR{
 | 
			
		||||
  message?:string
 | 
			
		||||
  code:number
 | 
			
		||||
}
 | 
			
		||||
export default async function writeObjectOutNew(data,filePath): Promise<WR> {
 | 
			
		||||
  const fileUtil = new FileUtil(globalThis.context);
 | 
			
		||||
  const {jkid , drvexam} = data;
 | 
			
		||||
  const basic = await getBasicConfig(jkid);
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,7 @@ export default class FileUtil{
 | 
			
		||||
          fs.mkdirSync(path)
 | 
			
		||||
        }
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        console.info('初始化文件夹失败',path)
 | 
			
		||||
        promptAction.showToast({
 | 
			
		||||
          message:`初始化文件夹失败`+JSON.stringify(e),
 | 
			
		||||
          duration:4000,
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,6 @@ import {  testKm2Items,testKm3Items } from '../../pages/judgeSDK/dataTest/index'
 | 
			
		||||
import { judgeConfig } from '../../pages/judgeSDK/utils/judgeConfig';
 | 
			
		||||
import { setJudgeUdp, setTopLineUdp } from './GlobalUdp';
 | 
			
		||||
import { convertGpsCoord2 } from '../utils/tools';
 | 
			
		||||
import common from '@ohos.app.ability.common';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const initJudgeUdp = async () => {
 | 
			
		||||
  globalThis.serialIndex = 0;
 | 
			
		||||
 | 
			
		||||
@ -131,12 +131,14 @@ function handleCenterCode(msgXml,isNewCenter){
 | 
			
		||||
        if(result){
 | 
			
		||||
            const {code,message} = result
 | 
			
		||||
            if(code != '1'){
 | 
			
		||||
                const rMessage = decodeURIComponent(message as string)
 | 
			
		||||
                prompt.showToast({
 | 
			
		||||
                    message, duration: 3000
 | 
			
		||||
                    message:rMessage,
 | 
			
		||||
                    duration: 3000
 | 
			
		||||
                });
 | 
			
		||||
                return
 | 
			
		||||
                return {code,message}
 | 
			
		||||
            }else{
 | 
			
		||||
                return code
 | 
			
		||||
                return { code }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -152,9 +154,9 @@ function handleCenterCode(msgXml,isNewCenter){
 | 
			
		||||
            message: decodeURIComponent(message as string),
 | 
			
		||||
            duration: 3000
 | 
			
		||||
        });
 | 
			
		||||
        return
 | 
			
		||||
        return {code,message:decodeURIComponent(message)}
 | 
			
		||||
    }else{
 | 
			
		||||
        return code
 | 
			
		||||
        return { code }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -115,7 +115,6 @@ struct Index {
 | 
			
		||||
  async initStudent() {
 | 
			
		||||
    const students = await getSyncData('USER')
 | 
			
		||||
    const stuInfo = students[0] || {};
 | 
			
		||||
    console.info('surenjun stuInfo=>', JSON.stringify(stuInfo))
 | 
			
		||||
    const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx,ksxl} = stuInfo;
 | 
			
		||||
    this.name = xm || '测试考生';
 | 
			
		||||
    this.idCard = sfzmhm || '01234567891010';
 | 
			
		||||
@ -279,8 +278,8 @@ struct Index {
 | 
			
		||||
          abbreviation: decodeURI(systemParm.txt3),
 | 
			
		||||
          projectCode: no2,
 | 
			
		||||
          projectCodeCenter: txt2,
 | 
			
		||||
          //是否是必考
 | 
			
		||||
          isRequired: allItems.includes(no2 + ''),
 | 
			
		||||
          //是否是必考  加减档设置成非必考
 | 
			
		||||
          isRequired: no2== 14?false:allItems.includes(no2 + ''),
 | 
			
		||||
          //是否考过了
 | 
			
		||||
          isEnd: false,
 | 
			
		||||
          //项目开始数据是否上传过
 | 
			
		||||
@ -300,8 +299,6 @@ struct Index {
 | 
			
		||||
      })
 | 
			
		||||
    })
 | 
			
		||||
    const projects = this.projects;
 | 
			
		||||
    console.info('surenjun',JSON.stringify(this.projectsObj))
 | 
			
		||||
 | 
			
		||||
    if (!projects.length) {
 | 
			
		||||
      Prompt.showToast({
 | 
			
		||||
        message: '读取数据库信息失败,请重新联网更新!',
 | 
			
		||||
@ -465,6 +462,7 @@ struct Index {
 | 
			
		||||
    this.examSubject = isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject;
 | 
			
		||||
    globalThis.carInfo.examSubject = this.examSubject
 | 
			
		||||
    this.singlePlay = beginDataObj.exam == 0;
 | 
			
		||||
    this.carName = initDataObj.name;
 | 
			
		||||
    globalThis.singlePlay = beginDataObj.exam == 0;
 | 
			
		||||
    await this.initSystemParam(initDataObj.systemparm)
 | 
			
		||||
    await this.initMarkRules(initDataObj.mark);
 | 
			
		||||
@ -748,7 +746,7 @@ struct Index {
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          Column() {
 | 
			
		||||
            if (this.examSubject == 3) {
 | 
			
		||||
            if (this.examSubject == 3 && this.judgeConfigObj['342'] == 0) {
 | 
			
		||||
              Row() {
 | 
			
		||||
                Row() {
 | 
			
		||||
                }
 | 
			
		||||
@ -767,14 +765,7 @@ struct Index {
 | 
			
		||||
              .backgroundImageSize({ width: '100%', height: '100%' })
 | 
			
		||||
              .margin({ bottom: 10 })
 | 
			
		||||
              .onClick(() => {
 | 
			
		||||
                if (this.judgeConfigObj['342'] == 0) {
 | 
			
		||||
                  this.isDeductedPopShow = true
 | 
			
		||||
                } else {
 | 
			
		||||
                  Prompt.showToast({
 | 
			
		||||
                    message: '平台配置不允许人工评判!',
 | 
			
		||||
                    duration: 4000
 | 
			
		||||
                  });
 | 
			
		||||
                }
 | 
			
		||||
                this.isDeductedPopShow = true
 | 
			
		||||
              })
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
@ -844,7 +835,7 @@ struct Index {
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      //科目三人工扣分弹窗
 | 
			
		||||
      if (this.isDeductedPopShow && this.examSubject == 3) {
 | 
			
		||||
      if (this.isDeductedPopShow && this.examSubject == 3 && this.judgeConfigObj['342'] == 0) {
 | 
			
		||||
        DeductedPopup({
 | 
			
		||||
          defaultTabIndex: this.defaultTabIndex,
 | 
			
		||||
          currentItems: Reflect.ownKeys(this.projectsObj).map(projectKey => {
 | 
			
		||||
@ -945,12 +936,11 @@ struct Index {
 | 
			
		||||
      currentXmdm,
 | 
			
		||||
    } = this;
 | 
			
		||||
    const projectCode = artSubject3ProjectsCodesArr[index];
 | 
			
		||||
    console.info('surenjun',getIsExitManualProject(index))
 | 
			
		||||
    if(index === 5) {
 | 
			
		||||
      console.info('surenjun 靠边停车状态=> ',getIsExitManualProject(index))
 | 
			
		||||
    }
 | 
			
		||||
    if (getIsExitManualProject(index)) {
 | 
			
		||||
      // 正在进行的项目 取消项目
 | 
			
		||||
      console.info('surenjun isManualProjectIn=>',isManualProjectIn)
 | 
			
		||||
      console.info('surenjun projectCode=>',projectCode)
 | 
			
		||||
      console.info('surenjun currentXmdm=>',currentXmdm)
 | 
			
		||||
      if (isManualProjectIn && projectCode === currentXmdm) {
 | 
			
		||||
        await this.judge.setJudgeItem(currentXmdm, 2);
 | 
			
		||||
        Prompt.showToast({
 | 
			
		||||
@ -964,8 +954,15 @@ struct Index {
 | 
			
		||||
      if (judgeConfigObj['343'] == 0) {
 | 
			
		||||
        const xmmcStr = this.xmmcStr;
 | 
			
		||||
        if (xmmcStr == '无' || xmmcStr == '') {
 | 
			
		||||
          this.amplifiedImgIndex = index;
 | 
			
		||||
          this.isAmplifyPopShow = true
 | 
			
		||||
          //512[6] 人工项目按钮放大确认
 | 
			
		||||
          const param512 = (judgeConfigObj['512'] || '').split(',');
 | 
			
		||||
          if(param512[6] != 0){
 | 
			
		||||
            this.amplifiedImgIndex = index;
 | 
			
		||||
            this.isAmplifyPopShow = true
 | 
			
		||||
          }else{
 | 
			
		||||
            const judge = this.judge
 | 
			
		||||
            await judge.setJudgeItem(projectCode, 1);
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          if (index === 5) {
 | 
			
		||||
            Prompt.showToast({
 | 
			
		||||
@ -1086,6 +1083,10 @@ struct Index {
 | 
			
		||||
      return false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if(projectRoads[projectCode].length == 0){
 | 
			
		||||
      return true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //设置了514-519参数,只能在设置的路段触发对应项目
 | 
			
		||||
    if (projectRoads[projectCode].includes(road)) {
 | 
			
		||||
      //如果525为1,则514-519设置的路段不能触发对应项目
 | 
			
		||||
 | 
			
		||||
@ -75,6 +75,7 @@ struct UserInfo {
 | 
			
		||||
  @State FaceOpenStatue: string = '0'; //是否开启人脸识别
 | 
			
		||||
  subscriber;
 | 
			
		||||
  @State faceCatchImg: string = ''
 | 
			
		||||
  @State Param803Str:string = ''
 | 
			
		||||
  // 过程照片拍照
 | 
			
		||||
  getPhoto = async (empty?: boolean) => {
 | 
			
		||||
    const singlePlay = globalThis.singlePlay
 | 
			
		||||
@ -105,13 +106,11 @@ struct UserInfo {
 | 
			
		||||
    new WebRTCVoice(this.context);
 | 
			
		||||
    //初始化数据
 | 
			
		||||
    this.initData()
 | 
			
		||||
 | 
			
		||||
    //身份证读卡器初始化
 | 
			
		||||
    // this.openDeviceByIDCard()
 | 
			
		||||
    // 如果是单机模式则模拟假数据
 | 
			
		||||
    //获取sysset表数据
 | 
			
		||||
    this.initSysset()
 | 
			
		||||
 | 
			
		||||
    //心跳处理
 | 
			
		||||
    this.heartMsg()
 | 
			
		||||
    this.isExamStart = false
 | 
			
		||||
@ -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<boolean> {
 | 
			
		||||
    const {isCheckFireOpen} = judgeConfig
 | 
			
		||||
    const {Param803Str,isBoardPrePareSetPopupOpen} = this;
 | 
			
		||||
 | 
			
		||||
    if(Param803Str === ''){
 | 
			
		||||
      return true
 | 
			
		||||
    }
 | 
			
		||||
    return new Promise((resolve,reject)=>{
 | 
			
		||||
      if(isCheckFireOpen){
 | 
			
		||||
        resolve(true)
 | 
			
		||||
        // return
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      console.info('socketTag[PLC.UdpClient]', '注册udp回调')
 | 
			
		||||
      let plcValue =  globalThis.udpClient.getCurrentMessage();
 | 
			
		||||
      console.info('surenjun',plcValue)
 | 
			
		||||
      const msgArr = plcValue.split(',') || ''
 | 
			
		||||
      const mkg = msgArr[14];
 | 
			
		||||
      const fdjzs = msgArr[25];
 | 
			
		||||
      if(mkg == 1){
 | 
			
		||||
        this.avPlayer.playAudio(['voice/关门.mp3'])
 | 
			
		||||
        promptAction.showToast({
 | 
			
		||||
          message:'请关闭车门',
 | 
			
		||||
          duration:4000
 | 
			
		||||
        })
 | 
			
		||||
        reject(false)
 | 
			
		||||
      const aqd = msgArr[19];
 | 
			
		||||
      const jgd = msgArr[7];
 | 
			
		||||
      const ygd = msgArr[8];
 | 
			
		||||
      const ssc = msgArr[13];
 | 
			
		||||
      const dw = msgArr[28];
 | 
			
		||||
      // 开始考试信号检测
 | 
			
		||||
      if(Param803Str !== ''){
 | 
			
		||||
        //安全带
 | 
			
		||||
        if(aqd == 1 && Param803Str.includes('1')){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/请解开安全带.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请解开安全带',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
        //门开关
 | 
			
		||||
        if(mkg == 1 && Param803Str.includes('2')){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/关门.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请关闭车门',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
        //远、近光灯
 | 
			
		||||
        if((jgd == 1 || ygd == 1) && Param803Str.includes('3')){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/请关闭远近光灯.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请关闭远近光灯',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
        //拉手刹
 | 
			
		||||
        if(ssc == 0 && Param803Str.includes('4')){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/请拉手刹.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请拉手刹',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        //请点火
 | 
			
		||||
        if(fdjzs*1 <=0 && Param803Str.includes('5')){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/点火.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请点火',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
        //置空档
 | 
			
		||||
        if(dw != 0 && Param803Str.includes('6')){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/请置空档.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请置空档',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if(fdjzs*1 > 0){
 | 
			
		||||
        this.avPlayer.playAudio(['voice/熄火.mp3'])
 | 
			
		||||
        promptAction.showToast({
 | 
			
		||||
          message:'请熄火',
 | 
			
		||||
          duration:4000
 | 
			
		||||
        })
 | 
			
		||||
        reject(false)
 | 
			
		||||
      // 考前绕车一周信号检测
 | 
			
		||||
      if(isBoardPrePareSetPopupOpen){
 | 
			
		||||
        //请熄火
 | 
			
		||||
        if(fdjzs*1 > 0){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/熄火.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请熄火',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
        if(mkg == 1){
 | 
			
		||||
          this.avPlayer.playAudio(['voice/关门.mp3'])
 | 
			
		||||
          promptAction.showToast({
 | 
			
		||||
            message:'请关闭车门',
 | 
			
		||||
            duration:4000
 | 
			
		||||
          })
 | 
			
		||||
          reject(false)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      resolve(true)
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -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))
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
              })
 | 
			
		||||
 | 
			
		||||
@ -226,9 +226,9 @@ export default struct DeductedPopup {
 | 
			
		||||
    }
 | 
			
		||||
    const code = await writeObjectOut(beginData)
 | 
			
		||||
    //TODO code待处理
 | 
			
		||||
    if (code == 1) {
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    // if (code == 1) {
 | 
			
		||||
    //
 | 
			
		||||
    // }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //过程照片
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,9 @@ import apiJudgeSdk from 'libJudgeSdk.so';
 | 
			
		||||
import Judge from '../../judgeSDK/utils/judgeReal';
 | 
			
		||||
import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d';
 | 
			
		||||
import common from '@ohos.app.ability.common';
 | 
			
		||||
import {
 | 
			
		||||
  examJudgeMapSetScaling
 | 
			
		||||
} from '../../judgeSDK/api'
 | 
			
		||||
 | 
			
		||||
interface RoadDataType {
 | 
			
		||||
  name: string,
 | 
			
		||||
@ -19,6 +22,7 @@ export default struct RealTime {
 | 
			
		||||
  @State projects: Project[] = []
 | 
			
		||||
  @State projectsObj: ProjectObj = {}
 | 
			
		||||
  @State markRuleListObj: MarkRule = {}
 | 
			
		||||
  @State scaleNum: number = 100
 | 
			
		||||
  @State gpsActive: number = 1
 | 
			
		||||
  private widthNumber: string | number | Resource = 0
 | 
			
		||||
  private heightNumber: string | number | Resource = 0
 | 
			
		||||
@ -88,6 +92,11 @@ export default struct RealTime {
 | 
			
		||||
      }
 | 
			
		||||
      .width('100%')
 | 
			
		||||
      .backgroundColor('#fff')
 | 
			
		||||
 | 
			
		||||
      Row(){
 | 
			
		||||
        Image($rawfile('judge/big.png')).width(60).onClick(()=>{this.scaleFn(-10)})
 | 
			
		||||
        Image($rawfile('judge/small.png')).width(60).onClick(()=>{this.scaleFn(10)}).margin({left:20})
 | 
			
		||||
      }.position({x:'32%',y:60})
 | 
			
		||||
    }
 | 
			
		||||
    .height('100%')
 | 
			
		||||
  }
 | 
			
		||||
@ -136,5 +145,20 @@ export default struct RealTime {
 | 
			
		||||
    { name: '形状', key: ['InShapeAttr', 'ShapeNo','ShapeNoWheel'] },
 | 
			
		||||
    { name: '路段点', key: ['CrossPointNo'] },
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  scaleFn = async (num)=>{
 | 
			
		||||
    const scaleNum = this.scaleNum
 | 
			
		||||
    if(scaleNum >0 && scaleNum < 200){
 | 
			
		||||
      this.scaleNum += num;
 | 
			
		||||
    }
 | 
			
		||||
    if(scaleNum === 0 && num > 0){
 | 
			
		||||
      this.scaleNum += num;
 | 
			
		||||
    }
 | 
			
		||||
    if(scaleNum === 200 && num < 0){
 | 
			
		||||
      this.scaleNum += num;
 | 
			
		||||
    }
 | 
			
		||||
    await examJudgeMapSetScaling(this.scaleNum);
 | 
			
		||||
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -558,6 +558,7 @@ export const testUIAllitems = [
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
export const wuxiKm3Items = [
 | 
			
		||||
    //3,5,9,12,14,15,16,
 | 
			
		||||
    {projectCode:'1',projectCodeCenter:'40100',name:'上车准备',abbreviation:'上车准备'},
 | 
			
		||||
    {projectCode:'2',projectCodeCenter:'40200',name:'起步',abbreviation:'起步'},
 | 
			
		||||
    {projectCode:'3',projectCodeCenter:'40300',name:'直线行驶',abbreviation:'直线行驶'},
 | 
			
		||||
@ -570,7 +571,7 @@ export const wuxiKm3Items = [
 | 
			
		||||
    {projectCode:'10',projectCodeCenter:'41400',name:'超车',abbreviation:'超车'},
 | 
			
		||||
    {projectCode:'11',projectCodeCenter:'40600',name:'靠边停车',abbreviation:'靠边停车'},
 | 
			
		||||
    {projectCode:'12',projectCodeCenter:'41500',name:'掉头',abbreviation:'掉头'},
 | 
			
		||||
    {projectCode:'13',projectCodeCenter:'41600',name:'夜间行驶',abbreviation:'夜间行驶'},
 | 
			
		||||
    {projectCode:'41',projectCodeCenter:'41600',name:'夜间行驶',abbreviation:'夜间行驶'},
 | 
			
		||||
    {projectCode:'14',projectCodeCenter:'40400',name:'加减档位操作',abbreviation:'加减档位操作'},
 | 
			
		||||
    {projectCode:'15',projectCodeCenter:'40800',name:'路口左转弯',abbreviation:'路口左转弯'},
 | 
			
		||||
    {projectCode:'16',projectCodeCenter:'40900',name:'路口右转弯',abbreviation:'路口右转弯'},
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,8 @@ import {
 | 
			
		||||
  plcStrToJson,
 | 
			
		||||
  plcStrToWXJson,
 | 
			
		||||
  promptWxCode,
 | 
			
		||||
  senorToWXDataStr
 | 
			
		||||
  senorToWXDataStr,
 | 
			
		||||
  getKmProjectCancelVoice
 | 
			
		||||
} from './utils/judgeCommon';
 | 
			
		||||
 | 
			
		||||
import {
 | 
			
		||||
@ -159,7 +160,8 @@ export default class Judge {
 | 
			
		||||
    // 3.开始考试
 | 
			
		||||
    let beginExamInfo = isTrajectoryOpen ? {
 | 
			
		||||
      ...JSON.parse(strArr[1]),
 | 
			
		||||
      replay: 1
 | 
			
		||||
      replay: 1,
 | 
			
		||||
      ykxm:judgeConfig.ignoreProjects
 | 
			
		||||
    } : await getJudgeBeginData()
 | 
			
		||||
 | 
			
		||||
    await fileLog.setExamJudgeData(beginExamInfo)
 | 
			
		||||
@ -291,8 +293,9 @@ export default class Judge {
 | 
			
		||||
  //处理评判过程回调
 | 
			
		||||
  handleRealExam = async (strData, callBack) => {
 | 
			
		||||
    let examData: EXAMDATA = JSON.parse(strData);
 | 
			
		||||
    const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,setRoadAndLane,judgeUI} = this;
 | 
			
		||||
    const {carzt,xmks,kf,event,xmjs,ksjs,sound,mndg,lane} = examData
 | 
			
		||||
    const {getDqxmStr,getKfStr,goJudgeVoice,setMndg,avPlayer,judgeUI} = this;
 | 
			
		||||
    const {carzt,xmks,kf,event,xmjs,xmqx,ksjs,sound,mndg,lane} = examData
 | 
			
		||||
    const  param512 = (judgeUI.judgeConfigObj['512'] || '').split(',');
 | 
			
		||||
    //获取项目结束、项目开始代码
 | 
			
		||||
    const xmdm = event == 2 ? xmjs.xmdm : xmks.xmdm
 | 
			
		||||
    const xmxh = event == 2 ? xmjs.xmxh : xmks.xmxh;
 | 
			
		||||
@ -301,7 +304,6 @@ export default class Judge {
 | 
			
		||||
    switch (event) {
 | 
			
		||||
    //项目开始
 | 
			
		||||
      case 1:
 | 
			
		||||
        console.info(judgeTag,'项目开始开始1')
 | 
			
		||||
        judgeUI.projectsObj[xmdm].type = '2';
 | 
			
		||||
        if (isManualProjectIn) {
 | 
			
		||||
          //手动项目是否在进行中
 | 
			
		||||
@ -322,8 +324,9 @@ export default class Judge {
 | 
			
		||||
        this.xmdm = xmdm;
 | 
			
		||||
        this.xmxh = xmxh;
 | 
			
		||||
        this.judgeUI.isProjectIn = true
 | 
			
		||||
        this.judgeUI.isDeductedPopShow = true
 | 
			
		||||
        console.info(judgeTag,'项目开始开始2')
 | 
			
		||||
        if(param512[7] != 0){
 | 
			
		||||
          this.judgeUI.isDeductedPopShow = true
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    //项目结束
 | 
			
		||||
@ -380,8 +383,16 @@ export default class Judge {
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
    //项目取消
 | 
			
		||||
      case 6:
 | 
			
		||||
      case 6:{
 | 
			
		||||
        console.info(judgeTag,'项目取消');
 | 
			
		||||
        const xmdm = xmqx.xmdm;
 | 
			
		||||
        const xmmcCode = judgeUI.projectsObj[xmdm].projectCodeCenter;
 | 
			
		||||
        const voiceCode =  getKmProjectCancelVoice(xmmcCode);
 | 
			
		||||
        avPlayer.playAudio([`voice/${voiceCode}.mp3`],true)
 | 
			
		||||
        this.judgeUI.projectsObj[xmdm].type = '1';
 | 
			
		||||
        this.testKmItems[xmmcCode].status = '1';
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    //语音播放和提示
 | 
			
		||||
      case 7:
 | 
			
		||||
@ -414,7 +425,7 @@ export default class Judge {
 | 
			
		||||
    this.goVoiceAnnounce(event, xmdm, this.kfArr, xmjs, ksjs)
 | 
			
		||||
 | 
			
		||||
    //更新UI
 | 
			
		||||
    if (event == 1 || event == 2 || event == 3) {
 | 
			
		||||
    if (event == 1 || event == 2 || event == 3 || event == 6) {
 | 
			
		||||
      const copyProjectsObj = this.judgeUI.projectsObj;
 | 
			
		||||
      judgeUI.projectsObj = deepClone(copyProjectsObj);
 | 
			
		||||
    }
 | 
			
		||||
@ -447,7 +458,7 @@ export default class Judge {
 | 
			
		||||
        const isEnd = projectsObj[xmdm].isEnd;
 | 
			
		||||
        const kmCode = getKmProjectVoice(code, 1, judgeConfigObj, lane)
 | 
			
		||||
        if (!ignoreVoiceCodeArr.includes(code)) {
 | 
			
		||||
          kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`])
 | 
			
		||||
          kmCode && avPlayer.playAudio([`voice/${kmCode}.mp3`],true)
 | 
			
		||||
        }
 | 
			
		||||
      //项目已考不上传监管信息
 | 
			
		||||
        if (!isEnd) {
 | 
			
		||||
@ -490,11 +501,10 @@ export default class Judge {
 | 
			
		||||
      case 3:
 | 
			
		||||
      //扣分时实时播报语音(0-否+1-是)
 | 
			
		||||
        const currentKf = kf[kfLen -1];
 | 
			
		||||
        if (judgeConfigObj['418'] == '1' || judgeConfig.kfVoiceOpen) {
 | 
			
		||||
        if (judgeConfigObj['418'] == '1' && judgeConfig.kfVoiceOpen) {
 | 
			
		||||
          avPlayer.playAudio([`voice/${currentKf.markcatalog}.mp3`])
 | 
			
		||||
        }
 | 
			
		||||
        const isStart = await checkProjectIsStart(currentKf.xmdm,2,currentKf);
 | 
			
		||||
        console.info(judgeTag + '扣分 isStart=>',isStart)
 | 
			
		||||
        if(isStart){
 | 
			
		||||
          await judgeTask.addTask(async () => {
 | 
			
		||||
            console.info(judgeTag, `项目扣分-${currentKf.markcatalog}-${currentKf.desc}`)
 | 
			
		||||
@ -593,7 +603,7 @@ export default class Judge {
 | 
			
		||||
        kssj: time
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    const code = await writeObjectOut(data,filePath)
 | 
			
		||||
    const {code} = await writeObjectOut(data,filePath)
 | 
			
		||||
    console.info(judgeTag, '项目开始 end')
 | 
			
		||||
    if (code === 2300007) {
 | 
			
		||||
      this.isJudgeDisConnect = true;
 | 
			
		||||
@ -629,7 +639,7 @@ export default class Judge {
 | 
			
		||||
        jssj: time
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    const code = await writeObjectOut(data,filePath)
 | 
			
		||||
    const {code} = await writeObjectOut(data,filePath)
 | 
			
		||||
    if (code === 2300007) {
 | 
			
		||||
      this.isJudgeDisConnect = true;
 | 
			
		||||
    }
 | 
			
		||||
@ -666,7 +676,7 @@ export default class Judge {
 | 
			
		||||
        kfsj: time
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    const code = await writeObjectOut(data,filePath);
 | 
			
		||||
    const {code} = await writeObjectOut(data,filePath);
 | 
			
		||||
    if (code === 2300007) {
 | 
			
		||||
      this.isJudgeDisConnect = true
 | 
			
		||||
    }
 | 
			
		||||
@ -700,7 +710,7 @@ export default class Judge {
 | 
			
		||||
        ksdd: encodeURI(ksdd)
 | 
			
		||||
      }
 | 
			
		||||
    };
 | 
			
		||||
    const code = await writeObjectOut(data,filePath);
 | 
			
		||||
    const {code} = await writeObjectOut(data,filePath);
 | 
			
		||||
    if (code === 2300007) {
 | 
			
		||||
      this.isJudgeDisConnect = true
 | 
			
		||||
    }
 | 
			
		||||
@ -714,27 +724,25 @@ export default class Judge {
 | 
			
		||||
    const {xmdm,code,type} = sound;
 | 
			
		||||
    //判断是不是模拟灯光语音
 | 
			
		||||
    if (type == 1) {
 | 
			
		||||
      // console.info(judgeTag, '模拟灯光开始播放:' + code)
 | 
			
		||||
      avPlayer.playAudio([`voice/${code}.mp3`], false, () => {
 | 
			
		||||
          examJudgeSoundEnd({
 | 
			
		||||
            itemno: xmdm, code, type
 | 
			
		||||
          })
 | 
			
		||||
          fileLog.setExamJudgeData({
 | 
			
		||||
            method: 'examJudgeSoundEnd',
 | 
			
		||||
            itemno: xmdm,
 | 
			
		||||
            code,
 | 
			
		||||
            type,
 | 
			
		||||
          })
 | 
			
		||||
      })
 | 
			
		||||
    }else{
 | 
			
		||||
      avPlayer.playAudio([`voice/${code}.mp3`])
 | 
			
		||||
    }
 | 
			
		||||
    avPlayer.playAudio([`voice/${code}.mp3`], false, () => {
 | 
			
		||||
      if (type == 1) {
 | 
			
		||||
        // console.info(judgeTag, '播放结束:' + code)
 | 
			
		||||
        examJudgeSoundEnd({
 | 
			
		||||
          itemno: xmdm, code, type
 | 
			
		||||
        })
 | 
			
		||||
        fileLog.setExamJudgeData({
 | 
			
		||||
          method: 'examJudgeSoundEnd',
 | 
			
		||||
          itemno: xmdm,
 | 
			
		||||
          code,
 | 
			
		||||
          type,
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 校验考试是否结束
 | 
			
		||||
  checkExamIsEnd = async (isManual?: boolean) => {
 | 
			
		||||
    const {judgeUI,avPlayer,isExamEnd,} = this;
 | 
			
		||||
    const {judgeUI,avPlayer,isExamEnd,isEndTip} = this;
 | 
			
		||||
    const {isAllProjectsEnd,examSubject,singlePlay,totalScore,judgeConfigObj,passingScore} = judgeUI;
 | 
			
		||||
 | 
			
		||||
    if (isExamEnd) {
 | 
			
		||||
@ -773,12 +781,18 @@ export default class Judge {
 | 
			
		||||
          return
 | 
			
		||||
        }
 | 
			
		||||
        //成绩合格
 | 
			
		||||
        if (isAllProjectsEnd && totalScore >= passingGrade) {
 | 
			
		||||
        if (isAllProjectsEnd && totalScore >= passingGrade && isEndTip) {
 | 
			
		||||
          const param302 = judgeConfigObj['302'];
 | 
			
		||||
          if (examSubject == 3 && (param302 != 6 || param302 != 7 || param302 != 8)) {
 | 
			
		||||
            avPlayer.playAudio(['voice/综合评判.mp3'])
 | 
			
		||||
            this.judgeUI.isDeductedPopShow = true
 | 
			
		||||
            this.judgeUI.defaultTabIndex = 1
 | 
			
		||||
          const param342 = judgeConfigObj['342'];
 | 
			
		||||
          const param512 = (judgeUI.judgeConfigObj['512'] || '').split(',');
 | 
			
		||||
          if (examSubject == 3 && param342 != 0 && (param302 != 6 || param302 != 7 || param302 != 8)) {
 | 
			
		||||
            if(param512[7] != 0){
 | 
			
		||||
              avPlayer.playAudio(['voice/综合评判.mp3'])
 | 
			
		||||
              this.judgeUI.isDeductedPopShow = true
 | 
			
		||||
              this.judgeUI.defaultTabIndex = 1
 | 
			
		||||
              this.isEndTip = true
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
          } else {
 | 
			
		||||
            await examJudgeEndExam()
 | 
			
		||||
            this.isExamEnd = true
 | 
			
		||||
@ -794,20 +808,23 @@ export default class Judge {
 | 
			
		||||
    this.judgeUI.endPopupVisible = false;
 | 
			
		||||
    this.judgeUI.isDeductedPopShow = false;
 | 
			
		||||
 | 
			
		||||
    console.info(judgeTag,1)
 | 
			
		||||
    const {qjjl,dcjl} = ksjs
 | 
			
		||||
    const {judgeUI,endExam,handleSEP,kfArr,avPlayer,judgeTask,isManual} = this;
 | 
			
		||||
    const {judgeConfigObj,examSubject,isAllProjectsEnd,totalScore,passingScore} = judgeUI;
 | 
			
		||||
    //计算考试分数
 | 
			
		||||
    console.info(judgeTag,2)
 | 
			
		||||
    this.judgeUI.totalScore = isAllProjectsEnd ? totalScore : 0;
 | 
			
		||||
    const singlePlay = globalThis.singlePlay
 | 
			
		||||
    const param302 = judgeConfigObj['302'];
 | 
			
		||||
    globalThis.windowClass.setWindowSystemBarEnable(['navigation'])
 | 
			
		||||
 | 
			
		||||
    console.info(judgeTag,3)
 | 
			
		||||
    //自动退出待验证并且不合格
 | 
			
		||||
    if (!isManual && examSubject == 3 && (param302 == 1 || (singlePlay && param302 == 2)) && totalScore < passingScore) {
 | 
			
		||||
      avPlayer.playAudio([`voice/考试结束.mp3`])
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    console.info(judgeTag,4)
 | 
			
		||||
    //联网模式下手动结束的直接退出
 | 
			
		||||
    if (!singlePlay && isManual && !isAllProjectsEnd) {
 | 
			
		||||
      avPlayer.playAudio(['voice/empty.mp3'], true, () => {
 | 
			
		||||
@ -815,18 +832,21 @@ export default class Judge {
 | 
			
		||||
      })
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    console.info(judgeTag,5)
 | 
			
		||||
    if (examSubject == 3) {
 | 
			
		||||
      const param302 = judgeConfigObj['302'];
 | 
			
		||||
      if (totalScore < passingScore) {
 | 
			
		||||
        //考试不合格;考试模式,自动退出;
 | 
			
		||||
        if (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8) {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        //考试合格
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    console.info(judgeTag,6)
 | 
			
		||||
    await handleSEP(306);
 | 
			
		||||
    console.info(judgeTag,7)
 | 
			
		||||
    avPlayer.playAudio(['voice/exam_waiting.mp3'], true, async () => {
 | 
			
		||||
      try {
 | 
			
		||||
        if (!singlePlay) {
 | 
			
		||||
@ -837,6 +857,7 @@ export default class Judge {
 | 
			
		||||
        //TODO endExam函数逻辑待验证
 | 
			
		||||
        await endExam()
 | 
			
		||||
      } catch (e) {
 | 
			
		||||
        console.info(judgeTag,JSON.stringify(e))
 | 
			
		||||
        // setTimeout(() => {
 | 
			
		||||
        //   // avPlayer.avPlayerStop();
 | 
			
		||||
        //   router.back();
 | 
			
		||||
@ -873,8 +894,8 @@ export default class Judge {
 | 
			
		||||
        dwlc: [d1,d2,d3,d4,d5].map((d,index) => `${index},${Math.floor(d /100)}`).join(';'),
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    const code = await writeObjectOut(data,filePath);
 | 
			
		||||
    promptWxCode('17C56', code)
 | 
			
		||||
    const temp = await writeObjectOut(data,filePath);
 | 
			
		||||
    promptWxCode('17C56', temp.code)
 | 
			
		||||
    console.info(judgeTag, '考试结束 end')
 | 
			
		||||
    const param302 = judgeConfigObj['302'];
 | 
			
		||||
    judgeUI.loadingPopupVisible = true;
 | 
			
		||||
@ -897,7 +918,9 @@ export default class Judge {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    console.info(judgeTag, `考试成绩:${totalScore}`)
 | 
			
		||||
    await uploadProgressData();
 | 
			
		||||
    if(!singlePlay){
 | 
			
		||||
      await uploadProgressData();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //语音播放扣分项
 | 
			
		||||
    let score = 0;
 | 
			
		||||
@ -923,7 +946,7 @@ export default class Judge {
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
        } catch (e) {
 | 
			
		||||
 | 
			
		||||
          console.info(judgeTag,JSON.stringify(e))
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
@ -1059,8 +1082,12 @@ export default class Judge {
 | 
			
		||||
 | 
			
		||||
  getSbbm = (ksxm, xmxh) => {
 | 
			
		||||
    const {judgeUI} = this;
 | 
			
		||||
    const {cdsbInfoObj,projectsObj} = judgeUI;
 | 
			
		||||
    const {cdsbInfoObj,projectsObj,examSubject} = judgeUI;
 | 
			
		||||
    const project = projectsObj[ksxm]
 | 
			
		||||
    //科目三不需要
 | 
			
		||||
    if(examSubject == 3){
 | 
			
		||||
      return undefined
 | 
			
		||||
    }
 | 
			
		||||
    if (project === undefined) {
 | 
			
		||||
      return '00000000'
 | 
			
		||||
    }
 | 
			
		||||
@ -1280,6 +1307,7 @@ export default class Judge {
 | 
			
		||||
 | 
			
		||||
    return tempData
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // 处理轨迹plc信号
 | 
			
		||||
  handleTrajectoryUdp = async (strArr) => {
 | 
			
		||||
    const {fileLog,setJudgeItem,setJudgeMark,endExam} = this;
 | 
			
		||||
@ -1290,7 +1318,9 @@ export default class Judge {
 | 
			
		||||
        console.info(judgeTag, '模拟数据考试结束')
 | 
			
		||||
        globalThis.windowClass.setWindowSystemBarEnable(['navigation'])
 | 
			
		||||
        clearInterval(judgeTimer)
 | 
			
		||||
        this.checkExamIsEnd(true)
 | 
			
		||||
        await examJudgeEndExam()
 | 
			
		||||
        this.isExamEnd = true
 | 
			
		||||
        this.isManual = true
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
      const msg = JSON.parse(strArr[num]);
 | 
			
		||||
@ -1310,7 +1340,7 @@ export default class Judge {
 | 
			
		||||
      }
 | 
			
		||||
      await examJudgeRealExam(msg)
 | 
			
		||||
      num++
 | 
			
		||||
    }, 200)
 | 
			
		||||
    }, 50)
 | 
			
		||||
    globalThis.judgeTimer = judgeTimer;
 | 
			
		||||
  }
 | 
			
		||||
  // 统计必考项目、所有项目、已考数量
 | 
			
		||||
@ -1324,7 +1354,6 @@ export default class Judge {
 | 
			
		||||
    let allProjectNum = 0, allEndProjectsNum = 0;
 | 
			
		||||
    Reflect.ownKeys(projectsObj).forEach(projectKey => {
 | 
			
		||||
      const {type,isRequired} = projectsObj[projectKey];
 | 
			
		||||
 | 
			
		||||
      allProjectNum += 1;
 | 
			
		||||
      if (type == 3 || type == 4) {
 | 
			
		||||
        allEndProjectsNum += 1;
 | 
			
		||||
@ -1336,8 +1365,9 @@ export default class Judge {
 | 
			
		||||
          endProjectsNum += 1;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    })
 | 
			
		||||
    console.info(judgeTag,'必考项目数量:' + projectNum)
 | 
			
		||||
    console.info(judgeTag,'必考项目已考数量:' + endProjectsNum)
 | 
			
		||||
    //必考项目除靠边停车是否全部完成
 | 
			
		||||
    this.judgeUI.isRequiredProjectsEnd = (projectNum - endProjectsNum === 0)
 | 
			
		||||
    this.judgeUI.isAllProjectsEnd = (allProjectNum - allEndProjectsNum === 0)
 | 
			
		||||
@ -1384,6 +1414,7 @@ export default class Judge {
 | 
			
		||||
  private judgeTask: JudgeTask
 | 
			
		||||
  private tempData: any
 | 
			
		||||
  private performInfo: any
 | 
			
		||||
  private isEndTip:boolean = false;
 | 
			
		||||
  private ksjs: {
 | 
			
		||||
    // 累计前进距离
 | 
			
		||||
    qjjl: number,
 | 
			
		||||
 | 
			
		||||
@ -136,6 +136,19 @@ export function getKmProjectVoice(
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//获取科目三取消项目语音
 | 
			
		||||
export function getKmProjectCancelVoice(projectCode){
 | 
			
		||||
  switch (projectCode*1){
 | 
			
		||||
  //变更车道
 | 
			
		||||
    case 40500: return 405004
 | 
			
		||||
  //加减档
 | 
			
		||||
    case 40400: return 404004
 | 
			
		||||
  //超车
 | 
			
		||||
    case 41400: return 414004
 | 
			
		||||
    default :return 'empty'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
// 上传监管数据code转换
 | 
			
		||||
export function promptWxCode(
 | 
			
		||||
    jkid:'17C52' | '17C54' |'17C55' | '17C53' | '17C56',
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,8 @@ export const judgeConfig = {
 | 
			
		||||
  isPhotoOpen: true,
 | 
			
		||||
  //扣分语音是否强制开启
 | 
			
		||||
  kfVoiceOpen: true,
 | 
			
		||||
  //忽略的考试项目
 | 
			
		||||
  ignoreProjects:[41],
 | 
			
		||||
  // 是否忽略考试前熄火、车门检查
 | 
			
		||||
  isCheckFireOpen: true,
 | 
			
		||||
  //是否开启Udp
 | 
			
		||||
@ -14,7 +16,7 @@ export const judgeConfig = {
 | 
			
		||||
  // 本地模型地址
 | 
			
		||||
  modelPath: 'models/model_enc',
 | 
			
		||||
  // 济南科目三
 | 
			
		||||
  trajectoryPath: 'logs/2024_08_07/2024_08_07_11_35_39_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt',
 | 
			
		||||
  trajectoryPath: 'logs/2024_08_10/2024_08_10_14_24_20_0000000000001_342323199501470011_测试学员1/judge_exam_data.txt',
 | 
			
		||||
  //四合一画面配置
 | 
			
		||||
  fourInOneScreen:{
 | 
			
		||||
    //gps位数
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,7 @@ export default class JudgeImg {
 | 
			
		||||
    setTimeout(async ()=>{
 | 
			
		||||
      console.info(judgeTag,'1.进入评判入口')
 | 
			
		||||
      await examJudgeMapSetParam(640, 480); //设置参数宽、高
 | 
			
		||||
      await examJudgeMapSetScaling(120); //设置缩放比例,一般默认填100(就是100%的意思) ,数字越大视野越大,数字越小视野越小,不能为0
 | 
			
		||||
      await examJudgeMapSetScaling(100); //设置缩放比例,一般默认填100(就是100%的意思) ,数字越大视野越大,数字越小视野越小,不能为0
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    judgeUI.draw = true
 | 
			
		||||
 | 
			
		||||
@ -42,17 +42,18 @@ export default class VoiceAnnounce{
 | 
			
		||||
    if(queue.length){
 | 
			
		||||
      //队列续上
 | 
			
		||||
      this.queue = this.queue.concat(tempUrls)
 | 
			
		||||
 | 
			
		||||
      // console.info(TAG,'语音队列开始'+shit + JSON.stringify( this.queue))
 | 
			
		||||
    }else{
 | 
			
		||||
      this.queue = tempUrls
 | 
			
		||||
      // console.info(TAG,'语音队列开始' + shit+JSON.stringify( this.queue))
 | 
			
		||||
      await this.executeQueue()
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async executeQueue(){
 | 
			
		||||
    const avPlayer = new AVPlayer();
 | 
			
		||||
    const go = async () => {
 | 
			
		||||
      const {queue,isStopped,newQueue} = this;
 | 
			
		||||
      const avPlayer = new AVPlayer();
 | 
			
		||||
      if(isStopped){
 | 
			
		||||
        //清空原来队列
 | 
			
		||||
        this.queue = newQueue
 | 
			
		||||
@ -60,16 +61,16 @@ export default class VoiceAnnounce{
 | 
			
		||||
        await go()
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      console.info(TAG,'当前播放队列' + JSON.stringify( queue))
 | 
			
		||||
      await avPlayer.play(queue[0].url,queue[0].callback);
 | 
			
		||||
      this.queue.shift();
 | 
			
		||||
      console.info(TAG,JSON.stringify(this.queue),'堆栈弹出');
 | 
			
		||||
      console.info(TAG,'当前播放队列播放完成退出');
 | 
			
		||||
      avPlayer.avPlayerStop();
 | 
			
		||||
      if(this.queue.length){
 | 
			
		||||
        await go()
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    await go()
 | 
			
		||||
    avPlayer.avPlayerStop();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -116,8 +117,7 @@ class AVPlayer {
 | 
			
		||||
    }catch (e){
 | 
			
		||||
      //检查SD中的语音
 | 
			
		||||
      this.endCallback = callback
 | 
			
		||||
      const avPlayer = await media.createAVPlayer();
 | 
			
		||||
      this.avPlayer = avPlayer;
 | 
			
		||||
      this.avPlayer = await media.createAVPlayer();
 | 
			
		||||
      return new Promise(async (resolve,reject) => {
 | 
			
		||||
        await this.setAVPlayerCallback(()=>{
 | 
			
		||||
          //@ts-ignore
 | 
			
		||||
@ -189,6 +189,7 @@ class AVPlayer {
 | 
			
		||||
          this.avPlayer.prepare()
 | 
			
		||||
          break;
 | 
			
		||||
        case 'prepared': // prepare调用成功后上报该状态机
 | 
			
		||||
          console.info(TAG,'播放资源播放')
 | 
			
		||||
          this.avPlayer.play();
 | 
			
		||||
          this.voiceStatus = 'playing'
 | 
			
		||||
          break;
 | 
			
		||||
@ -199,12 +200,13 @@ class AVPlayer {
 | 
			
		||||
        case 'completed': // 播放结束后触发该状态机上报
 | 
			
		||||
          this.voiceStatus = 'completed'
 | 
			
		||||
          this.avPlayer.stop(); //调用播放结束接口
 | 
			
		||||
          if(endCallback){
 | 
			
		||||
            endCallback()
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case 'stopped': // stop接口成功调用后触发该状态机上报
 | 
			
		||||
          this.avPlayer.reset(); // 调用reset接口初始化avplayer状态
 | 
			
		||||
          console.info(TAG,'播放资源释放')
 | 
			
		||||
          if(endCallback){
 | 
			
		||||
            endCallback()
 | 
			
		||||
          }
 | 
			
		||||
          callBack()
 | 
			
		||||
          break;
 | 
			
		||||
        case 'released':
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/big.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/big.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/small.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/judge/small.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/404004.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/404004.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/点火.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/点火.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请关闭远近光灯.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请拉手刹.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请拉手刹.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请置空档.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请置空档.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请解开安全带.mp3
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								entry/src/main/resources/rawfile/voice/请解开安全带.mp3
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user