187 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*
 | 
						||
 * 说明: 科目三考试车对象实现类
 | 
						||
 *
 | 
						||
 * 作者: 杨海洋
 | 
						||
 * 日期: 2024-02-28
 | 
						||
 */
 | 
						||
 | 
						||
#ifndef EXAMCARSUB3_H
 | 
						||
#define EXAMCARSUB3_H
 | 
						||
 | 
						||
#include "IExamCar.h"
 | 
						||
 | 
						||
//(符合部令要求的科目三可以人工触发的项目)
 | 
						||
//3、直线行驶 4、变更车道 [6、人行横道 7、学校区域  8、公交站台] 9、会车 10、超车、11、靠边停车 12、普通掉头(非路口项目定义的掉头)
 | 
						||
//5、直行路口 15、左转弯 16、右转弯 (南京车管所,这个是不符合部令要求的)
 | 
						||
 | 
						||
class ExamCarSub3 : public IExamCarSub3
 | 
						||
{
 | 
						||
public:
 | 
						||
    explicit ExamCarSub3();
 | 
						||
    virtual ~ExamCarSub3();
 | 
						||
 | 
						||
public:  //for IExamCar override
 | 
						||
    virtual ErrorCode examCarInitInfo(TInitInfo* info) override;
 | 
						||
    virtual ErrorCode examBeginExam() override;
 | 
						||
    virtual ErrorCode examGoonExam() override;
 | 
						||
    virtual ErrorCode examEndExam() override;
 | 
						||
    virtual ErrorCode examJudgeExam() override;
 | 
						||
    virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) override;
 | 
						||
    virtual ErrorCode examArtifItem(ExamItemCode itemno, ArtifItemType type) override;
 | 
						||
    virtual ErrorCode examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) override;
 | 
						||
    virtual bool      examDrawMap() override;
 | 
						||
    virtual bool      examMarkItem(int ItemNo, const std::string& serial, bool once=false, bool force=false, bool event=true, MarkType type=MarkTypeAuto) override;
 | 
						||
 | 
						||
 | 
						||
