DIOS.Dev.FPD.Yuying.cpp 94 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042
  1. // CCOS.Dev.FPD.Yuying.cpp : 定义 DLL 的导出函数。
  2. #include "stdafx.h"
  3. #include <stdio.h>
  4. #include <OleAuto.h>
  5. #include <sys/stat.h>
  6. #include "FileVersion.hpp"
  7. #include "common_api.h"
  8. #include "GridSuppression.h"
  9. #include "TemperatureCheck.h"
  10. #include "DICOMImageHeadKey.h"
  11. #include "CCOS.Dev.FPD.Yuying.h"
  12. #include "YuyingCtrl.h"
  13. #pragma comment(lib, "Version.lib")
  14. namespace nsFPD = CCOS::Dev::Detail::Detector;
  15. Log4CPP::Logger* gLogger = nullptr;
  16. static nsFPD::YuyingDriver gIODriver;
  17. //-----------------------------------------------------------------------------
  18. // GetIODriver & CreateIODriver
  19. //-----------------------------------------------------------------------------
  20. extern "C" CCOS::Dev::IODriver * __cdecl GetIODriver() // 返回静态对象的引用, 调用者不能删除 !
  21. {
  22. return &gIODriver;
  23. }
  24. extern "C" CCOS::Dev::IODriver * __cdecl CreateIODriver() // 返回新对象, 调用者必须自行删除此对象 !
  25. {
  26. return new nsFPD::YuyingDriver();
  27. }
  28. //-----------------------------------------------------------------------------
  29. // YuyingDriver
  30. //-----------------------------------------------------------------------------
  31. nsFPD::YuyingDriver::YuyingDriver()
  32. {
  33. dev = nullptr;
  34. m_bConnect = false;
  35. m_pAttribute.reset(new ResDataObject());
  36. m_pDescription.reset(new ResDataObject());
  37. }
  38. nsFPD::YuyingDriver::~YuyingDriver()
  39. {
  40. }
  41. extern const char* g_szMouldPath;
  42. void nsFPD::YuyingDriver::Prepare()
  43. {
  44. string strLogPath = GetProcessDirectory() + DetectorLogPath;
  45. Log4CPP::GlobalContext::Map::Set(ZSKK::Utility::Hash("LogFileName"), "FPD.YuyingDR");
  46. auto rc = Log4CPP::LogManager::LoadConfigFile(strLogPath.c_str());
  47. gLogger = Log4CPP::LogManager::GetLogger("FPD.YuyingDR");
  48. #ifdef WIN64
  49. Force("------------------------ Version: {$} (64-bit) ------------------------", FileVersion(g_szMouldPath).GetVersionString());
  50. #else
  51. Force("------------------------ Version: {$} (32-bit)------------------------", FileVersion(g_szMouldPath).GetVersionString());
  52. #endif
  53. FINFO("new FPDDeviceYuying over");
  54. }
  55. bool nsFPD::YuyingDriver::Connect()
  56. {
  57. FINFO("--Func-- driver connect");
  58. dev = new FPDDeviceYuying(EventCenter, m_ConfigFileName);
  59. m_bConnect = true;
  60. return true;
  61. }
  62. void nsFPD::YuyingDriver::Disconnect()
  63. {
  64. FINFO("--Func-- driver disconnect");
  65. m_bConnect = false;
  66. }
  67. bool nsFPD::YuyingDriver::isConnected() const
  68. {
  69. return m_bConnect;
  70. }
  71. auto nsFPD::YuyingDriver::CreateDevice(int index) -> std::unique_ptr <IODevice>
  72. {
  73. FINFO("--Func-- dirver createdevice");
  74. auto Driver = std::unique_ptr <IODevice>(new IODevice(dev));
  75. dev->CreateDevice();
  76. dev->Register();
  77. return Driver;
  78. }
  79. std::string nsFPD::YuyingDriver::DriverProbe()
  80. {
  81. FINFO("YuyingDriver::DriverProbe config name:{$}", m_ConfigFileName);
  82. ResDataObject r_config, HardwareInfo;
  83. if (r_config.loadFile(m_ConfigFileName.c_str()))
  84. {
  85. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  86. HardwareInfo.add("MinorID", r_config["CONFIGURATION"]["MinorID"]);
  87. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  88. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  89. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  90. }
  91. else
  92. {
  93. HardwareInfo.add("MajorID", "Generator");
  94. HardwareInfo.add("MinorID", "Dr");
  95. HardwareInfo.add("VendorID", "Yuying");
  96. HardwareInfo.add("ProductID", "4343WA-AG");
  97. HardwareInfo.add("SerialID", "Driver");
  98. }
  99. string ret = HardwareInfo.encode();
  100. return ret;
  101. }
  102. bool nsFPD::YuyingDriver::GetDeviceConfig(std::string& Cfg)
  103. {
  104. Cfg = m_DeviceConfig.encode();
  105. FINFO("GetDeviceConfig Cfg:{$}", Cfg);
  106. return true;
  107. }
  108. bool nsFPD::YuyingDriver::SetDeviceConfig(std::string Cfg)
  109. {
  110. FINFO("--Func-- SetDeviceConfig {$}\n", Cfg.c_str());
  111. ResDataObject DeviceConfig;
  112. DeviceConfig.decode(Cfg.c_str());
  113. ResDataObject DescriptionTempEx;
  114. DescriptionTempEx = DeviceConfig["DeviceConfig"];
  115. bool bSaveFile = false; //true:重新保存配置文件
  116. string strAccess = "";
  117. for (int i = 0; i < DescriptionTempEx.size(); i++)
  118. {
  119. ResDataObject temp = DescriptionTempEx[i];
  120. FINFO("{$}", temp.encode());
  121. for (int j = 0; j < temp.size(); j++)
  122. {
  123. string strKey = temp.GetKey(j);
  124. FINFO("{$}", strKey.c_str());
  125. try
  126. {
  127. if (m_pAttribute->GetFirstOf(strKey.c_str()) >= 0)
  128. {
  129. strAccess = (string)(*m_pDescription)[strKey.c_str()]["Access"];
  130. if ("RW" == strAccess || "rw" == strAccess)
  131. {
  132. //修改对应配置,在其他单元的配置项要同时调用其修改函数修改真实值
  133. //1. 修改内存中的值,用于给上层发消息
  134. (*m_pAttribute)[strKey.c_str()] = temp[j];
  135. //2. 拿到Innerkey
  136. int nConfigInfoCount = (int)m_Configurations["ConfigToolInfo"].GetKeyCount("AttributeInfo");
  137. FINFO("ConfigInfo Count: {$}", nConfigInfoCount);
  138. string strTemp = ""; //存储AttributeKey
  139. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  140. {
  141. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  142. if (strTemp == strKey)
  143. {
  144. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["InnerKey"];
  145. break;
  146. }
  147. }
  148. //3. 修改配置文件中的值
  149. if (SetDeviceConfigValue(m_Configurations, strTemp.c_str(), 1, temp[j]))
  150. {
  151. bSaveFile = true;
  152. }
  153. }
  154. else
  155. {
  156. FINFO("{$} is not a RW configuration item", strKey.c_str());
  157. }
  158. }
  159. }
  160. catch (ResDataObjectExption& e)
  161. {
  162. FERROR("SetDriverConfig crashed: {$}", e.what());
  163. return false;
  164. }
  165. }
  166. }
  167. if (bSaveFile)
  168. {
  169. //3. 重新保存配置文件
  170. SaveConfigFile(true);
  171. }
  172. return true;
  173. }
  174. bool nsFPD::YuyingDriver::SaveConfigFile(bool bSendNotify)
  175. {
  176. FINFO("SaveConfigFile m_ConfigFileName:{$}", m_ConfigFileName);
  177. m_ConfigAll["CONFIGURATION"] = m_Configurations;
  178. bool ret = m_ConfigAll.SaveFile(m_ConfigFileName.c_str());
  179. if (ret)
  180. {
  181. FINFO("SaveConfigFile Success!");
  182. return true;
  183. }
  184. else
  185. {
  186. FERROR("SaveConfigFile Fail!");
  187. return false;
  188. }
  189. }
  190. bool nsFPD::YuyingDriver::GetDeviceConfigValue(ResDataObject config, const char* pInnerKey, int nPathID, string& strValue)
  191. {
  192. strValue = "";
  193. string strTemp = pInnerKey;
  194. if (1 == nPathID) //从DriverConfig路径下每个DPC自己的配置文件读取
  195. {
  196. if (WiredIP == strTemp || WirelessIP == strTemp || LocalIP == strTemp)
  197. {
  198. strValue = (string)config["connections"][pInnerKey];
  199. }
  200. else if (DetectorVender == strTemp || DetectorModel == strTemp ||
  201. DetectorDescription == strTemp || DetectorSerialNumber == strTemp)
  202. {
  203. strValue = (string)config[pInnerKey];
  204. }
  205. else if (SyncType == strTemp || FPDWorkStation == strTemp ||
  206. ImageWidth == strTemp || ImageHeight == strTemp)
  207. {
  208. strValue = (string)config["ModeTable"]["DetectorMode"][pInnerKey];
  209. }
  210. else if (TempMaxLimit == strTemp || ReConnect == strTemp ||
  211. TempUpperLimit == strTemp || TempLowerLimit == strTemp || TempMinLimit == strTemp ||
  212. BatLowerLimit == strTemp || BatMiniLimit == strTemp ||
  213. BatLowerLimitInCali == strTemp || WifiLowerLimit == strTemp ||
  214. WifiMiniLimit == strTemp || HighPowerTimeout == strTemp ||
  215. ShowTemperature == strTemp || ShowWifi == strTemp ||
  216. ShowBattery == strTemp || ShowBluetooth == strTemp ||
  217. FPDExamMode == strTemp || FPDAcqMode == strTemp || FPDModeMatch == strTemp ||
  218. CcosDetectorAttachedFlag == strTemp)
  219. {
  220. strValue = (string)config[pInnerKey];
  221. }
  222. else
  223. {
  224. strValue = "";
  225. FERROR("FERROR Configuration item: {$}", pInnerKey);
  226. }
  227. }
  228. return true;
  229. }
  230. /***
  231. ***说明: 设置配置文件内容
  232. ***/
  233. bool nsFPD::YuyingDriver::SetDeviceConfigValue(ResDataObject& config, const char* pInnerKey, int nPathID, const char* szValue)
  234. {
  235. FINFO("SetDeviceConfigValue change {$} item value to {$}", pInnerKey, szValue);
  236. string strTemp = pInnerKey;
  237. if (1 == nPathID) //从DriverConfig路径下每个DPC自己的配置文件读取
  238. {
  239. if (WiredIP == strTemp || WirelessIP == strTemp || LocalIP == strTemp)
  240. {
  241. config["connections"][pInnerKey] = szValue;
  242. }
  243. else if (DetectorVender == strTemp || DetectorModel == strTemp ||
  244. DetectorDescription == strTemp || DetectorSerialNumber == strTemp)
  245. {
  246. config[pInnerKey] = szValue;
  247. }
  248. else if (SyncType == strTemp || FPDWorkStation == strTemp ||
  249. ImageWidth == strTemp || ImageHeight == strTemp)
  250. {
  251. config["ModeTable"]["DetectorMode"][pInnerKey] = szValue;
  252. }
  253. else if (TempMaxLimit == strTemp || ReConnect == strTemp ||
  254. TempUpperLimit == strTemp || TempLowerLimit == strTemp ||
  255. BatLowerLimit == strTemp || BatMiniLimit == strTemp ||
  256. BatLowerLimitInCali == strTemp || WifiLowerLimit == strTemp ||
  257. WifiMiniLimit == strTemp || HighPowerTimeout == strTemp ||
  258. ShowTemperature == strTemp || ShowWifi == strTemp ||
  259. ShowBattery == strTemp || ShowBluetooth == strTemp ||
  260. FPDExamMode == strTemp || FPDAcqMode == strTemp || FPDModeMatch == strTemp ||
  261. CcosDetectorAttachedFlag == strTemp)
  262. {
  263. config[pInnerKey] = szValue;
  264. }
  265. else
  266. {
  267. FERROR("FERROR Configuration item: {$}", pInnerKey);
  268. return false;
  269. }
  270. }
  271. return true;
  272. }
  273. std::string nsFPD::YuyingDriver::GetResource()
  274. {
  275. FINFO("YuyingDriver GetResource");
  276. ResDataObject r_config, temp;
  277. FINFO("m_ConfigFileName:{$}", m_ConfigFileName);
  278. if (!temp.loadFile(m_ConfigFileName.c_str()))
  279. {
  280. return "";
  281. }
  282. m_ConfigAll = temp;
  283. r_config = temp["CONFIGURATION"];
  284. m_Configurations = r_config;
  285. ResDataObject DescriptionTemp;
  286. ResDataObject ListTemp;
  287. string strTemp = ""; //用于读取字符串配置信息
  288. string strIndex = ""; //用于读取配置信息中的List项
  289. int nTemp = -1; //用于读取整型配置信息
  290. char sstream[10] = { 0 }; //用于转换值
  291. string strValue = ""; //用于存储配置的值
  292. string strType = ""; //用于存储配置的类型 int/float/string...
  293. string strAccess = ""; //用于存储权限的类型 R/W/RW
  294. string strRequired = ""; // TRUE/FALSE
  295. string strDefaultValue = "";
  296. string strRangeMin = "";
  297. string strRangeMax = "";
  298. try
  299. {
  300. int nConfigInfoCount = (int)m_Configurations["ConfigToolInfo"].GetKeyCount("AttributeInfo");
  301. m_pAttribute->clear();
  302. m_pDescription->clear();
  303. for (int nInfoIndex = 0; nInfoIndex < nConfigInfoCount; nInfoIndex++)
  304. {
  305. DescriptionTemp.clear();
  306. ListTemp.clear();
  307. //AttributeType
  308. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Type"];
  309. DescriptionTemp.add(AttributeType, strTemp.c_str());
  310. strType = strTemp; //记录配置项的类型
  311. //AttributeKey
  312. //1. 根据AttributeType,内部key和配置路径,拿到当前的真实值
  313. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["InnerKey"];
  314. nTemp = (int)m_Configurations["ConfigToolInfo"][nInfoIndex]["PathID"];
  315. GetDeviceConfigValue(r_config, strTemp.c_str(), nTemp, strValue);
  316. //2. 赋值
  317. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  318. if ("int" == strType)
  319. {
  320. (*m_pAttribute).add(strTemp.c_str(), atoi(strValue.c_str()));
  321. }
  322. else if ("float" == strType)
  323. {
  324. (*m_pAttribute).add(strTemp.c_str(), atof(strValue.c_str()));
  325. }
  326. else //其它先按string类型处理
  327. {
  328. (*m_pAttribute).add(strTemp.c_str(), strValue.c_str());
  329. }
  330. //AttributeAccess
  331. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Access"];
  332. DescriptionTemp.add(AttributeAccess, strTemp.c_str());
  333. //AttributeRangeMin
  334. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["RangeMin"];
  335. if (strTemp != "") //不需要的配置项为空
  336. {
  337. DescriptionTemp.add(AttributeRangeMin, strTemp.c_str());
  338. }
  339. //AttributeRangeMax
  340. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["RangeMax"];
  341. if (strTemp != "") //不需要的配置项为空
  342. {
  343. DescriptionTemp.add(AttributeRangeMax, strTemp.c_str());
  344. }
  345. //AttributeList
  346. nTemp = m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["ListNum"];
  347. if (nTemp > 0) //ListNum不大于0时说明不需要list配置
  348. {
  349. for (int nListIndex = 0; nListIndex < nTemp; nListIndex++)
  350. {
  351. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["ListInfo"][nListIndex];
  352. auto temKey = std::to_string(nListIndex);
  353. ListTemp.add(temKey.c_str(), strTemp.c_str());
  354. }
  355. DescriptionTemp.add(AttributeList, ListTemp);
  356. }
  357. //AttributeRequired
  358. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["Required"];
  359. DescriptionTemp.add(AttributeRequired, strTemp.c_str());
  360. //AttributeDefaultValue
  361. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeDescripition"]["DefaultValue"];
  362. if (strTemp != "") //不需要的配置项为空
  363. {
  364. DescriptionTemp.add(AttributeDefaultValue, strTemp.c_str());
  365. }
  366. strTemp = (string)m_Configurations["ConfigToolInfo"][nInfoIndex]["AttributeKey"];
  367. (*m_pDescription).add(strTemp.c_str(), DescriptionTemp);
  368. }
  369. }
  370. catch (ResDataObjectExption& e)
  371. {
  372. FERROR("Get config FERROR: {$}", e.what());
  373. return "";
  374. }
  375. ResDataObject resDeviceResource;
  376. resDeviceResource.add(ConfKey::CcosDetectorAttribute, (*m_pAttribute));
  377. resDeviceResource.add(ConfKey::CcosDetectorDescription, (*m_pDescription));
  378. ResDataObject DescriptionTempEx;
  379. DescriptionTempEx.add(ConfKey::CcosDetectorConfig, resDeviceResource);
  380. m_DeviceConfig = DescriptionTempEx;
  381. string res = DescriptionTempEx.encode();
  382. FINFO("YuyingDriver module: get resource over");
  383. return res;
  384. }
  385. std::string nsFPD::YuyingDriver::DeviceProbe()
  386. {
  387. ResDataObject r_config, HardwareInfo;
  388. if (r_config.loadFile(m_ConfigFileName.c_str()))
  389. {
  390. HardwareInfo.add("MajorID", r_config["CONFIGURATION"]["MajorID"]);
  391. HardwareInfo.add("MinorID", "Device");
  392. HardwareInfo.add("VendorID", r_config["CONFIGURATION"]["VendorID"]);
  393. HardwareInfo.add("ProductID", r_config["CONFIGURATION"]["ProductID"]);
  394. HardwareInfo.add("SerialID", r_config["CONFIGURATION"]["SerialID"]);
  395. }
  396. else
  397. {
  398. HardwareInfo.add("MajorID", "Detector");
  399. HardwareInfo.add("MinorID", "Device");
  400. HardwareInfo.add("VendorID", "Yuying");
  401. HardwareInfo.add("ProductID", "4343WA-AG");
  402. HardwareInfo.add("SerialID", "1234");
  403. }
  404. string ret = HardwareInfo.encode();
  405. return ret;
  406. }
  407. extern YuyingCtrl* g_pYuyingCtrl;
  408. const float ABS_ZERO_TEMPERATURE = -273.15f; //绝对零度
  409. nsFPD::FPDDeviceYuying::FPDDeviceYuying(std::shared_ptr <IOEventCenter> center, string ConfigPath)
  410. :m_nDeviceIndex{},
  411. m_nGridLicense{},
  412. m_strModuleIP{},
  413. m_strModuleSN{},
  414. m_strShockSensor{},
  415. m_strBatterySN{},
  416. m_strMotionStatus{},
  417. m_strSelfTest{},
  418. m_strLastError{},
  419. m_strCalibTime{},
  420. m_nBatteryCapacity{},
  421. m_nBatteryCharges{},
  422. m_nShockCounts{},
  423. m_nWorkStation{},
  424. m_fDoseParam{},
  425. m_nRawImgWidth{},
  426. m_nRawImgHeight{},
  427. m_nFullImgWidth{},
  428. m_nFullImgHeight{},
  429. m_nTopOffset{},
  430. m_nLeftOffset{},
  431. m_nImageBits{},
  432. m_fFactorEXI2UGY{},
  433. m_fBatteryTemperature{},
  434. m_nXrayCalibNum{},
  435. m_pwFullImageData{},
  436. m_pwRawImageData{},
  437. m_pwPreviewImg{},
  438. m_pPreviewImageHead{},
  439. m_pFullImageHead{},
  440. m_ExitEvt{},
  441. m_hNotifyThread{},
  442. m_CalTemperlowWarn{},
  443. m_CalTemperupWarn{},
  444. m_eAppStatus(APP_STATUS_WORK_END),
  445. m_nCalibrationType(CCOS_CALIBRATION_TYPE_MAX),
  446. m_bOpened(false),
  447. m_bBatteryCharging(false),
  448. m_bRecoveringImage(false),
  449. m_bAbortRecover(false),
  450. m_bUIReady(false),
  451. m_bImagePendingOrNot(false),
  452. m_bResetDetector(false),
  453. m_bPreviewEnable(false),
  454. m_bTestSensitivity(false),
  455. m_bDisConnected(false),
  456. m_bAttached(false),
  457. m_bRecoverImageStatusInit(false),
  458. m_bSaveRaw(false),
  459. m_bOffsetCalibRunning(false),
  460. m_bUIConfirmRecover(false),
  461. m_CalTemperWarnInitialed(false)
  462. {
  463. super::EventCenter = center;
  464. m_strWorkPath = GetProcessDirectory();
  465. m_AcqUnit.reset(new OemAcq(center, this));
  466. m_SyncUnit.reset(new OemSync(center, this));
  467. m_CalibUnit.reset(new OemCalib(center, this));
  468. m_DetectorCtrlUnit.reset(new OemDetectorCtrl(center, this));
  469. m_Battery.reset(new DeviceBatteryMould("DetectorYuyingBattery", 0, 10, 20, 30, 40, 100, 100, 0, center));
  470. m_Temperature.reset(new DeviceTemperatureMould("DetectorYuyingTemperature", ABS_ZERO_TEMPERATURE, 0.0f, 10.0f, 60.0f, 20.0f, 40.0f, 70.0f, 0.0f, center));
  471. m_Wifi.reset(new DeviceWifiMould("DetectorYuyingWifi", 0, 20, 30, 40, 50, 100, 100, 0, center));
  472. m_DetectorConfiguration.reset(new DetectorConfiguration(ConfigPath));
  473. m_WarnAndError.reset(new FPDErrorWarning(center, DetectorUnitType, m_strWorkPath));
  474. m_CalibProcess.reset(new CalibrationProcess());
  475. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_INIT));
  476. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_ERROR));
  477. m_WaitCalibDoseEvt = CreateEvent(0, 1, 0, 0);
  478. m_OffsetCalibrationEvt = CreateEvent(0, 0, 0, 0);
  479. m_PauseCalibrationEvt = CreateEvent(0, 1, 0, 0);
  480. m_CompleteCalibrationEvt = CreateEvent(0, 1, 0, 0);
  481. m_CrateCalibReportEvt = CreateEvent(0, 0, 0, 0);
  482. m_UploadCalibMapOver = CreateEvent(0, 1, 0, 0);
  483. m_ExitEvt = CreateEvent(0, 1, 0, 0);
  484. m_CalibGapEvt = CreateEvent(0, 1, 0, 0);
  485. m_WriteCumstomFileEvt = CreateEvent(0, 1, 0, 0);
  486. }
  487. nsFPD::FPDDeviceYuying::~FPDDeviceYuying()
  488. {
  489. SetEvent(m_ExitEvt);
  490. CloseHandle(m_WaitCalibDoseEvt);
  491. CloseHandle(m_OffsetCalibrationEvt);
  492. CloseHandle(m_PauseCalibrationEvt);
  493. CloseHandle(m_CompleteCalibrationEvt);
  494. CloseHandle(m_CrateCalibReportEvt);
  495. CloseHandle(m_WriteCumstomFileEvt);
  496. CloseHandle(m_UploadCalibMapOver);
  497. CloseHandle(m_CalibGapEvt);
  498. if (m_hNotifyThread != nullptr)
  499. {
  500. CloseHandle(m_hNotifyThread);
  501. }
  502. }
  503. std::string nsFPD::FPDDeviceYuying::GetGUID() const
  504. {
  505. return DetectorUnitType;
  506. }
  507. bool nsFPD::FPDDeviceYuying::Prepare()
  508. {
  509. EventCenter->OnMaxBlockSize("DrYuying", m_nRawImgWidth * m_nRawImgHeight * 2, 3, 1500 * 1500 * 2, 1);
  510. Connect();
  511. return true;
  512. }
  513. void nsFPD::FPDDeviceYuying::RegisterCtrl(nDetail::Dispatch* Dispatch)
  514. {
  515. Dispatch->Action.Push(ActionKey::EnterExam, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSEnterExam);
  516. Dispatch->Action.Push(ActionKey::ExitExam, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSExitExam);
  517. Dispatch->Action.Push(ActionKey::SetExposureTimes, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSSetExposureTimes);
  518. Dispatch->Action.Push(ActionKey::SetXrayOnNum, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSSetXrayOnNum);
  519. Dispatch->Action.Push(ActionKey::CcosActiveDetector, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSActiveDetector);
  520. Dispatch->Get.Push(AttrKey::DetectorStatus, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetFPDStatus);
  521. Dispatch->Get.Push(AttrKey::DetectorType, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorType);
  522. Dispatch->Get.Push(AttrKey::Description, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDescription);
  523. Dispatch->Get.Push(AttrKey::DetectorID, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetDetectorID);
  524. Dispatch->Get.Push(AttrKey::FPDSensitivity, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetFPDSensitivity);
  525. Dispatch->Get.Push(AttrKey::PixelData, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetPixelData);
  526. Dispatch->Get.Push(AttrKey::TargetEXI, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetTargetEXI);
  527. Dispatch->Get.Push(SupportDDR, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetSupportDDR);
  528. Dispatch->Get.Push(CcosDetectorAttachedFlag, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::JSGetAttachStatus);
  529. Dispatch->Set.Push(AttrKey::DetectorStatus, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorStatus);
  530. Dispatch->Set.Push(AttrKey::DetectorType, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorType);
  531. Dispatch->Set.Push(AttrKey::Description, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDescription);
  532. Dispatch->Set.Push(AttrKey::DetectorID, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetDetectorID);
  533. Dispatch->Set.Push(AttrKey::PixelData, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetPixelData);
  534. Dispatch->Set.Push(AttrKey::TargetEXI, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetTargetEXI);
  535. Dispatch->Set.Push(CcosDetectorAttachedFlag, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetAttachStatus);
  536. Dispatch->Set.Push(SupportDDR, m_DetectorCtrlUnit.get(), &DetectorCtrlUnit::SetSupportDDR);
  537. }
  538. void nsFPD::FPDDeviceYuying::RegisterAcq(nDetail::Dispatch* Dispatch)
  539. {
  540. Dispatch->Action.Push(ActionKey::SetAcqMode, m_AcqUnit.get(), &AcqUnit::JSSetAcqMode);
  541. Dispatch->Get.Push(AttrKey::AcqMode, m_AcqUnit.get(), &AcqUnit::JSGetAcqMode);
  542. Dispatch->Get.Push(AttrKey::ZskkFPDState, m_AcqUnit.get(), &AcqUnit::JSGetZskkFPDState);
  543. Dispatch->Get.Push(AttrKey::NoNeedWaitImage, m_AcqUnit.get(), &AcqUnit::JSGetNoNeedWaitImage);
  544. Dispatch->Get.Push(AttrKey::ImgDataInfo, m_AcqUnit.get(), &AcqUnit::JSGetLastImage);
  545. Dispatch->Set.Push(AttrKey::ZskkFPDState, m_AcqUnit.get(), &AcqUnit::SetZskkFPDState);
  546. Dispatch->Set.Push(AttrKey::NoNeedWaitImage, m_AcqUnit.get(), &AcqUnit::JSSetNoNeedWaitImage);
  547. }
  548. void nsFPD::FPDDeviceYuying::RegisterSync(nDetail::Dispatch* Dispatch)
  549. {
  550. Dispatch->Action.Push(ActionKey::SetSyncMode, m_SyncUnit.get(), &SyncUnit::JSSetSyncMode);
  551. Dispatch->Action.Push(ActionKey::SetXwindowSize, m_SyncUnit.get(), &SyncUnit::JSSetXwindowSize);
  552. Dispatch->Action.Push(ActionKey::PrepareAcquisition, m_SyncUnit.get(), &SyncUnit::JSPrepareAcquisition);
  553. Dispatch->Action.Push(ActionKey::StartAcquisition, m_SyncUnit.get(), &SyncUnit::JSStartAcquisition);
  554. Dispatch->Action.Push(ActionKey::StopAcquisition, m_SyncUnit.get(), &SyncUnit::JSStopAcquisition);
  555. Dispatch->Action.Push(ActionKey::ActiveSyncMode, m_SyncUnit.get(), &SyncUnit::JSActiveSyncMode);
  556. Dispatch->Get.Push(AttrKey::FPDReadyStatus, m_SyncUnit.get(), &SyncUnit::JSGetFPDReady);
  557. Dispatch->Get.Push(AttrKey::XwindowStatus, m_SyncUnit.get(), &SyncUnit::JSGetXWindowStatus);
  558. Dispatch->Get.Push(AttrKey::ImageReadingStatus, m_SyncUnit.get(), &SyncUnit::JSGetImageReadingStatus);
  559. Dispatch->Get.Push(AttrKey::FPDExpReady, m_SyncUnit.get(), &SyncUnit::JSGetExpReadyStatus);
  560. Dispatch->Get.Push(AttrKey::SyncMode, m_SyncUnit.get(), &SyncUnit::JSGetSyncMode);
  561. Dispatch->Get.Push(AttrKey::SupportSyncMode, m_SyncUnit.get(), &SyncUnit::JSGetSupportSyncMode);
  562. Dispatch->Set.Push(AttrKey::FPDReadyStatus, m_SyncUnit.get(), &SyncUnit::JSSetFPDReady);
  563. Dispatch->Set.Push(AttrKey::XwindowStatus, m_SyncUnit.get(), &SyncUnit::JSSetXWindowStatus);
  564. Dispatch->Set.Push(AttrKey::ImageReadingStatus, m_SyncUnit.get(), &SyncUnit::JSSetImageReadingStatus);
  565. Dispatch->Set.Push(AttrKey::SupportSyncMode, m_SyncUnit.get(), &SyncUnit::SetSupportSyncMode);
  566. }
  567. void nsFPD::FPDDeviceYuying::RegisterCalib(nDetail::Dispatch* Dispatch)
  568. {
  569. Dispatch->Action.Push(ActionKey::ActiveCalibration, m_CalibUnit.get(), &CalibUnit::JSActiveCalibration);
  570. Dispatch->Action.Push(ActionKey::GetRequestedDose, m_CalibUnit.get(), &CalibUnit::JSGetRequestedDose);
  571. Dispatch->Action.Push(ActionKey::SetRequestedDose, m_CalibUnit.get(), &CalibUnit::JSSetRequestedDose);
  572. Dispatch->Action.Push(ActionKey::PrepareCalibration, m_CalibUnit.get(), &CalibUnit::JSPrepareCalibration);
  573. Dispatch->Action.Push(ActionKey::StartCalibration, m_CalibUnit.get(), &CalibUnit::JSStartCalibration);
  574. Dispatch->Action.Push(ActionKey::StopCalibration, m_CalibUnit.get(), &CalibUnit::JSStopCalibration);
  575. Dispatch->Action.Push(ActionKey::SetCorrectionType, m_CalibUnit.get(), &CalibUnit::JSSetCorrectionType);
  576. Dispatch->Action.Push(ActionKey::AcceptCalibration, m_CalibUnit.get(), &CalibUnit::JSAcceptCalibration);
  577. Dispatch->Action.Push(ActionKey::RejectCalibration, m_CalibUnit.get(), &CalibUnit::JSRejectCalibration);
  578. Dispatch->Action.Push(ActionKey::SaveCalibrationFile, m_CalibUnit.get(), &CalibUnit::JSSaveCalibrationFile);
  579. Dispatch->Action.Push(ActionKey::GetCalibrationStep, m_CalibUnit.get(), &CalibUnit::JSGetCalibrationStep);
  580. Dispatch->Get.Push(AttrKey::CalibrationStatus, m_CalibUnit.get(), &CalibUnit::JSGetCalibStatus);
  581. Dispatch->Get.Push(AttrKey::CalibrationProgress, m_CalibUnit.get(), &CalibUnit::JSGetCalibProgress);
  582. Dispatch->Get.Push(AttrKey::UploadCalibrationFilesResult, m_CalibUnit.get(), &CalibUnit::JSGetUploadCalibrationFilesResult);
  583. Dispatch->Get.Push(AttrKey::SupportCalibrationType, m_CalibUnit.get(), &CalibUnit::JSGetSupportCalibrationType);
  584. Dispatch->Get.Push(AttrKey::HaveImgCalibration, m_CalibUnit.get(), &CalibUnit::JSGetHaveImgCalibration);
  585. Dispatch->Get.Push(AttrKey::SaveCalibrationFileFinish, m_CalibUnit.get(), &CalibUnit::JSGetSaveCalibrationFileFinish);
  586. Dispatch->Get.Push(AttrKey::CalibMode, m_CalibUnit.get(), &CalibUnit::JSGetCalibMode);
  587. Dispatch->Set.Push(AttrKey::CalibrationStatus, m_CalibUnit.get(), &CalibUnit::SetCalibrationStatus);
  588. Dispatch->Set.Push(AttrKey::CalibrationProgress, m_CalibUnit.get(), &CalibUnit::SetCalibrationProgress);
  589. Dispatch->Set.Push(AttrKey::UploadCalibrationFilesResult, m_CalibUnit.get(), &CalibUnit::SetUploadCalibrationFilesResult);
  590. Dispatch->Update.Push(AttrKey::CalibMode, m_CalibUnit.get(), &CalibUnit::JSUpdateCalibMode);
  591. }
  592. void nsFPD::FPDDeviceYuying::RegisterOthers(nDetail::Dispatch* Dispatch)
  593. {
  594. Dispatch->Get.Push(AttrKey::Temperature_Value, m_Temperature.get(), &DeviceTemperatureMould::JSGetCurrentTemperatureValue);
  595. Dispatch->Get.Push(AttrKey::Remain_Power_Value, m_Battery.get(), &DeviceBatteryMould::JSGetCurrentBatteryValue);
  596. Dispatch->Get.Push(AttrKey::Wifi_Strength_Value, m_Wifi.get(), &DeviceWifiMould::JSGetCurrentSignalValue);
  597. Dispatch->Get.Push(TempUpperLimit, m_Temperature.get(), &DeviceTemperatureMould::JSGetTemperatureWarningMax);
  598. Dispatch->Get.Push(TempLowerLimit, m_Temperature.get(), &DeviceTemperatureMould::JSGetTemperatureWarningMin);
  599. Dispatch->Get.Push(TemperatureCalibUpWarn, m_Temperature.get(), &DeviceTemperatureMould::JSGetTemperatureCalibWarningMax);
  600. Dispatch->Get.Push(TemperatureCalibLowWarn, m_Temperature.get(), &DeviceTemperatureMould::JSGetTemperatureCalibWarningMin);
  601. Dispatch->Get.Push(TempMaxLimit, m_Temperature.get(), &DeviceTemperatureMould::JSGetTemperatureErrorMax);
  602. Dispatch->Get.Push(TempMinLimit, m_Temperature.get(), &DeviceTemperatureMould::JSGetTemperatureErrorMin);
  603. Dispatch->Get.Push(BatLowerLimit, m_Battery.get(), &DeviceBatteryMould::JSGetBatteryWarningMin);
  604. Dispatch->Get.Push(BatMiniLimit, m_Battery.get(), &DeviceBatteryMould::JSGetBatteryErrorMin);
  605. Dispatch->Get.Push(WifiLowerLimit, m_Wifi.get(), &DeviceWifiMould::JSGetSignalWarningMin);
  606. Dispatch->Get.Push(WifiMiniLimit, m_Wifi.get(), &DeviceWifiMould::JSGetSignalErrorMin);
  607. Dispatch->Get.Push(BatLowerLimit, m_Battery.get(), &DeviceBatteryMould::JSGetBatteryWarningMin);
  608. Dispatch->Get.Push(BatMiniLimit, m_Battery.get(), &DeviceBatteryMould::JSGetBatteryErrorMin);
  609. Dispatch->Get.Push(WifiLowerLimit, m_Wifi.get(), &DeviceWifiMould::JSGetSignalWarningMin);
  610. Dispatch->Get.Push(WifiMiniLimit, m_Wifi.get(), &DeviceWifiMould::JSGetSignalErrorMin);
  611. Dispatch->Set.Push(TempUpperLimit, m_Temperature.get(), &DeviceTemperatureMould::SetTemperatureWarningMax);
  612. Dispatch->Set.Push(TempLowerLimit, m_Temperature.get(), &DeviceTemperatureMould::SetTemperatureWarningMin);
  613. Dispatch->Set.Push(TempMaxLimit, m_Temperature.get(), &DeviceTemperatureMould::SetTemperatureErrorMax);
  614. Dispatch->Set.Push(TempMinLimit, m_Temperature.get(), &DeviceTemperatureMould::SetTemperatureErrorMin);
  615. Dispatch->Set.Push(TemperatureCalibUpWarn, m_Temperature.get(), &DeviceTemperatureMould::SetTemperatureCalibWarningMax);
  616. Dispatch->Set.Push(TemperatureCalibLowWarn, m_Temperature.get(), &DeviceTemperatureMould::SetTemperatureCalibWarningMin);
  617. Dispatch->Set.Push(BatLowerLimit, m_Battery.get(), &DeviceBatteryMould::SetBatteryWarningMin);
  618. Dispatch->Set.Push(BatMiniLimit, m_Battery.get(), &DeviceBatteryMould::SetBatteryErrorMin);
  619. Dispatch->Set.Push(WifiLowerLimit, m_Wifi.get(), &DeviceWifiMould::SetSignalWarningMin);
  620. Dispatch->Set.Push(WifiMiniLimit, m_Wifi.get(), &DeviceWifiMould::SetSignalErrorMin);
  621. Dispatch->Update.Push(TempUpperLimit, m_Temperature.get(), &DeviceTemperatureMould::JSUpdateTemperatureWarningMax);
  622. Dispatch->Update.Push(TempLowerLimit, m_Temperature.get(), &DeviceTemperatureMould::JSUpdateTemperatureWarningMin);
  623. Dispatch->Update.Push(TempMaxLimit, m_Temperature.get(), &DeviceTemperatureMould::JSUpdateTemperatureErrorMax);
  624. Dispatch->Update.Push(TempMinLimit, m_Temperature.get(), &DeviceTemperatureMould::JSUpdateTemperatureErrorMin);
  625. Dispatch->Update.Push(TemperatureCalibUpWarn, m_Temperature.get(), &DeviceTemperatureMould::JSUpdateTemperatureCalibWarningMax);
  626. Dispatch->Update.Push(TemperatureCalibLowWarn, m_Temperature.get(), &DeviceTemperatureMould::JSUpdateTemperatureCalibWarningMin);
  627. Dispatch->Update.Push(BatLowerLimit, m_Battery.get(), &DeviceBatteryMould::JSUpdateBatteryWarningMin);
  628. Dispatch->Update.Push(BatMiniLimit, m_Battery.get(), &DeviceBatteryMould::JSUpdateBatteryErrorMin);
  629. Dispatch->Update.Push(WifiLowerLimit, m_Wifi.get(), &DeviceWifiMould::JSUpdateSignalWarningMin);
  630. Dispatch->Update.Push(WifiMiniLimit, m_Wifi.get(), &DeviceWifiMould::JSUpdateSignalErrorMin);
  631. }
  632. void nsFPD::FPDDeviceYuying::Register()
  633. {
  634. auto Disp = &Dispatch;
  635. RegisterCtrl(Disp);
  636. RegisterAcq(Disp);
  637. RegisterSync(Disp);
  638. RegisterCalib(Disp);
  639. RegisterOthers(Disp);
  640. }
  641. bool nsFPD::FPDDeviceYuying::LoadConfig()
  642. {
  643. FINFO("LoadConfig start");
  644. if (!m_DetectorConfiguration->LoadConfigurations(m_stDeviceConfig))
  645. {
  646. FWARN("Load configuration file failed!!! ");
  647. return false;
  648. }
  649. m_SyncUnit->SetSupportSyncMode(m_stDeviceConfig.strSupportSyncMode);
  650. //新增一个配置项代表当前系统中是否只有一个真是的平板探测器,其他设备没有或者是demo的
  651. size_t keyCount = m_DetectorConfiguration->m_Configurations.GetKeyCount(OnlyHaveFpd);
  652. FINFO("LoadConfig OnlyHaveFpd keyCount:{$}", keyCount);
  653. if (keyCount)
  654. {
  655. m_bOnlyHaveFpd = (bool)m_DetectorConfiguration->m_Configurations[OnlyHaveFpd];
  656. if (m_bOnlyHaveFpd)
  657. FINFO("current system only have FPD!");
  658. }
  659. //const char* strkey, int initialvalue, int min, int WarnMin, int WarnMax, int CalibWarnMin, int CalibWarnMax, int max, int accuracy, std::shared_ptr <CCOS::Dev::IOEventCenter> EventCenter
  660. m_Battery.reset(new DeviceBatteryMould("DetectorBattery", 0,
  661. m_stDeviceConfig.nBatteryLimit,
  662. m_stDeviceConfig.nBatteryWarning,
  663. 90, 20, 90, 100, 0, EventCenter));
  664. //const char* strkey, float initialvalue, float min, float WarnMin, float WarnMax, float CalibWarnMin, float CalibWarnMax, float max, float accuracy,std::shared_ptr <CCOS::Dev::IOEventCenter> EventCenter
  665. m_Temperature.reset(new DeviceTemperatureMould("DetectorTemperature", 0.0f,
  666. m_stDeviceConfig.fTemperatureErrorMin,
  667. m_stDeviceConfig.fTemperatureWarnMin,
  668. m_stDeviceConfig.fTemperatureWarnMax,
  669. 20.0f, 100.0f,
  670. m_stDeviceConfig.fTemperatureErrorMax,
  671. 0.0f, EventCenter));
  672. //const char* strkey, int initialvalue, int min, int WarnMin, int WarnMax, int CalibWarnMin, int CalibWarnMax, int max, int accuracy, std::shared_ptr <CCOS::Dev::IOEventCenter> EventCenter
  673. m_Wifi.reset(new DeviceWifiMould("DetectorWifi", 0,
  674. m_stDeviceConfig.nWifiLimit,
  675. m_stDeviceConfig.nWifiWarning,
  676. 100, 10, 100, 100, 0, EventCenter));
  677. if (!m_DetectorConfiguration->LoadCalibrationDose(m_strWorkPath, m_CalibDoseList, m_nCalibTotalExposureNum))
  678. {
  679. FERROR("Load Calibration Dose failed!!!");
  680. return false;
  681. }
  682. FINFO("m_nCalibTotalExposureNum:{$}", m_nCalibTotalExposureNum);
  683. return true;
  684. }
  685. bool nsFPD::FPDDeviceYuying::CreateDevice()
  686. {
  687. if (!LoadConfig())
  688. {
  689. FINFO("Load configuration file failed!!! ");
  690. return false;
  691. }
  692. if (g_pYuyingCtrl == nullptr)
  693. {
  694. g_pYuyingCtrl = new YuyingCtrl();
  695. }
  696. g_pYuyingCtrl->DriverEntry(this, m_DetectorConfiguration->m_Configurations);
  697. FINFO("CreateDevice end");
  698. return true;
  699. }
  700. RET_STATUS nsFPD::FPDDeviceYuying::Connect()
  701. {
  702. FINFO("--Func-- device Connect");
  703. //string strPath = m_strWorkPath + m_strSDKPath + "\\FpdSys.dll";
  704. //m_stDeviceConfig.strSoftware = GetFileVersion(strPath);
  705. //FINFO("Yuying SDK version: {$}", m_stDeviceConfig.strSoftware.c_str());
  706. m_DetectorCtrlUnit->SetAttachStatus("1"); //没有attach功能,直接上发1,使客户端显示探测器状态
  707. RET_STATUS ret = RET_STATUS::RET_FAILED;
  708. if (g_pYuyingCtrl->Connect(this, m_strWorkPath))
  709. {
  710. ret = RET_STATUS::RET_SUCCEED;
  711. if (m_stDeviceConfig.bSupportDDR) //是否支持DDR采集功能
  712. {
  713. m_DetectorCtrlUnit->SetSupportDDR("YES");
  714. }
  715. else
  716. {
  717. m_DetectorCtrlUnit->SetSupportDDR("NO");
  718. }
  719. }
  720. return ret;
  721. }
  722. RET_STATUS nsFPD::FPDDeviceYuying::ActiveDetector(bool bActive)
  723. {
  724. if (bActive)
  725. {
  726. FINFO("ActiveDetector");
  727. bool bRet = (g_pYuyingCtrl)->ActivePanel(this, bActive);
  728. if (!bRet)
  729. {
  730. return RET_STATUS::RET_FAILED;
  731. }
  732. }
  733. else
  734. {
  735. FINFO("UnActiveDetector");
  736. bool bRet = (g_pYuyingCtrl)->ActivePanel(this, bActive);
  737. if (!bRet)
  738. {
  739. return RET_STATUS::RET_FAILED;
  740. }
  741. }
  742. return RET_STATUS::RET_SUCCEED;
  743. }
  744. RET_STATUS nsFPD::FPDDeviceYuying::PrepareAcquisition()
  745. {
  746. FINFO("==============================PrepareAcquisition ");
  747. if (!m_stDeviceConfig.bConnectStatus)
  748. {
  749. return RET_STATUS::RET_THREAD_INVALID;
  750. }
  751. g_pYuyingCtrl->PrepareAcquisition(this);
  752. m_SyncUnit->FPDReadyNotify(true);
  753. FINFO("PrepareAcquisition over");
  754. return RET_STATUS::RET_SUCCEED;
  755. }
  756. RET_STATUS nsFPD::FPDDeviceYuying::StartAcquisition(string in)
  757. {
  758. FINFO("StartAcquisition ");
  759. if (!m_stDeviceConfig.bConnectStatus)
  760. {
  761. return RET_STATUS::RET_THREAD_INVALID;
  762. }
  763. m_bAbortRecover = false;//能执行StartAcq,说明没有错误可以ready曝光。不再影响abort后再次recoverimage功能
  764. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  765. if (RET_STATUS::RET_SUCCEED == g_pYuyingCtrl->StartAcquisition(this))
  766. {
  767. Ret = RET_STATUS::RET_SUCCEED;
  768. }
  769. else
  770. {
  771. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  772. FERROR("StartAcquisition failed");
  773. }
  774. FINFO("StartAcquisition over");
  775. return Ret;
  776. }
  777. RET_STATUS nsFPD::FPDDeviceYuying::StopAcquisition()
  778. {
  779. FINFO("StopAcquisition");
  780. if (!m_stDeviceConfig.bConnectStatus)
  781. {
  782. return RET_STATUS::RET_THREAD_INVALID;
  783. }
  784. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  785. if (RET_STATUS::RET_SUCCEED == g_pYuyingCtrl->StopAcquisition(this))
  786. {
  787. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  788. Ret = RET_STATUS::RET_SUCCEED;
  789. }
  790. FINFO("StopAcquisition over ");
  791. return Ret;
  792. }
  793. //设置同步模式
  794. RET_STATUS nsFPD::FPDDeviceYuying::ActiveSyncMode(int nSyncMode)
  795. {
  796. FINFO("=====ActiveSyncMode: {$}", nSyncMode);
  797. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  798. if (g_pYuyingCtrl->ActiveSyncMode(this, nSyncMode))
  799. {
  800. Ret = RET_STATUS::RET_SUCCEED;
  801. FINFO("ActiveSyncMode success");
  802. }
  803. return Ret;
  804. }
  805. string nsFPD::FPDDeviceYuying::GetFileVersion(string strFilePathName)
  806. {
  807. DWORD dwVerSize = GetFileVersionInfoSize(strFilePathName.c_str(), NULL);
  808. if (dwVerSize == 0)
  809. {
  810. return "";
  811. }
  812. LPVOID pVersionBuffer = malloc(dwVerSize);
  813. if (nullptr == pVersionBuffer)
  814. {
  815. return "";
  816. }
  817. GetFileVersionInfo(strFilePathName.c_str(), 0, dwVerSize, pVersionBuffer);
  818. VS_FIXEDFILEINFO* pInfo;
  819. UINT nInfoLen;
  820. char szValue[MAX_PATH] = { 0 };
  821. if (VerQueryValue(pVersionBuffer, ("\\"), (void**)&pInfo, &nInfoLen))
  822. {
  823. sprintf_s(szValue, ("%d.%d.%d.%d"),
  824. HIWORD(pInfo->dwFileVersionMS), LOWORD(pInfo->dwFileVersionMS),
  825. HIWORD(pInfo->dwFileVersionLS), LOWORD(pInfo->dwFileVersionLS));
  826. }
  827. string strVersion = szValue;
  828. return strVersion;
  829. }
  830. void nsFPD::FPDDeviceYuying::SendTemperatureValue(float fTemp)
  831. {
  832. int nStatus = 0;
  833. m_Temperature->SetTemperature(fTemp, nStatus);
  834. FINFO("SendTemperatureValue: {$}, status {$} ", fTemp, nStatus);
  835. return;
  836. }
  837. void nsFPD::FPDDeviceYuying::SendWifiValue(int nWifi)
  838. {
  839. int nStatus = 0;
  840. m_Wifi->SetSignalValue(nWifi, nStatus);
  841. FINFO("SendWifiValue: {$}, status {$} ", nWifi, nStatus);
  842. return;
  843. }
  844. void nsFPD::FPDDeviceYuying::SendBatteryValue(int nBattery)
  845. {
  846. int nStatus = 0;
  847. m_Battery->SetRemainPowerValue(nBattery, nStatus);
  848. FINFO("SendBatteryValue: {$}, status {$} ", nBattery, nStatus);
  849. return;
  850. }
  851. RET_STATUS nsFPD::FPDDeviceYuying::ActiveCalibration(CCOS_CALIBRATION_TYPE Type)
  852. {
  853. FINFO("ActiveCalibration is {$}", (int)Type);
  854. if (!m_stDeviceConfig.bConnectStatus)
  855. {
  856. FINFO("unconnected");
  857. return RET_STATUS::RET_THREAD_INVALID;
  858. }
  859. if (Type == CCOS_CALIBRATION_TYPE_NONE || Type == CCOS_CALIBRATION_TYPE_MAX)
  860. {
  861. FINFO("type error {$}", (int)Type);
  862. return RET_STATUS::RET_INVALID;
  863. }
  864. m_eAppStatus = APP_STATUS_CAL_BEGIN;
  865. m_nCalibrationType = Type;
  866. OnErrorX(ERR_FPD_DOSE_LOW);
  867. OnErrorX(ERR_FPD_DOSE_HIGH);
  868. OnErrorX(ERR_FPD_DOSE_OBJ);//清除之前的错误,如果有的话
  869. RET_STATUS Ret = g_pYuyingCtrl->ActiveCalibration(Type, this);
  870. if (RET_STATUS::RET_SUCCEED == Ret)
  871. {
  872. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_ACTIVE));
  873. m_CalibUnit->SetCalibrationProgress("0");
  874. if (Type == CCOS_CALIBRATION_TYPE_XRAY)
  875. {
  876. ResetEvent(m_WaitCalibDoseEvt);
  877. }
  878. m_nXrayCalibNum = 0;
  879. }
  880. ResetEvent(m_OffsetCalibrationEvt);
  881. ResetEvent(m_CompleteCalibrationEvt);
  882. FINFO("ActiveCalibration {$} over", (int)Type);
  883. return Ret;
  884. }
  885. RET_STATUS nsFPD::FPDDeviceYuying::GetRequestedDose(string& strDose)
  886. {
  887. FINFO("GetRequestedDose");
  888. if (!m_stDeviceConfig.bConnectStatus)
  889. {
  890. return RET_STATUS::RET_THREAD_INVALID;
  891. }
  892. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  893. bool bGetDoseInfo = false;
  894. ResDataObject out;
  895. if (CCOS_CALIBRATION_TYPE_DARK == m_nCalibrationType)
  896. {
  897. out.add("Dose", 0.0f);
  898. out.add("kV", 0.0f);
  899. out.add("mA", 0.0f);
  900. out.add("ms", 0.0f);
  901. out.add("mAs", 0.0f);
  902. bGetDoseInfo = true;
  903. Ret = RET_STATUS::RET_SUCCEED;
  904. }
  905. else if (CCOS_CALIBRATION_TYPE_XRAY == m_nCalibrationType)
  906. {
  907. float fDose = (m_fDoseParam * 1.0f) / 1000.0f;
  908. FINFO("GetRequestedDose Xray {$} over {$}", fDose, m_fDoseParam);
  909. Ret = RET_STATUS::RET_SUCCEED;
  910. for (int i = 0; i < m_CalibDoseList.size(); i++)
  911. {
  912. ResDataObject temp = m_CalibDoseList[i];
  913. int nDose = temp["Dose"];
  914. if (m_fDoseParam == nDose)
  915. {
  916. out.add("Dose", nDose);
  917. out.add("kV", temp["kV"]);
  918. out.add("mA", temp["mA"]);
  919. out.add("ms", temp["ms"]);
  920. out.add("mAs", temp["mAs"]);
  921. bGetDoseInfo = true;
  922. break;
  923. }
  924. }
  925. }
  926. else
  927. {
  928. Ret = RET_STATUS::RET_FAILED;
  929. }
  930. if (bGetDoseInfo)
  931. {
  932. strDose = out.encode();
  933. FINFO("GetRequestedDose {$} over", strDose.c_str());
  934. }
  935. else
  936. {
  937. FERROR("GetRequestedDose failed");
  938. }
  939. return Ret;
  940. }
  941. RET_STATUS nsFPD::FPDDeviceYuying::PrepareCalibration()
  942. {
  943. FINFO("PrepareCalibration");
  944. if (!m_stDeviceConfig.bConnectStatus)
  945. {
  946. return RET_STATUS::RET_THREAD_INVALID;
  947. }
  948. m_SyncUnit->FPDReadyNotify(true);
  949. if (CCOS_CALIBRATION_TYPE_XRAY == m_nCalibrationType)
  950. {
  951. int nWaitTime = m_nConfXrayOnGap - m_nGenWaitGap;
  952. WaitForSingleObject(m_CalibGapEvt, nWaitTime);
  953. }
  954. FINFO("PrepareCalibration over");
  955. return RET_STATUS::RET_SUCCEED;
  956. }
  957. RET_STATUS nsFPD::FPDDeviceYuying::StartCalibration()
  958. {
  959. FINFO("StartCalibration");
  960. if (!m_stDeviceConfig.bConnectStatus)
  961. {
  962. return RET_STATUS::RET_THREAD_INVALID;
  963. }
  964. if (CCOS_CALIBRATION_TYPE_DARK == m_nCalibrationType)
  965. {
  966. m_bOffsetCalibRunning = true;
  967. SetEvent(m_OffsetCalibrationEvt);
  968. }
  969. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  970. ResetEvent(m_PauseCalibrationEvt);
  971. if (RET_STATUS::RET_SUCCEED == g_pYuyingCtrl->StartCalibration(this))
  972. {
  973. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_ACQ));
  974. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_RUNNING));
  975. Ret = RET_STATUS::RET_SUCCEED;
  976. }
  977. else
  978. {
  979. FERROR("StartCalibration failed");
  980. Ret = RET_STATUS::RET_FAILED;
  981. }
  982. FINFO("StartCalibration over");
  983. return RET_STATUS::RET_SUCCEED;
  984. }
  985. RET_STATUS nsFPD::FPDDeviceYuying::PauseCalibration()
  986. {
  987. RET_STATUS Ret = RET_STATUS::RET_SUCCEED;
  988. m_nXrayCalibNum++;
  989. if (m_nXrayCalibNum != 20)
  990. {
  991. FINFO("start to waitting CalibDoseEvt");
  992. DWORD nRet = WaitForSingleObject(m_WaitCalibDoseEvt, INFINITE);
  993. }
  994. ResetEvent(m_PauseCalibrationEvt);
  995. ResetEvent(m_WaitCalibDoseEvt);
  996. m_AcqUnit->SendNoNeedWaitImage(true);
  997. if (m_nXrayCalibNum != 20)
  998. {
  999. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1000. m_CalibUnit->PauseCalibration();
  1001. }
  1002. FINFO("Driver PauseCalibration over,m_nXrayCalibNum {$}", m_nXrayCalibNum);
  1003. return Ret;
  1004. }
  1005. RET_STATUS nsFPD::FPDDeviceYuying::StopCalibration()
  1006. {
  1007. FINFO("StopCalibration");
  1008. if (!m_stDeviceConfig.bConnectStatus)
  1009. {
  1010. return RET_STATUS::RET_THREAD_INVALID;
  1011. }
  1012. if (CCOS_CALIBRATION_TYPE_DARK == m_nCalibrationType)
  1013. {
  1014. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_BESTOPPED));
  1015. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1016. m_CalibUnit->SetCalibrationProgress("100");
  1017. FINFO("StopDarkCalibration over");
  1018. return RET_STATUS::RET_SUCCEED;
  1019. }
  1020. RET_STATUS Ret = RET_STATUS::RET_FAILED;
  1021. m_eAppStatus = APP_STATUS_CAL_END;
  1022. if (RET_STATUS::RET_SUCCEED == g_pYuyingCtrl->AbortCalibration(this))
  1023. {
  1024. Ret = RET_STATUS::RET_SUCCEED;
  1025. }
  1026. else
  1027. {
  1028. Ret = RET_STATUS::RET_FAILED;
  1029. }
  1030. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_BESTOPPED));
  1031. m_CalibUnit->SetCalibrationProgress("100");
  1032. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1033. m_AcqUnit->SendNoNeedWaitImage(true);
  1034. FINFO("StopCalibration over");
  1035. return RET_STATUS::RET_SUCCEED;
  1036. }
  1037. void nsFPD::FPDDeviceYuying::AbortCalibration()
  1038. {
  1039. FINFO("AbortCalibration");
  1040. if (CCOS_CALIBRATION_TYPE_DARK == m_nCalibrationType)
  1041. {
  1042. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_ERROR));
  1043. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1044. m_CalibUnit->SetCalibrationProgress("100");
  1045. FINFO("AbortDarkCalibration over");
  1046. return;
  1047. }
  1048. m_eAppStatus = APP_STATUS_CAL_END;
  1049. g_pYuyingCtrl->AbortCalibration(this);
  1050. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_ERROR));
  1051. m_CalibUnit->SetCalibrationProgress("100");
  1052. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1053. m_AcqUnit->SendNoNeedWaitImage(true);
  1054. FINFO("AbortXrayCalibration over");
  1055. return;
  1056. }
  1057. void nsFPD::FPDDeviceYuying::StopCalibrationInside()
  1058. {
  1059. FINFO("StopCalibrationInside");
  1060. if (CCOS_CALIBRATION_TYPE_DARK == m_nCalibrationType)
  1061. {
  1062. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  1063. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1064. m_CalibUnit->SetCalibrationProgress("100");
  1065. FINFO("StopCalibrationInside dark over");
  1066. return;
  1067. }
  1068. m_eAppStatus = APP_STATUS_CAL_END;
  1069. g_pYuyingCtrl->AbortCalibration(this);
  1070. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  1071. m_CalibUnit->SetCalibrationProgress("100");
  1072. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1073. m_AcqUnit->SendNoNeedWaitImage(true);
  1074. FINFO("StopCalibrationInside xray over");
  1075. return;
  1076. }
  1077. bool nsFPD::FPDDeviceYuying::CompleteCalibration()
  1078. {
  1079. m_stDeviceConfig.fCalibTemperature = m_stDeviceConfig.fCurrentTemperValue;
  1080. ResetEvent(m_UploadCalibMapOver);
  1081. g_pYuyingCtrl->CompleteCalibration(this);
  1082. DWORD nRet = WaitForSingleObject(m_UploadCalibMapOver, 60000);
  1083. if (WAIT_OBJECT_0 == nRet)
  1084. {
  1085. FINFO("got event m_UploadCalibMapOver");
  1086. }
  1087. else if (WAIT_TIMEOUT == nRet)
  1088. {
  1089. FINFO("wait event m_UploadCalibMapOver timeout");
  1090. }
  1091. else
  1092. {
  1093. FINFO("wait event m_UploadCalibMapOver error");
  1094. }
  1095. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_STANDBY));
  1096. m_CalibUnit->SetCalibrationStatus(to_string(CCOS_CALIBRATION_STATUS_STANDBY));
  1097. m_CalibUnit->SetCalibrationProgress("100");
  1098. CheckCalibartionDue();
  1099. return true;
  1100. }
  1101. RET_STATUS nsFPD::FPDDeviceYuying::ResetConnect()
  1102. {
  1103. FINFO("Reset Connect");
  1104. g_pYuyingCtrl->ResetFPD(this);
  1105. FINFO("FPDDeviceYuying::ResetConnect over");
  1106. return RET_STATUS::RET_SUCCEED;
  1107. }
  1108. RET_STATUS nsFPD::FPDDeviceYuying::DisConnectFPD()
  1109. {
  1110. FINFO("DisConnectFPD");
  1111. if (!g_pYuyingCtrl->DisConnect(this))
  1112. {
  1113. FERROR("DisConnectFPD failed");
  1114. return RET_STATUS::RET_FAILED;
  1115. }
  1116. SendWifiValue(0);
  1117. SendBatteryValue(0);
  1118. SendTemperatureValue(ABS_ZERO_TEMPERATURE);
  1119. m_bDisConnected = true;
  1120. ResetAllError();
  1121. FINFO("DisConnectFPD over");
  1122. return RET_STATUS::RET_SUCCEED;
  1123. }
  1124. RET_STATUS nsFPD::FPDDeviceYuying::AttachConnect()
  1125. {
  1126. m_DetectorCtrlUnit->SetConnectStatus(to_string(PANEL_ATTACH_START));
  1127. return RET_STATUS::RET_SUCCEED;
  1128. }
  1129. RET_STATUS nsFPD::FPDDeviceYuying::CancelAttach()
  1130. {
  1131. return RET_STATUS::RET_SUCCEED;
  1132. }
  1133. RET_STATUS nsFPD::FPDDeviceYuying::SetAttachStatus(int nStatus)
  1134. {
  1135. return m_DetectorCtrlUnit->SetAttachStatus(to_string(nStatus));
  1136. }
  1137. void nsFPD::FPDDeviceYuying::FullImageDateArrived(WORD* pImg)
  1138. {
  1139. AddFrameWithRawHead(IMAGE_FULL, pImg, m_stDeviceConfig.nFullImageWidth * m_stDeviceConfig.nFullImageHeight);
  1140. }
  1141. void nsFPD::FPDDeviceYuying::PrevImageDateArrived(WORD* pImg)
  1142. {
  1143. AddFrameWithRawHead(IMAGE_PREVIEW, pImg, m_stDeviceConfig.nPreviewWidth * m_stDeviceConfig.nPreviewHeight);
  1144. }
  1145. RET_STATUS nsFPD::FPDDeviceYuying::SetXwindow(float XwindowSize)
  1146. {
  1147. FINFO("SetXwindowSize {$}", XwindowSize);
  1148. FINFO("SetXwindowSize DoNothing");
  1149. FINFO("SetXwindowSize over");
  1150. return RET_STATUS::RET_SUCCEED;
  1151. }
  1152. RET_STATUS nsFPD::FPDDeviceYuying::EnterExam(int nExamStatus)
  1153. {
  1154. FINFO("EnterExam");
  1155. switch (nExamStatus)
  1156. {
  1157. case APP_STATUS_WORK_BEGIN:
  1158. FINFO("Enter into Exam Windows");
  1159. OnErrorX(ERR_FPD_DOSE_LOW);
  1160. OnErrorX(ERR_FPD_DOSE_HIGH);
  1161. OnErrorX(ERR_FPD_DOSE_OBJ);//清除之前校正的错误,如果有的话
  1162. break;
  1163. case APP_STATUS_WORK_END:
  1164. FINFO("Quit Exam Windows");
  1165. m_bTestSensitivity = false;
  1166. break;
  1167. case APP_STATUS_DETSHARE_BEGIN:
  1168. FINFO("Enter into Detector Share Windows");
  1169. break;
  1170. case APP_STATUS_DETSHAR_END:
  1171. FINFO("Quit Detector Share Windows");
  1172. break;
  1173. case APP_STATUS_CAL_BEGIN:
  1174. FINFO("Enter into Calibration Windows");
  1175. break;
  1176. case APP_STATUS_CAL_END:
  1177. FINFO("Quit Calibration Windows");
  1178. break;
  1179. case APP_STATUS_WORK_IN_SENSITIVITY:
  1180. FINFO("Enter into sensitivity test interface");
  1181. m_bTestSensitivity = true;
  1182. break;
  1183. default:
  1184. FWARN("Undefined app status");
  1185. break;
  1186. }
  1187. m_eAppStatus = (APP_STATUS)nExamStatus;
  1188. g_pYuyingCtrl->EnterExam(m_eAppStatus);
  1189. return RET_STATUS::RET_SUCCEED;
  1190. }
  1191. RET_STATUS nsFPD::FPDDeviceYuying::SetAcqMode(string mode)
  1192. {
  1193. if (!m_stDeviceConfig.bConnectStatus)
  1194. {
  1195. FERROR("m_stDeviceConfig.bConnectStatus = false");
  1196. return RET_STATUS::RET_THREAD_INVALID;
  1197. }
  1198. m_AcqUnit->SetFulImageInfo(m_nFullImgWidth, m_nFullImgHeight, m_nImageBits, false);
  1199. m_AcqUnit->SetPrevImageInfo(m_stDeviceConfig.bPreviewEnable, m_stDeviceConfig.nPreviewHeight, m_stDeviceConfig.nPreviewWidth, false);
  1200. if (!g_pYuyingCtrl->SelectExamMode(1, this))
  1201. {
  1202. FERROR("Set acqmode failed");
  1203. return RET_STATUS::RET_FAILED;
  1204. }
  1205. return RET_STATUS::RET_SUCCEED;
  1206. }
  1207. RET_STATUS CCOS::Dev::Detail::Detector::FPDDeviceYuying::SetSyncMode(SYNC_MODE nSyncMode, HARDWARE_TRIGGER_MODE TriggerMode)
  1208. {
  1209. return RET_STATUS::RET_SUCCEED;
  1210. }
  1211. void nsFPD::FPDDeviceYuying::OnFPDCallback(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1212. {
  1213. m_nDeviceIndex = nDetectorID;
  1214. switch (nEventLevel)
  1215. {
  1216. case EVT_LEVEL_CONFIGURATION:
  1217. {
  1218. OnEventProcessConf(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1219. break;
  1220. }
  1221. case EVT_LEVEL_INFORMATOION:
  1222. {
  1223. OnEventProcessInfo(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1224. break;
  1225. }
  1226. case EVT_LEVEL_STATUS:
  1227. {
  1228. OnEventProcessStatus(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1229. break;
  1230. }
  1231. case EVT_LEVEL_DATA:
  1232. {
  1233. OnEventProcessData(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1234. break;
  1235. }
  1236. case EVT_LEVEL_WARNING:
  1237. {
  1238. break;
  1239. }
  1240. case EVT_LEVEL_ERROR:
  1241. {
  1242. OnEventProcessError(nDetectorID, nEventID, nEventLevel, pszMsg, nParam1, fParam2, nPtrParamLen, pParam);
  1243. break;
  1244. }
  1245. default:
  1246. {
  1247. break;
  1248. }
  1249. }
  1250. }
  1251. void nsFPD::FPDDeviceYuying::OnEventProcessConf(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1252. {
  1253. switch (nEventID)
  1254. {
  1255. case EVT_CONF_PANEL_SERIAL:
  1256. {
  1257. m_stDeviceConfig.strPanelSerial = pszMsg;
  1258. FINFO("Receive Panel {$} SN {$}", nDetectorID, pszMsg);
  1259. char cDetectorID[17] = { 0 };
  1260. memcpy(cDetectorID, m_stDeviceConfig.strPanelSerial.c_str(), 16);
  1261. string strDetectorID = cDetectorID;
  1262. m_DetectorCtrlUnit->SetDetectorID(strDetectorID);
  1263. FINFO("SedDetectorID {$}", strDetectorID.c_str());
  1264. if (!m_bRecoverImageStatusInit)
  1265. {
  1266. m_RecoverImageStatus.add("DetectorName", m_stDeviceConfig.strDeviceName.c_str());
  1267. m_RecoverImageStatus.add("DetectorSN", m_stDeviceConfig.strPanelSerial.c_str());
  1268. m_RecoverImageStatus.add("DetectorWifiSignal", "1");
  1269. m_RecoverImageStatus.add("Result", "-1");
  1270. m_bRecoverImageStatusInit = true;
  1271. }
  1272. break;
  1273. }
  1274. case EVT_CONF_RAW_WIDTH:
  1275. {
  1276. if (m_stDeviceConfig.nFullImageWidth != nParam1)
  1277. {
  1278. m_stDeviceConfig.nFullImageWidth = nParam1;
  1279. }
  1280. FINFO("Panel {$} nRawWidth:{$}", nDetectorID, m_stDeviceConfig.nRawWidth);
  1281. break;
  1282. }
  1283. case EVT_CONF_RAW_HIGHT:
  1284. {
  1285. if (m_stDeviceConfig.nFullImageHeight != nParam1)
  1286. {
  1287. m_stDeviceConfig.nFullImageHeight = nParam1;
  1288. }
  1289. FINFO("Panel {$} nRawHeight:{$}", nDetectorID, m_stDeviceConfig.nRawHeight);
  1290. break;
  1291. }
  1292. case EVT_CONF_RAW_BITS:
  1293. {
  1294. if (m_stDeviceConfig.nImageBits != nParam1)
  1295. {
  1296. m_stDeviceConfig.nImageBits = nParam1;
  1297. }
  1298. m_stDeviceConfig.nImageBits = nParam1;
  1299. FINFO("Panel {$} nImageBits:{$}", nDetectorID, m_stDeviceConfig.nImageBits);
  1300. break;
  1301. }
  1302. case EVT_CONF_PIXELSPACE:
  1303. {
  1304. m_stDeviceConfig.nPixelSpace = nParam1;
  1305. FINFO("Panel {$} nPixelSpace:{$}", nDetectorID, m_stDeviceConfig.nPixelSpace);
  1306. break;
  1307. }
  1308. case EVT_CONF_PREVIEW_WIDTH:
  1309. {
  1310. if (m_stDeviceConfig.nPreviewWidth != nParam1)
  1311. {
  1312. m_stDeviceConfig.nPreviewWidth = nParam1;
  1313. }
  1314. FINFO("Panel {$} nPreviewWidth:{$}", nDetectorID, m_stDeviceConfig.nPreviewWidth);
  1315. break;
  1316. }
  1317. case EVT_CONF_PREVIEW_HIGHT:
  1318. {
  1319. if (m_stDeviceConfig.nPreviewHeight != nParam1)
  1320. {
  1321. m_stDeviceConfig.nPreviewHeight = nParam1;
  1322. }
  1323. FINFO("Panel {$} nPreviewHeight:{$}", nDetectorID, m_stDeviceConfig.nPreviewHeight);
  1324. break;
  1325. }
  1326. case EVT_CONF_MODULE_TYPE:
  1327. {
  1328. FINFO("Receive Panel {$} ModuleType {$}", nDetectorID, pszMsg);
  1329. break;
  1330. }
  1331. case EVT_CONF_MODULE_IP:
  1332. {
  1333. m_strModuleIP = pszMsg;
  1334. FINFO("Receive Panel {$} ModuleIP {$}", nDetectorID, pszMsg);
  1335. break;
  1336. }
  1337. case EVT_CONF_MODULE_SN:
  1338. {
  1339. m_strModuleSN = pszMsg;
  1340. FINFO("Receive Panel {$} ModuleSN {$}", nDetectorID, pszMsg);
  1341. break;
  1342. }
  1343. case EVT_CONF_FIRWARE_UPDATE:
  1344. {
  1345. m_stDeviceConfig.nFirmwareStatus = nParam1;
  1346. m_DetectorCtrlUnit->SetFirmwareStatus(to_string(nParam1));
  1347. FINFO("Panel {$} FirmwareUpdate:{$}", nDetectorID, m_stDeviceConfig.nFirmwareStatus);
  1348. break;
  1349. }
  1350. case EVT_CONF_PART_NUMBER:
  1351. {
  1352. break;
  1353. }
  1354. case EVT_CONF_BATTERY_SN:
  1355. {
  1356. m_strBatterySN = pszMsg;
  1357. FINFO("Panel {$} Battery SN:{$}", nDetectorID, pszMsg);
  1358. break;
  1359. }
  1360. case EVT_CONF_WIFI_SSID:
  1361. {
  1362. m_stDeviceConfig.strWifiSSID = pszMsg;
  1363. FINFO("Panel {$} WifiSSID:{$}", nDetectorID, pszMsg);
  1364. break;
  1365. }
  1366. case EVT_CONF_IFBOARD:
  1367. {
  1368. FINFO("Panel {$} InterfaceBoard:{$}", nDetectorID, pszMsg);
  1369. break;
  1370. }
  1371. default:
  1372. {
  1373. break;
  1374. }
  1375. }
  1376. }
  1377. void nsFPD::FPDDeviceYuying::OnEventProcessInfo(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1378. {
  1379. int nID = nDetectorID;
  1380. switch (nEventID)
  1381. {
  1382. case EVT_INFO_BATTERY_CAPACITY:
  1383. {
  1384. int nBatteryCapacity = nParam1;
  1385. if ((nBatteryCapacity != m_nBatteryCapacity) && (m_strBatterySN != ""))
  1386. {
  1387. FINFO("{$},SN:{$}", nBatteryCapacity, m_strBatterySN);
  1388. m_nBatteryCapacity = nBatteryCapacity;
  1389. }
  1390. break;
  1391. }
  1392. case EVT_INFO_BATTERY_TEMPERATURE:
  1393. {
  1394. float fBatteryTemper = fParam2;
  1395. if (((fBatteryTemper - m_fBatteryTemperature) >= 0.1f) && (m_strBatterySN != ""))
  1396. {
  1397. FINFO("SN:{$} ,temperature:{$}", m_strBatterySN, fBatteryTemper);
  1398. m_fBatteryTemperature = fBatteryTemper;
  1399. }
  1400. break;
  1401. }
  1402. case EVT_INFO_BATTERY_CHARGES:
  1403. {
  1404. int nBatteryCharges = nParam1;
  1405. if ((nBatteryCharges != m_nBatteryCharges) && (m_strBatterySN != ""))
  1406. {
  1407. FINFO("SN:{$},Charge number:{$}", m_strBatterySN, nBatteryCharges);
  1408. m_nBatteryCharges = nBatteryCharges;
  1409. }
  1410. break;
  1411. }
  1412. case EVT_INFO_WIFI_DATARATE:
  1413. {
  1414. m_stDeviceConfig.nWifiDataRate = nParam1;
  1415. FINFO("Detector {$} WifiDataRate:{$}", nID, m_stDeviceConfig.nWifiDataRate);
  1416. break;
  1417. }
  1418. case EVT_INFO_WIFI_CHANNEL:
  1419. {
  1420. m_stDeviceConfig.nWifiChannel = nParam1;
  1421. FINFO("Panel {$} WifiChannel:{$}", nID, m_stDeviceConfig.nWifiChannel);
  1422. break;
  1423. }
  1424. case EVT_INFO_WIFI_SIGNALPOWER:
  1425. {
  1426. m_stDeviceConfig.nWifiSignalPower = nParam1;
  1427. break;
  1428. }
  1429. case EVT_INFO_WIFI_NOISEPOWER:
  1430. {
  1431. m_stDeviceConfig.nWifiNoisePower = nParam1;
  1432. FINFO("Panel {$} WifiNoisePower:{$}", nID, m_stDeviceConfig.nWifiNoisePower);
  1433. break;
  1434. }
  1435. case EVT_INFO_SHOCKSENSOR_INFO:
  1436. {
  1437. FINFO("Receive ShockSensor FINFO");
  1438. m_strShockSensor = pszMsg;
  1439. m_DetectorCtrlUnit->SetShockSensorInfo(m_strShockSensor);
  1440. break;
  1441. }
  1442. case EVT_INFO_CALIBRATIOIN_DATE:
  1443. {
  1444. FINFO("Panel {$} STE Calibration Date:{$}", nID, pszMsg);
  1445. break;
  1446. }
  1447. case EVT_INFO_CALIBRATIOIN_TIME:
  1448. {
  1449. FINFO("Panel {$} STE Calibration Time:{$}", nID, pszMsg);
  1450. m_stDeviceConfig.strCalibrationTime = pszMsg;
  1451. m_DetectorCtrlUnit->SetTimeofLastDetectorCalibration(m_stDeviceConfig.strCalibrationTime);
  1452. break;
  1453. }
  1454. default:
  1455. {
  1456. break;
  1457. }
  1458. }
  1459. }
  1460. void nsFPD::FPDDeviceYuying::OnEventProcessStatus(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1461. {
  1462. int nID = nDetectorID;
  1463. string strWarnErrorCode = "";
  1464. switch (nEventID)
  1465. {
  1466. case EVT_STATUS_INIT:
  1467. {
  1468. if (PANEL_EVENT_END_OK == nParam1)
  1469. {
  1470. OnInitResult(true);
  1471. m_DetectorCtrlUnit->SetInitialStatus(to_string(DETECTOR_INI_SUCCESS));
  1472. FINFO("connect FPD ok. Start Status Polling");
  1473. }
  1474. else if (PANEL_EVENT_END_ERROR == nParam1)
  1475. {
  1476. OnInitResult(false);
  1477. m_DetectorCtrlUnit->SetInitialStatus(to_string(DETECTOR_INI_FAILED));
  1478. }
  1479. else if (PANEL_EVENT_END == nParam1) //未连接探测器
  1480. {
  1481. m_DetectorCtrlUnit->SetInitialStatus(to_string(DETECTOR_INI_SUCCESS));
  1482. }
  1483. else if (PANEL_EVENT_START == nParam1)
  1484. {
  1485. m_DetectorCtrlUnit->SetInitialStatus(to_string(DETECTOR_INI_START));
  1486. }
  1487. break;
  1488. }
  1489. case EVT_STATUS_MOTION:
  1490. {
  1491. m_strMotionStatus = pszMsg;
  1492. break;
  1493. }
  1494. case EVT_STATUS_UPDATE_FIRMWARE:
  1495. {
  1496. if (PANEL_EVENT_START == nParam1)
  1497. {
  1498. FINFO("Start update firmware");
  1499. m_DetectorCtrlUnit->SetUpdateFWStatus(to_string(DETECTOR_UFW_START));
  1500. }
  1501. else if (PANEL_EVENT_BEGIN == nParam1)
  1502. {
  1503. FINFO("Update firmware begin");
  1504. m_stDeviceConfig.bConnectStatus = false;
  1505. }
  1506. else if (PANEL_EVENT_END_ERROR == nParam1)
  1507. {
  1508. FINFO("Update firmware failed");
  1509. m_DetectorCtrlUnit->SetUpdateFWStatus(to_string(DETECTOR_UFW_ERROR));
  1510. }
  1511. else if (PANEL_EVENT_SUCCESS == nParam1)
  1512. {
  1513. FINFO("update firmware success");
  1514. m_DetectorCtrlUnit->SetUpdateFWStatus(to_string(DETECTOR_UFW_SUCCESS));
  1515. }
  1516. else if (PANEL_EVENT_FWU_ERROR_BATTERY == nParam1)
  1517. {
  1518. FINFO("update firmware failed, battery < 50");
  1519. m_DetectorCtrlUnit->SetUpdateFWStatus(to_string(DETECTOR_UFW_ERROR_BATTERY));
  1520. }
  1521. else if (PANEL_EVENT_FWU_ERROR_OMIT == nParam1)
  1522. {
  1523. FINFO("update firmware failed, Omit");
  1524. m_DetectorCtrlUnit->SetUpdateFWStatus(to_string(DETECTOR_UFW_ERROR_OMIT));
  1525. }
  1526. break;
  1527. }
  1528. case EVT_STATUS_DETECTORSHARE:
  1529. {
  1530. ENUM_PANEL_EVENT_STATE eStatus = (ENUM_PANEL_EVENT_STATE)nParam1;
  1531. switch (eStatus)
  1532. {
  1533. case PANEL_CONNECT_OK:
  1534. {
  1535. string strError = ERR_FPD_NOFPD;
  1536. OnErrorX(strError); //之前可能会提示NO DETECTOR
  1537. FINFO("SetConnectStatus(PANEL_CONNECT_OK)");
  1538. m_DetectorCtrlUnit->SetConnectStatus(to_string(PANEL_CONNECT_OK));
  1539. m_stDeviceConfig.bConnectStatus = true;
  1540. SetAttachStatus(1);
  1541. m_bAttached = true;
  1542. break;
  1543. }
  1544. case PANEL_CONNECT_ERROR:
  1545. {
  1546. FINFO("SetConnectStatus(PANEL_CONNECT_ERROR)");
  1547. m_DetectorCtrlUnit->SetConnectStatus(to_string(PANEL_CONNECT_ERROR));
  1548. break;
  1549. }
  1550. case PANEL_DISCONNECT_SUCCESS:
  1551. {
  1552. m_nBatteryCapacity = 0;
  1553. m_strBatterySN = "";
  1554. m_stDeviceConfig.bExisted = false;
  1555. m_stDeviceConfig.bConnectStatus = false;
  1556. FINFO("SetConnectStatus(PANEL_DISCONNECT_SUCCESS)");
  1557. m_DetectorCtrlUnit->SetConnectStatus(to_string(PANEL_DISCONNECT_SUCCESS));
  1558. break;
  1559. }
  1560. case PANEL_DISCONNECT_ERROR:
  1561. {
  1562. FINFO("SetConnectStatus(PANEL_DISCONNECT_ERROR)");
  1563. m_DetectorCtrlUnit->SetConnectStatus(to_string(PANEL_DISCONNECT_ERROR));
  1564. break;
  1565. }
  1566. default:
  1567. break;
  1568. }
  1569. break;
  1570. }
  1571. case EVT_STATUS_SINGLEINIT:
  1572. break;
  1573. case EVT_STATUS_SELECTPANEL:
  1574. break;
  1575. case EVT_STATUS_PANEL:
  1576. {
  1577. ENUM_PANEL_STATUS m_ePanelStatus = (ENUM_PANEL_STATUS)nParam1;
  1578. if (PANEL_STANDBY == nParam1)
  1579. {
  1580. FINFO("Panel Status:PREPARE");
  1581. }
  1582. else if (PANEL_START_ACQ == nParam1)
  1583. {
  1584. FINFO("Panel Status:ACQ");
  1585. m_DetectorCtrlUnit->SetDetectorStatus(to_string(DETECTOR_STATUS_ACQ));
  1586. }
  1587. else if (PANEL_READY_EXP == nParam1)
  1588. {
  1589. FINFO("Panel Status:READY");
  1590. Action_ExpReady();
  1591. }
  1592. else if (PANEL_OFFSET_CAL == nParam1)
  1593. {
  1594. FINFO("Panel Status:PANEL_OFFSET_CAL");
  1595. }
  1596. else if (PANEL_OFFSET_FINISH == nParam1)
  1597. {
  1598. FINFO("Panel Status:PANEL_OFFSET_FINISH");
  1599. m_bOffsetCalibRunning = false;
  1600. StopCalibrationInside();
  1601. }
  1602. else if (PANEL_OFFSET_FAILED == nParam1)
  1603. {
  1604. FINFO("Panel Status:PANEL_OFFSET_FAILED");
  1605. m_bOffsetCalibRunning = false;
  1606. AbortCalibration();
  1607. }
  1608. else if (PANEL_XWINDOW_ON == nParam1) //Xwindow On
  1609. {
  1610. FINFO("Panel Status:XWINDOW_ON");
  1611. m_stImgCreateTime = { 0 };
  1612. GetLocalTime(&m_stImgCreateTime);
  1613. FINFO("XWindowOn at {$:d04}-{$:d02}-{$:d02} {$:d02}:{$:d02}:{$:d02}:{$:d03}",
  1614. m_stImgCreateTime.wYear, m_stImgCreateTime.wMonth, m_stImgCreateTime.wDay,
  1615. m_stImgCreateTime.wHour, m_stImgCreateTime.wMinute, m_stImgCreateTime.wSecond, m_stImgCreateTime.wMilliseconds);
  1616. m_SyncUnit->XWindowOnNotify();
  1617. }
  1618. else if (PANEL_XWINDOW_OFF == nParam1) //Xwindow Off
  1619. {
  1620. FINFO("Panel Status:XWINDOW_OFF");
  1621. m_stImgCreateTime = { 0 };
  1622. GetLocalTime(&m_stImgCreateTime);
  1623. FINFO("XWindowOff at {$:d04}-{$:d02}-{$:d02} {$:d02}:{$:d02}:{$:d02}:{$:d03}",
  1624. m_stImgCreateTime.wYear, m_stImgCreateTime.wMonth, m_stImgCreateTime.wDay,
  1625. m_stImgCreateTime.wHour, m_stImgCreateTime.wMinute, m_stImgCreateTime.wSecond, m_stImgCreateTime.wMilliseconds);
  1626. m_SyncUnit->XWindowOffNotify();
  1627. }
  1628. else if (PANEL_GAIN_FINISH == nParam1)
  1629. {
  1630. FINFO("Panel Status:CALIBRATION_FINISH");
  1631. }
  1632. else if (PANEL_GAIN_PREPARE == nParam1)
  1633. {
  1634. FINFO("Detector Notify Xray Prepare");
  1635. }
  1636. else if (PANEL_GAIN_READY_EXP == nParam1)
  1637. {
  1638. Action_ExpReady();
  1639. }
  1640. else if (PANEL_XRAY_ON == nParam1)
  1641. {
  1642. FINFO("EVT_STATUS_PANEL PANEL_XRAY_ON");
  1643. m_SyncUnit->XrayOnNotify();
  1644. }
  1645. else if (PANEL_XRAY_OFF == nParam1)
  1646. {
  1647. FINFO("EVT_STATUS_PANEL PANEL_XRAY_OFF");
  1648. m_SyncUnit->XrayOffNotify();
  1649. }
  1650. else
  1651. {
  1652. FINFO("Panel {$} Status is :{$}", nID, (int)m_ePanelStatus);
  1653. }
  1654. break;
  1655. }
  1656. case EVT_STATUS_CALIBRATIOIN:
  1657. {
  1658. ENUM_PANEL_EVENT_STATE eStatus = (ENUM_PANEL_EVENT_STATE)nParam1;
  1659. switch (eStatus)
  1660. {
  1661. case PANEL_EVENT_START:
  1662. break;
  1663. case PANEL_EVENT_END_OK:
  1664. FINFO("Calibration process is success");
  1665. SetEvent(m_CompleteCalibrationEvt);
  1666. break;
  1667. case PANEL_EVENT_END_ERROR:
  1668. FINFO("Calibration process is failed");
  1669. break;
  1670. case PANEL_EVENT_TIMEOUT:
  1671. FINFO("Calibration timeout");
  1672. FINFO("Calibration process is failed");
  1673. break;
  1674. case PANEL_EVENT_CALIB_REPORT:
  1675. FINFO("Create Calibration Report failed");
  1676. SetEvent(m_CrateCalibReportEvt);
  1677. break;
  1678. default:
  1679. break;
  1680. }
  1681. break;
  1682. }
  1683. case EVT_STATUS_SAVECALIB:
  1684. {
  1685. if (PANEL_EVENT_START == nParam1)
  1686. {
  1687. FINFO("Begin to Save Calibration Files");
  1688. }
  1689. else if (PANEL_EVENT_END_ERROR == nParam1)
  1690. {
  1691. SetEvent(m_UploadCalibMapOver);
  1692. FINFO("Save Calibration Files failed");
  1693. }
  1694. else if (PANEL_EVENT_END == nParam1)
  1695. {
  1696. SetEvent(m_UploadCalibMapOver);
  1697. FINFO("Save Calibration Files Success");
  1698. }
  1699. break;
  1700. }
  1701. case EVT_STATUS_SAVEDEFECT:
  1702. {
  1703. if (PANEL_EVENT_START == nParam1)
  1704. {
  1705. FINFO("Begin to Save Defect Files");
  1706. }
  1707. else if (PANEL_EVENT_END_ERROR == nParam1)
  1708. {
  1709. SetEvent(m_UploadCalibMapOver);
  1710. FINFO("Save Defect Files failed");
  1711. }
  1712. else if (PANEL_EVENT_END == nParam1)
  1713. {
  1714. FINFO("Save Defect Files Success");
  1715. SetEvent(m_UploadCalibMapOver);
  1716. }
  1717. break;
  1718. }
  1719. case EVT_STATUS_ACQUISITION:
  1720. {
  1721. ENUM_PANEL_EVENT_STATE eStatus = (ENUM_PANEL_EVENT_STATE)nParam1;
  1722. switch (eStatus)
  1723. {
  1724. case PANEL_EVENT_START:
  1725. break;
  1726. case PANEL_EVENT_END_OK:
  1727. break;
  1728. case PANEL_EVENT_END_ERROR: //由于断线造成指令执行失败
  1729. {
  1730. string strWarnErrorCode = ERR_FPD_ACQ_FAILED;//fixbug 12473 开窗失败不用ERR_FPD_RESTART上报
  1731. OnError(strWarnErrorCode);
  1732. break;
  1733. }
  1734. default:
  1735. break;
  1736. }
  1737. break;
  1738. }
  1739. case EVT_STATUS_PREPARE_EDNCALIBRATION:
  1740. break;
  1741. case EVT_STATUS_SINGLEEXP:
  1742. {
  1743. if (DOSE_TOO_HIGH == nParam1)
  1744. {
  1745. FINFO("Dose too high");
  1746. m_strLastError = "Current dose level is too high and beyond the tolerance interval";
  1747. OnError(ERR_FPD_DOSE_HIGH, m_strLastError);
  1748. AbortCalibration();
  1749. }
  1750. else if (DOSE_TOO_LOW == nParam1)
  1751. {
  1752. FINFO("Dose too low");
  1753. m_strLastError = "Current dose level is too low and beyond the tolerance interval";
  1754. OnError(ERR_FPD_DOSE_LOW, m_strLastError);
  1755. AbortCalibration();
  1756. }
  1757. else if (DOSE_OBJECT == nParam1)
  1758. {
  1759. FINFO("Dose object");
  1760. m_strLastError = "Calibration has failed. Please check emergency stop button or calibration switch, otherwise call service.";
  1761. OnError(ERR_FPD_DOSE_OBJ, m_strLastError);
  1762. AbortCalibration();
  1763. }
  1764. else if (DOSE_ACCEPT == nParam1)
  1765. {
  1766. FINFO("Calibration Result is acceptable");
  1767. m_strLastError = "";
  1768. OnErrorX(ERR_FPD_DOSE_LOW);
  1769. OnErrorX(ERR_FPD_DOSE_HIGH);
  1770. OnErrorX(ERR_FPD_DOSE_OBJ);
  1771. SetEvent(m_PauseCalibrationEvt);
  1772. }
  1773. else if (PANEL_EVENT_END_ERROR == nParam1)
  1774. {
  1775. AbortCalibration();
  1776. }
  1777. break;
  1778. }
  1779. case EVT_STATUS_IMAGEPENDING:
  1780. {
  1781. string strTemp = pszMsg;
  1782. if (strTemp.find("true") != std::string::npos)
  1783. {
  1784. m_bImagePendingOrNot = true;
  1785. }
  1786. else
  1787. {
  1788. m_bImagePendingOrNot = false;
  1789. }
  1790. if (m_bImagePendingOrNot) // && !m_bResetDetector
  1791. {
  1792. OnError(ERR_FPD_IMAGE_PENDING);
  1793. }
  1794. else
  1795. {
  1796. m_bResetDetector = false;//可以再次reset
  1797. OnErrorX(ERR_FPD_IMAGE_PENDING);
  1798. }
  1799. break;
  1800. }
  1801. case EVT_STATUS_IMAGERECOVERAUTO:
  1802. {
  1803. OnErrorX(ERR_FPD_IMAGE_PENDING);
  1804. m_RecoverImageStatus["Result"] = "0";
  1805. FINFO("m_RecoverImageStatus[Result] = 0 by auto");
  1806. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  1807. m_bAbortRecover = false; //终止恢复图像的变量也要重置
  1808. m_bRecoveringImage = false; //不再恢复图像过程中
  1809. m_nRecoverImageTimes = 0; //下次恢复图像,重置
  1810. m_bSendRecoverMessage = false; //下次恢复图像仍需判断;
  1811. break;
  1812. }
  1813. case EVT_STATUS_TEMPERATURE:
  1814. {
  1815. float fTemperature = fParam2;
  1816. OnProcessTemperature(nID, fTemperature);
  1817. m_stDeviceConfig.fCurrentTemperValue = fTemperature;
  1818. FINFO("Detector {$} Temperature Value:{$}", nID, fTemperature);
  1819. SendTemperatureValue(fTemperature);
  1820. break;
  1821. }
  1822. case EVT_STATUS_WIFI:
  1823. {
  1824. int nWifiLevel = nParam1;
  1825. FINFO("Detector {$} Wifi Value:{$}", nID, nWifiLevel);
  1826. strWarnErrorCode = ERR_FPD_WIFI_LOW;
  1827. if (nWifiLevel == 0) //WIFI值为0 表明是有线连接,不报错
  1828. {
  1829. OnErrorX(strWarnErrorCode);
  1830. }
  1831. else if (nWifiLevel < m_stDeviceConfig.nWifiLimit)
  1832. {
  1833. //wifi error
  1834. OnWarnX(WAR_FPD_WIFI_LOW);
  1835. OnError(strWarnErrorCode);
  1836. }
  1837. else if (nWifiLevel <= m_stDeviceConfig.nWifiWarning)
  1838. {
  1839. //wifi error
  1840. OnErrorX(strWarnErrorCode);
  1841. strWarnErrorCode = WAR_FPD_WIFI_LOW;
  1842. OnWarn(nID, strWarnErrorCode);
  1843. }
  1844. else
  1845. {
  1846. OnErrorX(strWarnErrorCode);
  1847. strWarnErrorCode = WAR_FPD_WIFI_LOW;
  1848. OnWarnX(strWarnErrorCode);
  1849. }
  1850. if (nWifiLevel != m_stDeviceConfig.nCurrentWifiValue)
  1851. {
  1852. FINFO("Channel:{$},SignalPower:{$},NoisePower:{$},DataRate:{$}",
  1853. m_stDeviceConfig.nWifiChannel, m_stDeviceConfig.nWifiSignalPower, m_stDeviceConfig.nWifiNoisePower, m_stDeviceConfig.nWifiDataRate);
  1854. }
  1855. m_stDeviceConfig.nCurrentWifiValue = nWifiLevel;
  1856. SendWifiValue(nWifiLevel);
  1857. break;
  1858. }
  1859. case EVT_STATUS_BATTERY_VALUE:
  1860. {
  1861. int nBatteryValue = nParam1;
  1862. FINFO("Detector {$} Battery:{$}", nID, nParam1);
  1863. if (nBatteryValue < m_stDeviceConfig.nBatteryLimit)
  1864. {
  1865. if (!m_bBatteryCharging) //如果没有充电;
  1866. {
  1867. strWarnErrorCode = ERR_FPD_BATTERY_LOW;
  1868. OnError(strWarnErrorCode);
  1869. strWarnErrorCode = WAR_FPD_BATTERY_LOW;
  1870. OnWarnX(strWarnErrorCode);
  1871. }
  1872. }
  1873. else if (nBatteryValue < m_stDeviceConfig.nBatteryWarning)
  1874. {
  1875. //battery error
  1876. strWarnErrorCode = ERR_FPD_BATTERY_LOW;
  1877. OnErrorX(strWarnErrorCode);
  1878. strWarnErrorCode = WAR_FPD_BATTERY_LOW;
  1879. //这里需要滤波,如果2次以上都检测到低于告警值才上报该警告
  1880. OnWarn(nID, strWarnErrorCode);
  1881. }
  1882. else
  1883. {
  1884. strWarnErrorCode = ERR_FPD_BATTERY_LOW;
  1885. OnErrorX(strWarnErrorCode);
  1886. strWarnErrorCode = WAR_FPD_BATTERY_LOW;
  1887. OnWarnX(strWarnErrorCode);
  1888. }
  1889. m_stDeviceConfig.nCurrentBatteryValue = nBatteryValue;
  1890. FINFO("Detector {$} Battery Value:{$}", nID, nBatteryValue);
  1891. if (nBatteryValue < m_stDeviceConfig.nBatteryWarning)
  1892. {
  1893. //防止探测器电池电量状态异常跳变
  1894. SendBatteryValue(nBatteryValue);
  1895. }
  1896. else
  1897. {
  1898. SendBatteryValue(nBatteryValue);
  1899. }
  1900. break;
  1901. }
  1902. case EVT_STATUS_BATTERY_CHARGING:
  1903. {
  1904. string strTemp = pszMsg;
  1905. if (strTemp.find("true") != std::string::npos)
  1906. {
  1907. m_bBatteryCharging = true;
  1908. }
  1909. else
  1910. {
  1911. m_bBatteryCharging = false;
  1912. }
  1913. break;
  1914. }
  1915. case EVT_STATUS_SHOCK_SENSOR:
  1916. {
  1917. m_nShockCounts = nParam1;
  1918. string strWarn = WAR_FPD_MAX_SHOCK_NUM;
  1919. FINFO("Panel {$} Shock Sensor Number:{$}", nID, m_nShockCounts);
  1920. if ((m_nShockCounts >= m_stDeviceConfig.nMaxShockNumber) && (m_stDeviceConfig.nShockTimes != m_nShockCounts))//避免频繁发送
  1921. {
  1922. FINFO("Reach Max Shock Sensor Number");
  1923. OnWarn(nID, strWarn);
  1924. }
  1925. else
  1926. {
  1927. OnWarnX(strWarn);
  1928. }
  1929. m_stDeviceConfig.nShockTimes = m_nShockCounts;
  1930. break;
  1931. }
  1932. case EVT_STATUS_HALL_SENSOR:
  1933. {
  1934. int nWorkstaion = nParam1;
  1935. FINFO("Update Hall Status : {$} ", nWorkstaion);
  1936. FINFO("Panel {$} WS:{$},Current OGP WS:{$} ", nID, nWorkstaion, m_nWorkStation);
  1937. m_stDeviceConfig.nWorkstation = nWorkstaion;
  1938. break;
  1939. }
  1940. case EVT_STATUS_PING:
  1941. {
  1942. break;
  1943. }
  1944. case EVT_STATUS_PMSNOTOPEN:
  1945. {
  1946. string strTemp = pszMsg;
  1947. if (strTemp.find("true") != std::string::npos)
  1948. {
  1949. FINFO("PMS isn't open");
  1950. }
  1951. break;
  1952. }
  1953. case EVT_STATUS_RESTOREFILES:
  1954. {
  1955. string strTemp = pszMsg;
  1956. FINFO("Restore calibration files");
  1957. break;
  1958. }
  1959. case EVT_STATUS_LASTERROR:
  1960. {
  1961. m_strLastError = pszMsg;
  1962. FINFO("Panel {$} LastError {$}", nID, pszMsg);
  1963. break;
  1964. }
  1965. case EVT_STATUS_RESET:
  1966. break;
  1967. default:
  1968. break;
  1969. }
  1970. }
  1971. //保存RAW图数据
  1972. void nsFPD::FPDDeviceYuying::SaveRawImage(const char* pImgName, const WORD* pRawImg, int nWidth, int nHeight)
  1973. {
  1974. FINFO("Begin SaveRawImage: {$}, width: {$}, height: {$}", pImgName, nWidth, nHeight);
  1975. if (pRawImg == nullptr || pImgName == nullptr)
  1976. {
  1977. FERROR("Undefined parameter");
  1978. return;
  1979. }
  1980. string strImagePath = m_strWorkPath + "\\Image\\" + pImgName;
  1981. FILE* fp;
  1982. if ((fp = fopen(strImagePath.c_str(), "wb")) == nullptr)
  1983. {
  1984. DWORD dw = GetLastError();
  1985. FERROR("fopen {$} failed, {$}", strImagePath.c_str(), dw);
  1986. return;
  1987. }
  1988. fwrite(pRawImg, sizeof(WORD), nWidth * nHeight, fp);
  1989. fclose(fp);
  1990. FINFO("End SaveRawImage");
  1991. return;
  1992. }
  1993. void nsFPD::FPDDeviceYuying::OnEventProcessData(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  1994. {
  1995. switch (nEventID)
  1996. {
  1997. case EVT_DATA_RAW_IMAGE:
  1998. {
  1999. FINFO("Image Arrved");
  2000. if (APP_STATUS_IDLE == m_eAppStatus)
  2001. {
  2002. FERROR("Omit Image in Idle Status");
  2003. return;
  2004. }
  2005. FINFO("Currenct FPD RawImage Width: {$}, FullImage Height: {$}", m_nRawImgWidth, m_nRawImgHeight);
  2006. float fImageReferUGY = 2.5;
  2007. if (nullptr == m_pwRawImageData)
  2008. {
  2009. m_pwRawImageData = new WORD[m_nRawImgWidth * m_nRawImgHeight];
  2010. }
  2011. memcpy(m_pwRawImageData, pParam, m_nRawImgWidth * m_nRawImgHeight * sizeof(WORD));
  2012. if (m_bSaveRaw)
  2013. {
  2014. SaveRawImage("YuyingSDK.raw", m_pwRawImageData, m_nRawImgWidth, m_nRawImgHeight);
  2015. }
  2016. OnProcessImage(m_pwRawImageData, m_stDeviceConfig.nFullImageWidth, m_stDeviceConfig.nFullImageHeight, fImageReferUGY);
  2017. break;
  2018. }
  2019. case EVT_DATA_PREVIEW_IMAGE:
  2020. {
  2021. FINFO("Preview Image Arrved");
  2022. m_SyncUnit->ImageReadingNotify();
  2023. if (nullptr == m_pwPreviewImg)
  2024. {
  2025. m_pwPreviewImg = new WORD[m_stDeviceConfig.nPreviewWidth * m_stDeviceConfig.nPreviewHeight];
  2026. }
  2027. memcpy(m_pwPreviewImg, pParam, m_stDeviceConfig.nPreviewWidth * m_stDeviceConfig.nPreviewHeight * sizeof(WORD));
  2028. OnProcessPreviewImage(m_pwPreviewImg, m_stDeviceConfig.nPreviewWidth, m_stDeviceConfig.nPreviewHeight);
  2029. break;
  2030. }
  2031. case EVT_DATA_DOSEPARAM:
  2032. {
  2033. m_fDoseParam = nParam1;// static_cast<int>(fParam2 * 1000);
  2034. FINFO("calibration dose {$}, Param1 {$}", m_fDoseParam, nParam1);
  2035. SetEvent(m_WaitCalibDoseEvt);
  2036. break;
  2037. }
  2038. default:
  2039. break;
  2040. }
  2041. }
  2042. void nsFPD::FPDDeviceYuying::OnEventProcessError(int nDetectorID, int nEventID, int nEventLevel, const char* pszMsg, int nParam1, float fParam2, int nPtrParamLen, void* pParam)
  2043. {
  2044. string strErrorName = "";
  2045. switch (nEventID)
  2046. {
  2047. case EVT_ERR_COMMUNICATE:
  2048. {
  2049. strErrorName = ERR_FPD_DISCONNECT;
  2050. string strTemp = pszMsg;
  2051. if (strTemp.find("true") != std::string::npos)
  2052. {
  2053. m_stDeviceConfig.nWorkstation = -1;
  2054. m_stDeviceConfig.bConnectStatus = false;
  2055. m_nBatteryCapacity = 0;
  2056. m_stDeviceConfig.nCurrentWifiValue = 0;
  2057. m_stDeviceConfig.nCurrentBatteryValue = 0;
  2058. SendWifiValue(0);
  2059. SendBatteryValue(0);
  2060. //fix 断开连接时温度保留当前值,清除温度相关告警信息
  2061. ProcessTempreatureOnLostCommunicate();
  2062. OnError(strErrorName);
  2063. }
  2064. else if (strTemp.find("false") != std::string::npos)//成功时交给WIFI发送SendDetectorInfo
  2065. {
  2066. if (m_stDeviceConfig.nCurrentWifiValue != -1)
  2067. {
  2068. SendWifiValue(m_stDeviceConfig.nCurrentWifiValue);
  2069. SendBatteryValue(m_stDeviceConfig.nCurrentBatteryValue);
  2070. SendTemperatureValue(m_stDeviceConfig.fCurrentTemperValue);
  2071. }
  2072. m_stDeviceConfig.bConnectStatus = true;
  2073. OnErrorX(strErrorName);
  2074. OnErrorX(ERR_FPD_ACQ_FAILED);//fixbug 12473 开窗失败不用ERR_FPD_RESTART上报
  2075. }
  2076. break;
  2077. }
  2078. case EVT_ERR_EXP_REQUEST:
  2079. {
  2080. string strTemp = pszMsg;
  2081. if (strTemp.find("true") == std::string::npos)
  2082. {
  2083. return;
  2084. }
  2085. strErrorName = ERR_FPD_ACQ_FAILED;
  2086. break;
  2087. }
  2088. case EVT_ERR_GET_IMAGE:
  2089. {
  2090. string strTemp = pszMsg;
  2091. if (strTemp.find("true") != std::string::npos)
  2092. {
  2093. if (APP_STATUS_WORK_BEGIN != m_eAppStatus) //如果不在检查界面;
  2094. {
  2095. FWARN("there are image exist in current detector,do you want to continue");
  2096. }
  2097. else
  2098. {
  2099. FWARN("FPD has exposed Image!");
  2100. CallSiemensRecoverAction(true);
  2101. }
  2102. }
  2103. else if (strTemp.find("false") != std::string::npos)
  2104. {
  2105. if (m_bRecoveringImage)
  2106. {
  2107. CallSiemensRecoverAction(false);
  2108. }
  2109. else
  2110. {
  2111. m_bAbortRecover = false; //终止恢复图像的变量也要重置
  2112. m_bRecoveringImage = false; //不再恢复图像过程中
  2113. m_nRecoverImageTimes = 0; //下次恢复图像,重置
  2114. m_bSendRecoverMessage = false; //下次恢复图像仍需判断;
  2115. }
  2116. }
  2117. break;
  2118. }
  2119. case EVT_ERR_MAX_NUMBER:
  2120. {
  2121. strErrorName = ERR_FPD_MAX_NUMBER;
  2122. string strTemp = pszMsg;
  2123. if (strTemp.find("true") != std::string::npos)
  2124. {
  2125. FERROR("Exceed max number");
  2126. OnError(strErrorName);
  2127. }
  2128. break;
  2129. }
  2130. case EVT_ERR_SN_NOTINLIST:
  2131. {
  2132. strErrorName = ERR_FPD_SN_NOT_LIST;
  2133. FERROR("Not in List");
  2134. string strTemp = pszMsg;
  2135. if (strTemp.find("true") != std::string::npos)
  2136. {
  2137. OnError(strErrorName);
  2138. }
  2139. break;
  2140. }
  2141. case EVT_ERR_POWER_OFF:
  2142. {
  2143. strErrorName = ERR_FPD_POWEROFF;
  2144. string strTemp = pszMsg;
  2145. if (strTemp.find("true") != std::string::npos)
  2146. {
  2147. ProcessTempreatureOnLostCommunicate();
  2148. OnError(strErrorName);
  2149. m_stDeviceConfig.bConnectStatus = false;
  2150. }
  2151. else if (strTemp.find("false") != std::string::npos)
  2152. {
  2153. OnErrorX(strErrorName);
  2154. }
  2155. break;
  2156. }
  2157. case EVT_ERR_INIT_FAILED:
  2158. {
  2159. strErrorName = ERR_FPD_FATAL_ERROR;
  2160. string strTemp = pszMsg;
  2161. if (strTemp.find("true") != std::string::npos)
  2162. {
  2163. OnError(strErrorName);
  2164. m_stDeviceConfig.bConnectStatus = false;
  2165. }
  2166. else if (strTemp.find("false") != std::string::npos)
  2167. {
  2168. OnErrorX(strErrorName);
  2169. }
  2170. break;
  2171. }
  2172. default:
  2173. break;
  2174. }
  2175. }
  2176. bool nsFPD::FPDDeviceYuying::OnInitResult(bool bSuccess)
  2177. {
  2178. if (bSuccess)
  2179. {
  2180. m_stDeviceConfig.bConnectStatus = true;
  2181. m_stDeviceConfig.bInitOK = true;
  2182. }
  2183. else
  2184. {
  2185. m_stDeviceConfig.bConnectStatus = false;
  2186. }
  2187. m_stDeviceConfig.bExisted = true;
  2188. auto temperuperror = m_stDeviceConfig.fTemperMaxLimit;
  2189. auto temperlowerror = m_stDeviceConfig.fTemperMinLimit;
  2190. auto temperupwarn = m_stDeviceConfig.fTemperUpLimit;
  2191. auto temperlowwarn = m_stDeviceConfig.fTemperLowLimit;
  2192. if (m_Temperature)
  2193. {
  2194. m_Temperature->SetTemperatureErrorMax(to_string(temperuperror));
  2195. m_Temperature->SetTemperatureWarningMax(to_string(temperupwarn));
  2196. m_Temperature->SetTemperatureCalibWarningMax(to_string(m_CalTemperupWarn));
  2197. m_Temperature->SetTemperatureCalibWarningMin(to_string(m_CalTemperlowWarn));
  2198. m_Temperature->SetTemperatureWarningMin(to_string(temperlowwarn));
  2199. m_Temperature->SetTemperatureErrorMin(to_string(temperlowerror));
  2200. }
  2201. auto wifiWarning = m_stDeviceConfig.nWifiWarning;
  2202. auto wifiError = m_stDeviceConfig.nWifiLimit;
  2203. if (m_Wifi)
  2204. {
  2205. m_Wifi->SetSignalWarningMin(to_string(wifiWarning));
  2206. m_Wifi->SetSignalErrorMin(to_string(wifiError));
  2207. }
  2208. return true;
  2209. }
  2210. //-----------------------------------------------------------------------------
  2211. //
  2212. // 函数名称 : CheckCalibartionDue
  2213. // 函数描述 : 检查校正文件是否过期
  2214. // 返回类型 : 过期true or false
  2215. // 接口参数 :
  2216. //
  2217. //-----------------------------------------------------------------------------
  2218. bool nsFPD::FPDDeviceYuying::CheckCalibartionDue()
  2219. {
  2220. FINFO("[Checking Calibration Date]");
  2221. string strWarn = WAR_FPD_LOAD_CORRECT_FILE;
  2222. if (!m_CalibProcess->CheckCalibartionDue(m_stDeviceConfig))
  2223. {
  2224. OnWarn(m_nDeviceIndex, strWarn);
  2225. return false;
  2226. }
  2227. OnWarnX(strWarn);
  2228. FINFO("[Calibration File is Normal]");
  2229. return true;
  2230. }
  2231. bool nsFPD::FPDDeviceYuying::LoadSensitivity()
  2232. {
  2233. FINFO("Load Sensitivity.txt");
  2234. string strTemp = m_stDeviceConfig.strPanelSerial + "_Sensitivity.txt";
  2235. string strPath = m_strWorkPath + "\\references\\" + strTemp;
  2236. char* pszSensitivity = nullptr;
  2237. FILE* pFile;
  2238. if ((pFile = fopen(strPath.c_str(), "rb")) == nullptr)
  2239. {
  2240. FINFO("Read {$} File FERROR", strPath.c_str());
  2241. return false;
  2242. }
  2243. FINFO("Open {$} over", strPath.c_str());
  2244. fseek(pFile, 0, SEEK_END); ///将文件指针移动文件结尾
  2245. long nLen = ftell(pFile); ///求出当前文件指针距离文件开始的字节数
  2246. FINFO("Length is :{$}", nLen);
  2247. pszSensitivity = new char[nLen + 1];
  2248. memset(pszSensitivity, 0, nLen + 1);
  2249. fseek(pFile, 0, SEEK_SET); ///将文件指针移动文件头
  2250. size_t rLen = fread(pszSensitivity, (size_t)1, nLen, pFile);
  2251. FINFO("read Length is :{$} {$}", rLen, pszSensitivity);
  2252. if (rLen != nLen)
  2253. {
  2254. delete[] pszSensitivity;
  2255. fclose(pFile);
  2256. FINFO("Read Sensitivity info FERROR");
  2257. return false;
  2258. }
  2259. fclose(pFile);
  2260. m_fFactorEXI2UGY = (float)atof(pszSensitivity);
  2261. auto strSensitivity = std::to_string(m_fFactorEXI2UGY);
  2262. m_DetectorCtrlUnit->SetFPDSensitivity(strSensitivity);
  2263. FINFO("Sensitivity is :{$}", m_fFactorEXI2UGY);
  2264. if (pszSensitivity)
  2265. {
  2266. delete[] pszSensitivity;
  2267. pszSensitivity = nullptr;
  2268. }
  2269. FINFO("Read Sensitivity Over");
  2270. return true;
  2271. }
  2272. RET_STATUS nsFPD::FPDDeviceYuying::SaveSensitivity()
  2273. {
  2274. FINFO("Save Sensitivity");
  2275. FINFO("SaveSensitivity DoNothing");
  2276. return RET_STATUS::RET_SUCCEED;
  2277. }
  2278. //预览图
  2279. bool nsFPD::FPDDeviceYuying::OnProcessPreviewImage(WORD* pwRawImage, int nWidth, int nHeight)
  2280. {
  2281. FINFO("Currenct PreviewImage Width: {$}, Height: {$}", nWidth, nHeight);
  2282. if (m_stDeviceConfig.nSaveRaw > 1)
  2283. {
  2284. SaveRawImage("PreviewImage.raw", pwRawImage, nWidth, nHeight);
  2285. }
  2286. PrevImageDateArrived(pwRawImage);
  2287. FINFO("Write PreviewImage Over");
  2288. return true;
  2289. }
  2290. //大图
  2291. bool nsFPD::FPDDeviceYuying::OnProcessImage(WORD* pwRawImage, int nImageWidth, int nImageHeight, float fImageReferUGY)
  2292. {
  2293. FINFO("Process Full Image");
  2294. FINFO("Image EXI2UGY factor:{$},Image Refer UGY: {$}", m_fFactorEXI2UGY, fImageReferUGY);
  2295. pwRawImage[0] = 65535;
  2296. //图像预处理完成
  2297. FullImageDateArrived(pwRawImage);
  2298. FINFO("Write Frame Over");
  2299. return true;
  2300. }
  2301. /***************************************************************
  2302. 功能:将原始尺寸的图像裁剪为有效尺寸的图像
  2303. [IN][OUT]:pOutImg 有效尺寸图像信息
  2304. [IN]:pInImgData 原始尺寸图像数据
  2305. [IN]:nInWidth 原始尺寸图像的宽度
  2306. [IN]:nUpHeightOffset 要裁剪的上边高度
  2307. [IN]:nLeftWidthOffset要裁剪的左边宽度
  2308. ************************************************************/
  2309. bool nsFPD::FPDDeviceYuying::GetEffectiveImage(WORD* pwInImgData, int nRawImageWidth)
  2310. {
  2311. if (pwInImgData == nullptr)
  2312. {
  2313. return false;
  2314. }
  2315. if (!m_pwFullImageData)
  2316. {
  2317. FINFO("Full ImgHeight:{$},Full ImgWidth:{$}", m_stDeviceConfig.nFullImageWidth, m_stDeviceConfig.nFullImageHeight);
  2318. m_pwFullImageData = new WORD[m_stDeviceConfig.nFullImageWidth * m_stDeviceConfig.nFullImageHeight];
  2319. }
  2320. memcpy(m_pwFullImageData, pwInImgData, m_stDeviceConfig.nFullImageWidth * m_stDeviceConfig.nFullImageHeight * sizeof(WORD));
  2321. return true;
  2322. }
  2323. void nsFPD::FPDDeviceYuying::OnProcessTemperature(int nID, float fTemperature)
  2324. {
  2325. string strWarnErrorCode = "";
  2326. auto lowerror = m_stDeviceConfig.fTemperMinLimit;
  2327. auto uperror = m_stDeviceConfig.fTemperMaxLimit;
  2328. auto lowwarn = m_stDeviceConfig.fTemperLowLimit;
  2329. auto upwarn = m_stDeviceConfig.fTemperUpLimit;
  2330. auto calupwarn = m_CalTemperupWarn;
  2331. auto callowwarn = m_CalTemperlowWarn;
  2332. //should be lowerror < lowwarn < callowwarn < calupwarn < upwarn < uperror
  2333. m_stDeviceConfig.nTemperatureStatus = TEMP_NORMAL;
  2334. if (fTemperature > callowwarn && fTemperature < calupwarn)
  2335. {
  2336. //normal,clear all warns&errors
  2337. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2338. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2339. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2340. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2341. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2342. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2343. }
  2344. else if ((fTemperature <= callowwarn && fTemperature > lowwarn)
  2345. || (fTemperature >= calupwarn && fTemperature < upwarn)
  2346. )
  2347. {
  2348. //out of cal range
  2349. FINFO("Exceed Calibration Temperature");
  2350. m_stDeviceConfig.nTemperatureStatus = TEMP_WARNING;
  2351. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2352. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2353. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2354. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2355. strWarnErrorCode = WAR_FPD_EXCEED_CALB_TEMPER_HIGH;
  2356. if (fTemperature <= callowwarn && fTemperature > lowwarn)
  2357. {
  2358. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2359. strWarnErrorCode = WAR_FPD_EXCEED_CALB_TEMPER_LOW;
  2360. }
  2361. else
  2362. {
  2363. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2364. }
  2365. OnWarn(nID, strWarnErrorCode);
  2366. }
  2367. else if (fTemperature > lowerror && fTemperature <= lowwarn)
  2368. {
  2369. //low warn
  2370. FINFO("Exceed Temperature Low Warning");
  2371. m_stDeviceConfig.nTemperatureStatus = TEMP_WARNING;
  2372. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2373. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2374. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2375. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2376. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2377. strWarnErrorCode = WAR_FPD_TEMPERTURE_LOW;
  2378. OnWarn(nID, strWarnErrorCode);
  2379. }
  2380. else if (fTemperature <= lowerror)
  2381. {
  2382. //low error
  2383. FINFO("Exceed Min Temperature");
  2384. m_stDeviceConfig.nTemperatureStatus = TEMP_TOO_LOW;
  2385. if (m_stDeviceConfig.bActived)
  2386. {
  2387. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2388. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2389. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2390. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2391. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2392. strWarnErrorCode = ERR_FPD_TEMPLOW_NOT_ACQ;
  2393. OnError(strWarnErrorCode);
  2394. }
  2395. }
  2396. else if (fTemperature >= upwarn && fTemperature < uperror)
  2397. {
  2398. //up warn
  2399. FINFO("Exceed Temperature High Warning");
  2400. m_stDeviceConfig.nTemperatureStatus = TEMP_WARNING;
  2401. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2402. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2403. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2404. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2405. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2406. strWarnErrorCode = WAR_FPD_TEMPERATURE_HIGH;
  2407. OnWarn(nID, strWarnErrorCode);
  2408. }
  2409. else if (fTemperature >= uperror)
  2410. {
  2411. //up error
  2412. FINFO("Exceed Max Temperature");
  2413. m_stDeviceConfig.nTemperatureStatus = TEMP_TOO_HIGH;
  2414. if (m_stDeviceConfig.bActived)
  2415. {
  2416. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2417. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2418. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2419. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2420. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2421. strWarnErrorCode = ERR_FPD_TEMPHIGH_NOT_ACQ;
  2422. OnError(strWarnErrorCode);
  2423. }
  2424. }
  2425. }
  2426. void nsFPD::FPDDeviceYuying::Action_ExpReady()
  2427. {
  2428. m_SyncUnit->FPDReadyNotify(true);
  2429. }
  2430. bool nsFPD::FPDDeviceYuying::SaveConfigFile(bool bSendNotify)
  2431. {
  2432. m_DetectorConfiguration->SaveConfig();
  2433. FINFO("SaveConfigFile over");
  2434. return true;
  2435. }
  2436. RET_STATUS nsFPD::FPDDeviceYuying::SetSID(int nSID)
  2437. {
  2438. if (nSID < 0 || nSID>200)
  2439. {
  2440. return RET_STATUS::RET_INVALID;
  2441. }
  2442. m_stDeviceConfig.nSID = nSID;
  2443. return RET_STATUS::RET_SUCCEED;
  2444. }
  2445. RET_STATUS nsFPD::FPDDeviceYuying::GetRecoverImageState(string& RCI)
  2446. {
  2447. FINFO("GetRecoverImageState");
  2448. m_bSendRecoverMessage = true;
  2449. RCI = m_RecoverImageStatus.encode();
  2450. return RET_STATUS::RET_SUCCEED;
  2451. }
  2452. RET_STATUS nsFPD::FPDDeviceYuying::RecoverImage(bool bRecoverIt)
  2453. {
  2454. FINFO("Recover Image {$}", bRecoverIt);
  2455. m_bUIConfirmRecover = true;
  2456. int nRecoverOrNot = 0;
  2457. if (bRecoverIt)
  2458. {
  2459. nRecoverOrNot = 1;
  2460. }
  2461. if (nRecoverOrNot != 0)
  2462. {
  2463. string strResult = (string)m_RecoverImageStatus["Result"];
  2464. if (strResult == "0")
  2465. {
  2466. FINFO("already recover success,just return");
  2467. return RET_STATUS::RET_SUCCEED;
  2468. }
  2469. m_RecoverImageStatus["Result"] = "1";
  2470. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  2471. if (!(g_pYuyingCtrl)->RecoverLastImage())
  2472. {
  2473. m_RecoverImageStatus["Result"] = "2";
  2474. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  2475. m_bUIConfirmRecover = false;
  2476. }
  2477. m_nRecoverImageTimes++;
  2478. }
  2479. else
  2480. {
  2481. FINFO("Abort Recovering Image");
  2482. m_bAbortRecover = true; //终止恢复图像的变量也要重置
  2483. m_bRecoveringImage = false; //不再恢复图像过程中
  2484. m_nRecoverImageTimes = 0; //下次恢复图像,重置
  2485. m_bSendRecoverMessage = false; //下次恢复图像仍需判断;
  2486. if (m_stDeviceConfig.bConnectStatus)
  2487. {
  2488. if (m_bImagePendingOrNot)
  2489. {
  2490. OnError(ERR_FPD_IMAGE_PENDING);
  2491. }
  2492. else
  2493. {
  2494. OnErrorX(ERR_FPD_IMAGE_PENDING);
  2495. }
  2496. }
  2497. else
  2498. {
  2499. OnError(ERR_FPD_IMAGE_PENDING);
  2500. OnError(ERR_FPD_DISCONNECT);
  2501. }
  2502. }
  2503. return RET_STATUS::RET_SUCCEED;
  2504. }
  2505. bool nsFPD::FPDDeviceYuying::CallSiemensRecoverAction(bool bErrorResult)
  2506. {
  2507. string strRecoverInfo = "";
  2508. if (bErrorResult)
  2509. {
  2510. if (m_bAbortRecover)
  2511. {
  2512. FINFO("Recover Image is Cancelled");
  2513. return true;
  2514. }
  2515. SendWifiValue(0);
  2516. SendBatteryValue(0);
  2517. SendTemperatureValue(ABS_ZERO_TEMPERATURE);
  2518. if (!m_bRecoveringImage)
  2519. {
  2520. m_RecoverImageStatus["Result"] = "-1";//新的imagerecover流程开始,防止之前成功recover过,上层查询状态引发误解
  2521. m_DetectorCtrlUnit->SetRecoverImageEvent("0");
  2522. OnError(ERR_FPD_IMAGE_PENDING);
  2523. m_bRecoveringImage = true;
  2524. m_bUIConfirmRecover = false;
  2525. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  2526. FINFO("SetRecoverImageEvent");
  2527. return true;
  2528. }
  2529. m_RecoverImageStatus["Result"] = "2";
  2530. }
  2531. else
  2532. {
  2533. m_bAbortRecover = false; //终止恢复图像的变量也要重置
  2534. m_bRecoveringImage = false; //不再恢复图像过程中
  2535. m_nRecoverImageTimes = 0; //下次恢复图像,重置
  2536. m_bSendRecoverMessage = false; //下次恢复图像仍需判断;
  2537. if (m_bUIConfirmRecover)
  2538. {
  2539. FINFO("Recover Image Success");
  2540. m_RecoverImageStatus["Result"] = "0";
  2541. FINFO("m_RecoverImageStatus[Result] = 0");
  2542. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  2543. m_bUIConfirmRecover = false;
  2544. FINFO("send RecoverImageState over");
  2545. }
  2546. else
  2547. {
  2548. m_RecoverImageStatus["Result"] = "3";
  2549. FINFO("m_RecoverImageStatus[Result] = 3");
  2550. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  2551. FWARN("UI do not confirm, image have been abandoned");
  2552. m_RecoverImageStatus["Result"] = "0";
  2553. m_AcqUnit->SendNoNeedWaitImage(true);
  2554. }
  2555. return true;
  2556. }
  2557. FINFO("CallSiemensRecoverAction {$}", m_RecoverImageStatus.encode());
  2558. if (m_bSendRecoverMessage)
  2559. {
  2560. if (m_bUIConfirmRecover)
  2561. {
  2562. m_DetectorCtrlUnit->SetRecoverImageState(m_RecoverImageStatus.encode());
  2563. m_bUIConfirmRecover = false;
  2564. FINFO("send RecoverImageState over");
  2565. }
  2566. else
  2567. {
  2568. FWARN("UI do not confirm omit send result");
  2569. }
  2570. }
  2571. return true;
  2572. }
  2573. string nsFPD::FPDDeviceYuying::MakeImageHead(IMAGE_VIEW_TYPE Type)
  2574. {
  2575. if (Type == IMAGE_FULL)
  2576. {
  2577. if (m_pFullImageHead == nullptr)
  2578. {
  2579. m_pFullImageHead = new ResDataObject;
  2580. ResDataObject json;
  2581. json.add(SM_IMAGE_TYPE, (int)Type);
  2582. json.add(SM_IMAGE_WIDTH, m_stDeviceConfig.nFullImageWidth);
  2583. json.add(SM_IMAGE_HEIGHT, m_stDeviceConfig.nFullImageHeight);
  2584. json.add(SM_IMAGE_BIT, 16);
  2585. json.add(SM_IMAGE_TAG, 1);
  2586. json.add(SM_IMAGE_INDEX, 1);
  2587. json.add(SM_IMAGE_YEAR, m_stImgCreateTime.wYear);
  2588. json.add(SM_IMAGE_MONTH, m_stImgCreateTime.wMonth);
  2589. json.add(SM_IMAGE_DAY, m_stImgCreateTime.wDay);
  2590. json.add(SM_IMAGE_HOUR, m_stImgCreateTime.wHour);
  2591. json.add(SM_IMAGE_MINUTE, m_stImgCreateTime.wMinute);
  2592. json.add(SM_IMAGE_SEC, m_stImgCreateTime.wSecond);
  2593. json.add(SM_IMAGE_MILLSEC, m_stImgCreateTime.wMilliseconds);
  2594. json.add(SM_IMAGE_LSB, "5000");
  2595. json.add(SM_IMAGE_DOSE, m_stDeviceConfig.nDoseOfEXI);
  2596. json.add(SM_IMAGE_PIXELREPRESENTATION, "0");
  2597. json.add(SM_IMAGE_PIXELSPACING, m_stDeviceConfig.nPixelSpace);
  2598. json.add(SM_IMAGE_ROTATION, "No");
  2599. json.add(SM_IMAGE_FLIP, "No");
  2600. json.add(SM_IMAGE_ORIGINX, "0");
  2601. json.add(SM_IMAGE_ORIGINY, "0");
  2602. json.add(SM_IMAGE_EXI2UGY, m_fFactorEXI2UGY);
  2603. json.add(SM_IMAGE_TEMP, m_stDeviceConfig.fCurrentTemperValue);
  2604. m_pFullImageHead->add(SM_IMAGE_HEAD, json);
  2605. }
  2606. else
  2607. {
  2608. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_YEAR] = m_stImgCreateTime.wYear;
  2609. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_MONTH] = m_stImgCreateTime.wMonth;
  2610. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_DAY] = m_stImgCreateTime.wDay;
  2611. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_HOUR] = m_stImgCreateTime.wHour;
  2612. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_MINUTE] = m_stImgCreateTime.wMinute;
  2613. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_SEC] = m_stImgCreateTime.wSecond;
  2614. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_MILLSEC] = m_stImgCreateTime.wMilliseconds;
  2615. (*m_pFullImageHead)[SM_IMAGE_HEAD][SM_IMAGE_TEMP] = m_stDeviceConfig.fCurrentTemperValue;
  2616. }
  2617. return (*m_pFullImageHead).encode();
  2618. }
  2619. else
  2620. {
  2621. if (m_pPreviewImageHead == nullptr)
  2622. {
  2623. m_pPreviewImageHead = new ResDataObject;
  2624. ResDataObject json;
  2625. json.add(SM_IMAGE_TYPE, (int)Type);
  2626. json.add(SM_IMAGE_WIDTH, m_stDeviceConfig.nPreviewWidth);
  2627. json.add(SM_IMAGE_HEIGHT, m_stDeviceConfig.nPreviewHeight);
  2628. json.add(SM_IMAGE_BIT, 16);
  2629. json.add(SM_IMAGE_TAG, 1);
  2630. json.add(SM_IMAGE_INDEX, 1);
  2631. json.add(SM_IMAGE_YEAR, m_stImgCreateTime.wYear);
  2632. json.add(SM_IMAGE_MONTH, m_stImgCreateTime.wMonth);
  2633. json.add(SM_IMAGE_DAY, m_stImgCreateTime.wDay);
  2634. json.add(SM_IMAGE_HOUR, m_stImgCreateTime.wHour);
  2635. json.add(SM_IMAGE_MINUTE, m_stImgCreateTime.wMinute);
  2636. json.add(SM_IMAGE_SEC, m_stImgCreateTime.wSecond);
  2637. json.add(SM_IMAGE_MILLSEC, m_stImgCreateTime.wMilliseconds);
  2638. json.add(SM_IMAGE_LSB, "5000");
  2639. json.add(SM_IMAGE_DOSE, m_stDeviceConfig.nDoseOfEXI);
  2640. json.add(SM_IMAGE_ROTATION, "No");
  2641. json.add(SM_IMAGE_FLIP, "No");
  2642. json.add(SM_IMAGE_ORIGINX, "0");
  2643. json.add(SM_IMAGE_ORIGINY, "0");
  2644. json.add(SM_IMAGE_PIXELSPACING, m_stDeviceConfig.nPixelSpace);
  2645. json.add(SM_IMAGE_PIXELREPRESENTATION, "0");
  2646. json.add(SM_IMAGE_TEMP, m_stDeviceConfig.fCurrentTemperValue);
  2647. m_pPreviewImageHead->add(SM_IMAGE_HEAD, json);
  2648. }
  2649. else
  2650. {
  2651. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_YEAR] = m_stImgCreateTime.wYear;
  2652. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_MONTH] = m_stImgCreateTime.wMonth;
  2653. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_DAY] = m_stImgCreateTime.wDay;
  2654. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_HOUR] = m_stImgCreateTime.wHour;
  2655. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_MINUTE] = m_stImgCreateTime.wMinute;
  2656. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_SEC] = m_stImgCreateTime.wSecond;
  2657. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_MILLSEC] = m_stImgCreateTime.wMilliseconds;
  2658. (*m_pPreviewImageHead)[SM_IMAGE_HEAD][SM_IMAGE_TEMP] = m_stDeviceConfig.fCurrentTemperValue;
  2659. }
  2660. return (*m_pPreviewImageHead).encode();
  2661. }
  2662. return "";
  2663. }
  2664. RET_STATUS nsFPD::FPDDeviceYuying::AddFrameWithRawHead(IMAGE_VIEW_TYPE Type, WORD* pFrameBuff, DWORD FrameSize)
  2665. {
  2666. string strImageHead = MakeImageHead(Type);
  2667. return m_AcqUnit->AddFrameWithRawHead(Type, strImageHead, pFrameBuff, FrameSize);
  2668. }
  2669. void nsFPD::FPDDeviceYuying::ClearAllError()
  2670. {
  2671. m_WarnAndError->ClearAllError();
  2672. }
  2673. void nsFPD::FPDDeviceYuying::SyncErrorList()
  2674. {
  2675. if (m_WarnAndError)
  2676. {
  2677. m_WarnAndError->SyncErrorList();
  2678. }
  2679. }
  2680. void nsFPD::FPDDeviceYuying::OnErrorX(string strErrCode)
  2681. {
  2682. bool bExit = false;
  2683. if (m_WarnAndError->IsErrorExist(strErrCode))
  2684. {
  2685. bExit = true;
  2686. }
  2687. m_WarnAndError->OnErrorX(strErrCode);
  2688. }
  2689. void nsFPD::FPDDeviceYuying::OnError(string strErrCode, string strErr)
  2690. {
  2691. string strBackCom = "";
  2692. m_WarnAndError->OnError(strErrCode, strErr);
  2693. }
  2694. void nsFPD::FPDDeviceYuying::OnWarn(int nIndex, string strWarnCode, string strWarn)
  2695. {
  2696. m_WarnAndError->OnWarn(strWarnCode, strWarn);
  2697. }
  2698. void nsFPD::FPDDeviceYuying::OnWarnX(string strWarnCode)
  2699. {
  2700. m_WarnAndError->OnWarnX(strWarnCode);
  2701. }
  2702. RET_STATUS nsFPD::FPDDeviceYuying::ResetError()
  2703. {
  2704. FINFO("ResetError");
  2705. OnErrorX(ERR_FPD_DOSE_LOW);
  2706. OnErrorX(ERR_FPD_DOSE_HIGH);
  2707. OnErrorX(ERR_FPD_DOSE_OBJ); //清除之前的错误,如果有的话
  2708. return RET_STATUS::RET_SUCCEED;
  2709. }
  2710. void nsFPD::FPDDeviceYuying::SendAllError()
  2711. {
  2712. m_WarnAndError->SendAllError();
  2713. }
  2714. void nsFPD::FPDDeviceYuying::ProcessTempreatureOnLostCommunicate()
  2715. {
  2716. SendTemperatureValue(ABS_ZERO_TEMPERATURE);
  2717. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2718. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2719. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2720. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2721. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2722. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2723. OnWarnX(WAR_FPD_WIFI_LOW);
  2724. OnWarnX(WAR_FPD_BATTERY_LOW);
  2725. OnErrorX(ERR_FPD_WIFI_LOW);
  2726. OnErrorX(ERR_FPD_BATTERY_LOW);
  2727. }
  2728. void nsFPD::FPDDeviceYuying::ResetAllError()
  2729. {
  2730. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_HIGH);
  2731. OnWarnX(WAR_FPD_EXCEED_CALB_TEMPER_LOW);
  2732. OnWarnX(WAR_FPD_TEMPERTURE_LOW);
  2733. OnWarnX(WAR_FPD_TEMPERATURE_HIGH);
  2734. OnErrorX(ERR_FPD_TEMPHIGH_NOT_ACQ);
  2735. OnErrorX(ERR_FPD_TEMPLOW_NOT_ACQ);
  2736. OnWarnX(WAR_FPD_LOAD_CORRECT_FILE);
  2737. OnWarnX(WAR_FPD_WIFI_LOW);
  2738. OnWarnX(WAR_FPD_MAX_SHOCK_NUM);
  2739. OnWarnX(WAR_FPD_IN_INITIAL);
  2740. OnWarnX(WAR_FPD_ATTACH_PMS_LOGOUT);
  2741. OnWarnX(WAR_FPD_BATTERY_LOW);
  2742. OnErrorX(ERR_FPD_WIFI_LOW);
  2743. OnErrorX(ERR_FPD_BATTERY_LOW);
  2744. OnErrorX(ERR_FPD_DISCONNECT);
  2745. OnErrorX(ERR_FPD_POWEROFF);
  2746. OnErrorX(ERR_FPD_ACQ_FAILED);
  2747. OnErrorX(ERR_FPD_DOSE_LOW);
  2748. OnErrorX(ERR_FPD_DOSE_HIGH);
  2749. OnErrorX(ERR_FPD_DOSE_OBJ);
  2750. OnErrorX(ERR_FPD_IMAGE_PENDING);
  2751. OnErrorX(ERR_FPD_FATAL_ERROR);
  2752. OnErrorX(LASTERR_ATTACH_FAIL_WITHIMG);
  2753. OnErrorX(LASTERR_ATTACH_FAIL_BATTERYLOW);
  2754. }
  2755. RET_STATUS nsFPD::FPDDeviceYuying::SetCorrectionType(CCOS_CORRECTION_TYPE in)
  2756. {
  2757. return RET_STATUS::RET_SUCCEED;
  2758. }