#pragma once #include #include "ResDataObject.h" #include "include/AerosdkError.h" #include "include/AerosdkStruct.h" #include "include/AerosdkDefine.h" #include "ZSKKCalibration.h" #include "KonicaInterface.h" #include "KonicaCom_i.h" #include "KonicaCom_i.c" #include "KonicaCom2_i.h" #include "KonicaCom2_i.c" #include "CCOS.Dev.FPD.KonicaDR.h" #include "CShareMemManager.h" constexpr auto SCAN_EVENT_COUNT = 5; class KonicaCtrl { enum class eDetStatus { DetStatus_NotIni, DetStatus_NotConn, DetStatus_Sleep, DetStatus_Standby, DetStatus_Work, DetStatus_Acquire, DetStatus_Offset, DetStatus_XrayCalibration, }; //探测器信息 struct CPanelStatus { bool bInitOver; //是否初始化完成 bool bConnectState; //是否连接 SYNC_MODE eSyncMode; //同步模式 int nSoftAcqState; eDetStatus eFPDStatus; //探测器状态 CPanelStatus() { bInitOver = false; bConnectState = false; eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值 nSoftAcqState = 0; eFPDStatus = eDetStatus::DetStatus_NotIni; } }; public: KonicaCtrl(); ~KonicaCtrl(); bool DriverEntry(FPDDeviceKonica* pDrvDPC, ResDataObject& Configuration); bool Connect(FPDDeviceKonica* pDrvDPC, const char* szWorkPath); void EnterExamMode(int nExamMode); bool SetAcqMode(int nMode); bool ActiveSyncMode(int nSyncMode); bool PrepareAcquisition(FPDDeviceKonica* pDrvDPC); bool StartAcquisition(FPDDeviceKonica* pDrvDPC); bool StopAcquisition(FPDDeviceKonica* pDrvDPC); bool ActiveCalibration(FPDDeviceKonica* pDrvDPC, CCOS_CALIBRATION_TYPE eType); bool PrepareCalibration(FPDDeviceKonica* pDrvDPC); bool StartCalibration(FPDDeviceKonica* pDrvDPC); bool StopCalibration(FPDDeviceKonica* pDrvDPC); bool AbortCalibration(FPDDeviceKonica* pDrvDPC); bool CompleteCalibration(FPDDeviceKonica* pDrvDPC); bool CheckImageInDetector(FPDDeviceKonica* pDrvDPC); bool SaveCalibrationFile(); void SetCalibRounds(int nCalibRounds); bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound); bool AcceptCalibration(); bool RejectCalibration(); CCOS_CALIBRATION_TYPE GetCalibType(); bool GetCalibrationTime(int nDetectorID = -1); bool ActiveDetector(FPDDeviceKonica* pDrvDPC, bool bActive); bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode); void DealWithEventType(int nEventType); void SetNotifyStatusTimePeriod(int nTime); void SetReconnectTimePeriod(int nTime); bool SetResolution(int nResolution); private: map* m_pDPC2PanelID; map* m_pPanelID2DPC; int m_nPanelCount; //探测器数量 ResDataObject m_ModeConfig; //保存DPC模块下发的配置 std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置 int m_nCurrentPanelID; string m_strDetectorType; //探测器类型 A9YF-01649 HMODULE m_hSDKModule; //加载SDK的句柄 CPanelStatus *m_pStPanelStatus[2]; //康众SDK应该只支持双板 int m_nSyncMode; //每次进检查子系统会调用 ActiveSyncMode 进行激活同步模式操作 int m_nCurrentLogicMode;//当前工作在配置文件的哪个工作模式下 //软同步是通过回调函数通知状态的 硬同步和AED都要主动查询状态,虽然都是query prog info 但是他俩使用的标志位也是不同的 int m_nImageWidth; int m_nImageHeight; int m_nWidthOffset; int m_nHeightOffset; //A9YF-01649(AeroDR 3 1417HD2) Normal resolution W:1744 H:2128 High resolution W:3488 H:4256 //A5DP-50072(AeroDR 1417HQ) Normal resolution W:1994 H:2430 int m_nRawImgWidth; //原始图像宽 int m_nRawImgHeight; //原始图像高 int m_nPreviewEnable; //A9YF-01649(AeroDR 3 1417HD2) Normal resolution W:436 H:532 High resolution W:872 H:1064 //A5DP-50072(AeroDR 1417HQ) Normal resolution W:498 H:607 int m_nPreImgWidth; int m_nPreImgHeight; WORD* m_pRawImgBuffer; //原始图buffer WORD* m_pPreImgBuffer; //预览图buffer WORD* m_pImgBuffer; //裁剪后图像 int m_nXwindow; //窗口积分时间 int m_nImageNo; AppStatus m_nAppStatus; //记录软件状态 int m_nSaveRaw; CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正 CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正类型 CZSKKCalibrationCtrl* m_pZSKKCalib; int m_nCalibrationRounds;//校正总轮数 int m_nCalibCurrentCalibrationRound;//当前校正轮数 int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次 int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数 int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔 int m_nReconnectTimePeriod;//重连的时间间隔 int m_nDetectorStatus; int m_nXgboxNo;//要做成从模型文件中读取的 bool m_bConnectXgbox; long m_nRefCount; int m_nLastMessageType; CShareMem* m_pShareMem; CShareMem* m_pShareMem2; int m_nComServerID;//在环境中同时安装了两块完全相同的探测器时,从模型文件中读取使用哪个ComServerID来创建对应的ComServer指针 int m_nResolution;//探测器分辨率 bool m_bSupportNormalResolution; bool m_bSupportHighResolution; bool m_bFirstEnterExam;//是否时首次进入检查 HANDLE m_hRespond;//用于等待某个状态的到来或者某个动作的完成 //辅助线程事件 HANDLE m_hStopScanEvent; //退出辅助线程事件 HANDLE m_hProcessImgEvent;//处理图像事件 HANDLE m_hDarkEvent; //开始dark校正 HANDLE m_hGainEvent; //开始Rad Gain事件 HANDLE m_hInitEvent; HANDLE m_hArrayEvent[SCAN_EVENT_COUNT]; HANDLE m_hToggleEvent; //辅助线程退出通知事件 HANDLE m_hFPDScanThread; //辅助线程 HANDLE m_hFPDStatusThread;//扫描探测器温度、电量、wifi bool m_bExit;//退出辅助线程和查询探测器状态线程 HANDLE m_hReconnectThread; //重连线程 HANDLE m_hConsumeThread; //消费线程 //辅助线程 static unsigned __stdcall onFPDScanThread(PVOID pvoid); //查询温度、电量、wifi线程 static unsigned __stdcall onFPDStatusThread(PVOID pvoid); //重连线程断线后开启 static unsigned __stdcall onReconnectThread(PVOID pvoid); //向com组件中查队列中是否有数据,有数据则消费 static unsigned __stdcall onConsumeThread(PVOID pvoid); bool OpenDetector(); bool InitDetector(); int ShowDetectorInfo(); bool WaitRespond(int nTimeOut = 65000, const char* szAction = ""); void StopWaiting(const char* szAction = ""); void OnProcessImg(); void StartDarkCalibration(); void StartGainCalibration(); void InitFPD(); void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = ""); bool SaveRawWithName(const char* pRawName, const WORD* pRawImg, int nWidth, int nHeight); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); bool IsConnected(string strIP); bool GetImageSize(); string GetStrEventType(int nEventType); bool RestartComServer(); void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL); void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1); void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1); void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL); };