public:  //for IExamCarSub3 override
 | 
						||
    virtual ISub3JudgeItem* findJudgeItem(ExamItemCode itemNo) const override;
 | 
						||
    virtual TKM3Item*       findExamItem(ExamItemCode itemNo) const override;
 | 
						||
    virtual bool            isExamItem(ExamItemCode itemNo) override;
 | 
						||
    virtual bool            allItemFinish() override;
 | 
						||
    virtual ISub3JudgeItem* currentItem() const noexcept override { return m_curItem; }
 | 
						||
    virtual ISub3JudgeItem* commItem() const noexcept override { return m_commItem; }
 | 
						||
 | 
						||
    virtual const std::map<ExamItemCode, ISub3JudgeItem*>& allExamItem() const noexcept override { return m_sub3Items; }
 | 
						||
    virtual bool isCrossroadExaming() const override;
 | 
						||
    virtual bool itemsNotFinishExcept(ExamItemCode excludeItemNo) const override;
 | 
						||
    virtual bool itemsSomeExaming() const override;
 | 
						||
    virtual bool itemsSomeExaming2(ExamItemCode itemno) const 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; }
 | 
						||
 | 
						||
    virtual int        lastCrossPtNo() override { return m_pub.PubLastChuanYuePtNo; }
 | 
						||
    virtual void       setPUB_JDCC_ZT(int v)  override { m_pub.PUB_JDCC_ZT = v;}
 | 
						||
    virtual int        getPUB_JDCC_ZT() const override { return m_pub.PUB_JDCC_ZT;}
 | 
						||
    virtual void       setChaoChe_Start_TM(int64 v) override { m_pub.ChaoChe_Start_TM = v;}
 | 
						||
    virtual int64      getChaoChe_Start_TM() const override { return m_pub.ChaoChe_Start_TM;}
 | 
						||
    virtual void       setChaoChe_End_TM(int64 v) override { m_pub.ChaoChe_End_TM = v;}
 | 
						||
    virtual int64      getChaoChe_End_TM() const override { return m_pub.ChaoChe_End_TM;}
 | 
						||
    virtual void       setPub_JSC_JL(int v) override { m_pub.Pub_JSC_JL = v;}
 | 
						||
    virtual int        getPub_JSC_JL() const override { return m_pub.Pub_JSC_JL; }
 | 
						||
    virtual void       setNJ_DiaoTou_JL(int v) override { m_pub.NJ_DiaoTou_JL = v; }
 | 
						||
    virtual int        getNJ_DiaoTou_JL() const override { return m_pub.NJ_DiaoTou_JL; }
 | 
						||
    virtual void       setPubCanJudge_XiHuoFlag(bool v) override { m_pub.PubCanJudge_XiHuoFlag = v; }
 | 
						||
    virtual bool       getPubCanJudge_XiHuoFlag() const override { return m_pub.PubCanJudge_XiHuoFlag; }
 | 
						||
    virtual void       setPubKaoBianTCFinish_LJJL(int v) override { m_pub.PubKaoBianTCFinish_LJJL = v; }
 | 
						||
    virtual int        getPubKaoBianTCFinish_LJJL() const override { return m_pub.PubKaoBianTCFinish_LJJL; }
 | 
						||
    virtual void       setKsLjLc(int v)  override { m_pub.m_KsLjLc = v; }
 | 
						||
    virtual int        getKsLjLc() const override { return m_pub.m_KsLjLc; }
 | 
						||
    virtual void       setyjdg_road_code_kf(bool v) override { m_pub.yjdg_road_code_kf = v; }
 | 
						||
    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();
 | 
						||
 | 
						||
    void Deal_KM3_Judge();
 | 
						||
    //{清空评判状态}
 | 
						||
    void ClearRecord();
 | 
						||
    //20、得到当前考车所在的网格区域
 | 
						||
    void GetMeshIndex();
 | 
						||
    //4、路段相关计算 //科目三路段评判
 | 
						||
    void RTKJudge_Road();
 | 
						||
    //路段状况(*车道*)
 | 
						||
    bool RTKLane();
 | 
						||
    //5、形状线计算
 | 
						||
    void RTKJudge_SubItem();
 | 
						||
 | 
						||
    //车身所在车道判断
 | 
						||
    bool addBodyInLane();
 | 
						||
    //计算路段穿越穿越
 | 
						||
    void JudgeCrossLine();
 | 
						||
    //1、车道相关的距离计算
 | 
						||
    void Calc_LaneDistance();
 | 
						||
    //计算车身压线
 | 
						||
    void Calc_CheShenYaXian();
 | 
						||
    //1、根据车型得到考车的车身位置(其实是最靠近车轮的点)kind:1: 车身左1(上) 2:车身右1(上) 3:车身左2(下) 4:车身右2(下)
 | 
						||
    //5、车头中心点  //6、车尾中心点
 | 
						||
    int GetCarBodyPointNo(ExamCarType cartype, int8 kind);
 | 
						||
 | 
						||
    bool DrawKM3Map(int width=IMG_SIZE_WIDTH, int height=IMG_SIZE_HEIGHT);
 | 
						||
    //计算考车显示网格
 | 
						||
    void Calc_CarPosMeshList(int width=IMG_SIZE_WIDTH, int height=IMG_SIZE_HEIGHT);
 | 
						||
    //2、画网格 2、绘制道路 画项目线
 | 
						||
    void RepaintRoad(int width=IMG_SIZE_WIDTH, int height=IMG_SIZE_HEIGHT);
 | 
						||
    void DrawCarSeg(int Pt1No, int Pt2No, int width, int height, int dx, int dy);
 | 
						||
    //4、画弧 如果是 C++,那么TCanvas应该是引用传递 TCanvas &CurrentCanvas
 | 
						||
    void DrawArc(int X1, int Y1, int X2, int Y2, int X3, int Y3, int X4, int Y4, int step, double width, double height);
 | 
						||
    void DrawArc(const Pointi& p1,const Pointi& p2, const Pointi& p3, const Pointi& p4, int step, double width, double height);
 | 
						||
    RgbColor GetLineColor(int imode);
 | 
						||
 | 
						||
    //5、距离CM换算成GPS的度  //Len_cm单位是厘米  enid- True:gps_e False:gps_n  返回:GPS度*10^6
 | 
						||
    int JLcm2GpsDeg(int Len_cm, bool enid);
 | 
						||
    //6、将GPS经纬度加1个范围 RangeLen单位是厘米  e_n_value经纬度*1000000 如:118123456 enid- True:gps_e False:gps_n
 | 
						||
    int Range_cm2Gpsdeg(int RangeLen, int e_n_value, bool enid);
 | 
						||
    //计算两点距离
 | 
						||
    int PointGpsDistance(const Pointi& p1, const Pointi& p2) const;
 | 
						||
    //判断穿越方向
 | 
						||
    bool LastPanDuan(const Pointi& CurrentPos, const Pointi& PrePos, const Pointi& FuZhuPos, double a1, double B1, double C1, std::string& sError);
 | 
						||
    //根据点,生成经纬度记录,需把点的X,Y都除以10^6
 | 
						||
    //计算实际距离,单位厘米 (根据GPS距离缩放比例),
 | 
						||
    //根据转换为整数的当前坐标点,先前的坐标点,基准坐标点,辅助坐标点,计算是否满足进项目的条件
 | 
						||
    //JL_Cm 输入:基准点范围距离(厘米) 输出:基准点与交点实际距离(厘米)
 | 
						||
    bool IsGpsPassPoint(Point& CurrentPos, Point& PrePos, Point& BasPos, Point& FuZhuPos,
 | 
						||
                        bool Dir_FuZhuToBase, std::string& sError, int& JL_Cm);
 | 
						||
 | 
						||
    //1、科目三读卡进项目(只实现标准的读卡进项目,个性化的需求忽略)
 | 
						||
    void Km3NewEnterItem();
 | 
						||
    void ReadItemByPoint(int crossPointNo);
 | 
						||
    bool IsValid_Km3NewEnterItem(int ItemNo, const std::string& ItemSNo);
 | 
						||
    //科目三全部完成
 | 
						||
    bool KM3AllPass();
 | 
						||
    //结束当前项目
 | 
						||
    virtual void KM3EndItem(int ItemNo) override;
 | 
						||
    //人工进项目 //(*2024-03-06*)
 | 
						||
    bool CallRenGongEnterItem(int ItemNo);
 | 
						||
    bool CallRenGongCancelItem(int ItemNo);
 | 
						||
    bool CallRenGongEndItem(int ItemNo);
 | 
						||
    //(*2024-03-06*)
 | 
						||
    bool If_EnterItem(int ItemNo);
 | 
						||
    bool ManualStartItem(int ItemNo);
 | 
						||
 | 
						||
