DIOS.Dev.FPD.PZMedical.cpp 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690
  1. #include "stdafx.h"
  2. #include "FileVersion.hpp"
  3. #include "CCOS.Dev.FPD.PZMedical.h"
  4. #include "common_api.h"
  5. #include "DICOMImageHeadKey.h"
  6. #include "PZMedicalCtrl.h"
  7. namespace nsFPD = CCOS::Dev::Detail::Detector;
  8. Log4CPP::Logger* gLogger = nullptr;
  9. static nsFPD::PZMedicalDriver gIODriver;
  10. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  11. {
  12. return &gIODriver;
  13. }
  14. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  15. {
  16. return new nsFPD::PZMedicalDriver();
  17. }
  18. nsFPD::PZMedicalDriver::PZMedicalDriver()
  19. {
  20. pObjDev = nullptr;
  21. m_bConnect = false; //缺省为false
  22. m_pAttribute.reset(new ResDataObject());
  23. m_pDescription.reset(new ResDataObject());
  24. }
  25. nsFPD::PZMedicalDriver::~PZMedicalDriver()
  26. {
  27. //貌似已经被上层释放了,此处再次释放会崩溃
  28. //if (nullptr != pObjDev)
  29. //{
  30. // delete pObjDev;
  31. // pObjDev = nullptr;
  32. //}
  33. }
  34. extern const char* g_szMouldPath;
  35. void nsFPD::PZMedicalDriver::Prepare()
  36. {
  37. string strWorkPath = GetProcessDirectory();
  38. string strLogPath = strWorkPath + DetectorLogPath;
  39. Log4CPP::GlobalContext::Map::Set(ZSKK::Utility::Hash("LogFileName"), "FPD.PZMedicalRF");
  40. auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  41. gLogger = Log4CPP::LogManager::GetLogger("FPD.PZMedicalRF");
  42. #ifdef _WIN64
  43. Force("Version: {$} (64-bit)", FileVersion(g_szMouldPath).GetVersionString());
  44. #else
  45. Force("Version: {$} (32-bit)", FileVersion(g_szMouldPath).GetVersionString());
  46. #endif
  47. }
  48. bool nsFPD::PZMedicalDriver::Connect()
  49. {
  50. Info(__FUNCTION__);
  51. pObjDev = new FPDDevicePZMedical(EventCenter, m_ConfigFileName);
  52. m_bConnect = true;
  53. return true;
  54. }
  55. void nsFPD::PZMedicalDriver::Disconnect()
  56. {
  57. Info(__FUNCTION__);
  58. m_bConnect = false; //disconnect置为false
  59. }
  60. bool nsFPD::PZMedicalDriver::isConnected() const
  61. {
  62. return m_bConnect;
  63. }
  64. auto nsFPD::PZMedicalDriver::CreateDevice(int index)->std::unique_ptr <IODevice>
  65. {
  66. Info(__FUNCTION__);
  67. auto Device = std::unique_ptr<IODevice>(new IODevice(pObjDev));
  68. if (!pObjDev->CreateDevice())
  69. {
  70. return nullptr;
  71. }
  72. pObjDev->Register();
  73. return Device;
  74. }
  75. std::string nsFPD::PZMedicalDriver::DriverProbe()
  76. {
  77. Debug(__FUNCTION__);
  78. ResDataObject r_config, HardwareInfo;
  79. if (r_config.loadFile(m_ConfigFileName.c_str()))
  80. {
  81. auto Child = r_config[NODE_CONFIGURATION];
  82. HardwareInfo.add(NODE_MajorID, Child[NODE_MajorID]);
  83. HardwareInfo.add(NODE_MinorID, Child[NODE_MinorID]);
  84. HardwareInfo.add(NODE_VendorID, Child[NODE_VendorID]);
  85. HardwareInfo.add(NODE_ProductID, Child[NODE_ProductID]);
  86. HardwareInfo.add(NODE_SerialID, Child[NODE_SerialID]);
  87. }
  88. else
  89. {
  90. HardwareInfo.add(NODE_MajorID, "Detector");
  91. HardwareInfo.add(NODE_MinorID, "Driver");
  92. HardwareInfo.add(NODE_VendorID, "CareRay");
  93. HardwareInfo.add(NODE_ProductID, "CareRay");
  94. HardwareInfo.add(NODE_SerialID, "1234");
  95. }
  96. string str = HardwareInfo.encode();
  97. return str;
  98. }
  99. /***
  100. ** 获取ID和配置
  101. ***/
  102. std::string nsFPD::PZMedicalDriver::GetResource()
  103. {
  104. ResDataObject r_config, temp;
  105. if (!temp.loadFile(m_ConfigFileName.c_str()))
  106. {
  107. return "";
  108. }
  109. m_ConfigAll = temp;
  110. r_config = temp[NODE_CONFIGURATION];
  111. m_Configurations = r_config;
  112. ResDataObject DescriptionTemp;
  113. ResDataObject ListTemp;
  114. string strTemp = ""; //用于读取字符串配置信息
  115. string strIndex = ""; //用于读取配置信息中的List项
  116. int nTemp = -1; //用于读取整型配置信息
  117. char sstream[10] = { 0 }; //用于转换值
  118. string strValue = ""; //用于存储配置的值
  119. string strType = ""; //用于存储配置的类型 int/float/string...
  120. string strAccess = ""; //用于存储权限的类型 R/W/RW
  121. string strRequired = ""; // TRUE/FALSE
  122. string strDefaultValue = "";
  123. string strRangeMin = "";
  124. string strRangeMax = "";
  125. try
  126. {
  127. string strFPD = (string)r_config[NODE_VendorID];
  128. ConfigInfo FPDVender(ConfKey::CcosDetectorType, "string", "R", "TRUE", strFPD.c_str());
  129. AddConfig(FPDVender);
  130. strFPD = (string)r_config[NODE_ProductID];
  131. ConfigInfo FPDModel(ConfKey::CcosDetectorModel, "string", "R", "TRUE", strFPD.c_str());
  132. AddConfig(FPDModel);
  133. int nConfigInfoCount = (int)r_config[NODE_ConfigToolInfo].GetKeyCount(NODE_AttributeInfo);
  134. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  135. {
  136. DescriptionTemp.clear();
  137. ListTemp.clear();
  138. auto Child = r_config[NODE_ConfigToolInfo][nInfoIndex][NODE_AttributeDescripition];
  139. strType = (string)Child[AttributeType];
  140. strAccess = (string)Child[AttributeAccess];
  141. strRequired = (string)Child[AttributeRequired];
  142. strDefaultValue = (string)Child[AttributeDefaultValue];
  143. strTemp = (string)r_config[NODE_ConfigToolInfo][nInfoIndex][NODE_AttributeKey];
  144. ConfigInfo FPDAttr(strTemp.c_str(), strType.c_str(), strAccess.c_str(), strRequired.c_str(), strDefaultValue.c_str());
  145. //AttributeKey
  146. //1. 根据AttributeType,内部key和配置路径,拿到当前的真实值
  147. strTemp = (string)r_config[NODE_ConfigToolInfo][nInfoIndex][NODE_InnerKey];
  148. nTemp = (int)r_config[NODE_ConfigToolInfo][nInfoIndex][NODE_PathID];
  149. GetDeviceConfigValue(r_config, strTemp.c_str(), nTemp, strValue);
  150. //2. 赋值
  151. FPDAttr.SetCurrentValue(strValue.c_str());
  152. strRangeMin = (string)Child[AttributeRangeMin];
  153. strRangeMax = (string)Child[AttributeRangeMax];
  154. if (strRangeMax != "" && strRangeMin != "") //不需要的配置项为空
  155. {
  156. FPDAttr.SetRange(strRangeMin.c_str(), strRangeMax.c_str());
  157. }
  158. //AttributeList
  159. nTemp = Child["ListNum"];
  160. if (nTemp > 0) //ListNum不大于0时说明不需要list配置
  161. {
  162. for (int nListIndex = 0; nListIndex < nTemp; nListIndex++)
  163. {
  164. strTemp = (string)Child[NODE_ListInfo][nListIndex];
  165. sprintf_s(sstream, "%d", nListIndex);
  166. ListTemp.add(sstream, strTemp.c_str());
  167. }
  168. FPDAttr.SetList(ListTemp.encode());
  169. }
  170. AddConfig(FPDAttr);
  171. }
  172. }
  173. catch (ResDataObjectExption& e)
  174. {
  175. Error("Get config error: {$}", e.what());
  176. return "";
  177. }
  178. ResDataObject resAttr, resDescription;
  179. for (auto Item : m_ConfigInfo)
  180. {
  181. resAttr.add(Item.GetKey(), Item.GetCurrentValue());
  182. resDescription.add(Item.GetKey(), Item.GetDescription());
  183. }
  184. ResDataObject resDeviceResource;
  185. resDeviceResource.add(ConfKey::CcosDetectorAttribute, resAttr);
  186. resDeviceResource.add(ConfKey::CcosDetectorDescription, resDescription);
  187. ResDataObject DescriptionTempEx;
  188. DescriptionTempEx.add(ConfKey::CcosDetectorConfig, resDeviceResource);
  189. m_DeviceConfig = DescriptionTempEx;
  190. (*m_pAttribute) = resAttr;
  191. (*m_pDescription) = resDescription;
  192. string res = DescriptionTempEx.encode();
  193. //Debug("get resource over {$}", DescriptionTempEx.encode());
  194. return res;
  195. }
  196. std::string nsFPD::PZMedicalDriver::DeviceProbe()
  197. {
  198. Debug(__FUNCTION__);
  199. ResDataObject r_config, HardwareInfo;
  200. if (r_config.loadFile(m_ConfigFileName.c_str()))
  201. {
  202. auto Child = r_config[NODE_CONFIGURATION];
  203. HardwareInfo.add(NODE_MajorID, Child[NODE_MajorID]);
  204. HardwareInfo.add(NODE_MinorID, "Device");
  205. HardwareInfo.add(NODE_VendorID, Child[NODE_VendorID]);
  206. HardwareInfo.add(NODE_ProductID, Child[NODE_ProductID]);
  207. HardwareInfo.add(NODE_SerialID, Child[NODE_SerialID]);
  208. }
  209. else
  210. {
  211. HardwareInfo.add(NODE_MajorID, "Detector");
  212. HardwareInfo.add(NODE_MinorID, "Device");
  213. HardwareInfo.add(NODE_VendorID, "CareRay");
  214. HardwareInfo.add(NODE_ProductID, "CareRay");
  215. HardwareInfo.add(NODE_SerialID, "1234");
  216. }
  217. string str = HardwareInfo.encode();
  218. return str;
  219. }
  220. bool nsFPD::PZMedicalDriver::GetDeviceConfig(std::string& Cfg)
  221. {
  222. Info(__FUNCTION__);
  223. Cfg = m_DeviceConfig.encode();
  224. return true;
  225. }
  226. bool nsFPD::PZMedicalDriver::SetDeviceConfig(std::string Cfg)
  227. {
  228. Info("{$} {$}", __FUNCTION__, Cfg.c_str());
  229. ResDataObject DeviceConfig;
  230. DeviceConfig.decode(Cfg.c_str());
  231. ResDataObject DescriptionTempEx;
  232. DescriptionTempEx = DeviceConfig["DeviceConfig"];
  233. bool bSaveFile = false; //true:重新保存配置文件
  234. string strAccess = "";
  235. for (int i = 0; i < DescriptionTempEx.size(); i++)
  236. {
  237. ResDataObject temp = DescriptionTempEx[i];
  238. Info("{$}", temp.encode());
  239. for (int j = 0; j < temp.size(); j++)
  240. {
  241. string strKey = temp.GetKey(j);
  242. Info("{$}", strKey.c_str());
  243. try
  244. {
  245. if (m_pAttribute->GetFirstOf(strKey.c_str()) >= 0)
  246. {
  247. strAccess = (string)(*m_pDescription)[strKey.c_str()][AttributeAccess];
  248. if ("rw" == strAccess)
  249. {
  250. //修改对应配置,在其他单元的配置项要同时调用其修改函数修改真实值
  251. //1. 修改内存中的值,用于给上层发消息
  252. (*m_pAttribute)[strKey.c_str()] = temp[j];
  253. //2. 拿到Innerkey
  254. int nConfigInfoCount = (int)m_Configurations[NODE_ConfigToolInfo].GetKeyCount(NODE_AttributeInfo);
  255. Info("ConfigInfo Count: {$}", nConfigInfoCount);
  256. string strTemp = ""; //存储AttributeKey
  257. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  258. {
  259. strTemp = (string)m_Configurations[NODE_ConfigToolInfo][nInfoIndex][NODE_AttributeKey];
  260. if (strTemp == strKey)
  261. {
  262. strTemp = (string)m_Configurations[NODE_ConfigToolInfo][nInfoIndex][NODE_InnerKey];
  263. break;
  264. }
  265. }
  266. //3. 修改配置文件中的值
  267. if (SetDeviceConfigValue(m_Configurations, strTemp.c_str(), 1, temp[j]))
  268. {
  269. bSaveFile = true;
  270. }
  271. }
  272. else
  273. {
  274. Info("{$} is not a RW configuration item", strKey.c_str());
  275. }
  276. }
  277. }
  278. catch (ResDataObjectExption& e)
  279. {
  280. Error("SetDriverConfig crashed: {$}", e.what());
  281. return false;
  282. }
  283. }
  284. }
  285. if (bSaveFile)
  286. {
  287. //3. 重新保存配置文件
  288. SaveConfigFile(true);
  289. }
  290. return true;
  291. }
  292. bool nsFPD::PZMedicalDriver::SaveConfigFile(bool bSendNotify)
  293. {
  294. m_ConfigAll[NODE_CONFIGURATION] = m_Configurations;
  295. m_ConfigAll.SaveFile(m_ConfigFileName.c_str());
  296. Info("SaveConfigFile over");
  297. return true;
  298. }
  299. bool nsFPD::PZMedicalDriver::GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue)
  300. {
  301. strValue = "";
  302. string strTemp = pInnerKey;
  303. if (1 == nPathID) //从DriverConfig路径下每个DPC自己的配置文件读取
  304. {
  305. if (WiredIP == strTemp || WirelessIP == strTemp || LocalIP == strTemp)
  306. {
  307. strValue = (string)config[NODE_connections][pInnerKey];
  308. }
  309. else if (DetectorVender == strTemp || DetectorModel == strTemp ||
  310. DetectorDescription == strTemp || DetectorSerialNumber == strTemp)
  311. {
  312. strValue = (string)config[pInnerKey];
  313. }
  314. else if (SyncType == strTemp || FPDWorkStation == strTemp ||
  315. ImageWidth == strTemp || ImageHeight == strTemp)
  316. {
  317. strValue = (string)config[NODE_ModeTable][NODE_DetectorMode][pInnerKey];
  318. }
  319. else if (TempMaxLimit == strTemp || ReConnect == strTemp ||
  320. TempUpperLimit == strTemp || TempLowerLimit == strTemp || TempMinLimit == strTemp ||
  321. BatLowerLimit == strTemp || BatMiniLimit == strTemp ||
  322. BatLowerLimitInCali == strTemp || WifiLowerLimit == strTemp ||
  323. WifiMiniLimit == strTemp || HighPowerTimeout == strTemp ||
  324. ShowTemperature == strTemp || ShowWifi == strTemp ||
  325. ShowBattery == strTemp || ShowBluetooth == strTemp ||
  326. FPDExamMode == strTemp || FPDAcqMode == strTemp || FPDModeMatch == strTemp || CcosDetectorAttachedFlag == strTemp)
  327. {
  328. strValue = (string)config[pInnerKey];
  329. }
  330. else
  331. {
  332. strValue = "";
  333. Warn("Error Configuration item: {$}", pInnerKey);
  334. }
  335. }
  336. return true;
  337. }
  338. bool nsFPD::PZMedicalDriver::SetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, const char* szValue)
  339. {
  340. string strTemp = pInnerKey;
  341. Trace("Begin to change {$} item value to {$}", pInnerKey, szValue);
  342. if (1 == nPathID) //从DriverConfig路径下每个DPC自己的配置文件读取
  343. {
  344. if (WiredIP == strTemp || WirelessIP == strTemp || LocalIP == strTemp)
  345. {
  346. config["connections"][pInnerKey] = szValue;
  347. }
  348. else if (DetectorVender == strTemp || DetectorModel == strTemp ||
  349. DetectorDescription == strTemp || DetectorSerialNumber == strTemp)
  350. {
  351. config[pInnerKey] = szValue;
  352. }
  353. else if (SyncType == strTemp || FPDWorkStation == strTemp ||
  354. ImageWidth == strTemp || ImageHeight == strTemp)
  355. {
  356. config["ModeTable"]["DetectorMode"][pInnerKey] = szValue;
  357. }
  358. else if (TempMaxLimit == strTemp || ReConnect == strTemp ||
  359. TempUpperLimit == strTemp || TempLowerLimit == strTemp ||
  360. BatLowerLimit == strTemp || BatMiniLimit == strTemp ||
  361. BatLowerLimitInCali == strTemp || WifiLowerLimit == strTemp ||
  362. WifiMiniLimit == strTemp || HighPowerTimeout == strTemp ||
  363. ShowTemperature == strTemp || ShowWifi == strTemp ||
  364. ShowBattery == strTemp || ShowBluetooth == strTemp ||
  365. FPDExamMode == strTemp || FPDAcqMode == strTemp || FPDModeMatch == strTemp)
  366. {
  367. config[pInnerKey] = szValue;
  368. }
  369. else
  370. {
  371. Warn("Error Configuration item: {$}", pInnerKey);
  372. return false;
  373. }
  374. }
  375. return true;
  376. }
  377. //-----------------------------------------------------------------------------
  378. // FPDDevicePZMedical
  379. //-----------------------------------------------------------------------------
  380. extern PZMedicalCtrl* g_pDetector;
  381. nsFPD::FPDDevicePZMedical::FPDDevicePZMedical(std::shared_ptr<IOEventCenter> center, std::string strConfigPath)
  382. : m_bConnect(false)
  383. , m_pDetector(nullptr)
  384. , m_pImgBuffer(nullptr)
  385. , m_nCurrentMode(-1)
  386. , m_fCurrentPPS(0.0f)
  387. , m_fFactorEXI2UGY(0.0f)
  388. , m_eSyncMode(SYNC_HARDWARE)
  389. , m_fCurrentDetectorTemperature(-273.15f)
  390. {
  391. super::EventCenter = center;
  392. m_strWorkPath = GetProcessDirectory();
  393. m_DetectorCtrlUnit.reset(new OemCtrl(center, this));
  394. m_AcqUnit.reset(new OemAcq(center, this));
  395. m_SyncUnit.reset(new OemSync(center, this));
  396. m_CalibUnit.reset(new OemCalib(center, this));
  397. m_DetectorConfiguration.reset(new DetectorConfiguration(strConfigPath));
  398. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_SHUTDOWN));
  399. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  400. }
  401. nsFPD::FPDDevicePZMedical::~FPDDevicePZMedical()
  402. {
  403. }
  404. std::string nsFPD::FPDDevicePZMedical::GetGUID() const
  405. {
  406. return DetectorUnitType;
  407. }
  408. bool nsFPD::FPDDevicePZMedical::Prepare()
  409. {
  410. Info("=====Prepare");
  411. int nFrameCount = m_stDeviceConfig.nMaxFrameNum;
  412. Info("Max frame count: {$}", nFrameCount);
  413. //动态没有预览图
  414. EventCenter->OnMaxBlockSize("RfQue", 1500 * 1500 * 2, nFrameCount, 10 * 10 * 2, 1);
  415. Connect();
  416. return true;
  417. }
  418. bool nsFPD::FPDDevicePZMedical::CreateDevice()
  419. {
  420. Info(__FUNCTION__);
  421. if (!LoadConfig())
  422. {
  423. Error("Load configuration file failed!!!");
  424. return false;
  425. }
  426. if (g_pDetector == nullptr)
  427. {
  428. m_pDetector = new PZMedicalCtrl();
  429. g_pDetector = m_pDetector;
  430. Info("Create SDK ctrl ok");
  431. }
  432. else
  433. {
  434. m_pDetector = g_pDetector;
  435. Info("SDK ctrl Already exit");
  436. }
  437. //多板可使用多DPC设备对象实现
  438. //return g_pDetector->DriverEntry(this, m_DetectorConfiguration->m_Configurations);
  439. m_pDetector->DriverEntry(this, m_DetectorConfiguration->m_Configurations);
  440. return true;
  441. }
  442. void nsFPD::FPDDevicePZMedical::Register()
  443. {
  444. auto Disp = &Dispatch;
  445. RegisterCtrl(Disp);
  446. RegisterAcq(Disp);
  447. RegisterSync(Disp);
  448. RegisterCalib(Disp);
  449. RegisterOthers(Disp);
  450. }
  451. RET_STATUS nsFPD::FPDDevicePZMedical::Connect()
  452. {
  453. m_DetectorCtrlUnit->SetAttachStatus(to_string(1)); //没有attach功能,直接上发1,使客户端显示探测器状态
  454. if (m_stDeviceConfig.bSupportDDR) //是否支持DDR采集功能
  455. {
  456. m_DetectorCtrlUnit->SetSupportDDR(to_string(1));
  457. }
  458. else
  459. {
  460. m_DetectorCtrlUnit->SetSupportDDR(to_string(0));
  461. }
  462. RET_STATUS ret = RET_STATUS::RET_FAILED;
  463. if (m_pDetector->Connect(this, m_strWorkPath.c_str()))
  464. {
  465. m_bConnect = true;
  466. ret = RET_STATUS::RET_SUCCEED;
  467. }
  468. return ret;
  469. }
  470. RET_STATUS nsFPD::FPDDevicePZMedical::EnterExam(int nExamMode)
  471. {
  472. Info("{$} ({$})",__FUNCTION__, nExamMode);
  473. switch (nExamMode)
  474. {
  475. case APP_STATUS_WORK_BEGIN:
  476. Info("Enter into Exam Windows");
  477. m_eAppStatus = APP_STATUS_WORK_BEGIN;
  478. break;
  479. case APP_STATUS_WORK_END:
  480. Info("Quit Exam Windows");
  481. m_eAppStatus = APP_STATUS_WORK_END;
  482. break;
  483. case APP_STATUS_DETSHARE_BEGIN:
  484. Info("Enter into Detector Share Windows");
  485. m_eAppStatus = APP_STATUS_DETSHARE_BEGIN;
  486. break;
  487. case APP_STATUS_DETSHAR_END:
  488. m_eAppStatus = APP_STATUS_IDLE;
  489. Info("Quit Detector Share Windows");
  490. m_eAppStatus = APP_STATUS_DETSHAR_END;
  491. break;
  492. case APP_STATUS_CAL_BEGIN:
  493. Info("Enter into Calibration Windows");
  494. m_eAppStatus = APP_STATUS_CAL_BEGIN;
  495. break;
  496. case APP_STATUS_CAL_END:
  497. Info("Quit Calibration Windows");
  498. m_eAppStatus = APP_STATUS_CAL_END;
  499. break;
  500. case APP_STATUS_WORK_IN_SENSITIVITY:
  501. Info("Enter into sensitivity test interface");
  502. m_eAppStatus = APP_STATUS_WORK_IN_SENSITIVITY;
  503. break;
  504. default:
  505. break;
  506. }
  507. m_pDetector->EnterExamMode(nExamMode);
  508. return RET_STATUS::RET_SUCCEED;
  509. }
  510. /***
  511. * 激活对应的探测器
  512. ***/
  513. RET_STATUS nsFPD::FPDDevicePZMedical::ActiveDetector(bool bActive)
  514. {
  515. Info("=====ActiveDetector");
  516. int nDetectorID = 1;
  517. if (!m_pDetector->ActiveDetector(nDetectorID))
  518. {
  519. return RET_STATUS::RET_FAILED;
  520. }
  521. return RET_STATUS::RET_SUCCEED;
  522. }
  523. RET_STATUS nsFPD::FPDDevicePZMedical::SetAcqMode(std::string strAcqmode)
  524. {
  525. Info("=====SetAcqMode ({$})", strAcqmode);
  526. RET_STATUS ret = RET_STATUS::RET_FAILED;
  527. int nMode = 0;
  528. if (!m_bConnect)
  529. {
  530. Error("Detector not connected, return");
  531. return ret;
  532. }
  533. if (strAcqmode.find("RAD") != std::string::npos)
  534. {
  535. nMode = 1;
  536. }
  537. else if (strAcqmode.find("CF") != std::string::npos && m_fCurrentPPS < 16.0f)
  538. {
  539. nMode = 3;
  540. }
  541. else if (strAcqmode.find("PF") != std::string::npos && m_fCurrentPPS < 16.0f)
  542. {
  543. nMode = 4;
  544. }
  545. else if (strAcqmode.find("CF") != std::string::npos && m_fCurrentPPS >= 16.0f)
  546. {
  547. nMode = 5;
  548. }
  549. else if (strAcqmode.find("PF") != std::string::npos && m_fCurrentPPS >= 16.0f)
  550. {
  551. nMode = 6;
  552. }
  553. else
  554. {
  555. Error("Undefined Acq mode, return");
  556. return ret;
  557. }
  558. //判重
  559. if (m_nCurrentMode == nMode)
  560. {
  561. Info("Same mode, return true");
  562. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  563. return RET_STATUS::RET_SUCCEED;
  564. }
  565. //获取当前模式号对应的配置
  566. if (!m_DetectorConfiguration->GetDetModeInfo(nMode, m_stModeInfo))
  567. {
  568. Error("Illegal mode!");
  569. return ret;
  570. }
  571. int nImgX = m_stModeInfo.nImageWidth;
  572. int nImgY = m_stModeInfo.nImageHeight;
  573. //申请图像内存
  574. if (nullptr != m_pImgBuffer)
  575. {
  576. delete m_pImgBuffer;
  577. m_pImgBuffer = nullptr;
  578. }
  579. m_pImgBuffer = new WORD[(size_t)nImgX * (size_t)nImgY];
  580. //发送图像信息
  581. if (m_stModeInfo.nRotateAngle == 90 || m_stModeInfo.nRotateAngle == 270)
  582. {
  583. m_AcqUnit->SetFulImageInfo(nImgX, nImgY, m_stModeInfo.nPhySizeInfoBit, false);
  584. }
  585. else
  586. {
  587. m_AcqUnit->SetFulImageInfo(nImgY, nImgX, m_stModeInfo.nPhySizeInfoBit, false);
  588. }
  589. Info("Sync Mode: {$}, ", m_stModeInfo.nSyncType);
  590. if (m_pDetector->SetAcqMode(m_stModeInfo, m_stCalibInfo, nMode))
  591. {
  592. m_nCurrentMode = nMode;
  593. ret = RET_STATUS::RET_SUCCEED;
  594. }
  595. int Sensitivity = (int)m_stModeInfo.nSensitivity;
  596. char szValue[32];
  597. sprintf_s(szValue, sizeof(szValue), "%d", Sensitivity);
  598. m_DetectorCtrlUnit->SetFPDSensitivity(szValue);
  599. Info("FPD Sensitivity: {$}", Sensitivity);
  600. m_fFactorEXI2UGY = 100.0f / (float)m_stModeInfo.nSensitivity * 1.0f;
  601. Info("FactorEXI2UGY: {$}", m_fFactorEXI2UGY);
  602. Info("SetAcqMode over");
  603. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  604. return ret;
  605. }
  606. RET_STATUS nsFPD::FPDDevicePZMedical::GetSyncMode(SYNC_MODE& eSyncMode)
  607. {
  608. Info("=====GetSyncMode");
  609. eSyncMode = m_eSyncMode;
  610. return RET_STATUS::RET_SUCCEED;
  611. }
  612. RET_STATUS nsFPD::FPDDevicePZMedical::PrepareAcquisition()
  613. {
  614. Info("=====PrepareAcquisition");
  615. RET_STATUS ret = RET_STATUS::RET_FAILED;
  616. if (!m_bConnect)
  617. {
  618. Error("Detector not connected, return");
  619. return ret;
  620. }
  621. Info("PrepareAcquisition over");
  622. return RET_STATUS::RET_SUCCEED; //下面不要,到踩脚闸和按手闸再走
  623. //m_SyncUnit->FPDReadyNotify(false); //prepare前置为初值
  624. //if (m_pDetector->PrepareAcquisition(this))
  625. //{
  626. // ret = RET_STATUS::RET_SUCCEED;
  627. // m_SyncUnit->FPDReadyNotify(true); //prepare succeed
  628. //}
  629. //Info("PrepareAcquisition over");
  630. //return ret;
  631. }
  632. RET_STATUS nsFPD::FPDDevicePZMedical::StartAcquisition(string in)
  633. {
  634. Info("=====StartAcquisition: {$}", in);
  635. RET_STATUS ret = RET_STATUS::RET_FAILED;
  636. if (!m_bConnect)
  637. {
  638. Error("Detector not connected, return");
  639. return ret;
  640. }
  641. ret = SetAcqMode(in);
  642. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_ACQ));
  643. if (in == "RAD")
  644. {
  645. if (ret != RET_STATUS::RET_SUCCEED)
  646. {
  647. Error("StartAcquisition SetAcqMode(RAD) fail!");
  648. return ret;
  649. }
  650. if (!m_pDetector->PrepareAcquisition(this))
  651. {
  652. Info("RAD pre failed");
  653. return RET_STATUS::RET_FAILED;
  654. }
  655. ret = RET_STATUS::RET_SUCCEED;
  656. m_pDetector->m_bGrabStatus = true;
  657. Info("RAD delay time: {$}", m_stDeviceConfig.nRADDelayTime);
  658. Sleep(m_stDeviceConfig.nRADDelayTime);
  659. }
  660. else if (in == "CF")
  661. {
  662. if (!m_pDetector->PrepareAcquisition(this))
  663. {
  664. Info("CF pre failed");
  665. return RET_STATUS::RET_FAILED;
  666. }
  667. ret = RET_STATUS::RET_SUCCEED;
  668. Info("StartAcquisition(CF)");
  669. }
  670. else if (in == "PF")
  671. {
  672. if (!m_pDetector->PrepareAcquisition(this))
  673. {
  674. Info("PF pre failed");
  675. return RET_STATUS::RET_FAILED;
  676. }
  677. ret = RET_STATUS::RET_SUCCEED;
  678. Info("StartAcquisition(PF)");
  679. }
  680. else
  681. {
  682. Error("Not support this mode, mode name:{$}", in);
  683. return ret;
  684. }
  685. //重新整理:工作流要求先设置采集状态(5)后发开窗状态
  686. if (m_pDetector->StartAcquisition(this))
  687. {
  688. ret = RET_STATUS::RET_SUCCEED;
  689. }
  690. Info("StartAcquisition over");
  691. return ret;
  692. }
  693. RET_STATUS nsFPD::FPDDevicePZMedical::StopAcquisition()
  694. {
  695. Info("=====StopAcquisition");
  696. RET_STATUS ret = RET_STATUS::RET_FAILED;
  697. if (!m_bConnect)
  698. {
  699. Error("Detector not connected, return");
  700. return ret;
  701. }
  702. if (m_pDetector->StopAcquisition(this))
  703. {
  704. ret = RET_STATUS::RET_SUCCEED;
  705. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  706. }
  707. Info("StopAcquisition over");
  708. return ret;
  709. }
  710. RET_STATUS nsFPD::FPDDevicePZMedical::SetFluPPS(float fFluPPS)
  711. {
  712. Info("=====SetFluPPS: {$}", fFluPPS);
  713. m_fCurrentPPS = fFluPPS;
  714. if (!m_pDetector->SetFluPPS(fFluPPS))
  715. {
  716. return RET_STATUS::RET_FAILED;
  717. }
  718. m_AcqUnit->FluPPSNotify(fFluPPS);
  719. return RET_STATUS::RET_SUCCEED;
  720. }
  721. RET_STATUS nsFPD::FPDDevicePZMedical::GetFluPPS(float& fFluPPS)
  722. {
  723. m_pDetector->GetFluPPS(fFluPPS);
  724. return RET_STATUS::RET_SUCCEED;
  725. }
  726. RET_STATUS nsFPD::FPDDevicePZMedical::ActiveCalibration(CCOS_CALIBRATION_TYPE eType)
  727. {
  728. Info("=====ActiveCalibration ({$})", (int)eType);
  729. RET_STATUS ret = RET_STATUS::RET_FAILED;
  730. if (!m_bConnect)
  731. {
  732. Error("Detector not connected, return");
  733. return ret;
  734. }
  735. if (eType == CCOS_CALIBRATION_TYPE_NONE || eType == CCOS_CALIBRATION_TYPE_MAX)
  736. {
  737. return RET_STATUS::RET_INVALID;
  738. }
  739. if (DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  740. {
  741. if (DETECTOR_STATUS_ACQ == m_DetectorCtrlUnit->GetDetectorStatus())
  742. {
  743. Error("ActiveCalibration failed. Detector at Acq status");
  744. }
  745. return RET_STATUS::RET_FAILED;
  746. }
  747. assert(m_pDetector);
  748. if (m_pDetector->ActiveCalibration(this, eType))
  749. {
  750. ret = RET_STATUS::RET_SUCCEED;
  751. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_ACTIVE));
  752. m_CalibUnit->SetCalibrationProgress(to_string(0));
  753. }
  754. else
  755. {
  756. Error("Active calibration failed");
  757. }
  758. Info("ActiveCalibration over");
  759. return ret;
  760. }
  761. RET_STATUS nsFPD::FPDDevicePZMedical::PrepareCalibration()
  762. {
  763. Info("=====PrepareCalibration");
  764. RET_STATUS ret = RET_STATUS::RET_FAILED;
  765. if (!m_bConnect)
  766. {
  767. Error("Detector not connected, return");
  768. return ret;
  769. }
  770. m_SyncUnit->FPDReadyNotify(false); //prepare前置为初值
  771. if (m_pDetector->PrepareCalibration(this))
  772. {
  773. ret = RET_STATUS::RET_SUCCEED;
  774. m_SyncUnit->FPDReadyNotify(true); //prepare succeed
  775. }
  776. else
  777. {
  778. Error("Prepare calibration failed");
  779. }
  780. Info("PrepareCalibration over");
  781. return ret;
  782. }
  783. RET_STATUS nsFPD::FPDDevicePZMedical::GetRequestedDose(string& strDose)
  784. {
  785. Info("=====GetRequestedDose");
  786. //fDose = m_fDose;
  787. strDose = to_string(100); //暂时写死
  788. Info("Dose request: {$}", strDose);
  789. Info("GetRequestedDose over");
  790. return RET_STATUS::RET_SUCCEED;
  791. }
  792. RET_STATUS nsFPD::FPDDevicePZMedical::GetCalibrationStep(int nDetectorID, std::string& strCalibrationStepInfo)
  793. {
  794. Info("=====GetCalibrationStep");
  795. Info("GetCalibrationStep over");
  796. return RET_STATUS::RET_SUCCEED;
  797. }
  798. RET_STATUS nsFPD::FPDDevicePZMedical::StartCalibration()
  799. {
  800. Info("=====StartCalibration");
  801. RET_STATUS ret = RET_STATUS::RET_FAILED;
  802. if (!m_bConnect)
  803. {
  804. Error("Detector not connected, return");
  805. return ret;
  806. }
  807. if ((m_CalibUnit->GetCalibrationStatus() != CCOS_CALIBRATION_STATUS_PAUSE) && (m_CalibUnit->GetCalibrationStatus() != CCOS_CALIBRATION_STATUS_ACTIVE))
  808. {
  809. Error("Start calibration failed, in {$} status", (int)m_CalibUnit->GetCalibrationStatus());
  810. return ret;
  811. }
  812. if (DETECTOR_STATUS_STANDBY != m_DetectorCtrlUnit->GetDetectorStatus())
  813. {
  814. if (DETECTOR_STATUS_ACQ == m_DetectorCtrlUnit->GetDetectorStatus())
  815. {
  816. Error("Start calibration failed. Detector at Acq status");
  817. }
  818. return ret;
  819. }
  820. if (m_CalibUnit->GetCalibrationStatus() == CCOS_CALIBRATION_STATUS_RUNNING)
  821. {
  822. Error("Detector already at calib status");
  823. return ret;
  824. }
  825. if (m_pDetector->StartCalibration(this))
  826. {
  827. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_ACQ));
  828. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_RUNNING));
  829. ret = RET_STATUS::RET_SUCCEED;
  830. }
  831. else
  832. {
  833. Error("Start calibration failed");
  834. }
  835. Info("StartCalibration over");
  836. return ret;
  837. }
  838. RET_STATUS nsFPD::FPDDevicePZMedical::StopCalibration()
  839. {
  840. Info("=====StopCalibration");
  841. RET_STATUS ret = RET_STATUS::RET_FAILED;
  842. if (!m_bConnect)
  843. {
  844. Error("Detector not connected, return");
  845. return ret;
  846. }
  847. if (m_pDetector->StopCalibration(this))
  848. {
  849. ret = RET_STATUS::RET_SUCCEED;
  850. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  851. m_CalibUnit->SetCalibrationProgress(to_string(100));
  852. }
  853. else
  854. {
  855. Error("Start calibration failed");
  856. }
  857. Info("StopCalibration over");
  858. return ret;
  859. }
  860. RET_STATUS nsFPD::FPDDevicePZMedical::AcceptCalibration()
  861. {
  862. Info("=====AcceptCalibration");
  863. m_pDetector->ConfirmCalExposure();
  864. Info("AcceptCalibration over");
  865. return RET_STATUS::RET_SUCCEED;
  866. }
  867. RET_STATUS nsFPD::FPDDevicePZMedical::RejectCalibration()
  868. {
  869. Info("=====RejectCalibration");
  870. m_pDetector->RejectCalExposure();
  871. Info("RejectCalibration over");
  872. return RET_STATUS::RET_SUCCEED;
  873. }
  874. RET_STATUS nsFPD::FPDDevicePZMedical::SaveCalibrationFile(bool bSaveFlag)
  875. {
  876. Info("=====SaveCalibrationFile ({$})", bSaveFlag);
  877. Info("SaveCalibrationFile over");
  878. return RET_STATUS::RET_SUCCEED;
  879. }
  880. RET_STATUS nsFPD::FPDDevicePZMedical::StartOffset(bool isAll)
  881. {
  882. //品臻只需要刷新点片Offset
  883. Info("=====StartOffset: {$}", isAll);
  884. m_pDetector->StartOffset(0);
  885. m_nCurrentMode = 0;
  886. Info("StartOffset over");
  887. return RET_STATUS::RET_SUCCEED;
  888. }
  889. RET_STATUS nsFPD::FPDDevicePZMedical::AbortOffset()
  890. {
  891. Info("=====AbortOffset");
  892. m_pDetector->AbortOffset();
  893. Info("AbortOffset over");
  894. return RET_STATUS::RET_SUCCEED;
  895. }
  896. RET_STATUS nsFPD::FPDDevicePZMedical::UpdateModeInRunning(std::vector<AcqModeInfo>& vAcqModeList)
  897. {
  898. /*FINFO("--Func-- UpdateModeInRunning");
  899. m_vAcqModeInfoList.assign(vAcqModeList.begin(), vAcqModeList.end());
  900. for (size_t i = 0; i < m_vAcqModeInfoList.size(); i++)
  901. {
  902. if (m_vAcqModeInfoList[i].fFrequency == m_fCurrentPPS)
  903. {
  904. g_pDetector->UpdateModeInRunning(m_vAcqModeInfoList[i].nModeID, m_vAcqModeInfoList[i].fFrequency);
  905. break;
  906. }
  907. }*/
  908. Info("UpdateModeInRunning, mode size: {$}", vAcqModeList.size());
  909. for (size_t i = 0; i < vAcqModeList.size(); i++)
  910. {
  911. Info("index: {$}, ModeID: {$}, frequence: {$}", i, vAcqModeList[i].nModeID, vAcqModeList[i].fFrequency);
  912. }
  913. return RET_SUCCEED;
  914. }
  915. bool nsFPD::FPDDevicePZMedical::Support_DarkCalib()
  916. {
  917. //支持暗场校正
  918. return true;
  919. }
  920. bool nsFPD::FPDDevicePZMedical::Support_XrayCalib()
  921. {
  922. //支持亮场校正
  923. return true;
  924. }
  925. bool nsFPD::FPDDevicePZMedical::Support_HaveImageCalib()
  926. {
  927. return true;
  928. }
  929. void nsFPD::FPDDevicePZMedical::SendTemperatureValue(float fValue)
  930. {
  931. int nStatus = 0;
  932. m_Temperature->SetTemperature(fValue, nStatus);
  933. Info("SendTemperatureValue: {$}, status {$}", fValue, nStatus);
  934. return;
  935. }
  936. void nsFPD::FPDDevicePZMedical::SendWifiValue(int nValue)
  937. {
  938. int nStatus = 0;
  939. m_Wifi->SetSignalValue(nValue, nStatus);
  940. Info("SendWifiValue: {$}, status {$}", nValue, nStatus);
  941. return;
  942. }
  943. void nsFPD::FPDDevicePZMedical::SendBatteryValue(int nValue)
  944. {
  945. int nStatus = 0;
  946. m_Battery->SetRemainPowerValue(nValue, nStatus);
  947. Info("SendBatteryValue: {$}, status {$}", nValue, nStatus);
  948. return;
  949. }
  950. bool nsFPD::FPDDevicePZMedical::LoadConfig()
  951. {
  952. if (!m_DetectorConfiguration->LoadConfigurations(m_stDeviceConfig))
  953. {
  954. Error("Load configuration file failed!!!");
  955. return false;
  956. }
  957. m_DetectorCtrlUnit->SetDetectorType("SCINTILLATOR");
  958. //不同采集模式可能会有不同的值,后面在考虑
  959. auto strSensitivity = to_string(m_stDeviceConfig.AcqModeInfo.nSensitivity);
  960. m_DetectorCtrlUnit->SetFPDSensitivity(strSensitivity);
  961. m_DetectorCtrlUnit->SetPixelData("");
  962. m_DetectorCtrlUnit->SetTargetEXI("5000");
  963. m_AcqUnit->SetMaxFrameRate(m_stDeviceConfig.fMaxFrameRate);
  964. auto nOffsetinteral = to_string(m_stDeviceConfig.nOffsetInterval);
  965. m_CalibUnit->SetOffsetInterval(nOffsetinteral);
  966. Info("Offset interval: {$} minutes", nOffsetinteral);
  967. m_DetectorCtrlUnit->SetDetectorWidth(to_string(m_stDeviceConfig.nMaxImgWidth));
  968. m_DetectorCtrlUnit->SetDetectorHeight(to_string(m_stDeviceConfig.nMaxImgHeight));
  969. //暂时发特定值
  970. m_DetectorCtrlUnit->SetDateofLastDetectorCalibration(m_stDeviceConfig.strCalibrationDate);
  971. m_DetectorCtrlUnit->SetTimeofLastDetectorCalibration(m_stDeviceConfig.strCalibrationTime);
  972. m_Battery.reset(new DeviceBatteryMould("DetectorBattery", 0, m_stDeviceConfig.nBatteryLimit, m_stDeviceConfig.nBatteryWarning,
  973. 100, m_stDeviceConfig.nBatteryLimit, 100, 100, 0, EventCenter));
  974. m_Temperature.reset(new DeviceTemperatureMould("DetectorTemperature", 0.0f, m_stDeviceConfig.fTemperLowLimit, m_stDeviceConfig.fTemperMinWarn,
  975. m_stDeviceConfig.fTemperMaxWarn, m_stDeviceConfig.fTemperMinWarn, m_stDeviceConfig.fTemperMaxWarn, m_stDeviceConfig.fTemperMaxLimit, 0.0f, EventCenter));
  976. m_Wifi.reset(new DeviceWifiMould("DetectorWifi", 0, m_stDeviceConfig.nWifiLimit, m_stDeviceConfig.nWifiWarning, 100,
  977. m_stDeviceConfig.nWifiLimit, 100, 100, 0, EventCenter));
  978. return true;
  979. }
  980. void nsFPD::FPDDevicePZMedical::RegisterCtrl(nsDetail::Dispatch* Dispatch)
  981. {
  982. Dispatch->Action.Push("ActiveDetector", m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSActiveDetector);
  983. Dispatch->Action.Push(ActionKey::EnterExam, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSEnterExam);
  984. Dispatch->Action.Push(ActionKey::ExitExam, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSExitExam);
  985. Dispatch->Get.Push(CcosDetectorStatus, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetFPDStatus);
  986. Dispatch->Get.Push(AttrKey::DetectorType, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorType);
  987. Dispatch->Get.Push(AttrKey::Description, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDescription);
  988. Dispatch->Get.Push(AttrKey::DetectorID, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorID);
  989. Dispatch->Get.Push(AttrKey::FPDSensitivity, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetFPDSensitivity);
  990. Dispatch->Get.Push(AttrKey::PixelData, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetPixelData);
  991. Dispatch->Get.Push(AttrKey::TargetEXI, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetTargetEXI);
  992. Dispatch->Action.Push(ActionKey::SetXrayOnNum, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSSetXrayOnNum);
  993. Dispatch->Action.Push(ActionKey::SetExposureTimes, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSSetExposureTimes);
  994. Dispatch->Get.Push(CcosDetectorAttachedFlag, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetAttachStatus);
  995. Dispatch->Get.Push("SupportDDR", m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetSupportDDR);
  996. Dispatch->Get.Push(AttrKey::DetectorWidth, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorWidth);
  997. Dispatch->Get.Push(AttrKey::DetectorHeight, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorHeight);
  998. Dispatch->Set.Push(AttrKey::DetectorStatus, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorStatus);
  999. Dispatch->Set.Push(AttrKey::Description, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDescription);
  1000. Dispatch->Set.Push(AttrKey::FPDSensitivity, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetFPDSensitivity);
  1001. Dispatch->Set.Push(AttrKey::TargetEXI, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetTargetEXI);
  1002. Dispatch->Set.Push(SupportDDR, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetSupportDDR);
  1003. Dispatch->Set.Push(AttrKey::DetectorID, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorID);
  1004. Dispatch->Set.Push(AttrKey::DetectorType, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorType);
  1005. Dispatch->Set.Push(AttrKey::PixelData, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetPixelData);
  1006. Dispatch->Update.Push(ConfKey::CcosDetectorSerialNumber, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSUpdateSerialNumber);
  1007. }
  1008. void nsFPD::FPDDevicePZMedical::RegisterAcq(nsDetail::Dispatch* Dispatch)
  1009. {
  1010. Dispatch->Action.Push(ActionKey::SetAcqMode, m_AcqUnit.get(), &AcqUnit::JSSetAcqMode);
  1011. Dispatch->Action.Push(ActionKey::SetValue_PPS, m_AcqUnit.get(), &AcqUnit::JSSetFluPPS);
  1012. Dispatch->Get.Push(CcosZskkFPDState, m_AcqUnit.get(), &AcqUnit::JSGetZskkFPDState);
  1013. Dispatch->Get.Push(AttrKey::NoNeedWaitImage, m_AcqUnit.get(), &AcqUnit::JSGetNoNeedWaitImage);
  1014. Dispatch->Get.Push(AttrKey::ImgDataInfo, m_AcqUnit.get(), &AcqUnit::JSGetLastImage);
  1015. Dispatch->Get.Push(AttrKey::FluPPS, m_AcqUnit.get(), &AcqUnit::JSGetFluPPS);
  1016. Dispatch->Get.Push(AttrKey::MaxFrameRate, m_AcqUnit.get(), &AcqUnit::JSGetMaxFrameRate);
  1017. Dispatch->Update.Push(AttrKey::ModeInRunning, m_AcqUnit.get(), &AcqUnit::JSUpdateModeInRunning);
  1018. }
  1019. void nsFPD::FPDDevicePZMedical::RegisterSync(nsDetail::Dispatch* Dispatch)
  1020. {
  1021. Dispatch->Action.Push(ActionKey::SetSyncMode, m_SyncUnit.get(), &SyncUnit::JSSetSyncMode);
  1022. Dispatch->Action.Push(ActionKey::SetXwindowSize, m_SyncUnit.get(), &SyncUnit::JSSetXwindowSize);
  1023. Dispatch->Action.Push(ActionKey::PrepareAcquisition, m_SyncUnit.get(), &SyncUnit::JSPrepareAcquisition);
  1024. Dispatch->Action.Push(ActionKey::StartAcquisition, m_SyncUnit.get(), &SyncUnit::JSStartAcquisition);
  1025. Dispatch->Action.Push(ActionKey::StopAcquisition, m_SyncUnit.get(), &SyncUnit::JSStopAcquisition);
  1026. Dispatch->Get.Push(CcosSyncMode, m_SyncUnit.get(), &SyncUnit::JSGetSyncMode);
  1027. Dispatch->Get.Push(CcosFPDReadyStatus, m_SyncUnit.get(), &SyncUnit::JSGetFPDReady);
  1028. Dispatch->Get.Push(CcosXwindowStatus, m_SyncUnit.get(), &SyncUnit::JSGetXWindowStatus);
  1029. Dispatch->Get.Push(CcosImageReadingStatus, m_SyncUnit.get(), &SyncUnit::JSGetImageReadingStatus);
  1030. Dispatch->Get.Push(AttrKey::FPDExpReady, m_SyncUnit.get(), &SyncUnit::JSGetExpReadyStatus);
  1031. }
  1032. void nsFPD::FPDDevicePZMedical::RegisterCalib(nsDetail::Dispatch* Dispatch)
  1033. {
  1034. Dispatch->Action.Push(ActionKey::ActiveCalibration, m_CalibUnit.get(), &CalibUnit::JSActiveCalibration);
  1035. Dispatch->Action.Push(ActionKey::GetRequestedDose, m_CalibUnit.get(), &CalibUnit::JSGetRequestedDose);
  1036. Dispatch->Action.Push(ActionKey::PrepareCalibration, m_CalibUnit.get(), &CalibUnit::JSPrepareCalibration);
  1037. Dispatch->Action.Push(ActionKey::StartCalibration, m_CalibUnit.get(), &CalibUnit::JSStartCalibration);
  1038. Dispatch->Action.Push(ActionKey::StopCalibration, m_CalibUnit.get(), &CalibUnit::JSStopCalibration);
  1039. Dispatch->Action.Push(ActionKey::SetCorrectionType, m_CalibUnit.get(), &CalibUnit::JSSetCorrectionType);
  1040. Dispatch->Action.Push(ActionKey::StartOffset, m_CalibUnit.get(), &CalibUnit::JSStartOffset);
  1041. Dispatch->Action.Push(ActionKey::AbortOffset, m_CalibUnit.get(), &CalibUnit::JSAbortOffset);
  1042. Dispatch->Get.Push(AttrKey::CalibrationStatus, m_CalibUnit.get(), &CalibUnit::JSGetCalibStatus);
  1043. Dispatch->Get.Push(AttrKey::CalibrationProgress, m_CalibUnit.get(), &CalibUnit::JSGetCalibProgress);
  1044. Dispatch->Get.Push(AttrKey::UploadCalibrationFilesResult, m_CalibUnit.get(), &CalibUnit::JSGetUploadCalibrationFilesResult);
  1045. Dispatch->Get.Push(AttrKey::SupportCalibrationType, m_CalibUnit.get(), &CalibUnit::JSGetSupportCalibrationType);
  1046. Dispatch->Get.Push(AttrKey::OffsetStatus, m_CalibUnit.get(), &CalibUnit::JSGetOffsetStatus);
  1047. Dispatch->Get.Push(AttrKey::OffsetCounts, m_CalibUnit.get(), &CalibUnit::JSGetOffsetCounts);
  1048. Dispatch->Get.Push(AttrKey::OffsetProgress, m_CalibUnit.get(), &CalibUnit::JSGetOffsetProgress);
  1049. Dispatch->Get.Push(AttrKey::OffsetInterval, m_CalibUnit.get(), &CalibUnit::JSGetOffsetInterval);
  1050. Dispatch->Set.Push(AttrKey::OffsetInterval, m_CalibUnit.get(), &CalibUnit::SetOffsetInterval);
  1051. Dispatch->Update.Push(AttrKey::OffsetInterval, m_CalibUnit.get(), &CalibUnit::JSUpdateOffsetInterval);
  1052. }
  1053. void nsFPD::FPDDevicePZMedical::RegisterOthers(nsDetail::Dispatch* Dispatch)
  1054. {
  1055. Dispatch->Get.Push(AttrKey::Temperature_Value, m_Temperature.get(), &DeviceTemperatureMould::JSGetCurrentTemperatureValue);
  1056. Dispatch->Get.Push(AttrKey::Remain_Power_Value, m_Battery.get(), &DeviceBatteryMould::JSGetCurrentBatteryValue);
  1057. Dispatch->Get.Push(AttrKey::Wifi_Strength_Value, m_Wifi.get(), &DeviceWifiMould::JSGetCurrentSignalValue);
  1058. }
  1059. void nsFPD::FPDDevicePZMedical::OnFPDCallback(int nDetectorID, int nEventID, int nEventLevel,
  1060. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1061. {
  1062. switch (nEventLevel)
  1063. {
  1064. case EVT_LEVEL_CONFIGURATION:
  1065. {
  1066. OnEventProcessConf(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1067. break;
  1068. }
  1069. case EVT_LEVEL_INFORMATOION:
  1070. {
  1071. OnEventProcessInfo(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1072. break;
  1073. }
  1074. case EVT_LEVEL_STATUS:
  1075. {
  1076. OnEventProcessStatus(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1077. break;
  1078. }
  1079. case EVT_LEVEL_DATA:
  1080. {
  1081. OnEventProcessData(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1082. break;
  1083. }
  1084. case EVT_LEVEL_WARNING:
  1085. {
  1086. OnEventProcessWarning(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1087. break;
  1088. }
  1089. case EVT_LEVEL_ERROR:
  1090. {
  1091. OnEventProcessError(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1092. break;
  1093. }
  1094. default:
  1095. break;
  1096. }
  1097. }
  1098. void nsFPD::FPDDevicePZMedical::OnEventProcessConf(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1099. {
  1100. switch (nEventID)
  1101. {
  1102. case EVT_CONF_PANEL_SERIAL:
  1103. {
  1104. m_stDeviceConfig.strFPDSN = pszMsg;
  1105. Info("OnEventProcessConf: Detector {$} SN {$}", nDetectorID, pszMsg);
  1106. m_DetectorCtrlUnit->SetDetectorID(m_stDeviceConfig.strFPDSN);
  1107. break;
  1108. }
  1109. default:
  1110. break;
  1111. }
  1112. }
  1113. void nsFPD::FPDDevicePZMedical::OnEventProcessInfo(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1114. {
  1115. switch (nEventID)
  1116. {
  1117. case EVT_INFO_CALIBRATIOIN_TIME:
  1118. {
  1119. m_stDeviceConfig.strCalibrationDate = pszMsg;
  1120. Info("OnEventProcessInfo: Detector {$} Calibration Time: {$}", nDetectorID, pszMsg);
  1121. m_DetectorCtrlUnit->SetDateofLastDetectorCalibration(m_stDeviceConfig.strCalibrationDate);
  1122. m_DetectorCtrlUnit->SetTimeofLastDetectorCalibration("");
  1123. break;
  1124. }
  1125. default:
  1126. break;
  1127. }
  1128. }
  1129. void nsFPD::FPDDevicePZMedical::OnEventProcessStatus(int nDetectorID, int nEventID, int nEventLevel,
  1130. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1131. {
  1132. switch (nEventID)
  1133. {
  1134. case EVT_STATUS_PANEL:
  1135. {
  1136. //ENUM_PANEL_STATUS m_ePanelStatus = (ENUM_PANEL_STATUS)nParam1;
  1137. if (PANEL_START_ACQ == nParam1)
  1138. {
  1139. Info("Panel Status: Start acq");
  1140. m_stImgCreateTime = { 0 };
  1141. GetLocalTime(&m_stImgCreateTime);
  1142. Info("DDR image create time-{$}:{$}:{$}.{$}",
  1143. m_stImgCreateTime.wHour, m_stImgCreateTime.wMinute, m_stImgCreateTime.wSecond, m_stImgCreateTime.wMilliseconds);
  1144. }
  1145. else if (PANEL_END_ACQ == nParam1)
  1146. {
  1147. Info("Panel Status: End acq");
  1148. if (m_pDetector->StopAcquisition(this))
  1149. {
  1150. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1151. }
  1152. }
  1153. else if (PANEL_AEC_PRE_END == nParam1)
  1154. {
  1155. Info("Panel Status: AEC pre-shoot end");
  1156. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1157. }
  1158. else if (PANEL_READY_EXP == nParam1)
  1159. {
  1160. string strTemp = pszMsg;
  1161. if (strTemp.find("true") != std::string::npos)
  1162. {
  1163. m_SyncUnit->ExpReadyNotify(m_stModeInfo.nXwindow);
  1164. }
  1165. else
  1166. {
  1167. m_SyncUnit->ExpReadyNotify(0);
  1168. }
  1169. }
  1170. else if (PANEL_XWINDOW_ON == nParam1) //Xwindow On
  1171. {
  1172. m_stImgCreateTime = { 0 };
  1173. GetLocalTime(&m_stImgCreateTime);
  1174. Info("Full image create time-{$}:{$}:{$}.{$}",
  1175. m_stImgCreateTime.wHour, m_stImgCreateTime.wMinute, m_stImgCreateTime.wSecond, m_stImgCreateTime.wMilliseconds);
  1176. Info("XWindowON");
  1177. m_SyncUnit->XWindowOnNotify();
  1178. }
  1179. else if (PANEL_XWINDOW_OFF == nParam1) // Xwindow Off
  1180. {
  1181. m_SyncUnit->XWindowOffNotify();
  1182. }
  1183. }
  1184. break;
  1185. case EVT_STATUS_CALIBRATIOIN:
  1186. {
  1187. ENUM_PANEL_EVENT_STATE eStatus = (ENUM_PANEL_EVENT_STATE)nParam1;
  1188. switch (eStatus)
  1189. {
  1190. case PANEL_EVENT_START:
  1191. break;
  1192. case PANEL_EVENT_END_OK:
  1193. case PANEL_EVENT_END_ERROR:
  1194. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1195. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  1196. m_CalibUnit->SetCalibrationProgress(to_string(100));//make progress
  1197. break;
  1198. case PANEL_EVENT_TIMEOUT:
  1199. break;
  1200. default:
  1201. break;
  1202. }
  1203. }
  1204. break;
  1205. case EVT_STATUS_SINGLEEXP:
  1206. {
  1207. if (DOSE_ACCEPT == nParam1)
  1208. {
  1209. Info("Calibration Result is acceptable");
  1210. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1211. m_CalibUnit->PauseCalibration();
  1212. }
  1213. else
  1214. {
  1215. Warn("Not support this param({$})", nParam1);
  1216. }
  1217. }
  1218. break;
  1219. case EVT_STATUS_TEMPERATURE:
  1220. {
  1221. float fTemperature = fParam2;
  1222. m_fCurrentDetectorTemperature = fParam2;
  1223. // if (fTemperature > m_fTemperMaxLimit)
  1224. // {
  1225. // AddErrMsg("14", "temperature_toohigh");
  1226. // }
  1227. // else if (fTemperature >= m_fTemperWarning)
  1228. // {
  1229. // AddWarnMsg("14", "temperature_high");
  1230. // }
  1231. // else if (fTemperature < m_fTemperMinLimit)
  1232. // {
  1233. // AddErrMsg("14", "temperature_toolow");
  1234. // }
  1235. // else if (fTemperature <= m_fTemperLowLimit)
  1236. // {
  1237. // AddWarnMsg("14", "temperature_low");
  1238. // }
  1239. // else
  1240. // {
  1241. // DelErrMsg("14");
  1242. // }
  1243. SendTemperatureValue(fTemperature);
  1244. }
  1245. break;
  1246. case EVT_STATUS_WIFI:
  1247. {
  1248. int nWifiLevel = nParam1;
  1249. // if (nWifiLevel < m_nWifiLimit)
  1250. // {
  1251. // AddErrMsg("15", "wifi_toolow");
  1252. // }
  1253. // else if (nWifiLevel <= m_nWifiWarning)
  1254. // {
  1255. // AddWarnMsg("15", "wifi_low");
  1256. // }
  1257. // else
  1258. // {
  1259. // DelErrMsg("15");
  1260. // }
  1261. SendWifiValue(nWifiLevel);
  1262. }
  1263. break;
  1264. case EVT_STATUS_BATTERY_VALUE:
  1265. {
  1266. int nBatteryValue = nParam1;
  1267. // if (nBatteryValue < m_nBatteryLimit)
  1268. // {
  1269. // AddErrMsg("16", "battery_toolow");
  1270. // }
  1271. // else if (nBatteryValue <= m_nBatteryWarning)
  1272. // {
  1273. // AddWarnMsg("16", "battery_low");
  1274. // }
  1275. // else
  1276. // {
  1277. // DelErrMsg("16");
  1278. // }
  1279. SendBatteryValue(nBatteryValue);
  1280. }
  1281. break;
  1282. case PANEL_OFFSET_CAL:
  1283. {
  1284. if (OFFSET_IDLE == nParam1)
  1285. {
  1286. Info("Offset is Idle");
  1287. m_CalibUnit->SetOffsetStatus("Idle");
  1288. m_CalibUnit->SetOffsetProgress("1");
  1289. m_CalibUnit->SetOffsetCounts("1");
  1290. }
  1291. else if (OFFSET_RUNNING == nParam1)
  1292. {
  1293. Info("Offset is Running");
  1294. m_CalibUnit->SetOffsetStatus("Running");
  1295. m_CalibUnit->SetOffsetProgress("0");
  1296. m_CalibUnit->SetOffsetCounts("1");
  1297. }
  1298. else if (OFFSET_ERROR == nParam1)
  1299. {
  1300. Info("Offset is error");
  1301. m_CalibUnit->SetOffsetStatus("Error");
  1302. m_CalibUnit->SetOffsetProgress("1");
  1303. m_CalibUnit->SetOffsetCounts("1");
  1304. }
  1305. break;
  1306. }
  1307. default:
  1308. Warn("Not support this status({$})", nEventID);
  1309. break;
  1310. }
  1311. }
  1312. void nsFPD::FPDDevicePZMedical::OnEventProcessData(int nDetectorID, int nEventID, int nEventLevel,
  1313. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1314. {
  1315. switch (nEventID)
  1316. {
  1317. case EVT_DATA_RAW_IMAGE:
  1318. {
  1319. Info("Image Arrived");
  1320. int nImgX = m_stModeInfo.nImageWidth;
  1321. int nImgY = m_stModeInfo.nImageHeight;
  1322. int nAngle = m_stModeInfo.nRotateAngle;
  1323. memcpy(m_pImgBuffer, pParam, (size_t)nImgX * (size_t)nImgY * sizeof(WORD));
  1324. //暂时先用假值,有需要再改
  1325. ResDataObject objImageHead, objTemp;
  1326. objTemp.add(SM_IMAGE_TYPE, (int)IMAGE_FULL);
  1327. objTemp.add(SM_IMAGE_BIT, 16);
  1328. objTemp.add(SM_IMAGE_TAG, 1);
  1329. objTemp.add(SM_IMAGE_INDEX, 1);
  1330. objTemp.add(SM_IMAGE_YEAR, m_stImgCreateTime.wYear);
  1331. objTemp.add(SM_IMAGE_MONTH, m_stImgCreateTime.wMonth);
  1332. objTemp.add(SM_IMAGE_DAY, m_stImgCreateTime.wDay);
  1333. objTemp.add(SM_IMAGE_HOUR, m_stImgCreateTime.wHour);
  1334. objTemp.add(SM_IMAGE_MINUTE, m_stImgCreateTime.wMinute);
  1335. objTemp.add(SM_IMAGE_SEC, m_stImgCreateTime.wSecond);
  1336. objTemp.add(SM_IMAGE_MILLSEC, m_stImgCreateTime.wMilliseconds);
  1337. objTemp.add(SM_IMAGE_LSB, "5000");
  1338. objTemp.add(SM_IMAGE_DOSE, m_stModeInfo.nSensitivity);
  1339. objTemp.add(SM_IMAGE_PIXELSPACING, m_stModeInfo.nPixelPitch);
  1340. objTemp.add(SM_IMAGE_PIXELREPRESENTATION, "1");
  1341. objTemp.add(SM_IMAGE_FLIP, "No");
  1342. objTemp.add(SM_IMAGE_ORIGINX, "0");
  1343. objTemp.add(SM_IMAGE_ORIGINY, "0");
  1344. objTemp.add(SM_IMAGE_EXI2UGY, m_fFactorEXI2UGY);
  1345. objTemp.add(SM_IMAGE_TEMP, m_fCurrentDetectorTemperature);
  1346. if (0 != nAngle)
  1347. {
  1348. m_AcqUnit->RotateImage(m_pImgBuffer, nImgY, nImgX, nAngle);
  1349. }
  1350. if (90 == nAngle || 270 == nAngle)
  1351. {
  1352. objTemp.add(SM_IMAGE_WIDTH, nImgY);
  1353. objTemp.add(SM_IMAGE_HEIGHT, nImgX);
  1354. objTemp.add(SM_IMAGE_ROTATION, "Yes");
  1355. }
  1356. else
  1357. {
  1358. objTemp.add(SM_IMAGE_WIDTH, nImgX);
  1359. objTemp.add(SM_IMAGE_HEIGHT, nImgY);
  1360. objTemp.add(SM_IMAGE_ROTATION, "No");
  1361. }
  1362. objImageHead.add(SM_IMAGE_HEAD, objTemp);
  1363. Trace("Full image head: {$}", objImageHead.encode());
  1364. RET_STATUS ret = RET_STATUS::RET_FAILED;
  1365. ret = m_AcqUnit->AddFrameWithRawHead(IMAGE_FULL, objImageHead.encode(), m_pImgBuffer, nImgX * nImgY);
  1366. Info("Add image over, {$}", (int)ret);
  1367. }
  1368. break;
  1369. case EVT_DATA_PREVIEW_IMAGE:
  1370. {
  1371. Info("Preview Image Arrived");
  1372. int nImgX = 96;
  1373. int nImgY = 96;
  1374. int nAngle = m_stModeInfo.nRotateAngle;
  1375. memcpy(m_pImgBuffer, pParam, (size_t)nImgX * (size_t)nImgY * sizeof(WORD));
  1376. //暂时先用假值,有需要再改
  1377. ResDataObject objImageHead, objTemp;
  1378. objTemp.add(SM_IMAGE_TYPE, (int)IMAGE_AEC_PREVIEW);
  1379. objTemp.add(SM_IMAGE_BIT, 16);
  1380. objTemp.add(SM_IMAGE_TAG, 1);
  1381. objTemp.add(SM_IMAGE_INDEX, 1);
  1382. objTemp.add(SM_IMAGE_YEAR, m_stImgCreateTime.wYear);
  1383. objTemp.add(SM_IMAGE_MONTH, m_stImgCreateTime.wMonth);
  1384. objTemp.add(SM_IMAGE_DAY, m_stImgCreateTime.wDay);
  1385. objTemp.add(SM_IMAGE_HOUR, m_stImgCreateTime.wHour);
  1386. objTemp.add(SM_IMAGE_MINUTE, m_stImgCreateTime.wMinute);
  1387. objTemp.add(SM_IMAGE_SEC, m_stImgCreateTime.wSecond);
  1388. objTemp.add(SM_IMAGE_MILLSEC, m_stImgCreateTime.wMilliseconds);
  1389. objTemp.add(SM_IMAGE_LSB, "5000");
  1390. objTemp.add(SM_IMAGE_DOSE, m_stModeInfo.nSensitivity);
  1391. objTemp.add(SM_IMAGE_PIXELSPACING, m_stModeInfo.nPixelPitch);
  1392. objTemp.add(SM_IMAGE_PIXELREPRESENTATION, "1");
  1393. objTemp.add(SM_IMAGE_FLIP, "No");
  1394. objTemp.add(SM_IMAGE_ORIGINX, "0");
  1395. objTemp.add(SM_IMAGE_ORIGINY, "0");
  1396. objTemp.add(SM_IMAGE_EXI2UGY, m_fFactorEXI2UGY);
  1397. objTemp.add(SM_IMAGE_TEMP, m_fCurrentDetectorTemperature);
  1398. if (0 != nAngle)
  1399. {
  1400. m_AcqUnit->RotateImage(m_pImgBuffer, nImgY, nImgX, nAngle);
  1401. }
  1402. if (90 == nAngle || 270 == nAngle)
  1403. {
  1404. objTemp.add(SM_IMAGE_WIDTH, nImgY);
  1405. objTemp.add(SM_IMAGE_HEIGHT, nImgX);
  1406. objTemp.add(SM_IMAGE_ROTATION, "Yes");
  1407. }
  1408. else
  1409. {
  1410. objTemp.add(SM_IMAGE_WIDTH, nImgX);
  1411. objTemp.add(SM_IMAGE_HEIGHT, nImgY);
  1412. objTemp.add(SM_IMAGE_ROTATION, "No");
  1413. }
  1414. objImageHead.add(SM_IMAGE_HEAD, objTemp);
  1415. Info("Preview image head: {$}", objImageHead.encode());
  1416. RET_STATUS ret = RET_STATUS::RET_FAILED;
  1417. ret = m_AcqUnit->AddFrameWithRawHead(IMAGE_AEC_PREVIEW, objImageHead.encode(), m_pImgBuffer, nImgX * nImgY);
  1418. Info("Add preview image over, {$}", (int)ret);
  1419. }
  1420. break;
  1421. default:
  1422. Warn("Not support this data({$})", nEventID);
  1423. break;
  1424. }
  1425. }
  1426. void nsFPD::FPDDevicePZMedical::OnEventProcessError(int nDetectorID, int nEventID, int nEventLevel,
  1427. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1428. {
  1429. switch (nEventID)
  1430. {
  1431. case EVT_ERR_COMMUNICATE:
  1432. {
  1433. string strTemp = pszMsg;
  1434. if (strTemp.find("true") != std::string::npos)
  1435. {
  1436. //AddErrMsg("0", "communication error");
  1437. SendTemperatureValue(0);
  1438. SendWifiValue(0);
  1439. SendBatteryValue(0);
  1440. m_bConnect = false;
  1441. }
  1442. else if (strTemp.find("false") != std::string::npos)
  1443. {
  1444. //DelErrMsg("0");
  1445. }
  1446. }
  1447. break;
  1448. case EVT_ERR_INIT_FAILED:
  1449. {
  1450. string strTemp = pszMsg;
  1451. if (strTemp.find("true") != std::string::npos)
  1452. {
  1453. //AddErrMsg("6", "initialize error");
  1454. }
  1455. else if (strTemp.find("false") != std::string::npos)
  1456. {
  1457. //一般不可恢复
  1458. }
  1459. }
  1460. break;
  1461. default:
  1462. Warn("Not support this error({$})", nEventID);
  1463. break;
  1464. }
  1465. }
  1466. void nsFPD::FPDDevicePZMedical::OnEventProcessWarning(int nDetectorID, int nEventID, int nEventLevel,
  1467. const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1468. {
  1469. Warn("Not support this warn({$})", nEventID);
  1470. }