258 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | ||
|  * 说明:考试车对象接口
 | ||
|  *
 | ||
|  * 作者: 杨海洋
 | ||
|  * 日期: 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 void 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<ExamItemCode, ISub3JudgeItem*>& 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;
 | ||
| 
 | ||
| 
 | ||
|     //获取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
 |