283 lines
15 KiB
C
Raw Normal View History

2025-03-26 16:56:51 +08:00
/*
*
*
* :
* : 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"
#include "ExamCarSub3New.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 examJudgeRealVision(int type, const char* data, int len) override;
virtual int examJudgeRealRadar(int type, 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 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 createEventPrecastItem(const TEventPrecastItem& event) override;
virtual void createEventNonGps(const TEventNonGps& 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 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 bool rtkEnabled2(int his=0) MEANS { return (*m_history)[his]->real.gps2.rtkEnabled; }
virtual bool errorFlag2(int his=0) MEANS { return (*m_history)[his]->real.gps2.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); }
2025-05-14 14:19:43 +08:00
virtual const std::string& carVerison() MEANS { return m_carInfo->sdkver; }
2025-03-26 16:56:51 +08:00
virtual int carID() MEANS { return m_carInfo->kchm; }
virtual const std::string& carClass() MEANS { return m_carInfo->name; }
virtual int carCode() MEANS { return m_carCode; }
virtual ExamCarType carType() MEANS { return m_carModel->carType(); }
virtual const std::string& carType2() MEANS { return m_carInfo->kscx; }
virtual const TStuInfo& stuInfo() MEANS { return m_stuInfo; }
virtual const std::string& stuID() MEANS { return m_stuInfo.sfzmhm; }
virtual const std::string& stuName() MEANS { return m_stuInfo.xm; }
virtual int stuKkcs() MEANS { return m_stuInfo.kkcs; }
virtual bool isSfyk() MEANS { return m_stuInfo.sfyk == 1; }
virtual bool isReplay() MEANS { return m_stuInfo.replay == 1; }
virtual const std::string& target() MEANS { return m_target; }
virtual ExamState examState() MEANS { return m_examState; }
virtual int grade() MEANS { return m_grade; }
virtual int gradePass() MEANS { return m_stuInfo.passing; }
virtual int disKsLjLc() MEANS { return m_disForward + m_disOffset; }
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_stuInfo.passing; }
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 bool examAlready(ExamItemCode itemno) MEANS { for(size_t i = 0; i < m_stuInfo.ykxm.size(); i++) {if(itemno == m_stuInfo.ykxm[i]){return true;}} return false;}
virtual int64 timeBegin() MEANS { return m_timeBegin; }
virtual int64 timeElapsed() MEANS { return GetCurrentTime2() - m_timeBegin; }
public:
virtual ErrorCode examCarInitInfo(TInitInfo* info) = 0;
virtual ErrorCode examBeginExam() = 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 doExamRealExam(Package* pkg);
virtual void doExamNS3(Package* pkg){};
//前进 后退 距离计算
2025-04-16 14:24:53 +08:00
virtual int calcDistance(bool mc, int X_McH);
2025-03-26 16:56:51 +08:00
//当前系统时间回放取的事GPS时间
virtual int64 GetCurrentTime2() const;
//当前开机时刻经过的时间回放取的事GPS时间
virtual int64 GetCurrentTick2() const;
protected:
TInitInfo* m_carInfo = nullptr; //考车初始化数据
TStuInfo m_stuInfo; //考生信息
int m_carCode = INVALID_INDEX; //车型代码(车型号)
IGraphicAbstract* m_graphic = nullptr; //绘制轨迹类
ExamDatagram* m_handle = nullptr; //数据报文
ExamSensor* m_sensor = nullptr; //接收到的传感数据加工预处理
ExamHistoryChuan* m_history = nullptr; //考试实时历史数据管理
TChuanGan* m_cg = nullptr; //当前最新一帧传感数据
ExamState m_examState = examStateEnd; //考试状态
std::string m_message = ""; //记录评判相关的一些显示信息,这些信息很重要,比如:直角转弯,未行驶到转弯处
int m_disOffset = 0; //补偿距离(单位厘米目前科三用)
int m_disForward = 0; //累计前进距离(单位厘米) 老的代码里也叫累计距离, 行驶距离=累计距离-倒车距离
int m_disBackward= 0; //累计倒车距离(单位厘米) 老的代码里也叫倒车距离
int m_disGears[20]; //档位距离
int m_grade = 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 = "";
TimerPool::Ptr m_timer = nullptr;
ISurveyCarAbstract* m_carModel = nullptr;
ExamItemCodes m_codes;
int64 m_nonflag = 0; //异常GPS上报相关
int64 m_nontime = 0;
TGpsInfo m_nongps;
};
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;
//播放下一个项目语音
virtual void playNextItemSound(ExamItemCode curItemNo) = 0;
};
class JUDGE_API IExamCarSub3 : public IExamCar
{
public:
explicit IExamCarSub3() = default;
virtual ~IExamCarSub3() = default;
virtual ExamCarSub3New* getCarNewSub3() const = 0;
virtual const TRTKResult& historyRtkKM3(int his=0) const { return (*m_history)[his]->RTKKM3; }
virtual const TRTKResult& historyRtkKM3_Tail(int his=0) const { return (*m_history)[his]->RTKKM3_Tail; }
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;
//当前是否有正在考试的项目
virtual bool isInItemExaming() const = 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 isItemPassed(ExamItemCode ItemNo) const = 0;
//项目是否有扣分
virtual bool isMarked(ExamItemCode ItemNo) const = 0;
//里程是否满足
virtual bool isMileage() const = 0;
//设置进项目状态
virtual void setEnterItem(TKM3Item* item, bool isArtif=false) const = 0;
//播放项目开始\结束语音
virtual void playItemSound(TKM3Item* item, bool enter) = 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 setyjdg_road_code_kf(bool v) = 0;
virtual bool getyjdg_road_code_kf() const = 0;
//结束当前项目
virtual void KM3EndItem(int ItemNo, bool event=true, bool sound=true) = 0;
};
#endif // IEXAMCAR_H