AxsCtrl.cpp 90 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002
  1. #include "stdafx.h"
  2. #include "AxsCtrl.h"
  3. #include "CCOS.Dev.FPD.AxsDM.h"
  4. #include "common_api.h"
  5. #include "PacketAnalizer.h"
  6. CAXSCtrl* g_pDetector = nullptr;
  7. #define LOAD_PROC_ADDRESS(handle,func) \
  8. if ((API_##func = (AXS_##func)GetProcAddress(handle, #func)) == NULL) { printf("Error occurs while loading entry point!!! \n'%s'\n", #func); }\
  9. CAXSCtrl::CAXSCtrl()
  10. {
  11. m_pDPC2PanelID = new map<CFPDDeviceAXS*, int>();
  12. m_pPanelID2DPC = new map<int, CFPDDeviceAXS*>();
  13. m_nPanelCount = 0;//最少一个板
  14. m_nCurrentPanelID = 0;
  15. m_strWorkPath = "";
  16. m_strTplDarkPath = "";
  17. m_strTplFloodPath = "";
  18. m_ePZDPCstate = PZDPC_STATE_INIT;
  19. m_bHavePreview = false;
  20. m_nImageMode = 0;
  21. m_nAecImageWidth = 0;
  22. m_nAecImageHeight = 0;
  23. m_nAecImageSize = 0;
  24. m_nAecImageBits = 16;
  25. m_nAecPixelSize = 4;
  26. m_nRawImgWidth = 0;
  27. m_nRawImgHeight = 0;
  28. m_nRawImageSize = 0;
  29. m_nRawImageBits = 16;
  30. m_nRawPixelSize = 2;
  31. m_nLeftOffset = 0;
  32. m_nTopOffset = 0;
  33. m_nRightOffset = 0;
  34. m_nBottomOffset = 0;
  35. m_nImageWidth = 0;
  36. m_nImageHeight = 0;
  37. m_nImageSize = 0;
  38. m_nImageBits = 16;
  39. m_nImagePixelSize = 2;
  40. m_pAecImgBuffer = nullptr;
  41. m_pRawImgBuffer = nullptr;
  42. m_pImgBuffer = nullptr;
  43. m_nPixelPitch = 85;//单位:um
  44. m_nSequenceId = 0;
  45. m_nImageIndex = 0;
  46. m_nSaveRaw = 0;
  47. m_nExamMode = APP_STATUS_IDLE;
  48. m_nCalibrationMode = CCOS_CALIBRATION_MODE_ZSKK;
  49. m_eType = CCOS_CALIBRATION_TYPE_NONE;
  50. m_eCalState = PZ_CALIBRATION_ORIGINAL;
  51. m_bCalibrationOver = false;
  52. m_detectorState = PEGASUS_SERVICE_STATE;
  53. m_pZSKKCalib = nullptr;
  54. m_strPanelType = "";
  55. m_strSerialNumber = "";
  56. m_bLoadedSDK = false;
  57. m_bInitializedSDK = false;
  58. m_nCalibrationRounds = 0;
  59. m_nCalibCurrentCalibrationRound = 0;
  60. m_nExposureNumCurrentRound = 0;
  61. m_nCalibCurrentExposureIndex = 0;
  62. m_bOnlyHaveFpd = false;
  63. m_context = PEGASUS_CONTEXT_CONTACT;
  64. m_nCurrentAcqMode = ACQ_UNKNOWN;
  65. m_targetFilter = PEGASUS_TARGET_FILTER_0;
  66. memset(&m_ResultImage, 0, sizeof(m_ResultImage));
  67. m_bReadyForExp = false;
  68. m_bChangeAcqProperties = false;
  69. m_nTimerHardWare = 0;
  70. m_bShutDownFlag = false;
  71. m_bTimeOutFlag = false;
  72. string temp = "AxsDetectorCtrl";
  73. temp = temp + std::to_string(getpid());
  74. m_pAcqUnitCient = new LogicClient(temp, "", "", false);
  75. if (m_pAcqUnitCient->Open("ccosChannel", ALL_ACCESS))
  76. {
  77. m_pAcqUnitCient->SubScribeTopic("CCOS/DEVICE/Generator/+/+/+/Notify/GENERATORSYNCSTATE");
  78. }
  79. m_hPZSDKModule = nullptr;
  80. m_hRespond = CreateEvent(NULL, FALSE, FALSE, NULL);
  81. m_bExitGetInfoThread = false;
  82. m_hDetectorInfoThread = nullptr;
  83. m_bExitFpdScanThread = false;
  84. m_hFPDScanThread = nullptr;
  85. //1-一般为NULL 2-是否自动复位 true-人工复位 false-自动复位 3-初始状态 true-有信号 false-无信号 4-事件名称
  86. m_hStopScanEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  87. m_hAecImgEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  88. m_hCorrectedImgEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  89. m_hXWinOnEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  90. m_hInitFPDEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  91. m_hReInitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  92. m_hRecoverImage = CreateEvent(NULL, FALSE, FALSE, NULL);
  93. m_hArrayEvent[0] = m_hStopScanEvent;
  94. m_hArrayEvent[1] = m_hAecImgEvent;
  95. m_hArrayEvent[2] = m_hCorrectedImgEvent;
  96. m_hArrayEvent[3] = m_hXWinOnEvent;
  97. m_hArrayEvent[4] = m_hInitFPDEvent;
  98. m_hArrayEvent[5] = m_hReInitEvent;
  99. m_hArrayEvent[6] = m_hRecoverImage;
  100. m_hArrayEvent[7] = m_pAcqUnitCient->GetNotifyHandle();
  101. //校正线程
  102. m_bExitCalibrationThread = false;
  103. m_hCalibrationThread = nullptr;
  104. m_hStopCalibEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  105. m_hPZMStartOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  106. m_hPZMInOffset = CreateEvent(NULL, FALSE, FALSE, NULL);
  107. m_hPZMStartGain = CreateEvent(NULL, FALSE, FALSE, NULL);
  108. m_hPZMInGain = CreateEvent(NULL, FALSE, FALSE, NULL);
  109. m_hEndCalibEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  110. m_hPZMCalibration[0] = m_hStopCalibEvent;
  111. m_hPZMCalibration[1] = m_hPZMStartOffset;
  112. m_hPZMCalibration[2] = m_hPZMInOffset;
  113. m_hPZMCalibration[3] = m_hPZMStartGain;
  114. m_hPZMCalibration[4] = m_hPZMInGain;
  115. m_hPZMCalibration[5] = m_hEndCalibEvent;
  116. API_PEGASUS_RegisterProgressionCallback = nullptr;
  117. API_PEGASUS_Initialize = nullptr;
  118. API_PEGASUS_QuickInitialize = nullptr;
  119. API_PEGASUS_Shutdown = nullptr;
  120. API_PEGASUS_LoadContext = nullptr;
  121. API_PEGASUS_DetailedInformation = nullptr;
  122. API_PEGASUS_Information = nullptr;
  123. API_PEGASUS_SystemDetailedInformation = nullptr;
  124. API_PEGASUS_CalibrationInformation = nullptr;
  125. API_PEGASUS_GetCalibrationInformation = nullptr;
  126. API_PEGASUS_GetCalibrationInformationUsingType = nullptr;
  127. API_PEGASUS_IsReadyForExposure = nullptr;
  128. API_PEGASUS_Acquire = nullptr;
  129. API_PEGASUS_AbortAcquire = nullptr;
  130. API_PEGASUS_StartContinuousAcquisition = nullptr;
  131. //API_PEGASUS_StartContinuousAcquisitionEx = nullptr;
  132. API_PEGASUS_ChangeContinuousAcquisitionProperties = nullptr;
  133. //API_PEGASUS_ChangeContinuousAcquisitionPropertiesEx = nullptr;
  134. API_PEGASUS_GetContinuousAcquisitionProperties = nullptr;
  135. //API_PEGASUS_GetContinuousAcquisitionPropertiesEx = nullptr;
  136. API_PEGASUS_OverrideTargetFilter = nullptr;
  137. API_PEGASUS_GetAecImage = nullptr;
  138. API_PEGASUS_GetCorrectedImage = nullptr;
  139. API_PEGASUS_GetInformationOfFirstAvailableImage = nullptr;
  140. API_PEGASUS_StartSingleAcquisition = nullptr;
  141. API_PEGASUS_PrepareForExposure = nullptr;
  142. API_PEGASUS_TriggerAcquisition = nullptr;
  143. API_PEGASUS_RecoverImage = nullptr;
  144. //API_PEGASUS_RecoverImageEx = nullptr;
  145. API_PEGASUS_CancelImageRecovery = nullptr;
  146. API_PEGASUS_RecoverLastSequenceID = nullptr;
  147. API_PEGASUS_Calibrate = nullptr;
  148. //API_PEGASUS_CalibrateEx = nullptr;
  149. API_PEGASUS_GetNbrCalImagesLeft = nullptr;
  150. API_PEGASUS_AbortCalibration = nullptr;
  151. API_PEGASUS_AddImageToCalibration = nullptr;
  152. API_PEGASUS_RejectCalibrationImage = nullptr;
  153. API_PEGASUS_AutoCalibrate = nullptr;
  154. API_PEGASUS_CalibrateUsingType = nullptr;
  155. API_PEGASUS_StopComServer = nullptr;
  156. API_PEGASUS_GetLogLevel = nullptr;
  157. API_PEGASUS_SetLogLevel = nullptr;
  158. API_PEGASUS_SelfTest = nullptr;
  159. API_PEGASUS_Sleep = nullptr;
  160. API_PEGASUS_ServiceImageInformation = nullptr;
  161. API_PEGASUS_GetServiceImage = nullptr;
  162. API_PEGASUS_UpdateDefectMap = nullptr;
  163. API_PEGASUS_GetWeakDefect = nullptr;
  164. API_PEGASUS_UpdateWeakDefect = nullptr;
  165. API_PEGASUS_GetErrorDescription = nullptr;
  166. API_PEGASUS_GetEventDescription = nullptr;
  167. API_PEGASUS_GetMultiEventDescription = nullptr;
  168. API_PEGASUS_GetDebugDump = nullptr;
  169. API_PEGASUS_GetDetectorTypeDescription = nullptr;
  170. API_PEGASUS_GetProductTypeDescription = nullptr;
  171. API_PEGASUS_GetContextCodeDescription = nullptr;
  172. API_PEGASUS_GetDetectorStateDescription = nullptr;
  173. API_PEGASUS_GetPegasusStateDescription = nullptr;
  174. API_PEGASUS_GetLogLevelCodeDescription = nullptr;
  175. API_PEGASUS_GetSelfTestTypeDescription = nullptr;
  176. API_PEGASUS_GetTargetFilterTypeDescription = nullptr;
  177. API_PEGASUS_GetFocusTypeDescription = nullptr;
  178. API_PEGASUS_GetServiceImageTypeDescription = nullptr;
  179. API_PEGASUS_GetPixelFormatDescription = nullptr;
  180. API_PEGASUS_GetDefectTypeDescription = nullptr;
  181. API_PEGASUS_GetCalibrationTypeDescription = nullptr;
  182. API_PEGASUS_GetAvailableContext = nullptr;
  183. API_PEGASUS_Entry = nullptr;
  184. API_PEGASUS_Exit = nullptr;
  185. API_PEGASUS_TerminateAcquisition = nullptr;
  186. }
  187. CAXSCtrl::~CAXSCtrl()
  188. {
  189. if (m_nPanelCount != 0)
  190. {
  191. for (int i = 0; i < m_nPanelCount; i++)
  192. {
  193. delete[]m_pStPanelStatus[i];
  194. }
  195. }
  196. m_bExitGetInfoThread = true;//退出获取探测器温度和状态线程
  197. m_bExitFpdScanThread = true;
  198. m_bExitCalibrationThread = true;
  199. if (m_pAecImgBuffer)
  200. {
  201. delete[]m_pAecImgBuffer;
  202. m_pAecImgBuffer = nullptr;
  203. }
  204. if (m_pRawImgBuffer)
  205. {
  206. delete[]m_pRawImgBuffer;
  207. m_pRawImgBuffer = nullptr;
  208. }
  209. if (m_pImgBuffer != nullptr)
  210. {
  211. delete[]m_pImgBuffer;
  212. m_pImgBuffer = nullptr;
  213. }
  214. if (nullptr != m_pDPC2PanelID)
  215. {
  216. delete m_pDPC2PanelID;
  217. m_pDPC2PanelID = nullptr;
  218. }
  219. if (nullptr != m_pPanelID2DPC)
  220. {
  221. delete m_pPanelID2DPC;
  222. m_pPanelID2DPC = nullptr;
  223. }
  224. if (m_pZSKKCalib)
  225. {
  226. delete m_pZSKKCalib;
  227. m_pZSKKCalib = nullptr;
  228. }
  229. if (m_hRespond)
  230. {
  231. CloseHandle(m_hRespond);
  232. m_hRespond = nullptr;
  233. }
  234. if (m_hStopScanEvent)
  235. {
  236. CloseHandle(m_hStopScanEvent);
  237. m_hStopScanEvent = nullptr;
  238. }
  239. if (m_hAecImgEvent)
  240. {
  241. CloseHandle(m_hAecImgEvent);
  242. m_hAecImgEvent = nullptr;
  243. }
  244. if (m_hCorrectedImgEvent)
  245. {
  246. CloseHandle(m_hCorrectedImgEvent);
  247. m_hCorrectedImgEvent = nullptr;
  248. }
  249. if (m_hXWinOnEvent)
  250. {
  251. CloseHandle(m_hXWinOnEvent);
  252. m_hXWinOnEvent = nullptr;
  253. }
  254. if (m_hInitFPDEvent)
  255. {
  256. CloseHandle(m_hInitFPDEvent);
  257. m_hInitFPDEvent = nullptr;
  258. }
  259. if (m_hReInitEvent)
  260. {
  261. CloseHandle(m_hReInitEvent);
  262. m_hReInitEvent = nullptr;
  263. }
  264. if (m_hRecoverImage)
  265. {
  266. CloseHandle(m_hRecoverImage);
  267. m_hRecoverImage = nullptr;
  268. }
  269. if (m_hStopCalibEvent)
  270. {
  271. CloseHandle(m_hStopCalibEvent);
  272. m_hStopCalibEvent = nullptr;
  273. }
  274. if (m_hPZMStartOffset)
  275. {
  276. CloseHandle(m_hPZMStartOffset);
  277. m_hPZMStartOffset = nullptr;
  278. }
  279. if (m_hPZMInOffset)
  280. {
  281. CloseHandle(m_hPZMInOffset);
  282. m_hPZMInOffset = nullptr;
  283. }
  284. if (m_hPZMStartGain)
  285. {
  286. CloseHandle(m_hPZMStartGain);
  287. m_hPZMStartGain = nullptr;
  288. }
  289. if (m_hPZMInGain)
  290. {
  291. CloseHandle(m_hPZMInGain);
  292. m_hPZMInGain = nullptr;
  293. }
  294. if (m_hEndCalibEvent)
  295. {
  296. CloseHandle(m_hEndCalibEvent);
  297. m_hEndCalibEvent = nullptr;
  298. }
  299. }
  300. //获取探测器温度和Pegasus的状态
  301. DWORD __stdcall CAXSCtrl::OnGetFpdInfo(PVOID pvoid)
  302. {
  303. CAXSCtrl* pOpr = (CAXSCtrl*)pvoid;
  304. FINFO("Enter Get Detector Info Thread");
  305. PEGASUS_ErrorCode err;
  306. PEGASUS_Info info;
  307. char shortDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  308. while (!pOpr->m_bExitGetInfoThread)
  309. {
  310. //这里没有考虑探测器的状态,可能某些状态时探测器是不支持获取info的,这些后续在加
  311. FINFO("Call API_PEGASUS_Information");
  312. err = pOpr->API_PEGASUS_Information(&info);
  313. if (!pOpr->TestError(err,"GetInformation"))
  314. {
  315. FERROR("Fail to get detector info!");
  316. }
  317. else
  318. {
  319. float fTemperature = info.temperature;
  320. pOpr->StatusFeedback(EVT_STATUS_TEMPERATURE, 0, "", pOpr->m_nCurrentPanelID, fTemperature);
  321. pOpr->m_detectorState = info.pegasusState;
  322. memset(shortDescription,0, PEGASUS_MAX_STRING_LENGTH);
  323. pOpr->API_PEGASUS_GetPegasusStateDescription(pOpr->m_detectorState,shortDescription);
  324. FINFO("OnGetFpdInfo pegasus state:{$},description:{$}", (int)info.pegasusState,shortDescription);
  325. if (pOpr->m_pStPanelStatus[pOpr->m_nCurrentPanelID]->bConnectStatus == false)
  326. {
  327. if (info.pegasusState >= PEGASUS_SHUTDOWN_STATE && info.pegasusState <= PEGASUS_RECOVERY_STATE)
  328. {
  329. pOpr->m_pStPanelStatus[pOpr->m_nCurrentPanelID]->bConnectStatus = true;
  330. pOpr->ErrorFeedback(EVT_ERR_COMMUNICATE, "false", pOpr->m_nCurrentPanelID);
  331. pOpr->StatusFeedback(EVT_STATUS_DETECTORSHARE, PANEL_CONNECT_OK);//通知连接成功
  332. }
  333. }
  334. if (info.pegasusState == PEGASUS_RECOVERY_STATE)
  335. {
  336. FINFO("need to recover image...");
  337. }
  338. }
  339. FINFO("Get Fpd Info Thread Sleep 3s");
  340. Sleep(3000);
  341. }
  342. FINFO("Exit Get Detector Info Thread");
  343. return 0;
  344. }
  345. void onEventCallback(PEGASUS_EventType myEvent, PEGASUS_ErrorCode err, void* pContext)
  346. {
  347. g_pDetector->eventCallback(myEvent,err,pContext);
  348. }
  349. void CAXSCtrl::eventCallback(PEGASUS_EventType myEvent, PEGASUS_ErrorCode err, void* pContext)
  350. {
  351. CString strLog;
  352. strLog.Format("eventCallback EventType: %d", myEvent);
  353. FINFO(strLog.GetString());
  354. PEGASUS_ErrorCode nRet = PEGASUS_SUCCESS;
  355. PEGASUS_ExposureData* pExpData = static_cast<PEGASUS_ExposureData*>(pContext); //校正用的曝光参数KV MAS
  356. PEGASUS_ExposureData m_CalExpData;
  357. char eventDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  358. char errShortDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  359. char errLongDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  360. API_PEGASUS_GetEventDescription(myEvent, eventDescription);
  361. strLog.Format("eventCallback Event: %d, Description: %s", myEvent, eventDescription);
  362. FINFO(strLog.GetString());
  363. if (err != PEGASUS_SUCCESS)
  364. {
  365. API_PEGASUS_GetErrorDescription(err, errShortDescription, errLongDescription);
  366. strLog.Format("eventCallback err: %d, errShortDescription: %s, errLongDescription: %s ", err, errShortDescription, errLongDescription);
  367. FERROR(strLog.GetString());
  368. }
  369. switch (myEvent)
  370. {
  371. case PEGASUS_NO_EVENT:
  372. {
  373. FINFO("PEGASUS_NO_EVENT Arrived");
  374. break;
  375. }
  376. case PEGASUS_ERROR_EVENT:
  377. {
  378. FERROR("PEGASUS_ERROR_EVENT Arrived,Please Abort DROC and Check For the Problem");
  379. StatusFeedback(EVT_STATUS_PANEL, PANEL_CLOSE);
  380. if (err == PEGASUS_MAJOR_TIMEOUT_WAITING_FOR_EXPOSURE)
  381. {
  382. FERROR("err is PEGASUS_MAJOR_TIMEOUT_WAITING_FOR_EXPOSURE");
  383. }
  384. else
  385. {
  386. if (err == PEGASUS_MAJOR_COMMUNICATION_ERROR)
  387. {
  388. //m_bExitGetInfoThread = true;
  389. }
  390. if (!m_bShutDownFlag)
  391. {
  392. FINFO("PEGASUS_ERROR_EVENT Call API_PEGASUS_Shutdown");
  393. API_PEGASUS_Shutdown();//探测器出现error时
  394. }
  395. }
  396. break;
  397. }
  398. case PEGASUS_INITIALIZATION_EVENT: //初始化事件到来
  399. {
  400. FINFO("PEGASUS_INITIALIZATION_EVENT Arrived");
  401. if (err == PEGASUS_SUCCESS)
  402. {
  403. FINFO("Initial success");
  404. StopWaiting("Init");
  405. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_OK);//通知初始化成功
  406. ErrorFeedback(EVT_ERR_COMMUNICATE, "false", m_nCurrentPanelID);
  407. StatusFeedback(EVT_STATUS_DETECTORSHARE, PANEL_CONNECT_OK);//通知连接成功
  408. m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus = true;
  409. //在这里调用开始采集函数,因为校正时也会用到这里的回调,如果不在初始化成功后就开始采集,
  410. //那么如果用户一打开软件就进入校正页面,没有进检查界面,那么校正流程就无法进行了
  411. bool ret = StartContinuousAcquisition();
  412. if (!ret)
  413. {
  414. FERROR("fail to start acq!");
  415. }
  416. //开启线程循环获取探测器的信息 detail info 或者 info
  417. DWORD dwThreadId;
  418. if (m_hDetectorInfoThread == nullptr)
  419. {
  420. m_hDetectorInfoThread = CreateThread(NULL, 0, OnGetFpdInfo, this, 0, &dwThreadId); //启动辅助线程
  421. }
  422. }
  423. else
  424. {
  425. FINFO("Initial detector fail!");
  426. if (err == PEGASUS_WARNING_IMAGE_RECOVERY_IS_NEEDED)
  427. {
  428. FERROR("need to recover image...");
  429. }
  430. }
  431. break;
  432. }
  433. case PEGASUS_SHUTDOWN_EVENT: //关闭探测器事件来到
  434. {
  435. FINFO("PEGASUS_SHUTDOWN_EVENT Arrived");
  436. m_bShutDownFlag = true;
  437. StatusFeedback(EVT_STATUS_PANEL, PANEL_CLOSE);
  438. if (err == PEGASUS_WARNING_IMAGE_RECOVERY_IS_NEEDED)//需要恢复图像,此时并不是真正的shutdown状态
  439. {
  440. FERROR("need to recover image...");
  441. SetEvent(m_hRecoverImage);//恢复图像流程
  442. }
  443. else
  444. {
  445. SetEvent(m_hReInitEvent);
  446. }
  447. break;
  448. }
  449. case PEGASUS_CONTEXT_CHANGE_EVENT: //改变CONTEXT模式,DROC中无法手动改变
  450. {
  451. FINFO("PEGASUS_CONTEXT_CHANGE_EVENT Arrived");
  452. if (pContext)
  453. {
  454. m_context = *((PEGASUS_Context*)pContext);
  455. API_PEGASUS_GetContextCodeDescription(m_context, errShortDescription);
  456. FINFO("Context Code Description:{$}",errShortDescription);
  457. }
  458. break;
  459. }
  460. case PEGASUS_SELF_TEST_EVENT:
  461. {
  462. FINFO("PEGASUS_SELF_TEST_EVENT Arrived");
  463. break;
  464. }
  465. case PEGASUS_AEC_DATA_EVENT:
  466. {
  467. FINFO("PEGASUS_AEC_DATA_EVENT Arrived");
  468. //原来V2在这里通知APP进行读图 CCOS不用通知 APP收到出线通知就会显示进度条
  469. break;
  470. }
  471. case PEGASUS_CORRECTED_IMAGE_EVENT:
  472. {
  473. FINFO("PEGASUS_CORRECTED_IMAGE_EVENT Arrived");
  474. //原来V2在这里通知APP进行读图 CCOS不用通知 APP收到出线通知就会显示进度条
  475. break;
  476. }
  477. case PEGASUS_ACQUIRE_DONE_EVENT: //采集完成
  478. {
  479. FINFO("PEGASUS_ACQUIRE_DONE_EVENT Arrived");
  480. //::PostMessage(g_CurPanel->m_hWnd, MSG_PANEL_STATUS, PNL_READY, NULL);
  481. //StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  482. break;
  483. }
  484. case PEGASUS_ACQUIRE_ABORT_EVENT: //采集终止
  485. {
  486. FINFO("PEGASUS_ACQUIRE_ABORT_EVENT Arrived");
  487. //StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  488. break;
  489. }
  490. case PEGASUS_CALIBRATION_ACQUIRE_READY_EVENT: //校正开始,准备SC校正曝光
  491. {
  492. FINFO("PEGASUS_CALIBRATION_ACQUIRE_READY_EVENT Arrived");
  493. //::PostMessage(g_CurPanel->m_hWnd, MSG_PANEL_STATUS, PNL_READY, NULL);
  494. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  495. StopWaiting("CalibrationAcquire");
  496. memcpy(&m_CalExpData, pExpData, sizeof(m_CalExpData));
  497. ShowExposureParam(m_CalExpData); // 写日志记录曝光参数
  498. break;
  499. }
  500. case PEGASUS_CALIBRATION_CORRECTED_IMAGE_EVENT: // 这个事件 LAM2 不再使用
  501. {
  502. FINFO("PEGASUS_CALIBRATION_CORRECTED_IMAGE_EVENT Arrived");
  503. break;
  504. }
  505. case PEGASUS_CALIBRATION_DONE_EVENT: //校正结束
  506. {
  507. FINFO("PEGASUS_CALIBRATION_DONE_EVENT Arrived,One time Finished");
  508. //::PostMessage(g_CurPanel->m_hWnd, MSG_PANEL_STATUS, PNL_COMP_CAL_END, NULL);
  509. //StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  510. break;
  511. }
  512. case PEGASUS_CALIBRATION_ABORT_EVENT: //校正终止
  513. {
  514. FINFO("PEGASUS_CALIBRATION_ABORT_EVENT Arrived,Calibration Abort");
  515. //::PostMessage(g_CurPanel->m_hWnd, MSG_PANEL_STATUS, PNL_READY, NULL);
  516. //StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  517. SetEvent(m_hEndCalibEvent);
  518. break;
  519. }
  520. case PEGASUS_READY_FOR_EXPOSURE_EVENT: //平板ready事件
  521. {
  522. //SDK2.19.0.0不会回调此事件
  523. FINFO("PEGASUS_READY_FOR_EXPOSURE_EVENT Arrived,Detector is ready for exposure");
  524. m_bReadyForExp = true;
  525. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  526. break;
  527. }
  528. default:
  529. break;
  530. }
  531. strLog.Format("End to Get Event: %d", myEvent);
  532. FINFO(strLog.GetString());
  533. }
  534. void CAXSCtrl::ShowExposureParam(PEGASUS_ExposureData& expData)
  535. {
  536. CString strLog;
  537. FINFO("ShowExposureParam start");
  538. char targetFilterDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  539. char focusTypeDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  540. char contextDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  541. char pegasusStateDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  542. strLog.Format(_T(" imageLeft : %i"), expData.imageLeft);
  543. FINFO(strLog.GetString());
  544. strLog.Format(_T(" mas : %f"), expData.mas);
  545. FINFO(strLog.GetString());
  546. strLog.Format(_T(" kv : %i"), expData.kv);
  547. FINFO(strLog.GetString());
  548. strLog.Format(_T(" use_grid : %s"), (expData.use_grid ? "YES" : "NO"));
  549. FINFO(strLog.GetString());
  550. strLog.Format(_T(" use_AEC : %s"), (expData.use_AEC ? "YES" : "NO"));
  551. FINFO(strLog.GetString());
  552. API_PEGASUS_GetTargetFilterTypeDescription(expData.targetFilter, targetFilterDescription);
  553. strLog.Format(_T(" targetFilter: %s"), targetFilterDescription);
  554. FINFO(strLog.GetString());
  555. API_PEGASUS_GetFocusTypeDescription(expData.focus, focusTypeDescription);
  556. strLog.Format(_T(" focusType : %s"), focusTypeDescription);
  557. FINFO(strLog.GetString());
  558. API_PEGASUS_GetContextCodeDescription(expData.context, contextDescription);
  559. strLog.Format(_T(" context : %s"), contextDescription);
  560. FINFO(strLog.GetString());
  561. API_PEGASUS_GetPegasusStateDescription(expData.pegasusState, pegasusStateDescription);
  562. strLog.Format(_T(" pegasusState: %s"), pegasusStateDescription);
  563. FINFO(strLog.GetString());
  564. FINFO("ShowExposureParam end");
  565. }
  566. void onMultiEventCallback(PEGASUS_MultiEventType myEvent, PEGASUS_ErrorCode err, int sequenceId, int imageIndex)
  567. {
  568. g_pDetector->multiEventCallback(myEvent,err,sequenceId,imageIndex);
  569. }
  570. void CAXSCtrl::multiEventCallback(PEGASUS_MultiEventType myEvent, PEGASUS_ErrorCode err, int sequenceId, int imageIndex)
  571. {
  572. CString strLog;
  573. char eventDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  574. char errShortDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  575. char errLongDescription[PEGASUS_MAX_STRING_LENGTH] = { 0 };
  576. API_PEGASUS_GetMultiEventDescription(myEvent, eventDescription);
  577. strLog.Format("multiEventCallback Event is %d,Event Description is %s", myEvent, eventDescription);
  578. FINFO(strLog.GetString());
  579. m_nSequenceId = sequenceId; // 序列ID
  580. m_nImageIndex = imageIndex;
  581. strLog.Format("Current SequenceID is %d,ImageIndex is %d", sequenceId, imageIndex);
  582. FINFO(strLog.GetString());
  583. if (err != PEGASUS_SUCCESS)
  584. {
  585. API_PEGASUS_GetErrorDescription(err, errShortDescription, errLongDescription);
  586. strLog.Format("multiEventCallback err: %d, errShortDescription: %s, errLongDescription: %s ", err, errShortDescription, errLongDescription);
  587. FERROR(strLog.GetString());
  588. }
  589. switch (myEvent)
  590. {
  591. case PEGASUS_MULTI_READY_FOR_EXPOSURE_EVENT: //探测器ready,可按下手闸曝光
  592. {
  593. FINFO("PEGASUS_MULTI_READY_FOR_EXPOSURE_EVENT Arrived,detector is ready,Start to exposure");
  594. m_bReadyForExp = true;
  595. StatusFeedback(EVT_STATUS_PANEL, PANEL_READY_EXP);
  596. //if (!m_bChangeAcqProperties) //在ready前会执行setAcqMode,如果没有切换成功,在READY后再切换一次
  597. //{
  598. // ChangeAcqProperties(m_nCurrentAcqMode); //采集模式选择 AEC或者NORMAL
  599. //}
  600. break;
  601. }
  602. case PEGASUS_MULTI_SEQUENCE_STARTED_EVENT: //手闸按下 激发此事件
  603. {
  604. FINFO("PEGASUS_MULTI_SEQUENCE_STARTED_EVENT Arrived,Hand brake pressed");
  605. m_bReadyForExp = false;
  606. //如果环境中只有探测器为真实设备,手闸按下后主动通知射线来了否则状态机不能从FrameReady跳转到FrameStart
  607. if (m_bOnlyHaveFpd)
  608. {
  609. FINFO("notify XRAY ON");
  610. StatusFeedback(EVT_STATUS_PANEL, PANEL_XRAY_ON);
  611. }
  612. FINFO("Call TerminateAcquisition");
  613. API_PEGASUS_TerminateAcquisition();
  614. break;
  615. }
  616. case PEGASUS_MULTI_AEC_DATA_EVENT: //若是AEC模式,AEC图像准备好后激发此事件
  617. {
  618. FINFO("PEGASUS_MULTI_AEC_DATA_EVENT Arrived");
  619. if (err == PEGASUS_SUCCESS)
  620. {
  621. FINFO("set event to get AEC image");
  622. SetEvent(m_hAecImgEvent);//getImage
  623. }
  624. else
  625. {
  626. FERROR("err occured is {$}",(int)err);
  627. }
  628. break;
  629. }
  630. case PEGASUS_MULTI_CORRECTED_IMAGE_EVENT: //正常图像准备好后,激发此事件
  631. {
  632. FINFO("PEGASUS_MULTI_CORRECTED_IMAGE_EVENT Arrived");
  633. if (m_bOnlyHaveFpd)
  634. {
  635. FINFO("notify XRAY OFF");
  636. StatusFeedback(EVT_STATUS_PANEL, PANEL_XRAY_OFF);
  637. }
  638. if (err == PEGASUS_SUCCESS)
  639. {
  640. FINFO("set event to get corrected image");
  641. //SetEvent(m_hCorrectedImgEvent);//getImage
  642. OnProcessCorrectedImg();
  643. StatusFeedback(EVT_STATUS_ACQUISITION, PANEL_EVENT_END_OK);
  644. }
  645. else
  646. {
  647. if (err == PEGASUS_MAJOR_IMAGE_LOST_ERROR)
  648. {
  649. FERROR("image lost, have to recover image!");
  650. }
  651. }
  652. break;
  653. }
  654. case PEGASUS_MULTI_SEQUENCE_DONE_EVENT: //获取图像完成或者在规定时间内没有进行曝光
  655. {
  656. FINFO("PEGASUS_MULTI_SEQUENCE_DONE_EVENT Arrived");
  657. //断开重连之后,探测器会把这个消息回调过来,如果错误码为PEGASUS_MAJOR_IMAGE_LOST_ERROR需要恢复图像
  658. if (err == PEGASUS_MAJOR_IMAGE_LOST_ERROR)
  659. {
  660. FERROR("Image lost,have to shutdown and recover image");
  661. if (!m_bShutDownFlag)
  662. {
  663. FINFO("PEGASUS_MULTI_SEQUENCE_DONE_EVENT PEGASUS_MAJOR_IMAGE_LOST_ERROR Call API_PEGASUS_Shutdown");
  664. API_PEGASUS_Shutdown();//这里的shutdown会有错误码,根据错误码进入恢复图像流程
  665. }
  666. }
  667. if (err == PEGASUS_MAJOR_TIMEOUT_WAITING_FOR_EXPOSURE)//曝光超时先shutdown再init
  668. {
  669. m_bTimeOutFlag = true;
  670. StatusFeedback(EVT_STATUS_PANEL, PANEL_CLOSE);
  671. FERROR("exposure time out current sequence has been aborted. ");
  672. //发送关窗
  673. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  674. //曝光超时需要先shutdown,再重新init
  675. if (!m_bShutDownFlag)
  676. {
  677. FINFO("PEGASUS_MULTI_SEQUENCE_DONE_EVENT PEGASUS_MAJOR_TIMEOUT_WAITING_FOR_EXPOSURE Call API_PEGASUS_Shutdown");
  678. API_PEGASUS_Shutdown();//曝光超时
  679. }
  680. }
  681. break;
  682. }
  683. case PEGASUS_MULTI_SEQUENCE_NOT_READY_EVENT:
  684. {
  685. FINFO("PEGASUS_MULTI_SEQUENCE_NOT_READY_EVENT Arrived,Detector not ready");
  686. //::PostMessage(g_CurPanel->m_hWnd, MSG_PANEL_STATUS, PNL_PREPARE, NULL);
  687. break;
  688. }
  689. case PEGASUS_MULTI_READY_FOR_PREPARE_FOR_EXPOSURE_EVENT:
  690. {
  691. FINFO("PEGASUS_MULTI_READY_FOR_PREPARE_FOR_EXPOSURE_EVENT Arrived,Detector wait for prepare to ready!");
  692. //如果此事件到来时客户端处于检查界面,那么需要重新调用API_PEGASUS_PrepareForExposure让探测器ready
  693. FINFO("m_bShutDownFlag:{$}, m_bTimeOutFlag:{$}", m_bShutDownFlag, m_bTimeOutFlag);
  694. if (m_bShutDownFlag || m_bTimeOutFlag)
  695. {
  696. if (m_ePZDPCstate == PZDPC_STATE_WORK || m_ePZDPCstate == PZDPC_STATE_CALIBRATION)
  697. {
  698. FINFO("Call API_PEGASUS_IsReadyForExposure");
  699. bool readyFlag = API_PEGASUS_IsReadyForExposure();
  700. if (readyFlag)
  701. {
  702. FINFO("the detector is ready");
  703. }
  704. else
  705. {
  706. FINFO("the detector is not ready!");
  707. int nTimeout = 20; //ready后等待曝光的时间,超时会报错
  708. try
  709. {
  710. nTimeout = (int)m_objFPDConfig["ReadyTimeout"];
  711. }
  712. catch (ResDataObjectExption& e)
  713. {
  714. FERROR("Read configuration failed, Error code: {$}", e.what());
  715. }
  716. //等待ready时间为nTimeout,超过这个时间探测器将结束此次采集,下次采集必须重新调用prepareforexposure
  717. FINFO("PEGASUS_MULTI_SEQUENCE_DONE_EVENT Call API_PEGASUS_PrepareForExposure");
  718. PEGASUS_ErrorCode ret = API_PEGASUS_PrepareForExposure(nTimeout);
  719. if (!TestError(ret, "PrepareForExposure"))
  720. {
  721. FERROR("Prepare for exposure is fail!");
  722. }
  723. }
  724. }
  725. m_bShutDownFlag = false;
  726. m_bTimeOutFlag = false;
  727. }
  728. break;
  729. }
  730. default:
  731. break;
  732. }
  733. }
  734. bool CAXSCtrl::StartContinuousAcquisition()
  735. {
  736. FINFO("Enter into StartContinuousAcquisition");
  737. PEGASUS_ErrorCode l_error;
  738. bool bAEC = false;
  739. if (AEC == m_nCurrentAcqMode)
  740. {
  741. bAEC = true;
  742. }
  743. FINFO("Call API_PEGASUS_StartContinuousAcquisition");
  744. l_error = API_PEGASUS_StartContinuousAcquisition(m_targetFilter, bAEC, m_context, onMultiEventCallback);
  745. if (!TestError(l_error,"StartContinuousAcquisition"))
  746. {
  747. FERROR("PEGASUS_StartContinuousAcquisition Failed!");
  748. return false;
  749. }
  750. FINFO("StartContinuousAcquisition End");
  751. return true;
  752. }
  753. bool CAXSCtrl::DriverEntry(CFPDDeviceAXS* pDrvDPC, ResDataObject & Configuration)
  754. {
  755. printf("--Func-- DriverEntry %p \n", pDrvDPC);
  756. FINFO("--Func-- DriverEntry {$}", pDrvDPC);
  757. map<CFPDDeviceAXS*, int>::iterator DPCsIter = m_pDPC2PanelID->find(pDrvDPC);
  758. if (DPCsIter != m_pDPC2PanelID->end())
  759. {
  760. printf("This DPC already exist\n");
  761. FERROR("This DPC already exist");
  762. return false;
  763. }
  764. CPanelStatus* p = new CPanelStatus();
  765. m_pStPanelStatus[m_nPanelCount] = p;
  766. m_pDPC2PanelID->insert(pair<CFPDDeviceAXS*, int>(pDrvDPC, m_nPanelCount));
  767. m_pPanelID2DPC->insert(pair<int, CFPDDeviceAXS*>(m_nPanelCount, pDrvDPC));
  768. m_objFPDConfig = Configuration; //记录配置 --目前只有一个平板,多板时应该分别存储
  769. m_pStPanelStatus[m_nPanelCount]->objPanelConfig = Configuration;
  770. m_nPanelCount++;
  771. //增加校正模式的赋值操作-后续在进行初始化的时候用到
  772. m_nCalibrationMode = (CCOS_CALIBRATION_MODE)(int)m_objFPDConfig["CalibMode"];
  773. return true;
  774. }
  775. /// <summary>
  776. /// 设备连接,启动辅助线程,初始化平板,此时已获取到配置信息
  777. /// </summary>
  778. /// <param name="pDrvDPC"></param>
  779. /// <param name="szWorkPath"></param>
  780. /// <returns>bool</returns>
  781. bool CAXSCtrl::Connect(CFPDDeviceAXS* pDrvDPC, const char* szWorkPath)
  782. {
  783. printf("--Func-- Connect begin...\n");
  784. FINFO("--Func-- Connect. work path:{$}", szWorkPath);
  785. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  786. {
  787. printf("Not current DPC, return\n");
  788. FERROR("Not current DPC, return");
  789. return true;
  790. }
  791. //初始化失败错误,基本不可以恢复了,直接返回false
  792. if (m_pStPanelStatus[m_nCurrentPanelID]->bInitError)
  793. {
  794. printf("\n Connect detector over(err_init) \n");
  795. FINFO("Connect detector over(err_init)");
  796. return false;
  797. }
  798. //初始化阶段出现连接错误,这种状态下不再执行下面的流程
  799. if (m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit)
  800. {
  801. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  802. {
  803. printf("\n Connect detector over(err_connect) \n");
  804. FINFO("Connect detector over(err_connect)");
  805. return false;
  806. }
  807. else
  808. {
  809. printf("\n Connect detector over \n");
  810. FINFO("Connect detector over");
  811. return true;
  812. }
  813. }
  814. //输出一次日期,看日志方便
  815. //SYSTEMTIME st;
  816. //GetLocalTime(&st);
  817. //FINFO("Date: [%04d:%02d:%02d] ", st.wYear, st.wMonth, st.wDay);
  818. //FERROR("Date: [%04d:%02d:%02d] ", st.wYear, st.wMonth, st.wDay);
  819. //end
  820. if (m_strWorkPath == "")
  821. {
  822. m_strWorkPath = szWorkPath;
  823. }
  824. if (!m_pZSKKCalib)
  825. {
  826. m_pZSKKCalib = new CZSKKCalibrationCtrl();
  827. }
  828. DWORD dwThreadId;
  829. if (m_hFPDScanThread == nullptr)
  830. {
  831. m_hFPDScanThread = CreateThread(NULL, 0, onFPDScanThread, this, 0, &dwThreadId); //启动辅助线程
  832. }
  833. SetPZDPCState(PZDPC_STATE_INIT); //进入初始化状态
  834. SetEvent(m_hInitFPDEvent);
  835. return true;
  836. }
  837. bool CAXSCtrl::Disconnect()
  838. {
  839. FINFO("--Func-- Disconnect");
  840. //先退出线程,避免重连流程和调用关闭接口冲突
  841. SetEvent(m_hStopScanEvent); //关闭辅助线程
  842. SetEvent(m_hStopCalibEvent);//关闭校正线程
  843. m_bExitGetInfoThread = true;//关闭获取探测器信息线程
  844. if (m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  845. {
  846. m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus = false;
  847. }
  848. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  849. {
  850. FINFO("Unload ZSKK Reference file");
  851. m_pZSKKCalib->UnLoadZSKKGainMap();
  852. m_pZSKKCalib->UnLoadZSKKPixMap();
  853. }
  854. FINFO("Disconnect over");
  855. return true;
  856. }
  857. void CAXSCtrl::EnterExamMode(int nExamMode)
  858. {
  859. switch (nExamMode)
  860. {
  861. case APP_STATUS_WORK_BEGIN:
  862. FINFO("Enter into Exam Windows");
  863. m_nExamMode = APP_STATUS_WORK_BEGIN;
  864. break;
  865. case APP_STATUS_WORK_END:
  866. FINFO("Quit Exam Windows set detector state standby");
  867. m_nExamMode = APP_STATUS_WORK_END;
  868. SetPZDPCState(PZDPC_STATE_STANDBY);
  869. break;
  870. case APP_STATUS_DETSHARE_BEGIN:
  871. FINFO("Enter into Detector Share Windows");
  872. m_nExamMode = APP_STATUS_DETSHARE_BEGIN;
  873. break;
  874. case APP_STATUS_DETSHAR_END:
  875. m_nExamMode = APP_STATUS_IDLE;
  876. FINFO("Quit Detector Share Windows");
  877. m_nExamMode = APP_STATUS_DETSHAR_END;
  878. break;
  879. case APP_STATUS_CAL_BEGIN:
  880. FINFO("Enter into Calibration Windows");
  881. m_nExamMode = APP_STATUS_CAL_BEGIN;
  882. break;
  883. case APP_STATUS_CAL_END:
  884. FINFO("Quit Calibration Windows");
  885. m_nExamMode = APP_STATUS_CAL_END;
  886. break;
  887. case APP_STATUS_WORK_IN_SENSITIVITY:
  888. FINFO("Enter into sensitivity test interface");
  889. m_nExamMode = APP_STATUS_WORK_IN_SENSITIVITY;
  890. break;
  891. default:
  892. break;
  893. }
  894. }
  895. //设置同步模式
  896. void CAXSCtrl::SetSynMode(int nMode)
  897. {
  898. FINFO("SetSynMode: {$}", nMode);
  899. m_pStPanelStatus[m_nCurrentPanelID]->eSyncMode = (SYNC_MODE)nMode;
  900. }
  901. void CAXSCtrl::SetCalibMode(CCOS_CALIBRATION_MODE eCalibMode)
  902. {
  903. FINFO("SetCalibMode: {$}", (int)eCalibMode);
  904. m_nCalibrationMode = eCalibMode;
  905. }
  906. bool CAXSCtrl::PrepareAcquisition(CFPDDeviceAXS* pDrvDPC)
  907. {
  908. FINFO("CAXSCtrl::PrepareAcquisition");
  909. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  910. {
  911. printf("Not current DPC, return\n");
  912. FERROR("Not current DPC, return");
  913. return false;
  914. }
  915. SetPZDPCState(PZDPC_STATE_WORK); //此时进入检查
  916. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  917. {
  918. FERROR("There is no detector connected, return");
  919. return false;
  920. }
  921. //在调接口让探测器ready之前先判断探测器是否ready,如果已经ready那么不调接口prepare
  922. FINFO("Call API_PEGASUS_IsReadyForExposure");
  923. bool bRet = API_PEGASUS_IsReadyForExposure();
  924. if (bRet)
  925. {
  926. FINFO("the detector is ready! return");
  927. return true;
  928. }
  929. int nTimeout = 20; //ready后等待曝光的时间,超时会报错
  930. try
  931. {
  932. nTimeout = (int)m_objFPDConfig["ReadyTimeout"];
  933. }
  934. catch (ResDataObjectExption& e)
  935. {
  936. FERROR("Read configuration failed, Error code: {$}", e.what());
  937. }
  938. //等待ready时间为nTimeout,超过这个时间探测器将结束此次采集,下次采集必须重新调用prepareforexposure
  939. FINFO("PrepareAcquisition Call API_PEGASUS_PrepareForExposure");
  940. PEGASUS_ErrorCode ret = API_PEGASUS_PrepareForExposure(nTimeout);
  941. if (!TestError(ret, "PrepareForExposure"))
  942. {
  943. FERROR("Prepare for exposure is fail!");
  944. return false;
  945. }
  946. StatusFeedback(EVT_STATUS_ACQUISITION, PANEL_EVENT_START);
  947. return true;
  948. }
  949. bool CAXSCtrl::StartAcquisition(CFPDDeviceAXS* pDrvDPC)
  950. {
  951. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  952. {
  953. printf("Not current DPC, return\n");
  954. FERROR("Not current DPC, return");
  955. return false;
  956. }
  957. FINFO("NotifyXWindowOn");
  958. printf("NotifyXWindowOn\n");
  959. SetEvent(m_hXWinOnEvent);
  960. return true;
  961. }
  962. /***
  963. ** 调用api,结束采集
  964. ** LMAM3-IZ85c一般情况下不会调用stop
  965. ***/
  966. bool CAXSCtrl::StopAcquisition(CFPDDeviceAXS* pDrvDPC)
  967. {
  968. FINFO("CAXSCtrl::StopAcquisition");
  969. if (nullptr != pDrvDPC)
  970. {
  971. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  972. {
  973. printf("Not current DPC, return\n");
  974. FERROR("Not current DPC, return");
  975. return false;
  976. }
  977. }
  978. return true;
  979. }
  980. /***
  981. ** 说明:激活校正
  982. ***/
  983. bool CAXSCtrl::ActiveCalibration(CFPDDeviceAXS* pDrvDPC, CCOS_CALIBRATION_TYPE eType)
  984. {
  985. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  986. {
  987. printf("Not current DPC, return\n");
  988. FERROR("Not current DPC, return");
  989. return false;
  990. }
  991. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  992. {
  993. FERROR("There is no detector connected, return");
  994. return false;
  995. }
  996. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_START);
  997. DWORD dwThreadId;
  998. if (m_hCalibrationThread == nullptr)
  999. {
  1000. m_hCalibrationThread = CreateThread(NULL, 0, onCalibrationThread, this, 0, &dwThreadId);
  1001. }
  1002. else
  1003. {
  1004. FERROR("The calibration process is ongoing");
  1005. }
  1006. if (nullptr == m_hCalibrationThread)
  1007. {
  1008. FERROR("Start calibration thread failed");
  1009. return false;
  1010. }
  1011. m_eType = eType;
  1012. SetPZDPCState(PZDPC_STATE_CALIBRATION);
  1013. m_eCalState = PZ_CALIBRATION_INIT;
  1014. //参考trixellDR 流程
  1015. if (CCOS_CALIBRATION_TYPE_DARK == eType)
  1016. {
  1017. FINFO("Active Dark Calibration");
  1018. }
  1019. else if (CCOS_CALIBRATION_TYPE_XRAY == eType)
  1020. {
  1021. FINFO("Active Xray Calibration");
  1022. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1023. {
  1024. if (!m_pZSKKCalib)
  1025. {
  1026. FERROR("ZSKK Calibration object is undefined");
  1027. }
  1028. else
  1029. {
  1030. //反馈Dose信息
  1031. DataFeedback(EVT_DATA_DOSEPARAM, NULL, 0, 25.0);
  1032. //加载ZSKK的校正文件
  1033. m_pZSKKCalib->m_strRawImgPath = m_strWorkPath + "\\rawdata\\";
  1034. m_pZSKKCalib->m_strRefFilePath = m_strWorkPath + "\\references\\";
  1035. m_pZSKKCalib->m_nFullImgWidth = m_nImageWidth;
  1036. m_pZSKKCalib->m_nFullImgHeight = m_nImageHeight;
  1037. m_pZSKKCalib->m_nReferenceNum = m_nCalibrationRounds;
  1038. m_pZSKKCalib->m_nSaturationValue = 50000;
  1039. m_pZSKKCalib->LoadZSKKGainMap(false, m_strPanelType);
  1040. m_pZSKKCalib->LoadZSKKPixelMap(false, m_strPanelType);
  1041. FINFO("Start ZSKK Gain!");
  1042. FINFO("references file path: {$}", m_pZSKKCalib->m_strRefFilePath.c_str());
  1043. }
  1044. }
  1045. }
  1046. else
  1047. {
  1048. FINFO("Active not supported calibration({$}), return!", (int)eType);
  1049. }
  1050. return true;
  1051. }
  1052. /***
  1053. ** 说明:准备校正(状态机FramePrep)
  1054. ***/
  1055. bool CAXSCtrl::PrepareCalibration(CFPDDeviceAXS* pDrvDPC)
  1056. {
  1057. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  1058. {
  1059. printf("Not current DPC, return\n");
  1060. FERROR("Not current DPC, return");
  1061. return false;
  1062. }
  1063. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  1064. {
  1065. FERROR("There is no detector connected, return");
  1066. return false;
  1067. }
  1068. if (CCOS_CALIBRATION_TYPE_XRAY == m_eType)
  1069. {
  1070. FINFO("PrepareCalibration type = {$}", (int)CCOS_CALIBRATION_TYPE_XRAY);
  1071. m_eCalState = PZ_CALIBRATION_GAIN;
  1072. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1073. {
  1074. FINFO("PrepareCalibration ZSKK");
  1075. FINFO("Call API_PEGASUS_IsReadyForExposure");
  1076. bool ret = API_PEGASUS_IsReadyForExposure();
  1077. if (ret)
  1078. {
  1079. FINFO("The detector is ready!");
  1080. StatusFeedback(EVT_STATUS_PANEL, PANEL_GAIN_READY_EXP);//notify detector is ready
  1081. }
  1082. else
  1083. {
  1084. FERROR("Ther detector is not ready!");
  1085. //如果不ready该如何处理后续再加
  1086. return false;
  1087. }
  1088. }
  1089. else
  1090. {
  1091. FINFO("PrepareCalibration OTHER");
  1092. FINFO("Call API_PEGASUS_CalibrateUsingType");
  1093. PEGASUS_ErrorCode ret = API_PEGASUS_CalibrateUsingType(PEGASUS_CALIBRATION_TYPE_GAIN, m_nExposureNumCurrentRound);
  1094. if (!TestError(ret, "PEGASUS_CalibrateUsingType"))
  1095. {
  1096. FERROR("Pegasus Start Calibration Failed!");
  1097. return false;
  1098. }
  1099. //等待ready通知
  1100. int nTimeout = 15;
  1101. try
  1102. {
  1103. nTimeout = (int)m_objFPDConfig["ReadyTimeout"];
  1104. }
  1105. catch (ResDataObjectExption& e)
  1106. {
  1107. FERROR("Read configuration failed, Error code: {$}", e.what());
  1108. }
  1109. if (!WaitRespond(nTimeout, "PrepareCalibration Going to ready")) //没有等到ready回调,返回失败
  1110. {
  1111. return false;
  1112. }
  1113. printf("PrepareCalibration wait end...\n");
  1114. FINFO("PrepareCalibration wait end...");
  1115. StatusFeedback(EVT_STATUS_PANEL, PANEL_GAIN_READY_EXP);//notify detector is ready
  1116. }
  1117. }
  1118. else
  1119. {
  1120. //LMAM3-IZ85c不用暗场校正直接返回成功即可(暗场走个流程,没有实质性的动作)
  1121. FINFO("PrepareCalibration type = {$}", (int)CCOS_CALIBRATION_TYPE_DARK);
  1122. m_eCalState = PZ_CALIBRATION_OFFSET;
  1123. }
  1124. return true;
  1125. }
  1126. bool CAXSCtrl::StartCalibration(CFPDDeviceAXS* pDrvDPC)
  1127. {
  1128. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  1129. {
  1130. printf("Not current DPC, return\n");
  1131. FERROR("Not current DPC, return");
  1132. return false;
  1133. }
  1134. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  1135. {
  1136. FERROR("There is no detector connected, return");
  1137. printf("the detector is not connected\n");
  1138. return false;
  1139. }
  1140. if (CCOS_CALIBRATION_TYPE_DARK == m_eType)
  1141. {
  1142. printf("开始 DARK 校正 \n");
  1143. FINFO("start dark calibration");
  1144. m_eCalState = PZ_CALIBRATION_OFFSET;
  1145. //SetEvent(m_hPZMStartOffset);
  1146. SetEvent(m_hPZMInOffset);
  1147. }
  1148. else if(CCOS_CALIBRATION_TYPE_XRAY == m_eType)
  1149. {
  1150. printf("开始 GAIN 校正 \n");
  1151. FINFO("start gain calibration");
  1152. m_eCalState = PZ_CALIBRATION_GAIN;
  1153. //SetEvent(m_hPZMStartGain);
  1154. }
  1155. return true;
  1156. }
  1157. bool CAXSCtrl::StopCalibration(CFPDDeviceAXS* pDrvDPC)
  1158. {
  1159. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  1160. {
  1161. printf("Not current DPC, return\n");
  1162. FERROR("Not current DPC, return");
  1163. return false;
  1164. }
  1165. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  1166. {
  1167. FERROR("There is no detector connected, return");
  1168. return false;
  1169. }
  1170. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1171. {
  1172. m_bCalibrationOver = false; //用户停止校正
  1173. }
  1174. return true;
  1175. }
  1176. /// <summary>
  1177. /// 动态加载设备厂商SDK DLL
  1178. /// </summary>
  1179. bool CAXSCtrl::LoadSdkDll()
  1180. {
  1181. string strSDKPath = "";
  1182. string strDllpath = "";
  1183. try
  1184. {
  1185. strSDKPath = (string)m_objFPDConfig["SDKPath"];
  1186. }
  1187. catch (ResDataObjectExption& e)
  1188. {
  1189. FERROR("Read configuration failed, Error code: {$}", e.what());
  1190. return false;
  1191. }
  1192. strSDKPath = m_strWorkPath + "\\" + strSDKPath;
  1193. strDllpath = strSDKPath + "\\Pegasus.dll";
  1194. FINFO("Load SDK path: {$}", strDllpath.c_str());
  1195. //将SDK路径加入环境变量
  1196. char* pathvar;
  1197. pathvar = getenv("Path");
  1198. printf("pathvar = %s \n\n", pathvar);
  1199. string strPath = "Path=";
  1200. strPath += pathvar;
  1201. strPath += ";";
  1202. strPath += strSDKPath;
  1203. printf("strPath:%s \n\n", strPath.c_str());
  1204. if (_putenv(strPath.c_str()) != 0)
  1205. {
  1206. DWORD dw = GetLastError();
  1207. printf("Add dll failed: %d \n", dw);
  1208. return false;
  1209. }
  1210. //pathvar = getenv("Path"); //test
  1211. //printf("pathvar = %s \n\n", pathvar);
  1212. m_hPZSDKModule = LoadLibraryEx(strDllpath.c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
  1213. if (m_hPZSDKModule == nullptr)
  1214. {
  1215. DWORD dw = GetLastError();
  1216. FERROR("Load {$} failed: {$} \n", strDllpath.c_str(), dw);
  1217. return false;
  1218. }
  1219. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_RegisterProgressionCallback);
  1220. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Initialize);
  1221. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_QuickInitialize);
  1222. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Shutdown);
  1223. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_LoadContext);
  1224. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_DetailedInformation);
  1225. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Information);
  1226. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_SystemDetailedInformation);
  1227. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_CalibrationInformation);
  1228. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetCalibrationInformation);
  1229. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetCalibrationInformationUsingType);
  1230. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_IsReadyForExposure);
  1231. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Acquire);
  1232. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_AbortAcquire);
  1233. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_StartContinuousAcquisition);
  1234. //LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_StartContinuousAcquisitionEx);
  1235. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_ChangeContinuousAcquisitionProperties);
  1236. //LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_ChangeContinuousAcquisitionPropertiesEx);
  1237. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetContinuousAcquisitionProperties);
  1238. //LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetContinuousAcquisitionPropertiesEx);
  1239. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_OverrideTargetFilter);
  1240. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetAecImage);
  1241. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetCorrectedImage);
  1242. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetInformationOfFirstAvailableImage);
  1243. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_StartSingleAcquisition);
  1244. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_PrepareForExposure);
  1245. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_TriggerAcquisition);
  1246. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_RecoverImage);
  1247. //LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_RecoverImageEx);
  1248. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_CancelImageRecovery);
  1249. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_RecoverLastSequenceID);
  1250. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Calibrate);
  1251. //LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_CalibrateEx);
  1252. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetNbrCalImagesLeft);
  1253. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_AbortCalibration);
  1254. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_AddImageToCalibration);
  1255. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_RejectCalibrationImage);
  1256. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_AutoCalibrate);
  1257. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_CalibrateUsingType);
  1258. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_StopComServer);
  1259. //LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetLogLevel);
  1260. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_SetLogLevel);
  1261. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_SelfTest);
  1262. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Sleep);
  1263. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_ServiceImageInformation);
  1264. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetServiceImage);
  1265. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_UpdateDefectMap);
  1266. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetWeakDefect);
  1267. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_UpdateWeakDefect);
  1268. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetErrorDescription);
  1269. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetEventDescription);
  1270. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetMultiEventDescription);
  1271. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetDebugDump);
  1272. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetDetectorTypeDescription);
  1273. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetProductTypeDescription);
  1274. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetContextCodeDescription);
  1275. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetDetectorStateDescription);
  1276. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetPegasusStateDescription);
  1277. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetLogLevelCodeDescription);
  1278. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetSelfTestTypeDescription);
  1279. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetTargetFilterTypeDescription);
  1280. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetFocusTypeDescription);
  1281. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetServiceImageTypeDescription);
  1282. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetPixelFormatDescription);
  1283. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetDefectTypeDescription);
  1284. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetCalibrationTypeDescription);
  1285. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_GetAvailableContext);
  1286. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Entry);
  1287. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_Exit);
  1288. LOAD_PROC_ADDRESS(m_hPZSDKModule, PEGASUS_TerminateAcquisition);
  1289. m_bLoadedSDK = true;
  1290. FINFO("Load SDK over");
  1291. return true;
  1292. }
  1293. /// <summary>
  1294. /// 初始化 SDK初始化接口中会连接探测器
  1295. /// [DONE.CHECKED.]
  1296. /// </summary>
  1297. /// <returns></returns>
  1298. PEGASUS_ErrorCode CAXSCtrl::InitSDK()
  1299. {
  1300. printf("Begin initialize SDK \n");
  1301. FINFO("Begin initialize SDK\n");
  1302. PEGASUS_ErrorCode nRet = PEGASUS_SUCCESS;
  1303. bool bQuickFlag = true; // 是否快速初始化
  1304. bool isSkipEoConfig = false; // 是否跳过EO初始化
  1305. if (bQuickFlag)
  1306. {
  1307. FINFO("Enter into QuickInitialize");
  1308. //从关闭模式恢复(如果15分钟没有动作探测器进入关闭模式,相当于省电模式)时使用quick initial
  1309. if (isSkipEoConfig)
  1310. {
  1311. FINFO("QuickInitialize Pegasus w/o reading the EOs.");
  1312. FINFO(" This operation takes less than one minute to complete.");
  1313. }
  1314. else
  1315. {
  1316. FINFO("QuickInitialize Pegasus with EOs reading.");
  1317. FINFO(" This operation takes less than one minute to complete if the EOs are not expired");
  1318. FINFO(" Otherwise it could take a couple of minutes.");
  1319. }
  1320. nRet = API_PEGASUS_QuickInitialize(onEventCallback, m_context, isSkipEoConfig);
  1321. if (!TestError(nRet, "PEGASUS_QuickInitialize"))
  1322. {
  1323. FERROR("Quick Initialize fail!");
  1324. }
  1325. }
  1326. else
  1327. {
  1328. FINFO("Enter into Initialize");
  1329. nRet = API_PEGASUS_Initialize(onEventCallback);
  1330. if (!TestError(nRet, "PEGASUS_Initialize"))
  1331. {
  1332. FERROR("Initialize fail!");
  1333. }
  1334. }
  1335. if (PEGASUS_SUCCESS == nRet)
  1336. {
  1337. //等待初始化成功通知
  1338. int nTimeout = 30000; //缺省等30s
  1339. try
  1340. {
  1341. nTimeout = (int)m_objFPDConfig["ConnectTimeout"];
  1342. }
  1343. catch (ResDataObjectExption& e)
  1344. {
  1345. FERROR("Read configuration failed, Error code: {$}", e.what());
  1346. }
  1347. if (!WaitRespond(nTimeout, "Initialize Going to connect")) //没有等到初始化成功的回调,返回失败
  1348. {
  1349. nRet = PEGASUS_MAJOR_TIMEOUT_ERROR;
  1350. goto my_error;
  1351. }
  1352. printf("Initialize wait end...\n");
  1353. FINFO("Initialize wait end...");
  1354. if (m_ePZDPCstate == PZDPC_STATE_INIT)
  1355. {
  1356. m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit = false;
  1357. }
  1358. //调用接口获取探测器信息并打印到日志中
  1359. nRet = GetDetectorInfo();
  1360. if (nRet)
  1361. {
  1362. FERROR("InitSDK GetDetectorInfo fail!");
  1363. }
  1364. }
  1365. my_error:
  1366. //根据最后一次的返回值判断
  1367. if (PEGASUS_SUCCESS != nRet)
  1368. {
  1369. StatusFeedback(EVT_STATUS_PANEL, PANEL_CLOSE);
  1370. FERROR("Initialize error,code:{$}", (int)nRet);
  1371. if (PEGASUS_MAJOR_COMMUNICATION_ERROR == nRet)
  1372. {
  1373. //m_bExitGetInfoThread = true;
  1374. if (m_ePZDPCstate == PZDPC_STATE_INIT)
  1375. {
  1376. m_pStPanelStatus[m_nCurrentPanelID]->bConnErrorInInit = true;
  1377. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END);
  1378. }
  1379. }
  1380. else
  1381. {
  1382. FINFO("InitSDK other error");
  1383. if (m_ePZDPCstate == PZDPC_STATE_INIT)
  1384. {
  1385. m_pStPanelStatus[m_nCurrentPanelID]->bInitError = true;
  1386. ErrorFeedback(EVT_ERR_INIT_FAILED, "true");
  1387. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_ERROR);
  1388. }
  1389. }
  1390. }
  1391. printf("Initialize SDK over \n");
  1392. FINFO("Initialize SDK over\n");
  1393. return nRet;
  1394. }
  1395. bool CAXSCtrl::LoadZskkMap()
  1396. {
  1397. FINFO("Begin LoadZskkMap");
  1398. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1399. {
  1400. FINFO("Load ZSKK Reference file");
  1401. if (!m_pZSKKCalib->LoadZSKKGainMap(true, m_strPanelType))
  1402. {
  1403. FERROR("Load ZSKK Gain Map failed!");
  1404. }
  1405. if (!m_pZSKKCalib->LoadZSKKPixelMap(true, m_strPanelType))
  1406. {
  1407. FERROR("Load ZSKK Defect Map failed!");
  1408. }
  1409. }
  1410. FINFO("LoadZskkMap over");
  1411. return true;
  1412. }
  1413. void CAXSCtrl::GetConfigParam()
  1414. {
  1415. FINFO("GetConfigParam start");
  1416. //从配置文件中读取当前环境中是否只有一个探测器是真实设备的配置项
  1417. m_bOnlyHaveFpd = ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[m_nCurrentPanelID])->GetOnlyHaveFpd();
  1418. if (m_bOnlyHaveFpd)
  1419. {
  1420. FINFO("Current system only have FPD other is demo!");
  1421. }
  1422. FINFO("GetConfigParam end");
  1423. }
  1424. //获取SDK版本信息,获取探测器信息
  1425. PEGASUS_ErrorCode CAXSCtrl::GetDetectorInfo()
  1426. {
  1427. FINFO("===== Get Detailed Information Start=====");
  1428. CString strLog;
  1429. PEGASUS_ErrorCode err;
  1430. PEGASUS_DetailedInfo l_di;
  1431. char description[PEGASUS_MAX_STRING_LENGTH] = {0};
  1432. // Get Pegasus detailed information
  1433. FINFO("Call PEGASUS_DetailedInformation");
  1434. err = API_PEGASUS_DetailedInformation(&l_di);
  1435. if (!TestError(err,"GetDetailedInformation"))
  1436. {
  1437. FERROR("Pegasus failed to return Pegasus detailed information during Acquire");
  1438. return err;
  1439. }
  1440. else
  1441. {
  1442. //DetectorType
  1443. API_PEGASUS_GetDetectorTypeDescription(l_di.detector_type, description);
  1444. strLog.Format("Detector Type %d : %s", l_di.detector_type, description);
  1445. FINFO(strLog.GetString());
  1446. //Current Context
  1447. API_PEGASUS_GetContextCodeDescription(l_di.current_context, description);
  1448. strLog.Format("Current Context %d : %s", l_di.current_context, description);
  1449. FINFO(strLog.GetString());
  1450. //FirmwareInfo-----------
  1451. //DetectorID
  1452. strLog.Format( "Detector's DetectorID : %s",l_di.firmwareInfo.detectorID);
  1453. FINFO(strLog.GetString());
  1454. //TFT panel ID
  1455. strLog.Format( "Detector's Panel ID : %s",l_di.firmwareInfo.panelId);
  1456. FINFO(strLog.GetString());
  1457. //system configuration release
  1458. strLog.Format( "Detector's system configuration release : %s",l_di.firmwareInfo.sysRelease);
  1459. FINFO(strLog.GetString());
  1460. //cpuBootVer
  1461. strLog.Format( "Detector's cpuBootVer : %s",l_di.firmwareInfo.cpuBootVer);
  1462. FINFO(strLog.GetString());
  1463. //cpuVer
  1464. strLog.Format( "Detector's cpuVer : %s",l_di.firmwareInfo.cpuVer);
  1465. FINFO(strLog.GetString());
  1466. //FPGAVer firmware version
  1467. strLog.Format("Detector's firmware version : %s", l_di.firmwareInfo.fpgaVer);
  1468. FINFO(strLog.GetString());
  1469. //FPGA Top 0 firmware version
  1470. strLog.Format("Detector's Top 0 firmware version : %s", l_di.firmwareInfo.fpgaT0);
  1471. FINFO(strLog.GetString());
  1472. //FPGA Top 1 firmware version
  1473. strLog.Format("Detector's Top 1 firmware version : %s", l_di.firmwareInfo.fpgaT1);
  1474. FINFO(strLog.GetString());
  1475. //FPGA Top 2 firmware version
  1476. strLog.Format("Detector's Top 2 firmware version : %s", l_di.firmwareInfo.fpgaT2);
  1477. FINFO(strLog.GetString());
  1478. //FPGA Top 3 firmware version
  1479. strLog.Format("Detector's Top 3 firmware version : %s", l_di.firmwareInfo.fpgaT3);
  1480. FINFO(strLog.GetString());
  1481. //FPBA Bottom 0 firmware version
  1482. strLog.Format("Detector's Bottom 0 firmware version : %s", l_di.firmwareInfo.fpgaB0);
  1483. FINFO(strLog.GetString());
  1484. //FPBA Bottom 1 firmware version
  1485. strLog.Format("Detector's Bottom 1 firmware version : %s", l_di.firmwareInfo.fpgaB1);
  1486. FINFO(strLog.GetString());
  1487. //FPBA Bottom 2 firmware version
  1488. strLog.Format("Detector's Bottom 2 firmware version : %s", l_di.firmwareInfo.fpgaB2);
  1489. FINFO(strLog.GetString());
  1490. //FPBA Bottom 3 firmware version
  1491. strLog.Format("Detector's Bottom 3 firmware version : %s", l_di.firmwareInfo.fpgaB3);
  1492. FINFO(strLog.GetString());
  1493. //FirmwareInfo-----------
  1494. //ImageInfo---------
  1495. //imagingMode
  1496. m_nImageMode = l_di.imageInfo.imagingMode;
  1497. strLog.Format("Image Mode : %d", m_nImageMode);
  1498. FINFO(strLog.GetString());
  1499. //rawWidth
  1500. //m_nRawImgWidth = l_di.imageInfo.rawWidth;//2816
  1501. strLog.Format("Raw Image Width : %d", l_di.imageInfo.rawWidth);
  1502. FINFO(strLog.GetString());
  1503. //rawHeight
  1504. //m_nRawImgHeight = l_di.imageInfo.rawHeight;//3650
  1505. strLog.Format("Raw Image Height : %d", l_di.imageInfo.rawHeight);
  1506. FINFO(strLog.GetString());
  1507. //rawSize
  1508. //m_nRawImageSize = l_di.imageInfo.rawSize;//20556800
  1509. strLog.Format("Raw Image Size : %d", l_di.imageInfo.rawSize);
  1510. FINFO(strLog.GetString());
  1511. //rawPixelSize
  1512. //m_nRawPixelSize = l_di.imageInfo.rawPixelSize;//2
  1513. strLog.Format("Raw Image Pixel Size : %d", l_di.imageInfo.rawPixelSize);
  1514. FINFO(strLog.GetString());
  1515. //width
  1516. m_nRawImgWidth = l_di.imageInfo.width;//2816
  1517. m_nImageWidth = l_di.imageInfo.width;//2816
  1518. strLog.Format("Normal Image Width : %d", m_nImageWidth);
  1519. FINFO(strLog.GetString());
  1520. //height
  1521. m_nRawImgHeight = l_di.imageInfo.height;//3584
  1522. m_nImageHeight = l_di.imageInfo.height;//3584
  1523. strLog.Format("Normal Image Height : %d", m_nImageHeight);
  1524. FINFO(strLog.GetString());
  1525. //size
  1526. m_nRawImageSize = l_di.imageInfo.size;//20185088
  1527. m_nImageSize = l_di.imageInfo.size;//20185088
  1528. strLog.Format("Normal Image Size : %d", m_nImageSize);
  1529. FINFO(strLog.GetString());
  1530. //pixelSize
  1531. m_nRawPixelSize = l_di.imageInfo.pixelSize;//2
  1532. m_nImagePixelSize = l_di.imageInfo.pixelSize;//2
  1533. strLog.Format("Normal Image Pixel Size : %d", m_nImagePixelSize);
  1534. FINFO(strLog.GetString());
  1535. //aec image ===== pre view
  1536. //aecWidth
  1537. m_nAecImageWidth = l_di.imageInfo.aecWidth;//22
  1538. strLog.Format("Aec Image Width : %d", m_nAecImageWidth);
  1539. FINFO(strLog.GetString());
  1540. //aecHeight
  1541. m_nAecImageHeight = l_di.imageInfo.aecHeight;//28
  1542. strLog.Format("Aec Image Height : %d", m_nAecImageHeight);
  1543. FINFO(strLog.GetString());
  1544. //aecSize
  1545. m_nAecImageSize = l_di.imageInfo.aecSize;//2464
  1546. strLog.Format("Aec Image Size : %d", m_nAecImageSize);
  1547. FINFO(strLog.GetString());
  1548. //aecPixelSize
  1549. m_nAecPixelSize = l_di.imageInfo.aecPixelSize;//4
  1550. strLog.Format("Aec Image Pixel Size : %d", m_nAecPixelSize);
  1551. FINFO(strLog.GetString());
  1552. //temperature
  1553. strLog.Format("Temperature : %.2f C", l_di.temperature);
  1554. FINFO(strLog.GetString());
  1555. StatusFeedback(EVT_STATUS_TEMPERATURE, 0, "", m_nCurrentPanelID, l_di.temperature);
  1556. //pegasusState
  1557. API_PEGASUS_GetPegasusStateDescription( l_di.pegasusState, description);
  1558. strLog.Format( "Pegasus State %d : %s", l_di.pegasusState, description );
  1559. FINFO(strLog.GetString());
  1560. //detectorState
  1561. API_PEGASUS_GetDetectorStateDescription( l_di.detectorState, description);
  1562. strLog.Format( "Detector State %d : %s", l_di.detectorState, description );
  1563. FINFO(strLog.GetString());
  1564. //eclipseVersion
  1565. strLog.Format( "Eclipse Eclipse Version : %s", l_di.eclipseVersion );
  1566. FINFO(strLog.GetString());
  1567. //pegasusVersion
  1568. strLog.Format("Eclipse Pegasus Version : %s", l_di.pegasusVersion);
  1569. FINFO(strLog.GetString());
  1570. }
  1571. /*FINFO("Call PEGASUS_GetLogLevel");
  1572. PEGASUS_LogLevel logLevel;
  1573. err = API_PEGASUS_GetLogLevel(&logLevel);
  1574. if (!TestError(err,"GetLogLevel"))
  1575. {
  1576. FERROR("failed get log level");
  1577. return err;
  1578. }
  1579. API_PEGASUS_GetLogLevelCodeDescription(logLevel, description);
  1580. strLog.Format("log level is: %d description: %s", logLevel, description);
  1581. FINFO(strLog.GetString());*/
  1582. FINFO("===== Get Detailed Information Over =====");
  1583. return err;
  1584. }
  1585. /***
  1586. ** 设置校正文件路径
  1587. ** 说明:device\references\xxxxxx\dark是暗场校正过程文件
  1588. ** device\references\xxxxxx\flood是亮场校正过程文件
  1589. ** 校正完成后校正文件会生成到device\references\路径,strPanelSerial表示探测器序列号
  1590. ***/
  1591. bool CAXSCtrl::SetFPDTplPath()
  1592. {
  1593. FINFO("SetFPDTplPath start");
  1594. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1595. {
  1596. FINFO("calibration is ZSKK,return");
  1597. return true;
  1598. }
  1599. string strTplRootPath = m_strWorkPath + "\\references";
  1600. string strPanelSerial = "";
  1601. string strDarkTplPath = "";
  1602. string strFloodTplPath = "";
  1603. try
  1604. {
  1605. strPanelSerial = (string)m_objFPDConfig["SerialNumber"];
  1606. }
  1607. catch (ResDataObjectExption& e)
  1608. {
  1609. FERROR("Read configuration failed, Error code: {$}", e.what());
  1610. return false;
  1611. }
  1612. strDarkTplPath = strTplRootPath + "\\" + strPanelSerial + "\\dark\\";
  1613. strFloodTplPath = strTplRootPath + "\\" + strPanelSerial + "\\flood\\";
  1614. // 创建dark文件路径
  1615. if (CreateFileDirectory(strDarkTplPath))
  1616. {
  1617. FINFO("Create Directory: {$}", strDarkTplPath.c_str());
  1618. m_strTplDarkPath = strDarkTplPath;
  1619. }
  1620. else
  1621. {
  1622. FERROR("Create Directory: {$} failed", strDarkTplPath.c_str());
  1623. return false;
  1624. }
  1625. // 创建flood文件路径
  1626. if (CreateFileDirectory(strFloodTplPath))
  1627. {
  1628. FINFO("Create Directory: {$}", strFloodTplPath.c_str());
  1629. m_strTplFloodPath = strFloodTplPath;
  1630. }
  1631. else
  1632. {
  1633. FERROR("Create Directory: {$} failed", strFloodTplPath.c_str());
  1634. return false;
  1635. }
  1636. //将references路径设置给SDK
  1637. /*char* szTplRootPath = const_cast<char*>(strTplRootPath.c_str());
  1638. FINFO("Call TplPathSet, Template Root Path : {$}", szTplRootPath);
  1639. nRet = API_COM_TplPathSet(szTplRootPath);
  1640. if (!TestError(nRet, "TplPathSet"))
  1641. {
  1642. return false;
  1643. }*/
  1644. FINFO("SetFPDTplPath end");
  1645. return true;
  1646. }
  1647. DWORD __stdcall CAXSCtrl::onFPDScanThread(PVOID pvoid)
  1648. {
  1649. CAXSCtrl* pOpr = (CAXSCtrl*)pvoid;
  1650. FINFO("Enter Scan Thread");
  1651. DWORD dwTimeOut = 5000;
  1652. while (!pOpr->m_bExitFpdScanThread)
  1653. {
  1654. DWORD dwRet = WaitForMultipleObjects(ASSIST_EVENT_COUNT, pOpr->m_hArrayEvent, FALSE, dwTimeOut);
  1655. if (WAIT_OBJECT_0 == dwRet) //m_hStopScanEvent
  1656. {
  1657. FINFO("Exit fpd scan thread!");
  1658. pOpr->m_bExitFpdScanThread = true;
  1659. }
  1660. else if (WAIT_OBJECT_0 + 1 == dwRet) //m_hAecImgEvent
  1661. {
  1662. pOpr->OnProcessAecImg();
  1663. }
  1664. else if (WAIT_OBJECT_0 + 2 == dwRet) //m_hCorrectedImgEvent
  1665. {
  1666. pOpr->OnProcessCorrectedImg();
  1667. }
  1668. else if (WAIT_OBJECT_0 + 3 == dwRet) //m_hXWinOnEvent
  1669. {
  1670. DWORD dwXrayOnTime, dwXrayOffTime;
  1671. dwXrayOnTime = dwXrayOffTime = GetTickCount();
  1672. FINFO("XWindowOn: {$}", dwXrayOnTime);
  1673. printf("XWindowOn \n");
  1674. pOpr->StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1675. /*while (dwXrayOffTime - dwXrayOnTime < 750)
  1676. {
  1677. dwXrayOffTime = GetTickCount();
  1678. }
  1679. FINFO("XWindowOff: {$}", dwXrayOffTime);
  1680. printf("XWindowOff \n");
  1681. pOpr->StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);*/
  1682. }
  1683. else if (WAIT_OBJECT_0 + 4 == dwRet) //m_hInitFPDEvent
  1684. {
  1685. pOpr->OnProcessInitFPD();
  1686. }
  1687. else if (WAIT_OBJECT_0 + 5 == dwRet) //m_hReInitEvent
  1688. {
  1689. pOpr->OnReInitFPD();
  1690. }
  1691. else if (WAIT_OBJECT_0 + 6 == dwRet) //m_hRecoverImage
  1692. {
  1693. pOpr->OnRecoverImage();
  1694. }
  1695. else if (WAIT_OBJECT_0 + 7 == dwRet) //m_pAcqUnitCient
  1696. {
  1697. pOpr->OnProcessGenNotify();
  1698. }
  1699. }
  1700. FINFO("Exit Scan Thread");
  1701. pOpr->m_hFPDScanThread = nullptr;
  1702. return 0;
  1703. }
  1704. /***
  1705. ** 处理AEC图像
  1706. ***/
  1707. void CAXSCtrl::OnProcessAecImg()
  1708. {
  1709. printf("Here Come AEC Image.....\n");
  1710. FINFO("Here Come AEC Image");
  1711. CString strLog;
  1712. PEGASUS_ErrorCode ret;
  1713. if (m_pAecImgBuffer)
  1714. {
  1715. memset(m_pAecImgBuffer, 0, m_nRawImgWidth * m_nAecImageHeight * 2);
  1716. }
  1717. m_ResultImage.cropInfo.cropOffsetRow = 0;
  1718. m_ResultImage.cropInfo.cropOffsetCol = 0;
  1719. m_ResultImage.cropInfo.cropWidth = m_nAecImageWidth;
  1720. m_ResultImage.cropInfo.cropHeight = m_nAecImageHeight;
  1721. m_nAecImageSize = m_nAecImageWidth * m_nAecImageHeight * m_nAecPixelSize;
  1722. strLog.Format("AEC Image Width:%d,Height:%d,PixelSize:%d,Aec image size:%d", m_nAecImageWidth, m_nAecImageHeight, m_nAecPixelSize, m_nAecImageSize);
  1723. FINFO(strLog.GetString());
  1724. if (nullptr != m_ResultImage.pImage)
  1725. {
  1726. FINFO("Free Last Image Buffer");
  1727. free(m_ResultImage.pImage);
  1728. m_ResultImage.pImage = nullptr;
  1729. }
  1730. m_ResultImage.pImage = malloc(m_nAecImageSize);
  1731. if (m_ResultImage.pImage)
  1732. {
  1733. memset(m_ResultImage.pImage, 0, m_nAecImageSize);
  1734. }
  1735. else
  1736. {
  1737. FERROR("malloc fail!");
  1738. return;
  1739. }
  1740. FINFO("Begin to Get AEC Image");
  1741. ret = API_PEGASUS_GetAecImage(m_nSequenceId, &m_ResultImage);
  1742. if (!TestError(ret, "GetAecImage"))
  1743. {
  1744. FERROR("Acquire AEC Image Failed");
  1745. return;
  1746. }
  1747. if (m_pAecImgBuffer)
  1748. {
  1749. memcpy(m_pAecImgBuffer, m_ResultImage.pImage, m_nAecImageSize);
  1750. }
  1751. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1752. {
  1753. FINFO("Apply ZSKK Calibration File");
  1754. m_pZSKKCalib->m_nGridSuppressed = 6;
  1755. m_pZSKKCalib->ApplyZSKKReference(m_nAecImageHeight, m_nAecImageWidth, m_pAecImgBuffer);
  1756. }
  1757. if (m_nSaveRaw)
  1758. {
  1759. SaveRawFunc(m_pAecImgBuffer, m_nAecImageWidth *2, m_nAecImageHeight);
  1760. }
  1761. DataFeedback(EVT_DATA_PREVIEW_IMAGE, m_pAecImgBuffer);
  1762. }
  1763. /***
  1764. ** 处理Normal图像
  1765. ***/
  1766. void CAXSCtrl::OnProcessCorrectedImg()
  1767. {
  1768. printf("Here Come Corrected Image.....\n");
  1769. FINFO("Here Come Corrected Image");
  1770. CString strLog;
  1771. PEGASUS_ErrorCode ret;
  1772. if (m_pRawImgBuffer)
  1773. {
  1774. memset(m_pRawImgBuffer, 0, m_nRawImgHeight * m_nRawImgWidth);
  1775. }
  1776. m_ResultImage.cropInfo.cropOffsetRow = 0;
  1777. m_ResultImage.cropInfo.cropOffsetCol = 0;
  1778. m_ResultImage.cropInfo.cropWidth = m_nRawImgWidth;
  1779. m_ResultImage.cropInfo.cropHeight = m_nRawImgHeight;
  1780. m_nRawImageSize = m_nRawImgWidth * m_nRawImgHeight * m_nRawPixelSize;
  1781. strLog.Format("Raw Image Width:%d,Height:%d,PixelSize:%d", m_nRawImgWidth, m_nRawImgHeight, m_nRawPixelSize);
  1782. FINFO(strLog.GetString());
  1783. if (nullptr != m_ResultImage.pImage)
  1784. {
  1785. FINFO("Free Last Image Buffer");
  1786. free(m_ResultImage.pImage);
  1787. m_ResultImage.pImage = nullptr;
  1788. }
  1789. FINFO("m_nRawImageSize:{$}", m_nRawImageSize);
  1790. m_ResultImage.pImage = malloc(m_nRawImageSize);
  1791. if (m_ResultImage.pImage)
  1792. {
  1793. memset(m_ResultImage.pImage, 0, m_nRawImageSize);
  1794. }
  1795. else
  1796. {
  1797. FERROR("malloc fail!");
  1798. return;
  1799. }
  1800. FINFO("Begin to Get Corrected Image ");
  1801. ret = API_PEGASUS_GetCorrectedImage(m_nSequenceId, m_nImageIndex, &m_ResultImage);
  1802. if (!TestError(ret, "GetCorrectedImage"))
  1803. {
  1804. strLog.Format("Acquire Corrected Image Failed,Error Code: %d", ret);
  1805. FERROR(strLog.GetString());
  1806. return;
  1807. }
  1808. if (m_pRawImgBuffer)
  1809. {
  1810. memcpy(m_pRawImgBuffer, m_ResultImage.pImage, m_nRawImageSize);
  1811. }
  1812. if (m_nLeftOffset != 0 || m_nTopOffset != 0 || m_nRightOffset != 0 || m_nBottomOffset != 0)
  1813. {
  1814. if (CropImageMargin(m_pImgBuffer, m_nImageWidth, m_nImageHeight, m_pRawImgBuffer, m_nRawImgWidth, m_nRawImgHeight,
  1815. m_nRawImageBits, m_nLeftOffset, m_nTopOffset, m_nRightOffset, m_nBottomOffset))
  1816. {
  1817. FERROR("Crop Image Error!");
  1818. }
  1819. else
  1820. {
  1821. FINFO("After crop image width:{$},image height:{$}", m_nImageWidth, m_nImageHeight);
  1822. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1823. {
  1824. FINFO("Apply ZSKK Calibration File");
  1825. m_pZSKKCalib->m_nGridSuppressed = 6;
  1826. m_pZSKKCalib->ApplyZSKKReference(m_nImageHeight, m_nImageWidth, m_pImgBuffer);
  1827. }
  1828. if (m_nSaveRaw)
  1829. {
  1830. SaveRawFunc(m_pImgBuffer, m_nImageWidth, m_nImageHeight);
  1831. }
  1832. DataFeedback(EVT_DATA_RAW_IMAGE, m_pImgBuffer);
  1833. }
  1834. }
  1835. else
  1836. {
  1837. FINFO("m_nLeftOffset and m_nTopOffset and m_nRightOffset and m_nBottomOffset is 0");
  1838. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  1839. {
  1840. FINFO("Apply ZSKK Calibration File");
  1841. m_pZSKKCalib->m_nGridSuppressed = 6;
  1842. m_pZSKKCalib->ApplyZSKKReference(m_nRawImgHeight, m_nRawImgWidth, m_pRawImgBuffer);
  1843. }
  1844. if (m_nSaveRaw)
  1845. {
  1846. SaveRawFunc(m_pRawImgBuffer, m_nRawImgWidth, m_nRawImgHeight);
  1847. }
  1848. DataFeedback(EVT_DATA_RAW_IMAGE, m_pRawImgBuffer);
  1849. }
  1850. }
  1851. void CAXSCtrl::SaveRawFunc(WORD* pInImg, int nImgWidth, int nImgHeight)
  1852. {
  1853. FILE* fp;
  1854. SYSTEMTIME st;
  1855. GetLocalTime(&st);
  1856. //FINFO("Date: [%04d:%02d:%02d] ", st.wYear, st.wMonth, st.wDay);
  1857. char filename[256];
  1858. //sprintf(filename, "\\Image\\Raw%02d-%02d-%02d-%02d-%02d.raw", st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
  1859. sprintf(filename, "\\rawdata\\Raw.raw");
  1860. string strFileName = m_strWorkPath + filename;
  1861. if ((fp = fopen(strFileName.c_str(), "wb+")) == NULL)
  1862. {
  1863. DWORD dw = GetLastError();
  1864. FERROR("fopen {$} failed, {$}", strFileName.c_str(), dw);
  1865. return;
  1866. }
  1867. fwrite(pInImg, sizeof(WORD), nImgWidth * nImgHeight, fp);
  1868. fclose(fp);
  1869. FINFO("Save image over");
  1870. }
  1871. /***
  1872. ** 裁剪图像
  1873. ** pOutImg: 裁剪后图像; pInImg: 裁剪前图像; nInWidth: 裁剪前图像宽度
  1874. ***/
  1875. //参照RFOC康众动态代码整理的图像裁剪功能
  1876. int CAXSCtrl::CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  1877. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  1878. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin)
  1879. {
  1880. FINFO("CropImageMargin start");
  1881. if ((pDstData == NULL) || (pScrData == NULL) || (nSrcWidth <= 0) || (nSrcHeight <= 0) || (nBits <= 0))
  1882. return -1;
  1883. if ((nLeftMargin >= nSrcWidth) || (nTopMargin >= nSrcHeight))
  1884. return -1;
  1885. int nBitsToBYTE = (int)((nBits + 7) * 0.125);
  1886. if (nBitsToBYTE < 1)
  1887. return -1;
  1888. int nXL, nXR, nYL, nYR;
  1889. nXL = nLeftMargin;//32
  1890. nYL = nTopMargin;
  1891. if (nSrcWidth - nRightMargin < 0)
  1892. return -1;
  1893. nXR = nSrcWidth - nRightMargin - 1; //2783
  1894. if (nXR < nXL)
  1895. return -1;
  1896. if (nSrcHeight - nBottomMargin < 0)
  1897. return -1;
  1898. nYR = nSrcHeight - nBottomMargin - 1;
  1899. if (nYR < nYL)
  1900. return -1;
  1901. nDstWidth = nXR - nXL + 1;
  1902. nDstHeight = nYR - nYL + 1;
  1903. FINFO("TopCrop:{$};Bottom:{$},nDstWidth:{$},nDstHeight:{$},Bits:{$}", nYL, nYR, nDstWidth, nDstHeight, nBitsToBYTE);
  1904. int i = 0;
  1905. #pragma omp parallel private(i)
  1906. {
  1907. #pragma omp for
  1908. for (i = nYL; i <= nYR; i++)
  1909. {
  1910. ::memcpy((WORD*)pDstData + (i - nYL) * nDstWidth, (WORD*)pScrData + (i * nSrcWidth + nXL), nDstWidth * nBitsToBYTE);
  1911. }
  1912. }
  1913. FINFO("CropImageMargin end");
  1914. return 0;
  1915. }
  1916. /// <summary>
  1917. /// 实际探测器初始化,事件触发
  1918. /// 连接探测器并进行初始化操作
  1919. /// </summary>
  1920. void CAXSCtrl::OnProcessInitFPD()
  1921. {
  1922. FINFO("OnProcessInitFPD start...");
  1923. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_START);//初始化成功的回调中会有end
  1924. PEGASUS_ErrorCode nRet = PEGASUS_SUCCESS;
  1925. if (m_bLoadedSDK)
  1926. {
  1927. FINFO("Already load sdk dll");
  1928. }
  1929. else
  1930. {
  1931. //加载SDK DLL
  1932. if (!LoadSdkDll())
  1933. {
  1934. FERROR("OnProcessInitFPD LoadSdkDll fail");
  1935. return;
  1936. }
  1937. }
  1938. //获取配置信息
  1939. GetConfigParam();
  1940. //加载ZSKK校正文件
  1941. LoadZskkMap();
  1942. if (m_bInitializedSDK)
  1943. {
  1944. FINFO("Already init sdk");
  1945. }
  1946. else
  1947. {
  1948. //调用SDK接口进行初始化,等待初始化成功事件通知再向上通知初始化成功
  1949. nRet = InitSDK();
  1950. if (nRet)
  1951. {
  1952. FERROR("OnProcessInitFPD InitSDK fail");
  1953. m_bInitializedSDK = false;
  1954. }
  1955. else
  1956. {
  1957. //AXS2430没有专门的连接探测器接口,能初始化成功就认为是连接成功了
  1958. m_bInitializedSDK = true;
  1959. //调用SDK设置SDK需要的校正文件路径,当前探测器没有设置校正文件路径的接口,故此处没作用
  1960. SetFPDTplPath();
  1961. }
  1962. }
  1963. FINFO("OnProcessInitFPD end...");
  1964. }
  1965. /***
  1966. ** 说明:重新初始化探测器,SDK初始化时会连接探测器(重连功能使用)
  1967. ***/
  1968. void CAXSCtrl::OnReInitFPD()
  1969. {
  1970. FINFO("OnReInitFPD start...");
  1971. //设备掉线后睡1秒,避免太频繁初始化
  1972. Sleep(1000);
  1973. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_START);
  1974. PEGASUS_ErrorCode nRet = InitSDK();
  1975. if (nRet)
  1976. {
  1977. FERROR("OnReInitFPD InitSDK fail!");
  1978. }
  1979. FINFO("OnReInitFPD end...");
  1980. }
  1981. /***
  1982. ** 说明:重新初始化探测器,SDK初始化时会连接探测器(重连功能使用)
  1983. ***/
  1984. void CAXSCtrl::OnRecoverImage()
  1985. {
  1986. FINFO("OnRecoverImage start...");
  1987. PEGASUS_ErrorCode ret = PEGASUS_SUCCESS;
  1988. int nSequenceId = 0;
  1989. FINFO("Call API_PEGASUS_RecoverLastSequenceID");
  1990. ret = API_PEGASUS_RecoverLastSequenceID(&nSequenceId);
  1991. if (!TestError(ret,"RecoverLastSequenceID"))
  1992. {
  1993. FERROR("recover last sequence id fail!");
  1994. return;
  1995. }
  1996. FINFO("get last sequence id:{$}", nSequenceId);
  1997. if (nSequenceId < m_nSequenceId)
  1998. {
  1999. FERROR("don't have to recover image!");
  2000. return;
  2001. }
  2002. // In screening mode, this value is one. In tomosynthesis mode this value is 1 or more
  2003. if (m_nImageIndex > 0)
  2004. {
  2005. FINFO("{$} image have to recover!", m_nImageIndex);
  2006. for (int i = 0; i < m_nImageIndex; i++)
  2007. {
  2008. FINFO("Call API_PEGASUS_RecoverImage,sequence id:{$}", m_nSequenceId + i);
  2009. ret = API_PEGASUS_RecoverImage(m_nSequenceId + i, m_targetFilter, m_context, onMultiEventCallback);
  2010. if (!TestError(ret, "Recover image"))
  2011. {
  2012. FERROR("recover image fail! sequence id:{$}", m_nSequenceId + i);
  2013. }
  2014. }
  2015. }
  2016. else
  2017. {
  2018. FINFO("OnRecoverImage m_nImageIndex:{$}", m_nImageIndex);
  2019. }
  2020. FINFO("OnRecoverImage end...");
  2021. }
  2022. void CAXSCtrl::OnProcessGenNotify()
  2023. {
  2024. ResDataObject ResNotify, NotifyData;
  2025. PACKET_CMD Cmd;
  2026. ResDataObject ResContext;
  2027. string m_strCurTransaction;
  2028. while (m_pAcqUnitCient->IsDataArrived())
  2029. {
  2030. FINFO("Detector Get Notify");
  2031. Cmd = m_pAcqUnitCient->ReadNotify(ResNotify);
  2032. FINFO("CMD:{$}", (int)Cmd);
  2033. PacketAnalizer::GetPacketTransaction(&ResNotify, m_strCurTransaction);
  2034. string strKey = PacketAnalizer::GetPacketKey(&ResNotify);
  2035. string path = PacketAnalizer::GetPacketPublisher(&ResNotify);
  2036. FINFO("Detector recv notify from [{$}] Key {$} Cmd : {$}", path, strKey, (int)Cmd);
  2037. if (Cmd == PACKET_CMD_NONE)
  2038. {
  2039. FERROR("Notify:Cmd type is NONE");
  2040. return;
  2041. }
  2042. else if (Cmd == PACKET_CMD_UPDATE)
  2043. {
  2044. FINFO("Get PACKET_CMD_UPDATE");
  2045. ResContext.clear();
  2046. PacketAnalizer::GetPacketContext(&ResNotify, ResContext);
  2047. FINFO("GENERATORSYNCSTATE {$}", (int)ResContext);
  2048. }
  2049. else
  2050. {
  2051. FINFO("Other CMD!");
  2052. return;
  2053. }
  2054. /*if ((int)ResContext == 3)
  2055. {
  2056. FINFO("Call TerminateAcquisition");
  2057. API_PEGASUS_TerminateAcquisition();
  2058. }*/
  2059. }
  2060. }
  2061. DWORD __stdcall CAXSCtrl::onCalibrationThread(PVOID pvoid)
  2062. {
  2063. CAXSCtrl* pOpr = (CAXSCtrl*)pvoid;
  2064. if (pOpr->OnProcessCalibration())
  2065. {
  2066. FINFO("Calibration process over");
  2067. }
  2068. else
  2069. {
  2070. pOpr->StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_ERROR);
  2071. FERROR("Quit calibration over(with error)");
  2072. }
  2073. CloseHandle(pOpr->m_hCalibrationThread);
  2074. pOpr->m_hCalibrationThread = nullptr;
  2075. FINFO("Quit calibration process");
  2076. return 0;
  2077. }
  2078. /***
  2079. ** 校正过程
  2080. ** 说明:校正辅助线程,结合校正process的阶段和SDK回调完成校正流程
  2081. ** (ActiveCalibration)停止采集,进入idle状态(set prepare event)[CalibINIT process]
  2082. ** 修改配置
  2083. ** == dark ==
  2084. ** 1.(StartCalibration)调用api,进入hst状态(set offset event)
  2085. ** 2.调用api,开始采集dark图像(image callback)
  2086. ** 3.保存8张dark图像,停止采集,进入idle状态(set endcalib/aed event)[CalibOFFSET process]
  2087. ** (上aed图过程目前只在aed同步模式下进行)
  2088. ** 4.接收10张aed图像,上传数据,停止采集,进入idle状态(set endcalib event)[CalibAED process]
  2089. ** == flood ==
  2090. ** 1.(PrepareCalibration)调用api,进入hst或aed状态
  2091. ** 2.(StartCalibration)调用api,采集flood图像(image callback)
  2092. ** 3.修改配置,进入hst或aed模式,采集亮场图像
  2093. ** 4.重复1、2、3,采集8张flood图像,停止采集,进入idle状态(set endcalib event)[CalibGAIN process]
  2094. ** (endcalib event)生成校正文件,恢复配置
  2095. ***/
  2096. bool CAXSCtrl::OnProcessCalibration()
  2097. {
  2098. FINFO("calibration process start");
  2099. while (!m_bExitCalibrationThread)
  2100. {
  2101. DWORD dwSignal = WaitForMultipleObjects(CALIBRATION_EVENT_COUNT, m_hPZMCalibration, FALSE, INFINITE);
  2102. if (dwSignal == WAIT_OBJECT_0) //退出校正线程 m_hStopCalibEvent
  2103. {
  2104. FINFO("Exit Calibration Thread!");
  2105. m_bExitCalibrationThread = true;
  2106. }
  2107. else if (dwSignal == WAIT_OBJECT_0 + 1) //暗场校正开始 m_hPZMStartOffset
  2108. {
  2109. FINFO("Start Offset Calibration");
  2110. }
  2111. else if (dwSignal == WAIT_OBJECT_0 + 2) //暗场校正结束 m_hPZMInOffset
  2112. {
  2113. FINFO("Offset calibraion end");
  2114. }
  2115. else if (dwSignal == WAIT_OBJECT_0 + 3) //亮场校正开始 m_hPZMStartGain
  2116. {
  2117. FINFO("Start Gain Calibration");
  2118. }
  2119. else if (dwSignal == WAIT_OBJECT_0 + 4) // 停止采集亮场图 m_hPZMInGain
  2120. {
  2121. //亮场图采集完毕就认为是校正流程完成->正常结束校正
  2122. //亮场校正完成后停止校正状态,让探测器进入idle状态,同时告诉app校正结束
  2123. printf("XRAY 校正 结束 \r\n");
  2124. FINFO("xray calibraion end");
  2125. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  2126. m_bExitCalibrationThread = true;
  2127. NotifyCalibrationTime();
  2128. //如果上层不主动调用SaveCalibrationFile时在自己调用
  2129. //StatusFeedback(EVT_STATUS_SAVECALIB, PANEL_EVENT_START);
  2130. //StatusFeedback(EVT_STATUS_SAVECALIB, PANEL_EVENT_END);
  2131. }
  2132. else if (dwSignal == WAIT_OBJECT_0 + 5)// 异常结束校正 m_hEndCalibEvent
  2133. {
  2134. m_bExitCalibrationThread = true;
  2135. FERROR("Calibration End Abnormal!!!");
  2136. }
  2137. }
  2138. FINFO("calibration process stop");
  2139. return true;
  2140. }
  2141. void CAXSCtrl::SetPZDPCState(PZDPC_State ePZDPCstate)
  2142. {
  2143. string strlog = "Unknown";
  2144. switch (ePZDPCstate)
  2145. {
  2146. case PZDPC_STATE_INIT:
  2147. strlog = "INIT";
  2148. break;
  2149. case PZDPC_STATE_STANDBY:
  2150. strlog = "STANDBY";
  2151. break;
  2152. case PZDPC_STATE_WORK:
  2153. strlog = "WORK";
  2154. break;
  2155. case PZDPC_STATE_CALIBRATION:
  2156. strlog = "CALIBRATION";
  2157. break;
  2158. case PZDPC_STATE_EXIT:
  2159. strlog = "EXIT";
  2160. break;
  2161. case PZDPC_STATE_MAX:
  2162. break;
  2163. default:
  2164. break;
  2165. }
  2166. FINFO("Set PZ DPC state {$}", strlog.c_str());
  2167. m_ePZDPCstate = ePZDPCstate;
  2168. }
  2169. PZDPC_State CAXSCtrl::GetPZDPCState()
  2170. {
  2171. string strlog = "Unknown";
  2172. switch (m_ePZDPCstate)
  2173. {
  2174. case PZDPC_STATE_INIT:
  2175. strlog = "INIT";
  2176. break;
  2177. case PZDPC_STATE_STANDBY:
  2178. strlog = "STANDBY";
  2179. break;
  2180. case PZDPC_STATE_WORK:
  2181. strlog = "WORK";
  2182. break;
  2183. case PZDPC_STATE_CALIBRATION:
  2184. strlog = "CALIBRATION";
  2185. break;
  2186. case PZDPC_STATE_EXIT:
  2187. strlog = "EXIT";
  2188. break;
  2189. case PZDPC_STATE_MAX:
  2190. break;
  2191. default:
  2192. break;
  2193. }
  2194. FINFO("Get state, {$}", strlog.c_str());
  2195. return m_ePZDPCstate;
  2196. }
  2197. /***
  2198. * 执行失败,返回false;执行成功,返回true
  2199. ***/
  2200. bool CAXSCtrl::TestError(PEGASUS_ErrorCode nRet, const char* szFuncName)
  2201. {
  2202. PEGASUS_ErrorCode ret;
  2203. if (nRet < PEGASUS_SUCCESS && nRet > PEGASUS_MAJOR_IMAGE_SATURATED_ERROR)
  2204. {
  2205. FERROR("error code[{$}] is out of range.",(int)nRet);
  2206. return false;
  2207. }
  2208. if (nRet == PEGASUS_SUCCESS)
  2209. {
  2210. FINFO("{$} returned OK", szFuncName);
  2211. return true;
  2212. }
  2213. else
  2214. {
  2215. CString strLog;
  2216. char errShortDescription[PEGASUS_MAX_STRING_LENGTH];
  2217. char errLongDescription[PEGASUS_MAX_STRING_LENGTH];
  2218. API_PEGASUS_GetErrorDescription(nRet, errShortDescription, errLongDescription);
  2219. strLog.Format("TestError error code: %d, Short Description: %s, Long Description: %s", nRet, errShortDescription, errLongDescription);
  2220. FERROR(strLog.GetString());
  2221. //MAJOR错误
  2222. if (nRet >= PEGASUS_MAJOR_PARAMETER_OUT_OF_RANGE_ERROR && nRet <= PEGASUS_MAJOR_EO_RAMPUP_FAIL)
  2223. {
  2224. FERROR("The system should try to re-initialize PEGASUS by calling PEGASUS_Shutdown and then PEGASUS_Initialize or PEGASUS_QuickInitialize");
  2225. m_bReadyForExp = false;
  2226. StatusFeedback(EVT_STATUS_PANEL, PANEL_CLOSE);
  2227. if (nRet == PEGASUS_MAJOR_COMMUNICATION_ERROR)
  2228. {
  2229. //m_bExitGetInfoThread = true;//退出获取探测器温度和状态线程,避免调用接口时重复报这个错,重复shutdown造成问题
  2230. m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus = false;
  2231. ErrorFeedback(EVT_ERR_COMMUNICATE, "true", m_nCurrentPanelID);
  2232. StatusFeedback(EVT_STATUS_DETECTORSHARE, PANEL_DISCONNECT_SUCCESS);
  2233. }
  2234. if (!m_bShutDownFlag)
  2235. {
  2236. FINFO("TestError Call API_PEGASUS_Shutdown");
  2237. API_PEGASUS_Shutdown();//以上错误时
  2238. }
  2239. }
  2240. else if (nRet >= PEGASUS_FATAL_HARDWARE_ERROR && nRet <= PEGASUS_FATAL_IMAGE_TRANSFER_TEST_FAIL_ERROR)
  2241. {
  2242. FERROR("Fatal error,should restart the detector system!");
  2243. m_bReadyForExp = false;
  2244. StatusFeedback(EVT_STATUS_PANEL, PANEL_CLOSE);
  2245. FINFO("Call API_PEGASUS_Exit");
  2246. ret = API_PEGASUS_Exit();
  2247. if (ret)
  2248. {
  2249. FERROR("execute exit fail!");
  2250. }
  2251. }
  2252. return false;
  2253. }
  2254. }
  2255. bool CAXSCtrl::WaitRespond(int nTimeOut, const char* szPosition)
  2256. {
  2257. FINFO("--- {$} WaitRespond, {$}ms ---", szPosition, nTimeOut);
  2258. ResetEvent(m_hRespond);
  2259. DWORD dwRet = WaitForSingleObject(m_hRespond, nTimeOut);
  2260. if (dwRet == WAIT_TIMEOUT)
  2261. {
  2262. FERROR("Timeout in wait respond");
  2263. return false;
  2264. }
  2265. return true;
  2266. }
  2267. void CAXSCtrl::StopWaiting(const char* szPosition)
  2268. {
  2269. FINFO("--- Stop waiting respond, {$} ---", szPosition);
  2270. SetEvent(m_hRespond);
  2271. }
  2272. /// <summary>
  2273. /// 配置反馈通知 @SDK
  2274. /// </summary>
  2275. /// <param name="nEventID"></param>
  2276. /// <param name="nDetectorID"></param>
  2277. /// <param name="pszMsg"></param>
  2278. /// <param name="nParam1"></param>
  2279. /// <param name="fParam2"></param>
  2280. /// <param name="nPtrParamLen"></param>
  2281. /// <param name="pParam"></param>
  2282. void CAXSCtrl::ConfFeedback(int nEventID, int nDetectorID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2283. {
  2284. if (-1 == nDetectorID)
  2285. {
  2286. nDetectorID = m_nCurrentPanelID;
  2287. }
  2288. ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2289. nEventID, EVT_LEVEL_CONFIGURATION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2290. }
  2291. /// <summary>
  2292. /// Info消息反馈通知 @SDK
  2293. /// </summary>
  2294. /// <param name="nEventID"></param>
  2295. /// <param name="nDetectorID"></param>
  2296. /// <param name="nParam1"></param>
  2297. /// <param name="fParam2"></param>
  2298. /// <param name="pszMsg"></param>
  2299. /// <param name="nPtrParamLen"></param>
  2300. /// <param name="pParam"></param>
  2301. void CAXSCtrl::InfoFeedback(int nEventID, int nDetectorID, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, void* pParam)
  2302. {
  2303. if (-1 == nDetectorID)
  2304. {
  2305. nDetectorID = m_nCurrentPanelID;
  2306. }
  2307. ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2308. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2309. }
  2310. /// <summary>
  2311. /// 设备状态改变通知 @SDK
  2312. /// </summary>
  2313. /// <param name="nEventID">事件ID 属于部件或者子系统</param>
  2314. /// <param name="nParam1">事件状态值,不同事件有不同的取值说明</param>
  2315. /// <param name="pszMsg">事件附带文本消息</param>
  2316. /// <param name="nDetectorID">探测器ID,单板系统 默认值 -1</param>
  2317. /// <param name="fParam2">浮点参数2</param>
  2318. /// <param name="nPtrParamLen">附加参数内存长度</param>
  2319. /// <param name="pParam">附加参数内存地址</param>
  2320. void CAXSCtrl::StatusFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  2321. {
  2322. if (-1 == nDetectorID)
  2323. {
  2324. nDetectorID = m_nCurrentPanelID;
  2325. }
  2326. ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2327. nEventID, EVT_LEVEL_STATUS, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2328. }
  2329. /// <summary>
  2330. /// 数据反馈通知 @SDK
  2331. /// </summary>
  2332. /// <param name="nEventID">采集数据事件ID,EVT_DATA_RAW_IMAGE</param>
  2333. /// <param name="pParam">图像内存地址</param>
  2334. /// <param name="nParam1">参数1,默认值0</param>
  2335. /// <param name="fParam2">参数2,浮点,默认值0.0 </param>
  2336. /// <param name="pszMsg">附带文本消息</param>
  2337. /// <param name="nPtrParamLen">图像内存长度,默认值0,固定大小</param>
  2338. /// <param name="nDetectorID">探测器ID,单板模式 默认值-1</param>
  2339. void CAXSCtrl::DataFeedback(int nEventID, void* pParam, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, int nDetectorID)
  2340. {
  2341. if (-1 == nDetectorID)
  2342. {
  2343. nDetectorID = m_nCurrentPanelID;
  2344. }
  2345. ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2346. nEventID, EVT_LEVEL_DATA, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2347. }
  2348. /// <summary>
  2349. /// 告警事件反馈通知 @SDK
  2350. /// </summary>
  2351. /// <param name="nEventID"></param>
  2352. /// <param name="pszMsg"></param>
  2353. /// <param name="nParam1"></param>
  2354. /// <param name="fParam2"></param>
  2355. /// <param name="nPtrParamLen"></param>
  2356. /// <param name="pParam"></param>
  2357. /// <param name="nDetectorID"></param>
  2358. void CAXSCtrl::WarnFeedback(int nEventID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam, int nDetectorID)
  2359. {
  2360. if (-1 == nDetectorID)
  2361. {
  2362. nDetectorID = m_nCurrentPanelID;
  2363. }
  2364. ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2365. nEventID, EVT_LEVEL_WARNING, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2366. }
  2367. /// <summary>
  2368. /// 内部错误通知 @SDK
  2369. /// </summary>
  2370. /// <param name="nEventID">事件ID</param>
  2371. /// <param name="pszMsg">事件消息文本内容</param>
  2372. /// <param name="nDetectorID">探测器ID,单板模式默认值-1</param>
  2373. /// <param name="nParam1">参数1,整型,默认值0</param>
  2374. /// <param name="fParam2">参数2,浮点数,默认值0.0</param>
  2375. /// <param name="nPtrParamLen">附加参数内存长度</param>
  2376. /// <param name="pParam">附加参数内存地址</param>
  2377. void CAXSCtrl::ErrorFeedback(int nEventID, const char* pszMsg, int nDetectorID, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2378. {
  2379. if (-1 == nDetectorID)
  2380. {
  2381. nDetectorID = m_nCurrentPanelID;
  2382. }
  2383. ((CFPDDeviceAXS*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2384. nEventID, EVT_LEVEL_ERROR, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2385. }
  2386. /***
  2387. * 设置校正轮数
  2388. ***/
  2389. bool CAXSCtrl::SetReferenceNum(int nReferenceNum)
  2390. {
  2391. m_nCalibrationRounds = nReferenceNum;
  2392. FINFO("Set reference number: {$}", m_nCalibrationRounds);
  2393. return true;
  2394. }
  2395. /***
  2396. ** 说明:根据配置文件配置的图像大小动态申请内存
  2397. ** 参数:nLogicMode,从配置文件读取当前mode 相关参数
  2398. ***/
  2399. bool CAXSCtrl::SelectExamMode(int nLogicMode, CFPDDeviceAXS* pDrvDPC)
  2400. {
  2401. FINFO("SelectExamMode start");
  2402. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  2403. {
  2404. FINFO("panel id {$} != {$} return...",(*m_pDPC2PanelID)[pDrvDPC], m_nCurrentPanelID);
  2405. return false;
  2406. }
  2407. if (!m_pStPanelStatus[m_nCurrentPanelID]->bConnectStatus)
  2408. {
  2409. FINFO("Current detector is not connect, return");
  2410. return false;
  2411. }
  2412. FINFO("SelectExamMode:{$}", nLogicMode);
  2413. if (nLogicMode < 0 || nLogicMode > 9) //sdk 最多9个mode
  2414. {
  2415. FERROR("Invalid acq mode!");
  2416. return false;
  2417. }
  2418. //if (m_nCurrentAcqMode == nLogicMode) //同样appmode下没必要再次走下面的流程
  2419. //{
  2420. // FINFO("Same acq mode, return true");
  2421. // return true;
  2422. //}
  2423. m_ModeConfig = m_pStPanelStatus[m_nCurrentPanelID]->objPanelConfig;
  2424. int nModeCount = (int)m_ModeConfig["ModeTable"].GetKeyCount("DetectorMode");
  2425. bool bInitBuffer = false;
  2426. for (int i = 0; i < nModeCount; i++)
  2427. {
  2428. if (nLogicMode == (int)m_ModeConfig["ModeTable"][i]["LogicMode"])
  2429. {
  2430. try
  2431. {
  2432. m_bHavePreview = (int)m_ModeConfig["ModeTable"][i]["HavePreview"];
  2433. m_nAecImageWidth = (int)m_ModeConfig["ModeTable"][i]["PreviewImageWidth"];
  2434. m_nAecImageHeight = (int)m_ModeConfig["ModeTable"][i]["PreviewImageHeight"];
  2435. m_nRawImgWidth = (int)m_ModeConfig["ModeTable"][i]["RawImgWidth"];
  2436. m_nRawImgHeight = (int)m_ModeConfig["ModeTable"][i]["RawImgHeight"];
  2437. m_nImageWidth = (int)m_ModeConfig["ModeTable"][i]["ImageWidth"];
  2438. m_nImageHeight = (int)m_ModeConfig["ModeTable"][i]["ImageHeight"];
  2439. m_nLeftOffset = (int)m_ModeConfig["ModeTable"][i]["CropImageLeft"];
  2440. m_nTopOffset = (int)m_ModeConfig["ModeTable"][i]["CropImageTop"];
  2441. m_nRightOffset = (int)m_ModeConfig["ModeTable"][i]["CropImageRight"];
  2442. m_nBottomOffset = (int)m_ModeConfig["ModeTable"][i]["CropImageBottom"];
  2443. m_nRawImageBits = (int)m_ModeConfig["ModeTable"][i]["PhySizeInfoBit"];//原始图和有效图图像位数
  2444. m_nImageBits = (int)m_ModeConfig["ModeTable"][i]["PhySizeInfoBit"];
  2445. m_nPixelPitch = (int)m_ModeConfig["ModeTable"][i]["PixelPitch"];//像素间距
  2446. m_nSaveRaw = (int)m_ModeConfig["ModeTable"][i]["IsSaveRaw"];
  2447. if (m_bHavePreview)
  2448. {
  2449. if (m_pAecImgBuffer)
  2450. {
  2451. delete m_pAecImgBuffer;
  2452. m_pAecImgBuffer = NULL;
  2453. }
  2454. //因为AEC的像素大小是4,故用WORD new时需要乘2
  2455. m_pAecImgBuffer = new WORD[m_nAecImageWidth * m_nAecImageHeight *2];
  2456. }
  2457. if (m_pRawImgBuffer)
  2458. {
  2459. delete m_pRawImgBuffer;
  2460. m_pRawImgBuffer = NULL;
  2461. }
  2462. //RAW图像素大小是2,直接用WORD new
  2463. m_pRawImgBuffer = new WORD[m_nRawImgWidth * m_nRawImgHeight];
  2464. if (m_pImgBuffer)
  2465. {
  2466. delete m_pImgBuffer;
  2467. m_pImgBuffer = NULL;
  2468. }
  2469. //有效图和RAW图一样,图像素大小是2,直接用WORD new
  2470. m_pImgBuffer = new WORD[m_nImageWidth * m_nImageHeight];
  2471. FINFO("Image Raw({$}*{$}), Effective({$}*{$}), Offset({$} {$} {$} {$}), Bits({$}), PixelPitch({$}), SaveRaw({$})",
  2472. m_nRawImgWidth, m_nRawImgHeight, m_nImageWidth, m_nImageHeight, m_nLeftOffset, m_nTopOffset, m_nRightOffset, m_nBottomOffset,
  2473. m_nRawImageBits, m_nPixelPitch, m_nSaveRaw);
  2474. bInitBuffer = true;
  2475. if (m_bHavePreview)
  2476. {
  2477. ConfFeedback(EVT_CONF_PREVIEW_WIDTH, m_nCurrentPanelID, "", m_nAecImageWidth);
  2478. ConfFeedback(EVT_CONF_PREVIEW_HIGHT, m_nCurrentPanelID, "", m_nAecImageHeight);
  2479. }
  2480. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nImageWidth);
  2481. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nImageHeight);
  2482. ConfFeedback(EVT_CONF_RAW_BITS, m_nCurrentPanelID, "", m_nImageBits);
  2483. ConfFeedback(EVT_CONF_PIXELSPACE, m_nCurrentPanelID, "", 0, (float)m_nPixelPitch);
  2484. break;
  2485. }
  2486. catch (ResDataObjectExption& exp)
  2487. {
  2488. FERROR("Get config failed: {$}", exp.what());
  2489. }
  2490. }
  2491. }
  2492. if (!bInitBuffer)
  2493. {
  2494. FERROR("Image buffer is NULL");
  2495. return false;
  2496. }
  2497. FINFO("SelectExamMode end");
  2498. return true;
  2499. }
  2500. //切换采集模式(普通模式/AEC模式)
  2501. bool CAXSCtrl::SetAcqMode(int nLogicMode, CFPDDeviceAXS* pDrvDPC)
  2502. {
  2503. FINFO("CAXSCtrl SetAcqMode start, mode:{$}",nLogicMode);
  2504. if (nLogicMode == m_nCurrentAcqMode)
  2505. {
  2506. CString strLog;
  2507. strLog.Format("Same Exposure Mode:%d", nLogicMode);
  2508. FINFO(strLog.GetString());
  2509. return true;
  2510. }
  2511. m_nCurrentAcqMode = (eAcqMode)nLogicMode;
  2512. m_bChangeAcqProperties = false;//切换采集模式之前重置为false
  2513. if (m_bReadyForExp)
  2514. {
  2515. ChangeAcqProperties(m_nCurrentAcqMode); //采集模式选择 AEC或者Manual
  2516. }
  2517. FINFO("CAXSCtrl SetAcqMode end");
  2518. return true;
  2519. }
  2520. bool CAXSCtrl::ChangeAcqProperties(int nAcqMode)
  2521. {
  2522. FINFO("Change Acq Properties, acq mode:{$}", nAcqMode);
  2523. bool l_bSetAec = false;
  2524. if (AEC == nAcqMode)
  2525. {
  2526. FINFO("Enter into AEC Exposure Mode");
  2527. l_bSetAec = true;
  2528. }
  2529. else if (RAD == nAcqMode)
  2530. {
  2531. FINFO("Enter into Normal Exposure Mode");
  2532. l_bSetAec = false;
  2533. }
  2534. bool isAecMode;
  2535. int currentSequenceId;
  2536. PEGASUS_ErrorCode l_error;
  2537. FINFO("Get Continuous Acquisition Properties:");
  2538. l_error = API_PEGASUS_GetContinuousAcquisitionProperties(&m_targetFilter, &isAecMode, &m_context, &currentSequenceId);
  2539. if (!TestError(l_error,"GetContinuousAcquisitionProperties"))
  2540. {
  2541. FERROR("GetContinuousAcquisitionProperties Failed");
  2542. return false;
  2543. }
  2544. CString strLog;
  2545. strLog.Format("Target Filter:%d", m_targetFilter);
  2546. FINFO(strLog.GetString());
  2547. strLog.Format("Is AEC Mode:%d", isAecMode);
  2548. FINFO(strLog.GetString());
  2549. strLog.Format("Context:%d", m_context);
  2550. FINFO(strLog.GetString());
  2551. strLog.Format("Current Sequence Id:%d", currentSequenceId);
  2552. FINFO(strLog.GetString());
  2553. FINFO("Change Continuous Acquisition Properties");
  2554. l_error = API_PEGASUS_ChangeContinuousAcquisitionProperties(m_targetFilter, l_bSetAec, m_context);
  2555. if (!TestError(l_error,"ChangeContinuousAcquisitionProperties"))
  2556. {
  2557. FERROR("Change Acquisition Properties Failed");
  2558. m_bChangeAcqProperties = false;
  2559. return false;
  2560. }
  2561. else
  2562. {
  2563. m_bChangeAcqProperties = true;
  2564. }
  2565. FINFO("Change Acquisition Properties Success");
  2566. return true;
  2567. }
  2568. /***
  2569. * 接受曝光图像
  2570. ***/
  2571. bool CAXSCtrl::AcceptCalibration()
  2572. {
  2573. FINFO("Accept calibration exposure result");
  2574. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_OEM)//厂商校正
  2575. {
  2576. FINFO("Call AddImageToCalibration");
  2577. PEGASUS_ErrorCode l_err = API_PEGASUS_AddImageToCalibration();
  2578. if (!TestError(l_err,"AddImageToCalibration"))
  2579. {
  2580. FERROR("Add image to calibration fail!");
  2581. return false;
  2582. }
  2583. }
  2584. else //ZSKK校正
  2585. {
  2586. if (m_nCalibCurrentExposureIndex == 1)
  2587. {
  2588. m_pZSKKCalib->AddImageToPixMap(m_pRawImgBuffer);
  2589. m_pZSKKCalib->AverageZSKKGainMap(m_pRawImgBuffer, m_nCalibCurrentCalibrationRound - 1, true);
  2590. }
  2591. else
  2592. {
  2593. m_pZSKKCalib->AverageZSKKGainMap(m_pRawImgBuffer, m_nCalibCurrentCalibrationRound - 1, false); //曝光第几轮
  2594. }
  2595. }
  2596. FINFO("Accept calibration exposure over");
  2597. return true;
  2598. }
  2599. /***
  2600. * 拒绝曝光图像
  2601. ***/
  2602. bool CAXSCtrl::RejectCalibration()
  2603. {
  2604. FINFO("RejectCalibration start");
  2605. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_OEM)
  2606. {
  2607. FINFO("Call PEGASUS_RejectCalibrationImage");
  2608. // This call takes a couple of seconds
  2609. PEGASUS_ErrorCode l_err = API_PEGASUS_RejectCalibrationImage();
  2610. if (!TestError(l_err, "RejectCalibrationImage"))
  2611. {
  2612. FERROR("Reject Image To Calibration Failed");
  2613. return false;
  2614. }
  2615. }
  2616. FINFO("RejectCalibration end");
  2617. return true;
  2618. }
  2619. //只有ZSKK校正时调用
  2620. bool CAXSCtrl::SaveCalibrationFile()
  2621. {
  2622. FINFO("Save Calibration File");
  2623. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  2624. {
  2625. FINFO("Save ZSKK Calibration File");
  2626. m_pZSKKCalib->StoreZSKKGainMap(m_strPanelType);
  2627. m_pZSKKCalib->StoreZSKKPixMap(m_strPanelType);
  2628. }
  2629. //更新配置文件中校正日期和时间
  2630. SYSTEMTIME stCurrentTime = { 0 };
  2631. GetLocalTime(&stCurrentTime);
  2632. CString strLog;
  2633. strLog.Format("Current time: %04d/%02d/%02d %02d:%02d:%02d:%03d", stCurrentTime.wYear, stCurrentTime.wMonth, stCurrentTime.wDay,
  2634. stCurrentTime.wHour, stCurrentTime.wMinute, stCurrentTime.wSecond, stCurrentTime.wMilliseconds);
  2635. FINFO(strLog.GetString());
  2636. FINFO("Save Calibration File over");
  2637. return true;
  2638. }
  2639. //只有ZSKK校正会调用这个函数
  2640. bool CAXSCtrl::GetCalibrationStep(int nCalibCurrentCalibrationRound, int nCalibrationRounds, int nCalibCurrentExposureIndex, int nExposureNumCurrentRound)
  2641. {
  2642. m_nCalibCurrentCalibrationRound = nCalibCurrentCalibrationRound;
  2643. m_nCalibrationRounds = nCalibrationRounds;
  2644. m_nCalibCurrentExposureIndex = nCalibCurrentExposureIndex;
  2645. m_nExposureNumCurrentRound = nExposureNumCurrentRound;
  2646. FINFO("Calibration Step===Round: {$}/{$}, ExposureNum: {$}/{$}", nCalibCurrentCalibrationRound, nCalibrationRounds,
  2647. nCalibCurrentExposureIndex, nExposureNumCurrentRound);
  2648. return true;
  2649. }
  2650. /***
  2651. ** 说明:结束校正
  2652. ** DPC处理完校正报告后调用,此处上传map、报告等文件
  2653. ***/
  2654. bool CAXSCtrl::CompleteCalibration(CFPDDeviceAXS* pDrvDPC)
  2655. {
  2656. FINFO("CompleteCalibration calib type {$}",(int)m_eType);
  2657. if (m_eType == CCOS_CALIBRATION_TYPE_DARK)
  2658. {
  2659. printf("DARK 校正 结束\n");
  2660. FINFO("DARK 校正 结束");
  2661. }
  2662. else if (m_eType == CCOS_CALIBRATION_TYPE_XRAY)
  2663. {
  2664. printf("GAIN 校正 结束\n");
  2665. FINFO("GAIN 校正 结束");
  2666. m_eCalState = PZ_CALIBRATION_ORIGINAL;
  2667. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_ZSKK)
  2668. {
  2669. SetEvent(m_hPZMInGain);
  2670. m_bCalibrationOver = true;
  2671. }
  2672. }
  2673. return true;
  2674. }
  2675. /***
  2676. ** 说明:获取校正时间
  2677. ***/
  2678. bool CAXSCtrl::NotifyCalibrationTime(int nDetectorID)
  2679. {
  2680. if (nDetectorID == -1)
  2681. {
  2682. nDetectorID = m_nCurrentPanelID;
  2683. }
  2684. else
  2685. {
  2686. InfoFeedback(EVT_INFO_CALIBRATIOIN_TIME, nDetectorID, 0, 0, "0");
  2687. InfoFeedback(EVT_INFO_CALIBRATIOIN_TIMEL, nDetectorID, 0, 0, "0");
  2688. }
  2689. return true;
  2690. }
  2691. /***
  2692. ** 说明:终止校正
  2693. ***/
  2694. bool CAXSCtrl::AbortCalibration()
  2695. {
  2696. FINFO("AbortCalibration start");
  2697. m_eType = CCOS_CALIBRATION_TYPE_NONE; //恢复初值
  2698. if (m_nCalibrationMode == CCOS_CALIBRATION_MODE_OEM) //厂商校正
  2699. {
  2700. //厂商校正在收到回调事件PEGASUS_CALIBRATION_ABORT_EVENT后再退出校正线程
  2701. FINFO("Call PEGASUS_AbortCalibration");
  2702. PEGASUS_ErrorCode ret = API_PEGASUS_AbortCalibration();
  2703. if (!TestError(ret, "AbortCalibration"))
  2704. {
  2705. FERROR("Abort Calibration fail!");
  2706. return false;
  2707. }
  2708. }
  2709. else
  2710. {
  2711. SetEvent(m_hEndCalibEvent);//终止校正退出校正线程
  2712. if (!m_bCalibrationOver)
  2713. {
  2714. FINFO("AbortCalibration,reload previous calibration map");
  2715. m_pZSKKCalib->LoadZSKKGainMap(true, m_strPanelType); //重新加载增益校正文件
  2716. m_pZSKKCalib->AbortZSKKPixMap(m_strPanelType); //放弃坏点校正并重新加载原来的坏点校正文件
  2717. }
  2718. }
  2719. FINFO("AbortCalibration over");
  2720. return true;
  2721. }
  2722. /***
  2723. * 保存RAW图像
  2724. ***/
  2725. bool CAXSCtrl::SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight)
  2726. {
  2727. FINFO("Begin to Save {$} Image, width: {$}, height: {$}", pImgName, nWidth, nHeight);
  2728. if (pRawImg == NULL || pImgName == NULL)
  2729. {
  2730. return false;
  2731. }
  2732. string strImagePath = "";
  2733. strImagePath = m_strWorkPath + "\\rawdata\\" + pImgName;
  2734. FILE* fp;
  2735. if ((fp = fopen(strImagePath.c_str(), "wb+")) == NULL)
  2736. {
  2737. DWORD dw = GetLastError();
  2738. FERROR("fopen {$} failed, {$}", strImagePath.c_str(), dw);
  2739. return false;
  2740. }
  2741. fwrite(pRawImg, sizeof(WORD), nWidth * nHeight, fp);
  2742. fclose(fp);
  2743. FINFO("End to Save Raw Image");
  2744. return true;
  2745. }
  2746. CCOS_CALIBRATION_TYPE CAXSCtrl::GetCAXSCtrlCalibType()
  2747. {
  2748. FINFO("Get CAXSCtrl Calib Type {$}",(int)m_eType);
  2749. return m_eType;
  2750. }
  2751. //慎重调用,可能会导致板出问题,硬reset需要很长时间
  2752. bool CAXSCtrl::ResetDetector(CFPDDeviceAXS* pDrvDPC)
  2753. {
  2754. bool nRet = true;
  2755. /*nRet = API_COM_ResetFP();
  2756. if (!TestError(nRet, "ResetFP"))
  2757. {
  2758. printf("Reset Detector fail!\n");
  2759. FERROR("Reset Detector fail!");
  2760. return false;
  2761. }*/
  2762. return nRet;
  2763. }
  2764. int CAXSCtrl::GetCalImagesLeftCount()
  2765. {
  2766. FINFO("GetCalImagesLeftCount");
  2767. int nNbrCalImagesLeft = 0;
  2768. PEGASUS_ErrorCode l_err = API_PEGASUS_GetNbrCalImagesLeft(&nNbrCalImagesLeft);
  2769. if (!TestError(l_err,"GetNbrCalImagesLeft"))
  2770. {
  2771. FERROR("Get Nbr Cal Image Left Failed");
  2772. nNbrCalImagesLeft = 4; //假值
  2773. }
  2774. if (nNbrCalImagesLeft == 0)
  2775. {
  2776. nNbrCalImagesLeft = 4;
  2777. }
  2778. FINFO("Cal Image Left Count:{$}",nNbrCalImagesLeft);
  2779. return nNbrCalImagesLeft;
  2780. }