private:
 | 
						||
    ISub3JudgeItem* m_commItem = nullptr;
 | 
						||
    ISub3JudgeItem* m_curItem  = nullptr;
 | 
						||
    std::map<ExamItemCode, ISub3JudgeItem*> m_sub3Items;
 | 
						||
    //std::map<ExamItemCode, TKM3Item*> m_itemsExam; //科目三考试项目
 | 
						||
    int m_meshIndex = INVALID_INDEX;
 | 
						||
 | 
						||
    TCar m_car;
 | 
						||
    TTestCtl m_ctl;
 | 
						||
    TPubKM3 m_pub;
 | 
						||
 | 
						||
    std::vector<int> m_carPosMeshList;
 | 
						||
    const int m_DrawArc_Step = 40;
 | 
						||
 | 
						||
    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
 | 
						||
    //bool m_BContinued = false; //是否是续考  20150205
 | 
						||
    //int m_ContinuedSjjg = 0; //续考时间间隔多少秒  20150205
 | 
						||
    //bool FinishKM3Flag = false;
 | 
						||
    //int Test_Status; //考试中状态 0-考试中 1-考试结束,评判不继续 2-考试结束,继续评判(一般用于训练)
 | 
						||
    //int64 m_StartTime = 0;
 | 
						||
 | 
						||
};
 | 
						||
 | 
						||
#endif // EXAMCARSUB3_H
 |