KonicaCtrl.h 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #pragma once
  2. #include <atlbase.h>
  3. #include "ResDataObject.h"
  4. #include "include/AerosdkError.h"
  5. #include "include/AerosdkStruct.h"
  6. #include "include/AerosdkDefine.h"
  7. #include "ZSKKCalibration.h"
  8. #include "KonicaInterface.h"
  9. #include "KonicaCom_i.h"
  10. #include "KonicaCom_i.c"
  11. #include "KonicaCom2_i.h"
  12. #include "KonicaCom2_i.c"
  13. #include "CCOS.Dev.FPD.KonicaDR.h"
  14. #include "CShareMemManager.h"
  15. constexpr auto SCAN_EVENT_COUNT = 5;
  16. class KonicaCtrl
  17. {
  18. enum class eDetStatus
  19. {
  20. DetStatus_NotIni,
  21. DetStatus_NotConn,
  22. DetStatus_Sleep,
  23. DetStatus_Standby,
  24. DetStatus_Work,
  25. DetStatus_Acquire,
  26. DetStatus_Offset,
  27. DetStatus_XrayCalibration,
  28. };
  29. //探测器信息
  30. struct CPanelStatus
  31. {
  32. bool bInitOver; //是否初始化完成
  33. bool bConnectState; //是否连接
  34. SYNC_MODE eSyncMode; //同步模式
  35. int nSoftAcqState;
  36. eDetStatus eFPDStatus; //探测器状态
  37. CPanelStatus()
  38. {
  39. bInitOver = false;
  40. bConnectState = false;
  41. eSyncMode = SYNC_SOFTWARE; //暂时使用软同步作为缺省值
  42. nSoftAcqState = 0;
  43. eFPDStatus = eDetStatus::DetStatus_NotIni;
  44. }
  45. };
  46. public:
  47. KonicaCtrl();
  48. ~KonicaCtrl();
  49. bool DriverEntry(FPDDeviceKonica* pDrvDPC, ResDataObject& Configuration);
  50. bool Connect(FPDDeviceKonica* pDrvDPC, const char* szWorkPath);
  51. void EnterExamMode(int nExamMode);
  52. bool SetAcqMode(int nMode);
  53. bool ActiveSyncMode(int nSyncMode);
  54. bool PrepareAcquisition(FPDDeviceKonica* pDrvDPC);
  55. bool StartAcquisition(FPDDeviceKonica* pDrvDPC);
  56. bool StopAcquisition(FPDDeviceKonica* pDrvDPC);
  57. bool ActiveCalibration(FPDDeviceKonica* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  58. bool PrepareCalibration(FPDDeviceKonica* pDrvDPC);
  59. bool StartCalibration(FPDDeviceKonica* pDrvDPC);
  60. bool StopCalibration(FPDDeviceKonica* pDrvDPC);
  61. bool AbortCalibration(FPDDeviceKonica* pDrvDPC);
  62. bool CompleteCalibration(FPDDeviceKonica* pDrvDPC);
  63. bool CheckImageInDetector(FPDDeviceKonica* pDrvDPC);
  64. bool SaveCalibrationFile();
  65. void SetCalibRounds(int nCalibRounds);
  66. bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound);
  67. bool AcceptCalibration();
  68. bool RejectCalibration();
  69. CCOS_CALIBRATION_TYPE GetCalibType();
  70. bool GetCalibrationTime(int nDetectorID = -1);
  71. bool ActiveDetector(FPDDeviceKonica* pDrvDPC, bool bActive);
  72. bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode);
  73. void DealWithEventType(int nEventType);
  74. void SetNotifyStatusTimePeriod(int nTime);
  75. void SetReconnectTimePeriod(int nTime);
  76. bool SetResolution(int nResolution);
  77. private:
  78. map<FPDDeviceKonica*, int>* m_pDPC2PanelID;
  79. map<int, FPDDeviceKonica*>* m_pPanelID2DPC;
  80. int m_nPanelCount; //探测器数量
  81. ResDataObject m_ModeConfig; //保存DPC模块下发的配置
  82. std::string m_strWorkPath; //保存工作路径,用于加载SDK和配置
  83. int m_nCurrentPanelID;
  84. string m_strDetectorType; //探测器类型 A9YF-01649
  85. HMODULE m_hSDKModule; //加载SDK的句柄
  86. CPanelStatus *m_pStPanelStatus[2]; //康众SDK应该只支持双板
  87. int m_nSyncMode; //每次进检查子系统会调用 ActiveSyncMode 进行激活同步模式操作
  88. int m_nCurrentLogicMode;//当前工作在配置文件的哪个工作模式下
  89. //软同步是通过回调函数通知状态的 硬同步和AED都要主动查询状态,虽然都是query prog info 但是他俩使用的标志位也是不同的
  90. int m_nImageWidth;
  91. int m_nImageHeight;
  92. int m_nWidthOffset;
  93. int m_nHeightOffset;
  94. //A9YF-01649(AeroDR 3 1417HD2) Normal resolution W:1744 H:2128 High resolution W:3488 H:4256
  95. //A5DP-50072(AeroDR 1417HQ) Normal resolution W:1994 H:2430
  96. int m_nRawImgWidth; //原始图像宽
  97. int m_nRawImgHeight; //原始图像高
  98. int m_nPreviewEnable;
  99. //A9YF-01649(AeroDR 3 1417HD2) Normal resolution W:436 H:532 High resolution W:872 H:1064
  100. //A5DP-50072(AeroDR 1417HQ) Normal resolution W:498 H:607
  101. int m_nPreImgWidth;
  102. int m_nPreImgHeight;
  103. WORD* m_pRawImgBuffer; //原始图buffer
  104. WORD* m_pPreImgBuffer; //预览图buffer
  105. WORD* m_pImgBuffer; //裁剪后图像
  106. int m_nXwindow; //窗口积分时间
  107. int m_nImageNo;
  108. AppStatus m_nAppStatus; //记录软件状态
  109. int m_nSaveRaw;
  110. CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式 ecom校正/厂商校正
  111. CCOS_CALIBRATION_TYPE m_eCaliType; // 记录当前校正类型
  112. CZSKKCalibrationCtrl* m_pZSKKCalib;
  113. int m_nCalibrationRounds;//校正总轮数
  114. int m_nCalibCurrentCalibrationRound;//当前校正轮数
  115. int m_nCalibCurrentExposureIndex;//当前轮次曝光第几次
  116. int m_nExposureNumCurrentRound;//当前轮次需要曝光的总次数
  117. int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔
  118. int m_nReconnectTimePeriod;//重连的时间间隔
  119. int m_nDetectorStatus;
  120. int m_nXgboxNo;//要做成从模型文件中读取的
  121. bool m_bConnectXgbox;
  122. long m_nRefCount;
  123. int m_nLastMessageType;
  124. CShareMem* m_pShareMem;
  125. CShareMem* m_pShareMem2;
  126. int m_nComServerID;//在环境中同时安装了两块完全相同的探测器时,从模型文件中读取使用哪个ComServerID来创建对应的ComServer指针
  127. int m_nResolution;//探测器分辨率
  128. bool m_bSupportNormalResolution;
  129. bool m_bSupportHighResolution;
  130. bool m_bFirstEnterExam;//是否时首次进入检查
  131. HANDLE m_hRespond;//用于等待某个状态的到来或者某个动作的完成
  132. //辅助线程事件
  133. HANDLE m_hStopScanEvent; //退出辅助线程事件
  134. HANDLE m_hProcessImgEvent;//处理图像事件
  135. HANDLE m_hDarkEvent; //开始dark校正
  136. HANDLE m_hGainEvent; //开始Rad Gain事件
  137. HANDLE m_hInitEvent;
  138. HANDLE m_hArrayEvent[SCAN_EVENT_COUNT];
  139. HANDLE m_hToggleEvent; //辅助线程退出通知事件
  140. HANDLE m_hFPDScanThread; //辅助线程
  141. HANDLE m_hFPDStatusThread;//扫描探测器温度、电量、wifi
  142. bool m_bExit;//退出辅助线程和查询探测器状态线程
  143. HANDLE m_hReconnectThread; //重连线程
  144. HANDLE m_hConsumeThread; //消费线程
  145. //辅助线程
  146. static unsigned __stdcall onFPDScanThread(PVOID pvoid);
  147. //查询温度、电量、wifi线程
  148. static unsigned __stdcall onFPDStatusThread(PVOID pvoid);
  149. //重连线程断线后开启
  150. static unsigned __stdcall onReconnectThread(PVOID pvoid);
  151. //向com组件中查队列中是否有数据,有数据则消费
  152. static unsigned __stdcall onConsumeThread(PVOID pvoid);
  153. bool OpenDetector();
  154. bool InitDetector();
  155. int ShowDetectorInfo();
  156. bool WaitRespond(int nTimeOut = 65000, const char* szAction = "");
  157. void StopWaiting(const char* szAction = "");
  158. void OnProcessImg();
  159. void StartDarkCalibration();
  160. void StartGainCalibration();
  161. void InitFPD();
  162. void SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight, string strFrameID = "");
  163. bool SaveRawWithName(const char* pRawName, const WORD* pRawImg, int nWidth, int nHeight);
  164. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  165. bool IsConnected(string strIP);
  166. bool GetImageSize();
  167. string GetStrEventType(int nEventType);
  168. bool RestartComServer();
  169. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  170. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  171. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  172. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  173. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  174. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  175. };