subject-two/entry/src/main/cpp/sdk/exam/ExamCarSub3.h
2024-08-12 10:19:31 +08:00

187 lines
8.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 说明: 科目三考试车对象实现类
*
* 作者: 杨海洋
* 日期: 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