YuyingCtrl.cpp 62 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288
  1. #include "stdafx.h"
  2. #include <tlhelp32.h>
  3. #include "sys\stat.h"
  4. #include <fstream> //文件流库函数
  5. #include <atlcomtime.h>
  6. #include "YuyingCtrl.h"
  7. #include "common_api.h"
  8. #include "CiniFile.h"
  9. #include "MyPingip.h"
  10. #include "CiniFile.h"
  11. extern Log4CPP::Logger* gLogger;
  12. #include <shlwapi.h>
  13. #pragma comment(lib, "Shlwapi.lib")
  14. #pragma comment(lib, "Version.lib")
  15. YuyingCtrl* g_pYuyingCtrl = nullptr;
  16. YuyingCtrl::YuyingCtrl()
  17. :m_hYuyingModule(nullptr),
  18. API_YI_Initialize_FPD_V4(nullptr),
  19. API_YI_FPD_Set_Work_Mode(nullptr),
  20. API_YI_FPD_Stop_Capture_Image(nullptr),
  21. API_YI_FPD_Get_Configure_Common(nullptr),
  22. API_YI_FPD_Set_Configure_Common(nullptr),
  23. API_YI_FPD_Get_Configure_SyncOut_Mode(nullptr),
  24. API_YI_FPD_Set_Configure_SyncOut_Mode(nullptr),
  25. API_YI_FPD_Restore_Factory_Settings(nullptr),
  26. API_YI_FPD_Subtract_Offset(nullptr),
  27. API_YI_ImageReady_Callback_Register(nullptr),
  28. API_YI_ImageReady_Callback_Register_Ex(nullptr),
  29. API_YI_SystemInfo_Callback_Register(nullptr),
  30. API_YI_SystemInfo_Callback_Register_Ex(nullptr),
  31. API_YI_Get_Callback_Image_Size(nullptr),
  32. API_YI_GetLastErrorCode(nullptr),
  33. API_YI_Set_Save_Log_Flag(nullptr),
  34. API_YI_GetLoacalIPs_V4(nullptr),
  35. API_YI_Set_Image_Save_State(nullptr),
  36. API_YI_Set_Image_Save_Path(nullptr),
  37. API_YI_FPD_Get_FPD_TYPE(nullptr),
  38. API_YI_FPD_Get_Invalid_Region(nullptr),
  39. API_YI_FPD_Capture_Image(nullptr),
  40. API_YI_FPD_Capture_Prepare(nullptr),
  41. API_YI_Load_Gain_Tmp_File(nullptr),
  42. API_YI_Load_Defect_Tmp_File(nullptr),
  43. API_YI_Load_Offset_Tmp_File(nullptr),
  44. API_YI_Load_AED_Offset_Tmp_File(nullptr),
  45. API_YI_Set_Correct_Type(nullptr),
  46. API_YI_FPD_DO_Correction(nullptr),
  47. API_YI_FPD_Wifi_Re_Connect(nullptr),
  48. API_YI_FPD_Wifi_Set_Work_Mode(nullptr),
  49. API_YI_FPD_Wifi_Get_Work_Mode(nullptr),
  50. API_YI_FPD_Wifi_Set_Name(nullptr),
  51. API_YI_FPD_Wifi_Set_Power_Down(nullptr),
  52. API_YI_FPD_Wifi_Set_IP_Address(nullptr),
  53. API_YI_FPD_Wifi_Set_Route_Info(nullptr),
  54. m_strAppPath{},
  55. m_strWorkPath{},
  56. m_nPanelCount{},
  57. m_nDetectorID(1),
  58. m_nDetectorIndex{},
  59. m_nUpdateFPDID{},
  60. m_nCurrentMode(-1),
  61. m_nSaveRaw{},
  62. m_bInitialing(false),
  63. m_bInCalibrating(false),
  64. m_bInExposure(false),
  65. m_nSID(180),
  66. m_fFactorEXI2UGY{},
  67. m_pHardwareStatusThread(nullptr),
  68. m_hEndHWStatusThreadEvent(nullptr),
  69. m_hHWStatusThreadEndEvent(nullptr),
  70. m_pCurrentDPC(nullptr),
  71. m_eAppStatus(APP_STATUS_IDLE),
  72. m_nImageWidth{},
  73. m_nImageHeight{},
  74. m_nRawImgWidth{},
  75. m_nRawImgHeight{},
  76. m_nTopOffset{},
  77. m_nBottomOffset{},
  78. m_nLeftOffset{},
  79. m_nRightOffset{},
  80. m_nImgBits(16),
  81. m_nPixelPitch(150),
  82. m_bPreviewEnable(false),
  83. m_nPreviewWidth{},
  84. m_nPreviewHeight{},
  85. m_pImgBuffer(nullptr),
  86. m_pwRawImageData(nullptr),
  87. m_pwPreviewImg(nullptr),
  88. m_fCurrentDose(0.0f),
  89. m_hExitEvent(nullptr),
  90. m_hRecoverImage(nullptr),
  91. m_hCofirmCalib(nullptr),
  92. m_hEndCalibEvent(nullptr),
  93. m_hYuyingScanEnd(nullptr),
  94. m_hSharedEvent(nullptr),
  95. m_hWindowOffEvent(nullptr),
  96. m_pOffsetThread(nullptr),
  97. m_pXWindowoffThread(nullptr),
  98. m_hScanEventThread(nullptr),
  99. m_nCalibDueSetting{},
  100. m_nCalibStatus{},
  101. m_nDoseParam{},
  102. m_nCalibrationMode{},
  103. m_nDefectExpTimes{},
  104. m_nDefectTotalTimes{},
  105. m_nGainExpTimes{},
  106. m_nGainTotalFrames{},
  107. m_nDefectTotalFrames{}
  108. {
  109. m_hInitThread = nullptr;
  110. m_hScanEventThread = nullptr;
  111. m_pDPC2PanelID = new map<nsDPC::FPDDeviceYuying*, int>();
  112. m_pPanelID2DPC = new map<int, nsDPC::FPDDeviceYuying*>();
  113. m_vecDetectorID.clear();
  114. m_eCaliType = CCOS_CALIBRATION_TYPE_NONE;
  115. for (int i = 0; i < Yuying_SCAN_NUM; i++)
  116. {
  117. m_hArrayEvent[i] = nullptr;
  118. }
  119. }
  120. YuyingCtrl::~YuyingCtrl()
  121. {
  122. OnEXIT();
  123. if (m_pImgBuffer)
  124. {
  125. delete[] m_pImgBuffer;
  126. m_pImgBuffer = nullptr;
  127. }
  128. delete m_pDPC2PanelID;
  129. m_pDPC2PanelID = nullptr;
  130. delete m_pPanelID2DPC;
  131. m_pPanelID2DPC = nullptr;
  132. }
  133. bool YuyingCtrl::OnEXIT()
  134. {
  135. SetEvent(m_hEndHWStatusThreadEvent);
  136. FINFO("Waiting HWStatus Thread End");
  137. int nResult = WaitForSingleObject(m_hHWStatusThreadEndEvent, 10000);
  138. if (WAIT_TIMEOUT == nResult)
  139. {
  140. FERROR("Yuying HWStatus Thread Quit Failed");
  141. }
  142. else
  143. {
  144. FINFO("Yuying HWStatus Thread Quit Success");
  145. }
  146. SetEvent(m_hExitEvent);
  147. FINFO("Waiting Yuying ScanEvent Thread End");
  148. nResult = WaitForSingleObject(m_hYuyingScanEnd, 2000);
  149. if (WAIT_TIMEOUT == nResult)
  150. {
  151. FERROR("Yuying ScanEvent Thread Quit Failed");
  152. }
  153. else
  154. {
  155. FINFO("Yuying ScanEvent Thread Quit Success");
  156. }
  157. DeleteHandle();
  158. FINFO("Free Yuying DLL");
  159. FreeYuyingDLL();
  160. return true;
  161. }
  162. void YuyingCtrl::DeleteHandle()
  163. {
  164. if (m_hSharedEvent)
  165. {
  166. CloseHandle(m_hSharedEvent);
  167. m_hSharedEvent = nullptr;
  168. }
  169. if (m_hExitEvent)
  170. {
  171. CloseHandle(m_hExitEvent);
  172. m_hExitEvent = nullptr;
  173. }
  174. if (m_hRecoverImage)
  175. {
  176. CloseHandle(m_hRecoverImage);
  177. m_hRecoverImage = nullptr;
  178. }
  179. if (m_hCofirmCalib)
  180. {
  181. CloseHandle(m_hCofirmCalib);
  182. m_hCofirmCalib = nullptr;
  183. }
  184. if (m_hEndCalibEvent)
  185. {
  186. CloseHandle(m_hEndCalibEvent);
  187. m_hEndCalibEvent = nullptr;
  188. }
  189. if (m_hYuyingScanEnd)
  190. {
  191. CloseHandle(m_hYuyingScanEnd);
  192. m_hYuyingScanEnd = nullptr;
  193. }
  194. if (m_hHWStatusThreadEndEvent)
  195. {
  196. CloseHandle(m_hHWStatusThreadEndEvent);
  197. m_hHWStatusThreadEndEvent = nullptr;
  198. }
  199. if (m_pwPreviewImg)
  200. {
  201. delete[] m_pwPreviewImg;
  202. m_pwPreviewImg = nullptr;
  203. }
  204. if (m_pwRawImageData)
  205. {
  206. delete[] m_pwRawImageData;
  207. m_pwRawImageData = nullptr;
  208. }
  209. }
  210. //等到SDK回调返回true, 超时返回false
  211. bool YuyingCtrl::WaitRespond(int nTimeOut, const char* szPosition)
  212. {
  213. FINFO("---{$} Wait Respond---: {$}ms", nTimeOut);
  214. DWORD nResult = WaitForSingleObject(m_hSharedEvent, nTimeOut);
  215. if (WAIT_TIMEOUT == nResult)
  216. {
  217. FWARN("Timeout in wait respond");
  218. ResetEvent(m_hSharedEvent);
  219. return false;
  220. }
  221. ResetEvent(m_hSharedEvent);
  222. return true;
  223. }
  224. void YuyingCtrl::SendNotify(const char* szPosition)
  225. {
  226. FINFO("---{$} Get Respond ---", szPosition);
  227. SetEvent(m_hSharedEvent);
  228. }
  229. void YuyingCtrl::ResetLock()
  230. {
  231. ResetEvent(m_hSharedEvent);
  232. }
  233. bool YuyingCtrl::Init(string strAppPath)
  234. {
  235. m_strAppPath = strAppPath;
  236. m_strWorkPath = strAppPath + (string)m_ModeConfig["SDKPath"];
  237. FINFO("YuyingCtrl::Init {$}\n", m_strWorkPath.c_str());
  238. if (!LoadYuyingDLL(m_strWorkPath))
  239. {
  240. FERROR("YuyingCtrl::Init LoadYuyingDLL failed\n");
  241. return false;
  242. }
  243. m_hSharedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  244. m_hYuyingScanEnd = CreateEvent(NULL, FALSE, FALSE, NULL);
  245. m_hWindowOffEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  246. m_hHWStatusThreadEndEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  247. m_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  248. m_hRecoverImage = CreateEvent(NULL, FALSE, FALSE, NULL);
  249. m_hCofirmCalib = CreateEvent(NULL, FALSE, FALSE, NULL);
  250. m_hEndCalibEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  251. m_hArrayEvent[0] = m_hExitEvent;
  252. m_hArrayEvent[1] = m_hRecoverImage;
  253. m_hArrayEvent[2] = m_hCofirmCalib;
  254. m_hArrayEvent[3] = m_hEndCalibEvent;
  255. FINFO("YuyingCtrl::Init over\n");
  256. return true;
  257. }
  258. //启动初始化线程
  259. void YuyingCtrl::StartInitFPDThread()
  260. {
  261. FINFO("Start Init Thread");
  262. DWORD unThreadID;
  263. if (m_hInitThread == nullptr)
  264. {
  265. m_hInitThread = CreateThread(0, 0, onInitPanel, this, 0, &unThreadID);
  266. if (m_hInitThread == nullptr)
  267. {
  268. FWARN("Start Init Thread FERROR");
  269. }
  270. }
  271. }
  272. //初始化
  273. DWORD YuyingCtrl::onInitPanel(void* pParam)
  274. {
  275. YuyingCtrl* pInstance = (YuyingCtrl*)pParam;
  276. pInstance->Action_Init();
  277. pInstance->m_hInitThread = nullptr;
  278. return true;
  279. }
  280. void YuyingCtrl::Action_Init()
  281. {
  282. FINFO("YuyingCtrl::Action_Init");
  283. m_bInitialing = true;
  284. for (int nID = 0; nID < m_nPanelCount; nID++) //连接多板
  285. {
  286. int nDetectorID = nID + 1;
  287. FINFO("Start init Detector: {$}", nDetectorID);
  288. if (!DetectorInitProcess(nDetectorID))
  289. {
  290. FERROR("Init process failed");
  291. }
  292. }
  293. YuyingScanEventThread();
  294. m_bInitialing = false;
  295. FINFO("Action init over\n");
  296. }
  297. //初始化连接探测器
  298. bool YuyingCtrl::DetectorInitProcess(int nDetectorID, bool bFDAttach)
  299. {
  300. int nDetectorIndex = nDetectorID - 1;
  301. bool bPingSucces = false;
  302. int nPingTotalTime = 30; //ping不通,一次约2s,共30次,1分钟左右超时
  303. for (int nPingTimes = 0; nPingTimes < nPingTotalTime; nPingTimes++)
  304. {
  305. bPingSucces = IsConnected(m_stDeviceIndex[nDetectorIndex].strWiredIP);
  306. if (bPingSucces)
  307. {
  308. FINFO("Ping Detector successfully");
  309. break;
  310. }
  311. Sleep(2000);
  312. }
  313. //ping不通就不用连接了
  314. if (!bPingSucces)
  315. {
  316. FERROR("Ping detector failed, timeout!!!");
  317. return false;
  318. }
  319. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_START, "");
  320. string strLocalIP = m_stDeviceIndex[nDetectorIndex].strLocalIP;
  321. int nLocalPort = 28000;
  322. string strRemoteIP = m_stDeviceIndex[nDetectorIndex].strWiredIP;
  323. int nRemotePort = 27999;
  324. char szDetectorID[100] = { 0 };
  325. FINFO("LocalIP: {$}:28000, RemoteIP: {$}:27999", strLocalIP, strRemoteIP);
  326. int nRet = API_YI_Initialize_FPD_V4(strLocalIP.c_str(), nLocalPort, strRemoteIP.c_str(), nRemotePort, szDetectorID);
  327. if (TestError(nDetectorID, nRet, "API_YI_Initialize_FPD_V4"))
  328. {
  329. FERROR("Connect Detector {$} Failed", nDetectorID);
  330. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_ERROR, "");
  331. return false;
  332. }
  333. m_stDeviceIndex[nDetectorIndex].nDetectorID = nDetectorID;
  334. m_stDeviceIndex[nDetectorIndex].bConnectStatus = true;
  335. m_stDeviceIndex[nDetectorIndex].bInitOK = true;
  336. m_vecDetectorID.push_back(szDetectorID);
  337. FINFO("Connect Detector {$} Success", nDetectorID);
  338. nRet = API_YI_Set_Save_Log_Flag(m_stDeviceIndex[nDetectorIndex].bSDKSaveLog, m_stDeviceIndex[nDetectorIndex].strSDKSaveLogPath.c_str());
  339. if (TestError(nDetectorID, nRet, "SaveLog"))
  340. {
  341. FERROR("{$} SDK save log failed!!! path: {$} ", (m_stDeviceIndex[nDetectorIndex].bSDKSaveLog ? "Enable" : "Disable"),
  342. m_stDeviceIndex[nDetectorIndex].strSDKSaveLogPath);
  343. }
  344. else
  345. {
  346. FINFO("{$} SDK save log success, path: {$}", (m_stDeviceIndex[nDetectorIndex].bSDKSaveLog ? "Enable" : "Disable"),
  347. m_stDeviceIndex[nDetectorIndex].strSDKSaveLogPath);
  348. }
  349. nRet = API_YI_Set_Image_Save_Path(szDetectorID, m_stDeviceIndex[nDetectorIndex].strSDKSaveRawPath.c_str());
  350. nRet |= API_YI_Set_Image_Save_State(szDetectorID, m_stDeviceIndex[nDetectorIndex].bSDKSaveRaw);
  351. if (TestError(nDetectorID, nRet, "SaveRaw"))
  352. {
  353. FERROR("{$} SDK save raw image failed!!! path: {$} ", (m_stDeviceIndex[nDetectorIndex].bSDKSaveRaw ? "Enable" : "Disable"),
  354. m_stDeviceIndex[nDetectorIndex].strSDKSaveRawPath);
  355. }
  356. else
  357. {
  358. FINFO("{$} SDK save raw image success, path: {$}", (m_stDeviceIndex[nDetectorIndex].bSDKSaveRaw ? "Enable" : "Disable"),
  359. m_stDeviceIndex[nDetectorIndex].strSDKSaveRawPath);
  360. }
  361. //获取尺寸
  362. int nWidth = 0;
  363. int nHeight = 0;
  364. int nBits = 0;
  365. nRet = API_YI_Get_Callback_Image_Size(szDetectorID, nWidth, nHeight, nBits);
  366. if (TestError(nDetectorID, nRet, "API_YI_Get_Callback_Image_Size"))
  367. {
  368. FERROR("Get detector({$}) image size failed", nDetectorID);
  369. }
  370. else
  371. {
  372. FINFO("Get detector image size: {$}x{$}x{$}", nWidth, nHeight, nBits);
  373. }
  374. //注册回调
  375. nRet = API_YI_ImageReady_Callback_Register(szDetectorID, nullptr);
  376. if (TestError(nDetectorID, nRet, "API_YI_ImageReady_Callback_Register"))
  377. {
  378. FERROR("Reset ImageReadyCallbackProcess failed!!!");
  379. }
  380. else
  381. {
  382. FINFO("Reset ImageReadyCallbackProcess success");
  383. }
  384. nRet = API_YI_SystemInfo_Callback_Register(szDetectorID, nullptr);
  385. if (TestError(nDetectorID, nRet, "API_YI_SystemInfo_Callback_Register"))
  386. {
  387. FERROR("Reset SystemInfoCallbackProcess failed!!!");
  388. }
  389. else
  390. {
  391. FINFO("Reset SystemInfoCallbackProcess success");
  392. }
  393. nRet = API_YI_ImageReady_Callback_Register(szDetectorID, ImageReadyCallbackProcess);
  394. if (TestError(nDetectorID, nRet, "API_YI_ImageReady_Callback_Register"))
  395. {
  396. FERROR("Register ImageReadyCallbackProcess failed!!!");
  397. }
  398. else
  399. {
  400. FINFO("Register ImageReadyCallbackProcess success");
  401. }
  402. nRet = API_YI_SystemInfo_Callback_Register(szDetectorID, SystemInfoCallbackProcess);
  403. if (TestError(nDetectorID, nRet, "API_YI_SystemInfo_Callback_Register"))
  404. {
  405. FERROR("Register SystemInfoCallbackProcess failed!!!");
  406. }
  407. else
  408. {
  409. FINFO("Register SystemInfoCallbackProcess success");
  410. }
  411. //读取或设置common参数
  412. YIConfigInfo_Common stConfigCommon = { 0 };
  413. nRet = API_YI_FPD_Get_Configure_Common(szDetectorID, 1, &stConfigCommon);
  414. if (TestError(nDetectorID, nRet, "API_YI_FPD_Get_Configure_Common"))
  415. {
  416. FERROR("Get detector common config failed!!!");
  417. }
  418. else
  419. {
  420. FINFO("Get detector common config success");
  421. FINFO("DetectorSN: {$}; FPGA version: {$}; MCU version: {$}; NetWork: {$}:{$}",
  422. stConfigCommon.arrProductInitSN, stConfigCommon.arrFPGAVerMain, stConfigCommon.arrMCUVerMain, stConfigCommon.arrLocalIPAddress, stConfigCommon.usLocalUDPPort);
  423. }
  424. //读取syncout参数
  425. YIConfigInfo_SyncOut stConfigSyncOut = { 0 };
  426. nRet = API_YI_FPD_Get_Configure_SyncOut_Mode(szDetectorID, 0, 1, &stConfigSyncOut);
  427. if (TestError(nDetectorID, nRet, "API_YI_FPD_Get_Configure_SyncOut_Mode"))
  428. {
  429. FERROR("Get detector syncmode config failed!!!");
  430. }
  431. else
  432. {
  433. FINFO("Get detector syncmode config success");
  434. FINFO("ExpWindow: {$}; ExpTimeout: {$}; ", stConfigSyncOut.usExposureWindow, stConfigSyncOut.usExposureTimeOut);
  435. }
  436. //加载模板
  437. FPDLoadCorrectFiles(nDetectorID, szDetectorID);
  438. //设置工作模式
  439. SetDetectorWorkMode(nDetectorID, szDetectorID, m_stDeviceIndex[nDetectorIndex].nSyncMode);
  440. StatusFeedback(EVT_STATUS_INIT, PANEL_EVENT_END_OK, "");
  441. return true;
  442. }
  443. /************************************************************************************
  444. 功能:启动线程,处理一些异步消息
  445. ************************************************************************************/
  446. void YuyingCtrl::YuyingScanEventThread()
  447. {
  448. if (m_hScanEventThread != nullptr)
  449. {
  450. FINFO("ScanEvent Thread already run");
  451. return;
  452. }
  453. FINFO("Start ScanEvent Thread");
  454. DWORD unThreadID;
  455. m_hScanEventThread = (HANDLE)CreateThread(NULL, 0, onScanEvent, (LPVOID)this, 0, &unThreadID);
  456. if (m_hScanEventThread == nullptr)
  457. {
  458. FWARN("Start Scan Event FERROR");
  459. }
  460. else
  461. {
  462. FINFO("Start ScanEvent Thread ok");
  463. }
  464. }
  465. /************************************************************************************
  466. 功能:启动线程,处理一些异步消息
  467. m_hRecoverImage 异步,恢复图像
  468. m_hCofirmCalib 异步,确认每一次校正的结果,如剂量大了/小了/
  469. m_hReconnectFD 异步,初始化探测器
  470. ************************************************************************************/
  471. DWORD YuyingCtrl::onScanEvent(void* pParam)
  472. {
  473. YuyingCtrl* pInstance = (YuyingCtrl*)pParam;
  474. if (pInstance == nullptr)
  475. {
  476. return false;
  477. }
  478. bool bExitFlag = true;
  479. while (bExitFlag)
  480. {
  481. FINFO("( Waiting for Signal...)");
  482. DWORD dwResult = WaitForMultipleObjects(Yuying_SCAN_NUM, pInstance->m_hArrayEvent, FALSE, INFINITE);
  483. if (WAIT_OBJECT_0 == dwResult) //m_hExitEvent
  484. {
  485. FINFO("Get Exit Event");
  486. bExitFlag = false;
  487. }
  488. else if (WAIT_OBJECT_0 + 1 == dwResult) //m_hRecoverImage
  489. {
  490. FINFO("Get RecoverImage Event");
  491. pInstance->RecoverLastImageAuto();
  492. }
  493. else if (WAIT_OBJECT_0 + 2 == dwResult) //m_hCofirmCalib
  494. {
  495. FINFO("Get Cofirm Calibration Event");
  496. pInstance->ConfirmCalibration();
  497. }
  498. else if (WAIT_OBJECT_0 + 3 == dwResult) //m_hEndCalibEvent
  499. {
  500. FINFO("Get EndCalibraion Event");
  501. pInstance->OnEndCalibraion();
  502. }
  503. }
  504. SetEvent(pInstance->m_hYuyingScanEnd);
  505. FINFO("Yuying ScanEvent Thread End");
  506. return true;
  507. }
  508. //接口成功返回false,接口失败或有错返回true
  509. bool YuyingCtrl::TestError(int nDetectorID, int nErrorStatus, std::string strAPI)
  510. {
  511. switch (nErrorStatus)
  512. {
  513. case 0:
  514. {
  515. SystemErrorCode nErrorCode = SEC_Succeed;
  516. nErrorCode = (SystemErrorCode)API_YI_GetLastErrorCode();
  517. FWARN("{$} Failed!!! ErrorCode: {$}", strAPI.c_str(), (int)nErrorCode);
  518. return true;
  519. break;
  520. }
  521. case 1:
  522. {
  523. FDEBUG("{$} Success", strAPI);
  524. return false;
  525. break;
  526. }
  527. default:
  528. break;
  529. }
  530. return true;
  531. }
  532. bool YuyingCtrl::LoadYuyingDLL(string strWorkPath)
  533. {
  534. string strDllDir = strWorkPath;
  535. if (SetDllDirectory(strDllDir.c_str()) == 0)
  536. {
  537. DWORD dw = GetLastError();
  538. FINFO("SetDllDirectory error,error code [{$}]", dw);
  539. return false;
  540. }
  541. string strDllPath = strWorkPath + "\\YuYingAPI.dll";
  542. FINFO("Load Yuying API");
  543. m_hYuyingModule = LoadLibrary(strDllPath.c_str());
  544. if (nullptr == m_hYuyingModule)
  545. {
  546. FWARN("Load Yuying API failed!");
  547. return false;
  548. }
  549. API_YI_Initialize_FPD_V4 = (Func_YI_Initialize_FPD_V4)GetProcAddress(m_hYuyingModule, "YI_Initialize_FPD_V4");
  550. if (nullptr == API_YI_Initialize_FPD_V4)
  551. {
  552. FWARN("Load YI_Initialize_FPD_V4 failed!");
  553. return false;
  554. }
  555. API_YI_FPD_Set_Work_Mode = (Func_YI_FPD_Set_Work_Mode)GetProcAddress(m_hYuyingModule, "YI_FPD_Set_Work_Mode");
  556. if (nullptr == API_YI_FPD_Set_Work_Mode)
  557. {
  558. FWARN("Load YI_FPD_Set_Work_Mode failed!");
  559. return false;
  560. }
  561. API_YI_FPD_Stop_Capture_Image = (Func_YI_FPD_Stop_Capture_Image)GetProcAddress(m_hYuyingModule, "YI_FPD_Stop_Capture_Image");
  562. if (nullptr == API_YI_FPD_Stop_Capture_Image)
  563. {
  564. FWARN("Load YI_FPD_Stop_Capture_Image failed!");
  565. return false;
  566. }
  567. API_YI_FPD_Get_Configure_Common = (Func_YI_FPD_Get_Configure_Common)GetProcAddress(m_hYuyingModule, "YI_FPD_Get_Configure_Common");
  568. if (nullptr == API_YI_FPD_Get_Configure_Common)
  569. {
  570. FWARN("Load YI_FPD_Get_Configure_Common failed!");
  571. return false;
  572. }
  573. API_YI_FPD_Set_Configure_Common = (Func_YI_FPD_Set_Configure_Common)GetProcAddress(m_hYuyingModule, "YI_FPD_Set_Configure_Common");
  574. if (nullptr == API_YI_FPD_Set_Configure_Common)
  575. {
  576. FWARN("Load YI_FPD_Set_Configure_Common failed!");
  577. return false;
  578. }
  579. API_YI_FPD_Get_Configure_SyncOut_Mode = (Func_YI_FPD_Get_Configure_SyncOut_Mode)GetProcAddress(m_hYuyingModule, "YI_FPD_Get_Configure_SyncOut_Mode");
  580. if (nullptr == API_YI_FPD_Get_Configure_SyncOut_Mode)
  581. {
  582. FWARN("Load YI_FPD_Get_Configure_SyncOut_Mode failed!");
  583. return false;
  584. }
  585. API_YI_FPD_Set_Configure_SyncOut_Mode = (Func_YI_FPD_Set_Configure_SyncOut_Mode)GetProcAddress(m_hYuyingModule, "YI_FPD_Set_Configure_SyncOut_Mode");
  586. if (nullptr == API_YI_FPD_Set_Configure_SyncOut_Mode)
  587. {
  588. FWARN("Load YI_FPD_Set_Configure_SyncOut_Mode failed!");
  589. return false;
  590. }
  591. API_YI_FPD_Restore_Factory_Settings = (Func_YI_FPD_Restore_Factory_Settings)GetProcAddress(m_hYuyingModule, "YI_FPD_Restore_Factory_Settings");
  592. if (nullptr == API_YI_FPD_Restore_Factory_Settings)
  593. {
  594. FWARN("Load YI_FPD_Restore_Factory_Settings failed!");
  595. return false;
  596. }
  597. API_YI_FPD_Subtract_Offset = (Func_YI_FPD_Subtract_Offset)GetProcAddress(m_hYuyingModule, "YI_FPD_Subtract_Offset");
  598. if (nullptr == API_YI_FPD_Subtract_Offset)
  599. {
  600. FWARN("Load YI_FPD_Subtract_Offset failed!");
  601. return false;
  602. }
  603. API_YI_ImageReady_Callback_Register = (Func_YI_ImageReady_Callback_Register)GetProcAddress(m_hYuyingModule, "YI_ImageReady_Callback_Register");
  604. if (nullptr == API_YI_ImageReady_Callback_Register)
  605. {
  606. FWARN("Load YI_ImageReady_Callback_Register failed!");
  607. return false;
  608. }
  609. API_YI_ImageReady_Callback_Register_Ex = (Func_YI_ImageReady_Callback_Register_Ex)GetProcAddress(m_hYuyingModule, "YI_ImageReady_Callback_Register_Ex");
  610. if (nullptr == API_YI_ImageReady_Callback_Register_Ex)
  611. {
  612. FWARN("Load YI_ImageReady_Callback_Register_Ex failed!");
  613. return false;
  614. }
  615. API_YI_SystemInfo_Callback_Register = (Func_YI_SystemInfo_Callback_Register)GetProcAddress(m_hYuyingModule, "YI_SystemInfo_Callback_Register");
  616. if (nullptr == API_YI_SystemInfo_Callback_Register)
  617. {
  618. FWARN("Load YI_SystemInfo_Callback_Register failed!");
  619. return false;
  620. }
  621. API_YI_SystemInfo_Callback_Register_Ex = (Func_YI_SystemInfo_Callback_Register_Ex)GetProcAddress(m_hYuyingModule, "YI_SystemInfo_Callback_Register_Ex");
  622. if (nullptr == API_YI_SystemInfo_Callback_Register_Ex)
  623. {
  624. FWARN("Load YI_SystemInfo_Callback_Register_Ex failed!");
  625. return false;
  626. }
  627. API_YI_Get_Callback_Image_Size = (Func_YI_Get_Callback_Image_Size)GetProcAddress(m_hYuyingModule, "YI_Get_Callback_Image_Size");
  628. if (nullptr == API_YI_Get_Callback_Image_Size)
  629. {
  630. FWARN("Load YI_Get_Callback_Image_Size failed!");
  631. return false;
  632. }
  633. API_YI_GetLastErrorCode = (Func_YI_GetLastErrorCode)GetProcAddress(m_hYuyingModule, "YI_GetLastErrorCode");
  634. if (nullptr == API_YI_GetLastErrorCode)
  635. {
  636. FWARN("Load YI_GetLastErrorCode failed!");
  637. return false;
  638. }
  639. API_YI_Set_Save_Log_Flag = (Func_YI_Set_Save_Log_Flag)GetProcAddress(m_hYuyingModule, "YI_Set_Save_Log_Flag");
  640. if (nullptr == API_YI_Set_Save_Log_Flag)
  641. {
  642. FWARN("Load YI_Set_Save_Log_Flag failed!");
  643. return false;
  644. }
  645. API_YI_GetLoacalIPs_V4 = (Func_YI_GetLoacalIPs_V4)GetProcAddress(m_hYuyingModule, "YI_GetLoacalIPs_V4");
  646. if (nullptr == API_YI_GetLoacalIPs_V4)
  647. {
  648. FWARN("Load YI_GetLoacalIPs_V4 failed!");
  649. return false;
  650. }
  651. API_YI_Set_Image_Save_State = (Func_YI_Set_Image_Save_State)GetProcAddress(m_hYuyingModule, "YI_Set_Image_Save_State");
  652. if (nullptr == API_YI_Set_Image_Save_State)
  653. {
  654. FWARN("Load YI_Set_Image_Save_State failed!");
  655. return false;
  656. }
  657. API_YI_Set_Image_Save_Path = (Func_YI_Set_Image_Save_Path)GetProcAddress(m_hYuyingModule, "YI_Set_Image_Save_Path");
  658. if (nullptr == API_YI_Set_Image_Save_Path)
  659. {
  660. FWARN("Load YI_Set_Image_Save_Path failed!");
  661. return false;
  662. }
  663. API_YI_FPD_Get_FPD_TYPE = (Func_YI_FPD_Get_FPD_TYPE)GetProcAddress(m_hYuyingModule, "YI_FPD_Get_FPD_TYPE");
  664. if (nullptr == API_YI_FPD_Get_FPD_TYPE)
  665. {
  666. FWARN("Load YI_FPD_Get_FPD_TYPE failed!");
  667. return false;
  668. }
  669. API_YI_FPD_Get_Invalid_Region = (Func_YI_FPD_Get_Invalid_Region)GetProcAddress(m_hYuyingModule, "YI_FPD_Get_Invalid_Region");
  670. if (nullptr == API_YI_FPD_Get_Invalid_Region)
  671. {
  672. FWARN("Load YI_FPD_Get_Invalid_Region failed!");
  673. return false;
  674. }
  675. API_YI_FPD_Capture_Image = (Func_YI_FPD_Capture_Image)GetProcAddress(m_hYuyingModule, "YI_FPD_Capture_Image");
  676. if (nullptr == API_YI_FPD_Capture_Image)
  677. {
  678. FWARN("Load YI_FPD_Capture_Image failed!");
  679. return false;
  680. }
  681. API_YI_FPD_Capture_Prepare = (Func_YI_FPD_Capture_Prepare)GetProcAddress(m_hYuyingModule, "YI_FPD_Capture_Prepare");
  682. if (nullptr == API_YI_FPD_Capture_Prepare)
  683. {
  684. FWARN("Load YI_FPD_Capture_Prepare failed!");
  685. return false;
  686. }
  687. API_YI_Load_Gain_Tmp_File = (Func_YI_Load_Gain_Tmp_File)GetProcAddress(m_hYuyingModule, "YI_Load_Gain_Tmp_File");
  688. if (nullptr == API_YI_Load_Gain_Tmp_File)
  689. {
  690. FWARN("Load YI_Load_Gain_Tmp_File failed!");
  691. return false;
  692. }
  693. API_YI_Load_Defect_Tmp_File = (Func_YI_Load_Defect_Tmp_File)GetProcAddress(m_hYuyingModule, "YI_Load_Defect_Tmp_File");
  694. if (nullptr == API_YI_Load_Defect_Tmp_File)
  695. {
  696. FWARN("Load YI_Load_Defect_Tmp_File failed!");
  697. return false;
  698. }
  699. API_YI_Load_Offset_Tmp_File = (Func_YI_Load_Offset_Tmp_File)GetProcAddress(m_hYuyingModule, "YI_Load_Offset_Tmp_File");
  700. if (nullptr == API_YI_Load_Offset_Tmp_File)
  701. {
  702. FWARN("Load YI_Load_Offset_Tmp_File failed!");
  703. return false;
  704. }
  705. API_YI_Load_AED_Offset_Tmp_File = (Func_YI_Load_AED_Offset_Tmp_File)GetProcAddress(m_hYuyingModule, "YI_Load_AED_Offset_Tmp_File");
  706. if (nullptr == API_YI_Load_AED_Offset_Tmp_File)
  707. {
  708. FWARN("Load YI_Load_AED_Offset_Tmp_File failed!");
  709. return false;
  710. }
  711. API_YI_Set_Correct_Type = (Func_YI_Set_Correct_Type)GetProcAddress(m_hYuyingModule, "YI_Set_Correct_Type");
  712. if (nullptr == API_YI_Set_Correct_Type)
  713. {
  714. FWARN("Load YI_Set_Correct_Type failed!");
  715. return false;
  716. }
  717. API_YI_FPD_DO_Correction = (Func_YI_FPD_DO_Correction)GetProcAddress(m_hYuyingModule, "YI_FPD_DO_Correction");
  718. if (nullptr == API_YI_FPD_DO_Correction)
  719. {
  720. FWARN("Load YI_FPD_DO_Correction failed!");
  721. return false;
  722. }
  723. API_YI_FPD_Wifi_Re_Connect = (Func_YI_FPD_Wifi_Re_Connect)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Re_Connect");
  724. if (nullptr == API_YI_FPD_Wifi_Re_Connect)
  725. {
  726. FWARN("Load YI_FPD_Wifi_Re_Connect failed!");
  727. return false;
  728. }
  729. API_YI_FPD_Wifi_Set_Work_Mode = (Func_YI_FPD_Wifi_Set_Work_Mode)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Set_Work_Mode");
  730. if (nullptr == API_YI_FPD_Wifi_Set_Work_Mode)
  731. {
  732. FWARN("Load YI_FPD_Wifi_Set_Work_Mode failed!");
  733. return false;
  734. }
  735. API_YI_FPD_Wifi_Get_Work_Mode = (Func_YI_FPD_Wifi_Get_Work_Mode)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Get_Work_Mode");
  736. if (nullptr == API_YI_FPD_Wifi_Get_Work_Mode)
  737. {
  738. FWARN("Load YI_FPD_Wifi_Get_Work_Mode failed!");
  739. return false;
  740. }
  741. API_YI_FPD_Wifi_Set_Name = (Func_YI_FPD_Wifi_Set_Name)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Set_Name");
  742. if (nullptr == API_YI_FPD_Wifi_Set_Name)
  743. {
  744. FWARN("Load YI_FPD_Wifi_Set_Name failed!");
  745. return false;
  746. }
  747. API_YI_FPD_Wifi_Set_Power_Down = (Func_YI_FPD_Wifi_Set_Power_Down)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Set_Power_Down");
  748. if (nullptr == API_YI_FPD_Wifi_Set_Power_Down)
  749. {
  750. FWARN("Load YI_FPD_Wifi_Set_Power_Down failed!");
  751. return false;
  752. }
  753. API_YI_FPD_Wifi_Set_IP_Address = (Func_YI_FPD_Wifi_Set_IP_Address)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Set_IP_Address");
  754. if (nullptr == API_YI_FPD_Wifi_Set_IP_Address)
  755. {
  756. FWARN("Load YI_FPD_Wifi_Set_IP_Address failed!");
  757. return false;
  758. }
  759. API_YI_FPD_Wifi_Set_Route_Info = (Func_YI_FPD_Wifi_Set_Route_Info)GetProcAddress(m_hYuyingModule, "YI_FPD_Wifi_Set_Route_Info");
  760. if (nullptr == API_YI_FPD_Wifi_Set_Route_Info)
  761. {
  762. FWARN("Load YI_FPD_Wifi_Set_Route_Info failed!");
  763. return false;
  764. }
  765. FINFO("Load Yuying API over");
  766. return true;
  767. }
  768. void YuyingCtrl::FreeYuyingDLL()
  769. {
  770. if (m_hYuyingModule)
  771. {
  772. FreeLibrary(m_hYuyingModule);
  773. m_hYuyingModule = nullptr;
  774. FINFO(" Free Yuying DLL");
  775. }
  776. }
  777. bool YuyingCtrl::DriverEntry(FPDDeviceYuying* pDrvDPC, ResDataObject& Configuration)
  778. {
  779. FINFO("--Func-- DriverEntry {$}", pDrvDPC);
  780. map<FPDDeviceYuying*, int>::iterator DPCsIter = m_pDPC2PanelID->find(pDrvDPC);
  781. if (DPCsIter != m_pDPC2PanelID->end())
  782. {
  783. FERROR("This DPC already exist");
  784. return false;
  785. }
  786. CPanelStatus* p = new CPanelStatus();
  787. m_pStPanelStatus[m_nPanelCount] = p;
  788. m_pDPC2PanelID->insert(pair<FPDDeviceYuying*, int>(pDrvDPC, m_nPanelCount));
  789. m_pPanelID2DPC->insert(pair<int, FPDDeviceYuying*>(m_nPanelCount, pDrvDPC));
  790. m_nPanelCount++;
  791. m_ModeConfig = Configuration; //记录配置 --目前只有一个平板,多板时应该分别存储
  792. FINFO("Config: {$}", m_ModeConfig.encode());
  793. return true;
  794. }
  795. void YuyingCtrl::ConfFeedback(int nEventID, int nDetectorID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  796. {
  797. if (-1 == nDetectorID)
  798. {
  799. nDetectorID = m_nDetectorIndex;
  800. }
  801. ((*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  802. nEventID, EVT_LEVEL_CONFIGURATION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  803. }
  804. void YuyingCtrl::InfoFeedback(int nEventID, int nDetectorID, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, void* pParam)
  805. {
  806. if (-1 == nDetectorID)
  807. {
  808. nDetectorID = m_nDetectorIndex;
  809. }
  810. ((*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  811. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  812. }
  813. void YuyingCtrl::StatusFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  814. {
  815. if (-1 == nDetectorID)
  816. {
  817. nDetectorID = m_nDetectorIndex;
  818. }
  819. ((*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  820. nEventID, EVT_LEVEL_STATUS, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  821. }
  822. void YuyingCtrl::DataFeedback(int nEventID, void* pParam, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, int nDetectorID)
  823. {
  824. if (-1 == nDetectorID)
  825. {
  826. nDetectorID = m_nDetectorIndex;
  827. }
  828. ((*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  829. nEventID, EVT_LEVEL_DATA, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  830. }
  831. void YuyingCtrl::WarnFeedback(int nEventID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam, int nDetectorID)
  832. {
  833. if (-1 == nDetectorID)
  834. {
  835. nDetectorID = m_nDetectorIndex;
  836. }
  837. ((*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  838. nEventID, EVT_LEVEL_WARNING, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  839. }
  840. void YuyingCtrl::ErrorFeedback(int nEventID, const char* pszMsg, int nDetectorID, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  841. {
  842. if (-1 == nDetectorID)
  843. {
  844. nDetectorID = m_nDetectorIndex;
  845. }
  846. ((*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  847. nEventID, EVT_LEVEL_ERROR, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  848. }
  849. /********************************************************************/
  850. /****************************将文件删除******************************/
  851. /********************************************************************/
  852. bool YuyingCtrl::DeleteOneFolder(string strSourceFolder)
  853. {
  854. FINFO("Delete {$}", strSourceFolder.c_str());
  855. if (!PathFileExists(strSourceFolder.c_str()))
  856. {
  857. FINFO("SourceFolder don't exist");
  858. return false;
  859. }
  860. char pFolderSource[1024] = { 0 };
  861. memset(pFolderSource, 0x00, 1024);
  862. strcpy(pFolderSource, strSourceFolder.c_str()); //第一个文件
  863. SHFILEOPSTRUCT sfo;
  864. memset(&sfo, 0, sizeof(SHFILEOPSTRUCT));
  865. sfo.hwnd = NULL;
  866. sfo.wFunc = FO_DELETE;//FO_MOVE;
  867. sfo.pFrom = pFolderSource;
  868. sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION;
  869. SHFileOperation(&sfo);
  870. FINFO("Delete File over");
  871. return true;
  872. }
  873. //将strSrcPath文件拷贝到strDstPath目录
  874. bool YuyingCtrl::CopyFile2Folder(string strSrcPath, string strDstPath)
  875. {
  876. //MSDN: This string must be double-null terminated
  877. strSrcPath += '\0';
  878. strDstPath += '\0';
  879. //上面两行代码非常重要,直接影响下面SHFileOperation的稳定性
  880. FINFO("Copy {$} to {$}", strSrcPath.c_str(), strDstPath.c_str());
  881. if (!PathFileExists(strSrcPath.c_str()))
  882. {
  883. FINFO("SourceFolder don't exist");
  884. return false;
  885. }
  886. if (!PathFileExists(strDstPath.c_str()))
  887. {
  888. FINFO("DestFolder don't exist");
  889. return false;
  890. }
  891. SHFILEOPSTRUCT sfo;
  892. sfo.hwnd = NULL;
  893. sfo.wFunc = FO_COPY;//FO_MOVE;
  894. sfo.pFrom = strSrcPath.c_str();
  895. sfo.pTo = strDstPath.c_str();
  896. sfo.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_ALLOWUNDO;
  897. //FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢复文件;
  898. //FOF_NOCONFIRMATION:在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。
  899. int nRet = SHFileOperation(&sfo);
  900. FINFO("Copy File to Folder over, {$}", nRet);
  901. return true;
  902. }
  903. bool YuyingCtrl::ActivePanel(nsDPC::FPDDeviceYuying* pDrvDPC, bool bActive)
  904. {
  905. FINFO("ActivePanel start: {$}, DetectorIndex {$}", pDrvDPC, m_nDetectorIndex);
  906. map<nsDPC::FPDDeviceYuying*, int>::iterator DPCsIter = m_pDPC2PanelID->find(pDrvDPC);
  907. if (DPCsIter != m_pDPC2PanelID->end())
  908. {
  909. if (m_nDetectorIndex != DPCsIter->second)
  910. {
  911. FINFO("DetectorIndex {$} != DPCsIter->second {$}", m_nDetectorIndex, DPCsIter->second);
  912. m_nDetectorIndex = DPCsIter->second;
  913. m_pCurrentDPC = pDrvDPC;
  914. m_nCurrentMode = -1;
  915. m_ModeConfig.clear();
  916. m_ModeConfig = m_ObjFPDsInfo[m_nDetectorIndex];
  917. FINFO("ActivePanel over: {$}, DetectorIndex {$}", pDrvDPC, m_nDetectorIndex);
  918. }
  919. else
  920. {
  921. FINFO("DetectorIndex {$} == DPCsIter->second {$}", m_nDetectorIndex, DPCsIter->second);
  922. }
  923. }
  924. else
  925. {
  926. FWARN("Not find DPC in group");
  927. return false;
  928. }
  929. return true;
  930. }
  931. bool YuyingCtrl::EnterExam(APP_STATUS eStatus)
  932. {
  933. string strLog = "";
  934. switch (eStatus)
  935. {
  936. case APP_STATUS_IDLE:
  937. strLog = "APP_STATUS_IDLE";
  938. break;
  939. case APP_STATUS_WORK_BEGIN:
  940. strLog = "APP_STATUS_WORK_BEGIN";
  941. m_bInCalibrating = false;
  942. break;
  943. case APP_STATUS_WORK_END:
  944. strLog = "APP_STATUS_WORK_END";
  945. break;
  946. case APP_STATUS_DETSHARE_BEGIN:
  947. strLog = "APP_STATUS_DETSHARE_BEGIN";
  948. break;
  949. case APP_STATUS_DETSHAR_END:
  950. strLog = "APP_STATUS_DETSHAR_END";
  951. break;
  952. case APP_STATUS_CAL_BEGIN:
  953. strLog = "APP_STATUS_CAL_BEGIN";
  954. break;
  955. case APP_STATUS_CAL_END:
  956. strLog = "APP_STATUS_CAL_END";
  957. m_bInCalibrating = false;
  958. break;
  959. default:
  960. break;
  961. }
  962. FINFO("Enter exam: {$}", strLog.c_str());
  963. m_eAppStatus = eStatus;
  964. return true;
  965. }
  966. /***
  967. ** 说明:连接
  968. ** 加载SDK,初始化SDK,连接探测器等初始化操作
  969. ** 参数:strWorkPath,初始化SDK必须的conf路径
  970. ***/
  971. bool YuyingCtrl::Connect(FPDDeviceYuying* pDrvDPC, string strWorkPath)
  972. {
  973. FINFO("--Func-- Connect");
  974. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  975. {
  976. FWARN("Not current DPC, return true");
  977. return true;
  978. }
  979. StartInitFPDThread();
  980. FINFO("=== Connect detector OK ===");
  981. return true;
  982. }
  983. /***
  984. ** 说明:退出
  985. ** 释放SDK
  986. ***/
  987. bool YuyingCtrl::DisConnect(nsDPC::FPDDeviceYuying* pDrvDPC)
  988. {
  989. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  990. {
  991. FWARN("Not current DPC, return");
  992. return true;
  993. }
  994. FINFO("--Func-- DisConnect");
  995. FINFO("DicConnect DoNothing");
  996. FINFO("DisConnect Over");
  997. return true;
  998. }
  999. /***
  1000. ** 说明:设置当前的曝光模式
  1001. ** 参数:nLogicMode,从配置文件读取,与SDK配置application mode对应
  1002. ***/
  1003. bool YuyingCtrl::SelectExamMode(int nLogicMode, nsDPC::FPDDeviceYuying* pDrvDPC)
  1004. {
  1005. FINFO("YuyingCtrl::SelectExamMode start");
  1006. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1007. {
  1008. FWARN("Not current DPC {$}, {$} != {$} ,return", pDrvDPC, (*m_pDPC2PanelID)[pDrvDPC], m_nDetectorIndex);
  1009. return false;
  1010. }
  1011. if (m_stDeviceIndex[m_nDetectorIndex].bConnectStatus == false)
  1012. {
  1013. FERROR("Current detector {$} is not connect, return\n", m_nDetectorIndex);
  1014. return false;
  1015. }
  1016. FINFO("SelectExamMode({$})", nLogicMode);
  1017. if (m_nCurrentMode == nLogicMode) //同样appmode下没必要再次走下面的流程
  1018. {
  1019. FINFO("Same appmode, return true");
  1020. return true;
  1021. }
  1022. m_nCurrentMode = nLogicMode;
  1023. try
  1024. {
  1025. m_nRawImgHeight = m_stDeviceIndex[m_nDetectorIndex].nRawHeight;
  1026. m_nRawImgWidth = m_stDeviceIndex[m_nDetectorIndex].nRawWidth;
  1027. m_nImageWidth = m_stDeviceIndex[m_nDetectorIndex].nFullImageWidth;
  1028. m_nImageHeight = m_stDeviceIndex[m_nDetectorIndex].nFullImageHeight;
  1029. m_nLeftOffset = m_stDeviceIndex[m_nDetectorIndex].nImageLeftOffset;
  1030. m_nTopOffset = m_stDeviceIndex[m_nDetectorIndex].nImageTopOffset;
  1031. m_nRightOffset = m_stDeviceIndex[m_nDetectorIndex].nImageRightOffset;
  1032. m_nBottomOffset = m_stDeviceIndex[m_nDetectorIndex].nImageBottomOffset;
  1033. m_nImgBits = m_stDeviceIndex[m_nDetectorIndex].nImageBits;
  1034. m_nPixelPitch = m_stDeviceIndex[m_nDetectorIndex].nPixelSpace;
  1035. m_nSaveRaw = m_stDeviceIndex[m_nDetectorIndex].nSaveRaw;
  1036. FINFO("Raw({$}*{$}), Effective({$}*{$}), Offset({$} {$} {$} {$}), Bits({$}), PixelPitch({$}), SaveRaw({$})",
  1037. m_nRawImgWidth, m_nRawImgHeight, m_nImageWidth, m_nImageHeight, m_nTopOffset, m_nBottomOffset, m_nLeftOffset, m_nRightOffset,
  1038. m_nImgBits, m_nPixelPitch, m_nSaveRaw);
  1039. string strCoef = (string)m_ModeConfig["Sensitivity"];
  1040. FINFO("Sensitivity: {$}", strCoef.c_str());
  1041. m_nPreviewWidth = m_stDeviceIndex[m_nDetectorIndex].nPreviewWidth;
  1042. m_nPreviewHeight = m_stDeviceIndex[m_nDetectorIndex].nPreviewHeight;
  1043. m_bPreviewEnable = m_stDeviceIndex[m_nDetectorIndex].bPreviewEnable;
  1044. FINFO("Preview size(W*H {$}*{$}), PreviewEnable({$})", m_nPreviewWidth, m_nPreviewHeight, m_bPreviewEnable);
  1045. }
  1046. catch (ResDataObjectExption& exp)
  1047. {
  1048. FERROR("Get config failed: {$}", exp.what());
  1049. }
  1050. if (m_pImgBuffer)
  1051. {
  1052. delete[] m_pImgBuffer;
  1053. m_pImgBuffer = nullptr;
  1054. }
  1055. m_pImgBuffer = new WORD[m_nImageHeight * m_nImageWidth];
  1056. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nDetectorIndex, "", m_nImageWidth);
  1057. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nDetectorIndex, "", m_nImageHeight);
  1058. ConfFeedback(EVT_CONF_RAW_BITS, m_nDetectorIndex, "", m_nImgBits);
  1059. ConfFeedback(EVT_CONF_PIXELSPACE, m_nDetectorIndex, "", m_nPixelPitch);
  1060. ConfFeedback(EVT_CONF_PREVIEW_WIDTH, m_nDetectorIndex, "", m_nPreviewWidth);
  1061. ConfFeedback(EVT_CONF_PREVIEW_HIGHT, m_nDetectorIndex, "", m_nPreviewHeight);
  1062. FINFO("selectExamMode {$} over \n", m_nCurrentMode);
  1063. return true;
  1064. }
  1065. bool YuyingCtrl::StartOffsetThread()
  1066. {
  1067. if (m_pOffsetThread == nullptr)
  1068. {
  1069. DWORD m_NotifyThreadID;
  1070. m_pOffsetThread = CreateThread(0, 0, OffsetThread, this, 0, &m_NotifyThreadID);
  1071. if (m_pOffsetThread == nullptr)
  1072. {
  1073. FWARN("Start Offset Thread Failed");
  1074. return false;
  1075. }
  1076. }
  1077. return true;
  1078. }
  1079. DWORD YuyingCtrl::OffsetThread(LPVOID pParam)
  1080. {
  1081. YuyingCtrl* pCurPanel = (YuyingCtrl*)pParam;
  1082. if (pCurPanel == nullptr)
  1083. {
  1084. return false;
  1085. }
  1086. FINFO("OffsetThread");
  1087. pCurPanel->StatusFeedback(EVT_STATUS_PANEL, PANEL_OFFSET_FINISH);
  1088. pCurPanel->m_pOffsetThread = nullptr;
  1089. return true;
  1090. }
  1091. /********************************************************************/
  1092. //功能:Yuying没有曝光窗口关闭的消息,启动线程,等待500ms曝光窗口过后,模拟发送曝光窗口关闭的消息给HW层
  1093. /********************************************************************/
  1094. bool YuyingCtrl::StartXWindowOffThread()
  1095. {
  1096. if (m_pXWindowoffThread == nullptr)
  1097. {
  1098. DWORD m_NotifyThreadID;
  1099. m_pXWindowoffThread = CreateThread(0, 0, XWindowOffThread, this, 0, &m_NotifyThreadID);
  1100. if (m_pXWindowoffThread == nullptr)
  1101. {
  1102. FWARN("Start Inner Exp Thread Failed");
  1103. return false;
  1104. }
  1105. }
  1106. return true;
  1107. }
  1108. /********************************************************************/
  1109. //功能:Yuying没有曝光窗口关闭的消息,启动线程,等待500ms曝光窗口过后,模拟发送曝光窗口关闭的消息给HW层
  1110. /********************************************************************/
  1111. DWORD YuyingCtrl::XWindowOffThread(LPVOID pParam)
  1112. {
  1113. YuyingCtrl* pCurPanel = (YuyingCtrl*)pParam;
  1114. if (pCurPanel == nullptr)
  1115. {
  1116. return false;
  1117. }
  1118. DWORD dwTimer = pCurPanel->m_stDeviceIndex[pCurPanel->m_nDetectorIndex].nXWindow;
  1119. DWORD dwResult = WaitForSingleObject(pCurPanel->m_hWindowOffEvent, dwTimer);
  1120. FINFO("Simulate XWINDOW_OFF");
  1121. pCurPanel->StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  1122. pCurPanel->m_pXWindowoffThread = nullptr;
  1123. return true;
  1124. }
  1125. /***
  1126. ** 说明:曝光前的准备流程
  1127. ***/
  1128. RET_STATUS YuyingCtrl::PrepareAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC)
  1129. {
  1130. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1131. {
  1132. FWARN("Not current DPC, return");
  1133. return RET_STATUS::RET_FAILED;
  1134. }
  1135. if (m_stDeviceIndex[m_nDetectorIndex].bConnectStatus == false)
  1136. {
  1137. FINFO("Current detector is not connect, return");
  1138. return RET_STATUS::RET_FAILED;
  1139. }
  1140. int nTempTriggerMode = m_stDeviceIndex[m_nDetectorIndex].nSyncMode;
  1141. if (ModeType::Idle == nTempTriggerMode)
  1142. {
  1143. FINFO("Idle");
  1144. }
  1145. else if (ModeType::Software_Mode == nTempTriggerMode) //软同步
  1146. {
  1147. FINFO("Softerware mode");
  1148. }
  1149. else if (ModeType::AED_Offset_Mode == nTempTriggerMode) //AED_Offset
  1150. {
  1151. FINFO("AED offset mode");
  1152. }
  1153. else if (ModeType::AED_Mode == nTempTriggerMode) //Free同步
  1154. {
  1155. FINFO("AED mode");
  1156. }
  1157. else if (ModeType::Outer_Mode == nTempTriggerMode) //外同步
  1158. {
  1159. FINFO("Outer mode");
  1160. }
  1161. else if (ModeType::Freerun_Mode == nTempTriggerMode) //Freerun
  1162. {
  1163. FINFO("Freerun mode");
  1164. }
  1165. else
  1166. {
  1167. FERROR("The detector get undefined sync mode");
  1168. }
  1169. m_bAEDWorkFlag = false;
  1170. return RET_STATUS::RET_SUCCEED;
  1171. }
  1172. RET_STATUS YuyingCtrl::StartAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC)
  1173. {
  1174. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1175. {
  1176. FWARN("Not current DPC, return");
  1177. return RET_STATUS::RET_FAILED;
  1178. }
  1179. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  1180. if (!m_stDeviceIndex[m_nDetectorIndex].bConnectStatus)
  1181. {
  1182. FWARN("Detector not in connection when start acq, return failed");
  1183. return RET_STATUS::RET_FAILED;
  1184. }
  1185. StatusFeedback(EVT_STATUS_ACQUISITION, PANEL_EVENT_START);
  1186. m_bInExposure = true;
  1187. int nTempTriggerMode = m_stDeviceIndex[m_nDetectorIndex].nSyncMode;
  1188. if (ModeType::Idle == nTempTriggerMode)
  1189. {
  1190. FINFO("Idle");
  1191. }
  1192. else if (ModeType::Software_Mode == nTempTriggerMode) //软同步
  1193. {
  1194. FINFO("Softerware mode");
  1195. int nRet = API_YI_FPD_Capture_Image(m_vecDetectorID[m_nDetectorIndex].c_str(), 1);
  1196. if (TestError(m_nDetectorID, nRet, "Capture_Image"))
  1197. {
  1198. FERROR("Capture image failed");
  1199. }
  1200. }
  1201. else if (ModeType::AED_Offset_Mode == nTempTriggerMode) //AED_Offset
  1202. {
  1203. FINFO("AED offset mode");
  1204. }
  1205. else if (ModeType::AED_Mode == nTempTriggerMode) //Free同步
  1206. {
  1207. FINFO("AED mode");
  1208. }
  1209. else if (ModeType::Outer_Mode == nTempTriggerMode) //外同步
  1210. {
  1211. FINFO("Outer mode");
  1212. }
  1213. else if (ModeType::Freerun_Mode == nTempTriggerMode) //Freerun
  1214. {
  1215. FINFO("Freerun mode");
  1216. }
  1217. else
  1218. {
  1219. FERROR("The detector get undefined sync mode");
  1220. }
  1221. StatusFeedback(EVT_STATUS_ACQUISITION, PANEL_EVENT_END_OK);
  1222. FINFO("ACQ==============================");
  1223. StatusFeedback(EVT_STATUS_PANEL, PANEL_START_ACQ);
  1224. if (m_stDeviceIndex[m_nDetectorIndex].nSyncMode == ModeType::AED_Mode)
  1225. {
  1226. m_bAEDWorkFlag = true;
  1227. }
  1228. return RET_STATUS::RET_SUCCEED;
  1229. }
  1230. RET_STATUS YuyingCtrl::StopAcquisition(nsDPC::FPDDeviceYuying* pDrvDPC)
  1231. {
  1232. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1233. {
  1234. FWARN("Not current DPC, return");
  1235. return RET_STATUS::RET_FAILED;
  1236. }
  1237. return RET_STATUS::RET_SUCCEED;
  1238. }
  1239. bool YuyingCtrl::GetYuyingPanelCalibItem()
  1240. {
  1241. m_listCalibItem.clear();
  1242. try {
  1243. int nModeCount = (int)m_ModeConfig["ModeTable"].GetKeyCount("DetectorMode");
  1244. for (int i = 0; i < nModeCount; i++)
  1245. {
  1246. int nCalibModeCount = (int)m_ModeConfig["ModeTable"][i]["CalibConfig"].GetKeyCount("NodeInfo");
  1247. for (int j = 0; j < nCalibModeCount; j++)
  1248. {
  1249. RefrenceCal stRefCal;
  1250. stRefCal.nAvgNum = (int)m_ModeConfig["ModeTable"][i]["CalibConfig"][j]["ImgCount"];
  1251. stRefCal.nReferDose = (int)m_ModeConfig["ModeTable"][i]["CalibConfig"][j]["Dose"];
  1252. m_listCalibItem.push_back(stRefCal);
  1253. }
  1254. }
  1255. }
  1256. catch (...)
  1257. {
  1258. return false;
  1259. }
  1260. return true;
  1261. }
  1262. bool YuyingCtrl::InitCalibration()
  1263. {
  1264. m_nDefectExpTimes = 0;
  1265. m_nDefectTotalTimes = 0;
  1266. m_nGainExpTimes = 0;
  1267. FINFO("InitCalibration Current Active FD Index:{$}", m_nDetectorIndex);
  1268. if (m_nPanelCount < 0)
  1269. {
  1270. return false;
  1271. }
  1272. string strMode = "STE";
  1273. m_bInCalibrating = true;
  1274. bool ret = GetYuyingPanelCalibItem();
  1275. if (!ret)
  1276. {
  1277. FERROR("GetPanelCalibItem failed\n");
  1278. return false;
  1279. }
  1280. list<RefrenceCal>::iterator iter;
  1281. for (iter = m_listCalibItem.begin(); iter != m_listCalibItem.end(); iter++)
  1282. {
  1283. FINFO("Calibration dose:{$},Number:{$}", iter->nReferDose, iter->nAvgNum);
  1284. }
  1285. m_iterCalibDose = m_listCalibItem.begin();
  1286. m_nDoseParam = m_iterCalibDose->nReferDose;
  1287. DataFeedback(EVT_DATA_DOSEPARAM, NULL, m_nDoseParam);
  1288. FINFO("First Calibration dose:{$},Number:{$},m_nDoseParam = {$}", m_iterCalibDose->nReferDose, m_iterCalibDose->nAvgNum, m_nDoseParam);
  1289. m_nGainTotalFrames = 0;
  1290. return true;
  1291. }
  1292. /***
  1293. ** 说明:激活校正
  1294. ** 增益校正(探测器采用post-offset,暗场校正基本没用了)时拿到dose回调,算作执行完毕
  1295. ***/
  1296. RET_STATUS YuyingCtrl::ActiveCalibration(CCOS_CALIBRATION_TYPE Type, nsDPC::FPDDeviceYuying* pDrvDPC)
  1297. {
  1298. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1299. {
  1300. FWARN("Not current DPC, return");
  1301. return RET_STATUS::RET_FAILED;
  1302. }
  1303. RET_STATUS Ret = RET_STATUS::RET_SUCCEED;
  1304. int nTemp = (int)m_ModeConfig["Attached"];
  1305. if (nTemp == 0)
  1306. {
  1307. FWARN("Current detector({$}) is not attached, return failed", m_nDetectorIndex);
  1308. return RET_STATUS::RET_FAILED;
  1309. }
  1310. if (CCOS_CALIBRATION_TYPE_DARK == Type)
  1311. {
  1312. FINFO("ActiveDarkCalibration");
  1313. }
  1314. else if (CCOS_CALIBRATION_TYPE_XRAY == Type)
  1315. {
  1316. FINFO("ActiveXrayCalibration");
  1317. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_START);
  1318. if (!InitCalibration())
  1319. {
  1320. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_ERROR);
  1321. return RET_STATUS::RET_FAILED;
  1322. }
  1323. }
  1324. else
  1325. {
  1326. FERROR("Active not supported calibration({$}), return! \n", (int)Type);
  1327. Ret = RET_STATUS::RET_NOSUPPORT;
  1328. return Ret;
  1329. }
  1330. m_eCaliType = Type;
  1331. return Ret;
  1332. }
  1333. /***
  1334. ** 说明:开始校正(状态机FrameStart)
  1335. ** Salmon项目只有普通rad模式,所以本接口基本没用
  1336. ***/
  1337. RET_STATUS YuyingCtrl::StartCalibration(nsDPC::FPDDeviceYuying* pDrvDPC)
  1338. {
  1339. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1340. {
  1341. FWARN("Not current DPC, return");
  1342. return RET_STATUS::RET_FAILED;
  1343. }
  1344. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  1345. int nTemp = (int)m_ModeConfig["Attached"];
  1346. if (nTemp == 0)
  1347. {
  1348. FWARN("Current detector({$}) is not attached, return failed", m_nDetectorIndex);
  1349. return Ret;
  1350. }
  1351. if (CCOS_CALIBRATION_TYPE_DARK == m_eCaliType)
  1352. {
  1353. FINFO("StartDarkCalibration \n");
  1354. StartOffsetThread();
  1355. Ret = RET_STATUS::RET_SUCCEED;
  1356. }
  1357. else
  1358. {
  1359. FINFO("StartXrayCalibration \n");
  1360. Ret = RET_STATUS::RET_SUCCEED;
  1361. }
  1362. return Ret;
  1363. }
  1364. bool YuyingCtrl::ConfirmCalibration()
  1365. {
  1366. FINFO("Confirm Calibration");
  1367. return true;
  1368. }
  1369. bool YuyingCtrl::AcceptCalibration()
  1370. {
  1371. if ((PANEL_GAIN_CAL == m_nCalibStatus) && (m_nGainExpTimes >= m_nGainTotalFrames))
  1372. {
  1373. FINFO("Gain exposure over");
  1374. if (CreateCalibrationFile())
  1375. {
  1376. m_iterCalibDose++;
  1377. m_nDoseParam = m_iterCalibDose->nReferDose;
  1378. FINFO("Next Gain Calibration dose:{$},Number:{$}", m_iterCalibDose->nReferDose, m_iterCalibDose->nAvgNum);
  1379. }
  1380. else
  1381. {
  1382. StatusFeedback(EVT_STATUS_SINGLEEXP, PANEL_EVENT_END_ERROR);
  1383. }
  1384. }
  1385. else if (PANEL_DEFECT_CAL == m_nCalibStatus)
  1386. {
  1387. int nAvgNum = m_iterCalibDose->nAvgNum;
  1388. if (m_nDefectExpTimes >= nAvgNum)
  1389. {
  1390. m_nDefectExpTimes = 0;
  1391. m_iterCalibDose++;
  1392. m_nDoseParam = m_iterCalibDose->nReferDose;
  1393. FINFO("Next Defect Calibration dose:{$},Number:{$}", m_iterCalibDose->nReferDose, m_iterCalibDose->nAvgNum);
  1394. }
  1395. if (m_nDefectTotalTimes >= m_nDefectTotalFrames)
  1396. {
  1397. FINFO("Defect exposure over");
  1398. StatusFeedback(EVT_STATUS_PREPARE_EDNCALIBRATION, 0);
  1399. if (CreateCalibrationFile())
  1400. {
  1401. StatusFeedback(EVT_STATUS_CALIBRATIOIN, PANEL_EVENT_END_OK);
  1402. }
  1403. else
  1404. {
  1405. StatusFeedback(EVT_STATUS_SINGLEEXP, PANEL_EVENT_END_ERROR);
  1406. }
  1407. return true;
  1408. }
  1409. }
  1410. DataFeedback(EVT_DATA_DOSEPARAM, NULL, m_nDoseParam);
  1411. return true;
  1412. }
  1413. bool YuyingCtrl::CreateCalibrationFile()
  1414. {
  1415. return true;
  1416. }
  1417. bool YuyingCtrl::RejectCalibration()
  1418. {
  1419. FINFO("Reject Calibration");
  1420. return true;
  1421. }
  1422. /***
  1423. ** 说明:终止校正
  1424. ***/
  1425. RET_STATUS YuyingCtrl::AbortCalibration(nsDPC::FPDDeviceYuying* pDrvDPC)
  1426. {
  1427. _AutoLocker scLocker(this);
  1428. if (!m_bInCalibrating)
  1429. {
  1430. FWARN("Not in calibration status,omit it.");
  1431. return RET_STATUS::RET_SUCCEED;
  1432. }
  1433. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1434. {
  1435. FWARN("Not current DPC,return");
  1436. return RET_STATUS::RET_FAILED;
  1437. }
  1438. FINFO("AbortCalibration");
  1439. m_eCaliType = CCOS_CALIBRATION_TYPE_NONE; //恢复初值
  1440. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  1441. if (m_nPanelCount < 0)
  1442. {
  1443. FINFO("No active detector");
  1444. return Ret;
  1445. }
  1446. if (m_bInCalibrating)
  1447. {
  1448. SetMarsCorrection(m_nDetectorIndex);
  1449. }
  1450. else
  1451. {
  1452. FINFO("Omit Abort Calibration");
  1453. }
  1454. Ret = RET_STATUS::RET_SUCCEED;
  1455. return Ret;
  1456. }
  1457. /***
  1458. ** 说明:准备校正(状态机FramePrep)
  1459. ** 曝光使能过程,使探测器开窗
  1460. ***/
  1461. RET_STATUS YuyingCtrl::PrepareCalibration(nsDPC::FPDDeviceYuying* pDrvDPC)
  1462. {
  1463. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1464. {
  1465. FWARN("Not current DPC, return");
  1466. return RET_STATUS::RET_FAILED;
  1467. }
  1468. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  1469. int nTemp = (int)m_ModeConfig["Attached"];
  1470. if (nTemp == 0)
  1471. {
  1472. FWARN("Current detector({$}) is not attached, return failed", m_nDetectorIndex);
  1473. return Ret;
  1474. }
  1475. Ret = RET_STATUS::RET_SUCCEED;
  1476. FDEBUG("PrepareCalibration Over");
  1477. return Ret;
  1478. }
  1479. /***
  1480. ** 说明:结束校正
  1481. ** DPC处理完校正报告后调用,此处上传map、报告等文件
  1482. ***/
  1483. RET_STATUS YuyingCtrl::CompleteCalibration(nsDPC::FPDDeviceYuying* pDrvDPC)
  1484. {
  1485. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1486. {
  1487. FWARN("Not current DPC, return");
  1488. return RET_STATUS::RET_FAILED;
  1489. }
  1490. SetEvent(m_hEndCalibEvent);
  1491. FINFO("CompleteCalibration");
  1492. return RET_STATUS::RET_SUCCEED;
  1493. }
  1494. void YuyingCtrl::OnEndCalibraion()
  1495. {
  1496. FINFO("OnEndCalibraion start");
  1497. m_bInCalibrating = false;
  1498. bool bLTE = false;
  1499. bool bRet = true;
  1500. SetMarsCorrection(m_nDetectorIndex);
  1501. string szTemp;
  1502. szTemp = m_stDeviceIndex[m_nDetectorIndex].strCalibrationDate;
  1503. if (bRet)
  1504. {
  1505. StatusFeedback(EVT_STATUS_SAVECALIB, PANEL_EVENT_END);
  1506. }
  1507. else
  1508. {
  1509. StatusFeedback(EVT_STATUS_SAVECALIB, PANEL_EVENT_END_ERROR);
  1510. }
  1511. FINFO("Calibration completed!");
  1512. return;
  1513. }
  1514. bool YuyingCtrl::RecoverLastImage()
  1515. {
  1516. FINFO("Recover Last Image");
  1517. return RecoverImage();
  1518. }
  1519. bool YuyingCtrl::RecoverLastImageAuto()
  1520. {
  1521. FINFO("Recover Last Image Auto");
  1522. return true;
  1523. }
  1524. /********************************************************************/
  1525. //功能:对图像镜像
  1526. /********************************************************************/
  1527. bool YuyingCtrl::FlipX(WORD* pData, int nWidth, int nHeight)
  1528. {
  1529. int j = 0;
  1530. int i = 0;
  1531. FINFO("Flip Image Width:{$},Height:{$}", nWidth, nHeight);
  1532. WORD temp;
  1533. //修改翻转的判断,之前的代码会导致中央区域多翻转一个像素
  1534. for (i = 0; i < nHeight; i++)
  1535. {
  1536. for (j = 0; j < nWidth / 2; j++)
  1537. {
  1538. temp = pData[i * nWidth + j];
  1539. pData[i * nWidth + j] = pData[(i + 1) * nWidth - j - 1];
  1540. pData[(i + 1) * nWidth - j - 1] = temp;
  1541. }
  1542. }
  1543. FINFO("Flip Image Over");
  1544. return true;
  1545. }
  1546. /********************************************************************/
  1547. //功能:对SDK输出的图像,先旋转90度,再做镜像
  1548. /********************************************************************/
  1549. bool YuyingCtrl::FlipXRotate90(WORD* pData, int nWidth, int nHeight)
  1550. {
  1551. FINFO("Rotate 270 angle");
  1552. WORD* ptempData = new WORD[nWidth * nHeight];
  1553. memcpy(ptempData, pData, nWidth * nHeight * sizeof(WORD));
  1554. for (int i = 0; i < nWidth; i++)
  1555. for (int j = 0; j < nHeight; j++)
  1556. pData[i * nWidth + j] = ptempData[j * nWidth + (nWidth - 1 - i)];
  1557. delete[] ptempData;
  1558. ptempData = nullptr;
  1559. FlipX(pData, nWidth, nHeight);
  1560. return true;
  1561. }
  1562. //获取电池电量
  1563. bool YuyingCtrl::CheckBattery(int nDetectorID)
  1564. {
  1565. if (!m_stDeviceIndex[nDetectorID].bBatteryEnable)
  1566. {
  1567. FINFO("Battery disable");
  1568. return true;
  1569. }
  1570. return true;
  1571. }
  1572. //读取探测器WIFI
  1573. bool YuyingCtrl::ReadWifiStatus(int nDetectorID)
  1574. {
  1575. int nPanelID = nDetectorID + 1;
  1576. if (!m_stDeviceIndex[nDetectorID].bWireless)
  1577. {
  1578. return false;
  1579. }
  1580. FINFO("Read Wifi");
  1581. FWARN("Read Wifi Failed");
  1582. return false;
  1583. }
  1584. bool YuyingCtrl::CheckWiFi(int nDetectorID)
  1585. {
  1586. if (!m_stDeviceIndex[nDetectorID].bWifiEnable)
  1587. {
  1588. FINFO("Wifi disable");
  1589. return true;
  1590. }
  1591. return true;
  1592. }
  1593. bool YuyingCtrl::CheckTemperature(int nDetectorID)
  1594. {
  1595. int nPanelID = nDetectorID + 1;
  1596. if (!m_stDeviceIndex[nDetectorID].bTemperatureEnable)
  1597. {
  1598. FINFO("Temperature disable");
  1599. return true;
  1600. }
  1601. float fTemperature1 = 0.0f;
  1602. return true;
  1603. }
  1604. // 探测器是板内校正
  1605. // 设置探测器端校正参数,加载校正文件
  1606. bool YuyingCtrl::SetMarsCorrection(int nDetectorID)
  1607. {
  1608. FINFO("Set Mars Correction Option");
  1609. return true;
  1610. }
  1611. //设置探测器的工作模式
  1612. bool YuyingCtrl::SetDetectorWorkMode(int nDetectorID, const char* szFPD, int nWorkMode)
  1613. {
  1614. FINFO("Set detector({$})({$}) work mode: {$}", nDetectorID, szFPD, nWorkMode);
  1615. if (ModeType::Idle == nWorkMode)
  1616. {
  1617. FINFO("Set workmode Idle");
  1618. }
  1619. else if (ModeType::Software_Mode == nWorkMode)
  1620. {
  1621. FINFO("Set workmode software");
  1622. }
  1623. else if (ModeType::AED_Offset_Mode == nWorkMode)
  1624. {
  1625. FINFO("Set workmode AED offset");
  1626. }
  1627. else if (ModeType::AED_Mode == nWorkMode) //AED触发
  1628. {
  1629. FINFO("Set workmode AED");
  1630. }
  1631. else if (ModeType::Outer_Mode == nWorkMode) //硬同步(直连或者同步盒)
  1632. {
  1633. FINFO("Set Hardware outer");
  1634. }
  1635. int nRet = API_YI_FPD_Set_Work_Mode(szFPD, (ModeType)nWorkMode);
  1636. if (TestError(nDetectorID, nRet, "API_YI_FPD_Set_Work_Mode"))
  1637. {
  1638. FERROR("Set work mode failed!!!");
  1639. return false;
  1640. }
  1641. else
  1642. {
  1643. FINFO("Set work mode success");
  1644. }
  1645. FINFO("SetDetectorWorkMode over");
  1646. return true;
  1647. }
  1648. //加载校正
  1649. bool CCOS::Dev::Detail::Detector::YuyingCtrl::FPDLoadCorrectFiles(int nDetectorID, const char* szDetectorID)
  1650. {
  1651. FINFO("FPDLoadCorrectFiles");
  1652. int nRet = 0;
  1653. std::string strGainPath = m_stDeviceIndex[m_nDetectorIndex].strGainPath;
  1654. std::string strDefectPath = m_stDeviceIndex[m_nDetectorIndex].strDefectPath;
  1655. if (m_stDeviceIndex[m_nDetectorIndex].bGainDefectEnable)
  1656. {
  1657. nRet = API_YI_Load_Gain_Tmp_File(szDetectorID, strGainPath.c_str()); //加载Gain模板
  1658. if (TestError(nDetectorID, nRet, "Load_Gain"))
  1659. {
  1660. FERROR("Load gain template failed!");
  1661. }
  1662. else
  1663. {
  1664. FINFO("Load gain tempplate success");
  1665. }
  1666. nRet = API_YI_Load_Defect_Tmp_File(szDetectorID, strDefectPath.c_str());
  1667. if (TestError(nDetectorID, nRet, "Load_Defect"))
  1668. {
  1669. FERROR("Load defect template failed!");
  1670. }
  1671. else
  1672. {
  1673. FINFO("Load defect template success");
  1674. }
  1675. int nCorrectType = Do_Gain | Do_Defect;
  1676. nRet = API_YI_Set_Correct_Type(szDetectorID, nCorrectType);
  1677. if (TestError(nDetectorID, nRet, "Set_Correction"))
  1678. {
  1679. FERROR("Set correction failed!");
  1680. }
  1681. else
  1682. {
  1683. FINFO("Set correction success");
  1684. }
  1685. }
  1686. else
  1687. {
  1688. FINFO("");
  1689. }
  1690. //设置探测器做Offset校正
  1691. nRet = API_YI_FPD_Subtract_Offset(szDetectorID, true);
  1692. if (TestError(nDetectorID, nRet, "Set_Offset"))
  1693. {
  1694. FERROR("Set offset failed!");
  1695. }
  1696. else
  1697. {
  1698. FINFO("Set offset success");
  1699. }
  1700. FINFO("FPDLoadCorrectFiles over");
  1701. return true;
  1702. }
  1703. //-----------------------------------------------------------------------------
  1704. // 函数描述 : 恢复图像:将曝光未获取成功的图像,重新获取出来
  1705. //-----------------------------------------------------------------------------
  1706. bool YuyingCtrl::RecoverImage()
  1707. {
  1708. return true;
  1709. }
  1710. bool YuyingCtrl::IsConnected(string strIP)
  1711. {
  1712. FINFO("Check ping {$}", strIP);
  1713. CMyPingip obPingIp;
  1714. StatusFeedback(EVT_STATUS_PING, 0, "true");
  1715. if (!obPingIp.PingFunction(strIP.c_str()))
  1716. {
  1717. FINFO("ping {$} Failed", strIP);
  1718. StatusFeedback(EVT_STATUS_PING, 0, "false");
  1719. return false;
  1720. }
  1721. return true;
  1722. }
  1723. //-----------------------------------------------------------------------------
  1724. // Reconnect探测器(上层有button)
  1725. //-----------------------------------------------------------------------------
  1726. bool YuyingCtrl::ResetFPD(nsDPC::FPDDeviceYuying* pDrvDPC)
  1727. {
  1728. FINFO("Reset FPD");
  1729. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  1730. {
  1731. FWARN("Not current DPC, return");
  1732. return false;
  1733. }
  1734. FINFO("Panel Count {$}\n", m_nPanelCount);
  1735. for (int nDetectorID = 0; nDetectorID < m_nPanelCount; nDetectorID++)
  1736. {
  1737. if (!m_stDeviceIndex[nDetectorID].bWireless)
  1738. {
  1739. FERROR("Omit reconnection in fixed FD");
  1740. }
  1741. else
  1742. {
  1743. StartInitFPDThread();
  1744. }
  1745. }
  1746. return true;
  1747. }
  1748. void YuyingCtrl::OnProcessPreImg()
  1749. {
  1750. if (m_bPreviewEnable)
  1751. {
  1752. DataFeedback(EVT_DATA_PREVIEW_IMAGE, m_pwPreviewImg);
  1753. }
  1754. }
  1755. void YuyingCtrl::OnProcessImg()
  1756. {
  1757. if (m_nLeftOffset != 0 || m_nTopOffset != 0)
  1758. {
  1759. if (m_nSaveRaw)
  1760. {
  1761. }
  1762. FDEBUG("Begin get effect image, m_nRawImgWidth {$}\n", m_nRawImgWidth);
  1763. if (!GetEffectiveImage(m_pImgBuffer, m_pwRawImageData, m_nRawImgWidth))
  1764. {
  1765. FERROR("Get effect image failed");
  1766. return;
  1767. }
  1768. FDEBUG("Get effect image over");
  1769. }
  1770. else
  1771. {
  1772. memcpy(m_pImgBuffer, m_pwRawImageData, m_nImageHeight * m_nImageWidth * sizeof(WORD));
  1773. }
  1774. DataFeedback(EVT_DATA_RAW_IMAGE, m_pImgBuffer);
  1775. }
  1776. // pOutImg: 裁剪后图像; pInImg: 裁剪前图像; nInWidth: 裁剪前图像宽度
  1777. bool YuyingCtrl::GetEffectiveImage(WORD* pOutImg, WORD* pInImg, int nInWidth)
  1778. {
  1779. if (pOutImg == nullptr || pInImg == nullptr || nInWidth < 0)
  1780. {
  1781. FERROR("Illegal parameter, can not get effective image");
  1782. return false;
  1783. }
  1784. try
  1785. {
  1786. for (int i = 0; i < m_nImageHeight; i++)
  1787. {
  1788. memcpy(pOutImg + i * m_nImageWidth,
  1789. pInImg + (i + m_nTopOffset) * nInWidth + m_nLeftOffset,
  1790. m_nImageWidth * sizeof(WORD));
  1791. }
  1792. }
  1793. catch (...)
  1794. {
  1795. FERROR("Get effective image crashed. m_nImageWidth {$},m_nImageHeight {$},m_nWidthOffset {$},m_nHeightOffset {$},m_nBottomOffset {$}\n",
  1796. m_nImageWidth, m_nImageHeight, m_nLeftOffset, m_nTopOffset, m_nBottomOffset);
  1797. return false;
  1798. }
  1799. return true;
  1800. }
  1801. /***
  1802. * 保存RAW图像
  1803. ***/
  1804. bool YuyingCtrl::SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight)
  1805. {
  1806. FINFO("Begin to Save {$} Image, width: {$}, height: {$}", pImgName, nWidth, nHeight);
  1807. if (pRawImg == nullptr || pImgName == nullptr)
  1808. {
  1809. return false;
  1810. }
  1811. string strImagePath = m_strAppPath + "\\rawdata\\" + pImgName;
  1812. FILE* fp;
  1813. if ((fp = fopen(strImagePath.c_str(), "wb")) == nullptr)
  1814. {
  1815. DWORD dw = GetLastError();
  1816. FERROR("fopen {$} failed, {$}", strImagePath.c_str(), dw);
  1817. return false;
  1818. }
  1819. fwrite(pRawImg, sizeof(WORD), nWidth * nHeight, fp);
  1820. fclose(fp);
  1821. FINFO("End to Save Raw Image");
  1822. return true;
  1823. }
  1824. //图像回调
  1825. bool YuyingCtrl::ImageReadyCallbackProcess(const char* pImage, int iFlag)
  1826. {
  1827. return g_pYuyingCtrl->onImageReadyCallbackProcess(pImage, iFlag);
  1828. }
  1829. //系统回调
  1830. bool YuyingCtrl::SystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent)
  1831. {
  1832. return g_pYuyingCtrl->onSystemInfoCallbackProcess(iCodeIndex, sContent);
  1833. }
  1834. bool YuyingCtrl::onImageReadyCallbackProcess(const char* pImage, int iFlag)
  1835. {
  1836. FINFO("onImageReadyCallbackProcess");
  1837. if (nullptr == pImage)
  1838. {
  1839. FWARN("Image Data is null");
  1840. return false;
  1841. }
  1842. StatusFeedback(EVT_STATUS_PANEL, PANEL_XRAY_ON);
  1843. if (ModeType::AED_Mode == m_stDeviceIndex[m_nDetectorIndex].nSyncMode)
  1844. {
  1845. while (!m_bAEDWorkFlag)
  1846. {
  1847. Sleep(20);
  1848. }
  1849. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1850. StartXWindowOffThread();
  1851. }
  1852. if (m_pwRawImageData)
  1853. {
  1854. delete[] m_pwRawImageData;
  1855. m_pwRawImageData = nullptr;
  1856. }
  1857. m_pwRawImageData = new WORD[m_nRawImgHeight * m_nRawImgWidth];
  1858. if (m_pwRawImageData == nullptr)
  1859. {
  1860. FWARN("Allocate Raw Image Failed");
  1861. return false;
  1862. }
  1863. memcpy(m_pwRawImageData, pImage, m_nRawImgHeight * m_nRawImgWidth * sizeof(WORD));
  1864. OnProcessImg();
  1865. return true;
  1866. }
  1867. bool YuyingCtrl::onSystemInfoCallbackProcess(SystemInfoCode iCodeIndex, const char* sContent)
  1868. {
  1869. switch (iCodeIndex)
  1870. {
  1871. case SIC_Exposure_Window_Open: //软同步或者硬同步发开窗
  1872. {
  1873. FINFO("SIC_Exposure_Window_Open");
  1874. if (ModeType::Software_Mode == m_stDeviceIndex[m_nDetectorIndex].nSyncMode || ModeType::Outer_Mode == m_stDeviceIndex[m_nDetectorIndex].nSyncMode)
  1875. {
  1876. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1877. }
  1878. break;
  1879. }
  1880. case SIC_Exposure_Winodw_Closed:
  1881. {
  1882. FINFO("SIC_Exposure_Winodw_Closed");
  1883. if (ModeType::Software_Mode == m_stDeviceIndex[m_nDetectorIndex].nSyncMode || ModeType::Outer_Mode == m_stDeviceIndex[m_nDetectorIndex].nSyncMode)
  1884. {
  1885. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  1886. }
  1887. break;
  1888. }
  1889. case SIC_Exposure_Window_Timeout:
  1890. {
  1891. FINFO("SIC_Exposure_Window_Timeout");
  1892. break;
  1893. }
  1894. case SIC_Device_Heart_Beat:
  1895. {
  1896. //FINFO("SIC_Device_Heart_Beat: {$}", sContent);
  1897. if (nullptr == sContent)
  1898. {
  1899. FINFO("null content");
  1900. break;
  1901. }
  1902. //温度
  1903. if (m_stDeviceIndex[m_nDetectorIndex].bTemperatureEnable)
  1904. {
  1905. const char* pTempera = strstr(sContent, "T:");
  1906. if (pTempera != nullptr)
  1907. {
  1908. float fTemperature = (float)atof(pTempera + 2);
  1909. StatusFeedback(EVT_STATUS_TEMPERATURE, 0, "", m_nDetectorIndex, fTemperature);
  1910. }
  1911. }
  1912. //湿度
  1913. if (m_stDeviceIndex[m_nDetectorIndex].bHumidityEnable)
  1914. {
  1915. const char* pHumidity = strstr(sContent, "H:");
  1916. if (pHumidity != nullptr)
  1917. {
  1918. int nHumidity = atoi(pHumidity + 2);
  1919. }
  1920. }
  1921. if (m_stDeviceIndex[m_nDetectorIndex].bBatteryEnable)
  1922. {
  1923. //供电方式(1电池供电,2电源供电)
  1924. const char* pPower = strstr(sContent, "P:");
  1925. int nChargingType = 0;
  1926. if (pPower != nullptr)
  1927. {
  1928. nChargingType = atoi(pPower + 2);
  1929. }
  1930. if (nChargingType == 1)
  1931. {
  1932. FINFO("Power mode: Battery");
  1933. }
  1934. else if (nChargingType == 2)
  1935. {
  1936. FINFO("Power mode: Cable");
  1937. }
  1938. else
  1939. {
  1940. FINFO("Undefined power mode");
  1941. }
  1942. //电量
  1943. const char* pBatt = strstr(sContent, "E:");
  1944. if (pBatt != nullptr)
  1945. {
  1946. int nBatteryValue = atoi(pBatt + 2);
  1947. StatusFeedback(EVT_STATUS_BATTERY_VALUE, nBatteryValue, "", m_nDetectorIndex);
  1948. }
  1949. }
  1950. //信号强度
  1951. if (m_stDeviceIndex[m_nDetectorIndex].bWifiEnable)
  1952. {
  1953. const char* pSignalValue = strstr(sContent, "S:");
  1954. if (pSignalValue != nullptr)
  1955. {
  1956. int nSignalValue = atoi(pSignalValue + 2);
  1957. StatusFeedback(EVT_STATUS_WIFI, nSignalValue, "", m_nDetectorIndex);
  1958. }
  1959. }
  1960. break;
  1961. }
  1962. case SIC_Physical_Connection_State:
  1963. {
  1964. FINFO("SIC_Physical_Connection_State: {$}", sContent ? sContent : "null");
  1965. if (nullptr == sContent)
  1966. {
  1967. FINFO("null content");
  1968. break;
  1969. }
  1970. if (sContent[0] == '0')
  1971. {
  1972. FINFO("Detector disconnect");
  1973. }
  1974. else
  1975. {
  1976. FINFO("Detector communication recovery");
  1977. }
  1978. break;
  1979. }
  1980. case SIC_Upload_Tmp_File_Begin:
  1981. {
  1982. FINFO("SIC_Upload_Tmp_File_Begin");
  1983. break;
  1984. }
  1985. case SIC_Upload_Tmp_File_End:
  1986. {
  1987. FINFO("SIC_Upload_Tmp_File_End");
  1988. break;
  1989. }
  1990. case SIC_TCP_Connection_State:
  1991. {
  1992. FINFO("SIC_TCP_Connection_State");
  1993. break;
  1994. }
  1995. case SIC_Power_Low:
  1996. {
  1997. FINFO("SIC_Power_Low");
  1998. break;
  1999. }
  2000. case SIC_Power_Down_Soon:
  2001. {
  2002. FINFO("SIC_Power_Down_Soon");
  2003. break;
  2004. }
  2005. case SIC_FPD_Sleep_State:
  2006. {
  2007. FINFO("SIC_FPD_Sleep_State");
  2008. break;
  2009. }
  2010. case SIC_FPD_MultiFrame_Index:
  2011. {
  2012. FINFO("SIC_FPD_MultiFrame_Index");
  2013. break;
  2014. }
  2015. case SIC_FPD_IndustryMode_Prepare_Rready:
  2016. {
  2017. FINFO("SIC_FPD_IndustryMode_Prepare_Rready");
  2018. break;
  2019. }
  2020. case SIC_FPD_MFM_Prepare_Ready:
  2021. {
  2022. FINFO("SIC_FPD_MFM_Prepare_Ready");
  2023. break;
  2024. }
  2025. default:
  2026. break;
  2027. }
  2028. return true;
  2029. }
  2030. //设置同步模式
  2031. bool YuyingCtrl::ActiveSyncMode(nsDPC::FPDDeviceYuying* pDrvDPC, int nSyncMode)
  2032. {
  2033. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nDetectorIndex)
  2034. {
  2035. FWARN("Not current DPC, return");
  2036. return false;
  2037. }
  2038. FINFO("ActiveSyncMode {$}", nSyncMode);
  2039. int tempSyncMode = 0;
  2040. if (nSyncMode == 1)
  2041. {
  2042. tempSyncMode = ModeType::Software_Mode;
  2043. }
  2044. else if (nSyncMode == 2)
  2045. {
  2046. tempSyncMode = ModeType::Outer_Mode;
  2047. }
  2048. else if (nSyncMode == 3)
  2049. {
  2050. tempSyncMode = ModeType::AED_Mode;
  2051. }
  2052. FINFO("To SetDetectorWorkMode {$}", tempSyncMode);
  2053. if (m_stDeviceIndex[m_nDetectorIndex].nSyncMode == tempSyncMode)
  2054. {
  2055. FINFO("Same sync mode, omit set sync mode");
  2056. return true;
  2057. }
  2058. const char* szDetectorID = m_vecDetectorID[m_nDetectorIndex].c_str();
  2059. if (SetDetectorWorkMode(m_nDetectorID, szDetectorID, tempSyncMode))
  2060. {
  2061. m_stDeviceIndex[m_nDetectorIndex].nSyncMode = tempSyncMode;
  2062. FINFO("Set detector sync mode into {$}", tempSyncMode);
  2063. }
  2064. else
  2065. {
  2066. FERROR("Set detector sync mode failed!");
  2067. }
  2068. return true;
  2069. }