DIOS.Dev.FPD.Rayence.cpp 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  1. #include "stdafx.h"
  2. #include "CCOS.Dev.FPD.Rayence.h"
  3. #include "common_api.h"
  4. #include "DICOMImageHeadKey.h"
  5. #include "Detector_Rayence.h"
  6. #include <sys/stat.h>
  7. namespace nsFPD = CCOS::Dev::Detail::Detector;
  8. static nsFPD::RayenceDriver gIODriver;
  9. Log4CPP::Logger* //mLog::gLogger = nullptr;
  10. extern Detector_Rayence* g_pDetector;
  11. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  12. {
  13. return &gIODriver;
  14. }
  15. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  16. {
  17. return new nsFPD::RayenceDriver();
  18. }
  19. nsFPD::RayenceDriver::RayenceDriver()
  20. {
  21. pObjDev = nullptr;
  22. m_bDriverConnect = false; //缺省为false
  23. m_pAttribute.reset(new ResDataObject());
  24. m_pDescription.reset(new ResDataObject());
  25. }
  26. nsFPD::RayenceDriver::~RayenceDriver()
  27. {
  28. //mLog::Close();
  29. Log4CPP::ThreadContext::Map::Clear();
  30. //mLog::gLogger = nullptr;
  31. }
  32. void nsFPD::RayenceDriver::Prepare()
  33. {
  34. //mLog::FINFO("--Func Driver-- Prepare Start");
  35. string strLogPath = GetProcessDirectory() + R"(\OEMDrivers\Detector\Conf\Log4CPP.Config.FPD.xml)";
  36. Log4CPP::GlobalContext::Map::Set(ZSKK::Utility::Hash("LogFileName"), "FPD.Rayence");
  37. auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  38. //mLog::gLogger = Log4CPP::LogManager::GetLogger("FPD.Rayence");
  39. //mLog::FINFO("Driver Prepare Over");
  40. }
  41. bool nsFPD::RayenceDriver::Connect()
  42. {
  43. //mLog::FINFO("--Func Driver-- Connect Start");
  44. pObjDev = new FPDDeviceRayence(EventCenter, m_ConfigFileName);
  45. m_bDriverConnect = true; //connect执行完毕,置为true
  46. //mLog::FINFO("Driver Connect Over");
  47. return true;
  48. }
  49. void nsFPD::RayenceDriver::Disconnect()
  50. {
  51. //mLog::FINFO("--Func Driver-- Disconnect Start");
  52. m_bDriverConnect = false; //disconnect置为false
  53. //mLog::FINFO("Driver Disconnect Over");
  54. }
  55. bool nsFPD::RayenceDriver::isConnected() const
  56. {
  57. return m_bDriverConnect;
  58. }
  59. auto nsFPD::RayenceDriver::CreateDevice(int index)->std::unique_ptr <IODevice>
  60. {
  61. //mLog::FINFO("--Func Driver-- CreateDevice Start");
  62. auto Device = std::unique_ptr<IODevice>(new IODevice(pObjDev));
  63. pObjDev->CreateDevice();
  64. pObjDev->Register();
  65. //mLog::FINFO("Driver CreateDevice Over");
  66. return Device;
  67. }
  68. std::string nsFPD::RayenceDriver::DriverProbe()
  69. {
  70. //mLog::FINFO("--Func Driver-- DriverProbe Start");
  71. ResDataObject r_config, HardwareInfo;
  72. if (r_config.loadFile(m_ConfigFileName.c_str()))
  73. {
  74. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  75. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  76. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  77. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  78. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  79. }
  80. else
  81. {
  82. HardwareInfo.add("MajorID", "Detector");
  83. HardwareInfo.add("MinorID", "RF");
  84. HardwareInfo.add("VendorID", "Rayence");
  85. #ifdef Rayence0909FCC
  86. HardwareInfo.add("ProductID", "0909FCC");
  87. #endif // Rayence0909FCC
  88. #ifdef Rayence1717FCC
  89. HardwareInfo.add("ProductID", "1717FCC");
  90. #endif // Rayence1717FCC
  91. HardwareInfo.add("SerialID", "Driver");
  92. }
  93. string str = HardwareInfo.encode();
  94. //mLog::FINFO("Driver DriverProbe Over");
  95. return str;
  96. }
  97. /***
  98. ** 获取ID和配置
  99. ***/
  100. std::string nsFPD::RayenceDriver::GetResource()
  101. {
  102. //mLog::FINFO("--Func Driver-- GetResource Start");
  103. ResDataObject r_config, temp;
  104. if (!temp.loadFile(m_ConfigFileName.c_str()))
  105. {
  106. //mLog::FERROR("load file FERROR! file name:{$}",m_ConfigFileName.c_str());
  107. return "";
  108. }
  109. m_ConfigAll = temp;
  110. r_config = temp["CONFIGURATION"];
  111. m_Configurations = r_config;
  112. ResDataObject DescriptionTemp;
  113. ResDataObject ListTemp;
  114. string strTemp = ""; //用于读取字符串配置信息
  115. int nTemp = -1; //用于读取整型配置信息
  116. string strValue = ""; //用于存储配置的值
  117. string strType = ""; //用于存储配置的类型 int/float/string...
  118. /***
  119. * 1. 通过循环,将所有配置项写到pDeviceConfig
  120. * 2. 记录配置项的内部key以及配置类型,类型对应了不同配置文件路径,用于读写真实值
  121. ***/
  122. try
  123. {
  124. int nConfigInfoCount = (int)m_Configurations["ConfigToolInfo"].GetKeyCount("AttributeInfo");
  125. m_pAttribute->clear();
  126. m_pDescription->clear();
  127. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  128. {
  129. DescriptionTemp.clear();
  130. ListTemp.clear();
  131. //AttributeType
  132. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Type"];
  133. DescriptionTemp.add(AttributeType, strTemp.c_str());
  134. strType = strTemp; //记录配置项的类型
  135. //AttributeKey
  136. //1. 根据AttributeType,内部key和配置路径,拿到当前的真实值
  137. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["InnerKey"];
  138. nTemp = (int)m_Configurations["ConfigToolInfo"][nInfoIndex]["PathID"];
  139. GetDeviceConfigValue(r_config, strTemp.c_str(), nTemp, strValue);
  140. //2. 赋值
  141. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  142. if ("int" == strType)
  143. {
  144. (*m_pAttribute).add(strTemp.c_str(), atoi(strValue.c_str()));
  145. }
  146. else if ("float" == strType)
  147. {
  148. (*m_pAttribute).add(strTemp.c_str(), atof(strValue.c_str()));
  149. }
  150. else //其它先按string类型处理
  151. {
  152. (*m_pAttribute).add(strTemp.c_str(), strValue.c_str());
  153. }
  154. //AttributeAccess
  155. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Access"];
  156. DescriptionTemp.add(AttributeAccess, strTemp.c_str());
  157. //AttributeRangeMin
  158. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["RangeMin"];
  159. if (strTemp != "") //不需要的配置项为空
  160. {
  161. DescriptionTemp.add(AttributeRangeMin, strTemp.c_str());
  162. }
  163. //AttributeRangeMax
  164. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["RangeMax"];
  165. if (strTemp != "") //不需要的配置项为空
  166. {
  167. DescriptionTemp.add(AttributeRangeMax, strTemp.c_str());
  168. }
  169. //AttributeList
  170. nTemp = m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["ListNum"];
  171. if (nTemp > 0) //ListNum不大于0时说明不需要list配置
  172. {
  173. for (int nListIndex = 0; nListIndex < nTemp; nListIndex++)
  174. {
  175. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["ListInfo"][nListIndex];
  176. auto temKey = std::to_string(nListIndex);
  177. ListTemp.add(temKey.c_str(), strTemp.c_str());
  178. }
  179. DescriptionTemp.add(AttributeList, ListTemp);
  180. }
  181. //AttributeRequired
  182. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Required"];
  183. DescriptionTemp.add(AttributeRequired, strTemp.c_str());
  184. //AttributeDefaultValue
  185. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["DefaultValue"];
  186. if (strTemp != "") //不需要的配置项为空
  187. {
  188. DescriptionTemp.add(AttributeDefaultValue, strTemp.c_str());
  189. }
  190. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  191. (*m_pDescription).add(strTemp.c_str(), DescriptionTemp);
  192. }
  193. }
  194. catch (exception e)
  195. {
  196. //mLog::FERROR("Get config FERROR: {$}", e.what());
  197. return "";
  198. }
  199. ResDataObject resDeviceResource;
  200. resDeviceResource.add(ConfKey::CcosDetectorAttribute, (*m_pAttribute));
  201. resDeviceResource.add(ConfKey::CcosDetectorDescription, (*m_pDescription));
  202. ResDataObject DescriptionTempEx;
  203. DescriptionTempEx.add(ConfKey::CcosDetectorConfig, resDeviceResource);
  204. m_DeviceConfig = DescriptionTempEx;
  205. string res = DescriptionTempEx.encode();
  206. //mLog::FINFO("Driver GetResouce Over");
  207. return res;
  208. }
  209. std::string nsFPD::RayenceDriver::DeviceProbe()
  210. {
  211. //mLog::FINFO("--Func Driver-- DeviceProbe Start");
  212. ResDataObject r_config, HardwareInfo;
  213. if (r_config.loadFile(m_ConfigFileName.c_str()))
  214. {
  215. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  216. HardwareInfo.add("MinorID", "Device");
  217. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  218. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  219. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  220. }
  221. else
  222. {
  223. HardwareInfo.add("MajorID", "Detector");
  224. HardwareInfo.add("MinorID", "Device");
  225. HardwareInfo.add("VendorID", "Rayence");
  226. #ifdef Rayence0909FCC
  227. HardwareInfo.add("ProductID", "0909FCC");
  228. #endif // Rayence0909FCC
  229. #ifdef Rayence1717FCC
  230. HardwareInfo.add("ProductID", "1717FCC");
  231. #endif // Rayence1717FCC
  232. HardwareInfo.add("SerialID", "1234");
  233. }
  234. string str = HardwareInfo.encode();
  235. //mLog::FINFO("Driver DeviceProve Over");
  236. return str;
  237. }
  238. bool nsFPD::RayenceDriver::GetDeviceConfig(std::string& Cfg)
  239. {
  240. //mLog::FINFO("--Func Driver-- GetDeviceConfig Start");
  241. Cfg = m_DeviceConfig.encode();
  242. //mLog::FINFO("Driver GetDeviceConfig Over");
  243. return true;
  244. }
  245. bool nsFPD::RayenceDriver::SetDeviceConfig(std::string Cfg)
  246. {
  247. //mLog::FINFO("--Func Driver-- SetDeviceConfig Start");
  248. //mLog::FINFO("DeviceConfig: {$}", Cfg.c_str());
  249. ResDataObject DeviceConfig;
  250. DeviceConfig.decode(Cfg.c_str());
  251. ResDataObject DescriptionTempEx;
  252. DescriptionTempEx = DeviceConfig["DeviceConfig"];
  253. bool bSaveFile = false; //true:重新保存配置文件
  254. string strAccess = "";
  255. for (int i = 0; i < DescriptionTempEx.size(); i++)
  256. {
  257. ResDataObject temp = DescriptionTempEx[i];
  258. //mLog::FINFO("{$}", temp.encode());
  259. for (int j = 0; j < temp.size(); j++)
  260. {
  261. string strKey = temp.GetKey(j);
  262. //mLog::FINFO("{$}", strKey.c_str());
  263. try
  264. {
  265. if (m_pAttribute->GetFirstOf(strKey.c_str()) >= 0)
  266. {
  267. strAccess = (string)(*m_pDescription)[strKey.c_str()]["Access"];
  268. if ("RW" == strAccess || "rw" == strAccess)
  269. {
  270. //修改对应配置,在其他单元的配置项要同时调用其修改函数修改真实值
  271. //1. 修改内存中的值,用于给上层发消息
  272. (*m_pAttribute)[strKey.c_str()] = temp[j];
  273. //2. 拿到Innerkey
  274. int nConfigInfoCount = (int)m_Configurations["ConfigToolInfo"].GetKeyCount("AttributeInfo");
  275. //mLog::FINFO("ConfigInfo Count: {$}", nConfigInfoCount);
  276. string strTemp = ""; //存储AttributeKey
  277. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  278. {
  279. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  280. if (strTemp == strKey)
  281. {
  282. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["InnerKey"];
  283. break;
  284. }
  285. }
  286. //3. 修改配置文件中的值
  287. if (SetDeviceConfigValue(m_Configurations, strTemp.c_str(), 1, temp[j]))
  288. {
  289. bSaveFile = true;
  290. }
  291. }
  292. else
  293. {
  294. //mLog::FINFO("{$} is not a RW configuration item", strKey.c_str());
  295. }
  296. }
  297. }
  298. catch (ResDataObjectExption& e)
  299. {
  300. //mLog::FERROR("SetDriverConfig crashed: {$}", e.what());
  301. return false;
  302. }
  303. }
  304. }
  305. if (bSaveFile)
  306. {
  307. //3. 重新保存配置文件
  308. SaveConfigFile(true);
  309. }
  310. //mLog::FINFO("Driver SetDeviceConfig Over");
  311. return true;
  312. }
  313. bool nsFPD::RayenceDriver::SaveConfigFile(bool bSendNotify)
  314. {
  315. //mLog::FINFO("--Func Driver-- SaveConfigFile Start");
  316. //mLog::FINFO("ConfigFileName:{$}", m_ConfigFileName);
  317. m_ConfigAll["CONFIGURATION"] = m_Configurations;
  318. m_ConfigAll.SaveFile(m_ConfigFileName.c_str());
  319. //mLog::FINFO("Driver SaveConfigFile Over");
  320. return true;
  321. }
  322. bool nsFPD::RayenceDriver::GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue)
  323. {
  324. return true;
  325. }
  326. bool nsFPD::RayenceDriver::SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey,
  327. int nPathID, const char* szValue)
  328. {
  329. return true;
  330. }
  331. //-----------------------------------------------------------------------------
  332. // FPDDeviceRayence
  333. //-----------------------------------------------------------------------------
  334. nsFPD::FPDDeviceRayence::FPDDeviceRayence(std::shared_ptr<IOEventCenter> center,std::string strConfigPath)
  335. :m_pDetector{},
  336. m_pImgBuffer{},
  337. m_nImageWidth{},
  338. m_nImageHeight{},
  339. m_nImgBits{},
  340. m_nAngle{},
  341. m_nPixelSpacing{},
  342. m_nSensitivity{},
  343. m_fCurrentPPS{},
  344. m_fDose(2.4),
  345. m_bConnect(false)
  346. {
  347. m_strWorkPath = GetProcessDirectory();
  348. m_DetectorCtrlUnit.reset(new OemCtrl(center, this));
  349. m_AcqUnit.reset(new OemAcq(center, this));
  350. m_SyncUnit.reset(new OemSync(center, this));
  351. m_CalibUnit.reset(new OemCalib(center, this));
  352. m_DetectorConfiguration.reset(new DetectorConfiguration(strConfigPath));
  353. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  354. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  355. EventCenter = center;
  356. }
  357. nsFPD::FPDDeviceRayence::~FPDDeviceRayence()
  358. {
  359. if (nullptr != m_pDetector)
  360. {
  361. delete m_pDetector;
  362. m_pDetector = nullptr;
  363. }
  364. if (nullptr != m_pImgBuffer)
  365. {
  366. delete m_pImgBuffer;
  367. m_pImgBuffer = nullptr;
  368. }
  369. }
  370. std::string nsFPD::FPDDeviceRayence::GetGUID() const
  371. {
  372. return DetectorUnitType;
  373. }
  374. bool nsFPD::FPDDeviceRayence::Prepare()
  375. {
  376. //mLog::FINFO("--Func Device-- Prepare Start");
  377. //mLog::FINFO("MaxImgWidth: {$}, MaxImgHeight: {$}", m_stDeviceConfig.nMaxImgWidth, m_stDeviceConfig.nMaxImgHeight);
  378. EventCenter->OnMaxBlockSize("RfQue",
  379. 4000 * 4000 * 8,
  380. 20, 1500 * 1500 * 2, 1);
  381. Connect();
  382. //mLog::FINFO("Device Prepare Over");
  383. return true;
  384. }
  385. bool nsFPD::FPDDeviceRayence::CreateDevice()
  386. {
  387. //mLog::FINFO("--Func Device-- CreateDevice Start");
  388. if (!LoadConfig())
  389. {
  390. return false;
  391. }
  392. if (nullptr == g_pDetector)
  393. {
  394. if (nullptr == m_pDetector)
  395. {
  396. m_pDetector = new Detector_Rayence();
  397. g_pDetector = (Detector_Rayence*)m_pDetector;
  398. }
  399. }
  400. else
  401. {
  402. m_pDetector = g_pDetector;
  403. }
  404. ((Detector_Rayence*)m_pDetector)->DriverEntry(this, m_DetectorConfiguration->m_Configurations);
  405. //mLog::FINFO("Device CreateDevice Over");
  406. return true;
  407. }
  408. bool nsFPD::FPDDeviceRayence::LoadConfig()
  409. {
  410. //mLog::FINFO("--Func Device-- LoadConfig Start");
  411. if (!m_DetectorConfiguration->LoadConfigurations(m_stDeviceConfig, m_ACQMODElist))
  412. {
  413. //mLog::FERROR("Load configuration file failed!!!");
  414. return false;
  415. }
  416. if (!m_DetectorConfiguration->LoadCalibrationDose(m_strWorkPath, m_CalibDoseList))
  417. {
  418. //mLog::FERROR("Load Calibration Dose failed!!!");
  419. return false;
  420. }
  421. if (!m_DetectorConfiguration->LoadDetectorMode(m_strWorkPath, m_DetectorModeList))
  422. {
  423. //mLog::FERROR("Load Detector Mode failed!!!");
  424. return false;
  425. }
  426. unsigned long dpi = 0;
  427. try
  428. {
  429. for (size_t i = 0; i < m_DetectorModeList.size(); i++)
  430. {
  431. ResDataObject temp = m_DetectorModeList[i];
  432. int nModeID = temp["ModeID"];
  433. int nWidth = temp["ImageWidth"];
  434. int nHeight = temp["ImageHeight"];
  435. int BinningMode = temp["BinningMode"];
  436. int nFrameRate = temp["FrameRate"];
  437. int nCalImgNum = temp["CalImgNum"];
  438. //mLog::FINFO("Detector Mode {$} Width:{$} Height:{$} Binning:{$} FrameRate:{$}, CalImgNum:{$}",
  439. nModeID, nWidth, nHeight, BinningMode, nFrameRate, nCalImgNum);
  440. DetectorMode tempMode;
  441. tempMode.ModeID = nModeID;
  442. tempMode.imageWidth = nWidth;
  443. tempMode.imageHeight = nHeight;
  444. tempMode.binningMode = BinningMode;
  445. tempMode.FrameRate = nFrameRate;
  446. tempMode.CalImgNum = nCalImgNum;
  447. m_vDetectorModeList.push_back(tempMode);
  448. if ((unsigned long)nWidth * (unsigned long)nHeight > dpi)
  449. {
  450. dpi = nWidth * nHeight;
  451. m_stDeviceConfig.nMaxImgWidth = nWidth;
  452. m_stDeviceConfig.nMaxImgHeight = nHeight;
  453. }
  454. }
  455. }
  456. catch (ResDataObjectExption& e)
  457. {
  458. //mLog::FERROR("Get detector mode FERROR: {$}", e.what());
  459. return false;
  460. }
  461. //mLog::FINFO("m_stDeviceConfig.nMaxImgWidth:{$},m_stDeviceConfig.nMaxImgHeight:{$}", m_stDeviceConfig.nMaxImgWidth, m_stDeviceConfig.nMaxImgHeight);
  462. if (m_pImgBuffer)
  463. {
  464. delete m_pImgBuffer;
  465. m_pImgBuffer = nullptr;
  466. }
  467. m_pImgBuffer = new WORD[(size_t)m_stDeviceConfig.nMaxImgWidth * (size_t)m_stDeviceConfig.nMaxImgHeight];
  468. char szFDinfo[MAX_STRING] = { 0 };
  469. string strFPDinfo;
  470. sprintf_s(szFDinfo, "%d", m_nSensitivity);
  471. strFPDinfo = szFDinfo;
  472. m_DetectorCtrlUnit->SetFPDSensitivity(strFPDinfo);
  473. m_DetectorCtrlUnit->SetPixelData("");
  474. m_DetectorCtrlUnit->SetTargetEXI("5000");
  475. m_AcqUnit->SetMaxFrameRate(m_fMaxFrameRate);
  476. //mLog::FINFO("Device LoadConfig Over");
  477. return true;
  478. }
  479. void nsFPD::FPDDeviceRayence::Register()
  480. {
  481. auto Disp = &Dispatch;
  482. RegisterCtrl(Disp);
  483. RegisterAcq(Disp);
  484. RegisterSync(Disp);
  485. RegisterCalib(Disp);
  486. }
  487. RET_STATUS nsFPD::FPDDeviceRayence::Connect()
  488. {
  489. //mLog::FINFO("--Func Device-- Connect Start");
  490. RET_STATUS ret = RET_STATUS::RET_FAILED;
  491. if(((Detector_Rayence*)m_pDetector)->Connect(this, m_strWorkPath.c_str()))
  492. {
  493. m_bConnect = true;
  494. if (m_stDeviceConfig.bSupportDDR) //是否支持DDR采集功能
  495. {
  496. m_DetectorCtrlUnit->SetSupportDDR("YES");
  497. }
  498. else
  499. {
  500. m_DetectorCtrlUnit->SetSupportDDR("NO");
  501. }
  502. ret = RET_STATUS::RET_SUCCEED;
  503. }
  504. //mLog::FINFO("Device Connect Over");
  505. return ret;
  506. }
  507. RET_STATUS nsFPD::FPDDeviceRayence::EnterExam(int nExamMode)
  508. {
  509. //mLog::FINFO("--Func Device-- EnterExam Start");
  510. //mLog::FINFO("EnterExam: {$}", nExamMode);
  511. switch (nExamMode)
  512. {
  513. case APP_STATUS::APP_STATUS_WORK_BEGIN:
  514. //mLog::FINFO("Enter into Exam Windows");
  515. m_eAppStatus = APP_STATUS::APP_STATUS_WORK_BEGIN;
  516. break;
  517. case APP_STATUS::APP_STATUS_WORK_END:
  518. //mLog::FINFO("Quit Exam Windows");
  519. m_eAppStatus = APP_STATUS::APP_STATUS_WORK_END;
  520. break;
  521. case APP_STATUS::APP_STATUS_DETSHARE_BEGIN:
  522. //mLog::FINFO("Enter into Detector Share Windows");
  523. m_eAppStatus = APP_STATUS::APP_STATUS_DETSHARE_BEGIN;
  524. break;
  525. case APP_STATUS::APP_STATUS_DETSHAR_END:
  526. //mLog::FINFO("Quit Detector Share Windows");
  527. m_eAppStatus = APP_STATUS::APP_STATUS_DETSHAR_END;
  528. break;
  529. case APP_STATUS::APP_STATUS_CAL_BEGIN:
  530. //mLog::FINFO("Enter into Calibration Windows");
  531. m_eAppStatus = APP_STATUS::APP_STATUS_CAL_BEGIN;
  532. break;
  533. case APP_STATUS::APP_STATUS_CAL_END:
  534. //mLog::FINFO("Quit Calibration Windows");
  535. m_eAppStatus = APP_STATUS::APP_STATUS_CAL_END;
  536. break;
  537. case APP_STATUS::APP_STATUS_WORK_IN_SENSITIVITY:
  538. //mLog::FINFO("Enter into sensitivity test interface");
  539. m_eAppStatus = APP_STATUS::APP_STATUS_WORK_IN_SENSITIVITY;
  540. break;
  541. default:
  542. break;
  543. }
  544. g_pDetector->EnterExamMode(nExamMode);
  545. //mLog::FINFO("EnterExam Over");
  546. return RET_STATUS::RET_SUCCEED;
  547. }
  548. RET_STATUS nsFPD::FPDDeviceRayence::SetAcqMode(string strMode)
  549. {
  550. //mLog::FINFO("--Func Device-- SetAcqMode Start");
  551. //mLog::FINFO("SetAcqMode Mode: {$}", strMode);
  552. RET_STATUS ret = RET_STATUS::RET_FAILED;
  553. //如果没连接,不执行
  554. if (!m_bConnect)
  555. {
  556. //mLog::FERROR("Detector not connected, return");
  557. return ret;
  558. }
  559. if (DETECTOR_STATUS::DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  560. {
  561. //mLog::FINFO("SetAcqMode detector is not standby!");
  562. ret = StopAcquisition();
  563. if (ret != RET_STATUS::RET_SUCCEED)
  564. {
  565. //mLog::FERROR("SetAcqMode StopAcquisition fail!!!!");
  566. return ret;
  567. }
  568. else
  569. {
  570. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS::DETECTOR_STATUS_STANDBY));
  571. }
  572. }
  573. else
  574. {
  575. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS::DETECTOR_STATUS_STANDBY));
  576. }
  577. try
  578. {
  579. ResDataObject objModeConfig = m_DetectorConfiguration->m_Configurations;
  580. int nModeCount = (int)objModeConfig["ModeTable"].size();
  581. for (int i = 0; i < nModeCount; i++)
  582. {
  583. std::string strAppMode = (std::string)objModeConfig["ModeTable"][i]["ExamType"];
  584. if (strAppMode == strMode)
  585. {
  586. if (strAppMode == "RAD")
  587. {
  588. m_nImageWidth = (int)objModeConfig["ModeTable"][i]["ImageWidth"];
  589. m_nImageHeight = (int)objModeConfig["ModeTable"][i]["ImageHeight"];
  590. }
  591. m_nImgBits = (int)objModeConfig["ModeTable"][i]["PhySizeInfoBit"];
  592. m_nPixelSpacing = (int)objModeConfig["ModeTable"][i]["PixelPitch"];
  593. break;
  594. }
  595. }
  596. }
  597. catch (ResDataObjectExption& e)
  598. {
  599. //mLog::FERROR("Read configuration failed, FERROR code: {$}", e.what());
  600. ret = RET_STATUS::RET_FAILED;
  601. return ret;
  602. }
  603. //更新属性
  604. m_strCurrentAcqMode = strMode;
  605. if (g_pDetector->SetAcqMode(strMode))
  606. {
  607. ret = RET_STATUS::RET_SUCCEED;
  608. m_AcqUnit->AcqModeNotify(strMode);
  609. }
  610. else
  611. {
  612. ret = RET_STATUS::RET_FAILED;
  613. }
  614. //mLog::FINFO("Device SetAcqMode Over");
  615. return ret;
  616. }
  617. RET_STATUS nsFPD::FPDDeviceRayence::PrepareAcquisition()
  618. {
  619. //mLog::FINFO("--Func Device-- PrepareAcquisition Start");
  620. RET_STATUS ret = RET_STATUS::RET_FAILED;
  621. if (!m_bConnect)
  622. {
  623. //mLog::FERROR("Detector not connected, return");
  624. return ret;
  625. }
  626. if (DETECTOR_STATUS::DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  627. {
  628. if ((m_CalibUnit->GetCalibrationStatus() == CCOS_CALIBRATION_STATUS::CCOS_CALIBRATION_STATUS_RUNNING) ||
  629. (m_CalibUnit->GetCalibrationStatus() == CCOS_CALIBRATION_STATUS::CCOS_CALIBRATION_STATUS_ACTIVE))
  630. {
  631. //mLog::FERROR("PrepareAcquisition failed. Detector at Calibration status");
  632. }
  633. if (DETECTOR_STATUS::DETECTOR_STATUS_ACQ == m_DetectorCtrlUnit->GetDetectorStatus())
  634. {
  635. //mLog::Warn("Detector already at Acq status");
  636. ret = RET_STATUS::RET_SUCCEED;
  637. }
  638. }
  639. else
  640. {
  641. m_SyncUnit->FPDReadyNotify(false); //prepare前置为初值
  642. if (g_pDetector->PrepareAcquisition(this))
  643. {
  644. ret = RET_STATUS::RET_SUCCEED;
  645. m_SyncUnit->FPDReadyNotify(true); //prepare succeed
  646. }
  647. }
  648. //mLog::FINFO("Device PrepareAcquisition Over");
  649. return ret;
  650. }
  651. RET_STATUS nsFPD::FPDDeviceRayence::StartAcquisition(string in)
  652. {
  653. //mLog::FINFO("--Func Device-- StartAcquisition Start");
  654. RET_STATUS ret = RET_STATUS::RET_FAILED;
  655. if (!m_bConnect)
  656. {
  657. //mLog::FERROR("Detector not connected, return");
  658. return ret;
  659. }
  660. //mLog::FINFO("StartAcquisition param in: {$}", in);
  661. //mLog::FINFO("StartAcquisition m_strCurrentAcqMode: {$}", m_strCurrentAcqMode);
  662. if (DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  663. {
  664. if ((m_CalibUnit->GetCalibrationStatus() == CCOS_CALIBRATION_STATUS_RUNNING) ||
  665. (m_CalibUnit->GetCalibrationStatus() == CCOS_CALIBRATION_STATUS_ACTIVE))
  666. {
  667. //mLog::FERROR("PrepareAcquisition failed. Detector at Calibration status.");
  668. }
  669. if (DETECTOR_STATUS_ACQ == m_DetectorCtrlUnit->GetDetectorStatus())
  670. {
  671. //mLog::FERROR("Detector already at Acq status.");
  672. }
  673. }
  674. else
  675. {
  676. if (g_pDetector->StartAcquisition(this))
  677. {
  678. ret = RET_STATUS::RET_SUCCEED;
  679. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_ACQ));
  680. }
  681. else
  682. {
  683. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  684. }
  685. }
  686. //mLog::FINFO("Device StartAcquisition Over");
  687. return ret;
  688. }
  689. RET_STATUS nsFPD::FPDDeviceRayence::StopAcquisition()
  690. {
  691. //mLog::FINFO("--Func Device-- StopAcquisition Start");
  692. RET_STATUS ret = RET_STATUS::RET_FAILED;
  693. if (!m_bConnect)
  694. {
  695. //mLog::FERROR("Detector not connected, return");
  696. return ret;
  697. }
  698. if (DETECTOR_STATUS_STANDBY == m_DetectorCtrlUnit->GetDetectorStatus())
  699. {
  700. //mLog::FINFO("Detector already at stanby status.");
  701. ret = RET_STATUS::RET_SUCCEED;
  702. }
  703. else
  704. {
  705. //mLog::FINFO("Call Detector StopAcquisition");
  706. if (g_pDetector->StopAcquisition(this))
  707. {
  708. //mLog::FINFO("Detector StopAcquisition Result is True");
  709. ret = RET_STATUS::RET_SUCCEED;
  710. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  711. }
  712. }
  713. //mLog::FINFO("StopAcquisition Result: {$}", to_string(ret));
  714. //mLog::FINFO("Device StopAcquisition Over");
  715. return ret;
  716. }
  717. RET_STATUS nsFPD::FPDDeviceRayence::SetFluPPS(float fFluPPS)
  718. {
  719. //mLog::FINFO("--Func Device-- SetFluPPS Start");
  720. //mLog::FINFO("SetFluPPS:{$}", fFluPPS);
  721. if (m_strCurrentAcqMode != "CF" && m_strCurrentAcqMode != "PF")
  722. {
  723. //mLog::FERROR("Current Acq Mode is not Flu, needn't set flu pps");
  724. return RET_STATUS::RET_FAILED;
  725. }
  726. m_fCurrentPPS = fFluPPS;
  727. //更新m_fFrameRate值
  728. float fRealFps = g_pDetector->SetFluPPS(fFluPPS);
  729. if (fRealFps > 0.0f)
  730. {
  731. m_AcqUnit->FluPPSNotify(fRealFps);
  732. }
  733. //mLog::FINFO("Device SetFluPPS Over");
  734. return RET_STATUS::RET_SUCCEED;
  735. }
  736. RET_STATUS nsFPD::FPDDeviceRayence::GetFluPPS(float& fFluPPS)
  737. {
  738. //mLog::FINFO("--Func Device-- GetFluPPS Start");
  739. g_pDetector->GetFluPPS(fFluPPS);
  740. //mLog::FINFO("Device GetFluPPS Over");
  741. return RET_STATUS::RET_SUCCEED;
  742. }
  743. RET_STATUS nsFPD::FPDDeviceRayence::SetExposureTimes(int nTimes)
  744. {
  745. //mLog::FINFO("--Func Device-- SetExposureTimes Test");
  746. return RET_STATUS::RET_SUCCEED;
  747. }
  748. RET_STATUS nsFPD::FPDDeviceRayence::ActiveCalibration(CCOS_CALIBRATION_TYPE eType)
  749. {
  750. //mLog::FINFO("--Func Device-- ActiveCalibration Start");
  751. //mLog::FINFO("ActiveCalibration {$}", (int)eType);
  752. RET_STATUS ret = RET_STATUS::RET_FAILED;
  753. if (!m_bConnect)
  754. {
  755. //mLog::FERROR("Detector not connected, return");
  756. return ret;
  757. }
  758. if (eType == CCOS_CALIBRATION_TYPE_NONE || eType == CCOS_CALIBRATION_TYPE_MAX)
  759. {
  760. return RET_STATUS::RET_INVALID;
  761. }
  762. if (DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  763. {
  764. if (DETECTOR_STATUS_ACQ == m_DetectorCtrlUnit->GetDetectorStatus())
  765. {
  766. //mLog::FERROR("ActiveCalibration failed. Detector at Acq status");
  767. }
  768. return RET_STATUS::RET_FAILED;
  769. }
  770. if (g_pDetector->ActiveCalibration(this, eType))
  771. {
  772. ret = RET_STATUS::RET_SUCCEED;
  773. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_ACTIVE));
  774. m_CalibUnit->SetCalibrationProgress("0");
  775. }
  776. else
  777. {
  778. //mLog::FERROR("Active calibration failed");
  779. }
  780. //mLog::FINFO("Device ActiveCalibration Over");
  781. return ret;
  782. }
  783. RET_STATUS nsFPD::FPDDeviceRayence::PrepareCalibration()
  784. {
  785. //mLog::FINFO("--Func Device-- PrepareCalibration Start");
  786. RET_STATUS ret = RET_STATUS::RET_FAILED;
  787. if (!m_bConnect)
  788. {
  789. //mLog::FERROR("Detector not connected, return");
  790. return ret;
  791. }
  792. m_SyncUnit->FPDReadyNotify(false); //prepare前置为初值
  793. if (g_pDetector->PrepareCalibration(this))
  794. {
  795. ret = RET_STATUS::RET_SUCCEED;
  796. m_SyncUnit->FPDReadyNotify(true); //prepare succeed
  797. }
  798. else
  799. {
  800. //mLog::FERROR("Prepare calibration failed");
  801. }
  802. //mLog::FINFO("Device PrepareCalibration Over");
  803. return ret;
  804. }
  805. RET_STATUS nsFPD::FPDDeviceRayence::GetRequestedDose(std::string& strDose)
  806. {
  807. //mLog::FINFO("--Func Device-- GetRequestedDose Start");
  808. RET_STATUS Ret = RET_STATUS::RET_SUCCEED;
  809. bool bGetDoseInfo = false;
  810. ResDataObject out;
  811. CCOS_CALIBRATION_TYPE nCalibrationType = m_CalibUnit->GetCalibrationType();
  812. if (CCOS_CALIBRATION_TYPE_DARK == nCalibrationType)
  813. {
  814. out.add("Dose", 0.0f);
  815. out.add("kV", 0.0f);
  816. out.add("mA", 0.0f);
  817. out.add("ms", 0.0f);
  818. out.add("mAs", 0.0f);
  819. bGetDoseInfo = true;
  820. }
  821. else if (CCOS_CALIBRATION_TYPE_XRAY == nCalibrationType)
  822. {
  823. for (int i = 0; i < m_CalibDoseList.size(); i++)
  824. {
  825. ResDataObject temp = m_CalibDoseList[i];
  826. int nDose = temp["Dose"];
  827. int nDoseParem = (int)(m_fDose * 1000);
  828. if (nDoseParem == nDose)
  829. {
  830. out.add("Dose", nDoseParem);
  831. out.add("kV", temp["kV"]);
  832. out.add("mA", temp["mA"]);
  833. out.add("ms", temp["ms"]);
  834. out.add("mAs", temp["mAs"]);
  835. bGetDoseInfo = true;
  836. break;
  837. }
  838. }
  839. }
  840. else
  841. {
  842. Ret = RET_STATUS::RET_FAILED;
  843. }
  844. if (bGetDoseInfo)
  845. {
  846. strDose = out.encode();
  847. //mLog::FINFO("GetRequestedDose {$} over", strDose.c_str());
  848. }
  849. else
  850. {
  851. //mLog::FERROR("GetRequestedDose failed");
  852. }
  853. //mLog::FINFO("Device GetRequestedDose Over");
  854. return Ret;
  855. }
  856. RET_STATUS nsFPD::FPDDeviceRayence::StartCalibration()
  857. {
  858. //mLog::FINFO("--Func Device-- StartCalibration Start");
  859. RET_STATUS ret = RET_STATUS::RET_FAILED;
  860. if (!m_bConnect)
  861. {
  862. //mLog::FERROR("Detector not connected, return");
  863. return ret;
  864. }
  865. if ((m_CalibUnit->GetCalibrationStatus() != CCOS_CALIBRATION_STATUS_PAUSE) && (m_CalibUnit->GetCalibrationStatus() != CCOS_CALIBRATION_STATUS_ACTIVE))
  866. {
  867. //mLog::FERROR("Start calibration failed, in {$} status", (int)m_CalibUnit->GetCalibrationStatus());
  868. return ret;
  869. }
  870. if (DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  871. {
  872. if (DETECTOR_STATUS_ACQ == m_DetectorCtrlUnit->GetDetectorStatus())
  873. {
  874. //mLog::FERROR("Start calibration failed. Detector at Acq status");
  875. }
  876. return ret;
  877. }
  878. if (m_CalibUnit->GetCalibrationStatus() == CCOS_CALIBRATION_STATUS_RUNNING)
  879. {
  880. //mLog::FERROR("Detector already at calib status");
  881. return ret;
  882. }
  883. if (g_pDetector->StartCalibration(this))
  884. {
  885. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_ACQ));
  886. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_RUNNING));
  887. ret = RET_STATUS::RET_SUCCEED;
  888. }
  889. else
  890. {
  891. //mLog::FERROR("Start calibration failed");
  892. }
  893. //mLog::FINFO("Device StartCalibration Over");
  894. return ret;
  895. }
  896. RET_STATUS nsFPD::FPDDeviceRayence::StopCalibration()
  897. {
  898. //mLog::FINFO("--Func Device-- StopCalibration Start");
  899. RET_STATUS ret = RET_STATUS::RET_FAILED;
  900. if (!m_bConnect)
  901. {
  902. //mLog::FERROR("Detector not connected, return");
  903. return ret;
  904. }
  905. if (g_pDetector->StopCalibration(this))
  906. {
  907. ret = RET_STATUS::RET_SUCCEED;
  908. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  909. m_CalibUnit->SetCalibrationProgress("100");
  910. }
  911. else
  912. {
  913. //mLog::FERROR("Start calibration failed");
  914. }
  915. //mLog::FINFO("Device StopCalibration Over");
  916. return ret;
  917. }
  918. RET_STATUS nsFPD::FPDDeviceRayence::StartOffset(bool isAll)
  919. {
  920. //mLog::FINFO("--Func Device-- StartOffset Start");
  921. RET_STATUS ret = RET_STATUS::RET_FAILED;
  922. //mLog::FINFO("StartOffset Paramer: {$}", isAll);
  923. if (!m_bConnect)
  924. {
  925. //mLog::FERROR("Detector not connected, return");
  926. }
  927. if (isAll)
  928. {
  929. m_CalibUnit->SetOffsetCounts(to_string(m_stDeviceConfig.nCalibModeNum));
  930. m_CalibUnit->SetOffsetInterval(to_string(m_stDeviceConfig.nOffsetInterval));
  931. }
  932. else
  933. {
  934. m_CalibUnit->SetOffsetCounts(to_string(1));
  935. m_CalibUnit->SetOffsetInterval(to_string(m_stDeviceConfig.nOffsetInterval));
  936. }
  937. //mLog::FINFO("isAll: {$}", isAll);
  938. m_CalibUnit->SetOffsetStatus("Running");
  939. if (g_pDetector->StartOffset(this, isAll, m_vDetectorModeList))
  940. {
  941. ret = RET_STATUS::RET_SUCCEED;
  942. }
  943. //mLog::FINFO("Device StartOffset Over");
  944. return ret;
  945. }
  946. RET_STATUS nsFPD::FPDDeviceRayence::AbortOffset()
  947. {
  948. //mLog::FINFO("--Func Device-- AbortOffset Start");
  949. RET_STATUS ret = RET_STATUS::RET_FAILED;
  950. if (!m_bConnect)
  951. {
  952. //mLog::FERROR("Detector not connected, return");
  953. }
  954. if (g_pDetector->AbortOffset())
  955. {
  956. ret = RET_STATUS::RET_SUCCEED;
  957. }
  958. m_CalibUnit->SetOffsetStatus("Idle");
  959. //mLog::FINFO("Device AbortOffset Over");
  960. return ret;
  961. }
  962. bool nsFPD::FPDDeviceRayence::Support_DarkCalib()
  963. {
  964. return true;
  965. }
  966. bool nsFPD::FPDDeviceRayence::Support_XrayCalib()
  967. {
  968. return true;
  969. }
  970. void nsFPD::FPDDeviceRayence::RegisterCtrl(nsDetail::Dispatch* Dispatch)
  971. {
  972. Dispatch->Action.Push(ActionKey::CcosActiveDetector, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSActiveDetector);
  973. Dispatch->Action.Push(ActionKey::EnterExam, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSEnterExam);
  974. Dispatch->Action.Push(ActionKey::ExitExam, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSExitExam);
  975. Dispatch->Action.Push(ActionKey::SetXrayOnNum, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSSetXrayOnNum);
  976. Dispatch->Action.Push(ActionKey::SetExposureTimes, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSSetExposureTimes);
  977. Dispatch->Get.Push(AttrKey::DetectorStatus, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetFPDStatus);
  978. Dispatch->Get.Push(AttrKey::Description, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDescription);
  979. Dispatch->Get.Push(AttrKey::FPDSensitivity, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetFPDSensitivity);
  980. Dispatch->Get.Push(AttrKey::TargetEXI, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetTargetEXI);
  981. Dispatch->Get.Push(SupportDDR, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetSupportDDR);
  982. Dispatch->Get.Push(AttrKey::DetectorID, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorID);
  983. Dispatch->Get.Push(AttrKey::DetectorType, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorType);
  984. Dispatch->Get.Push(AttrKey::PixelData, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetPixelData);
  985. Dispatch->Set.Push(AttrKey::DetectorStatus, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorStatus);
  986. Dispatch->Set.Push(AttrKey::Description, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDescription);
  987. Dispatch->Set.Push(AttrKey::FPDSensitivity, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetFPDSensitivity);
  988. Dispatch->Set.Push(AttrKey::TargetEXI, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetTargetEXI);
  989. Dispatch->Set.Push(SupportDDR, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetSupportDDR);
  990. Dispatch->Set.Push(AttrKey::DetectorID, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorID);
  991. Dispatch->Set.Push(AttrKey::DetectorType, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorType);
  992. Dispatch->Set.Push(AttrKey::PixelData, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetPixelData);
  993. }
  994. void nsFPD::FPDDeviceRayence::RegisterAcq(nsDetail::Dispatch* Dispatch)
  995. {
  996. Dispatch->Action.Push(ActionKey::SetAcqMode, m_AcqUnit.get(), &AcqUnit::JSSetAcqMode);
  997. Dispatch->Action.Push(ActionKey::SetValue_PPS, m_AcqUnit.get(), &AcqUnit::JSSetFluPPS);
  998. Dispatch->Get.Push(AttrKey::AcqMode, m_AcqUnit.get(), &AcqUnit::JSGetAcqMode);
  999. Dispatch->Get.Push(AttrKey::ZskkFPDState, m_AcqUnit.get(), &AcqUnit::JSGetZskkFPDState);
  1000. Dispatch->Get.Push(AttrKey::NoNeedWaitImage, m_AcqUnit.get(), &AcqUnit::JSGetNoNeedWaitImage);
  1001. Dispatch->Get.Push(AttrKey::ImgDataInfo, m_AcqUnit.get(), &AcqUnit::JSGetLastImage);
  1002. Dispatch->Get.Push(AttrKey::MaxFrameRate, m_AcqUnit.get(), &AcqUnit::JSGetMaxFrameRate);
  1003. Dispatch->Get.Push(AttrKey::FluPPS, m_AcqUnit.get(), &AcqUnit::JSGetFluPPS);
  1004. Dispatch->Set.Push(AttrKey::ZskkFPDState, m_AcqUnit.get(), &AcqUnit::SetZskkFPDState);
  1005. Dispatch->Set.Push(AttrKey::NoNeedWaitImage, m_AcqUnit.get(), &AcqUnit::JSSetNoNeedWaitImage);
  1006. }
  1007. void nsFPD::FPDDeviceRayence::RegisterSync(nsDetail::Dispatch* Dispatch)
  1008. {
  1009. Dispatch->Action.Push(ActionKey::PrepareAcquisition, m_SyncUnit.get(), &SyncUnit::JSPrepareAcquisition);
  1010. Dispatch->Action.Push(ActionKey::StartAcquisition, m_SyncUnit.get(), &SyncUnit::JSStartAcquisition);
  1011. Dispatch->Action.Push(ActionKey::StopAcquisition, m_SyncUnit.get(), &SyncUnit::JSStopAcquisition);
  1012. Dispatch->Get.Push(AttrKey::FPDReadyStatus, m_SyncUnit.get(), &SyncUnit::JSGetFPDReady);
  1013. Dispatch->Get.Push(AttrKey::XwindowStatus, m_SyncUnit.get(), &SyncUnit::JSGetXWindowStatus);
  1014. Dispatch->Get.Push(AttrKey::ImageReadingStatus, m_SyncUnit.get(), &SyncUnit::JSGetImageReadingStatus);
  1015. Dispatch->Set.Push(AttrKey::FPDReadyStatus, m_SyncUnit.get(), &SyncUnit::JSSetFPDReady);
  1016. Dispatch->Set.Push(AttrKey::XwindowStatus, m_SyncUnit.get(), &SyncUnit::JSSetXWindowStatus);
  1017. Dispatch->Set.Push(AttrKey::ImageReadingStatus, m_SyncUnit.get(), &SyncUnit::JSSetImageReadingStatus);
  1018. }
  1019. void nsFPD::FPDDeviceRayence::RegisterCalib(nsDetail::Dispatch* Dispatch)
  1020. {
  1021. Dispatch->Action.Push(ActionKey::ActiveCalibration, m_CalibUnit.get(), &CalibUnit::JSActiveCalibration);
  1022. Dispatch->Action.Push(ActionKey::GetRequestedDose, m_CalibUnit.get(), &CalibUnit::JSGetRequestedDose);
  1023. Dispatch->Action.Push(ActionKey::PrepareCalibration, m_CalibUnit.get(), &CalibUnit::JSPrepareCalibration);
  1024. Dispatch->Action.Push(ActionKey::StartCalibration, m_CalibUnit.get(), &CalibUnit::JSStartCalibration);
  1025. Dispatch->Action.Push(ActionKey::StopCalibration, m_CalibUnit.get(), &CalibUnit::JSStopCalibration);
  1026. Dispatch->Action.Push(ActionKey::SetCorrectionType, m_CalibUnit.get(), &CalibUnit::JSSetCorrectionType);
  1027. Dispatch->Action.Push(ActionKey::StartOffset, m_CalibUnit.get(), &CalibUnit::JSStartOffset);
  1028. Dispatch->Action.Push(ActionKey::AbortOffset, m_CalibUnit.get(), &CalibUnit::JSAbortOffset);
  1029. Dispatch->Get.Push(AttrKey::CalibrationStatus, m_CalibUnit.get(), &CalibUnit::JSGetCalibStatus);
  1030. Dispatch->Get.Push(AttrKey::CalibrationProgress, m_CalibUnit.get(), &CalibUnit::JSGetCalibProgress);
  1031. Dispatch->Get.Push(AttrKey::UploadCalibrationFilesResult, m_CalibUnit.get(), &CalibUnit::JSGetUploadCalibrationFilesResult);
  1032. Dispatch->Get.Push(AttrKey::OffsetStatus, m_CalibUnit.get(), &CalibUnit::JSGetOffsetStatus);
  1033. Dispatch->Get.Push(AttrKey::OffsetProgress, m_CalibUnit.get(), &CalibUnit::JSGetOffsetProgress);
  1034. Dispatch->Get.Push(AttrKey::OffsetCounts, m_CalibUnit.get(), &CalibUnit::JSGetOffsetCounts);
  1035. Dispatch->Get.Push(AttrKey::OffsetInterval, m_CalibUnit.get(), &CalibUnit::JSGetOffsetInterval);
  1036. Dispatch->Set.Push(AttrKey::CalibrationStatus, m_CalibUnit.get(), &CalibUnit::SetCalibrationStatus);
  1037. Dispatch->Set.Push(AttrKey::CalibrationProgress, m_CalibUnit.get(), &CalibUnit::SetCalibrationProgress);
  1038. Dispatch->Set.Push(AttrKey::UploadCalibrationFilesResult, m_CalibUnit.get(), &CalibUnit::SetUploadCalibrationFilesResult);
  1039. Dispatch->Set.Push(AttrKey::OffsetStatus, m_CalibUnit.get(), &CalibUnit::SetOffsetStatus);
  1040. Dispatch->Set.Push(AttrKey::OffsetProgress, m_CalibUnit.get(), &CalibUnit::SetOffsetProgress);
  1041. Dispatch->Set.Push(AttrKey::OffsetCounts, m_CalibUnit.get(), &CalibUnit::SetOffsetCounts);
  1042. Dispatch->Set.Push(AttrKey::OffsetInterval, m_CalibUnit.get(), &CalibUnit::SetOffsetInterval);
  1043. Dispatch->Update.Push(AttrKey::OffsetInterval, m_CalibUnit.get(), &CalibUnit::JSUpdateOffsetInterval);
  1044. }
  1045. void nsFPD::FPDDeviceRayence::OnFPDCallback(int nDetectorID, int nEventID, int nEventLevel,
  1046. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1047. {
  1048. switch (nEventLevel)
  1049. {
  1050. case EVT_LEVEL_CONFIGURATION:
  1051. {
  1052. OnEventProcessConf(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1053. break;
  1054. }
  1055. case EVT_LEVEL_INFORMATOION:
  1056. {
  1057. OnEventProcessInfo(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1058. break;
  1059. }
  1060. case EVT_LEVEL_STATUS:
  1061. {
  1062. OnEventProcessStatus(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1063. break;
  1064. }
  1065. case EVT_LEVEL_DATA:
  1066. {
  1067. OnEventProcessData(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1068. break;
  1069. }
  1070. case EVT_LEVEL_WARNING:
  1071. {
  1072. OnEventProcessWarning(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1073. break;
  1074. }
  1075. case EVT_LEVEL_ERROR:
  1076. {
  1077. OnEventProcessError(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1078. break;
  1079. }
  1080. default:
  1081. break;
  1082. }
  1083. }
  1084. void nsFPD::FPDDeviceRayence::OnEventProcessConf(int nDetectorID, int nEventID, int nEventLevel,
  1085. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1086. {
  1087. switch (nEventID)
  1088. {
  1089. case EVT_CONF_PANEL_SERIAL:
  1090. {
  1091. m_stDeviceConfig.strPanelSerial = pszMsg;
  1092. //mLog::FINFO("Receive Panel {$} SN {$}", nDetectorID, pszMsg);
  1093. m_DetectorCtrlUnit->SetDetectorID(m_stDeviceConfig.strPanelSerial);
  1094. break;
  1095. }
  1096. case EVT_CONF_RAW_WIDTH:
  1097. {
  1098. if (m_stDeviceConfig.nFullImageWidth != nParam1)
  1099. {
  1100. m_stDeviceConfig.nFullImageWidth = nParam1;
  1101. }
  1102. if (m_nImageWidth != nParam1)
  1103. {
  1104. m_nImageWidth = nParam1;
  1105. }
  1106. //mLog::FINFO("Ratate angle: {$}", m_nAngle);
  1107. if (m_nAngle == 90 || m_nAngle == 270)
  1108. {
  1109. m_AcqUnit->SetFulImageInfo(m_nImageWidth, m_nImageHeight, m_nImgBits, false);
  1110. }
  1111. else
  1112. {
  1113. m_AcqUnit->SetFulImageInfo(m_nImageHeight, m_nImageWidth, m_nImgBits, false);
  1114. }
  1115. //mLog::FINFO("Panel {$} m_nImageWidth:{$}", nDetectorID, m_nImageWidth);
  1116. break;
  1117. }
  1118. case EVT_CONF_RAW_HIGHT:
  1119. {
  1120. if (m_stDeviceConfig.nFullImageHeight != nParam1)
  1121. {
  1122. m_stDeviceConfig.nFullImageHeight = nParam1;
  1123. }
  1124. if (m_nImageHeight != nParam1)
  1125. {
  1126. m_nImageHeight = nParam1;
  1127. }
  1128. //mLog::FINFO("Ratate angle: {$}", m_nAngle);
  1129. if (m_nAngle == 90 || m_nAngle == 270)
  1130. {
  1131. m_AcqUnit->SetFulImageInfo(m_nImageWidth, m_nImageHeight, m_nImgBits, false);
  1132. }
  1133. else
  1134. {
  1135. m_AcqUnit->SetFulImageInfo(m_nImageHeight, m_nImageWidth, m_nImgBits, false);
  1136. }
  1137. //mLog::FINFO("Panel {$} m_nImageHeight:{$}", nDetectorID, m_nImageHeight);
  1138. break;
  1139. }
  1140. }
  1141. }
  1142. void nsFPD::FPDDeviceRayence::OnEventProcessInfo(int nDetectorID, int nEventID, int nEventLevel,
  1143. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1144. {
  1145. switch (nEventID)
  1146. {
  1147. case EVT_INFO_OFFSET_PROGRESS:
  1148. {
  1149. string strOffsetProgress = to_string(nParam1);
  1150. m_CalibUnit->SetOffsetProgress(strOffsetProgress);
  1151. }
  1152. break;
  1153. case EVT_INFO_OFFSET_STATUS:
  1154. {
  1155. string strTemp;
  1156. if (nParam1 == 1)
  1157. {
  1158. strTemp = "Idle";
  1159. }
  1160. m_CalibUnit->SetOffsetStatus(strTemp);
  1161. }
  1162. break;
  1163. default:
  1164. //mLog::FWARN("Not support this FINFO({$})", nEventID);
  1165. break;
  1166. }
  1167. }
  1168. void nsFPD::FPDDeviceRayence::OnEventProcessStatus(int nDetectorID, int nEventID, int nEventLevel,
  1169. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1170. {
  1171. switch (nEventID)
  1172. {
  1173. case EVT_STATUS_PANEL:
  1174. {
  1175. ENUM_PANEL_STATUS ePanelStatus = (ENUM_PANEL_STATUS)nParam1;
  1176. if (PANEL_END_ACQ == nParam1)
  1177. {
  1178. //mLog::FINFO("Panel Status: End acq");
  1179. if (g_pDetector->StopAcquisition(this))
  1180. {
  1181. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1182. }
  1183. }
  1184. else if (PANEL_STANDBY == nParam1)
  1185. {
  1186. //mLog::FINFO("Panel Status: Standby");
  1187. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1188. }
  1189. else if(PANEL_OFFSET_CAL == nParam1)
  1190. {
  1191. //mLog::FINFO("Panel Status: Offset");
  1192. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_CALIB));
  1193. }
  1194. else if (PANEL_XWINDOW_ON == nParam1) //Xwindow On
  1195. {
  1196. //mLog::FINFO("XWindowOnNotify");
  1197. m_SyncUnit->XWindowOnNotify();
  1198. }
  1199. else if (PANEL_XWINDOW_OFF == nParam1) // Xwindow Off
  1200. {
  1201. //mLog::FINFO("XWindowOffNotify");
  1202. m_SyncUnit->XWindowOffNotify();
  1203. }
  1204. }
  1205. break;
  1206. case EVT_STATUS_CALIBRATIOIN:
  1207. {
  1208. ENUM_PANEL_EVENT_STATE eStatus = (ENUM_PANEL_EVENT_STATE)nParam1;
  1209. switch (eStatus)
  1210. {
  1211. case PANEL_EVENT_START:
  1212. break;
  1213. case PANEL_EVENT_END_OK:
  1214. case PANEL_EVENT_END_ERROR:
  1215. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1216. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  1217. m_CalibUnit->SetCalibrationProgress("100");//make progress
  1218. break;
  1219. case PANEL_EVENT_TIMEOUT:
  1220. break;
  1221. default:
  1222. break;
  1223. }
  1224. break;
  1225. }
  1226. default:
  1227. //mLog::FWARN("Not support this status({$})", nEventID);
  1228. break;
  1229. }
  1230. }
  1231. void nsFPD::FPDDeviceRayence::OnEventProcessData(int nDetectorID, int nEventID, int nEventLevel,
  1232. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1233. {
  1234. switch (nEventID)
  1235. {
  1236. case EVT_DATA_RAW_IMAGE:
  1237. {
  1238. //mLog::FINFO("Image Arrived");
  1239. //mLog::FINFO("m_nImageWidth: {$}, m_nImageHeight: {$}", m_nImageWidth, m_nImageHeight);
  1240. memcpy(m_pImgBuffer, pParam, (size_t)m_nImageWidth * (size_t)m_nImageHeight * sizeof(WORD));
  1241. //暂时先用假值,有需要再改
  1242. SYSTEMTIME stImgCreateTime = { 0 };
  1243. GetLocalTime(&stImgCreateTime);
  1244. ResDataObject objImageHead, objTemp;
  1245. objTemp.add(SM_IMAGE_TYPE, (int)IMAGE_FULL);
  1246. objTemp.add(SM_IMAGE_BIT, 16);
  1247. objTemp.add(SM_IMAGE_TAG, 1);
  1248. objTemp.add(SM_IMAGE_INDEX, 1);
  1249. objTemp.add(SM_IMAGE_YEAR, stImgCreateTime.wYear);
  1250. objTemp.add(SM_IMAGE_MONTH, stImgCreateTime.wMonth);
  1251. objTemp.add(SM_IMAGE_DAY, stImgCreateTime.wDay);
  1252. objTemp.add(SM_IMAGE_HOUR, stImgCreateTime.wHour);
  1253. objTemp.add(SM_IMAGE_MINUTE, stImgCreateTime.wMinute);
  1254. objTemp.add(SM_IMAGE_SEC, stImgCreateTime.wSecond);
  1255. objTemp.add(SM_IMAGE_MILLSEC, stImgCreateTime.wMilliseconds);
  1256. objTemp.add(SM_IMAGE_LSB, "5000");
  1257. objTemp.add(SM_IMAGE_DOSE, m_nSensitivity);
  1258. objTemp.add(SM_IMAGE_PIXELSPACING, m_nPixelSpacing);
  1259. objTemp.add(SM_IMAGE_PIXELREPRESENTATION, "1");
  1260. objTemp.add(SM_IMAGE_FLIP, "No");
  1261. objTemp.add(SM_IMAGE_ORIGINX, "0");
  1262. objTemp.add(SM_IMAGE_ORIGINY, "0");
  1263. m_AcqUnit->RotateImage(m_pImgBuffer, m_nImageHeight, m_nImageWidth, m_nAngle);
  1264. if (90 == m_nAngle || 270 == m_nAngle)
  1265. {
  1266. objTemp.add(SM_IMAGE_WIDTH, m_nImageHeight);
  1267. objTemp.add(SM_IMAGE_HEIGHT, m_nImageWidth);
  1268. objTemp.add(SM_IMAGE_ROTATION, "Yes");
  1269. }
  1270. else
  1271. {
  1272. objTemp.add(SM_IMAGE_WIDTH, m_nImageWidth);
  1273. objTemp.add(SM_IMAGE_HEIGHT, m_nImageHeight);
  1274. objTemp.add(SM_IMAGE_ROTATION, "No");
  1275. }
  1276. objImageHead.add(SM_IMAGE_HEAD, objTemp);
  1277. //mLog::Trace("Full image head: {$}", objImageHead.encode());
  1278. RET_STATUS ret = RET_STATUS::RET_FAILED;
  1279. ret = m_AcqUnit->AddFrameWithRawHead(IMAGE_FULL, objImageHead.encode(), m_pImgBuffer, m_nImageWidth * m_nImageHeight);
  1280. //mLog::FINFO("Add image over");
  1281. }
  1282. break;
  1283. default:
  1284. //mLog::FWARN("Not support this data({$})", nEventID);
  1285. break;
  1286. }
  1287. }
  1288. void nsFPD::FPDDeviceRayence::OnEventProcessError(int nDetectorID, int nEventID, int nEventLevel,
  1289. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1290. {
  1291. switch (nEventID)
  1292. {
  1293. case EVT_ERR_COMMUNICATE:
  1294. break;
  1295. case EVT_ERR_INIT_FAILED:
  1296. break;
  1297. case EVT_ERR_OFFSET_FAILED:
  1298. m_CalibUnit->SetOffsetStatus("FERROR");
  1299. break;
  1300. default:
  1301. //mLog::FWARN("Not support this FERROR({$})", nEventID);
  1302. break;
  1303. }
  1304. }
  1305. void nsFPD::FPDDeviceRayence::OnEventProcessWarning(int nDetectorID, int nEventID, int nEventLevel,
  1306. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1307. {
  1308. //mLog::FWARN("Not support this warn({$})", nEventID);
  1309. }