2025-05-14 14:19:43 +08:00

283 lines
15 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 说明:考试车对象接口
*
* 作者: 杨海洋
* 日期: 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); }
virtual const std::string& carVerison() MEANS { return m_carInfo->sdkver; }
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){};
//前进 后退 距离计算
virtual int calcDistance(bool mc, int X_McH);
//当前系统时间回放取的事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