PZMedicalCtrl.cpp 73 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766
  1. #include "stdafx.h"
  2. #include "PZMedicalCtrl.h"
  3. #include "CCOS.Dev.FPD.PZMedicalDM.h"
  4. #include "common_api.h"
  5. #define IMAGE_WIDTH 2816
  6. #define IMAGE_HEIGHT 4096
  7. PZMedicalCtrl* g_pDetector = nullptr;
  8. #define LOAD_PROC_ADDRESS(handle,func) \
  9. if ((API_##func = (PZ_##func)GetProcAddress(handle, #func)) == NULL) { printf("Error occurs while loading entry point!!! \n'%s'\n", #func); }\
  10. PZMedicalCtrl::PZMedicalCtrl()
  11. {
  12. m_pDPC2PanelID = new map<FPDDevicePZMedical*, int>();
  13. m_pPanelID2DPC = new map<int, FPDDevicePZMedical*>();
  14. m_nPanelCount = 0;
  15. m_strWorkPath = "";
  16. m_nCurrentPanelID = 0;
  17. m_strTplDarkPath = "";
  18. m_strTplFloodPath = "";
  19. m_ePZDPCstate = PZDPC_STATE_INIT;
  20. m_nImageWidth = 0;
  21. m_nImageHeight = 0;
  22. m_nWidthOffset = 0;
  23. m_nHeightOffset = 0;
  24. m_nRawImgWidth = 0;
  25. m_nRawImgHeight = 0;
  26. m_pRawImgBuffer = nullptr;
  27. m_pImgBuffer = nullptr;
  28. m_nAppStatus = APP_STATUS_IDLE;
  29. m_eType = CCOS_CALIBRATION_TYPE_NONE;
  30. m_nOffsetImg = 0;
  31. m_nGainImg = 0;
  32. m_eCalState = PZ_CALIBRATION_MAX;
  33. m_bCalibrationOver = false;
  34. m_bWired = true;
  35. m_cFpCurStat = STATUS_NULL;
  36. m_nCalibrationRounds = 0;
  37. m_eStatus = DetStatus_NotIni;
  38. m_nCalibrationMode = CCOS_CALIBRATION_MODE_ZSKK;
  39. m_pZSKKCalib = nullptr;
  40. m_strPanelType = "";
  41. m_bLoadedSDK = false;
  42. m_bInitializedSDK = false;
  43. m_bConnectWaiting = false;
  44. m_nImgBits = 16;
  45. m_nPixelPitch = 0;
  46. m_nSaveRaw = 0;
  47. m_nCalibCurrentCalibrationRound = 0;
  48. m_nCalibCurrentExposureIndex = 0;
  49. m_nExposureNumCurrentRound = 0;
  50. m_bConfirmCaliRst = false;
  51. m_bAutoContinueCal = false;
  52. m_bAutonumousMode = false;
  53. m_nGainExposureNum = 0;
  54. m_nHeartCount = 0;
  55. m_nCurrentLogicMode = 0;
  56. m_hPZSDKModule = nullptr;
  57. m_hRespond = CreateEvent(NULL, FALSE, FALSE, NULL);
  58. m_hToggleEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  59. m_hFPDScanThread = nullptr;
  60. m_hStopScanEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  61. m_hProcessImgEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  62. m_hXWinOnEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  63. m_hInitFPDEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  64. m_hReInitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  65. m_hDarkEndEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  66. m_hArrayEvent[0] = m_hStopScanEvent;
  67. m_hArrayEvent[1] = m_hProcessImgEvent;
  68. m_hArrayEvent[2] = m_hXWinOnEvent;
  69. m_hArrayEvent[3] = m_hInitFPDEvent;
  70. m_hArrayEvent[4] = m_hReInitEvent;
  71. m_hArrayEvent[5] = m_hDarkEndEvent;
  72. m_hCalibrationThread = nullptr;
  73. m_hPZMPrepare = CreateEvent(NULL, FALSE, FALSE, NULL);
  74. m_hPZMStartOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  75. m_hPZMInOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  76. m_hPZMStartAED = CreateEvent(NULL, FALSE, FALSE, NULL);
  77. m_hPZMEndAED = CreateEvent(NULL, FALSE, FALSE, NULL);
  78. m_hPZMStartGain = CreateEvent(NULL, FALSE, FALSE, NULL);
  79. m_hPZMInGain = CreateEvent(NULL, FALSE, FALSE, NULL);
  80. m_hEndCalibEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  81. m_hPZMEndEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  82. m_hPZMCalibration[0] = m_hPZMPrepare;
  83. m_hPZMCalibration[1] = m_hPZMStartOffset;
  84. m_hPZMCalibration[2] = m_hPZMInOffset;
  85. m_hPZMCalibration[3] = m_hPZMStartAED;
  86. m_hPZMCalibration[4] = m_hPZMEndAED;
  87. m_hPZMCalibration[5] = m_hPZMStartGain;
  88. m_hPZMCalibration[6] = m_hPZMInGain;
  89. m_hPZMCalibration[7] = m_hEndCalibEvent;
  90. m_hPZMCalibration[8] = m_hPZMEndEvent;
  91. API_COM_Init = nullptr;
  92. API_COM_List = nullptr;
  93. API_COM_Open = nullptr;
  94. API_COM_Close = nullptr;
  95. API_COM_RegisterEvCallBack = nullptr;
  96. API_COM_SetCalibMode = nullptr;
  97. API_COM_GetCalibMode = nullptr;
  98. API_COM_Trigger = nullptr;
  99. API_COM_AedAcq = nullptr;
  100. API_COM_HstAcq = nullptr;
  101. API_COM_Prep = nullptr;
  102. API_COM_ExposeReq = nullptr;
  103. API_COM_Stop = nullptr;
  104. API_COM_GetImageMode = nullptr;
  105. API_COM_GetImageShiftMode = nullptr;
  106. API_COM_GetImage = nullptr;
  107. API_COM_SetAllTpl = nullptr;
  108. API_COM_GenOffsetTpl = nullptr;
  109. API_COM_GenGainTpl = nullptr;
  110. API_COM_GenDefectTpl = nullptr;
  111. API_COM_TplPathSet = nullptr;
  112. API_COM_TplPathGet = nullptr;
  113. API_COM_LogPathSet = nullptr;
  114. API_COM_GetFPType = nullptr;
  115. API_COM_SetAedCorrKB = nullptr;
  116. API_COM_GetDllVer = nullptr;
  117. API_COM_GetFPInfo = nullptr;
  118. API_COM_GetFPConf = nullptr;
  119. API_COM_SetFPConf = nullptr;
  120. API_COM_GetWifiMode = nullptr;
  121. API_COM_GetFPStatus = nullptr;
  122. API_COM_GetFPCurStatus = nullptr;
  123. API_COM_GetFPsn = nullptr;
  124. API_COM_GetFPWireState = nullptr;
  125. API_COM_GetFPLicense = nullptr;
  126. API_COM_ResetFP = nullptr;
  127. API_COM_GetErrNo = nullptr;
  128. API_COM_GetXwin = nullptr;
  129. API_COM_SetXwin = nullptr;
  130. API_COM_GetRBConf = nullptr;
  131. API_COM_SetRBConf = nullptr;
  132. }
  133. PZMedicalCtrl::~PZMedicalCtrl()
  134. {
  135. if (m_nPanelCount != 0)
  136. {
  137. for (int i = 0; i < m_nPanelCount; i++)
  138. {
  139. delete[]m_pStPanelStatus[i];
  140. }
  141. }
  142. if (m_pRawImgBuffer)
  143. {
  144. delete[]m_pRawImgBuffer;
  145. m_pRawImgBuffer = nullptr;
  146. }
  147. if (m_pImgBuffer != nullptr)
  148. {
  149. delete[]m_pImgBuffer;
  150. m_pImgBuffer = nullptr;
  151. }
  152. if (nullptr != m_pDPC2PanelID)
  153. {
  154. delete m_pDPC2PanelID;
  155. m_pDPC2PanelID = nullptr;
  156. }
  157. if (nullptr != m_pPanelID2DPC)
  158. {
  159. delete m_pPanelID2DPC;
  160. m_pPanelID2DPC = nullptr;
  161. }
  162. if (m_hStopScanEvent)
  163. {
  164. CloseHandle(m_hStopScanEvent);
  165. m_hStopScanEvent = nullptr;
  166. }
  167. if (m_hProcessImgEvent)
  168. {
  169. CloseHandle(m_hProcessImgEvent);
  170. m_hProcessImgEvent = nullptr;
  171. }
  172. if (m_hXWinOnEvent)
  173. {
  174. CloseHandle(m_hXWinOnEvent);
  175. m_hXWinOnEvent = nullptr;
  176. }
  177. if (m_hInitFPDEvent)
  178. {
  179. CloseHandle(m_hInitFPDEvent);
  180. m_hInitFPDEvent = nullptr;
  181. }
  182. if (m_hToggleEvent)
  183. {
  184. CloseHandle(m_hToggleEvent);
  185. m_hToggleEvent = nullptr;
  186. }
  187. if (m_hRespond)
  188. {
  189. CloseHandle(m_hRespond);
  190. m_hRespond = nullptr;
  191. }
  192. if (m_hPZMPrepare)
  193. {
  194. CloseHandle(m_hPZMPrepare);
  195. m_hPZMPrepare = nullptr;
  196. }
  197. if (m_hPZMStartOffset)
  198. {
  199. CloseHandle(m_hPZMStartOffset);
  200. m_hPZMStartOffset = nullptr;
  201. }
  202. if (m_hPZMInOffset)
  203. {
  204. CloseHandle(m_hPZMInOffset);
  205. m_hPZMInOffset = nullptr;
  206. }
  207. if (m_hPZMStartAED)
  208. {
  209. CloseHandle(m_hPZMStartAED);
  210. m_hPZMStartAED = nullptr;
  211. }
  212. if (m_hPZMEndAED)
  213. {
  214. CloseHandle(m_hPZMEndAED);
  215. m_hPZMEndAED = nullptr;
  216. }
  217. if (m_hPZMStartGain)
  218. {
  219. CloseHandle(m_hPZMStartGain);
  220. m_hPZMStartGain = nullptr;
  221. }
  222. if (m_hPZMInGain)
  223. {
  224. CloseHandle(m_hPZMInGain);
  225. m_hPZMInGain = nullptr;
  226. }
  227. if (m_hReInitEvent)
  228. {
  229. CloseHandle(m_hReInitEvent);
  230. m_hReInitEvent = nullptr;
  231. }
  232. if (m_pZSKKCalib)
  233. {
  234. delete m_pZSKKCalib;
  235. m_pZSKKCalib = nullptr;
  236. }
  237. if (m_hEndCalibEvent)
  238. {
  239. CloseHandle(m_hEndCalibEvent);
  240. m_hEndCalibEvent = nullptr;
  241. }
  242. if (m_hDarkEndEvent)
  243. {
  244. CloseHandle(m_hDarkEndEvent);
  245. m_hDarkEndEvent = nullptr;
  246. }
  247. if (m_hPZMEndEvent)
  248. {
  249. CloseHandle(m_hPZMEndEvent);
  250. m_hPZMEndEvent = nullptr;
  251. }
  252. }
  253. bool PZMedicalCtrl::DriverEntry(FPDDevicePZMedical* pDrvDPC, ResDataObject & Configuration)
  254. {
  255. printf("========DriverEntry %p \n", pDrvDPC);
  256. FINFO("========DriverEntry {$}", pDrvDPC);
  257. map<FPDDevicePZMedical*, int>::iterator DPCsIter = m_pDPC2PanelID->find(pDrvDPC);
  258. if (DPCsIter != m_pDPC2PanelID->end())
  259. {
  260. printf("This DPC already exist\n");
  261. FERROR("This DPC already exist");
  262. return false;
  263. }
  264. CPanelStatus* p = new CPanelStatus();
  265. m_pStPanelStatus[m_nPanelCount] = p;
  266. m_pDPC2PanelID->insert(pair<FPDDevicePZMedical*, int>(pDrvDPC, m_nPanelCount));
  267. m_pPanelID2DPC->insert(pair<int, FPDDevicePZMedical*>(m_nPanelCount, pDrvDPC));
  268. //m_nPanelCount++;
  269. m_objFPDConfig = Configuration; //记录配置 --目前只有一个平板,多板时应该分别存储
  270. m_pStPanelStatus[m_nPanelCount]->objPanelConfig = Configuration;
  271. return true;
  272. }
  273. /// <summary>
  274. /// 设备连接,启动开始Scan线程
  275. /// [DONE.CHECKED.]
  276. /// </summary>
  277. /// <param name="pDrvDPC"></param>
  278. /// <param name="szWorkPath"></param>
  279. /// <returns></returns>
  280. bool PZMedicalCtrl::Connect(FPDDevicePZMedical* pDrvDPC, const char* szWorkPath)
  281. {
  282. printf("========Connect begin...\n");
  283. FINFO("========Connect. work path:{$}", szWorkPath);
  284. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  285. {
  286. printf("Not current DPC, return\n");
  287. FERROR("Not current DPC, return");
  288. return true;
  289. }
  290. //初始化失败错误,基本不可以恢复了,直接返回false
  291. if (m_pStPanelStatus[m_nCurrentPanelID]->bInitError)
  292. {
  293. printf("\n Connect detector over(err_init) \n");
  294. FINFO("Connect detector over(err_init)");
  295. return false;
  296. }
  297. //初始化阶段出现连接错误,这种状态下不再执行下面的流程,等待探测器自动重连
  298. if (m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit)
  299. {
  300. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  301. {
  302. printf("\n Connect detector over(err_connect) \n");
  303. FINFO("Connect detector over(err_connect)");
  304. return false;
  305. }
  306. else
  307. {
  308. printf("\n Connect detector over \n");
  309. FINFO("Connect detector over");
  310. return true;
  311. }
  312. }
  313. if (m_strWorkPath == "")
  314. {
  315. m_strWorkPath = szWorkPath;
  316. }
  317. if (!m_pZSKKCalib)
  318. {
  319. m_pZSKKCalib = new CZSKKCalibrationCtrl();
  320. }
  321. DWORD dwThreadId;
  322. if (m_hFPDScanThread == nullptr)
  323. {
  324. m_hFPDScanThread = CreateThread(NULL, 0, onFPDScanThread, this, 0, &dwThreadId); //启动辅助线程
  325. }
  326. SetPZDPCState(PZDPC_STATE_INIT); //进入初始化状态
  327. SetEvent(m_hInitFPDEvent);
  328. FINFO("======== Connect over");
  329. return true;
  330. }
  331. bool PZMedicalCtrl::Disconnect()
  332. {
  333. FINFO("========Disconnect");
  334. //先退出线程,避免重连流程和调用关闭接口冲突
  335. StopThread();
  336. if (m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  337. {
  338. BOOL nRet = FALSE;
  339. FINFO("Call Close");
  340. nRet = API_COM_Close();
  341. if (!TestError(nRet))
  342. {
  343. FERROR("Close detector failed");
  344. }
  345. }
  346. if (m_nCalibrationMode)//PZ自己的校正模式
  347. {
  348. //什么也不用做
  349. }
  350. else
  351. {
  352. FINFO("Unload ZSKK Reference file");
  353. m_pZSKKCalib->UnLoadZSKKGainMap();
  354. m_pZSKKCalib->UnLoadZSKKPixMap();
  355. }
  356. FINFO("Disconnect over");
  357. return true;
  358. }
  359. void PZMedicalCtrl::EnterExamMode(int nExamMode)
  360. {
  361. switch (nExamMode)
  362. {
  363. case APP_STATUS_WORK_BEGIN:
  364. FINFO("Enter into Exam Windows");
  365. m_nAppStatus = APP_STATUS_WORK_BEGIN;
  366. break;
  367. case APP_STATUS_WORK_END:
  368. FINFO("Quit Exam Windows");
  369. m_nAppStatus = APP_STATUS_WORK_END;
  370. break;
  371. case APP_STATUS_DETSHARE_BEGIN:
  372. FINFO("Enter into Detector Share Windows");
  373. m_nAppStatus = APP_STATUS_DETSHARE_BEGIN;
  374. break;
  375. case APP_STATUS_DETSHAR_END:
  376. m_nAppStatus = APP_STATUS_IDLE;
  377. FINFO("Quit Detector Share Windows");
  378. m_nAppStatus = APP_STATUS_DETSHAR_END;
  379. break;
  380. case APP_STATUS_CAL_BEGIN:
  381. FINFO("Enter into Calibration Windows");
  382. m_nAppStatus = APP_STATUS_CAL_BEGIN;
  383. break;
  384. case APP_STATUS_CAL_END:
  385. FINFO("Quit Calibration Windows");
  386. m_nAppStatus = APP_STATUS_CAL_END;
  387. break;
  388. case APP_STATUS_WORK_IN_SENSITIVITY:
  389. FINFO("Enter into sensitivity test interface");
  390. m_nAppStatus = APP_STATUS_WORK_IN_SENSITIVITY;
  391. break;
  392. default:
  393. break;
  394. }
  395. if (APP_STATUS_WORK_END == m_nAppStatus)
  396. {
  397. FINFO("m_nAppStatus == APP_STATUS_WORK_END");
  398. if (m_cFpCurStat > STATUS_IDLE)
  399. {
  400. BOOL nRet = FALSE;
  401. FINFO("Call COM_Stop");
  402. nRet = API_COM_Stop();//EnterExamMode
  403. TestError(nRet, "COM_Stop");
  404. }
  405. SetPZDPCState(PZDPC_STATE_STANDBY);
  406. }
  407. }
  408. bool PZMedicalCtrl::PrepareAcquisition(FPDDevicePZMedical* pDrvDPC)
  409. {
  410. FINFO("========PrepareAcquisition");
  411. BOOL nRet = FALSE;
  412. int nTimeout = 12000;
  413. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  414. {
  415. printf("Not current DPC, return\n");
  416. FERROR("Not current DPC, return");
  417. return false;
  418. }
  419. SetPZDPCState(PZDPC_STATE_WORK); //此时进入检查
  420. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  421. {
  422. FERROR("There is no detector connected, return");
  423. return false;
  424. }
  425. if (m_cFpCurStat > STATUS_IDLE)
  426. {
  427. FINFO("Call COM_Stop");
  428. nRet = API_COM_Stop();//PrepareAcquisition
  429. if (!TestError(nRet, "COM_Stop"))
  430. {
  431. return false;
  432. }
  433. }
  434. try
  435. {
  436. nTimeout = (int)m_objFPDConfig["ReadyTimeout"];
  437. }
  438. catch (ResDataObjectExption& e)
  439. {
  440. FERROR("Read configuration failed, Error code: {$}", e.what());
  441. }
  442. if (SYNC_AED == m_pStPanelStatus[m_nCurrentPanelID]->eSyncMode)
  443. {
  444. FINFO("Call API_COM_AedAcq");
  445. nRet = API_COM_AedAcq();
  446. if (!TestError(nRet, "API_COM_AedAcq"))
  447. {
  448. return false;
  449. }
  450. if (m_cFpCurStat == STATUS_AED2)
  451. {
  452. FINFO("Detector already AED status!");
  453. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  454. }
  455. else
  456. {
  457. if (!WaitRespond(nTimeout, "API_COM_AedAcq"))//等待心跳中返回状态
  458. {
  459. return false;
  460. }
  461. }
  462. }
  463. else
  464. {
  465. FINFO("Call API_COM_HstAcq");
  466. nRet = API_COM_HstAcq();
  467. if (!TestError(nRet, "API_COM_HstAcq"))
  468. {
  469. return false;
  470. }
  471. //如果此时状态就是hst 那么不等消息
  472. if (m_cFpCurStat == STATUS_HST)
  473. {
  474. FINFO("Detector already HST status!");
  475. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  476. }
  477. else
  478. {
  479. if (!WaitRespond(nTimeout, "API_COM_HstAcq"))//等待心跳中返回状态
  480. {
  481. return false;
  482. }
  483. }
  484. }
  485. FINFO("PrepareAcquisition over");
  486. return true;
  487. }
  488. bool PZMedicalCtrl::StartAcquisition(FPDDevicePZMedical* pDrvDPC)
  489. {
  490. FINFO("========StartAcquisition");
  491. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  492. {
  493. printf("Not current DPC, return\n");
  494. FERROR("Not current DPC, return");
  495. return false;
  496. }
  497. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  498. {
  499. FERROR("There is no detector connected, return");
  500. return false;
  501. }
  502. BOOL nRet = FALSE;
  503. if (SYNC_AED == m_pStPanelStatus[m_nCurrentPanelID]->eSyncMode)
  504. {
  505. StatusFeedback(EVT_STATUS_PANEL, PANEL_START_ACQ);
  506. }
  507. else
  508. {
  509. //品臻4.2.5版本的动态库,非AED模式,在ExposeReq后会有ready事件的回调
  510. FINFO("Call API_COM_ExposeReq");
  511. nRet = API_COM_ExposeReq();
  512. if (!TestError(nRet, "API_COM_ExposeReq"))
  513. {
  514. return false;
  515. }
  516. }
  517. return true;
  518. }
  519. /***
  520. ** 调用api,结束采集
  521. ** pDrvDPC,ctrl模块内部调用时为nullptr
  522. ***/
  523. bool PZMedicalCtrl::StopAcquisition(FPDDevicePZMedical* pDrvDPC)
  524. {
  525. FINFO("========StopAcquisition");
  526. if (nullptr != pDrvDPC)
  527. {
  528. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  529. {
  530. printf("Not current DPC, return\n");
  531. FERROR("Not current DPC, return");
  532. return false;
  533. }
  534. }
  535. BOOL nRet = FALSE;
  536. if (m_cFpCurStat > STATUS_IDLE)
  537. {
  538. FINFO("Call COM_Stop");
  539. nRet = API_COM_Stop();//StopAcquisition
  540. if (!TestError(nRet, "COM_Stop"))
  541. {
  542. return false;
  543. }
  544. }
  545. return true;
  546. }
  547. /***
  548. ** 说明:激活校正
  549. ** 增益校正(探测器采用post-offset,暗场校正基本没用了)时拿到dose回调,算作执行完毕
  550. ***/
  551. bool PZMedicalCtrl::ActiveCalibration(FPDDevicePZMedical* pDrvDPC, CCOS_CALIBRATION_TYPE eType)
  552. {
  553. FINFO("========ActiveCalibration");
  554. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  555. {
  556. printf("Not current DPC, return\n");
  557. FERROR("Not current DPC, return");
  558. return false;
  559. }
  560. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  561. {
  562. FERROR("There is no detector connected, return");
  563. return false;
  564. }
  565. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_START);
  566. DWORD dwThreadId;
  567. if (m_hCalibrationThread == nullptr)
  568. {
  569. m_hCalibrationThread = CreateThread(NULL, 0, onCalibrationThread, this, 0, &dwThreadId);
  570. }
  571. else
  572. {
  573. FERROR("The calibration process is ongoing");
  574. }
  575. if (nullptr == m_hCalibrationThread)
  576. {
  577. FERROR("Start calibration process failed");
  578. return false;
  579. }
  580. m_eType = eType;
  581. SetPZDPCState(PZDPC_STATE_CALIBRATION);
  582. m_nOffsetImg = 0;
  583. m_nGainImg = 0;
  584. m_eCalState = PZ_CALIBRATION_INIT;
  585. m_bCalibrationOver = false;
  586. printf("ActiveCalibration stop acquisition\n");
  587. FINFO("ActiveCalibration stop acquisition");
  588. //停止采集,使探测器进入IDLE状态
  589. if (!StopAcquisition(nullptr))
  590. {
  591. return false;
  592. }
  593. //参考trixellDR 流程
  594. if (CCOS_CALIBRATION_TYPE_DARK == eType)
  595. {
  596. FINFO("Active Dark Calibration");
  597. }
  598. else if (CCOS_CALIBRATION_TYPE_XRAY == eType)
  599. {
  600. FINFO("Active Xray Calibration");
  601. m_eStatus = DetStatus_XrayCalibration;
  602. if (m_nCalibrationMode) //PZ自己的校正模式
  603. {
  604. }
  605. else //ZSKK校正
  606. {
  607. if (!m_pZSKKCalib)
  608. {
  609. FERROR("ZSKK Calibration object is undefined");
  610. }
  611. else
  612. {
  613. //反馈Dose信息
  614. DataFeedback(EVT_DATA_DOSEPARAM, NULL, 0, 2.5);
  615. //加载ZSKK的校正文件
  616. m_pZSKKCalib->m_strRawImgPath = m_strWorkPath + "\\rawdata\\";
  617. m_pZSKKCalib->m_strRefFilePath = m_strWorkPath + "\\references\\";
  618. m_pZSKKCalib->m_nFullImgWidth = m_nImageWidth;
  619. m_pZSKKCalib->m_nFullImgHeight = m_nImageHeight;
  620. m_pZSKKCalib->m_nReferenceNum = m_nCalibrationRounds;
  621. m_pZSKKCalib->m_nSaturationValue = 50000;
  622. m_pZSKKCalib->LoadZSKKGainMap(false, m_strPanelType);
  623. m_pZSKKCalib->LoadZSKKPixelMap(false, m_strPanelType);
  624. FINFO("Load ZSKK Gain map success!");
  625. FINFO("references file path: {$}", m_pZSKKCalib->m_strRefFilePath.c_str());
  626. }
  627. }
  628. }
  629. else
  630. {
  631. FINFO("Active not supported calibration({$}), return!", (int)eType);
  632. }
  633. return true;
  634. }
  635. /***
  636. ** 说明:准备校正(状态机FramePrep)
  637. ** 刷暗场 开窗
  638. ***/
  639. bool PZMedicalCtrl::PrepareCalibration(FPDDevicePZMedical* pDrvDPC)
  640. {
  641. FINFO("========PrepareCalibration");
  642. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  643. {
  644. printf("Not current DPC, return\n");
  645. FERROR("Not current DPC, return");
  646. return false;
  647. }
  648. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  649. {
  650. FERROR("There is no detector connected, return");
  651. return false;
  652. }
  653. BOOL nRet = FALSE;
  654. //调用COM_Prep接口即可刷新暗场
  655. FINFO("PrepareCalibration Call Com_Stop");
  656. if (m_cFpCurStat > STATUS_IDLE)
  657. {
  658. FINFO("Call COM_Stop");
  659. nRet = API_COM_Stop();//PrepareCalibration
  660. if (!TestError(nRet, "COM_Stop"))
  661. {
  662. return false;
  663. }
  664. }
  665. int nTimeout = 12000; //ready缺省等12s
  666. try
  667. {
  668. nTimeout = (int)m_objFPDConfig["ReadyTimeout"];
  669. }
  670. catch (ResDataObjectExption& e)
  671. {
  672. FERROR("Read configuration failed, Error code: {$}", e.what());
  673. }
  674. if (CCOS_CALIBRATION_TYPE_XRAY == m_eType)
  675. {
  676. FINFO("Calibration type -- GAIN");
  677. m_eCalState = PZ_CALIBRATION_GAIN;
  678. if (SYNC_AED == m_pStPanelStatus[m_nCurrentPanelID]->eSyncMode)
  679. {
  680. FINFO("Call AedAcq");
  681. nRet = API_COM_AedAcq();
  682. if (!TestError(nRet, "AedAcq"))
  683. {
  684. SetEvent(m_hPZMEndEvent); //设置采集模式失败
  685. return false;
  686. }
  687. if (!WaitRespond(nTimeout, "API_COM_AedAcq"))
  688. {
  689. return false;
  690. }
  691. }
  692. else
  693. {
  694. FINFO("Call HstAcq");
  695. nRet = API_COM_HstAcq();
  696. if (!TestError(nRet, "HstAcq"))
  697. {
  698. SetEvent(m_hPZMEndEvent);//设置采集模式失败
  699. return false;
  700. }
  701. if (!WaitRespond(nTimeout, "API_COM_HstAcq"))//等待心跳中返回状态
  702. {
  703. return false;
  704. }
  705. //品臻4.2.5版本的动态库,非AED模式,在ExposeReq后会有ready事件的回调
  706. FINFO("Call API_COM_ExposeReq");
  707. nRet = API_COM_ExposeReq();
  708. if (!TestError(nRet, "API_COM_ExposeReq"))
  709. {
  710. return false;
  711. }
  712. }
  713. }
  714. else
  715. {
  716. FINFO("Calibration type -- DARK");
  717. m_eCalState = PZ_CALIBRATION_OFFSET;
  718. //刷暗场
  719. FINFO("Call API_COM_Prep");
  720. nRet = API_COM_Prep();
  721. if (!TestError(nRet, "Com_Prep"))
  722. {
  723. FERROR("refresh offset template fail");
  724. }
  725. else
  726. {
  727. FINFO("refresh offset template success");
  728. }
  729. }
  730. return nRet;
  731. }
  732. bool PZMedicalCtrl::StartCalibration(FPDDevicePZMedical* pDrvDPC)
  733. {
  734. FINFO("========StartCalibration");
  735. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  736. {
  737. printf("Not current DPC, return\n");
  738. FERROR("Not current DPC, return");
  739. return false;
  740. }
  741. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  742. {
  743. FERROR("There is no detector connected, return");
  744. printf("the detector is not connected\n");
  745. return false;
  746. }
  747. if (CCOS_CALIBRATION_TYPE_DARK == m_eType)
  748. {
  749. FINFO("start dark Calibration");
  750. m_eCalState = PZ_CALIBRATION_OFFSET;
  751. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  752. }
  753. else if(CCOS_CALIBRATION_TYPE_XRAY == m_eType)
  754. {
  755. FINFO("start gain Calibration");
  756. m_eCalState = PZ_CALIBRATION_GAIN;
  757. StatusFeedback(EVT_STATUS_PANEL, PANEL_START_ACQ);
  758. }
  759. return true;
  760. }
  761. bool PZMedicalCtrl::StopCalibration(FPDDevicePZMedical* pDrvDPC)
  762. {
  763. FINFO("========StopCalibration");
  764. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  765. {
  766. printf("Not current DPC, return\n");
  767. FERROR("Not current DPC, return");
  768. return false;
  769. }
  770. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  771. {
  772. FERROR("There is no detector connected, return");
  773. return false;
  774. }
  775. m_bCalibrationOver = false; //用户停止校正
  776. bool bWrite = false;
  777. BOOL bRet = FALSE;
  778. if (!StopAcquisition(nullptr))
  779. {
  780. FERROR("Stop acquisition in calibration failed");
  781. return false;
  782. }
  783. TFPUserCfg stUserCfg;
  784. memset(&stUserCfg, 0, sizeof(stUserCfg));
  785. FINFO("Call GetFPConf");
  786. bRet = API_COM_GetFPConf(&stUserCfg);
  787. if (!TestError(bRet, "GetFPConf"))
  788. {
  789. FERROR("Get FPConf fail!");
  790. }
  791. if (bRet && stUserCfg.wPreProcessing != 1)
  792. {
  793. stUserCfg.wPreProcessing = 1; // 前校正offset
  794. FINFO("Call SetFPConf, Set PreProcessing to OFFSET");
  795. bRet = API_COM_SetFPConf(&stUserCfg);
  796. if (!TestError(bRet, "SetFPConf"))
  797. {
  798. FERROR("Set FPConf fail!");
  799. }
  800. else
  801. {
  802. bWrite = true;
  803. }
  804. }
  805. if (bWrite)
  806. {
  807. Sleep(5000); // 5s延迟,保证配置完成
  808. }
  809. return true;
  810. }
  811. /// <summary>
  812. /// 动态加载设备厂商SDK DLL,指定驱动目录
  813. /// 动态拉取接口,并重命名
  814. /// [DONE.CHECKED.]
  815. /// TBD. 接口是否够用?升级后需要新添加别的接口
  816. /// </summary>
  817. /// <returns></returns>
  818. bool PZMedicalCtrl::LoadSDK()
  819. {
  820. string strSDKPath = "";
  821. string strDllpath = "";
  822. try
  823. {
  824. strSDKPath = (string)m_objFPDConfig["SDKPath"];
  825. }
  826. catch (ResDataObjectExption& e)
  827. {
  828. FERROR("Read configuration failed, Error code: {$}", e.what());
  829. return false;
  830. }
  831. strSDKPath = m_strWorkPath + "\\" + strSDKPath;
  832. strDllpath = strSDKPath + "\\ComApi.dll";
  833. FINFO("Load SDK path: {$}", strDllpath.c_str());
  834. //将SDK路径加入环境变量
  835. char* pathvar;
  836. pathvar = getenv("Path");
  837. printf("pathvar = %s \n\n", pathvar);
  838. string strPath = "Path=";
  839. strPath += pathvar;
  840. strPath += ";";
  841. strPath += strSDKPath;
  842. printf("strPath:%s \n\n", strPath.c_str());
  843. if (_putenv(strPath.c_str()) != 0)
  844. {
  845. DWORD dw = GetLastError();
  846. printf("put env failed! last error:%ld \n", dw);
  847. return false;
  848. }
  849. //pathvar = getenv("Path"); //test
  850. //printf("pathvar = %s \n\n", pathvar);
  851. m_hPZSDKModule = LoadLibraryEx(strDllpath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  852. if (m_hPZSDKModule == nullptr)
  853. {
  854. DWORD dw = GetLastError();
  855. FERROR("Load %s failed: {$} \n", strDllpath.c_str(), dw);
  856. return false;
  857. }
  858. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_Init);
  859. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_List);
  860. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_Open);
  861. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_Close);
  862. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_RegisterEvCallBack);
  863. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_SetCalibMode);
  864. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetCalibMode);
  865. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_Trigger);
  866. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_AedAcq);
  867. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_HstAcq);
  868. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_Prep);
  869. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_ExposeReq);
  870. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_Stop);
  871. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetImageMode);
  872. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetImage);
  873. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_SetAllTpl);
  874. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GenOffsetTpl);
  875. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GenGainTpl);
  876. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GenDefectTpl);
  877. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_TplPathSet);
  878. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_TplPathGet);
  879. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_LogPathSet);
  880. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPType);
  881. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_SetAedCorrKB);
  882. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetDllVer);
  883. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPInfo);
  884. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPConf);
  885. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_SetFPConf);
  886. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetWifiMode);
  887. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPStatus);
  888. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPCurStatus);
  889. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPsn);
  890. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPWireState);
  891. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetFPLicense);
  892. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_AedTrigger);
  893. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_ResetFP);
  894. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetErrNo);
  895. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetXwin);
  896. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_SetXwin);
  897. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_GetRBConf);
  898. LOAD_PROC_ADDRESS(m_hPZSDKModule, COM_SetRBConf);
  899. m_bLoadedSDK = true;
  900. FINFO("Load SDK over");
  901. return true;
  902. }
  903. /// <summary>
  904. /// 初始化 品臻 SDK
  905. /// [DONE.CHECKED.]
  906. /// </summary>
  907. /// <returns></returns>
  908. bool PZMedicalCtrl::InitSDK()
  909. {
  910. printf("========InitSDK \n");
  911. FINFO("======== InitSDK");
  912. BOOL nRet = FALSE;
  913. FINFO("Call RegisterEvCallback, EVENT_LINKUP");
  914. nRet = API_COM_RegisterEvCallBack(EVENT_LINKUP, FuncLinkUpCallBack);
  915. TestError(nRet, "Register EVENT_LINKUP");
  916. FINFO("Call RegisterEvCallback, EVENT_LINKDOWN");
  917. nRet = API_COM_RegisterEvCallBack(EVENT_LINKDOWN, FuncLinkDownCallBack);
  918. TestError(nRet, "Register EVENT_LINKDOWN");
  919. FINFO("Call RegisterEvCallback, EVENT_IMAGEVALID");
  920. nRet = API_COM_RegisterEvCallBack(EVENT_IMAGEVALID, FuncImageCallBack);
  921. TestError(nRet, "Register EVENT_IMAGEVALID");
  922. FINFO("Call RegisterEvCallback, EVENT_HEARTBEAT");
  923. nRet = API_COM_RegisterEvCallBack(EVENT_HEARTBEAT, FuncHeartBeatCallBack);
  924. TestError(nRet, "Register EVENT_HEARTBEAT");
  925. FINFO("Call RegisterEvCallback, EVENT_READY");
  926. nRet = API_COM_RegisterEvCallBack(EVENT_READY, FuncReadyCallBack);
  927. TestError(nRet, "Register EVENT_READY");
  928. FINFO("Call RegisterEvCallback, EVENT_EXPOSE");
  929. nRet = API_COM_RegisterEvCallBack(EVENT_EXPOSE, FuncExposeCallBack);
  930. TestError(nRet, "Register EVENT_EXPOSE");
  931. FINFO("Call RegisterEvCallback, EVENT_EXPEND");
  932. nRet = API_COM_RegisterEvCallBack(EVENT_EXPEND, FuncExposeEndCallBack);
  933. TestError(nRet, "Register EVENT_EXPEND");
  934. FINFO("Call RegisterEvCallback, EVENT_OFFSETDONE");
  935. nRet = API_COM_RegisterEvCallBack(EVENT_OFFSETDONE, FuncOffsetDoneCallBack);
  936. TestError(nRet, "Register EVENT_OFFSETDONE");
  937. FINFO("Call RegisterEvCallback, EVENT_AED_A1");
  938. nRet = API_COM_RegisterEvCallBack(EVENT_AED_A1, FuncAedA1CallBack);
  939. TestError(nRet, "Register EVENT_AED_A1");
  940. FINFO("Call RegisterEvCallback, EVENT_AED_A2");
  941. nRet = API_COM_RegisterEvCallBack(EVENT_AED_A2, FuncAedA2CallBack);
  942. TestError(nRet, "Register EVENT_AED_A2");
  943. FINFO("Call RegisterEvCallback, EVENT_IMAGESTART");
  944. nRet = API_COM_RegisterEvCallBack(EVENT_IMAGESTART, FuncImageStartCallBack);
  945. TestError(nRet, "Register EVENT_IMAGESTART");
  946. FINFO("Call RegisterEvCallback, EVENT_IMAGEEND");
  947. nRet = API_COM_RegisterEvCallBack(EVENT_IMAGEEND, FuncImageEndCallBack);
  948. TestError(nRet, "Register EVENT_IMAGEEND");
  949. FINFO("Call RegisterEvCallback, EVENT_BATTLOW1");
  950. nRet = API_COM_RegisterEvCallBack(EVENT_BATTLOW1, FuncBattLow1CallBack);
  951. TestError(nRet, "Register EVENT_BATTLOW1");
  952. FINFO("Call RegisterEvCallback, EVENT_BATTLOW2");
  953. nRet = API_COM_RegisterEvCallBack(EVENT_BATTLOW2, FuncBattLow2CallBack);
  954. TestError(nRet, "Register EVENT_BATTLOW2");
  955. // 设置SDK日志文件路径
  956. string strLogPath = "";
  957. strLogPath = m_strWorkPath + "\\Logs";
  958. char* szLogPath = const_cast<char*>(strLogPath.c_str());
  959. FINFO("Call LogPathSet, Path: {$}", szLogPath);
  960. nRet = API_COM_LogPathSet(szLogPath);
  961. if (!TestError(nRet, "LogPathSet"))
  962. {
  963. return false;
  964. }
  965. // 初始化
  966. FINFO("Call Init");
  967. nRet = API_COM_Init();
  968. if (!TestError(nRet, "Init"))
  969. {
  970. return false;
  971. }
  972. Sleep(3000); //根据品臻工程师建议,Init接口要和Open接口间隔一段时间执行。
  973. FINFO("Initialize SDK over");
  974. printf("Initialize SDK over \n");
  975. m_bInitializedSDK = true;
  976. return true;
  977. }
  978. int PZMedicalCtrl::ConnectDetector()
  979. {
  980. printf("========ConnectDetector \n");
  981. FINFO("======== ConnectDetector");
  982. BOOL nRet = FALSE;
  983. string strPanelSerial = "";
  984. int nTimeoutInit = 10000;
  985. try
  986. {
  987. strPanelSerial = (string)m_objFPDConfig["SerialNumber"];
  988. nTimeoutInit = (int)m_objFPDConfig["ConnectTimeout"];
  989. }
  990. catch (ResDataObjectExption& e)
  991. {
  992. FERROR("Read configuration failed! Error code: {$}", e.what());
  993. return INIT_FAILED;
  994. }
  995. if (strPanelSerial == "")
  996. {
  997. FERROR("Serial number is null!");
  998. return INIT_FAILED;
  999. }
  1000. char szPanelSerial[32] = { '\0' }; //SDK需要32位char* 否则有可能解析出乱码,导致初始化失败
  1001. memcpy(szPanelSerial, strPanelSerial.c_str(), strPanelSerial.length());
  1002. FINFO("Call COM_Open, Detector Serial: {$}, Timeout: {$}", szPanelSerial, nTimeoutInit);
  1003. nRet = API_COM_Open(szPanelSerial);
  1004. if (!TestError(nRet, "Open"))
  1005. {
  1006. FINFO("Call Open again");
  1007. nRet = API_COM_Open(szPanelSerial); //根据品臻工程师建议,OPEN接口失败一次后尝试再调用一次
  1008. if (!TestError(nRet, "Open"))
  1009. {
  1010. return INIT_FAILED;
  1011. }
  1012. }
  1013. m_bConnectWaiting = true;
  1014. if (!WaitRespond(nTimeoutInit, "Open")) //m_hRespond 初始化等待link回调
  1015. {
  1016. FERROR("connect detector timeout!");
  1017. return INIT_CONNECT_ERR;
  1018. }
  1019. m_bConnectWaiting = false;
  1020. if (m_nCalibrationMode)//PZ自己的校正模式
  1021. {
  1022. bool bRet = SetFPDCalibrationMode();
  1023. if (!bRet)
  1024. {
  1025. FERROR("Load PZMedical template fail!");
  1026. return INIT_FAILED;
  1027. }
  1028. }
  1029. else
  1030. {
  1031. FINFO("Load ZSKK Reference file");
  1032. if (!m_pZSKKCalib->LoadZSKKGainMap(true, m_strPanelType))
  1033. {
  1034. FERROR("Load ZSKK Gain Map failed!");
  1035. }
  1036. if (!m_pZSKKCalib->LoadZSKKPixelMap(true, m_strPanelType))
  1037. {
  1038. FERROR("Load ZSKK Defect Map failed!");
  1039. }
  1040. }
  1041. FINFO("Connect detector over");
  1042. printf("Connect detector over \n");
  1043. //连接上探测器后获取gain校正曝光的总次数
  1044. m_nGainExposureNum = ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[m_nCurrentPanelID])->GetGainExposureNum();
  1045. FINFO("Gain Exposure Num:{$}",m_nGainExposureNum);
  1046. return INIT_SUCCESS;
  1047. }
  1048. //设置校正文件路径,获取SDK版本信息,获取探测器信息:sn version ip mac...
  1049. bool PZMedicalCtrl::InitDetector()
  1050. {
  1051. FINFO("========InitDetector");
  1052. BOOL bRet = FALSE;
  1053. //设置校正文件路径
  1054. bool bRes = SetFPDTplPath();
  1055. if (bRes)
  1056. {
  1057. TImageMode tImageMode;
  1058. FINFO("Call GetImageMode");
  1059. bRet = API_COM_GetImageMode(&tImageMode); //经过测试,这个接口要放到连接成功之后,否则获取不到信息
  1060. if (!TestError(bRet, "GetImageMode"))
  1061. {
  1062. return false;
  1063. }
  1064. else
  1065. {
  1066. //这里获取的图像大小,不一定是出图的大小,需要在GetImage的时候重新调用此接口获取图像大小
  1067. printf("Get Image Mode, Width: %d; Height: %d \n", tImageMode.usCol, tImageMode.usRow);
  1068. FINFO("Get Image Mode Width: {$}; Height: {$}", tImageMode.usCol, tImageMode.usRow);
  1069. }
  1070. CHAR szVersion[25] = { '\0' }; //字节数不能太小,否则会导致崩溃,经测试不能小于20
  1071. printf("Getting SDK version \n");
  1072. FINFO("Call GetDllVer");
  1073. bRet = API_COM_GetDllVer(szVersion);
  1074. if (!TestError(bRet, "GetDllVer"))
  1075. {
  1076. return false;
  1077. }
  1078. else
  1079. {
  1080. FINFO("[DLL Version: {$}]", szVersion);
  1081. }
  1082. TFPInfo tFPInfo = { 0 };
  1083. FINFO("Call GetFPInfo");
  1084. bRet = API_COM_GetFPInfo(&tFPInfo);
  1085. if (!TestError(bRet, "GetFPInfo"))
  1086. {
  1087. return false;
  1088. }
  1089. else
  1090. {
  1091. //转换IP
  1092. //IP格式是int32的4个字节,每个字节转换成10进制就是IP
  1093. UCHAR* pData = (UCHAR*)&tFPInfo.dwFpIp;
  1094. FINFO("[SN:{$}, McuVer:{$}, FPGA:{$}, PPCVer:{$}, IP:{$}.{$}.{$}.{$}]", tFPInfo.dwBoardSn,
  1095. tFPInfo.dwMcuVer, tFPInfo.dwFpgaVer, tFPInfo.dwSwVer, pData[3], pData[2], pData[1], pData[0]);
  1096. }
  1097. USHORT uXwin;
  1098. FINFO("Call GetXwin");
  1099. bRet = API_COM_GetXwin(&uXwin);
  1100. if (!TestError(bRet, "GetXwin"))
  1101. {
  1102. return false;
  1103. }
  1104. else
  1105. {
  1106. FINFO("Xwindow:{$}", uXwin);
  1107. }
  1108. FINFO("Call SetXwin");
  1109. bRet = API_COM_SetXwin(uXwin);
  1110. if (!TestError(bRet, "SetXwin"))
  1111. {
  1112. return false;
  1113. }
  1114. TRBConf RbConf = { 0 };
  1115. FINFO("Call GetRbConf");
  1116. bRet = API_COM_GetRBConf(&RbConf);
  1117. if (!TestError(bRet, "GetRbConf"))
  1118. {
  1119. return false;
  1120. }
  1121. else
  1122. {
  1123. RbConf.wXwin = uXwin;
  1124. FINFO("xwin_clock:{$}", RbConf.wXwin);
  1125. }
  1126. FINFO("Call SetRBConf");
  1127. bRet = API_COM_SetRBConf(&RbConf);
  1128. if (!TestError(bRet, "SetRBConf"))
  1129. {
  1130. return false;
  1131. }
  1132. }
  1133. FINFO("Initialize detector over");
  1134. return bRet;
  1135. }
  1136. /***
  1137. ** 设置校正文件路径
  1138. ** 说明:device\references\xxxxxx\dark是暗场校正过程文件
  1139. ** device\references\xxxxxx\gain是亮场校正过程文件
  1140. ** 校正完成后校正文件会生成到device\references\路径,strPanelSerial表示探测器序列号
  1141. ***/
  1142. bool PZMedicalCtrl::SetFPDTplPath()
  1143. {
  1144. FINFO("========SetFPDTplPath");
  1145. BOOL nRet = FALSE;
  1146. string strTplRootPath = m_strWorkPath + "\\references";
  1147. string strDarkTplPath = "";
  1148. string strFloodTplPath = "";
  1149. string strPanelSerial = "";
  1150. try
  1151. {
  1152. strPanelSerial = (string)m_objFPDConfig["SerialNumber"];
  1153. }
  1154. catch (ResDataObjectExption& e)
  1155. {
  1156. FERROR("Read configuration failed, Error code: {$}", e.what());
  1157. return false;
  1158. }
  1159. strDarkTplPath = strTplRootPath + "\\" + strPanelSerial + "\\dark\\";
  1160. strFloodTplPath = strTplRootPath + "\\" + strPanelSerial + "\\gain\\";
  1161. // 创建dark文件路径
  1162. if (CreateFileDirectory(strDarkTplPath))
  1163. {
  1164. FINFO("Create Directory: {$}", strDarkTplPath.c_str());
  1165. m_strTplDarkPath = strDarkTplPath;
  1166. }
  1167. else
  1168. {
  1169. FERROR("Create Directory: {$} failed", strDarkTplPath.c_str());
  1170. return false;
  1171. }
  1172. // 创建flood文件路径
  1173. if (CreateFileDirectory(strFloodTplPath))
  1174. {
  1175. FINFO("Create Directory: {$}", strFloodTplPath.c_str());
  1176. m_strTplFloodPath = strFloodTplPath;
  1177. }
  1178. else
  1179. {
  1180. FERROR("Create Directory: {$} failed", strFloodTplPath.c_str());
  1181. return false;
  1182. }
  1183. return true;
  1184. }
  1185. /***
  1186. ** 设置品臻板子出图时都应用哪些校正
  1187. * 当校正模式是PZ自己的校正时调用
  1188. ***/
  1189. bool PZMedicalCtrl::SetFPDCalibrationMode()
  1190. {
  1191. FINFO("========SetFPDCalibrationMode");
  1192. BOOL nRet = FALSE;
  1193. nRet = API_COM_SetCalibMode(IMG_CALIB_OFFSET | IMG_CALIB_GAIN | IMG_CALIB_DEFECT);
  1194. if (!TestError(nRet, "SetCalibMode"))
  1195. {
  1196. return false;
  1197. }
  1198. FINFO("Call SetAllTpl");
  1199. nRet = API_COM_SetAllTpl();
  1200. if (!TestError(nRet, "SetAllTpl"))
  1201. {
  1202. m_pStPanelStatus[m_nCurrentPanelID]->bLostTemplate = true;
  1203. FERROR("Set Template Failed, There are no Templates here");
  1204. return false;
  1205. }
  1206. return true;
  1207. }
  1208. /***
  1209. ** 获取探测器连接模式
  1210. ***/
  1211. void PZMedicalCtrl::GetConnectionMode()
  1212. {
  1213. FINFO("========GetConnectionMode");
  1214. BOOL nRet;
  1215. CHAR szFPSn[32] = { '\0' }; //SDK升级,改为32位数组
  1216. FINFO("Call GetFPSn");
  1217. nRet = API_COM_GetFPsn(szFPSn);
  1218. if (!TestError(nRet, "GetFPSn"))
  1219. {
  1220. FERROR("Get detector serial number failed");
  1221. }
  1222. else
  1223. {
  1224. FINFO("FP Sn: {$}", szFPSn);
  1225. }
  1226. string panel_sn = szFPSn;
  1227. ConfFeedback(EVT_CONF_PANEL_SERIAL, m_nCurrentPanelID, panel_sn.c_str());
  1228. FINFO("Call GetFPWireState");
  1229. CHAR cStateTemp = API_COM_GetFPWireState(); //是否是wifi连接方式
  1230. if (cStateTemp == CONNECT_WIFI)
  1231. {
  1232. FINFO("GetFPWireState return: Wireless Mode");
  1233. m_bWired = false;
  1234. }
  1235. else if (cStateTemp == CONNECT_WIRE)
  1236. {
  1237. FINFO("GetFPWireState return: Wired Mode");
  1238. m_bWired = true;
  1239. }
  1240. else
  1241. {
  1242. FERROR("GetFPWireState return unknown mode: {$}", (int)cStateTemp);
  1243. }
  1244. }
  1245. DWORD __stdcall PZMedicalCtrl::onFPDScanThread(PVOID pvoid)
  1246. {
  1247. PZMedicalCtrl* pOpr = (PZMedicalCtrl*)pvoid;
  1248. FINFO("Enter Scan Thread");
  1249. bool bExit = false;
  1250. while (!bExit)
  1251. {
  1252. DWORD dwRet = WaitForMultipleObjects(5, pOpr->m_hArrayEvent, FALSE, INFINITE);
  1253. if (WAIT_OBJECT_0 == dwRet) //m_hStopScanEvent
  1254. {
  1255. bExit = true;
  1256. }
  1257. else if (WAIT_OBJECT_0 + 1 == dwRet) //m_hProcessImgEvent
  1258. {
  1259. pOpr->OnProcessImg();
  1260. }
  1261. else if (WAIT_OBJECT_0 + 2 == dwRet) //m_hXWinOnEvent
  1262. {
  1263. DWORD dwXrayOnTime, dwXrayOffTime;
  1264. dwXrayOnTime = dwXrayOffTime = GetTickCount();
  1265. printf("XWindowOn \n");
  1266. FINFO("XWindowOn: {$}", dwXrayOnTime);
  1267. pOpr->StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1268. while (dwXrayOffTime - dwXrayOnTime < 750)
  1269. {
  1270. dwXrayOffTime = GetTickCount();
  1271. }
  1272. printf("XWindowOff \n");
  1273. FINFO("XWindowOff: {$}", dwXrayOffTime);
  1274. pOpr->StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  1275. }
  1276. else if (WAIT_OBJECT_0 + 3 == dwRet) //m_hInitFPDEvent
  1277. {
  1278. pOpr->OnProcessInitFPD();
  1279. }
  1280. else if (WAIT_OBJECT_0 + 4 == dwRet) //m_hReInitEvent
  1281. {
  1282. pOpr->OnReInitFPD();
  1283. }
  1284. else if (WAIT_OBJECT_0 + 5 == dwRet) //m_hDarkEndEvent
  1285. {
  1286. pOpr->OnProcessDarkEnd();
  1287. }
  1288. }
  1289. FINFO("Exit Scan Thread");
  1290. pOpr->m_hFPDScanThread = nullptr;
  1291. SetEvent(pOpr->m_hToggleEvent);
  1292. return 0;
  1293. }
  1294. void PZMedicalCtrl::StopThread()
  1295. {
  1296. FINFO("========StopThread");
  1297. SetEvent(m_hStopScanEvent); //关闭Scan线程
  1298. DWORD result = WaitForSingleObject(m_hToggleEvent, 65000);
  1299. if (result == WAIT_OBJECT_0)
  1300. {
  1301. FINFO("Leave scan thread over");
  1302. }
  1303. else if (result == WAIT_TIMEOUT)
  1304. {
  1305. FERROR("wait time out");
  1306. }
  1307. }
  1308. /***
  1309. ** 处理图像
  1310. ***/
  1311. void PZMedicalCtrl::OnProcessImg()
  1312. {
  1313. BOOL bRet = FALSE;
  1314. FINFO("========Here Come the Image");
  1315. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1316. TImageMode tImageMode;
  1317. FINFO("Call GetImageMode");
  1318. bRet = API_COM_GetImageMode(&tImageMode); //经过测试,这个接口要放到连接成功之后,否则获取不到信息
  1319. if (!TestError(bRet, "GetImageMode"))
  1320. {
  1321. return;
  1322. }
  1323. m_nRawImgWidth = tImageMode.usCol;
  1324. m_nRawImgHeight = tImageMode.usRow;
  1325. FINFO("OnProcessImg Get Image Mode Width: {$}; Height: {$}", tImageMode.usCol, tImageMode.usRow);
  1326. int nRawImgWidth = 0;
  1327. int nRawImgHeight = 0;
  1328. int nImageWidth = 0;
  1329. int nImageHeight = 0;
  1330. int nRightOffset = 0;//右侧裁剪宽度
  1331. int nBottomOffset = 0;//下方裁剪宽度
  1332. try
  1333. {
  1334. nRawImgWidth = (int)m_ModeConfig["ModeTable"][m_nCurrentLogicMode - 1]["RawImgWidth"];
  1335. nRawImgHeight = (int)m_ModeConfig["ModeTable"][m_nCurrentLogicMode-1]["RawImgHeight"];
  1336. nImageWidth = (int)m_ModeConfig["ModeTable"][m_nCurrentLogicMode - 1]["ImageWidth"];
  1337. nImageHeight = (int)m_ModeConfig["ModeTable"][m_nCurrentLogicMode - 1]["ImageHeight"];
  1338. }
  1339. catch (ResDataObjectExption& exp)
  1340. {
  1341. FERROR("Get config failed: {$}", exp.what());
  1342. return;
  1343. }
  1344. nRightOffset = nRawImgWidth - m_nWidthOffset - nImageWidth;
  1345. nBottomOffset = nRawImgHeight - m_nHeightOffset - nImageHeight;
  1346. if (m_nWidthOffset == 0 && nRightOffset == 0)//配置了左右裁剪
  1347. {
  1348. m_nImageWidth = m_nRawImgWidth;
  1349. }
  1350. else
  1351. {
  1352. m_nImageWidth = IMAGE_WIDTH - m_nWidthOffset - nRightOffset;
  1353. if (m_nImageWidth >= m_nRawImgWidth)
  1354. {
  1355. m_nImageWidth = m_nRawImgWidth;
  1356. m_nWidthOffset = 0;
  1357. }
  1358. else
  1359. {
  1360. if (m_nRawImgWidth - m_nImageWidth < m_nWidthOffset)
  1361. {
  1362. m_nWidthOffset = m_nRawImgWidth - m_nImageWidth;
  1363. }
  1364. }
  1365. }
  1366. if (m_nHeightOffset == 0 && nBottomOffset == 0)//配置了上下裁剪
  1367. {
  1368. m_nImageHeight = m_nRawImgHeight;
  1369. }
  1370. else
  1371. {
  1372. m_nImageHeight = IMAGE_HEIGHT - m_nHeightOffset - nBottomOffset;
  1373. if (m_nImageHeight >= m_nRawImgHeight)//如果裁剪后依然大于等于实际出图大小,那么就按实际出图大小走
  1374. {
  1375. m_nImageHeight = m_nRawImgHeight;
  1376. m_nHeightOffset = 0;
  1377. }
  1378. else
  1379. {
  1380. if (m_nRawImgHeight - m_nImageHeight < m_nHeightOffset)
  1381. {
  1382. m_nHeightOffset = m_nRawImgHeight - m_nImageHeight;
  1383. }
  1384. }
  1385. }
  1386. FINFO("m_nImageWidth:{$},m_nImageHeight:{$},m_nWidthOffset:{$},m_nHeightOffset:{$}", m_nImageWidth, m_nImageHeight, m_nWidthOffset, m_nHeightOffset);
  1387. if (m_nImageWidth <= 0 || m_nImageHeight <= 0)
  1388. {
  1389. FERROR("Please check crop size!");
  1390. return;
  1391. }
  1392. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "ImageWidth", m_nImageWidth);
  1393. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "ImageHeight", m_nImageHeight);
  1394. if (m_pRawImgBuffer)
  1395. {
  1396. delete m_pRawImgBuffer;
  1397. m_pRawImgBuffer = nullptr;
  1398. }
  1399. m_pRawImgBuffer = new WORD[m_nRawImgWidth * m_nRawImgHeight];
  1400. if (m_pImgBuffer)
  1401. {
  1402. delete m_pImgBuffer;
  1403. m_pImgBuffer = NULL;
  1404. }
  1405. m_pImgBuffer = new WORD[m_nImageWidth * m_nImageHeight];
  1406. bRet = API_COM_GetImage((CHAR*)m_pRawImgBuffer);
  1407. if (!TestError(bRet, "GetImage"))
  1408. {
  1409. return;
  1410. }
  1411. if (m_nSaveRaw == 1 || m_nSaveRaw == 3)//保存应用校正文件前的图像
  1412. {
  1413. SaveRawImage("BeforeCalibration.raw", m_pRawImgBuffer, m_nRawImgWidth, m_nRawImgHeight);
  1414. }
  1415. if (m_nWidthOffset != 0 || m_nHeightOffset != 0)
  1416. {
  1417. FINFO("Begin get effect image");
  1418. if (!GetEffectiveImage(m_pImgBuffer, m_pRawImgBuffer, m_nRawImgWidth))
  1419. {
  1420. return;
  1421. }
  1422. FINFO("Get effect image over");
  1423. if (m_nAppStatus != APP_STATUS_CAL_BEGIN && m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1424. {
  1425. FINFO("Apply ZSKK Calibration File");
  1426. m_pZSKKCalib->m_nGridSuppressed = 6;
  1427. m_pZSKKCalib->ApplyZSKKReference(m_nImageHeight, m_nImageWidth, m_pImgBuffer);
  1428. }
  1429. if (m_nSaveRaw > 1)
  1430. {
  1431. SaveRawFunc(m_pImgBuffer, m_nImageWidth, m_nImageHeight);
  1432. }
  1433. DataFeedback(EVT_DATA_RAW_IMAGE, m_pImgBuffer);
  1434. }
  1435. else
  1436. {
  1437. FINFO("m_nWidthOffset and m_nHeightOffset is 0");
  1438. if (m_nAppStatus != APP_STATUS_CAL_BEGIN && m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1439. {
  1440. FINFO("Apply ZSKK Calibration File");
  1441. m_pZSKKCalib->m_nGridSuppressed = 6;
  1442. m_pZSKKCalib->ApplyZSKKReference(m_nRawImgHeight, m_nRawImgWidth, m_pRawImgBuffer);
  1443. }
  1444. if (m_nSaveRaw > 1)
  1445. {
  1446. SaveRawFunc(m_pRawImgBuffer, m_nRawImgWidth, m_nRawImgHeight);
  1447. }
  1448. DataFeedback(EVT_DATA_RAW_IMAGE, m_pRawImgBuffer);
  1449. }
  1450. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  1451. }
  1452. void PZMedicalCtrl::SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight)
  1453. {
  1454. FINFO("========SaveRawFunc");
  1455. FILE* fp;
  1456. char filename[256] = {0};
  1457. //SYSTEMTIME st;
  1458. //GetLocalTime(&st);
  1459. //FINFO("Date: [%04d:%02d:%02d] ", st.wYear, st.wMonth, st.wDay);
  1460. //sprintf(filename, "\\RawData\\Raw%02d-%02d-%02d-%02d-%02d.raw", st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
  1461. sprintf(filename, "\\RawData\\Raw.raw");
  1462. string strFileName = m_strWorkPath + filename;
  1463. if ((fp = fopen(strFileName.c_str(), "wb")) == NULL)
  1464. {
  1465. DWORD dw = GetLastError();
  1466. FERROR("fopen {$} failed, {$}", strFileName.c_str(), dw);
  1467. return;
  1468. }
  1469. fwrite(pInImg, sizeof(WORD), nImgWidth * nImgHeight, fp);
  1470. fclose(fp);
  1471. FINFO("Save image over");
  1472. }
  1473. /***
  1474. * 保存RAW图像
  1475. ***/
  1476. bool PZMedicalCtrl::SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight)
  1477. {
  1478. FINFO("========SaveRawImage");
  1479. FINFO("ImageName:{$}, width: {$}, height: {$}", pImgName, nWidth, nHeight);
  1480. if (pRawImg == NULL || pImgName == NULL)
  1481. {
  1482. return false;
  1483. }
  1484. string strImagePath = "";
  1485. if (m_bAutonumousMode)
  1486. {
  1487. /*string strImageDir = m_strWorkPath + "\\rawdata\\Autonumous\\" + m_strAutonumousMetaData;
  1488. if (GetFileAttributesA(strImageDir.c_str()) != FILE_ATTRIBUTE_DIRECTORY)
  1489. {
  1490. bool flag = CreateDirectory(strImageDir.c_str(), NULL);
  1491. FINFO("Create dir: {$}", strImageDir);
  1492. }
  1493. else
  1494. {
  1495. FINFO("{$} already exist", strImageDir);
  1496. }
  1497. strImagePath = m_strWorkPath + "\\rawdata\\Autonumous\\" + m_strAutonumousMetaData + "\\" + pImgName;*/
  1498. }
  1499. else
  1500. {
  1501. strImagePath = m_strWorkPath + "\\rawdata\\" + pImgName;
  1502. }
  1503. FILE* fp;
  1504. if ((fp = fopen(strImagePath.c_str(), "wb")) == NULL)
  1505. {
  1506. DWORD dw = GetLastError();
  1507. FERROR("fopen {$} failed, {$}", strImagePath.c_str(), dw);
  1508. return false;
  1509. }
  1510. fwrite(pRawImg, sizeof(WORD), nWidth * nHeight, fp);
  1511. fclose(fp);
  1512. FINFO("End to Save Raw Image");
  1513. return true;
  1514. }
  1515. /***
  1516. ** 裁剪图像
  1517. ** pOutImg: 裁剪后图像; pInImg: 裁剪前图像; nInWidth: 裁剪前图像宽度
  1518. ***/
  1519. bool PZMedicalCtrl::GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth)
  1520. {
  1521. FINFO("========GetEffectiveImage");
  1522. if (pOutImg == NULL || pInImg == NULL || nInWidth < 0)
  1523. {
  1524. FERROR("Illegal parameter, can not get effective image");
  1525. return false;
  1526. }
  1527. try
  1528. {
  1529. for (int i = 0; i < m_nImageHeight; i++)
  1530. {
  1531. memcpy(pOutImg + i * m_nImageWidth,
  1532. pInImg + (i + m_nHeightOffset) * nInWidth + m_nWidthOffset,
  1533. m_nImageWidth * sizeof(WORD));
  1534. }
  1535. }
  1536. catch (...)
  1537. {
  1538. FERROR("Get effective image crashed");
  1539. return false;
  1540. }
  1541. return true;
  1542. }
  1543. /// <summary>
  1544. /// 实际探测器初始化,事件触发
  1545. /// 连接探测器并进行初始化操作
  1546. /// </summary>
  1547. void PZMedicalCtrl::OnProcessInitFPD()
  1548. {
  1549. FINFO("========OnProcessInitFPD");
  1550. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_START);
  1551. int nRet = INIT_SUCCESS;
  1552. //加载SDK
  1553. if (!m_bLoadedSDK && !LoadSDK())
  1554. {
  1555. nRet = INIT_FAILED;
  1556. FERROR("LoadSDK fail!");
  1557. }
  1558. //初始化SDK
  1559. if (INIT_SUCCESS == nRet && !m_bInitializedSDK && !InitSDK())
  1560. {
  1561. nRet = INIT_FAILED;
  1562. FERROR("InitSDK fail!");
  1563. }
  1564. //连接探测器
  1565. if (INIT_SUCCESS == nRet)
  1566. {
  1567. nRet = ConnectDetector();
  1568. if (INIT_SUCCESS == nRet)
  1569. {
  1570. //初始化探测器
  1571. if (!InitDetector())
  1572. {
  1573. nRet = INIT_FAILED;
  1574. FERROR("InitDetector fail!");
  1575. }
  1576. }
  1577. else
  1578. {
  1579. FERROR("ConnectDetector fail!");
  1580. }
  1581. }
  1582. if (INIT_FAILED == nRet)
  1583. {
  1584. FERROR("INIT_FAILED");
  1585. m_pStPanelStatus[m_nCurrentPanelID]->bInitError = true;
  1586. ErrorFeedback(EVT_ERR_INIT_FAILED, "true");
  1587. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_ERROR);
  1588. }
  1589. else if (INIT_CONNECT_ERR == nRet)
  1590. {
  1591. FERROR("INIT_CONNECT_ERR");
  1592. m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit = true;
  1593. ErrorFeedback(EVT_ERR_COMMUNICATE, "true", m_nCurrentPanelID);
  1594. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END);
  1595. }
  1596. else
  1597. {
  1598. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_OK);//OnProcessInitFPD
  1599. SetPZDPCState(PZDPC_STATE_STANDBY);
  1600. }
  1601. }
  1602. /***
  1603. ** 说明:初始化阶段,未连接探测器,重连后需要继续初始化探测器
  1604. ***/
  1605. void PZMedicalCtrl::OnReInitFPD()
  1606. {
  1607. FINFO("========OnReInitFPD");
  1608. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_START);
  1609. if (!InitDetector())
  1610. {
  1611. m_pStPanelStatus[m_nCurrentPanelID]->bInitError = true;
  1612. ErrorFeedback(EVT_ERR_INIT_FAILED, "true");
  1613. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_ERROR);
  1614. }
  1615. m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit = false;
  1616. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_OK);//OnReInitFPD
  1617. }
  1618. DWORD __stdcall PZMedicalCtrl::onCalibrationThread(PVOID pvoid)
  1619. {
  1620. PZMedicalCtrl* pOpr = (PZMedicalCtrl*)pvoid;
  1621. if (pOpr->OnProcessCalibration())
  1622. {
  1623. FINFO("Calibration process over");
  1624. }
  1625. else
  1626. {
  1627. pOpr->StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_ERROR);
  1628. FERROR("Quit calibration over(with error)");
  1629. }
  1630. CloseHandle(pOpr->m_hCalibrationThread);
  1631. pOpr->m_hCalibrationThread = nullptr;
  1632. FINFO("Quit calibration process");
  1633. return 0;
  1634. }
  1635. /***
  1636. ** 校正过程
  1637. ** 说明:校正辅助线程,结合校正process的阶段和SDK回调完成校正流程
  1638. ** (ActiveCalibration)停止采集,进入idle状态(set prepare event)[CalibINIT process]
  1639. ** 修改配置
  1640. ** == dark ==
  1641. ** 1.(StartCalibration)调用api,进入hst状态(set offset event)
  1642. ** 2.调用api,开始采集dark图像(image callback)
  1643. ** 3.保存8张dark图像,停止采集,进入idle状态(set endcalib/aed event)[CalibOFFSET process]
  1644. ** (上aed图过程目前只在aed同步模式下进行)
  1645. ** 4.接收10张aed图像,上传数据,停止采集,进入idle状态(set endcalib event)[CalibAED process]
  1646. ** == flood ==
  1647. ** 1.(PrepareCalibration)调用api,进入hst或aed状态
  1648. ** 2.(StartCalibration)调用api,采集flood图像(image callback)
  1649. ** 3.修改配置,进入hst或aed模式,采集亮场图像
  1650. ** 4.重复1、2、3,采集8张flood图像,停止采集,进入idle状态(set endcalib event)[CalibGAIN process]
  1651. ** (endcalib event)生成校正文件,恢复配置
  1652. ***/
  1653. bool PZMedicalCtrl::OnProcessCalibration()
  1654. {
  1655. FINFO("========OnProcessCalibration");
  1656. bool bExitThread = false;
  1657. BOOL nRet = FALSE;
  1658. while (!bExitThread)
  1659. {
  1660. DWORD dwSignal = WaitForMultipleObjects(9, m_hPZMCalibration, FALSE, INFINITE);
  1661. if (dwSignal == WAIT_OBJECT_0) // 采集前配置 m_hPZMPrepare
  1662. {
  1663. // 修改探测器配置
  1664. // 参考品臻提供的Demo代码,每次都是先Get再Set
  1665. TFPUserCfg stUserCfg;
  1666. memset(&stUserCfg, 0, sizeof(stUserCfg));
  1667. FINFO("Get [Calibration Prepare] Event, Call GetFPConf");
  1668. nRet = API_COM_GetFPConf(&stUserCfg);
  1669. if (!TestError(nRet, "GetFPConf"))
  1670. {
  1671. return false;
  1672. }
  1673. stUserCfg.wPreProcessing = 0; // 前校正raw
  1674. FINFO("Call SetFPConf, Set PreProcessing to RAW");
  1675. nRet = API_COM_SetFPConf(&stUserCfg);
  1676. if (!TestError(nRet, "SetFPConf"))
  1677. {
  1678. return false;
  1679. }
  1680. Sleep(5000); // 5s延迟,保证配置完成
  1681. }
  1682. //暗场校正开始 由于品臻的暗场校正就调一个sdk刷暗场就可以了,不采集暗场图,故此处直接结束
  1683. else if (dwSignal == WAIT_OBJECT_0 + 1) //m_hPZMStartOffset
  1684. {
  1685. FINFO("Start Offset Event");
  1686. }
  1687. // 采集暗场图过程
  1688. else if (dwSignal == WAIT_OBJECT_0 + 2) //m_hPZMInOffset
  1689. {
  1690. FINFO("Start Offset Event more picture");
  1691. }
  1692. // 废弃:开始传10张图
  1693. else if (dwSignal == WAIT_OBJECT_0 + 3) //m_hPZMStartAED
  1694. {
  1695. }
  1696. // AED上10张图过程
  1697. else if (dwSignal == WAIT_OBJECT_0 + 4) //m_hPZMEndAED
  1698. {
  1699. }
  1700. // 开始采集亮场图
  1701. else if (dwSignal == WAIT_OBJECT_0 + 5) //m_hPZMStartGain
  1702. {
  1703. }
  1704. // 是否采够亮场图数量,采集完成就停止采集,否则继续采集
  1705. else if (dwSignal == WAIT_OBJECT_0 + 6) //m_hPZMInGain
  1706. {
  1707. FINFO("gain calibration gather {$} pictures", m_nGainImg);
  1708. if (m_nGainImg == m_nGainExposureNum)
  1709. {
  1710. printf("采集亮场图 集齐 %d 张 \r\n", m_nGainExposureNum);
  1711. Sleep(1000); // 厂家的建议,使探测器完成上一阶段过程
  1712. printf("m_hPZMInGain stop acquisition\n");
  1713. FINFO("m_hPZMInGain stop acquisition");
  1714. if (!StopAcquisition(nullptr))
  1715. {
  1716. return false;
  1717. }
  1718. printf("PZ 探测器 IDLE \r\n");
  1719. //Sleep(5000); // 厂家的建议20s,使探测器完成上一阶段过程
  1720. // 修改探测器配置 参考品臻提供的Demo代码,每次都是先Get再Set
  1721. TFPUserCfg stUserCfg;
  1722. memset(&stUserCfg, 0, sizeof(stUserCfg));
  1723. FINFO("Get [Calibration StartAED] Event, Call GetFPConf");
  1724. nRet = API_COM_GetFPConf(&stUserCfg);
  1725. if (!TestError(nRet, "GetFPConf"))
  1726. {
  1727. return false;
  1728. }
  1729. stUserCfg.wPreProcessing = 1; // 前校正offset
  1730. FINFO("Call SetFPConf, Set PreProcessing to OFFSET");
  1731. nRet = API_COM_SetFPConf(&stUserCfg);
  1732. if (!TestError(nRet, "SetFPConf"))
  1733. {
  1734. return false;
  1735. }
  1736. FINFO("Sleep 5s.... ensure configuration complete");
  1737. Sleep(5000); // 5s延迟,保证配置完成
  1738. //结束亮场校正
  1739. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  1740. }
  1741. }
  1742. // 正常结束校正
  1743. else if (dwSignal == WAIT_OBJECT_0 + 7) //m_hEndCalibEvent
  1744. {
  1745. FINFO("Get [end calib] Event");
  1746. if (CCOS_CALIBRATION_TYPE_DARK == m_eType)
  1747. {
  1748. printf("DARK 校正 结束 \r\n");
  1749. FINFO("dark calibraion end");
  1750. }
  1751. else
  1752. {
  1753. printf("XRAY 校正 结束 \r\n");
  1754. FINFO("xray calibraion end");
  1755. bExitThread = true;
  1756. GetCalibrationTime();
  1757. StatusFeedback(EVT_STATUS_SAVECALIB, PANEL_EVENT_START);
  1758. StatusFeedback(EVT_STATUS_SAVECALIB, PANEL_EVENT_END);
  1759. }
  1760. }
  1761. // 退出校正,可能是异常退出
  1762. else if (dwSignal == WAIT_OBJECT_0 + 8) //m_hPZMEndEvent
  1763. {
  1764. FINFO("Get [PZ End] Event");
  1765. if (m_bCalibrationOver) // 如果是校正结束,则更新校正文件
  1766. {
  1767. if (m_nCalibrationMode)//PZ自己的校正
  1768. {
  1769. if (CCOS_CALIBRATION_TYPE_DARK == m_eType)
  1770. {
  1771. FINFO("Call GenOffsetTpl");
  1772. nRet = API_COM_GenOffsetTpl();
  1773. if (!TestError(nRet, "GenOffsetTpl"))
  1774. {
  1775. FERROR("Save Offset Template Failed");
  1776. //return false;
  1777. }
  1778. }
  1779. else
  1780. {
  1781. FINFO("Call GenGainTpl");
  1782. nRet = API_COM_GenGainTpl();
  1783. if (!TestError(nRet, "GenGainTpl"))
  1784. {
  1785. FERROR("Save Gain Template Failed");
  1786. //return false;
  1787. }
  1788. FINFO("Call GenDefectTpl");
  1789. nRet = API_COM_GenDefectTpl();
  1790. if (!TestError(nRet, "GenDefectTpl"))
  1791. {
  1792. FERROR("Save Defect Template Failed");
  1793. //return false;
  1794. }
  1795. }
  1796. }
  1797. }
  1798. // 修改探测器配置
  1799. // 参考品臻提供的Demo代码,每次都是先Get再Set
  1800. TFPUserCfg stUserCfg;
  1801. memset(&stUserCfg, 0, sizeof(stUserCfg));
  1802. FINFO("Call GetFPConf");
  1803. nRet = API_COM_GetFPConf(&stUserCfg);
  1804. if (!TestError(nRet, "GetFPConf"))
  1805. {
  1806. //return false;
  1807. }
  1808. stUserCfg.wPreProcessing = 1; // 前校正offset
  1809. FINFO("Call SetFPConf, Set PreProcessing to OFFSET");
  1810. nRet = API_COM_SetFPConf(&stUserCfg);
  1811. if (!TestError(nRet, "SetFPConf"))
  1812. {
  1813. //return false;
  1814. }
  1815. Sleep(5000); // 5s延迟,保证配置完成
  1816. bExitThread = true;
  1817. }
  1818. }
  1819. return true;
  1820. }
  1821. void PZMedicalCtrl::SetPZDPCState(PZDPC_State ePZDPCstate)
  1822. {
  1823. string strlog = "Unknown";
  1824. switch (ePZDPCstate)
  1825. {
  1826. case PZDPC_STATE_INIT:
  1827. strlog = "INIT";
  1828. break;
  1829. case PZDPC_STATE_STANDBY:
  1830. strlog = "STANDBY";
  1831. break;
  1832. case PZDPC_STATE_WORK:
  1833. strlog = "WORK";
  1834. break;
  1835. case PZDPC_STATE_CALIBRATION:
  1836. strlog = "CALIBRATION";
  1837. break;
  1838. case PZDPC_STATE_EXIT:
  1839. strlog = "EXIT";
  1840. break;
  1841. case PZDPC_STATE_MAX:
  1842. break;
  1843. default:
  1844. break;
  1845. }
  1846. FINFO("Set PZ DPC state {$}", strlog.c_str());
  1847. m_ePZDPCstate = ePZDPCstate;
  1848. }
  1849. PZDPC_State PZMedicalCtrl::GetPZDPCState()
  1850. {
  1851. string strlog = "Unknown";
  1852. switch (m_ePZDPCstate)
  1853. {
  1854. case PZDPC_STATE_INIT:
  1855. strlog = "INIT";
  1856. break;
  1857. case PZDPC_STATE_STANDBY:
  1858. strlog = "STANDBY";
  1859. break;
  1860. case PZDPC_STATE_WORK:
  1861. strlog = "WORK";
  1862. break;
  1863. case PZDPC_STATE_CALIBRATION:
  1864. strlog = "CALIBRATION";
  1865. break;
  1866. case PZDPC_STATE_EXIT:
  1867. strlog = "EXIT";
  1868. break;
  1869. case PZDPC_STATE_MAX:
  1870. break;
  1871. default:
  1872. break;
  1873. }
  1874. FINFO("Get state, {$}", strlog.c_str());
  1875. return m_ePZDPCstate;
  1876. }
  1877. /***
  1878. * 执行失败,记录错误号,返回false;执行成功,返回true
  1879. * SDK接口(BOOL返回值)成功则返回TRUE, 失败返回FALSE
  1880. ***/
  1881. bool PZMedicalCtrl::TestError(BOOL nRet, const char* szFuncName)
  1882. {
  1883. if (nRet)
  1884. {
  1885. FINFO("{$} returned OK", szFuncName);
  1886. return true;
  1887. }
  1888. else
  1889. {
  1890. FERROR("{$} returned failed, Error Code: {$}", szFuncName, API_COM_GetErrNo());
  1891. return false;
  1892. }
  1893. }
  1894. bool PZMedicalCtrl::WaitRespond(int nTimeOut, const char* szPosition)
  1895. {
  1896. FINFO("--- {$} WaitRespond, {$}ms ---", szPosition, nTimeOut);
  1897. DWORD dwRet = WaitForSingleObject(m_hRespond, nTimeOut);
  1898. if (dwRet == WAIT_TIMEOUT)
  1899. {
  1900. FERROR("Timeout in wait respond");
  1901. return false;
  1902. }
  1903. return true;
  1904. }
  1905. void PZMedicalCtrl::StopWaiting(const char* szPosition)
  1906. {
  1907. FINFO("--- Stop waiting respond, {$} ---", szPosition);
  1908. SetEvent(m_hRespond);
  1909. }
  1910. BOOL __stdcall PZMedicalCtrl::FuncLinkUpCallBack(char cEvent)
  1911. {
  1912. FINFO("[EVENT_LINKUP] EventNum({$}): Detector connected.", (int)cEvent);
  1913. return g_pDetector->OnProcessLink(cEvent);
  1914. }
  1915. BOOL __stdcall PZMedicalCtrl::FuncLinkDownCallBack(char cEvent)
  1916. {
  1917. FINFO("[EVENT_LINKDOWN] EventNum({$}): Detector disconnected!", (int)cEvent);
  1918. return g_pDetector->OnProcessBreak(cEvent);
  1919. }
  1920. BOOL __stdcall PZMedicalCtrl::FuncImageCallBack(char cEvent)
  1921. {
  1922. FINFO("[EVENT_IMAGEVALID]");
  1923. printf("[EVENT_IMAGEVALID] \n");
  1924. return g_pDetector->OnProcessImage(cEvent);
  1925. }
  1926. BOOL __stdcall PZMedicalCtrl::FuncHeartBeatCallBack(char cEvent)
  1927. {
  1928. // FINFO("[EVENT_HEARTBEAT] EventNum(%d): Detector activate", (int)cEvent);
  1929. return g_pDetector->OnProcessHeartBeat(cEvent);
  1930. }
  1931. BOOL __stdcall PZMedicalCtrl::FuncReadyCallBack(char cEvent)
  1932. {
  1933. printf("[EVENT_READY] EventNum(%d)\n", cEvent);
  1934. FINFO("[EVENT_READY] EventNum({$})", (int)cEvent);
  1935. g_pDetector->StatusFeedback(EVT_STATUS_PANEL, PANEL_START_ACQ);
  1936. g_pDetector->StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1937. return TRUE;
  1938. }
  1939. BOOL __stdcall PZMedicalCtrl::FuncExposeCallBack(char cEvent)
  1940. {
  1941. //此事件只有在A843B探测器工作在AED模式的时候才会回调
  1942. printf("PZ FPD Detect Xray comed .....\n");
  1943. FINFO("[EVENT_EXPOSE] EventNum({$})", (int)cEvent);
  1944. g_pDetector->StatusFeedback(EVT_STATUS_PANEL, PANEL_XRAY_ON);
  1945. return TRUE;
  1946. }
  1947. BOOL __stdcall PZMedicalCtrl::FuncExposeEndCallBack(char cEvent)
  1948. {
  1949. //此事件只有在A843B探测器工作在AED模式的时候才会回调
  1950. FINFO("[EVENT_EXPEND] EventNum({$})", (int)cEvent);
  1951. printf("PZ FPD Detect Xray expose end .....\n");
  1952. g_pDetector->StatusFeedback(EVT_STATUS_PANEL, PANEL_XRAY_OFF);
  1953. return TRUE;
  1954. }
  1955. BOOL __stdcall PZMedicalCtrl::FuncOffsetDoneCallBack(char cEvent)
  1956. {
  1957. FINFO("[EVENT_OFFSETDONE] EventNum({$})", (int)cEvent);
  1958. printf("offset done success.....\n");
  1959. return TRUE;
  1960. }
  1961. BOOL __stdcall PZMedicalCtrl::FuncAedA1CallBack(char cEvent)
  1962. {
  1963. FINFO("[EVENT_AED_A1] EventNum({$})", (int)cEvent);
  1964. printf("detector notify at aed a1 status.....\n");
  1965. return TRUE;
  1966. }
  1967. BOOL __stdcall PZMedicalCtrl::FuncAedA2CallBack(char cEvent)
  1968. {
  1969. FINFO("[EVENT_AED_A2] EventNum({$})", (int)cEvent);
  1970. printf("detector notify at aed a2 status.....\n");
  1971. g_pDetector->StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  1972. return TRUE;
  1973. }
  1974. BOOL __stdcall PZMedicalCtrl::FuncImageStartCallBack(char cEvent)
  1975. {
  1976. FINFO("[EVENT_IMAGESTART] EventNum({$})", (int)cEvent);
  1977. printf("start to transmit image data......\n");
  1978. return TRUE;
  1979. }
  1980. BOOL __stdcall PZMedicalCtrl::FuncImageEndCallBack(char cEvent)
  1981. {
  1982. FINFO("[EVENT_IMAGEEND] EventNum({$})", (int)cEvent);
  1983. printf("end to transmit image data.....\n");
  1984. return TRUE;
  1985. }
  1986. BOOL __stdcall PZMedicalCtrl::FuncBattLow1CallBack(char cEvent)
  1987. {
  1988. FINFO("[EVENT_BATTLOW1] EventNum({$})", (int)cEvent);
  1989. printf("detector battery low1 event.....\n");
  1990. return TRUE;
  1991. }
  1992. BOOL __stdcall PZMedicalCtrl::FuncBattLow2CallBack(char cEvent)
  1993. {
  1994. FINFO("[EVENT_BATTLOW2] EventNum({$})", (int)cEvent);
  1995. printf("detector battery low2 event.....\n");
  1996. return TRUE;
  1997. }
  1998. /***
  1999. ** 处理SDK LINK回调
  2000. ***/
  2001. BOOL PZMedicalCtrl::OnProcessLink(char cEvent)
  2002. {
  2003. //初始化之前缺省状态是max,收到link之后置为init,超时没收到也会置为init
  2004. //这个判断是为了只stopwaiting一次
  2005. if (PZDPC_STATE_MAX == GetPZDPCState())
  2006. {
  2007. StopWaiting("LINK");
  2008. }
  2009. if (m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit)
  2010. {
  2011. //连接探测器时断线,重连后继续执行初始化探测器流程
  2012. SetEvent(m_hReInitEvent);
  2013. }
  2014. else
  2015. {
  2016. printf("Detector Link CallBack Connect Success..\n");
  2017. FINFO("Detector Link CallBack Connect Success..");
  2018. m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus = true;
  2019. if (m_bConnectWaiting)
  2020. {
  2021. StopWaiting("Open");
  2022. }
  2023. ErrorFeedback(EVT_ERR_COMMUNICATE, "false", m_nCurrentPanelID);//OnProcessLink
  2024. GetConnectionMode();
  2025. }
  2026. return TRUE;
  2027. }
  2028. /***
  2029. ** 处理SDK BREAK回调
  2030. ***/
  2031. BOOL PZMedicalCtrl::OnProcessBreak(char cEvent)
  2032. {
  2033. StopWaiting("BREAK"); //暂时只处理退出流程,双板切换流程再完善
  2034. m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus = false;
  2035. ErrorFeedback(EVT_ERR_COMMUNICATE, "true", m_nCurrentPanelID);
  2036. return TRUE;
  2037. }
  2038. /***
  2039. ** 处理SDK IMAGE回调
  2040. ***/
  2041. BOOL PZMedicalCtrl::OnProcessImage(char cEvent)
  2042. {
  2043. SetEvent(m_hProcessImgEvent);
  2044. return TRUE;
  2045. }
  2046. void PZMedicalCtrl::NotifyDetectorInfo()
  2047. {
  2048. BOOL nRet;
  2049. TFPStat objFPStat; // 温度、电量、信号
  2050. //FINFO("Call GetFPStatus");
  2051. nRet = API_COM_GetFPStatus(&objFPStat);
  2052. if (!TestError(nRet, "GetFPStatus"))
  2053. {
  2054. FERROR("Get Detector Status Failed");
  2055. return;
  2056. }
  2057. if (!m_bWired)
  2058. {
  2059. // WIFI信号状态
  2060. int nSignal_level = (int)objFPStat.tWifiStatus.ucSignal_level;
  2061. int nWifiValue = 0; //SDK之反馈1~5,自己转换一下
  2062. FINFO("Wifi signal:{$}", nSignal_level);
  2063. switch (nSignal_level)// station0-4;ap0-5
  2064. {
  2065. case 5:
  2066. nWifiValue = 100;
  2067. break;
  2068. case 4:
  2069. nWifiValue = 100;
  2070. break;
  2071. case 3:
  2072. nWifiValue = 80;
  2073. break;
  2074. case 2:
  2075. nWifiValue = 50;
  2076. break;
  2077. case 1:
  2078. nWifiValue = 20;
  2079. break;
  2080. case 0:
  2081. nWifiValue = 0;
  2082. break;
  2083. default:
  2084. break;
  2085. }
  2086. if (nWifiValue < 0) //如果发生异常,获取到的wifi值应该是负的
  2087. {
  2088. nWifiValue = 0;
  2089. }
  2090. StatusFeedback(EVT_STATUS_WIFI, nWifiValue, "", m_nCurrentPanelID);
  2091. }
  2092. // 温度湿度状态
  2093. FINFO("Temperature:{$}, Humidity:{$}%", (float(objFPStat.tFpTempHum.Temp)) / 10, (float(objFPStat.tFpTempHum.Hum)) / 10);
  2094. float fTemperature = (float(objFPStat.tFpTempHum.Temp)) / 10;
  2095. StatusFeedback(EVT_STATUS_TEMPERATURE, 0, "", m_nCurrentPanelID, fTemperature);
  2096. // 电池电量状态
  2097. float fBatRemain = (float)(objFPStat.tBatInfo1.Remain + objFPStat.tBatInfo2.Remain) / (objFPStat.tBatInfo1.full + objFPStat.tBatInfo2.full);
  2098. FINFO("Battery remain:{$}", fBatRemain);
  2099. int nBattery = (int)(fBatRemain * 100);
  2100. if (nBattery < 0)
  2101. {
  2102. nBattery = 100; //没有电池按满电反馈
  2103. }
  2104. StatusFeedback(EVT_STATUS_BATTERY_VALUE, nBattery, "", m_nCurrentPanelID);
  2105. }
  2106. /***
  2107. ** 处理SDK 心跳回调
  2108. ***/
  2109. BOOL PZMedicalCtrl::OnProcessHeartBeat(char cEvent)
  2110. {
  2111. // 500ms一次回调
  2112. CHAR cFpCurStat = STATUS_NULL;
  2113. cFpCurStat = API_COM_GetFPCurStatus();
  2114. //FINFO("Detector current status:{$}", (int)cFpCurStat);
  2115. if (cFpCurStat != m_cFpCurStat)
  2116. {
  2117. printf("now PZ FPD Status is %d, LAST IS %d \n", cFpCurStat, m_cFpCurStat);
  2118. FINFO("[HeartBeat] now PZ FPD Status is {$}, LAST IS {$}", (int)cFpCurStat, (int)m_cFpCurStat);
  2119. switch (cFpCurStat)
  2120. {
  2121. case STATUS_NULL:
  2122. FINFO("Detector current status: STATUS_NULL");
  2123. break;
  2124. case STATUS_IDLE:
  2125. FINFO("Detector current status: STATUS_IDLE");
  2126. if (m_eCalState == PZ_CALIBRATION_INIT) //校正准备阶段
  2127. {
  2128. SetEvent(m_hPZMPrepare);
  2129. }
  2130. break;
  2131. case STATUS_HST:
  2132. FINFO("Detector current status: STATUS_HST");
  2133. if (m_ePZDPCstate == PZDPC_STATE_WORK) // 曝光使能进hst模式
  2134. {
  2135. StopWaiting("HST");
  2136. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  2137. }
  2138. else if (m_eCalState == PZ_CALIBRATION_GAIN)
  2139. {
  2140. StopWaiting("HST");
  2141. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  2142. }
  2143. break;
  2144. case STATUS_AED1:
  2145. FINFO("Detector current status: STATUS_AED1");
  2146. break;
  2147. case STATUS_AED2:
  2148. FINFO("Detector current status: STATUS_AED2");
  2149. if (m_ePZDPCstate == PZDPC_STATE_WORK) // 曝光使能进aed模式
  2150. {
  2151. StopWaiting("AED2");
  2152. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  2153. }
  2154. else if (m_eCalState == PZ_CALIBRATION_GAIN) // aed采集亮场图
  2155. {
  2156. StopWaiting("AED2");
  2157. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  2158. }
  2159. else
  2160. {
  2161. FERROR("Not in work mode or gain calibration process, not send ready to HW");
  2162. }
  2163. break;
  2164. case STATUS_RECOVER: //探测器在这个状态下刷新offset,结束后自动进入IDLE状态
  2165. FINFO("Detector current status: STATUS_RECOVER");
  2166. break;
  2167. default:
  2168. FINFO("Detector current status:{$}", (int)cFpCurStat);
  2169. break;
  2170. }
  2171. }
  2172. m_cFpCurStat = cFpCurStat;
  2173. //这块以后可做成可配置的
  2174. if (m_nHeartCount % 8 == 0)//500ms一次回调
  2175. {
  2176. NotifyDetectorInfo();
  2177. }
  2178. m_nHeartCount++;
  2179. return TRUE;
  2180. }
  2181. /// <summary>
  2182. /// 配置反馈通知 @SDK
  2183. /// </summary>
  2184. /// <param name="nEventID"></param>
  2185. /// <param name="nDetectorID"></param>
  2186. /// <param name="pszMsg"></param>
  2187. /// <param name="nParam1"></param>
  2188. /// <param name="fParam2"></param>
  2189. /// <param name="nPtrParamLen"></param>
  2190. /// <param name="pParam"></param>
  2191. void PZMedicalCtrl::ConfFeedback(int nEventID, int nDetectorID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2192. {
  2193. if (-1 == nDetectorID)
  2194. {
  2195. nDetectorID = m_nCurrentPanelID;
  2196. }
  2197. ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2198. nEventID, EVT_LEVEL_CONFIGURATION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2199. }
  2200. /// <summary>
  2201. /// Info消息反馈通知 @SDK
  2202. /// </summary>
  2203. /// <param name="nEventID"></param>
  2204. /// <param name="nDetectorID"></param>
  2205. /// <param name="nParam1"></param>
  2206. /// <param name="fParam2"></param>
  2207. /// <param name="pszMsg"></param>
  2208. /// <param name="nPtrParamLen"></param>
  2209. /// <param name="pParam"></param>
  2210. void PZMedicalCtrl::InfoFeedback(int nEventID, int nDetectorID, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, void* pParam)
  2211. {
  2212. if (-1 == nDetectorID)
  2213. {
  2214. nDetectorID = m_nCurrentPanelID;
  2215. }
  2216. ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2217. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2218. }
  2219. /// <summary>
  2220. /// 设备状态改变通知 @SDK
  2221. /// </summary>
  2222. /// <param name="nEventID">事件ID 属于部件或者子系统</param>
  2223. /// <param name="nParam1">事件状态值,不同事件有不同的取值说明</param>
  2224. /// <param name="pszMsg">事件附带文本消息</param>
  2225. /// <param name="nDetectorID">探测器ID,单板系统 默认值 -1</param>
  2226. /// <param name="fParam2">浮点参数2</param>
  2227. /// <param name="nPtrParamLen">附加参数内存长度</param>
  2228. /// <param name="pParam">附加参数内存地址</param>
  2229. void PZMedicalCtrl::StatusFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  2230. {
  2231. if (-1 == nDetectorID)
  2232. {
  2233. nDetectorID = m_nCurrentPanelID;
  2234. }
  2235. ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2236. nEventID, EVT_LEVEL_STATUS, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2237. }
  2238. /// <summary>
  2239. /// 数据反馈通知 @SDK
  2240. /// </summary>
  2241. /// <param name="nEventID">采集数据事件ID</param>
  2242. /// <param name="pParam">图像内存地址</param>
  2243. /// <param name="nParam1">参数1,默认值0</param>
  2244. /// <param name="fParam2">参数2,浮点,默认值0.0 </param>
  2245. /// <param name="pszMsg">附带文本消息</param>
  2246. /// <param name="nPtrParamLen">图像内存长度,默认值0,固定大小</param>
  2247. /// <param name="nDetectorID">探测器ID,单板模式 默认值-1</param>
  2248. void PZMedicalCtrl::DataFeedback(int nEventID, void* pParam, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, int nDetectorID)
  2249. {
  2250. if (-1 == nDetectorID)
  2251. {
  2252. nDetectorID = m_nCurrentPanelID;
  2253. }
  2254. ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2255. nEventID, EVT_LEVEL_DATA, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2256. }
  2257. /// <summary>
  2258. /// 告警事件反馈通知 @SDK
  2259. /// </summary>
  2260. /// <param name="nEventID"></param>
  2261. /// <param name="pszMsg"></param>
  2262. /// <param name="nParam1"></param>
  2263. /// <param name="fParam2"></param>
  2264. /// <param name="nPtrParamLen"></param>
  2265. /// <param name="pParam"></param>
  2266. /// <param name="nDetectorID"></param>
  2267. void PZMedicalCtrl::WarnFeedback(int nEventID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam, int nDetectorID)
  2268. {
  2269. if (-1 == nDetectorID)
  2270. {
  2271. nDetectorID = m_nCurrentPanelID;
  2272. }
  2273. ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2274. nEventID, EVT_LEVEL_WARNING, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2275. }
  2276. /// <summary>
  2277. /// 内部错误通知 @SDK
  2278. /// </summary>
  2279. /// <param name="nEventID">事件ID</param>
  2280. /// <param name="pszMsg">事件消息文本内容</param>
  2281. /// <param name="nDetectorID">探测器ID,单板模式默认值-1</param>
  2282. /// <param name="nParam1">参数1,整型,默认值0</param>
  2283. /// <param name="fParam2">参数2,浮点数,默认值0.0</param>
  2284. /// <param name="nPtrParamLen">附加参数内存长度</param>
  2285. /// <param name="pParam">附加参数内存地址</param>
  2286. void PZMedicalCtrl::ErrorFeedback(int nEventID, const char* pszMsg, int nDetectorID, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2287. {
  2288. if (-1 == nDetectorID)
  2289. {
  2290. nDetectorID = m_nCurrentPanelID;
  2291. }
  2292. ((FPDDevicePZMedical*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2293. nEventID, EVT_LEVEL_ERROR, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2294. }
  2295. /***
  2296. * 设置校正点数
  2297. ***/
  2298. bool PZMedicalCtrl::SetReferenceNum(int nReferenceNum)
  2299. {
  2300. m_nCalibrationRounds = nReferenceNum;
  2301. FINFO("========SetReferenceNum: {$}", m_nCalibrationRounds);
  2302. return true;
  2303. }
  2304. /***
  2305. ** 说明:设置当前的曝光模式
  2306. ** 参数:nLogicMode,从配置文件读取,与SDK配置application mode对应
  2307. ***/
  2308. bool PZMedicalCtrl::SetAcqMode(int nLogicMode, FPDDevicePZMedical* pDrvDPC)
  2309. {
  2310. FINFO("========SetAcqMode nLogicMode:{$}", nLogicMode);
  2311. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  2312. {
  2313. FINFO("not current DPC, panel id {$} != {$} return... ", (*m_pDPC2PanelID)[pDrvDPC], m_nCurrentPanelID);
  2314. return false;
  2315. }
  2316. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  2317. {
  2318. FINFO("Current detector is not connect, return");
  2319. return false;
  2320. }
  2321. m_ModeConfig = m_pStPanelStatus[m_nCurrentPanelID]->objPanelConfig;
  2322. try
  2323. {
  2324. int nModeCount = (int)m_ModeConfig["ModeTable"].size();
  2325. for (int i = 0; i < nModeCount; i++)
  2326. {
  2327. if (nLogicMode == (int)m_ModeConfig["ModeTable"][i]["LogicMode"])
  2328. {
  2329. //由于3025ZF出图的宽高不定,所以宽高不从配置文件读取,上图之前调用接口查询宽高然后再推图
  2330. //m_nRawImgHeight = (int)m_ModeConfig["ModeTable"][i]["RawImgHeight"];
  2331. //m_nRawImgWidth = (int)m_ModeConfig["ModeTable"][i]["RawImgWidth"];
  2332. //m_nImageWidth = (int)m_ModeConfig["ModeTable"][i]["ImageWidth"];
  2333. //m_nImageHeight = (int)m_ModeConfig["ModeTable"][i]["ImageHeight"];
  2334. m_nWidthOffset = (int)m_ModeConfig["ModeTable"][i]["WidthOffset"];
  2335. m_nHeightOffset = (int)m_ModeConfig["ModeTable"][i]["HeightOffset"];
  2336. m_nImgBits = (int)m_ModeConfig["ModeTable"][i]["PhySizeInfoBit"];
  2337. m_nPixelPitch = (int)m_ModeConfig["ModeTable"][i]["PixelPitch"];
  2338. m_nSaveRaw = (int)m_ModeConfig["ModeTable"][i]["IsSaveRaw"];
  2339. int m_nSyncType = (int)m_ModeConfig["ModeTable"][i]["SyncType"];
  2340. m_pStPanelStatus[m_nCurrentPanelID]->eSyncMode = (SYNC_MODE)m_nSyncType;
  2341. FINFO("Offset({$} {$}), Bits({$}), PixelPitch({$}), SaveRaw({$})",
  2342. m_nWidthOffset, m_nHeightOffset, m_nImgBits, m_nPixelPitch, m_nSaveRaw);
  2343. m_nCurrentLogicMode = nLogicMode;
  2344. break;
  2345. }
  2346. }
  2347. }
  2348. catch (ResDataObjectExption& exp)
  2349. {
  2350. FERROR("Get config failed: {$}", exp.what());
  2351. return false;
  2352. }
  2353. return true;
  2354. }
  2355. /***
  2356. * 接受曝光图像
  2357. ***/
  2358. bool PZMedicalCtrl::AcceptCalibration()
  2359. {
  2360. FINFO("========AcceptCalibration");
  2361. if (m_nCalibrationMode)//PZ自己的校正模式
  2362. {
  2363. //不做处理
  2364. }
  2365. else //ZSKK校正
  2366. {
  2367. if (m_nWidthOffset != 0 || m_nHeightOffset != 0)
  2368. {
  2369. if (m_nCalibCurrentExposureIndex == 1)
  2370. {
  2371. m_pZSKKCalib->AddImageToPixMap(m_pImgBuffer);
  2372. m_pZSKKCalib->AverageZSKKGainMap(m_pImgBuffer, m_nCalibCurrentCalibrationRound - 1, true);
  2373. }
  2374. else
  2375. {
  2376. m_pZSKKCalib->AverageZSKKGainMap(m_pImgBuffer, m_nCalibCurrentCalibrationRound - 1, false); //曝光第几轮
  2377. }
  2378. }
  2379. else
  2380. {
  2381. if (m_nCalibCurrentExposureIndex == 1)
  2382. {
  2383. m_pZSKKCalib->AddImageToPixMap(m_pRawImgBuffer);
  2384. m_pZSKKCalib->AverageZSKKGainMap(m_pRawImgBuffer, m_nCalibCurrentCalibrationRound - 1, true);
  2385. }
  2386. else
  2387. {
  2388. m_pZSKKCalib->AverageZSKKGainMap(m_pRawImgBuffer, m_nCalibCurrentCalibrationRound - 1, false); //曝光第几轮
  2389. }
  2390. }
  2391. }
  2392. FINFO("Accept calibration exposure over");
  2393. return true;
  2394. }
  2395. /***
  2396. * 拒绝曝光图像
  2397. ***/
  2398. bool PZMedicalCtrl::RejectCalibration()
  2399. {
  2400. FINFO("========RejectCalibration");
  2401. //不做处理
  2402. return true;
  2403. }
  2404. bool PZMedicalCtrl::SaveCalibrationFile()
  2405. {
  2406. FINFO("========SaveCalibrationFile");
  2407. if (m_nCalibrationMode)//PZ自己的校正模式
  2408. {
  2409. //不做处理
  2410. }
  2411. else
  2412. {
  2413. FINFO("Save ZSKK Calibration File");
  2414. m_pZSKKCalib->StoreZSKKGainMap(m_strPanelType);
  2415. m_pZSKKCalib->StoreZSKKPixMap(m_strPanelType);
  2416. }
  2417. //更新配置文件中校正日期和时间
  2418. SYSTEMTIME stCurrentTime = { 0 };
  2419. GetLocalTime(&stCurrentTime);
  2420. FINFO("Current time: {$04d}/{$02d}/{$02d} {$02d}:{$02d}:{$02d}:{$03d}",
  2421. stCurrentTime.wYear, stCurrentTime.wMonth, stCurrentTime.wDay,
  2422. stCurrentTime.wHour, stCurrentTime.wMinute, stCurrentTime.wSecond, stCurrentTime.wMilliseconds);
  2423. FINFO("Save Calibration File over");
  2424. return true;
  2425. }
  2426. bool PZMedicalCtrl::GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound)
  2427. {
  2428. FINFO("========GetCalibrationStep");
  2429. m_nCalibCurrentCalibrationRound = nCalibCurrentCalibrationRound;
  2430. m_nCalibrationRounds = nCalibrationRounds;
  2431. m_nCalibCurrentExposureIndex = nCalibCurrentExposureIndex;
  2432. m_nExposureNumCurrentRound = nExposureNumCurrentRound;
  2433. FINFO("Calibration Step===Round: {$}/{$}, ExposureNum: {$}/{$}", nCalibCurrentCalibrationRound, nCalibrationRounds,
  2434. nCalibCurrentExposureIndex, nExposureNumCurrentRound);
  2435. return true;
  2436. }
  2437. /***
  2438. ** 说明:结束校正
  2439. ** DPC处理完校正报告后调用,此处上传map、报告等文件
  2440. ***/
  2441. bool PZMedicalCtrl::CompleteCalibration(FPDDevicePZMedical* pDrvDPC)
  2442. {
  2443. FINFO("========CompleteCalibration calib type:{$}", (int)m_eType);
  2444. if (m_eType == CCOS_CALIBRATION_TYPE_DARK)
  2445. {
  2446. printf("DARK 校正 结束 \r\n");
  2447. FINFO("DARK Calib over");
  2448. m_bCalibrationOver = true;
  2449. }
  2450. else if (m_eType == CCOS_CALIBRATION_TYPE_XRAY)
  2451. {
  2452. m_bCalibrationOver = true;
  2453. m_eCalState = PZ_CALIBRATION;
  2454. SetEvent(m_hEndCalibEvent);//亮场校正结束
  2455. }
  2456. return true;
  2457. }
  2458. /***
  2459. ** 说明:获取校正时间
  2460. ** 连接成功后,校正完成后 获取
  2461. ***/
  2462. bool PZMedicalCtrl::GetCalibrationTime(int nDetectorID)
  2463. {
  2464. if (nDetectorID == -1)
  2465. {
  2466. nDetectorID = m_nCurrentPanelID;
  2467. }
  2468. else
  2469. {
  2470. InfoFeedback(EVT_INFO_CALIBRATIOIN_TIME, nDetectorID, 0, 0, "0");
  2471. InfoFeedback(EVT_INFO_CALIBRATIOIN_TIMEL, nDetectorID, 0, 0, "0");
  2472. }
  2473. return true;
  2474. }
  2475. /***
  2476. ** 说明:终止校正
  2477. ***/
  2478. RET_STATUS PZMedicalCtrl::AbortCalibration(FPDDevicePZMedical* pDrvDPC)
  2479. {
  2480. printf("========AbortCalibration\n");
  2481. FINFO("======== AbortCalibration");
  2482. m_eType = CCOS_CALIBRATION_TYPE_NONE; //恢复初值
  2483. m_bConfirmCaliRst = false; //终止校正,恢复初值
  2484. m_bAutoContinueCal = false; //终止校正,恢复初值
  2485. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  2486. if (m_nCalibrationMode) //PZ自己的校正模式
  2487. {
  2488. }
  2489. else
  2490. {
  2491. FINFO("Abort ZSKK calibration");
  2492. m_pZSKKCalib->LoadZSKKGainMap(true, m_strPanelType); //重新加载增益校正文件
  2493. m_pZSKKCalib->AbortZSKKPixMap(m_strPanelType); //放弃坏点校正并重新加载原来的坏点校正文件
  2494. }
  2495. FINFO("AbortCalibration over");
  2496. return RET_STATUS::RET_SUCCEED;
  2497. }
  2498. /***
  2499. ** 说明:处理dark校正完成流程
  2500. ***/
  2501. void PZMedicalCtrl::OnProcessDarkEnd()
  2502. {
  2503. FINFO("========OnProcessDarkEnd");
  2504. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  2505. }
  2506. CCOS_CALIBRATION_TYPE PZMedicalCtrl::GetPZMedicalCtrlCalibType()
  2507. {
  2508. FINFO("========GetPZMedicalCtrlCalibType {$}", (int)m_eType);
  2509. return m_eType;
  2510. }
  2511. //慎重调用,可能会导致板出问题,硬reset需要很长时间
  2512. bool PZMedicalCtrl::ResetDetector(FPDDevicePZMedical* pDrvDPC)
  2513. {
  2514. FINFO("========ResetDetector");
  2515. bool nRet = true;
  2516. /*nRet = API_COM_ResetFP();
  2517. if (!TestError(nRet, "ResetFP"))
  2518. {
  2519. printf("Reset Detector fail!\n");
  2520. FERROR("Reset Detector fail!");
  2521. return false;
  2522. }*/
  2523. return nRet;
  2524. }