Detector_Rayence.cpp 62 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463
  1. #include "stdafx.h"
  2. #include "Detector_Rayence.h"
  3. #include "CCOS.Dev.FPD.Rayence.h"
  4. extern Log4CPP::Logger* gLogger;
  5. Detector_Rayence* g_pDetector = nullptr;
  6. Detector_Rayence* g_pRayenceInstance = nullptr;
  7. LogicClient* m_pSynClient;
  8. void CALLBACK G_Rayence_InfoMessage(int nCode, TCHAR* szMessage)
  9. {
  10. g_pRayenceInstance->CALLBACK_InfoMessage(nCode, szMessage);
  11. }
  12. void CALLBACK G_Rayence_OnEvent(tVDACQ_CallBackRec* ACBR)
  13. {
  14. g_pRayenceInstance->CALLBACK_Acquisition(ACBR);
  15. }
  16. void CALLBACK G_Rayence_OnDarkEvent(tVDACQ_CallBackRec* ACBR)
  17. {
  18. g_pRayenceInstance->CALLBACK_Dark_Acquisition(ACBR);
  19. }
  20. Detector_Rayence::Detector_Rayence()
  21. :m_pFrm1x1Buffer{},
  22. m_pFrm2x2Buffer{},
  23. m_pDark1x1Buffer{},
  24. m_pDark2x2Buffer{},
  25. m_pFrm1x1AveBuffer{},
  26. m_pFrm2x2AveBuffer{},
  27. m_pOneShotBuffer{},
  28. m_pFullImgBuffer{},
  29. m_hOffsetThreadStatus{},
  30. m_hOffsetThread{},
  31. m_nPanelCount{},
  32. m_nCurrentPanelID{},
  33. m_nImageWidth{},
  34. m_nImageHeight{},
  35. m_nFrmWidth{},
  36. m_nFrmHeight{},
  37. m_nCropLeft{},
  38. m_nCropRight{},
  39. m_nCropTop{},
  40. m_nCropBottom{},
  41. m_nRawImgHeight{},
  42. m_nRawImgWidth{},
  43. m_nAveCount{},
  44. m_nBinningMode{},
  45. m_nCalBinning{},
  46. m_nFrmAveBufSize{},
  47. m_strLastLogicMode{},
  48. m_strCurrentLogicMode{},
  49. m_strWorkPath{},
  50. m_nImageIndex{},
  51. m_fFrameRate{},
  52. m_nCalModeId{},
  53. m_nCalToAcqNum{},
  54. m_nExposureTime{},
  55. m_nFlags{},
  56. m_nRecvCount{},
  57. m_nSensitivity{},
  58. m_nSkipNum{},
  59. m_nExamMode(APP_STATUS::APP_STATUS_MAX),
  60. m_nExiThreshold(200),
  61. m_bRayAcqing(false),
  62. m_bSaveRaw(false),
  63. m_bOffsetBuffer(false),
  64. m_bAbortOffset(false),
  65. m_bCalOffset(false),
  66. m_bCalGain(false),
  67. m_bCalBPM(false),
  68. m_bDoOffset(false),
  69. m_bRayenceConnect(false),
  70. m_bRefreshAllMode(false),
  71. m_eCaliType(CCOS_CALIBRATION_TYPE::CCOS_CALIBRATION_TYPE_NONE),
  72. m_eStatus(eDetStatus::DetStatus_NotInit)
  73. {
  74. g_pRayenceInstance = this;
  75. m_pDPC2PanelID = new map<void*, int>();
  76. m_pPanelID2DPC = new map<int, void*>();
  77. InitializeCriticalSection(&m_cs);
  78. //work with sync box for Rad
  79. m_pSynClient = new LogicClient("V3_FullUCB", "NSQ", "", false);
  80. if (m_pSynClient->Open("ccosChannel", ALL_ACCESS))
  81. {
  82. FDEBUG("Ccos_V3 Create V3_FullUCB Client success");
  83. }
  84. }
  85. Detector_Rayence::~Detector_Rayence()
  86. {
  87. if (m_pFullImgBuffer != nullptr)
  88. {
  89. delete[] m_pFullImgBuffer;
  90. m_pFullImgBuffer = nullptr;
  91. }
  92. if (m_pSynClient)
  93. {
  94. if (!m_pSynClient->IsClosed())
  95. {
  96. m_pSynClient->Close();
  97. }
  98. delete m_pSynClient;
  99. m_pSynClient = nullptr;
  100. }
  101. }
  102. bool Detector_Rayence::DriverEntry(void* pDrvDPC, ResDataObject& Configuration)
  103. {
  104. FINFO("--Func-- DriverEntry {$}", pDrvDPC);
  105. map<void*, int>::iterator DPCsIter = m_pDPC2PanelID->find(pDrvDPC);
  106. if (DPCsIter != m_pDPC2PanelID->end())
  107. {
  108. FERROR("This DPC already exist");
  109. return false;
  110. }
  111. m_pDPC2PanelID->insert(pair<void*, int>(pDrvDPC, m_nPanelCount));
  112. m_pPanelID2DPC->insert(pair<int, void*>(m_nPanelCount, pDrvDPC));
  113. m_nPanelCount++;
  114. m_ModeConfig = Configuration; //记录配置 --目前只有一个平板,多板时应该分别存储
  115. return true;
  116. }
  117. bool Detector_Rayence::Connect(void* pDrvDPC, const char* szWorkPath)
  118. {
  119. FINFO("Connect detector begin");
  120. std::string strSensitivity;
  121. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  122. {
  123. Debug("Not current DPC, return true");
  124. return true;
  125. }
  126. m_strWorkPath = szWorkPath;
  127. try
  128. {
  129. int nModeCount = m_ModeConfig["ModeTable"].size();
  130. for (int i = 0; i < nModeCount; i++)
  131. {
  132. FINFO("mode count:{$}", i);
  133. }
  134. m_nExiThreshold = (int)m_ModeConfig["ExiThreshold"];
  135. m_strSDKPath = (std::string)m_ModeConfig["SDKPath"];
  136. m_strModulePath = (std::string)m_ModeConfig["DetectorModePath"];
  137. m_nSensitivity = (int)m_ModeConfig["Sensitivity"];
  138. m_bCalOffset = (int)m_ModeConfig["UseOffsetCalibration"];
  139. m_bCalGain = (int)m_ModeConfig["UseGainCalibration"];
  140. m_bCalBPM = (int)m_ModeConfig["UseBPMCalibration"];
  141. m_nExposureTime = (int)m_ModeConfig["ExposureTime"];
  142. switch (m_nSensitivity)
  143. {
  144. case 0:
  145. strSensitivity = "High Sensitivity";
  146. break;
  147. case 1:
  148. strSensitivity = "Mid High Sensitivity";
  149. break;
  150. case 2:
  151. strSensitivity = "middle";
  152. break;
  153. case 3:
  154. strSensitivity = "Mid Low";
  155. break;
  156. case 4:
  157. strSensitivity = "Low";
  158. break;
  159. default:
  160. FERROR("Sensitivity FERROR Paramer");
  161. break;
  162. }
  163. FINFO("Rayence Use Senisitivity: {$}", strSensitivity);
  164. FINFO("Load Calibration Offset: {$}, Gain: {$}, BPM: {$}", m_bCalOffset, m_bCalGain, m_bCalBPM);
  165. }
  166. catch (ResDataObjectExption& e)
  167. {
  168. FERROR("Get config FERROR: {$}", e.what());
  169. return false;
  170. }
  171. std::string strModulePath;
  172. strModulePath = m_strWorkPath + m_strModulePath + "\\CCOS.Dev.FPD.RayenceX64.dll";
  173. FINFO("ModulePath : {$}", strModulePath);
  174. std::string strVersion;
  175. strVersion = GetFileVersion(strModulePath);
  176. FINFO("======================={$}=======================", strVersion);
  177. if (!OpenDetector())
  178. {
  179. FERROR("Open detector failed, Connect failed \n");
  180. return false;
  181. }
  182. FINFO("Connect over");
  183. return true;
  184. }
  185. void Detector_Rayence::DisConnect()
  186. {
  187. FINFO("DisConnect with detector");
  188. if (eDetStatus::DetStatus_XrayCalibration == GetRayenceDPCStatus() || eDetStatus::DetStatus_Offset == GetRayenceDPCStatus())
  189. {
  190. FINFO("DisConnect Calling StopCalibration");
  191. }
  192. if (m_pFrm1x1Buffer)
  193. {
  194. delete[] m_pFrm1x1Buffer;
  195. m_pFrm1x1Buffer = nullptr;
  196. }
  197. if (m_pFrm2x2Buffer)
  198. {
  199. delete[] m_pFrm2x2Buffer;
  200. m_pFrm2x2Buffer = nullptr;
  201. }
  202. if (m_pDark1x1Buffer)
  203. {
  204. delete[] m_pDark1x1Buffer;
  205. m_pDark1x1Buffer = nullptr;
  206. }
  207. if (m_pDark2x2Buffer)
  208. {
  209. delete[] m_pDark2x2Buffer;
  210. m_pDark2x2Buffer = nullptr;
  211. }
  212. if (m_pFrm1x1AveBuffer)
  213. {
  214. delete[] m_pFrm1x1AveBuffer;
  215. m_pFrm1x1AveBuffer = nullptr;
  216. }
  217. if (m_pFrm2x2AveBuffer)
  218. {
  219. delete[] m_pFrm2x2AveBuffer;
  220. m_pFrm2x2AveBuffer = nullptr;
  221. }
  222. if (m_pOneShotBuffer)
  223. {
  224. delete[] m_pOneShotBuffer;
  225. m_pOneShotBuffer = nullptr;
  226. }
  227. FINFO("Disconnect Detector Over");
  228. }
  229. void Detector_Rayence::EnterExamMode(int nExamMode)
  230. {
  231. switch (nExamMode)
  232. {
  233. case APP_STATUS_WORK_BEGIN:
  234. FINFO("Enter into Exam Windows");
  235. m_nExamMode = APP_STATUS_WORK_BEGIN;
  236. break;
  237. case APP_STATUS_WORK_END:
  238. FINFO("Quit Exam Windows");
  239. m_nExamMode = APP_STATUS_WORK_END;
  240. break;
  241. case APP_STATUS_DETSHARE_BEGIN:
  242. FINFO("Enter into Detector Share Windows");
  243. m_nExamMode = APP_STATUS_DETSHARE_BEGIN;
  244. break;
  245. case APP_STATUS_DETSHAR_END:
  246. m_nExamMode = APP_STATUS_IDLE;
  247. FINFO("Quit Detector Share Windows");
  248. m_nExamMode = APP_STATUS_DETSHAR_END;
  249. break;
  250. case APP_STATUS_CAL_BEGIN:
  251. FINFO("Enter into Calibration Windows");
  252. m_nExamMode = APP_STATUS_CAL_BEGIN;
  253. break;
  254. case APP_STATUS_CAL_END:
  255. FINFO("Quit Calibration Windows");
  256. m_nExamMode = APP_STATUS_CAL_END;
  257. break;
  258. case APP_STATUS_WORK_IN_SENSITIVITY:
  259. FINFO("Enter into sensitivity test interface");
  260. m_nExamMode = APP_STATUS_WORK_IN_SENSITIVITY;
  261. break;
  262. default:
  263. break;
  264. }
  265. if (APP_STATUS_WORK_END == m_nExamMode)
  266. {
  267. if (eDetStatus::DetStatus_Acquire == GetRayenceDPCStatus())
  268. {
  269. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  270. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  271. }
  272. }
  273. }
  274. void Detector_Rayence::CALLBACK_InfoMessage(int nCode, TCHAR* szMessage)
  275. {
  276. FINFO("InfoMessage: Code: {$}, Message: {$}", nCode, szMessage);
  277. if (nCode == 16842754)
  278. {
  279. m_bRayenceConnect = true;
  280. }
  281. if (nCode == 16908289)
  282. {
  283. m_bRayAcqing = true;
  284. }
  285. if (nCode == 16908290)
  286. {
  287. m_bRayAcqing = false;
  288. }
  289. }
  290. void Detector_Rayence::HandleCaptureRecvEvent(tVDACQ_CallBackRec* ACBR, bool bIsCaptureRaw)
  291. {
  292. FINFO("ACBR->rEvent cVDACQ_ECaptureRecv m_eStatus:{$}", (int)m_eStatus);
  293. if (m_eStatus == eDetStatus::DetStatus_Acquire)
  294. {
  295. if (m_strCurrentExamType == "RAD")
  296. {
  297. FINFO("Rad Mode...");
  298. }
  299. else if (m_strCurrentExamType == "CF")
  300. {
  301. FINFO("CF Mode...");
  302. }
  303. else if (m_strCurrentExamType == "PF")
  304. {
  305. FINFO("PF Mode...");
  306. }
  307. if (m_bSaveRaw)
  308. {
  309. FINFO("Begin save Raw");
  310. char szTemp[30] = { 0 };
  311. string strFileName = m_strWorkPath + "\\Image";
  312. if (m_strCurrentExamType == "Rad")
  313. {
  314. strFileName += "\\Image_Rad.raw";
  315. }
  316. else
  317. {
  318. sprintf_s(szTemp, "\\Image_%d.raw", m_nImageIndex);
  319. strFileName += szTemp;
  320. }
  321. std::filesystem::path file_path{ strFileName.c_str() };
  322. std::ofstream file_stream(file_path, std::ios::binary);
  323. if (!file_stream.is_open())
  324. {
  325. FERROR("Open Save File Failed");
  326. }
  327. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight * 2;
  328. if (m_nBinningMode == 0)
  329. {
  330. file_stream.write(reinterpret_cast<const char*>(m_pFrm1x1Buffer), nTempSize);
  331. }
  332. if (m_nBinningMode == 1)
  333. {
  334. file_stream.write(reinterpret_cast<const char*>(m_pFrm2x2Buffer), nTempSize);
  335. }
  336. file_stream.close();
  337. }
  338. m_nImageIndex++;
  339. OnProcessImage(ACBR->rCaptureFrames, bIsCaptureRaw);
  340. }
  341. }
  342. std::string Detector_Rayence::GetFileVersion(std::string strFilePathName)
  343. {
  344. DWORD dwVerSize = GetFileVersionInfoSize(strFilePathName.c_str(), NULL);
  345. if (dwVerSize == 0)
  346. {
  347. return "";
  348. }
  349. LPVOID pVersionBuffer = malloc(dwVerSize);
  350. GetFileVersionInfo(strFilePathName.c_str(), 0, dwVerSize, pVersionBuffer);
  351. VS_FIXEDFILEINFO* pInfo;
  352. UINT nInfoLen;
  353. std::string strVersion = "";
  354. if (VerQueryValue(pVersionBuffer, _T("\\"), (void**)&pInfo, &nInfoLen))
  355. {
  356. strVersion = to_string(HIWORD(pInfo->dwFileVersionMS)) + "." + to_string(LOWORD(pInfo->dwFileVersionMS)) + "."
  357. + to_string(HIWORD(pInfo->dwFileVersionLS)) + "." + to_string(LOWORD(pInfo->dwFileVersionLS));
  358. }
  359. return strVersion;
  360. }
  361. float Detector_Rayence::SetFluPPS(float fPPS)
  362. {
  363. FINFO("Set Flu FrameRate : {$}", fPPS);
  364. m_fFrameRate = fPPS;
  365. if (m_fFrameRate == 30)
  366. {
  367. m_fFrameRate = 7;
  368. }
  369. if (m_strCurrentExamType == "CF")
  370. {
  371. FINFO("SetFrameRate: {$}", m_fFrameRate);
  372. m_Intf.rVDACQ_SetFrameRate(m_fFrameRate);
  373. }
  374. return m_fFrameRate;
  375. }
  376. void Detector_Rayence::GetFluPPS(float& fFluPPS)
  377. {
  378. fFluPPS = m_fFrameRate;
  379. }
  380. bool Detector_Rayence::SetAcqMode(std::string strMode)
  381. {
  382. FINFO("SetAcqMode nMode:{$}",strMode);
  383. if (m_strCurrentLogicMode == strMode)
  384. {
  385. FINFO("Same mode, return");
  386. return true;
  387. }
  388. m_strCurrentLogicMode = ""; //恢复初值
  389. m_Intf.rVDACQ_SetCaptureExposureTime(m_nExposureTime);//设置Rad采集的积分时间
  390. if (eDetStatus::DetStatus_Acquire == GetRayenceDPCStatus())
  391. {
  392. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  393. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  394. }
  395. m_Intf.rVDACQ_SetSensitivity(0);
  396. try
  397. {
  398. int nModeCount = m_ModeConfig["ModeTable"].size();
  399. for (int i = 0; i < nModeCount; i++)
  400. {
  401. std::string strAppMode = (std::string)m_ModeConfig["ModeTable"][i]["ExamType"];//SetAcqMode
  402. if (strAppMode == strMode)
  403. {
  404. m_strCurrentExamType = (std::string)m_ModeConfig["ModeTable"][i]["ExamType"];
  405. m_bSaveRaw = (int)m_ModeConfig["ModeTable"][i]["IsSaveRaw"];
  406. m_nBinningMode = (int)m_ModeConfig["ModeTable"][i]["BinningMode"];
  407. m_nCropLeft = (int)m_ModeConfig["ModeTable"][i]["CropLeft"];
  408. m_nCropRight = (int)m_ModeConfig["ModeTable"][i]["CropRight"];
  409. m_nCropTop = (int)m_ModeConfig["ModeTable"][i]["CropTop"];
  410. m_nCropBottom = (int)m_ModeConfig["ModeTable"][i]["CropBottom"];
  411. FINFO("Crop left: {$}, top: {$}, right: {$}, bottom: {$}",
  412. m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  413. FINFO("ExamType: {$}, SaveRaw: {$}", m_strCurrentExamType, m_bSaveRaw);
  414. m_strCurrentLogicMode = strMode;
  415. break;
  416. }
  417. }
  418. }
  419. catch (ResDataObjectExption& e)
  420. {
  421. FERROR("Read configuration failed, FERROR code: {$}", e.what());
  422. return false;
  423. }
  424. if (m_strLastLogicMode != m_strCurrentLogicMode || GetRayenceDPCStatus() != eDetStatus::DetStatus_Acquire)
  425. {
  426. if (m_strCurrentExamType == "RAD")//PrepareAcquisition
  427. {
  428. m_Intf.rVDACQ_SetBinning(m_nBinningMode);
  429. m_Intf.rVDACQ_GetFrameDim(&m_nFrmWidth, &m_nFrmHeight);
  430. m_Intf.rVDACQ_SetFrameDim(m_nFrmWidth, m_nFrmHeight);
  431. FINFO("Rad BinningMode: {$}, FrameSize Width: {$}, Height: {$}", m_nBinningMode, m_nFrmWidth, m_nFrmHeight);
  432. if (m_nBinningMode == 0)
  433. {
  434. if (m_pFrm1x1Buffer == nullptr)
  435. {
  436. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  437. m_pFrm1x1Buffer = new short[nTempSize];
  438. }
  439. }
  440. if (m_nBinningMode == 1)
  441. {
  442. if (m_pFrm2x2Buffer == nullptr)
  443. {
  444. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  445. m_pFrm2x2Buffer = new short[nTempSize];
  446. }
  447. }
  448. if (m_pOneShotBuffer == nullptr)
  449. {
  450. unsigned int nTempSize = m_nFrmHeight * m_nFrmWidth;
  451. m_pOneShotBuffer = new short[nTempSize];
  452. }
  453. else
  454. {
  455. delete[] m_pOneShotBuffer;
  456. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  457. m_pOneShotBuffer = new short[nTempSize];
  458. }
  459. m_Intf.rVDACQ_GetFGRec(&m_qFGRec);
  460. m_qFGRec.rCalFlags = 0;
  461. if (m_bCalOffset)
  462. {
  463. m_qFGRec.rCalFlags |= cVDC_FCalOffs;
  464. }
  465. if (m_bCalGain)
  466. {
  467. m_qFGRec.rCalFlags |= cVDC_FCalGain;
  468. }
  469. if (m_bCalBPM)
  470. {
  471. m_qFGRec.rCalFlags |= cVDC_FBadPixMap;
  472. }
  473. m_qFGRec.rFG_Control = 0;
  474. m_Intf.rVDACQ_SetFGRec(&m_qFGRec);
  475. m_Intf.rVDACQ_SetOneShot(1);
  476. m_Intf.rVDACQ_SetOneShot_Trigger(0);
  477. }
  478. else if (m_strCurrentExamType == "PF")
  479. {
  480. m_Intf.rVDACQ_SetBinning(m_nBinningMode);
  481. m_Intf.rVDACQ_GetFrameDim(&m_nFrmWidth, &m_nFrmHeight);
  482. m_Intf.rVDACQ_SetFrameDim(m_nFrmWidth, m_nFrmHeight);
  483. if (nullptr != m_pFullImgBuffer)
  484. {
  485. delete[] m_pFullImgBuffer;
  486. m_pFullImgBuffer = nullptr;
  487. }
  488. m_nImageWidth = m_nFrmWidth - m_nCropLeft - m_nCropRight;
  489. m_nImageHeight = m_nFrmHeight - m_nCropBottom - m_nCropTop;
  490. m_nRawImgHeight = m_nFrmHeight;
  491. m_nRawImgWidth = m_nFrmWidth;
  492. if (m_nBinningMode == 0)
  493. {
  494. if (m_pFrm1x1Buffer == nullptr)
  495. {
  496. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  497. m_pFrm1x1Buffer = new short[nTempSize];
  498. }
  499. }
  500. if (m_nBinningMode == 1)
  501. {
  502. if (m_pFrm2x2Buffer == nullptr)
  503. {
  504. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  505. m_pFrm2x2Buffer = new short[nTempSize];
  506. }
  507. }
  508. m_pFullImgBuffer = new WORD[(size_t)m_nImageWidth * (size_t)m_nImageHeight];
  509. FINFO("PF FrameRate: {$}, BinningMode: {$}, FrameSize Width: {$}, Height: {$}", m_fFrameRate, m_nBinningMode, m_nFrmWidth, m_nFrmHeight);
  510. m_Intf.rVDACQ_GetFGRec(&m_qFGRec);
  511. m_qFGRec.rCalFlags = 0;
  512. if (m_bCalOffset)
  513. {
  514. m_qFGRec.rCalFlags |= cVDC_FCalOffs;
  515. }
  516. if (m_bCalGain)
  517. {
  518. m_qFGRec.rCalFlags |= cVDC_FCalGain;
  519. }
  520. if (m_bCalBPM)
  521. {
  522. m_qFGRec.rCalFlags |= cVDC_FBadPixMap;
  523. }
  524. m_qFGRec.rFG_Control |= cVDACQ_FGC_CaptureCalHandler;
  525. m_Intf.rVDACQ_SetFGRec(&m_qFGRec);
  526. m_Intf.rVDACQ_SetOneShot(0);
  527. m_Intf.rVDACQ_SetDynamic_Trigger(1);
  528. }
  529. else if (m_strCurrentExamType == "CF")
  530. {
  531. m_Intf.rVDACQ_SetFrameRate(m_fFrameRate);
  532. m_Intf.rVDACQ_SetBinning(m_nBinningMode);
  533. m_Intf.rVDACQ_GetFrameDim(&m_nFrmWidth, &m_nFrmHeight);
  534. m_Intf.rVDACQ_SetFrameDim(m_nFrmWidth, m_nFrmHeight);
  535. if (nullptr != m_pFullImgBuffer)
  536. {
  537. delete[] m_pFullImgBuffer;
  538. m_pFullImgBuffer = nullptr;
  539. }
  540. m_nImageWidth = m_nFrmWidth - m_nCropLeft - m_nCropRight;
  541. m_nImageHeight = m_nFrmHeight - m_nCropBottom - m_nCropTop;
  542. m_nRawImgHeight = m_nFrmHeight;
  543. m_nRawImgWidth = m_nFrmWidth;
  544. if (m_nBinningMode == 0)
  545. {
  546. if (m_pFrm1x1Buffer == nullptr)
  547. {
  548. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  549. m_pFrm1x1Buffer = new short[nTempSize];
  550. }
  551. }
  552. if (m_nBinningMode == 1)
  553. {
  554. if (m_pFrm2x2Buffer == nullptr)
  555. {
  556. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  557. m_pFrm2x2Buffer = new short[nTempSize];
  558. }
  559. }
  560. m_pFullImgBuffer = new WORD[(size_t)m_nImageWidth * (size_t)m_nImageHeight];
  561. FINFO("CF FrameRate: {$}, BinningMode: {$}, FrameSize Width: {$}, Height: {$}", m_fFrameRate, m_nBinningMode, m_nFrmWidth, m_nFrmHeight);
  562. m_Intf.rVDACQ_GetFGRec(&m_qFGRec);
  563. m_qFGRec.rCalFlags = 0;
  564. if (m_bCalOffset)
  565. {
  566. m_qFGRec.rCalFlags |= cVDC_FCalOffs;
  567. }
  568. if (m_bCalGain)
  569. {
  570. m_qFGRec.rCalFlags |= cVDC_FCalGain;
  571. }
  572. if (m_bCalBPM)
  573. {
  574. m_qFGRec.rCalFlags |= cVDC_FBadPixMap;
  575. }
  576. m_qFGRec.rFG_Control |= cVDACQ_FGC_CaptureCalHandler;
  577. m_Intf.rVDACQ_SetFGRec(&m_qFGRec);
  578. m_Intf.rVDACQ_SetOneShot(0);
  579. m_Intf.rVDACQ_SetDynamic_Trigger(0);
  580. }
  581. }
  582. m_nCalBinning = m_nBinningMode;
  583. FINFO("Cal BinningMode : {$}", m_nCalBinning);
  584. return true;
  585. }
  586. bool Detector_Rayence::PrepareAcquisition(void* pDrvDPC)
  587. {
  588. FINFO("PrepareAcquisition");
  589. bool bRet = false;
  590. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  591. {
  592. FERROR("Not current DPC, return");
  593. return bRet;
  594. }
  595. FINFO("PrepareAcquisition m_strLastLogicMode:{$},m_strCurrentLogicMode:{$}", m_strLastLogicMode, m_strCurrentLogicMode);
  596. return true;
  597. }
  598. bool Detector_Rayence::StartAcquisition(void* pDrvDPC)
  599. {
  600. FINFO("StartAcquisition");
  601. bool bRet = false;
  602. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  603. {
  604. FERROR("Not current DPC, return");
  605. return bRet;
  606. }
  607. if (m_strLastLogicMode != m_strCurrentLogicMode || GetRayenceDPCStatus() != eDetStatus::DetStatus_Acquire)
  608. {
  609. if (m_strCurrentExamType == "RAD")//PrepareAcquisition
  610. {
  611. m_Intf.rVDACQ_SetCaptureBuf(m_pOneShotBuffer);
  612. if (m_nBinningMode == 0)
  613. {
  614. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FBright, G_Rayence_OnEvent, NULL, (short*)m_pFrm1x1Buffer, 0);
  615. }
  616. if (m_nBinningMode == 1)
  617. {
  618. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FBright, G_Rayence_OnEvent, NULL, (short*)m_pFrm2x2Buffer, 0);
  619. }
  620. if (rACQ_CallBackRec != nullptr)
  621. {
  622. SetRayenceDPCStatus(eDetStatus::DetStatus_Acquire); //Rad模式激活采集,设置状态
  623. }
  624. m_Intf.rVDACQ_StartFrame(rACQ_CallBackRec);
  625. }
  626. else if (m_strCurrentExamType == "PF")
  627. {
  628. FINFO("Start PF Acquisition");
  629. if (m_nBinningMode == 0)
  630. {
  631. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FBright, G_Rayence_OnEvent, NULL, (short*)m_pFrm1x1Buffer, 0);
  632. }
  633. if (m_nBinningMode == 1)
  634. {
  635. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FBright, G_Rayence_OnEvent, NULL, (short*)m_pFrm2x2Buffer, 0);
  636. }
  637. if (rACQ_CallBackRec != nullptr)
  638. {
  639. SetRayenceDPCStatus(eDetStatus::DetStatus_Acquire); //PF模式激活采集,设置状态
  640. }
  641. m_Intf.rVDACQ_StartFrame(rACQ_CallBackRec);
  642. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  643. }
  644. else if (m_strCurrentExamType == "CF")
  645. {
  646. FINFO("Start CF Acquisition");
  647. if (m_nBinningMode == 0)
  648. {
  649. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FBright, G_Rayence_OnEvent, NULL, (short*)m_pFrm1x1Buffer, 0);
  650. }
  651. if (m_nBinningMode == 1)
  652. {
  653. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FBright, G_Rayence_OnEvent, NULL, (short*)m_pFrm2x2Buffer, 0);
  654. }
  655. if (rACQ_CallBackRec != nullptr)
  656. {
  657. SetRayenceDPCStatus(eDetStatus::DetStatus_Acquire); //CF模式激活采集,设置状态
  658. }
  659. m_Intf.rVDACQ_StartFrame(rACQ_CallBackRec);
  660. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  661. }
  662. }
  663. m_bRayAcqing = true;
  664. /*StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);*/
  665. if ("" == m_strCurrentLogicMode)
  666. {
  667. FERROR("Illegal exam mode");
  668. }
  669. else
  670. {
  671. bRet = true;
  672. }
  673. return bRet;
  674. }
  675. bool Detector_Rayence::StopAcquisition(void* pDrvDPC)
  676. {
  677. FINFO("StopAcquisition ");
  678. bool bRet = false;
  679. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  680. if (m_strCurrentExamType != "RAD")
  681. {
  682. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  683. {
  684. FERROR("Not current DPC, return");
  685. return bRet;
  686. }
  687. if (eDetStatus::DetStatus_Acquire == GetRayenceDPCStatus())
  688. {
  689. FINFO("Calling StopAcquisition");
  690. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  691. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  692. m_bRayAcqing = false;
  693. bRet = true;
  694. SetRayenceDPCStatus(eDetStatus::DetStatus_Standby); //停止采集,设置状态
  695. }
  696. else
  697. {
  698. FINFO("Not in acquire status");
  699. //切换到静态采集后,进入了ready状态。但此时可以不开始采集,切换到别的模式,
  700. bRet = true;
  701. }
  702. }
  703. else
  704. {
  705. bRet = true;
  706. }
  707. return bRet;
  708. }
  709. bool Detector_Rayence::StartOffset(void* pDrvDPC, bool isAll, std::vector<DetectorMode>& m_vDetectorModeList)
  710. {
  711. FINFO("StartOffset");
  712. bool bRet = false;
  713. m_bAbortOffset = false;
  714. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  715. {
  716. FERROR("Not current DPC, return");
  717. return false;
  718. }
  719. m_bRefreshAllMode = isAll;
  720. m_vecDetMode = m_vDetectorModeList;
  721. if (!m_bOffsetBuffer)
  722. {
  723. for (size_t i = 0; i < m_vecDetMode.size(); i++)
  724. {
  725. unsigned int nTempSize = m_vecDetMode[i].imageHeight * m_vecDetMode[i].imageWidth;
  726. FINFO("AveBuffer Height:{$}, Width:{$}", m_vecDetMode[i].imageHeight, m_vecDetMode[i].imageWidth);
  727. m_nCalModeId = m_vecDetMode[i].ModeID;
  728. FINFO("Calling StartDarkCalibration, modeid:({$})", m_nCalModeId);
  729. if (m_pFrm1x1AveBuffer == nullptr && m_nCalModeId == 0)
  730. {
  731. m_pFrm1x1AveBuffer = new int[nTempSize];
  732. memset(m_pFrm1x1AveBuffer, 0, nTempSize * sizeof(int));
  733. }
  734. if (m_pFrm2x2AveBuffer == nullptr && m_nCalModeId == 1)
  735. {
  736. m_pFrm2x2AveBuffer = new int[nTempSize];
  737. memset(m_pFrm2x2AveBuffer, 0, nTempSize * sizeof(int));
  738. }
  739. if (m_nCalModeId == 0 && m_pDark1x1Buffer == nullptr)
  740. {
  741. m_pDark1x1Buffer = new short[nTempSize];
  742. FINFO("1x1 Dark Buffer");
  743. }
  744. if (m_nCalModeId == 1 && m_pDark2x2Buffer == nullptr)
  745. {
  746. m_pDark2x2Buffer = new short[nTempSize];
  747. FINFO("2x2 Dark Buffer");
  748. }
  749. }
  750. m_bOffsetBuffer = true;
  751. }
  752. if (m_bRayAcqing)
  753. {
  754. FINFO("FPD not Ready");
  755. OffsetProgressFeedback(EVT_INFO_OFFSET_STATUS, 1);
  756. return true;
  757. }
  758. OffsetProgressFeedback(EVT_INFO_OFFSET_PROGRESS, 0);
  759. m_nRecvCount = 0;
  760. OpenRefreshOffset();
  761. return true;
  762. }
  763. bool Detector_Rayence::AbortOffset()
  764. {
  765. FINFO("Abort Offset");
  766. if (eDetStatus::DetStatus_Offset == GetRayenceDPCStatus() && m_bRayAcqing)
  767. {
  768. FINFO("Calling AbortOffset");
  769. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  770. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  771. m_bAbortOffset = true;
  772. m_bDoOffset = false;
  773. m_bRayAcqing = false;
  774. StatusFeedback(EVT_STATUS_PANEL, PANEL_STANDBY);
  775. SetRayenceDPCStatus(eDetStatus::DetStatus_Standby); //停止采集,设置状态
  776. }
  777. if (!m_bRayAcqing)
  778. {
  779. FINFO("Offset not begin");
  780. }
  781. return true;
  782. }
  783. bool Detector_Rayence::ActiveCalibration(void* pDrvDPC, CCOS_CALIBRATION_TYPE eType)
  784. {
  785. FINFO("ActiveCalibration");
  786. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  787. {
  788. FERROR("Not current DPC, return");
  789. return false;
  790. }
  791. if ("" == m_strCurrentLogicMode)
  792. {
  793. FERROR("Illegal exam mode");
  794. return false;
  795. }
  796. if (CCOS_CALIBRATION_TYPE_XRAY == eType)
  797. {
  798. SetRayenceDPCStatus(eDetStatus::DetStatus_XrayCalibration);
  799. }
  800. m_eCaliType = eType;
  801. return true;
  802. }
  803. /***
  804. ** 校正时响应上层调用的FramePrep
  805. ***/
  806. bool Detector_Rayence::PrepareCalibration(void* pDrvDPC)
  807. {
  808. FINFO("PrepareCalibration");
  809. bool bRet = false;
  810. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  811. {
  812. FERROR("Not current DPC, return");
  813. return bRet;
  814. }
  815. if (GetRayenceDPCStatus() != eDetStatus::DetStatus_XrayCalibration)
  816. {
  817. FINFO("Current status is not XrayCalibration, return succeed");
  818. return true;
  819. }
  820. return bRet;
  821. }
  822. bool Detector_Rayence::StartCalibration(void* pDrvDPC)
  823. {
  824. FINFO("StartCalibration");
  825. bool bRet = false;
  826. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  827. {
  828. FERROR("Not current DPC, return");
  829. return bRet;
  830. }
  831. if (CCOS_CALIBRATION_TYPE_DARK == m_eCaliType)
  832. {
  833. bRet = true;
  834. }
  835. else if (CCOS_CALIBRATION_TYPE_XRAY == m_eCaliType)
  836. {
  837. bRet = StartGainCalibration();
  838. }
  839. return bRet;
  840. }
  841. bool Detector_Rayence::StopCalibration(void* pDrvDPC)
  842. {
  843. FINFO("StopCalibration");
  844. bool bRet = false;
  845. if ((*m_pDPC2PanelID)[pDrvDPC] != m_nCurrentPanelID)
  846. {
  847. FERROR("Not current DPC, return");
  848. return bRet;
  849. }
  850. FINFO("StopCalibration Calling StopCalibration");
  851. bRet = true;
  852. return bRet;
  853. }
  854. bool Detector_Rayence::OpenDetector()
  855. {
  856. FINFO("OpenDetector");
  857. FINFO("Calling InitializeLibrary");
  858. if (!LoadRayenceDLL())
  859. {
  860. FERROR("Connect Detector Failed, Load Dll is failed");
  861. return false;
  862. }
  863. FINFO("Call RegisterCallbackInfo");
  864. m_Intf.rVD_RegisterCallbackInfo(G_Rayence_InfoMessage);
  865. FINFO("Open Detector Success--->");
  866. return true;
  867. }
  868. bool Detector_Rayence::LoadRayenceDLL()
  869. {
  870. FINFO("Start Load Rayence DLL");
  871. FINFO("work path: {$}", m_strWorkPath);
  872. FINFO("Set SDK Path: {$}", m_strSDKPath);
  873. std::string strTempPath;
  874. strTempPath = m_strWorkPath + m_strSDKPath;
  875. if (SetDllDirectory(strTempPath.c_str()) == 0)
  876. {
  877. DWORD dw = GetLastError();
  878. FERROR("Load {$} Failed! FERROR Code : {$}", strTempPath, dw);
  879. }
  880. std::string strIniPath;
  881. strIniPath = strTempPath + "\\VADAV_FGM_64.ini";
  882. const char* section = "Settings";
  883. const char* key = "HomeDir";
  884. const char* newValue = strTempPath.c_str();
  885. WritePrivateProfileString(section, key, newValue, strIniPath.c_str());
  886. std::string strDllPath;
  887. strDllPath = strTempPath + "\\VADAV_FGM_64.dll";
  888. if (!VADAV_MapDLL(strDllPath.c_str(), &m_Intf))
  889. {
  890. FERROR("Load Rayence dll failed");
  891. auto dw = GetLastError();
  892. FERROR("FERROR Code : {$}", dw);
  893. return false;
  894. }
  895. FINFO("LoadRayenceDll Over");
  896. return true;
  897. }
  898. bool Detector_Rayence::CalculateEXI(WORD* pImgData, int nImgWidth, int nImgHeight, int nImageBit, int nThreshold)
  899. {
  900. int nROIXL = static_cast<int>(0.3 * nImgWidth);
  901. int nROIXR = static_cast<int>(0.7 * nImgWidth);
  902. int nROIYL = static_cast<int>(0.3 * nImgHeight);
  903. int nROIYR = static_cast<int>(0.7 * nImgHeight);
  904. WORD* pSrc = NULL;
  905. long nCount = 0;
  906. DWORD64 nSum = 0;
  907. int nEXI = 0;
  908. try
  909. {
  910. for (int i = nROIYL; i < nROIYR; i++)
  911. {
  912. pSrc = pImgData + (i * nImgWidth);
  913. for (int j = nROIXL; j < nROIXR; j++)
  914. {
  915. nSum += *(pSrc + j);
  916. nCount++;
  917. }
  918. }
  919. nEXI = (int)(nSum / nCount);
  920. }
  921. catch (...)
  922. {
  923. return false;
  924. }
  925. FINFO("Image EXI:{$}, Threshold:{$}", nEXI, nThreshold);
  926. if (nEXI >= nThreshold)
  927. {
  928. FINFO("Image has xray!");
  929. return true;//有x射线
  930. }
  931. return false;
  932. }
  933. bool Detector_Rayence::CheckImageExi(WORD* pImgData, int nImgWidth, int nImgHeight, WORD dwExiThrethold)
  934. {
  935. FINFO("Begin Check Image EXI");
  936. if (dwExiThrethold <= 0)
  937. {
  938. return true;
  939. }
  940. FINFO("Check image exi...");
  941. bool bResult = CalculateEXI(pImgData, nImgWidth, nImgHeight, 16, dwExiThrethold);
  942. if (bResult)
  943. {
  944. return true;
  945. }
  946. FINFO("Check image exi---black Image");
  947. return false;
  948. }
  949. bool Detector_Rayence::OpenRefreshOffset()
  950. {
  951. FINFO("---Begin Refresh Offset Thread---");
  952. m_hOffsetThreadStatus = CreateEvent(NULL, FALSE, FALSE, NULL);
  953. if (nullptr == m_hOffsetThread)
  954. {
  955. unsigned uThreadId;
  956. _beginthreadex(NULL, 0, RefreshOffsetThread, this, 0, &uThreadId);
  957. m_hOffsetThread = OpenThread(THREAD_ALL_ACCESS, TRUE, uThreadId);
  958. }
  959. return true;
  960. }
  961. UINT Detector_Rayence::RefreshOffsetThread(LPVOID pParam)
  962. {
  963. Detector_Rayence* pCurrentPanelOpr = reinterpret_cast<Detector_Rayence*>(pParam);
  964. if (pCurrentPanelOpr == nullptr)
  965. {
  966. FERROR("Refresh Offset Status Thread parameter FERROR");
  967. }
  968. pCurrentPanelOpr->PerformRefreshOffset();
  969. pCurrentPanelOpr->CloseRefreshOffset();
  970. return 0;
  971. }
  972. bool Detector_Rayence::PerformRefreshOffset()
  973. {
  974. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  975. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  976. if (m_bRefreshAllMode)
  977. {
  978. FINFO("Refresh all mode offset begin");
  979. for (size_t i = 0; i < m_vecDetMode.size(); i++)
  980. {
  981. if (!m_bAbortOffset)
  982. {
  983. unsigned int nTempSize = m_vecDetMode[i].imageHeight * m_vecDetMode[i].imageWidth;
  984. FINFO("AveBuffer Height:{$}, Width:{$}", m_vecDetMode[i].imageHeight, m_vecDetMode[i].imageWidth);
  985. m_nCalModeId = m_vecDetMode[i].ModeID;
  986. FINFO("Calling StartDarkCalibration, modeid:({$})", m_nCalModeId);
  987. /*if (m_pFrm1x1AveBuffer == nullptr && m_nCalModeId == 0)
  988. {
  989. m_pFrm1x1AveBuffer = new int[nTempSize];
  990. memset(m_pFrm1x1AveBuffer, 0, nTempSize * sizeof(int));
  991. }
  992. if (m_pFrm2x2AveBuffer == nullptr && m_nCalModeId == 1)
  993. {
  994. m_pFrm2x2AveBuffer = new int[nTempSize];
  995. memset(m_pFrm2x2AveBuffer, 0, nTempSize * sizeof(int));
  996. }*/
  997. SetRayenceDPCStatus(eDetStatus::DetStatus_Offset);
  998. m_bDoOffset = true;
  999. int nFrameRate = m_vecDetMode[i].FrameRate;
  1000. int nBinningMode = m_vecDetMode[i].binningMode;
  1001. m_nCalToAcqNum = m_vecDetMode[i].CalImgNum;
  1002. FINFO("FrameRate:{$}, BinningMode:{$}, m_nCalToAcqNum: {$}", nFrameRate, nBinningMode, m_nCalToAcqNum);
  1003. m_Intf.rVDACQ_SetFrameRate(nFrameRate);
  1004. m_Intf.rVDACQ_SetBinning(nBinningMode);
  1005. m_Intf.rVDACQ_GetFrameDim(&m_nFrmWidth, &m_nFrmHeight);
  1006. m_Intf.rVDACQ_SetFrameDim(m_nFrmWidth, m_nFrmHeight);
  1007. m_Intf.rVDACQ_GetFGRec(&m_qFGRec);
  1008. m_qFGRec.rCalFlags = 0;
  1009. m_Intf.rVDACQ_SetFGRec(&m_qFGRec);
  1010. m_Intf.rVDACQ_SetOneShot(0);
  1011. m_Intf.rVDACQ_SetDynamic_Trigger(0);
  1012. m_nFlags = GET_DARK;
  1013. FINFO("New FrmHeight: {$}, New FrmWidth: {$}", m_nFrmHeight, m_nFrmWidth);
  1014. /*if (m_nCalModeId == 0 && m_pDark1x1Buffer == nullptr)
  1015. {
  1016. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  1017. m_pDark1x1Buffer = new short[nTempSize];
  1018. FINFO("1x1 Dark Buffer");
  1019. }
  1020. if (m_nCalModeId == 1 && m_pDark2x2Buffer == nullptr)
  1021. {
  1022. unsigned int nTempSize = m_nFrmWidth * m_nFrmHeight;
  1023. m_pDark2x2Buffer = new short[nTempSize];
  1024. FINFO("2x2 Dark Buffer");
  1025. }*/
  1026. if (m_nCalModeId == 0)
  1027. {
  1028. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FDark, G_Rayence_OnDarkEvent, NULL, m_pDark1x1Buffer, 0);
  1029. }
  1030. if (m_nCalModeId == 1)
  1031. {
  1032. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FDark, G_Rayence_OnDarkEvent, NULL, m_pDark2x2Buffer, 0);
  1033. }
  1034. while (m_bDoOffset)
  1035. {
  1036. Sleep(10);
  1037. }
  1038. OffsetProgressFeedback(EVT_INFO_OFFSET_PROGRESS, (int)(i + 1));
  1039. }
  1040. }
  1041. FINFO("Refresh all mode offset over");
  1042. }
  1043. else
  1044. {
  1045. for (size_t i = 0; i < m_vecDetMode.size(); i++)
  1046. {
  1047. if (m_nCalBinning == m_vecDetMode[i].binningMode)
  1048. {
  1049. m_nCalModeId = m_vecDetMode[i].ModeID;
  1050. }
  1051. }
  1052. FINFO("Calling StartDarkCalibration, modeid:({$})", m_nCalModeId);
  1053. SetRayenceDPCStatus(eDetStatus::DetStatus_Offset);
  1054. m_bDoOffset = true;
  1055. int nFrameRate = m_vecDetMode[m_nCalModeId].FrameRate;
  1056. int nBinningMode = m_vecDetMode[m_nCalModeId].binningMode;
  1057. m_nCalToAcqNum = m_vecDetMode[m_nCalModeId].CalImgNum;
  1058. FINFO("FrameRate:{$}, BinningMode:{$}, m_nCalToAcqNum: {$}", nFrameRate, nBinningMode, m_nCalToAcqNum);
  1059. m_Intf.rVDACQ_SetOneShot(0);
  1060. m_Intf.rVDACQ_SetDynamic_Trigger(0);
  1061. m_Intf.rVDACQ_SetFrameRate(nFrameRate);
  1062. m_Intf.rVDACQ_SetBinning(nBinningMode);
  1063. m_Intf.rVDACQ_GetFGRec(&m_qFGRec);
  1064. m_qFGRec.rCalFlags = 0;
  1065. m_Intf.rVDACQ_SetFGRec(&m_qFGRec);
  1066. m_nFlags = GET_DARK;
  1067. m_Intf.rVDACQ_GetFrameDim(&m_nFrmWidth, &m_nFrmHeight);
  1068. m_Intf.rVDACQ_SetFrameDim(m_nFrmWidth, m_nFrmHeight);
  1069. if (m_nCalModeId == 0)
  1070. {
  1071. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FDark, G_Rayence_OnDarkEvent, NULL, m_pDark1x1Buffer, 0);
  1072. }
  1073. if (m_nCalModeId == 1)
  1074. {
  1075. rACQ_CallBackRec = m_Intf.rVDACQ_Connect(cVDACQ_FDark, G_Rayence_OnDarkEvent, NULL, m_pDark2x2Buffer, 0);
  1076. }
  1077. while (m_bDoOffset)
  1078. {
  1079. Sleep(10);
  1080. }
  1081. m_Intf.rVDACQ_GetFGRec(&m_qFGRec);
  1082. m_qFGRec.rCalFlags = 0;
  1083. if (m_bCalOffset)
  1084. {
  1085. m_qFGRec.rCalFlags |= cVDC_FCalOffs;
  1086. }
  1087. if (m_bCalGain)
  1088. {
  1089. m_qFGRec.rCalFlags |= cVDC_FCalGain;
  1090. }
  1091. if (m_bCalBPM)
  1092. {
  1093. m_qFGRec.rCalFlags |= cVDC_FBadPixMap;
  1094. }
  1095. m_qFGRec.rFG_Control = 0;
  1096. m_Intf.rVDACQ_SetFGRec(&m_qFGRec);
  1097. if (m_strCurrentExamType == "PF")
  1098. {
  1099. m_Intf.rVDACQ_SetOneShot(0);
  1100. m_Intf.rVDACQ_SetDynamic_Trigger(1);
  1101. }
  1102. FINFO("Refresh mode:{$} offset over.", m_nCalModeId);
  1103. OffsetProgressFeedback(EVT_INFO_OFFSET_PROGRESS, 1);
  1104. }
  1105. SetEvent(m_hOffsetThreadStatus);
  1106. return true;
  1107. }
  1108. bool Detector_Rayence::CloseRefreshOffset()
  1109. {
  1110. DWORD dwResult = WaitForSingleObject(m_hOffsetThreadStatus, 1000);
  1111. if (dwResult == WAIT_OBJECT_0)
  1112. {
  1113. FINFO("[Get RefreshOffsetStatus Event]");
  1114. }
  1115. else if (dwResult == WAIT_TIMEOUT)
  1116. {
  1117. ::TerminateThread(m_hOffsetThread, 0);
  1118. FWARN("Kill RefreshOffset Thread");
  1119. }
  1120. if (m_hOffsetThreadStatus != nullptr)
  1121. {
  1122. CloseHandle(m_hOffsetThreadStatus);
  1123. m_hOffsetThreadStatus = nullptr;
  1124. }
  1125. OffsetProgressFeedback(EVT_INFO_OFFSET_STATUS, 1);
  1126. m_hOffsetThread = nullptr;
  1127. FINFO("---Exit Refresh Offset Status Thread---");
  1128. return true;
  1129. }
  1130. //nIndex 缺省-1,当使用缺省值时代表是静态模式,图像名不记录序号
  1131. void Detector_Rayence::OnProcessImage(int CaptureFrame, bool bIsCaptureRaw)
  1132. {
  1133. FINFO("OnProcessImage CaptureID: {$}", CaptureFrame);
  1134. auto Process_Image = [this](int Binning, int CaptureID)
  1135. {
  1136. int ret = 0;
  1137. bool bImageCrop = false;
  1138. if (m_nCropLeft != 0 || m_nCropTop != 0 || m_nCropRight != 0 || m_nCropBottom != 0)
  1139. {
  1140. if (Binning == 0)
  1141. ret = CropImageMargin(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight,
  1142. m_pFrm1x1Buffer, m_nRawImgWidth, m_nRawImgHeight, 16,
  1143. m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  1144. if (Binning == 1)
  1145. ret = CropImageMargin(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight,
  1146. m_pFrm2x2Buffer, m_nRawImgWidth, m_nRawImgHeight, 16,
  1147. m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  1148. if (ret)
  1149. {
  1150. FERROR("CropImageMargin fail!!");
  1151. }
  1152. else
  1153. {
  1154. FINFO("CropImageMargin success!");
  1155. bImageCrop = true;
  1156. }
  1157. }
  1158. if (bImageCrop)
  1159. {
  1160. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nImageWidth);
  1161. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nImageHeight);
  1162. }
  1163. else
  1164. {
  1165. ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nRawImgWidth);
  1166. ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nRawImgHeight);
  1167. }
  1168. if (bImageCrop)
  1169. {
  1170. if (!CheckImageExi(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight, m_nExiThreshold))
  1171. {
  1172. FWARN("Image EXI too low");
  1173. return false;
  1174. }
  1175. DataFeedback(EVT_DATA_RAW_IMAGE, m_pFullImgBuffer);
  1176. }
  1177. else
  1178. {
  1179. if (Binning == 0)
  1180. {
  1181. if (!CheckImageExi((WORD*)m_pFrm1x1Buffer, m_nRawImgWidth, m_nRawImgHeight, m_nExiThreshold))
  1182. {
  1183. FWARN("Image EXI too low");
  1184. return false;
  1185. }
  1186. DataFeedback(EVT_DATA_RAW_IMAGE, m_pFrm1x1Buffer);
  1187. }
  1188. if (Binning == 1)
  1189. {
  1190. if (!CheckImageExi((WORD*)m_pFrm2x2Buffer, m_nRawImgWidth, m_nRawImgHeight, m_nExiThreshold))
  1191. {
  1192. FWARN("Image EXI too low");
  1193. return false;
  1194. }
  1195. DataFeedback(EVT_DATA_RAW_IMAGE, m_pFrm2x2Buffer);
  1196. }
  1197. }
  1198. if (m_bSaveRaw)
  1199. {
  1200. FINFO("Begin save Flu CropRaw");
  1201. char szTemp[30] = { 0 };
  1202. string strFileName = m_strWorkPath + "\\Image";
  1203. sprintf_s(szTemp, "\\CropImage_%d.raw", CaptureID);
  1204. strFileName += szTemp;
  1205. std::filesystem::path file_path{ strFileName.c_str() };
  1206. std::ofstream file_stream(file_path, std::ios::binary);
  1207. if (!file_stream.is_open())
  1208. {
  1209. FERROR("Open Save File Failed");
  1210. }
  1211. if (bImageCrop)
  1212. {
  1213. unsigned int nTempSize = m_nImageWidth * m_nImageHeight * 2;
  1214. file_stream.write(reinterpret_cast<const char*>(m_pFullImgBuffer), nTempSize);
  1215. }
  1216. else
  1217. {
  1218. unsigned int nTempSize = m_nRawImgWidth * m_nRawImgHeight * 2;
  1219. if (Binning == 0)
  1220. file_stream.write(reinterpret_cast<const char*>(m_pFrm1x1Buffer), nTempSize);
  1221. if (Binning == 1)
  1222. file_stream.write(reinterpret_cast<const char*>(m_pFrm2x2Buffer), nTempSize);
  1223. }
  1224. file_stream.close();
  1225. FINFO("Save Flu CropImage Over");
  1226. }
  1227. };
  1228. if (!Process_Image(m_nBinningMode, CaptureFrame))
  1229. {
  1230. return;
  1231. }
  1232. //if (m_nBinningMode == 0)
  1233. //{
  1234. // if (m_pFrm1x1Buffer == nullptr)
  1235. // {
  1236. // FERROR("Image Buffer is Null");
  1237. // return;
  1238. // }
  1239. // if (m_nCropLeft != 0 || m_nCropTop != 0 || m_nCropRight != 0 || m_nCropBottom != 0)
  1240. // {
  1241. // ret = CropImageMargin(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight,
  1242. // m_pFrm1x1Buffer, m_nRawImgWidth, m_nRawImgHeight, 16,
  1243. // m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  1244. // if (ret)
  1245. // {
  1246. // FERROR("CropImageMargin fail!!");
  1247. // }
  1248. // else
  1249. // {
  1250. // FINFO("CropImageMargin success!");
  1251. // bImageCrop = true;
  1252. // }
  1253. // }
  1254. // //上图之前回调图像的宽高,使得上层在拷贝内存时是正确的图像大小
  1255. // if (bImageCrop)
  1256. // {
  1257. // ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nImageWidth);
  1258. // ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nImageHeight);
  1259. // }
  1260. // else
  1261. // {
  1262. // ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nRawImgWidth);
  1263. // ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nRawImgHeight);
  1264. // }
  1265. // if (bImageCrop)
  1266. // {
  1267. // if (!CheckImageExi(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight, m_nExiThreshold))
  1268. // {
  1269. // FWARN("Image EXI too low");
  1270. // return;
  1271. // }
  1272. // DataFeedback(EVT_DATA_RAW_IMAGE, m_pFullImgBuffer);
  1273. // }
  1274. // else
  1275. // {
  1276. // if (!CheckImageExi((WORD*)m_pFrm1x1Buffer, m_nRawImgWidth, m_nRawImgHeight, m_nExiThreshold))
  1277. // {
  1278. // FWARN("Image EXI too low");
  1279. // return;
  1280. // }
  1281. // DataFeedback(EVT_DATA_RAW_IMAGE, m_pFrm1x1Buffer);
  1282. // }
  1283. // if (m_bSaveRaw)
  1284. // {
  1285. // FINFO("Begin save Flu CropRaw");
  1286. // char szTemp[30] = { 0 };
  1287. // string strFileName = m_strWorkPath + "\\Image";
  1288. // /*if (m_strCurrentExamType == "Rad")
  1289. // {
  1290. // strFileName += "\\CropImage_Rad.raw";
  1291. // }
  1292. // else
  1293. // {
  1294. // sprintf_s(szTemp, "\\CropImage_%d.raw", CaptureFrame);
  1295. // strFileName += szTemp;
  1296. // }*/
  1297. // sprintf_s(szTemp, "\\CropImage_%d.raw", CaptureFrame);
  1298. // strFileName += szTemp;
  1299. // std::filesystem::path file_path{ strFileName.c_str() };
  1300. // std::ofstream file_stream(file_path, std::ios::binary);
  1301. // if (!file_stream.is_open())
  1302. // {
  1303. // FERROR("Open Save File Failed");
  1304. // }
  1305. // if (bImageCrop)
  1306. // {
  1307. // unsigned int nTempSize = m_nImageWidth * m_nImageHeight * 2;
  1308. // file_stream.write(reinterpret_cast<const char*>(m_pFullImgBuffer), nTempSize);
  1309. // }
  1310. // else
  1311. // {
  1312. // unsigned int nTempSize = m_nRawImgWidth * m_nRawImgHeight * 2;
  1313. // file_stream.write(reinterpret_cast<const char*>(m_pFrm1x1Buffer), nTempSize);
  1314. // }
  1315. // file_stream.close();
  1316. // FINFO("Save Flu CropImage Over");
  1317. // }
  1318. //}
  1319. //if (m_nBinningMode == 1)
  1320. //{
  1321. // if (m_pFrm2x2Buffer == nullptr)
  1322. // {
  1323. // FERROR("Image Buffer is Null");
  1324. // return;
  1325. // }
  1326. // if (m_nCropLeft != 0 || m_nCropTop != 0 || m_nCropRight != 0 || m_nCropBottom != 0)
  1327. // {
  1328. // ret = CropImageMargin(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight,
  1329. // m_pFrm2x2Buffer, m_nRawImgWidth, m_nRawImgHeight, 16,
  1330. // m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  1331. // if (ret)
  1332. // {
  1333. // FERROR("CropImageMargin fail!!");
  1334. // }
  1335. // else
  1336. // {
  1337. // FINFO("CropImageMargin success!");
  1338. // bImageCrop = true;
  1339. // }
  1340. // }
  1341. // //上图之前回调图像的宽高,使得上层在拷贝内存时是正确的图像大小
  1342. // if (bImageCrop)
  1343. // {
  1344. // ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nImageWidth);
  1345. // ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nImageHeight);
  1346. // }
  1347. // else
  1348. // {
  1349. // ConfFeedback(EVT_CONF_RAW_WIDTH, m_nCurrentPanelID, "", m_nRawImgWidth);
  1350. // ConfFeedback(EVT_CONF_RAW_HIGHT, m_nCurrentPanelID, "", m_nRawImgHeight);
  1351. // }
  1352. // if (bImageCrop)
  1353. // {
  1354. // if (!CheckImageExi(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight, m_nExiThreshold))
  1355. // {
  1356. // FWARN("Image EXI too low");
  1357. // return;
  1358. // }
  1359. // DataFeedback(EVT_DATA_RAW_IMAGE, m_pFullImgBuffer);
  1360. // }
  1361. // else
  1362. // {
  1363. // if (!CheckImageExi((WORD*)m_pFrm2x2Buffer, m_nRawImgWidth, m_nRawImgHeight, m_nExiThreshold))
  1364. // {
  1365. // FWARN("Image EXI too low");
  1366. // return;
  1367. // }
  1368. // DataFeedback(EVT_DATA_RAW_IMAGE, m_pFrm2x2Buffer);
  1369. // }
  1370. // if (m_bSaveRaw)
  1371. // {
  1372. // FINFO("Begin save CropRaw");
  1373. // char szTemp[30] = { 0 };
  1374. // string strFileName = m_strWorkPath + "\\Image";
  1375. // if (m_strCurrentExamType == "Rad")
  1376. // {
  1377. // strFileName += "\\CropImage_Rad.raw";
  1378. // }
  1379. // else
  1380. // {
  1381. // sprintf_s(szTemp, "\\CropImage_%d.raw", CaptureFrame);
  1382. // strFileName += szTemp;
  1383. // }
  1384. // std::filesystem::path file_path{ strFileName.c_str() };
  1385. // std::ofstream file_stream(file_path, std::ios::binary);
  1386. // if (!file_stream.is_open())
  1387. // {
  1388. // FERROR("Open Save File Failed");
  1389. // }
  1390. // if (bImageCrop)
  1391. // {
  1392. // unsigned int nTempSize = m_nImageWidth * m_nImageHeight * 2;
  1393. // file_stream.write(reinterpret_cast<const char*>(m_pFullImgBuffer), nTempSize);
  1394. // }
  1395. // else
  1396. // {
  1397. // unsigned int nTempSize = m_nRawImgWidth * m_nRawImgHeight * 2;
  1398. // file_stream.write(reinterpret_cast<const char*>(m_pFrm2x2Buffer), nTempSize);
  1399. // }
  1400. // file_stream.close();
  1401. // FINFO("Save CropImage Over");
  1402. // }
  1403. //}
  1404. }
  1405. void Detector_Rayence::OnRadImageEvt(int CaptureFrame, bool bIsCaptureRaw)
  1406. {
  1407. FINFO("OnProcessImage ");
  1408. if (m_pOneShotBuffer == nullptr)
  1409. {
  1410. FERROR("Binning Mode 1x1 Image Buffer is Null");
  1411. return;
  1412. }
  1413. CropImageMargin(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight,
  1414. m_pOneShotBuffer, m_nRawImgWidth, m_nRawImgHeight, 16,
  1415. m_nCropLeft, m_nCropTop, m_nCropRight, m_nCropBottom);
  1416. if (!CheckImageExi(m_pFullImgBuffer, m_nImageWidth, m_nImageHeight, m_nExiThreshold))
  1417. {
  1418. FWARN("Image EXI too low");
  1419. return;
  1420. }
  1421. DataFeedback(EVT_DATA_RAW_IMAGE, m_pFullImgBuffer);
  1422. if (m_bSaveRaw)
  1423. {
  1424. FINFO("Begin save Rad CropRaw");
  1425. char szTemp[30] = { 0 };
  1426. string strFileName = m_strWorkPath + "\\Image";
  1427. if (m_strCurrentExamType == "Rad")
  1428. {
  1429. strFileName += "\\CropImage_Rad.raw";
  1430. }
  1431. //else
  1432. //{
  1433. // sprintf_s(szTemp, "\\CropImage_%d.raw", CaptureFrame);
  1434. // strFileName += szTemp;
  1435. //}
  1436. std::filesystem::path file_path{ strFileName.c_str() };
  1437. std::ofstream file_stream(file_path, std::ios::binary);
  1438. if (!file_stream.is_open())
  1439. {
  1440. FERROR("Open Save File Failed");
  1441. }
  1442. unsigned int nTempSize = m_nImageWidth * m_nImageHeight * 2;
  1443. file_stream.write(reinterpret_cast<const char*>(m_pFullImgBuffer), nTempSize);
  1444. file_stream.close();
  1445. FINFO("Save Rad CropImage Over");
  1446. }
  1447. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_OFF);
  1448. if (eDetStatus::DetStatus_Acquire == GetRayenceDPCStatus())
  1449. {
  1450. FINFO("Calling StopAcquisition");
  1451. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  1452. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  1453. SetRayenceDPCStatus(eDetStatus::DetStatus_Standby); //停止采集,设置状态
  1454. }
  1455. else
  1456. {
  1457. FINFO("Not in acquire status");
  1458. }
  1459. }
  1460. bool Detector_Rayence::StartGainCalibration()
  1461. {
  1462. FINFO("StartGainCalibration ");
  1463. return true;
  1464. }
  1465. //获取只用于本DPC记录的探测器状态
  1466. eDetStatus Detector_Rayence::GetRayenceDPCStatus()
  1467. {
  1468. string strStatus = "Unknown";
  1469. switch (m_eStatus)
  1470. {
  1471. case eDetStatus::DetStatus_NotInit:
  1472. strStatus = "NotInit";
  1473. break;
  1474. case eDetStatus::DetStatus_NotConn:
  1475. strStatus = "NotConnect";
  1476. break;
  1477. case eDetStatus::DetStatus_Sleep:
  1478. strStatus = "Sleep";
  1479. break;
  1480. case eDetStatus::DetStatus_Standby:
  1481. strStatus = "Standby";
  1482. break;
  1483. case eDetStatus::DetStatus_Work:
  1484. strStatus = "Work";
  1485. break;
  1486. case eDetStatus::DetStatus_Acquire:
  1487. strStatus = "Acquire";
  1488. break;
  1489. case eDetStatus::DetStatus_Offset:
  1490. strStatus = "Offset";
  1491. break;
  1492. case eDetStatus::DetStatus_XrayCalibration:
  1493. strStatus = "XrayCalibration";
  1494. break;
  1495. default:
  1496. break;
  1497. }
  1498. FINFO("Driver status: {$}", strStatus.c_str());
  1499. return m_eStatus;
  1500. }
  1501. //设置只用于本DPC的探测器状态
  1502. bool Detector_Rayence::SetRayenceDPCStatus(eDetStatus status)
  1503. {
  1504. string strStatus = "Unknown";
  1505. bool bSetStatus = true;
  1506. switch (status)
  1507. {
  1508. case eDetStatus::DetStatus_NotInit:
  1509. strStatus = "NotIni";
  1510. break;
  1511. case eDetStatus::DetStatus_NotConn:
  1512. strStatus = "NotConn";
  1513. break;
  1514. case eDetStatus::DetStatus_Sleep:
  1515. strStatus = "Sleep";
  1516. break;
  1517. case eDetStatus::DetStatus_Standby:
  1518. strStatus = "Standby";
  1519. break;
  1520. case eDetStatus::DetStatus_Work:
  1521. strStatus = "Work";
  1522. break;
  1523. case eDetStatus::DetStatus_Acquire:
  1524. strStatus = "Acquire";
  1525. break;
  1526. case eDetStatus::DetStatus_Offset:
  1527. strStatus = "Offset";
  1528. break;
  1529. case eDetStatus::DetStatus_XrayCalibration:
  1530. strStatus = "XrayCalibration";
  1531. break;
  1532. default:
  1533. bSetStatus = false;
  1534. break;
  1535. }
  1536. if (bSetStatus)
  1537. {
  1538. m_eStatus = status;
  1539. FINFO("Set driver status: {$}", strStatus.c_str());
  1540. }
  1541. else
  1542. {
  1543. FWARN("{$} {$} is a illegal status", strStatus.c_str(), (int)status);
  1544. }
  1545. return bSetStatus;
  1546. }
  1547. //参照RFOC动态代码整理的图像裁剪功能
  1548. int Detector_Rayence::CropImageMargin(LPVOID pDstData, int& nDstWidth, int& nDstHeight,
  1549. LPVOID pScrData, int nSrcWidth, int nSrcHeight, int nBits,
  1550. int nLeftMargin, int nTopMargin, int nRightMargin, int nBottomMargin)
  1551. {
  1552. FINFO("CropImageMargin ");
  1553. if ((pDstData == NULL) || (pScrData == NULL) || (nSrcWidth <= 0) || (nSrcHeight <= 0) || (nBits <= 0))
  1554. return -1;
  1555. if ((nLeftMargin >= nSrcWidth) || (nTopMargin >= nSrcHeight))
  1556. return -1;
  1557. int nBitsToBYTE = (int)((nBits + 7) * 0.125);
  1558. if (nBitsToBYTE < 1)
  1559. return -1;
  1560. int nXL, nXR, nYL, nYR;
  1561. nXL = nLeftMargin;//32
  1562. nYL = nTopMargin;
  1563. if (nSrcWidth - nRightMargin < 0)
  1564. return -1;
  1565. nXR = nSrcWidth - nRightMargin - 1; //2783
  1566. if (nXR < nXL)
  1567. return -1;
  1568. if (nSrcHeight - nBottomMargin < 0)
  1569. return -1;
  1570. nYR = nSrcHeight - nBottomMargin - 1;
  1571. if (nYR < nYL)
  1572. return -1;
  1573. nDstWidth = nXR - nXL + 1;
  1574. nDstHeight = nYR - nYL + 1;
  1575. FINFO("TopCrop:{$};Bottom:{$},nDstWidth:{$},nDstHeight:{$},Bits:{$}", nYL, nYR, nDstWidth, nDstHeight, nBitsToBYTE);
  1576. int i = 0;
  1577. #pragma omp parallel private(i)
  1578. {
  1579. #pragma omp for
  1580. for (i = nYL; i <= nYR; i++)
  1581. {
  1582. ::memcpy((WORD*)pDstData + (i - nYL) * nDstWidth, (WORD*)pScrData + (i * nSrcWidth + nXL), nDstWidth * nBitsToBYTE);
  1583. }
  1584. }
  1585. return 0;
  1586. }
  1587. std::string Detector_Rayence::SaveAveFrames(unsigned short* pBuf, TCHAR* pszFileName)
  1588. {
  1589. if (pBuf)
  1590. {
  1591. TCHAR szBuf[MAX_PATH] = { 0 };
  1592. TCHAR szCalDir[MAX_PATH] = { 0 };
  1593. if (pszFileName == NULL)
  1594. {
  1595. switch (m_nFlags)
  1596. {
  1597. case GET_DARK:
  1598. m_Intf.rVDC_GetCalibrationDirectory(szCalDir);
  1599. _stprintf(szBuf, _T("%s\\%s"), szCalDir, _T("dark.raw"));
  1600. FINFO("CalibrationDirectory: {$}", szBuf);
  1601. break;
  1602. case GET_BRIGHT:
  1603. m_Intf.rVDC_GetCalibrationDirectory(szCalDir);
  1604. _stprintf(szBuf, _T("%s\\x%05d.raw"), szCalDir, GetMedian(m_nFrmAveBufSize, pBuf, 15));
  1605. FINFO("CalibrationDirectory: {$}", szBuf);
  1606. break;
  1607. default:
  1608. break;
  1609. }
  1610. }
  1611. FILE* fp = _tfopen(szBuf, _T("wb"));
  1612. if (fp)
  1613. {
  1614. fwrite(pBuf, sizeof(unsigned short), m_nFrmAveBufSize, fp);
  1615. fclose(fp);
  1616. }
  1617. if (m_nCalModeId == 0)
  1618. {
  1619. memset(m_pFrm1x1AveBuffer, 0, m_nFrmAveBufSize * sizeof(int));
  1620. }
  1621. if (m_nCalModeId == 1)
  1622. {
  1623. memset(m_pFrm2x2AveBuffer, 0, m_nFrmAveBufSize * sizeof(int));
  1624. }
  1625. return(szBuf);
  1626. }
  1627. return (_T(""));
  1628. }
  1629. int Detector_Rayence::GetMedian(int nNumPixel, const unsigned short* pData, int nCurPixelPro)
  1630. {
  1631. int iMax, iMin;
  1632. int* pHist = iDsp_BuildHistogram(nNumPixel, pData, &iMin, &iMax);
  1633. int nGamut = iMax - iMin + 1;
  1634. int nRes;
  1635. // remove _nCurPixelPro(15%) of points from top
  1636. if (nCurPixelPro > 0)
  1637. {
  1638. int nSumT = (nNumPixel * nCurPixelPro) / 100;
  1639. int nSum = 0;
  1640. int nStartIdx = 0;
  1641. int nStopIdx = nGamut - 1;
  1642. while (nSum < nSumT)
  1643. {
  1644. nSum += pHist[nStopIdx--];
  1645. }
  1646. // remove _nCurPixelPro(15%) of points from bottom
  1647. nSum = 0;
  1648. while (nSum < nSumT)
  1649. {
  1650. nSum += pHist[nStartIdx++];
  1651. }
  1652. // fine median
  1653. nRes = nStartIdx;
  1654. int nMaxNumPoints = pHist[nRes];
  1655. while (nStartIdx++ < nStopIdx)
  1656. {
  1657. if (nMaxNumPoints < pHist[nStartIdx])
  1658. {
  1659. nRes = nStartIdx;
  1660. nMaxNumPoints = pHist[nStartIdx];
  1661. }
  1662. }
  1663. }
  1664. else
  1665. {
  1666. int nSumT = nNumPixel / 2;
  1667. int nSum = 0;
  1668. nRes = 0;
  1669. while ((nSum < nSumT) && (nRes < nGamut))
  1670. {
  1671. nSum += pHist[nRes++];
  1672. }
  1673. }
  1674. delete pHist;
  1675. return (nRes + iMin);
  1676. }
  1677. void Detector_Rayence::iDsp_FindMinMax(int nNumPix, const unsigned short* psData, int* piMin, int* piMax)
  1678. {
  1679. int i, nVal, iMin = 0xFFFF, iMax = -0xFFFF;
  1680. for (i = 0; i < nNumPix; i++)
  1681. {
  1682. nVal = psData[i];
  1683. if (iMin > nVal) { iMin = nVal; }
  1684. if (iMax < nVal) { iMax = nVal; }
  1685. }
  1686. *piMin = iMin;
  1687. *piMax = iMax;
  1688. }
  1689. int* Detector_Rayence::iDsp_BuildHistogram(int nNumPix, const unsigned short* psData, int* piMin, int* piMax)
  1690. {
  1691. int iMin, iMax;
  1692. iDsp_FindMinMax(nNumPix, psData, &iMin, &iMax);
  1693. *piMin = iMin;
  1694. *piMax = iMax;
  1695. int iGamut = iMax - iMin + 1,
  1696. * pHist = new int[iGamut];
  1697. memset(pHist, 0, iGamut * sizeof(int));
  1698. for (int i = 0; i < nNumPix; i++)
  1699. {
  1700. pHist[psData[i] - iMin]++;
  1701. }
  1702. return pHist;
  1703. }
  1704. void Detector_Rayence::CALLBACK_Acquisition(tVDACQ_CallBackRec* ACBR)
  1705. {
  1706. if (ACBR->rEvent == cVDACQ_ECaptureRecv && m_eStatus == eDetStatus::DetStatus_Standby)
  1707. {
  1708. return;
  1709. }
  1710. FINFO("CALLBACK_Acquisition type:{$}, event:{$}", ACBR->rType, ACBR->rEvent);
  1711. switch (ACBR->rType)
  1712. {
  1713. case cVDACQ_ETTrace:
  1714. case cVDACQ_ETTraceT:
  1715. {
  1716. switch (ACBR->rEvent)
  1717. {
  1718. case cVDACQ_EAbort:
  1719. {
  1720. FINFO("ACBR->rEvent cVDACQ_EAbort");
  1721. break;
  1722. }
  1723. case cVDACQ_EClose:
  1724. {
  1725. FINFO("ACBR->rEvent cVDACQ_EClose");
  1726. break;
  1727. }
  1728. case cVDACQ_EAT_Ready:
  1729. {
  1730. FINFO("AED Ready");
  1731. break;
  1732. }
  1733. case cVDACQ_ECapture:
  1734. {
  1735. FINFO("ACBR->rEvent cVDACQ_ECapture");
  1736. break;
  1737. }
  1738. case cVDACQ_ECapturePerc:
  1739. {
  1740. FINFO("ACBR->rEvent cVDACQ_ECapturePerc");
  1741. break;
  1742. }
  1743. case cVDACQ_ECaptureRecv:
  1744. {
  1745. FINFO("Flu Image Arrive");
  1746. HandleCaptureRecvEvent(ACBR, false);
  1747. break;
  1748. }
  1749. case cVDACQ_EIdle:
  1750. {
  1751. FINFO("ACBR->rEvent cVDACQ_EIdle");
  1752. break;
  1753. }
  1754. case cVDACQ_EAT_Wait:
  1755. {
  1756. FINFO("AED Wait");
  1757. break;
  1758. }
  1759. case cVDACQ_ECaptureFrame:
  1760. {
  1761. FINFO("ACBR->rEvent cVDACQ_ECaptureFrame");
  1762. OnRadImageEvt(ACBR->rCaptureFrames, false);
  1763. break;
  1764. }
  1765. case cVDACQ_ECapture2_Receive:
  1766. {
  1767. FINFO("ACBR_>rEvent cVDACQ_ECapture2_Receive");
  1768. HandleCaptureRecvEvent(ACBR, true);
  1769. break;
  1770. }
  1771. case cVDACQ_ECapture2_Expose:
  1772. {
  1773. auto Rad_Sync = [this](int XWindow)
  1774. {
  1775. if (m_pSynClient != nullptr)
  1776. {
  1777. if (!m_pSynClient->IsClosed())
  1778. {
  1779. ResDataObject Request, Response;
  1780. Request.add("P0", XWindow);
  1781. m_pSynClient->Action("SetDirectExpSignal", Request, Response, 4993, "CCOS/DEVICE/SyncBox");
  1782. FDEBUG("V3_FullUCB Client execute [SetDirectExpSignal][{$}]", XWindow);
  1783. if (XWindow == 1)
  1784. {
  1785. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1786. }
  1787. }
  1788. else
  1789. {
  1790. FDEBUG("V3_FullUCB Client is Close");
  1791. }
  1792. }
  1793. else
  1794. {
  1795. FDEBUG("V3_FullUCB Client is NULL");
  1796. }
  1797. };
  1798. switch (ACBR->rStatus)
  1799. {
  1800. case cVDACQ_ESStart:
  1801. Rad_Sync(1);
  1802. /*if (m_pSynClient != nullptr)
  1803. {
  1804. if (!m_pSynClient->IsClosed())
  1805. {
  1806. ResDataObject Request, Response;
  1807. Request.add("P0", 1);
  1808. m_pSynClient->Action("SetDirectExpSignal", Request, Response, 4993, "CCOS/DEVICE/SyncBox");
  1809. Debug("V3_FullUCB Client execute [SetDirectExpSignal][{$}]", "1");
  1810. StatusFeedback(EVT_STATUS_PANEL, PANEL_XWINDOW_ON);
  1811. }
  1812. else
  1813. {
  1814. Debug("V3_FullUCB Client is Close");
  1815. }
  1816. }
  1817. else
  1818. {
  1819. Debug("V3_FullUCB Client is NULL");
  1820. }*/
  1821. break;
  1822. case cVDACQ_ESDone:
  1823. Rad_Sync(0);
  1824. /*if (m_pSynClient != nullptr)
  1825. {
  1826. if (!m_pSynClient->IsClosed())
  1827. {
  1828. ResDataObject Request, Response;
  1829. Request.add("P0", 0);
  1830. m_pSynClient->Action("SetDirectExpSignal", Request, Response, 4993, "CCOS/DEVICE/SyncBox");
  1831. Debug("V3_FullUCB Client execute [SetDirectExpSignal][{$}]", "0");
  1832. }
  1833. else
  1834. {
  1835. Debug("V3_FullUCB Client is Close");
  1836. }
  1837. }
  1838. else
  1839. {
  1840. Debug("V3_FullUCB Client is NULL");
  1841. }*/
  1842. break;
  1843. }
  1844. break;
  1845. }
  1846. }
  1847. }
  1848. break;
  1849. default:
  1850. break;
  1851. }
  1852. }
  1853. void Detector_Rayence::CALLBACK_Dark_Acquisition(tVDACQ_CallBackRec* ACBR)
  1854. {
  1855. if (ACBR->rEvent == cVDACQ_ECaptureRecv && m_eStatus == eDetStatus::DetStatus_Standby)
  1856. {
  1857. return;
  1858. }
  1859. FINFO("CALLBACK_Acquisition type:{$}, event:{$}", ACBR->rType, ACBR->rEvent);
  1860. switch (ACBR->rType)
  1861. {
  1862. case cVDACQ_ETTrace:
  1863. case cVDACQ_ETTraceT:
  1864. {
  1865. switch (ACBR->rEvent)
  1866. {
  1867. case cVDACQ_EAbort:
  1868. {
  1869. FINFO("ACBR->rEvent cVDACQ_EAbort");
  1870. ErrorFeedback(EVT_ERR_OFFSET_FAILED);
  1871. break;
  1872. }
  1873. case cVDACQ_EClose:
  1874. {
  1875. FINFO("ACBR->rEvent cVDACQ_EClose");
  1876. break;
  1877. }
  1878. case cVDACQ_EAT_Ready:
  1879. {
  1880. FINFO("AED Ready");
  1881. break;
  1882. }
  1883. case cVDACQ_ECapture:
  1884. {
  1885. FINFO("ACBR->rEvent cVDACQ_ECapture");
  1886. break;
  1887. }
  1888. case cVDACQ_ECapturePerc:
  1889. {
  1890. FINFO("ACBR->rEvent cVDACQ_ECapturePerc");
  1891. break;
  1892. }
  1893. case cVDACQ_ECaptureRecv:
  1894. {
  1895. FINFO("Dark Image Arrive");
  1896. auto Dark_Receive = [this](int ModeID)
  1897. {
  1898. m_nFrmAveBufSize = m_nFrmWidth * m_nFrmHeight;
  1899. if (!m_nAveCount)
  1900. {
  1901. if (ModeID == 0)
  1902. memset(m_pDark1x1Buffer, 0, m_nFrmAveBufSize * sizeof(short));
  1903. if (ModeID == 1)
  1904. memset(m_pDark2x2Buffer, 0, m_nFrmAveBufSize * sizeof(short));
  1905. }
  1906. if (m_nRecvCount >= m_nSkipNum)
  1907. {
  1908. if (m_nFlags == GET_DARK)
  1909. {
  1910. for (size_t i = 0; i < m_nFrmAveBufSize; i++)
  1911. {
  1912. if (ModeID == 0)
  1913. m_pFrm1x1AveBuffer[i] += m_pDark1x1Buffer[i];
  1914. if (ModeID == 1)
  1915. m_pFrm2x2AveBuffer[i] += m_pDark2x2Buffer[i];
  1916. }
  1917. }
  1918. m_nAveCount++;
  1919. }
  1920. if (m_nAveCount >= m_nCalToAcqNum - m_nSkipNum)
  1921. {
  1922. if (m_nFlags == GET_DARK)
  1923. {
  1924. unsigned short* pAveBuf = new unsigned short[m_nFrmAveBufSize];
  1925. memset(pAveBuf, 0, sizeof(unsigned short) * m_nFrmAveBufSize);
  1926. if (m_nAveCount > 0)
  1927. {
  1928. for (int n = 0; n < m_nFrmAveBufSize; n++)
  1929. {
  1930. if (ModeID == 0)
  1931. pAveBuf[n] = (unsigned short)(m_pFrm1x1AveBuffer[n] > 0 ? (m_pFrm1x1AveBuffer[n] / m_nAveCount) : 0);
  1932. if (ModeID == 1)
  1933. pAveBuf[n] = (unsigned short)(m_pFrm2x2AveBuffer[n] > 0 ? (m_pFrm2x2AveBuffer[n] / m_nAveCount) : 0);
  1934. }
  1935. SaveAveFrames(pAveBuf, NULL);
  1936. }
  1937. if (pAveBuf)
  1938. {
  1939. delete[] pAveBuf;
  1940. pAveBuf = nullptr;
  1941. }
  1942. }
  1943. }
  1944. if (m_nRecvCount >= m_nCalToAcqNum)
  1945. {
  1946. FINFO("m_nCalToAcqNum: {$}", m_nCalToAcqNum);
  1947. FINFO("m_nRecvCount: {$}", m_nRecvCount);
  1948. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  1949. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  1950. m_nRecvCount = 0;
  1951. m_nAveCount = 0;
  1952. m_bDoOffset = false;
  1953. SetRayenceDPCStatus(eDetStatus::DetStatus_Standby);
  1954. m_bRayAcqing = false;
  1955. FINFO("one offset complete");
  1956. }
  1957. };
  1958. m_nRecvCount++;
  1959. if (m_eStatus == eDetStatus::DetStatus_Offset)
  1960. {
  1961. Dark_Receive(m_nCalModeId);
  1962. /*if (m_nCalModeId == 0)
  1963. {
  1964. if (m_pDark1x1Buffer)
  1965. {
  1966. m_nFrmAveBufSize = m_nFrmWidth * m_nFrmHeight;
  1967. if (!m_nAveCount)
  1968. {
  1969. memset(m_pDark1x1Buffer, 0, m_nFrmAveBufSize * sizeof(short));
  1970. }
  1971. if (m_nRecvCount >= m_nSkipNum)
  1972. {
  1973. if (m_nFlags == GET_DARK)
  1974. {
  1975. for (size_t i = 0; i < m_nFrmAveBufSize; i++)
  1976. {
  1977. m_pFrm1x1AveBuffer[i] += m_pDark1x1Buffer[i];
  1978. }
  1979. }
  1980. m_nAveCount++;
  1981. }
  1982. if (m_nAveCount >= m_nCalToAcqNum - m_nSkipNum)
  1983. {
  1984. if (m_nFlags == GET_DARK)
  1985. {
  1986. unsigned short* pAveBuf = new unsigned short[m_nFrmAveBufSize];
  1987. memset(pAveBuf, 0, sizeof(unsigned short) * m_nFrmAveBufSize);
  1988. if (m_nAveCount > 0)
  1989. {
  1990. for (int n = 0; n < m_nFrmAveBufSize; n++)
  1991. {
  1992. pAveBuf[n] = (unsigned short)(m_pFrm1x1AveBuffer[n] > 0 ? (m_pFrm1x1AveBuffer[n] / m_nAveCount) : 0);
  1993. }
  1994. SaveAveFrames(pAveBuf, NULL);
  1995. }
  1996. if (pAveBuf)
  1997. {
  1998. delete[] pAveBuf;
  1999. pAveBuf = nullptr;
  2000. }
  2001. }
  2002. }
  2003. }
  2004. if (m_nRecvCount >= m_nCalToAcqNum)
  2005. {
  2006. FINFO("m_nCalToAcqNum: {$}", m_nCalToAcqNum);
  2007. FINFO("m_nRecvCount: {$}", m_nRecvCount);
  2008. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  2009. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  2010. m_nRecvCount = 0;
  2011. m_nAveCount = 0;
  2012. m_bDoOffset = false;
  2013. SetRayenceDPCStatus(eDetStatus::DetStatus_Standby);
  2014. m_bRayAcqing = false;
  2015. FINFO("one offset complete");
  2016. }
  2017. }
  2018. if (m_nCalModeId == 1)
  2019. {
  2020. if (m_pDark2x2Buffer)
  2021. {
  2022. m_nFrmAveBufSize = m_nFrmWidth * m_nFrmHeight;
  2023. if (!m_nAveCount)
  2024. {
  2025. memset(m_pDark2x2Buffer, 0, m_nFrmAveBufSize * sizeof(short));
  2026. }
  2027. if (m_nRecvCount >= m_nSkipNum)
  2028. {
  2029. if (m_nFlags == GET_DARK)
  2030. {
  2031. for (size_t i = 0; i < m_nFrmAveBufSize; i++)
  2032. {
  2033. m_pFrm2x2AveBuffer[i] += m_pDark2x2Buffer[i];
  2034. }
  2035. }
  2036. m_nAveCount++;
  2037. }
  2038. if (m_nAveCount >= m_nCalToAcqNum - m_nSkipNum)
  2039. {
  2040. if (m_nFlags == GET_DARK)
  2041. {
  2042. unsigned short* pAveBuf = new unsigned short[m_nFrmAveBufSize];
  2043. memset(pAveBuf, 0, sizeof(unsigned short) * m_nFrmAveBufSize);
  2044. if (m_nAveCount > 0)
  2045. {
  2046. for (int n = 0; n < m_nFrmAveBufSize; n++)
  2047. {
  2048. pAveBuf[n] = (unsigned short)(m_pFrm2x2AveBuffer[n] > 0 ? (m_pFrm2x2AveBuffer[n] / m_nAveCount) : 0);
  2049. }
  2050. SaveAveFrames(pAveBuf, NULL);
  2051. }
  2052. if (pAveBuf)
  2053. {
  2054. delete[] pAveBuf;
  2055. pAveBuf = nullptr;
  2056. }
  2057. }
  2058. }
  2059. }
  2060. if (m_nRecvCount >= m_nCalToAcqNum)
  2061. {
  2062. FINFO("m_nCalToAcqNum: {$}", m_nCalToAcqNum);
  2063. FINFO("m_nRecvCount: {$}", m_nRecvCount);
  2064. m_Intf.rVDACQ_Abort(rACQ_CallBackRec);
  2065. m_Intf.rVDACQ_Close(rACQ_CallBackRec);
  2066. m_nRecvCount = 0;
  2067. m_nAveCount = 0;
  2068. m_bDoOffset = false;
  2069. SetRayenceDPCStatus(eDetStatus::DetStatus_Standby);
  2070. m_bRayAcqing = false;
  2071. FINFO("one offset complete");
  2072. }
  2073. }*/
  2074. }
  2075. break;
  2076. }
  2077. case cVDACQ_EIdle:
  2078. {
  2079. FINFO("ACBR->rEvent cVDACQ_EIdle");
  2080. break;
  2081. }
  2082. case cVDACQ_EAT_Wait:
  2083. {
  2084. FINFO("AED Wait");
  2085. break;
  2086. }
  2087. case cVDACQ_ECaptureFrame:
  2088. {
  2089. FINFO("ACBR->rEvent cVDACQ_ECaptureFrame");
  2090. break;
  2091. }
  2092. case cVDACQ_ECapture2_Receive:
  2093. {
  2094. FINFO("ACBR_>rEvent cVDACQ_ECapture2_Receive");
  2095. break;
  2096. }
  2097. case cVDACQ_ECapture2_Expose:
  2098. {
  2099. break;
  2100. }
  2101. }
  2102. }
  2103. break;
  2104. default:
  2105. break;
  2106. }
  2107. }
  2108. void Detector_Rayence::ConfFeedback(int nEventID, int nDetectorID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2109. {
  2110. if (-1 == nDetectorID)
  2111. {
  2112. nDetectorID = m_nCurrentPanelID;
  2113. }
  2114. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2115. nEventID, EVT_LEVEL_CONFIGURATION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2116. }
  2117. void Detector_Rayence::InfoFeedback(int nEventID, int nDetectorID, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, void* pParam)
  2118. {
  2119. if (-1 == nDetectorID)
  2120. {
  2121. nDetectorID = m_nCurrentPanelID;
  2122. }
  2123. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2124. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2125. }
  2126. void Detector_Rayence::StatusFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  2127. {
  2128. if (-1 == nDetectorID)
  2129. {
  2130. nDetectorID = m_nCurrentPanelID;
  2131. }
  2132. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2133. nEventID, EVT_LEVEL_STATUS, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2134. }
  2135. void Detector_Rayence::DataFeedback(int nEventID, void* pParam, int nParam1, float fParam2, const char* pszMsg, int nPtrParamLen, int nDetectorID)
  2136. {
  2137. if (-1 == nDetectorID)
  2138. {
  2139. nDetectorID = m_nCurrentPanelID;
  2140. }
  2141. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2142. nEventID, EVT_LEVEL_DATA, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2143. }
  2144. void Detector_Rayence::WarnFeedback(int nEventID, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam, int nDetectorID)
  2145. {
  2146. if (-1 == nDetectorID)
  2147. {
  2148. nDetectorID = m_nCurrentPanelID;
  2149. }
  2150. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2151. nEventID, EVT_LEVEL_WARNING, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2152. }
  2153. void Detector_Rayence::ErrorFeedback(int nEventID, const char* pszMsg, int nDetectorID, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2154. {
  2155. if (-1 == nDetectorID)
  2156. {
  2157. nDetectorID = m_nCurrentPanelID;
  2158. }
  2159. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2160. nEventID, EVT_LEVEL_ERROR, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2161. }
  2162. void Detector_Rayence::OffsetProgressFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  2163. {
  2164. if (-1 == nDetectorID)
  2165. {
  2166. nDetectorID = m_nCurrentPanelID;
  2167. }
  2168. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2169. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2170. }
  2171. void Detector_Rayence::OffsetStatusFeedback(int nEventID, int nParam1, const char* pszMsg, int nDetectorID, float fParam2, int nPtrParamLen, void* pParam)
  2172. {
  2173. if (-1 == nDetectorID)
  2174. {
  2175. nDetectorID = m_nCurrentPanelID;
  2176. }
  2177. ((FPDDeviceRayence*)(*m_pPanelID2DPC)[nDetectorID])->OnFPDCallback(nDetectorID,
  2178. nEventID, EVT_LEVEL_INFORMATOION, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  2179. }