2024-01-05 11:11:15 +08:00
|
|
|
|
/*
|
|
|
|
|
|
* 说明:考试车对象接口
|
|
|
|
|
|
*
|
|
|
|
|
|
* 作者: 杨海洋
|
|
|
|
|
|
* 日期: 2023-03-20
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef IEXAMCAR_H
|
|
|
|
|
|
#define IEXAMCAR_H
|
|
|
|
|
|
|
|
|
|
|
|
#include "IExamInterface.h"
|
|
|
|
|
|
#include "IExamCarAbstract.h"
|
2024-05-15 16:10:18 +08:00
|
|
|
|
#include "ExamDatagram.h"
|
|
|
|
|
|
#include "ExamHistory.h"
|
|
|
|
|
|
#include "XParser.h"
|
|
|
|
|
|
#include "GraphicImage.h"
|
|
|
|
|
|
#include "ExamSensor.h"
|
|
|
|
|
|
#include "TrackWriter.h"
|
2024-01-05 11:11:15 +08:00
|
|
|
|
|
|
|
|
|
|
class JUDGE_API IExamCar : public IExamInterface, public IExamCarAbstract
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
2024-05-15 16:10:18 +08:00
|
|
|
|
explicit IExamCar();
|
|
|
|
|
|
virtual ~IExamCar();
|
|
|
|
|
|
static IExamCar* create(ExamSubject subject);
|
|
|
|
|
|
static void destroy(IExamCar* & p);
|
2024-01-05 11:11:15 +08:00
|
|
|
|
|
2024-05-15 16:10:18 +08:00
|
|
|
|
//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;
|
2024-07-31 13:47:40 +08:00
|
|
|
|
virtual int examJudgeArtificialMark(int itemno, const char* serial, int type) override;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
virtual int examJudgeArtificialItem(int itemno, int type) override;
|
2024-07-02 09:01:57 +08:00
|
|
|
|
virtual int examJudgeSoundEnd(int itemno, const char* code, int type) override;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
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;
|
2024-07-31 13:47:40 +08:00
|
|
|
|
virtual void createEventExamFinish(ExamFinishType type) override;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
virtual void createEventCancelItem(const TEventCancelItem& event) override;
|
|
|
|
|
|
virtual void createEventSound(const TEventSound& event) override;
|
|
|
|
|
|
virtual void createEventLight(const TEventLight& event) override;
|
2024-07-10 19:39:13 +08:00
|
|
|
|
virtual void createEventLane(const TEventLane& event) override;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
2024-07-31 13:47:40 +08:00
|
|
|
|
virtual ErrorCode examArtifMark(ExamItemCode itemno, const std::string& serial, MarkType type) = 0;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
virtual ErrorCode examArtifItem(ExamItemCode itemno, ArtifItemType type) = 0;
|
2024-07-02 09:01:57 +08:00
|
|
|
|
virtual ErrorCode examSoundEnd(ExamItemCode itemno, const std::string& code, PlaySoundType type) = 0;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
virtual bool examDrawMap() = 0;
|
2024-07-31 13:47:40 +08:00
|
|
|
|
virtual bool examMarkItem(ExamItemCode itemNo, const std::string& serial, bool once=false, bool force=false, bool event=true, MarkType type=MarkTypeAuto) = 0;
|
2024-05-15 16:10:18 +08:00
|
|
|
|
|
|
|
|
|
|
public:
|
2024-07-31 13:47:40 +08:00
|
|
|
|
virtual int examJudgeEndExamFinish();
|
2024-05-15 16:10:18 +08:00
|
|
|
|
//执行处理每一帧的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 = ""; //记录评判相关的一些显示信息,这些信息很重要,比如:直角转弯,未行驶到转弯处
|
|
|
|
|
|
|
2024-05-21 19:45:15 +08:00
|
|
|
|
int m_disForward = 0; //累计前进距离(单位厘米) 老的代码里也叫累计距离, 行驶距离=累计距离-倒车距离
|
|
|
|
|
|
int m_disBackward= 0; //累计倒车距离(单位厘米) 老的代码里也叫倒车距离
|
2024-07-31 13:47:40 +08:00
|
|
|
|
int m_disGears[20]; //档位距离
|
2024-05-15 16:10:18 +08:00
|
|
|
|
|
|
|
|
|
|
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;
|
2024-01-05 11:11:15 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
2024-05-15 16:10:18 +08:00
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-01-05 11:11:15 +08:00
|
|
|
|
#endif // IEXAMCAR_H
|