#pragma once #include "ResDataObject.h" #include "CCOS.Dev.FPD.KonicaDR.h" #include "KonicaInterface.h" #include "include/AerosdkError.h" #include "include/AerosdkStruct.h" #include "include/AerosdkDefine.h" #include "ZSKKCalibration.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 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 CallBackEvent(int nType, unsigned int uintParam, char* pstrPanelId, int nXgboxNo); void SetNotifyStatusTimePeriod(int nTime); void SetReconnectTimePeriod(int nTime); 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; 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; //重连线程 //辅助线程 static unsigned __stdcall onFPDScanThread(PVOID pvoid); //查询温度、电量、wifi线程 static unsigned __stdcall onFPDStatusThread(PVOID pvoid); //重连线程断线后开启 static unsigned __stdcall onReconnectThread(PVOID pvoid); void InitSdkInterface(); bool LoadDll(string strWorkPath); bool OpenDetector(); bool InitDetector(); int ShowDetectorInfo(); bool WaitRespond(int nTimeOut = 65000, const char* szAction = ""); void StopWaiting(const char* szAction = ""); bool TestError(int nRet, const char* szFuncName = "Func", bool bShowTrue = true); void OnProcessImg(); void StartDarkCalibration(); void StartGainCalibration(); void InitFPD(); void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = ""); bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth); bool IsConnected(string strIP); void Initialize(StAerosdkLogInfo* sLogInfo, char* strSdkPath, char* strAeroSDKini, char* strPanelLog, char* strXGBOXLog, char* strECBLog); 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); KonicaAerosdkOpen API_AerosdkOpen;// KonicaAerosdkClose API_AerosdkClose;// KonicaAerosdkOpenPanel API_AerosdkOpenPanel;// KonicaAerosdkClosePanel API_AerosdkClosePanel;// KonicaAerosdkChangePriorityConnecttionOfPanel API_AerosdkChangePriorityConnecttionOfPanel;//文档中没有 KonicaAerosdkOpenXgbox API_AerosdkOpenXgbox;// KonicaAerosdkCloseXgbox API_AerosdkCloseXgbox;// KonicaAerosdkStartExposureSequence API_AerosdkStartExposureSequence;//不建议使用 KonicaAerosdkStartExposureSequenceIt API_AerosdkStartExposureSequenceIt;//建议使用 KonicaAerosdkSetReadyBusy API_AerosdkSetReadyBusy;//硬同步使用 KonicaAerosdkCancelExposureSequence API_AerosdkCancelExposureSequence;// KonicaAerosdkCheckImage API_AerosdkCheckImage;//不建议使用 KonicaAerosdkStartImageResendingSequence API_AerosdkStartImageResendingSequence; KonicaAerosdkStartImageResendingSequenceWithMode API_AerosdkStartImageResendingSequenceWithMode; KonicaAerosdkStartImageDeleteSequence API_AerosdkStartImageDeleteSequence; KonicaAerosdkStartPanelUpdateSequence API_AerosdkStartPanelUpdateSequence; KonicaAerosdkStartXgboxUpdateSequence API_AerosdkStartXgboxUpdateSequence; KonicaAerosdkGetImageSize API_AerosdkGetImageSize;//不建议使用 KonicaAerosdkGetPreviewImage API_AerosdkGetPreviewImage;// KonicaAerosdkGetImage API_AerosdkGetImage;// KonicaAerosdkSetWirelessMode API_AerosdkSetWirelessMode; KonicaAerosdkChangePowerMode API_AerosdkChangePowerMode;//切换待机状态和睡眠状态(低功耗) KonicaAerosdkGetPanelConnectStatus API_AerosdkGetPanelConnectStatus;//基本不用 KonicaAerosdkGetPanelStatusInfo API_AerosdkGetPanelStatusInfo;// KonicaAerosdkGetPanelBatteryInfo API_AerosdkGetPanelBatteryInfo;// KonicaAerosdkGetPanelSignalInfo API_AerosdkGetPanelSignalInfo;// KonicaAerosdkGetPanelSettingInfo API_AerosdkGetPanelSettingInfo;// KonicaAerosdkGetPanelVersionInfo API_AerosdkGetPanelVersionInfo;// KonicaAerosdkGetPanelConservationInfo API_AerosdkGetPanelConservationInfo;// KonicaAerosdkGetCradleConservationInfo API_AerosdkGetCradleConservationInfo;// KonicaAerosdkGetPanelLog API_AerosdkGetPanelLog; KonicaAerosdkGetPanelLastError API_AerosdkGetPanelLastError;// KonicaAerosdkGetXgboxConnectStatus API_AerosdkGetXgboxConnectStatus; KonicaAerosdkGetXgboxStatusInfo API_AerosdkGetXgboxStatusInfo; KonicaAerosdkGetXgboxSettingInfo API_AerosdkGetXgboxSettingInfo; KonicaAerosdkGetXgboxVersionInfo API_AerosdkGetXgboxVersionInfo; KonicaAerosdkGetXgboxConservationInfo API_AerosdkGetXgboxConservationInfo; KonicaAerosdkGetXgboxLog API_AerosdkGetXgboxLog; KonicaAerosdkGetXgboxLastError API_AerosdkGetXgboxLastError;// KonicaAerosdkStartGainCalibrationSequence API_AerosdkStartGainCalibrationSequence; KonicaAerosdkCancelGainCalibrationSequence API_AerosdkCancelGainCalibrationSequence; KonicaAerosdkStartDarkCalibrationSequence API_AerosdkStartDarkCalibrationSequence; KonicaAerosdkGetCalibSignalPercent API_AerosdkGetCalibSignalPercent; KonicaAerosdkSetPanelReady API_AerosdkSetPanelReady;//AeroSync 时使用 KonicaAerosdkSetSsidForSharedPanel API_AerosdkSetSsidForSharedPanel; KonicaAerosdkSetPanelSensitivity API_AerosdkSetPanelSensitivity; KonicaAerosdkGetPanelGenarationInfo API_AerosdkGetPanelGenarationInfo; KonicaAerosdkGetPanelResolutionInfo API_AerosdkGetPanelResolutionInfo;// KonicaAerosdkGetImageSizeEx API_AerosdkGetImageSizeEx;//建议使用 KonicaAerosdkCheckImageEx API_AerosdkCheckImageEx;//建议使用 检查探测器内部是否有剩余图像 图像重传逻辑时使用 KonicaAerosdkSetPanelResolution API_AerosdkSetPanelResolution;// KonicaAerosdkChangeMovingGridSetting API_AerosdkChangeMovingGridSetting; KonicaAerosdkGetPanelAlignmentInfo API_AerosdkGetPanelAlignmentInfo;//面板对齐信息 };