259 lines
13 KiB
C
Raw Normal View History

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;
virtual int examJudgeArtificialMark(int itemno, const char* serial) override;
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;
virtual void createEventExamFinish(void) override;
virtual void createEventCancelItem(const TEventCancelItem& event) override;
virtual void createEventSound(const TEventSound& event) override;
virtual void createEventLight(const TEventLight& 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) = 0;
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;
public:
//执行处理每一帧的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-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 bool sub2MarkItem(ExamItemCode itemNo, const std::string& serial, bool once, bool force=false, bool event=true) = 0;
//查找考试项目对象
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;
//Kind:0 自动评判 1考车人工扣分 2远程下发的考试扣分
virtual bool Mark(int ItemNo, const std::string& MarkSerial, bool OnlyOneID=false, bool ForceID=false, int8 Kind=0) = 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