/* * 说明:考试车对象接口 * * 作者: 杨海洋 * 日期: 2023-03-20 */ #ifndef IEXAMCAR_H #define IEXAMCAR_H #include "IExamInterface.h" #include "IExamCarAbstract.h" #include "ExamDatagram.h" #include "ExamHistory.h" #include "XParser.h" #include "GraphicImage.h" #include "ExamSensor.h" #include "TrackWriter.h" class JUDGE_API IExamCar : public IExamInterface, public IExamCarAbstract { public: explicit IExamCar(); virtual ~IExamCar(); static IExamCar* create(ExamSubject subject); static void destroy(IExamCar* & p); //override for IExamInterface virtual int examJudgeBeginExam(const char* data, int len) override; virtual int examJudgeEndExam() override; virtual int examJudgeRealExam(const char* data, int len) override; virtual int examJudgeRealExam2(const char* data, int len) override; virtual int examJudgeArtificialMark(int itemno, const char* serial, int type) override; virtual int examJudgeArtificialItem(int itemno, int type) override; virtual int examJudgeSoundEnd(int itemno, const char* code, int type) override; virtual const char* examJudgeTrackFile() override; virtual int examJudgeMapSetParam(int width, int height) override; virtual int examJudgeMapSetScaling(int scaling) override; virtual int examJudgeMapSetDrawing(bool drawing) override; virtual const char* examJudgeMapImage() override; virtual int examJudgeMapWidth() override; virtual int examJudgeMapHeight() override; virtual int examJudgeMapSize() override; public: //override for IExamCarAbstract virtual void createEventEnterItem(const TEventEnterItem& event) override; virtual void createEventFinishItem(const TEventFinishItem& event) override; virtual void createEventMarkItem(const TEventItemMark& event) override; virtual void createEventMoveState(const TEventCarMove& event) override; virtual void createEventExamFinish(ExamFinishType type) override; virtual void createEventCancelItem(const TEventCancelItem& event) override; virtual void createEventSound(const TEventSound& event) override; virtual void createEventLight(const TEventLight& event) override; virtual void createEventLane(const TEventLane& event) override; virtual void examPerformSummary() override; virtual int historyNumber() MEANS { return m_history->number(); } virtual int historyCount() MEANS { return m_history->size(); } virtual TChuanGan* historyChuanGan(int his=0) MEANS { return (*m_history)[his]; } virtual const TGPSPoints& historyCarPoints(int his=0) MEANS { return (*m_history)[his]->body.points_a; } virtual const TGPSPoint& historyCarBody(int idx, int his=0) MEANS { return (*m_history)[his]->body.points_a[idx]; } virtual const TRealExam& historyRealExam(int his=0) MEANS { return (*m_history)[his]->real; } virtual const TGpsInfo& historyGps(int his=0) MEANS { return (*m_history)[his]->real.gps; } virtual const TGpsInfo& historyGps2(int his=0) MEANS { return (*m_history)[his]->real.gps2; } virtual const Pointi& historyAiGps(int his=0) MEANS { return (*m_history)[his]->real.gps.ai_gps; } virtual const TSensorInfo& historySensor(int his=0) MEANS { return (*m_history)[his]->real.sensor; } virtual const TVisionInfo& historyVision(int his=0) MEANS { return (*m_history)[his]->real.vision; } virtual const TRadarInfo& historyRadar(int his=0) MEANS { return (*m_history)[his]->real.radar; } virtual const TExtendInfo& historyExtend(int his=0) MEANS { return (*m_history)[his]->real.extend; } virtual const TGPSRect& historyGpsRect(int his=0) MEANS { return (*m_history)[his]->rect; } virtual const TGPSPoint& historyGpsCenter(int his=0) MEANS { return (*m_history)[his]->center; } virtual const CarMoveState& historyMoveState(int his=0) MEANS { return (*m_history)[his]->move; } virtual int historyGears(int his=0) MEANS { return (*m_history)[his]->real.sensor.dw; } virtual bool rtkEnabled(int his=0) MEANS { return (*m_history)[his]->real.gps.rtkEnabled; } virtual bool errorFlag(int his=0) MEANS { return (*m_history)[his]->real.gps.errorFlag; } virtual TGPSLine currentLine(int his1, int his2) MEANS { return {historyCarBody(his1), historyCarBody(his2)}; } virtual TGPSLine currentLine(const PointPair& is) MEANS { return currentLine(is.first, is.second); } virtual TGPSLine historyLine(int idx, int his) MEANS { return {historyCarBody(idx,0), historyCarBody(idx,his)}; } virtual IGraphicAbstract* graphic() MEANS { return m_graphic; } virtual ExamSensor* sensor() MEANS { return m_sensor; } virtual ISurveyCarAbstract* carModel() MEANS { return m_carModel; } virtual int modelSize() MEANS { return m_carModel->size(); } virtual ExamSubject examSubject() MEANS { return ExamSubject(m_carInfo->kskm); } virtual const TStuInfo& stuInfo() MEANS { return m_stuInfo; } virtual const std::string& stuName() MEANS { return m_stuInfo.xm; } virtual const std::string& stuID() MEANS { return m_stuInfo.sfzmhm; } virtual bool isReplay() MEANS { return m_stuInfo.replay; } virtual const std::string& target() MEANS { return m_target; } virtual ExamState examState() MEANS { return m_examState; } virtual ExamCarType carType() MEANS { return m_carModel->carType(); } virtual const std::string& carType2() MEANS { return m_carInfo->kscx; } virtual int carID() MEANS { return m_carInfo->kchm; } virtual int grade() MEANS { return m_grade; } virtual int gradePass() MEANS { return m_gradePass; } virtual int disForward() MEANS { return m_disForward; } virtual int disBackward() MEANS { return m_disBackward; } virtual int disTravel() MEANS { return m_disForward - m_disBackward; } virtual bool isQualified() MEANS { return m_grade >= m_gradePass; } virtual bool isExamMode() MEANS { return m_stuInfo.exam == examModeExam; } virtual bool isExamDrill() MEANS { return m_stuInfo.exam == examModeDrill; } virtual bool canContinueExam() MEANS { return isQualified() || isExamDrill(); } virtual const ExamItemCodes& getExamItemCodes() MEANS { return m_codes; } virtual int64 timeBegin() MEANS { return m_timeBegin; } virtual int64 elapsedLastTime() MEANS { return GetCurrentTime2() - m_timeBegin; } public: virtual ErrorCode examCarInitInfo(TInitInfo* info) = 0; virtual ErrorCode examBeginExam() = 0; virtual ErrorCode examGoonExam() = 0; virtual ErrorCode examEndExam() = 0; virtual ErrorCode examJudgeExam() = 0; virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) = 0; virtual ErrorCode examArtifItem(ExamItemCode itemno, ArtifItemType type) = 0; virtual ErrorCode examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) = 0; virtual bool examDrawMap() = 0; virtual bool examMarkItem(ExamItemCode itemNo, const std::string& serial, bool once=false, bool force=false, bool event=true, MarkType type=MarkTypeAuto) = 0; public: virtual int examJudgeEndExamFinish(); //执行处理每一帧的GPS传感数据 virtual void doExamDatagram(Package* pkg); //前进 后退 距离计算 virtual int calcDistance(); //当前系统时间(回放取的事GPS时间) virtual int64 GetCurrentTime2() const; //当前开机时刻经过的时间(回放取的事GPS时间) virtual int64 GetCurrentTick2() const; protected: TInitInfo* m_carInfo = nullptr; //考车初始化数据 TStuInfo m_stuInfo; //考生信息 IGraphicAbstract* m_graphic = nullptr; //绘制轨迹类 XIParser* m_parser = nullptr; //解析协议参数类 ExamDatagram* m_handle = nullptr; //数据报文 ExamSensor* m_sensor = nullptr; //接收到的传感数据加工预处理 ExamHistory* m_history = nullptr; //考试实时历史数据管理 TChuanGan* m_cg = nullptr; //当前最新一帧传感数据 ExamState m_examState = examStateEnd; //考试状态 std::string m_message = ""; //记录评判相关的一些显示信息,这些信息很重要,比如:直角转弯,未行驶到转弯处 int m_disForward = 0; //累计前进距离(单位厘米) 老的代码里也叫累计距离, 行驶距离=累计距离-倒车距离 int m_disBackward= 0; //累计倒车距离(单位厘米) 老的代码里也叫倒车距离 int m_disGears[20]; //档位距离 int m_grade = 0; //当前得分 int m_gradePass = 0; //考试及格分数 int64 m_timeBegin = 0; //开始时间(毫秒) int64 m_timeEnd = 0; //结束时间(毫秒) TMarkInfos m_marks = {}; //具体的扣分信息 TrackWriter* m_track = nullptr; bool m_drawing = false; IMutex m_mtx; std::string m_target = ""; //std::string m_ksdd = ""; //考试地点(考试地点参数) TimerPool::Ptr m_timer = nullptr; ISurveyCarAbstract* m_carModel = nullptr; ExamItemCodes m_codes; }; class JUDGE_API IExamCarSub2 : public IExamCar { public: explicit IExamCarSub2() = default; virtual ~IExamCarSub2() = default; //查找考试项目对象 virtual IExamItem* findExamItem(ExamItemCode itemNo) = 0; //是否是需要考试项目 virtual bool isExamItem(ExamItemCode itemNo) = 0; //所有项目是否都已经做完 virtual bool allItemFinish() = 0; //当前项目对象,如果返回NULL就是不在项目里 virtual ISub2JudgeItem* currentItem() const = 0; //通用评判项目对象,只要是考试状态不会是NULL virtual ISub2JudgeItem* commItem() const = 0; }; class JUDGE_API IExamCarSub3 : public IExamCar { public: explicit IExamCarSub3() = default; virtual ~IExamCarSub3() = default; virtual const TRTKResult& historyRtkKM3(int his=0) const { return (*m_history)[his]->RTKKM3; } virtual int wayNo() const { return m_stuInfo.wayno; } virtual ISub3JudgeItem* findJudgeItem(ExamItemCode itemNo) const = 0; virtual TKM3Item* findExamItem(ExamItemCode itemNo) const = 0; virtual bool isExamItem(ExamItemCode itemNo) = 0; virtual bool allItemFinish() = 0; //当前项目对象,如果返回NULL就是不在项目里 virtual ISub3JudgeItem* currentItem() const = 0; //通用评判项目对象,只要是考试状态不会是NULL virtual ISub3JudgeItem* commItem() const = 0; virtual const std::map& allExamItem() const = 0; //路口项目是否正考,如果路口项目没有结束 virtual bool isCrossroadExaming() const = 0; //检查是否有未做的项目,除了excludeItemNo virtual bool itemsNotFinishExcept(ExamItemCode excludeItemNo) const = 0; //是否有项目没结束(有未考和正考的) virtual bool itemsSomeExaming() const = 0; //是否有项目没结束(有未考和正考的) virtual bool itemsSomeExaming2(ExamItemCode itemno) const = 0; //是否已考 virtual bool isExamAlready(ExamItemCode ItemNo) const = 0; //里程是否满足 virtual bool isMileage() const = 0; //获取TCar virtual TCar* getTCar() = 0; //获取TTestCtl virtual TTestCtl* getTTestCtl() = 0; //最后一次经过的点 virtual int lastCrossPtNo() = 0; virtual void setNJ_DiaoTou_JL(int v) = 0; virtual int getNJ_DiaoTou_JL() const = 0; virtual void setChaoChe_Start_TM(int64 v) = 0; virtual int64 getChaoChe_Start_TM() const = 0; virtual void setChaoChe_End_TM(int64 v) = 0; virtual int64 getChaoChe_End_TM() const = 0; virtual void setPUB_JDCC_ZT(int v) = 0; virtual int getPUB_JDCC_ZT() const = 0; virtual void setPub_JSC_JL(int v) = 0; virtual int getPub_JSC_JL() const = 0; virtual void setPubCanJudge_XiHuoFlag(bool v) = 0; virtual bool getPubCanJudge_XiHuoFlag() const = 0; virtual void setPubKaoBianTCFinish_LJJL(int v) = 0; virtual int getPubKaoBianTCFinish_LJJL() const = 0; virtual void setKsLjLc(int v) = 0; virtual int getKsLjLc() const = 0; virtual void setyjdg_road_code_kf(bool v) = 0; virtual bool getyjdg_road_code_kf() const = 0; //结束当前项目 virtual void KM3EndItem(int ItemNo) = 0; }; #endif // IEXAMCAR_H