/* * 说明: 科目三考试车对象实现类 * * 作者: 杨海洋 * 日期: 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& 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 m_sub3Items; //std::map m_itemsExam; //科目三考试项目 int m_meshIndex = INVALID_INDEX; TCar m_car; TTestCtl m_ctl; TPubKM3 m_pub; std::vector 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