PZMedicalCtrl.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. #pragma once
  2. #include "ResDataObject.h"
  3. #include "CCOS.Dev.FPD.PZMedicalDR.h"
  4. #include "PZMedicalLib.h"
  5. #include "ZSKKCalibration.h"
  6. enum eDetStatus
  7. {
  8. DetStatus_NotIni,
  9. DetStatus_NotConn,
  10. DetStatus_Sleep,
  11. DetStatus_Standby,
  12. DetStatus_Work,
  13. DetStatus_Acquire,
  14. DetStatus_Offset,
  15. DetStatus_XrayCalibration,
  16. };
  17. enum eDetOperationMode
  18. {
  19. PIX_OM_RAD = 1,
  20. PIX_OM_TOMO,
  21. PIX_OM_AED = 4
  22. };
  23. enum eDetPixImgType
  24. {
  25. PIX_IMG_NONE,
  26. PIX_IMG_PRE,
  27. PIX_IMG_RAW,
  28. PIX_IMG_FULL = 4
  29. };
  30. class PZMedicalCtrl
  31. {
  32. //探测器信息
  33. struct CPanelStatus
  34. {
  35. bool bLostTemplate; //是否缺少校正文件
  36. bool bPanelInReady; //探测器在ready状态
  37. bool bConnectStatus; //是否连接
  38. SYNC_MODE eSyncMode; //同步模式
  39. bool bConnErrorInInit; //初始化阶段的断线错误
  40. bool bInitError; //初始化错误,一般不可恢复
  41. string strPanelType; //探测器类型,AddDPC时赋值
  42. string strPanelSN; //探测器序列号,连接成功后获取信息时被赋值
  43. bool bIsPortable;
  44. bool bCharging;
  45. bool bStatusPolling;
  46. bool bDC_AED;
  47. bool bDarkCalibDone; //offset刷新结束
  48. bool bAEDDarkCalibDone;
  49. bool bLTEDarkCalibDone; //长曝光offset刷新结束
  50. string strModuleIP; //探测器IP地址,attach或收到init回调时赋值
  51. bool bBatteryTooLow;
  52. bool bImagePending;
  53. bool bIsLoadRef; //是否加载了校正文件,加载过了不用再次加载
  54. int nBattery; //电池电量
  55. bool bInitOK; //初始化过程探测器连接完毕,用于重连判断
  56. bool bNeedUpdateFW; //是否需要固件升级的标记位
  57. bool bSelftested; //Selftest执行完毕
  58. int nTotalShockNumber; //探测器的shocksenseor总数
  59. int nFWStatus; //探测器固件状态
  60. string strPartNumber; //产品编号,连接成功后获取信息时被赋值
  61. bool bHaveAutonumousMode; //是否支持离线采集
  62. bool bAutonumousMode; //true: 离线模式;false:在线模式
  63. CPanelStatus()
  64. {
  65. bLostTemplate = false;
  66. bPanelInReady = false;
  67. bConnectStatus = false;
  68. eSyncMode = SYNC_SOFTWARE; //默认使用软同步作为缺省值
  69. bConnErrorInInit = false;
  70. bInitError = false;
  71. strPanelType = "";
  72. strPanelSN = "";
  73. bIsPortable = false;
  74. bCharging = false;
  75. bStatusPolling = false;
  76. bDC_AED = false;
  77. bDarkCalibDone = false;
  78. bAEDDarkCalibDone = false;
  79. bLTEDarkCalibDone = false;
  80. strModuleIP = "";
  81. bBatteryTooLow = false;
  82. bImagePending = false;
  83. bIsLoadRef = false;
  84. nBattery = 0;
  85. bInitOK = false;
  86. bNeedUpdateFW = false;
  87. bSelftested = false;
  88. nTotalShockNumber = -1;
  89. nFWStatus = -1;
  90. strPartNumber = "";
  91. bHaveAutonumousMode = false;
  92. bAutonumousMode = false;
  93. }
  94. };
  95. public:
  96. PZMedicalCtrl();
  97. ~PZMedicalCtrl();
  98. bool DriverEntry(FPDDevicePZMedical* pDrvDPC, ResDataObject& Configuration);
  99. bool Connect(FPDDevicePZMedical* pDrvDPC, const char* szWorkPath);
  100. void EnterExamMode(int nExamMode);
  101. bool PrepareAcquisition(FPDDevicePZMedical* pDrvDPC);
  102. bool StartAcquisition(FPDDevicePZMedical* pDrvDPC);
  103. bool StopAcquisition(FPDDevicePZMedical* pDrvDPC);
  104. bool ActiveCalibration(FPDDevicePZMedical* pDrvDPC, CCOS_CALIBRATION_TYPE eType);
  105. bool PrepareCalibration(FPDDevicePZMedical* pDrvDPC);
  106. bool StartCalibration(FPDDevicePZMedical* pDrvDPC);
  107. bool StopCalibration(FPDDevicePZMedical* pDrvDPC);
  108. bool ResetDetector(FPDDevicePZMedical* pDrvDPC);
  109. bool SetReferenceNum(int nReferenceNum);
  110. bool SetAcqMode(int nLogicMode, FPDDevicePZMedical* pDrvDPC);
  111. bool AcceptCalibration();
  112. bool RejectCalibration();
  113. bool SaveCalibrationFile();
  114. bool GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound);
  115. bool CompleteCalibration(FPDDevicePZMedical* pDrvDPC);
  116. bool GetCalibrationTime(int nDetectorID = -1);
  117. RET_STATUS AbortCalibration(FPDDevicePZMedical* pDrvDPC);
  118. CCOS_CALIBRATION_TYPE GetPZMedicalCtrlCalibType();
  119. PZDPC_State GetPZDPCState();
  120. bool ActiveSyncMode(int nSyncMode);
  121. bool UpdateCalibMode(CCOS_CALIBRATION_MODE eCalibMode);
  122. void SetNotifyStatusTimePeriod(int nTime);
  123. void SetReconnectTimePeriod(int nTime);
  124. bool SetDetectorWiredIP(string strWiredIP);
  125. bool SetDetectorWirelessIP(string strWirelessIP);
  126. private:
  127. map<FPDDevicePZMedical*, int>* m_pDPC2PanelID;
  128. map<int, FPDDevicePZMedical*>* m_pPanelID2DPC;
  129. int m_nPanelCount; //探测器数量
  130. int m_nCurrentPanelID;
  131. std::string m_strCtrlWorkPath; //保存工作路径,用于加载SDK和配置
  132. ResDataObject m_objFPDConfig; //保存DPC模块下发的配置
  133. CPanelStatus* m_pStPanelStatus[3];//探测器信息 内部还有自己的FPDConfig 注意赋值(为了以后连接多个板子用)
  134. std::string m_strTplDarkPath; // references\serialnumber\dark
  135. std::string m_strTplFloodPath; // references\serialnumber\flood
  136. PZDPC_State m_ePZDPCstate; //DPC或ctrl模块当前处于什么状态
  137. int m_nImageWidth;
  138. int m_nImageHeight;
  139. int m_nWidthOffset;
  140. int m_nHeightOffset;
  141. int m_nRawImgWidth; //SDK反馈的图像宽
  142. int m_nRawImgHeight; //SDK反馈的图像高
  143. WORD* m_pRawImgBuffer; //原始图buffer
  144. WORD* m_pImgBuffer; //处理后的图像buffer
  145. int m_nSaveRaw;
  146. APP_STATUS m_nAppStatus; //记录工作界面
  147. CCOS_CALIBRATION_MODE m_nCalibrationMode;//校正模式
  148. CCOS_CALIBRATION_TYPE m_eType; // 记录当前校正类型
  149. PZ_CALIBRATION_State m_eCalState;//探测器校正状态
  150. CZSKKCalibrationCtrl* m_pZSKKCalib;
  151. int m_nOffsetImg; // 校正时暗场图数量
  152. int m_nGainImg; // 校正时亮场图数量
  153. bool m_bCalibrationOver; // true 当前阶段校正完成;false 当前阶段校正未完成
  154. bool m_bWired; //是否为有线连接
  155. CHAR m_cFpCurStat; //探测器当前的工作模式SDK
  156. eDetStatus m_eStatus; // 探测器状态
  157. string m_strPanelType; //探测器类型例如: PZMedical_A843B 模型文件中的Description
  158. bool m_bLoadedSDK; //true 已经加载了SDK,避免重复调用,主要用于ReInit流程
  159. bool m_bInitializedSDK; //true 已经init了SDK,避免重复调用,主要用于ReInit流程
  160. int m_nCalibrationRounds;//校正总轮数
  161. int m_nCalibCurrentCalibrationRound;//当前是第几轮
  162. int m_nCalibCurrentExposureIndex;//当前轮是第几次Accept
  163. int m_nExposureNumCurrentRound;//当前轮需要Accept几次
  164. int m_nGainExposureNum;//校正曝光需要Accept的总次数
  165. bool m_bAutoContinueCal; //true: SDK自动进行下一次增益开窗流程(一般是在当前增益合格);false: 手动触发SDK进行下一次增益
  166. int m_nNotifyStatusTimePeriod;//通知温度等状态信息的时间间隔
  167. int m_nReconnectTimePeriod;//重连的时间间隔
  168. HMODULE m_hPZSDKModule; //SDK Handle
  169. HANDLE m_hRespond;//可以是任何事件的等待与通知
  170. //辅助线程
  171. HANDLE m_hFPDScanThread;
  172. HANDLE m_hStopScanEvent;
  173. HANDLE m_hProcessImgEvent;
  174. HANDLE m_hXWinOnEvent;
  175. HANDLE m_hInitFPDEvent;
  176. HANDLE m_hReInitEvent;
  177. HANDLE m_hArrayEvent[5];
  178. //厂商校正使用线程
  179. HANDLE m_hCalibrationThread;
  180. HANDLE m_hPZMPrepare; //准备校正
  181. HANDLE m_hPZMStartOffset; //开始暗场校正
  182. HANDLE m_hPZMInOffset; //继续采集暗场图 或 停止采集
  183. HANDLE m_hPZMStartGain; //开始亮场校正
  184. HANDLE m_hPZMInGain; //继续采集亮场图 或者 停止采集
  185. HANDLE m_hEndCalibEvent;//正常结束校正 生成校正文件
  186. HANDLE m_hPZMEndEvent; //退出校正,可能是异常退出
  187. HANDLE m_hPZMCalibration[7];
  188. HANDLE m_hNotifyStatusThread;//通知探测器温度、电量、wifi信息线程
  189. HANDLE m_hReconnectDetectorThread;//重连探测器线程
  190. static DWORD __stdcall onFPDScanThread(PVOID pvoid);
  191. static DWORD __stdcall onCalibrationThread(PVOID pvoid);
  192. static DWORD __stdcall onNotifyStatusThread(PVOID pvoid);
  193. static DWORD __stdcall onReconnectDetectorThread(PVOID pvoid);
  194. bool LoadSDK();
  195. bool InitSDK();
  196. bool ConnectDetector();
  197. bool GetPanelInfo();
  198. BOOL OnProcessLink(char cEvent);
  199. BOOL OnProcessBreak(char cEvent);
  200. BOOL OnProcessImage(char cEvent);
  201. BOOL OnProcessHeartBeat(char cEvent);
  202. void OnProcessImg();
  203. void OnProcessInitFPD();
  204. void OnReInitFPD();
  205. bool OnProcessCalibration();
  206. void SaveRaw(WORD* pInImg, int nImgWidth, int nImgHeight);
  207. bool SaveRaw(const char* pRawName, const WORD* pRawImg, int nWidth, int nHeight);
  208. bool GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth);
  209. bool TestError(BOOL bRet, const char* szFuncName = "Func");
  210. bool WaitRespond(int nTimeOut = 65000, const char* szPosition = "");
  211. void StopWaiting(const char* szPosition = "");
  212. bool SetFPDTplPath();
  213. bool SetFPDCalibrationMode();
  214. void GetConnectionMode();
  215. void SetPZDPCState(PZDPC_State ePZDPCstate);
  216. void NotifyDetectorInfo();
  217. void ConfFeedback(int nEventID, int nDetectorID = -1, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  218. void InfoFeedback(int nEventID, int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, void* pParam = NULL);
  219. void StatusFeedback(int nEventID, int nParam1 = 0, const char* pszMsg = "", int nDetectorID = -1, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  220. void DataFeedback(int nEventID, void* pParam = NULL, int nParam1 = 0, float fParam2 = 0, const char* pszMsg = "", int nPtrParamLen = 0, int nDetectorID = -1);
  221. void WarnFeedback(int nEventID, const char* pszMsg = "", int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL, int nDetectorID = -1);
  222. void ErrorFeedback(int nEventID, const char* pszMsg = "", int nDetectorID = -1, int nParam1 = 0, float fParam2 = 0, int nPtrParamLen = 0, void* pParam = NULL);
  223. static BOOL __stdcall FuncLinkUpCallBack(char cEvent);
  224. static BOOL __stdcall FuncLinkDownCallBack(char cEvent);
  225. static BOOL __stdcall FuncImageCallBack(char cEvent);
  226. static BOOL __stdcall FuncHeartBeatCallBack(char cEvent);
  227. static BOOL __stdcall FuncReadyCallBack(char cEvent);
  228. static BOOL __stdcall FuncExposeCallBack(char cEvent);
  229. static BOOL __stdcall FuncExposeEndCallBack(char cEvent);
  230. static BOOL __stdcall FuncOffsetDoneCallBack(char cEvent);
  231. static BOOL __stdcall FuncAedA1CallBack(char cEvent);
  232. static BOOL __stdcall FuncAedA2CallBack(char cEvent);
  233. static BOOL __stdcall FuncImageStartCallBack(char cEvent);
  234. static BOOL __stdcall FuncImageEndCallBack(char cEvent);
  235. static BOOL __stdcall FuncBattLow1CallBack(char cEvent);
  236. static BOOL __stdcall FuncBattLow2CallBack(char cEvent);
  237. PZ_COM_Init API_COM_Init;
  238. PZ_COM_List API_COM_List;
  239. PZ_COM_Open API_COM_Open;
  240. PZ_COM_Close API_COM_Close;
  241. PZ_COM_RegisterEvCallBack API_COM_RegisterEvCallBack;
  242. PZ_COM_SetCalibMode API_COM_SetCalibMode;
  243. PZ_COM_GetCalibMode API_COM_GetCalibMode;
  244. PZ_COM_Trigger API_COM_Trigger;
  245. PZ_COM_AedAcq API_COM_AedAcq;
  246. PZ_COM_HstAcq API_COM_HstAcq;
  247. PZ_COM_Prep API_COM_Prep;
  248. PZ_COM_ExposeReq API_COM_ExposeReq;
  249. PZ_COM_Stop API_COM_Stop;
  250. PZ_COM_GetImageMode API_COM_GetImageMode;
  251. PZ_COM_GetImageShiftMode API_COM_GetImageShiftMode;
  252. PZ_COM_GetImage API_COM_GetImage;
  253. PZ_COM_SetAllTpl API_COM_SetAllTpl;//Load all templates,including offset,defect and gain template.
  254. PZ_COM_GenOffsetTpl API_COM_GenOffsetTpl;
  255. PZ_COM_GenGainTpl API_COM_GenGainTpl;
  256. PZ_COM_GenDefectTpl API_COM_GenDefectTpl;
  257. PZ_COM_TplPathSet API_COM_TplPathSet;
  258. PZ_COM_TplPathGet API_COM_TplPathGet;
  259. PZ_COM_LogPathSet API_COM_LogPathSet;
  260. PZ_COM_GetFPType API_COM_GetFPType;
  261. PZ_COM_SetAedCorrKB API_COM_SetAedCorrKB;
  262. PZ_COM_GetDllVer API_COM_GetDllVer;
  263. PZ_COM_GetFPInfo API_COM_GetFPInfo;
  264. PZ_COM_GetFPConf API_COM_GetFPConf;
  265. PZ_COM_SetFPConf API_COM_SetFPConf;
  266. PZ_COM_GetWifiMode API_COM_GetWifiMode;
  267. PZ_COM_GetFPStatus API_COM_GetFPStatus;
  268. PZ_COM_GetFPCurStatus API_COM_GetFPCurStatus;
  269. PZ_COM_GetFPsn API_COM_GetFPsn;
  270. PZ_COM_GetFPWireState API_COM_GetFPWireState;
  271. PZ_COM_GetFPLicense API_COM_GetFPLicense;
  272. PZ_COM_AedTrigger API_COM_AedTrigger;
  273. PZ_COM_ResetFP API_COM_ResetFP;
  274. PZ_COM_GetErrNo API_COM_GetErrNo;
  275. PZ_COM_GetXwin API_COM_GetXwin;
  276. PZ_COM_SetXwin API_COM_SetXwin;
  277. PZ_COM_GetRBConf API_COM_GetRBConf;
  278. PZ_COM_SetRBConf API_COM_SetRBConf;
  279. PZ_COM_SetFpIpNetmask API_COM_SetFpIpNetmask;
  280. };