DynBoxDevice.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. #include "stdafx.h"
  2. #include "CommonFun.h"
  3. #include "DynBoxDevice.hpp"
  4. #include "Helper.JSON.hpp"
  5. using namespace DIOS::Dev::Detail::SYNBOX;
  6. namespace nsSYN = DIOS::Dev::Detail::SYNBOX;
  7. //-----------------------------------------------------------------------------
  8. // DynBoxDevice
  9. //-----------------------------------------------------------------------------
  10. nsSYN::DynBoxDevice::DynBoxDevice(std::shared_ptr <IOEventCenter> center, nsSCF::SCF SCF)
  11. {
  12. m_SCF = SCF;
  13. EventCenter = center;
  14. m_SynBoxUnit.m_WS.reset(new WORKSTATIONMould(""));
  15. m_SynBoxUnit.m_CurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 10000, 1));
  16. m_SynBoxUnit.m_HandSwitchState.reset(new HANDSWITCHMould(0, 0, 10000, 1));
  17. m_SynBoxUnit.m_GenSynState.reset(new GENSYNSTATEMould(0, 0, 10000, 1));
  18. m_SynBoxUnit.m_TotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 10000, 1));
  19. m_SynBoxUnit.m_DetectorState.reset(new DETECTORSTATUSMould(0, 0, 10000, 1));
  20. m_SynBoxUnit.m_DetectorWindowState.reset(new XWINDOWSTATUSMould(AttrKey::XWINDOW_OFF, AttrKey::XWINDOW_OFF, AttrKey::XWINDOW_ON, 1));
  21. m_SynBoxUnit.m_ExpMode.reset(new EXPMODEMould(""));
  22. m_SynBoxUnit.m_GridStatue.reset(new GRIDSYNSTATEMould(0, 0, 20, 1));
  23. m_DYNMap.m_MapChannelState["TB"] = 0;
  24. m_DYNMap.m_MapChannelState["WB"] = 0;
  25. m_DYNMap.m_MapChannelState["GT"] = 0;
  26. m_DYNMap.m_MapChannelState["GW"] = 0;
  27. m_DYNMap.m_MapChannelState["PT"] = 0;
  28. m_DYNMap.m_MapChannelState["PW"] = 0;
  29. m_DYNMap.m_MapChannelState["ER"] = 0;
  30. m_DYNMap.m_MapChannelState["RT"] = 0;
  31. m_DYNMap.m_MapChannelState["RW"] = 0;
  32. m_DYNMap.m_MapChannelState["OT"] = 0;
  33. m_DYNMap.m_MapChannelState["OW"] = 0;
  34. m_DYNMap.m_MapChannelState["PR"] = 0;
  35. m_DYNMap.m_MapChannelState["FT"] = 0;
  36. m_DYNMap.m_MapChannelState["FW"] = 0;
  37. m_DYNMap.m_MapChannelState["TT"] = 0;
  38. m_DYNMap.m_MapChannelState["TW"] = 0;
  39. RefreshSignal();
  40. }
  41. nsSYN::DynBoxDevice::~DynBoxDevice()
  42. {
  43. }
  44. void nsSYN::DynBoxDevice::Register(Dispatch* Dispatch)
  45. {
  46. superGen::Register(Dispatch);
  47. }
  48. RET_STATUS nsSYN::DynBoxDevice::SetWS(std::string value)
  49. {
  50. mLog::Info("SetWS");
  51. if (ResDYNConfig.GetFirstOf(value.c_str()) >= 0)
  52. {
  53. m_SynBoxUnit.m_WS->Update(value);
  54. m_strSYNMode = (string)ResDYNConfig[value.c_str()];
  55. }
  56. else
  57. {
  58. m_strSYNMode = "SYN0";
  59. mLog::Info("Syncbox configuration didn't find the workstation {$}, use defualt config SYN0", value.c_str());
  60. }
  61. return RET_STATUS::RET_SUCCEED;
  62. }
  63. RET_STATUS nsSYN::DynBoxDevice::SetExpMode(std::string value)
  64. {
  65. m_SynBoxUnit.m_ExpMode->Update(value);
  66. mLog::Info("SetExpMode {$}", value.c_str());
  67. return RET_STATUS::RET_SUCCEED;
  68. }
  69. RET_STATUS nsSYN::DynBoxDevice::SetGeneratortoSyncStatus(int state)
  70. {
  71. string strStateName = "";
  72. int nstate = -1;
  73. mLog::Info("SetGeneratortoSyncStatus :{$}", state);
  74. if (state == AttrKey::GENERATOR_FLU_OFF || state == AttrKey::GENERATOR_RAD_OFF)//如果是采集结束的消息,直接恢复同步盒状态
  75. {
  76. ClearSignal();
  77. }
  78. if (m_SynBoxUnit.m_GenSynState->Get() != state || state == AttrKey::GENERATOR_RAD_XRAYON || state == AttrKey::GENERATOR_RAD_XRAYOFF)
  79. {
  80. mLog::Info("switch :{$}", state);
  81. switch (state)
  82. {
  83. case AttrKey::GENERATOR_RAD_PREPARE:
  84. m_nCurrentExpTimes = 0;
  85. strStateName = "HANDSWITCHPREPREQUEST";
  86. nstate = 1;
  87. m_nInExpState = true;
  88. m_wStartEXPTime = GetTickCount();
  89. break;
  90. case AttrKey::GENERATOR_RAD_READY:
  91. m_nCurrentExpTimes = 0;
  92. strStateName = "HANDSWITCHREADYREQUEST";
  93. nstate = 1;
  94. break;
  95. case AttrKey::GENERATOR_RAD_OFF:
  96. m_nCurrentExpTimes = 0;
  97. m_nExpTimes = -1;
  98. m_nInExpState = false;
  99. /*strStateName = "HANDSWITCHREADYREQUEST";
  100. nstate = 0;
  101. ((DYNSyncBox*)GetDrvDPC())->SetSignal(strStateName.c_str(), state);
  102. Sleep(30);
  103. strStateName = "GENEXPREQUEST";
  104. nstate = 0;
  105. ((DYNSyncBox*)GetDrvDPC())->SetSignal(strStateName.c_str(), state);
  106. Sleep(30);
  107. strStateName = "HANDSWITCHPREPREQUEST";
  108. nstate = 0;*/
  109. break;
  110. case AttrKey::GENERATOR_FLU_READY:
  111. m_nCurrentExpTimes = 0;
  112. strStateName = "HANDSWITCHPREPREQUEST";
  113. nstate = 1;
  114. SetSignal(strStateName.c_str(), nstate);
  115. Sleep(30);
  116. strStateName = "HANDSWITCHREADYREQUEST";
  117. nstate = 1;
  118. break;
  119. case AttrKey::GENERATOR_FLU_OFF:
  120. m_nCurrentExpTimes = 0;
  121. m_nExpTimes = -1;
  122. /*strStateName = "HANDSWITCHREADYREQUEST";
  123. nstate = 0;
  124. ((DYNSyncBox*)GetDrvDPC())->SetSignal(strStateName.c_str(), nstate);
  125. Sleep(30);
  126. strStateName = "HANDSWITCHPREPREQUEST";*/
  127. break;
  128. case AttrKey::GENERATOR_RAD_XRAYON:
  129. m_bINEEnable = true;
  130. strStateName = "GENEXPREQUEST";
  131. nstate = 1;
  132. break;
  133. case AttrKey::GENERATOR_RAD_XRAYOFF:
  134. if (m_SynBoxUnit.m_ExpMode->JSGet() != "ContinueSerial")
  135. {
  136. strStateName = "GENEXPREQUEST";
  137. nstate = 0;
  138. }
  139. break;
  140. default:
  141. strStateName = "";
  142. nstate = -1;
  143. break;
  144. }
  145. if (state == AttrKey::GENERATOR_FLU_OFF || state == AttrKey::GENERATOR_RAD_OFF)//如果是采集结束的消息,直接恢复同步盒状态
  146. {
  147. if (!m_bClear)
  148. {
  149. ClearSignal();
  150. m_bClear = true;
  151. }
  152. m_SynBoxUnit.m_GenSynState->Update(state);
  153. }
  154. else if (strStateName != "" && nstate >= 0)
  155. {
  156. m_bClear = false;
  157. SetSignal(strStateName.c_str(), nstate);
  158. m_SynBoxUnit.m_GenSynState->Update(state);
  159. }
  160. }
  161. else
  162. {
  163. mLog::Error("switch :{$}, PreSetGeneratortoSyncStatus=false", state);
  164. }
  165. return RET_STATUS::RET_SUCCEED;
  166. }
  167. RET_STATUS nsSYN::DynBoxDevice::SetExpEnable()
  168. {
  169. mLog::Info("SetExpEnable");
  170. return RET_STATUS::RET_SUCCEED;
  171. }
  172. RET_STATUS nsSYN::DynBoxDevice::SetExpDisable()
  173. {
  174. mLog::Info("SetExpDisable");
  175. return RET_STATUS::RET_SUCCEED;
  176. }
  177. RET_STATUS nsSYN::DynBoxDevice::PrepareAcquisition()
  178. {
  179. mLog::Info("PrepareAcquisition");
  180. return RET_STATUS::RET_SUCCEED;
  181. }
  182. RET_STATUS nsSYN::DynBoxDevice::StartWindowRequest()
  183. {
  184. mLog::Info("StartWindowRequest");
  185. m_bINEEnable = true;
  186. string strStateName = "DETREACQREQUEST";
  187. int state = 1;
  188. SetSignal(strStateName.c_str(), state);
  189. return RET_STATUS::RET_SUCCEED;
  190. }
  191. RET_STATUS nsSYN::DynBoxDevice::SetExposureTimes(int nNum)
  192. {
  193. mLog::Info("SetExposureTimes");
  194. if (m_SynBoxUnit.m_ExpMode->JSGet() != "TOMO")
  195. {
  196. m_nExpTimes = nNum;
  197. }
  198. else
  199. {
  200. m_nExpTimes = 0;
  201. }
  202. return RET_STATUS::RET_SUCCEED;
  203. }
  204. RET_STATUS nsSYN::DynBoxDevice::StopWindowRequest()
  205. {
  206. mLog::Info("StopWindowRequest");
  207. m_bINEEnable = false;
  208. string strStateName = "DETREACQREQUEST";
  209. int state = 0;
  210. SetSignal(strStateName.c_str(), state);
  211. return RET_STATUS::RET_SUCCEED;
  212. }
  213. RET_STATUS nsSYN::DynBoxDevice::SetFrameRate(FLOAT frameRate)
  214. {
  215. mLog::Info("SetFrameRate");
  216. SetPWM(frameRate);
  217. return RET_STATUS::RET_SUCCEED;
  218. }
  219. RET_STATUS nsSYN::DynBoxDevice::SetGenAECSignal(int signal)
  220. {
  221. return RET_STATUS::RET_SUCCEED;
  222. }
  223. //-----------------------------------------------------------------------------
  224. // ProcessCmd
  225. //-----------------------------------------------------------------------------
  226. void nsSYN::DynBoxDevice::FireNotify(std::string key, std::string content)
  227. {
  228. mLog::Info("Enter FireNotify");
  229. EventCenter->OnNotify(1, key, content);
  230. }
  231. //static bool DecodeFrame(const char* strFrame, int length);
  232. // 收到硬件的通知, 有包到达
  233. // 按照设计, 仅当数据有变化时, 才发通知到上层, 因此里面有大量的 if (..) FireNotify (..)
  234. void nsSYN::DynBoxDevice::OnCallBack()
  235. {
  236. mLog::Info("DynBoxDevice::OnCallBack");
  237. auto HWNotProcess = [](const char* value, int length) -> void
  238. {
  239. mLog::Warn(" This commands didn't need to process!");
  240. };
  241. auto HWSignal = [this](const char* value, int length) -> void
  242. {
  243. assert(value && length>=3);
  244. char cChannelValue;
  245. cChannelValue = value[2]; //status : on /off
  246. string strChannel = ((string)value).substr(0, 2);
  247. bool bStatus = ChartoInt(cChannelValue);
  248. DealtheSignal(strChannel.c_str(), bStatus);
  249. };
  250. auto HWCAN = [this](const char* value, int length)
  251. {
  252. char data_can[MAX_COMMAND_LEN] = { 0 };
  253. for (int i = 0; i < length; i++)
  254. {
  255. if (value[i] == 0x30)
  256. data_can[i] = 0x0;
  257. else if (value[i] == 0x61)
  258. data_can[i] = 0x0a;
  259. else if (value[i] == 0x64)
  260. data_can[i] = 0x0d;
  261. else
  262. data_can[i] = value[i];
  263. }
  264. string strcmd = data_can;
  265. string sCmdID = strcmd.substr(2, 2);
  266. DealReceiveData(sCmdID, &data_can[4], length - 4);
  267. };
  268. // 有部分前缀是包含关系, 长的包含短的, 例如 KVS 包含了 KV.
  269. // 因此长的在前面, 短的在后面
  270. // !!! Device 是个短寿命对象, 而 arFrame 是静态变量 !!!
  271. // !!! 因此, 在添加到 arFrame 之前, 务必先清零 !!!
  272. arFrame.clear();
  273. arFrame.push_back(tFrameMapping("GR", 2, HWCAN));
  274. arFrame.push_back(tFrameMapping("CR", 2, HWCAN));
  275. arFrame.push_back(tFrameMapping("TB", 2, HWSignal));
  276. arFrame.push_back(tFrameMapping("WB", 2, HWSignal));
  277. arFrame.push_back(tFrameMapping("GT", 2, HWSignal));
  278. arFrame.push_back(tFrameMapping("GW", 2, HWSignal));
  279. arFrame.push_back(tFrameMapping("PT", 2, HWSignal));
  280. arFrame.push_back(tFrameMapping("PW", 2, HWSignal));
  281. arFrame.push_back(tFrameMapping("ER", 2, HWSignal));
  282. arFrame.push_back(tFrameMapping("RT", 2, HWSignal));
  283. arFrame.push_back(tFrameMapping("RW", 2, HWSignal));
  284. arFrame.push_back(tFrameMapping("OT", 2, HWSignal));
  285. arFrame.push_back(tFrameMapping("OW", 2, HWSignal));
  286. arFrame.push_back(tFrameMapping("PR", 2, HWSignal));
  287. arFrame.push_back(tFrameMapping("FT", 2, HWSignal));
  288. arFrame.push_back(tFrameMapping("FW", 2, HWSignal));
  289. arFrame.push_back(tFrameMapping("TT", 2, HWSignal));
  290. arFrame.push_back(tFrameMapping("TW", 2, HWSignal));
  291. }
  292. int nsSYN::DynBoxDevice::DealReceiveData(string sCmdID, const char* pData, int Datalen)
  293. {
  294. mLog::Info("DynBoxDevice::DealReceiveData");
  295. if (strtol(("0x" + sCmdID).c_str(), NULL, 16) == 0x626)
  296. {
  297. string strCmd = pData;
  298. if (strtol(("0x" + strCmd.substr(0, 2)).c_str(), NULL, 16) == 0x14)
  299. {
  300. /*bool bUpdateSize = false, bUpdateFilter = false;
  301. if (strtol(("0x" + strCmd.substr(3, 1)).c_str(), NULL, 16) & 0x01)
  302. {
  303. m_nXSize = strtol(("0x" + strCmd.substr(4, 2)).c_str(), NULL, 16) + strtol(("0x" + strCmd.substr(6, 2)).c_str(), NULL, 16) * 256;
  304. bUpdateSize = true;
  305. m_nXSize = m_nXSize / 100;
  306. printf("m_nXSize = {$}", m_nXSize);
  307. }
  308. if (strtol(("0x" + strCmd.substr(3, 1)).c_str(), NULL, 16) & 0x02)
  309. {
  310. m_nYSize = strtol(("0x" + strCmd.substr(8, 2)).c_str(), NULL, 16) + strtol(("0x" + strCmd.substr(10, 2)).c_str(), NULL, 16) * 256;
  311. m_nYSize = m_nYSize / 100;
  312. bUpdateSize = true;
  313. printf("m_nYSize = {$}", m_nYSize);
  314. }
  315. if (strtol(("0x" + strCmd.substr(2, 1)).c_str(), NULL, 16) & 0x04)
  316. {
  317. m_nFilter = strtol(("0x" + strCmd.substr(12, 2)).c_str(), NULL, 16) + strtol(("0x" + strCmd.substr(14, 2)).c_str(), NULL, 16) * 256;
  318. bUpdateFilter = true;
  319. printf("m_nFilter = {$}", m_nFilter);
  320. }
  321. if (bUpdateSize)
  322. {
  323. CollimatorLogic::SetCollimatorSize(m_nXSize, m_nYSize);
  324. }
  325. if (bUpdateFilter)
  326. {
  327. CollimatorLogic::SetCollimatorFilter(m_nFilter);
  328. }*/
  329. }
  330. }
  331. return 1;
  332. }
  333. int nsSYN::DynBoxDevice::DealtheSignal(const char* channel, int state)
  334. {
  335. mLog::Info("DynBoxDevice::DealtheSignal:{$}", channel);
  336. string strchannel = channel;
  337. m_DYNMap.m_MapChannelState[strchannel] = state;
  338. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  339. {
  340. mLog::Error("Didn't find SynMode : {$}", m_strSYNMode.c_str());
  341. return -1;
  342. }
  343. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  344. {
  345. mLog::Error("Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  346. return -1;
  347. }
  348. int count = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"].size();
  349. string strSignalName = "";
  350. int nState = -1;
  351. mLog::Info("CurrentExamMode = {$}, strchannel = {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str(), strchannel.c_str());
  352. for (int i = 0; i < count; i++)
  353. {
  354. string strKey = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"].GetKey(i);
  355. string confchannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strKey.c_str()]["CHANNEL"];
  356. mLog::Info("strKey = {$}, confchannel = {$}", strKey.c_str(), confchannel.c_str());
  357. if (confchannel == strchannel)
  358. {
  359. strSignalName = strKey;
  360. nState = state;
  361. mLog::Info("Signal Name = {$}", strSignalName.c_str());
  362. mLog::Info("Signal Name = {$}, state = {$}", strSignalName.c_str(), nState);
  363. break;
  364. }
  365. }
  366. //当前没有跑到这里调用NotifySignal 需要单步调试一下。看看为什么没进去
  367. if (strSignalName != "" && nState >= 0)
  368. {
  369. //if (strSignalName == "WALLWINDOWSTATUS" || strSignalName == "TABLEWINDOWSTATUS")
  370. //{
  371. // strSignalName = "XWINDOWSTATUS";
  372. //}
  373. //else if (strSignalName == "GENREADY")
  374. //{
  375. // strSignalName = "GENREADY";
  376. //}
  377. //else if (strSignalName == "TABLEGRIDSTATUS" || strSignalName == "WALLGRIDSTATUS")
  378. //{
  379. //}
  380. NotifySignal(strSignalName.c_str(), nState);
  381. string strSetEnableSignal = (string)ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["SETENABLE"];
  382. string strSetDisableSignal = (string)ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["SETDISABLE"];
  383. if (nState == 1 && strSetEnableSignal != "")
  384. {
  385. string strRelaySignal = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["RELAY"];
  386. if (strRelaySignal != "")
  387. {
  388. string channel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strRelaySignal.c_str()]["CHANNEL"];
  389. if (nState == m_DYNMap.m_MapChannelState[channel])
  390. {
  391. mLog::Info("Set Enable Signal = {$}", strSetEnableSignal.c_str());
  392. SetSignal(strSetEnableSignal.c_str(), nState);
  393. }
  394. }
  395. else
  396. {
  397. mLog::Info("Set Enable Signal = {$}", strSetEnableSignal.c_str());
  398. SetSignal(strSetEnableSignal.c_str(), nState);
  399. }
  400. }
  401. else if (state == 0 && strSetDisableSignal != "")
  402. {
  403. string strRelaySignal = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["RELAY"];
  404. if (strRelaySignal != "")
  405. {
  406. string channel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strRelaySignal.c_str()]["CHANNEL"];
  407. if (1 == m_DYNMap.m_MapChannelState[channel])
  408. {
  409. mLog::Info("Set Disable Signal = {$}", strSetDisableSignal.c_str());
  410. SetSignal(strSetDisableSignal.c_str(), state);
  411. }
  412. }
  413. else
  414. {
  415. mLog::Info("Set Disable Signal = {$}", strSetDisableSignal.c_str());
  416. SetSignal(strSetDisableSignal.c_str(), state);
  417. }
  418. }
  419. }
  420. return 2;
  421. }
  422. int nsSYN::DynBoxDevice::NotifySignal(const char* name, int state)
  423. {
  424. mLog::Info("DynBoxDevice::NotifySignal");
  425. string strname = name;
  426. mLog::Info("Send Notify : Name = {$}, State = {$}", name, state);
  427. if (strname == "HANDSWITCHPREP")
  428. {
  429. if (state)
  430. {
  431. m_SynBoxUnit.m_HandSwitchState->Update(1);
  432. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  433. }
  434. else
  435. {
  436. m_SynBoxUnit.m_HandSwitchState->Update(0);
  437. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  438. }
  439. }
  440. else if (strname == "HANDSWITCHREADY")
  441. {
  442. if (state)
  443. {
  444. m_SynBoxUnit.m_HandSwitchState->Update(2);
  445. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  446. }
  447. else
  448. {
  449. m_SynBoxUnit.m_HandSwitchState->Update(0);
  450. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  451. }
  452. }
  453. else if (strname == "GENPREP")
  454. {
  455. if (state)
  456. {
  457. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
  458. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  459. }
  460. else
  461. {
  462. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  463. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  464. }
  465. }
  466. else if (strname == "GENREADY")
  467. {
  468. if (state)
  469. {
  470. if (m_bSendRadReady)
  471. {
  472. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
  473. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  474. }
  475. }
  476. else
  477. {
  478. if (m_bSendRadOff)
  479. {
  480. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  481. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  482. }
  483. }
  484. }
  485. else if (strname == "TABLEWINDOWSTATUS" || strname == "WALLWINDOWSTATUS")
  486. {
  487. if (state)
  488. {
  489. if (m_bSendXwindowOn)
  490. {
  491. m_SynBoxUnit.m_DetectorWindowState->Update(AttrKey::XWINDOW_ON);
  492. FireNotify(m_SynBoxUnit.m_DetectorWindowState->GetKey(), m_SynBoxUnit.m_DetectorWindowState->JSGet());
  493. }
  494. }
  495. else
  496. {
  497. if (m_bSendXwindowOff)
  498. {
  499. m_SynBoxUnit.m_DetectorWindowState->Update(AttrKey::XWINDOW_OFF);
  500. FireNotify(m_SynBoxUnit.m_DetectorWindowState->GetKey(), m_SynBoxUnit.m_DetectorWindowState->JSGet());
  501. }
  502. }
  503. }
  504. else if (strname == "GENEXPSTATUS")
  505. {
  506. if (state)
  507. {
  508. if (m_bSendRadXrayOn)
  509. {
  510. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
  511. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  512. m_nCurrentExpTimes++;
  513. }
  514. }
  515. else
  516. {
  517. if (m_bSendRadXrayOff)
  518. {
  519. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYOFF);
  520. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  521. }
  522. }
  523. }
  524. return 2;
  525. }
  526. int nsSYN::DynBoxDevice::SetSignal(const char* name, int state)
  527. {
  528. mLog::Info("DynBoxDevice::SetSignal");
  529. string strtemp = name;
  530. string strName = "";
  531. std::size_t npos;
  532. while (npos = strtemp.find_first_of(",") != string::npos)
  533. {
  534. strName = strtemp.substr(0, npos);
  535. npos++;
  536. strtemp = strtemp.substr(npos, strtemp.size() - npos);
  537. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  538. {
  539. mLog::Error("Didn't find SynMode : {$}", m_strSYNMode.c_str());
  540. return -1;
  541. }
  542. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  543. {
  544. mLog::Error("Set Signal {$}, state {$} ", name, state);
  545. mLog::Error("Didn't find m_SynBoxUnit.m_ExpMode->JSGet() : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  546. return -1;
  547. }
  548. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"][strName.c_str()]["CHANNEL"];
  549. if (strChannel != "")
  550. {
  551. if (strName == "GENEXPREQUEST")
  552. {
  553. if (m_bINEEnable)
  554. {
  555. //m_nCurrentExpTimes++;
  556. if (m_nExpTimes > 0 && m_nCurrentExpTimes > m_nExpTimes)
  557. {
  558. mLog::Warn("m_nExpTimes has been enough in this sequence! m_nExpTimes={$},m_nCurrentExpTimes={$}", m_nExpTimes, m_nCurrentExpTimes);
  559. return true;
  560. }
  561. }
  562. else
  563. {
  564. mLog::Warn("Generator didn't ready or detector didn't startAcq, So can't send INE to generator!");
  565. return true;
  566. }
  567. }
  568. mLog::Info("Set Signal {$}, state {$} ", name, state);
  569. SendBySCF(strChannel.c_str(), state);
  570. //Sleep(10);
  571. }
  572. }
  573. strName = strtemp;
  574. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  575. {
  576. mLog::Error("Didn't find SynMode : {$}", m_strSYNMode.c_str());
  577. return -1;
  578. }
  579. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  580. {
  581. mLog::Error("Set Signal {$}, state {$} ", name, state);
  582. mLog::Error("Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  583. return -1;
  584. }
  585. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"][strName.c_str()]["CHANNEL"];
  586. if (strChannel != "")
  587. {
  588. if (strName == "GENEXPREQUEST")
  589. {
  590. if (m_bINEEnable)
  591. {
  592. //m_nCurrentExpTimes++;
  593. if (m_nExpTimes > 0 && m_nCurrentExpTimes > m_nExpTimes)
  594. {
  595. mLog::Warn("m_nExpTimes has been enough in this sequence! m_nExpTimes={$},m_nCurrentExpTimes={$}", m_nExpTimes, m_nCurrentExpTimes);
  596. return true;
  597. }
  598. }
  599. else
  600. {
  601. mLog::Warn("Generator didn't ready or detector didn't startAcq, So can't send INE to generator!");
  602. return true;
  603. }
  604. }
  605. mLog::Info("Set Signal {$}, state {$} ", name, state);
  606. SendBySCF(strChannel.c_str(), state);
  607. return 1;
  608. }
  609. return -1;
  610. }
  611. void nsSYN::DynBoxDevice::ClearSignal()
  612. {
  613. mLog::Info("DynBoxDevice::ClearSignal");
  614. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  615. {
  616. mLog::Error("Didn't find SynMode : {$}", m_strSYNMode.c_str());
  617. return;
  618. }
  619. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  620. {
  621. mLog::Error("Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  622. return;
  623. }
  624. size_t nsize = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"].size();
  625. for (int i = 0; i < nsize; i++)
  626. {
  627. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"][i]["CHANNEL"];
  628. string name = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"].GetKey(i);
  629. mLog::Info("Clear Name :{$},CurrentExamMode ={$}", name.c_str(), m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  630. if (strChannel != "" && "FRAMERATE" != name)
  631. {
  632. mLog::Info("Clear Signal {$} ", strChannel);
  633. SendBySCF(strChannel.c_str(), false);
  634. Sleep(10);
  635. }
  636. }
  637. return;
  638. }
  639. int nsSYN::DynBoxDevice::SetPWM(float fpps)
  640. {
  641. mLog::Info("DynBoxDevice::SetPWM");
  642. return -1;
  643. }
  644. RET_STATUS nsSYN::DynBoxDevice::SendBySCF(const char* chChannelID, bool bStatus)
  645. {
  646. mLog::Info("DynBoxDevice::SendBySCF");
  647. int nTimeout = 100;
  648. char cCmd[MAX_COMMAND_LEN] = { 0 };
  649. cCmd[0] = chChannelID[0];
  650. cCmd[1] = chChannelID[1];
  651. if (bStatus)
  652. cCmd[2] = '1';
  653. else
  654. cCmd[2] = '0';
  655. int nSize = 3;
  656. FormatCmd(cCmd, nSize);
  657. string strLog;
  658. CmdtoString(cCmd, nSize, strLog);
  659. mLog::Info("[Send:{$}]", cCmd);
  660. if (!m_SCF)
  661. {
  662. mLog::Error("SCF is NULL");
  663. return RET_STATUS::RET_FAILED;
  664. }
  665. mLog::Info("==OUT==: {$} ", cCmd);
  666. int ret = 0;
  667. m_SCF.Lock(msTimeOut_Lock)
  668. .SendPacket(cCmd, nSize, nTimeout, ret);
  669. Sleep(nTimeout);
  670. return RET_STATUS::RET_SUCCEED;
  671. }
  672. void nsSYN::DynBoxDevice::RefreshSignal()
  673. {
  674. mLog::Info("Clearing Signal Begin");
  675. ResetGenExpSignal();
  676. ResetPanelReqSignal();
  677. ResetPanelPreSignal();
  678. mLog::Info("Clearing Signal End");
  679. }
  680. void nsSYN::DynBoxDevice::ResetPanelPreSignal(void)
  681. {
  682. mLog::Info("DynBoxDevice::ResetPanelPreSignal");
  683. int nTimeout = 100;
  684. char cCmd[MAX_COMMAND_LEN] = "RT0";// "SECA00";
  685. int nCmdSize = 3;// 6;
  686. FormatCmd(cCmd, nCmdSize);
  687. string strLog;
  688. CmdtoString(cCmd, nCmdSize, strLog);
  689. mLog::Info("[Send:{$}]", strLog.c_str());
  690. mLog::Info("ResetPanelPreSignal ==OUT==: {$} ", cCmd);
  691. int ret = 0;
  692. m_SCF.Lock(msTimeOut_Lock)
  693. .SendPacket(cCmd, nCmdSize, nTimeout, ret);
  694. Sleep(nTimeout);
  695. }
  696. void nsSYN::DynBoxDevice::ResetPanelReqSignal(void)
  697. {
  698. mLog::Info("DynBoxDevice::ResetPanelReqSignal");
  699. int nTimeout = 100;
  700. char cCmd[MAX_COMMAND_LEN] = "RW0";// "SECA00";
  701. int nCmdSize = 3;// 6;
  702. FormatCmd(cCmd, nCmdSize);
  703. string strLog;
  704. CmdtoString(cCmd, nCmdSize, strLog);
  705. mLog::Info("[Send:{$}]", strLog.c_str());
  706. mLog::Info("ResetPanelReqSignal ==OUT==: {$} ", cCmd);
  707. int ret = 0;
  708. m_SCF.Lock(msTimeOut_Lock)
  709. .SendPacket(cCmd, nCmdSize, nTimeout, ret);
  710. Sleep(nTimeout);
  711. }
  712. void nsSYN::DynBoxDevice::ResetGenExpSignal(void)
  713. {
  714. mLog::Info("DynBoxDevice::ResetGenExpSignal");
  715. int nTimeout = 100;
  716. char cCmd[MAX_COMMAND_LEN] = "OT0";
  717. int nCmdSize = 3;// 6;
  718. FormatCmd(cCmd, nCmdSize);
  719. string strLog;
  720. CmdtoString(cCmd, nCmdSize, strLog);
  721. mLog::Info("[Send:{$}]", strLog.c_str());
  722. mLog::Info("ResetGenExpSignal ==OUT==: {$} ", cCmd);
  723. int ret = 0;
  724. m_SCF.Lock(msTimeOut_Lock)
  725. .SendPacket(cCmd, nCmdSize, nTimeout, ret);
  726. Sleep(nTimeout);
  727. }
  728. RET_STATUS nsSYN::DynBoxDevice::SimulateFootSwitchSignal(int signal)
  729. {
  730. return RET_STATUS::RET_SUCCEED;
  731. }
  732. RET_STATUS nsSYN::DynBoxDevice::SetValue_PPS(FLOAT fluframeRate)
  733. {
  734. return RET_STATUS::RET_SUCCEED;
  735. }