DynBoxDevice.cpp 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  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_GenExpFrameRate.reset(new EXPFRAMERATEMould(0, 0, 100, 1));
  23. m_SynBoxUnit.m_GenExpTimes.reset(new EXPTIMESMould(0, 0, 255, 1));
  24. m_SynBoxUnit.m_GridStatue.reset(new GRIDSYNSTATEMould(0, 0, 20, 1));
  25. m_DYNMap.m_MapChannelState["I0"] = 0;
  26. m_DYNMap.m_MapChannelState["I1"] = 0;
  27. m_DYNMap.m_MapChannelState["I2"] = 0;
  28. m_DYNMap.m_MapChannelState["I3"] = 0;
  29. m_DYNMap.m_MapChannelState["I4"] = 0;
  30. m_DYNMap.m_MapChannelState["I5"] = 0;
  31. m_DYNMap.m_MapChannelState["I6"] = 0;
  32. m_DYNMap.m_MapChannelState["I7"] = 0;
  33. m_DYNMap.m_MapChannelState["I8"] = 0;
  34. m_DYNMap.m_MapChannelState["I9"] = 0;
  35. m_DYNMap.m_MapChannelState["IA"] = 0;
  36. m_DYNMap.m_MapChannelState["IB"] = 0;
  37. m_DYNMap.m_MapChannelState["IC"] = 0;
  38. m_DYNMap.m_MapChannelState["ID"] = 0;
  39. m_DYNMap.m_MapChannelState["IE"] = 0;
  40. m_DYNMap.m_MapChannelState["IF"] = 0;
  41. m_DYNMap.m_MapChannelState["O0"] = 0;
  42. m_DYNMap.m_MapChannelState["O1"] = 0;
  43. m_DYNMap.m_MapChannelState["O2"] = 0;
  44. m_DYNMap.m_MapChannelState["O3"] = 0;
  45. m_DYNMap.m_MapChannelState["O4"] = 0;
  46. m_DYNMap.m_MapChannelState["O5"] = 0;
  47. m_DYNMap.m_MapChannelState["O6"] = 0;
  48. m_DYNMap.m_MapChannelState["O7"] = 0;
  49. m_DYNMap.m_MapChannelState["O8"] = 0;
  50. m_DYNMap.m_MapChannelState["O9"] = 0;
  51. m_DYNMap.m_MapChannelState["OA"] = 0;
  52. m_DYNMap.m_MapChannelState["OB"] = 0;
  53. m_DYNMap.m_MapChannelState["OC"] = 0;
  54. m_DYNMap.m_MapChannelState["OD"] = 0;
  55. m_DYNMap.m_MapChannelState["OE"] = 0;
  56. m_DYNMap.m_MapChannelState["OF"] = 0;
  57. m_strSYNMode = "SYN0";
  58. }
  59. nsSYN::DynBoxDevice::~DynBoxDevice()
  60. {
  61. }
  62. void nsSYN::DynBoxDevice::Register(Dispatch* Dispatch)
  63. {
  64. superGen::Register(Dispatch);
  65. }
  66. RET_STATUS nsSYN::DynBoxDevice::SetWS(std::string value)
  67. {
  68. if (ResDYNConfig.GetFirstOf(value.c_str()) >= 0)
  69. {
  70. m_SynBoxUnit.m_WS->Update(value);
  71. m_strSYNMode = (string)ResDYNConfig[value.c_str()];
  72. }
  73. else
  74. {
  75. m_strSYNMode = "SYN0";
  76. mLog::Info("Syncbox configuration didn't find the workstation {$}, use defualt config SYN0", value.c_str());
  77. }
  78. return RET_STATUS::RET_SUCCEED;
  79. }
  80. RET_STATUS nsSYN::DynBoxDevice::SetExpMode(std::string value)
  81. {
  82. mLog::Info("Syncbox SetExpMode {$}", value.c_str());
  83. m_SynBoxUnit.m_ExpMode->Update(value);
  84. if (m_SynBoxUnit.m_ExpMode->JSGet() != "SingleRad" && m_strPreExpMode == "SingleRad")
  85. {
  86. m_SynBoxUnit.m_GenExpFrameRate->Update(m_DefaultExpFrameRate);
  87. FireNotify(m_SynBoxUnit.m_GenExpFrameRate->GetKey(), m_SynBoxUnit.m_GenExpFrameRate->JSGet());
  88. SetFrameRate(m_DefaultExpFrameRate);
  89. m_SynBoxUnit.m_GenExpTimes->Update(m_DefaultExpTimes);
  90. FireNotify(m_SynBoxUnit.m_GenExpTimes->GetKey(), m_SynBoxUnit.m_GenExpTimes->JSGet());
  91. SetExposureTimes(m_DefaultExpTimes);
  92. }
  93. m_strPreExpMode = value;
  94. ClearSignal();
  95. return RET_STATUS::RET_SUCCEED;
  96. }
  97. RET_STATUS nsSYN::DynBoxDevice::SetGeneratortoSyncStatus(int state)
  98. {
  99. string strStateName = "";
  100. int nstate = -1;
  101. mLog::Info("\n SetGeneratortoSyncStatus :{$} m_bSynUpdataGenerStatus :{$}", state, m_bSynUpdataGenerStatus);
  102. if (state == AttrKey::GENERATOR_FLU_OFF || state == AttrKey::GENERATOR_RAD_OFF)//如果是采集结束的消息,直接恢复同步盒状态
  103. {
  104. ClearSignal();
  105. }
  106. if (m_SynBoxUnit.m_GenSynState->Get() != state || state == AttrKey::GENERATOR_RAD_XRAYON || state == AttrKey::GENERATOR_RAD_XRAYOFF
  107. || state == AttrKey::GENERATOR_FLU_XRAYON || state == AttrKey::GENERATOR_FLU_XRAYOFF)
  108. {
  109. mLog::Info("switch :{$}\n", state);
  110. switch (state)
  111. {
  112. case AttrKey::GENERATOR_RAD_PREPARE:
  113. m_nCurrentExpTimes = 0;
  114. strStateName = "HANDSWITCHPREPREQUEST";
  115. nstate = 1;
  116. m_nInExpState = true;
  117. m_wStartEXPTime = GetTickCount();
  118. break;
  119. case AttrKey::GENERATOR_RAD_READY:
  120. m_nCurrentExpTimes = 0;
  121. strStateName = "HANDSWITCHREADYREQUEST";
  122. nstate = 1;
  123. break;
  124. case AttrKey::GENERATOR_RAD_OFF:
  125. m_nCurrentExpTimes = 0;
  126. m_nExpTimes = -1;
  127. m_nInExpState = false;
  128. /*strStateName = "HANDSWITCHREADYREQUEST";
  129. nstate = 0;
  130. ((DYNSyncBox*)GetDrvDPC())->SetSignal(strStateName.c_str(), state);
  131. Sleep(30);
  132. strStateName = "GENEXPREQUEST";
  133. nstate = 0;
  134. ((DYNSyncBox*)GetDrvDPC())->SetSignal(strStateName.c_str(), state);
  135. Sleep(30);
  136. strStateName = "HANDSWITCHPREPREQUEST";
  137. nstate = 0;*/
  138. break;
  139. case AttrKey::GENERATOR_FLU_READY:
  140. m_nCurrentExpTimes = 0;
  141. strStateName = "HANDSWITCHPREPREQUEST";
  142. nstate = 1;
  143. SetSignal(strStateName.c_str(), nstate);
  144. Sleep(30);
  145. strStateName = "HANDSWITCHREADYREQUEST";
  146. nstate = 1;
  147. break;
  148. case AttrKey::GENERATOR_FLU_OFF:
  149. m_nCurrentExpTimes = 0;
  150. m_nExpTimes = -1;
  151. /*strStateName = "HANDSWITCHREADYREQUEST";
  152. nstate = 0;
  153. ((DYNSyncBox*)GetDrvDPC())->SetSignal(strStateName.c_str(), nstate);
  154. Sleep(30);
  155. strStateName = "HANDSWITCHPREPREQUEST";*/
  156. break;
  157. case AttrKey::GENERATOR_RAD_XRAYON:
  158. m_bINEEnable = true;
  159. strStateName = "GENEXPREQUEST";
  160. nstate = 1;
  161. if (m_bSynUpdataGenerStatus)
  162. {
  163. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
  164. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  165. }
  166. break;
  167. case AttrKey::GENERATOR_RAD_XRAYOFF:
  168. if (m_SynBoxUnit.m_ExpMode->JSGet() != "ContinueSerial")
  169. {
  170. strStateName = "GENEXPREQUEST";
  171. nstate = 0;
  172. }
  173. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYOFF);
  174. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  175. break;
  176. case AttrKey::GENERATOR_FLU_XRAYON:
  177. m_bINEEnable = true;
  178. strStateName = "GENEXPREQUEST";
  179. nstate = 1;
  180. if (m_bSynUpdataGenerStatus)
  181. {
  182. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYON);
  183. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  184. }
  185. break;
  186. case AttrKey::GENERATOR_FLU_XRAYOFF:
  187. if (m_SynBoxUnit.m_ExpMode->JSGet() != "ContinueSerial")
  188. {
  189. strStateName = "GENEXPREQUEST";
  190. nstate = 0;
  191. }
  192. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYOFF);
  193. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  194. break;
  195. default:
  196. strStateName = "";
  197. nstate = -1;
  198. break;
  199. }
  200. if (state == AttrKey::GENERATOR_FLU_OFF || state == AttrKey::GENERATOR_RAD_OFF)//如果是采集结束的消息,直接恢复同步盒状态
  201. {
  202. if (!m_bClear)
  203. {
  204. ClearSignal();
  205. m_bClear = true;
  206. }
  207. m_SynBoxUnit.m_GenSynState->Update(state);
  208. }
  209. else if (strStateName != "" && nstate >= 0)
  210. {
  211. m_bClear = false;
  212. SetSignal(strStateName.c_str(), nstate);
  213. m_SynBoxUnit.m_GenSynState->Update(state);
  214. }
  215. }
  216. else
  217. {
  218. mLog::Info("switch :{$}, PreSetGeneratortoSyncStatus=false\n", state);
  219. }
  220. return RET_STATUS::RET_SUCCEED;
  221. }
  222. RET_STATUS nsSYN::DynBoxDevice::SetExpEnable()
  223. {
  224. return RET_STATUS::RET_SUCCEED;
  225. }
  226. RET_STATUS nsSYN::DynBoxDevice::SetExpDisable()
  227. {
  228. ClearSignal();
  229. return RET_STATUS::RET_SUCCEED;
  230. }
  231. RET_STATUS nsSYN::DynBoxDevice::PrepareAcquisition()
  232. {
  233. return RET_STATUS::RET_SUCCEED;
  234. }
  235. RET_STATUS nsSYN::DynBoxDevice::StartWindowRequest()
  236. {
  237. m_bINEEnable = true;
  238. string strStateName = "DETREACQREQUEST";
  239. int state = 1;
  240. SetSignal(strStateName.c_str(), state);
  241. SetPWMState(true);
  242. return RET_STATUS::RET_SUCCEED;
  243. }
  244. RET_STATUS nsSYN::DynBoxDevice::SetExposureTimes(int nNum)
  245. {
  246. if ((m_SynBoxUnit.m_ExpMode->JSGet() == "SingleRad") || (m_SynBoxUnit.m_ExpMode->JSGet() == "TOMO"))
  247. {
  248. m_nExpTimes = 1;
  249. }
  250. else
  251. {
  252. m_nExpTimes = nNum;
  253. }
  254. SetAreaType();
  255. return RET_STATUS::RET_SUCCEED;
  256. }
  257. RET_STATUS nsSYN::DynBoxDevice::StopWindowRequest()
  258. {
  259. m_bINEEnable = false;
  260. string strStateName = "DETREACQREQUEST";
  261. int state = 0;
  262. SetSignal(strStateName.c_str(), state);
  263. SetPWMState(false);
  264. return RET_STATUS::RET_SUCCEED;
  265. }
  266. RET_STATUS nsSYN::DynBoxDevice::SetFrameRate(FLOAT frameRate)
  267. {
  268. SetPWM(frameRate);
  269. return RET_STATUS::RET_SUCCEED;
  270. }
  271. RET_STATUS nsSYN::DynBoxDevice::SimulateFootSwitchSignal(int signal)
  272. {
  273. SetFootSwitchStatus(signal);
  274. return RET_STATUS::RET_SUCCEED;
  275. }
  276. RET_STATUS nsSYN::DynBoxDevice::SetValue_PPS(FLOAT fluframeRate)
  277. {
  278. SetPWM(fluframeRate);
  279. return RET_STATUS::RET_SUCCEED;
  280. }
  281. RET_STATUS nsSYN::DynBoxDevice::SetGenAECSignal(int signal)
  282. {
  283. return RET_STATUS::RET_SUCCEED;
  284. }
  285. RET_STATUS nsSYN::DynBoxDevice::SimulateHandSwitchSignal(string channel, int state)
  286. {
  287. mLog::Info("Enter SimulateHandSwitchSignal:[{$}:{$}]", channel.c_str(), state);
  288. DealtheSignal(channel.c_str(), state);
  289. return RET_STATUS::RET_SUCCEED;
  290. }
  291. //RET_STATUS nsSYN::DynBoxDevice::SetV3GentoSyncStatus(int status)
  292. //{
  293. // return RET_STATUS::RET_SUCCEED;
  294. //}
  295. //-----------------------------------------------------------------------------
  296. // ProcessCmd
  297. //-----------------------------------------------------------------------------
  298. void nsSYN::DynBoxDevice::FireNotify(std::string key, std::string content)
  299. {
  300. EventCenter->OnNotify(1, key, content);
  301. }
  302. //static bool DecodeFrame(const char* strFrame, int length);
  303. // 收到硬件的通知, 有包到达
  304. // 按照设计, 仅当数据有变化时, 才发通知到上层, 因此里面有大量的 if (..) FireNotify (..)
  305. void nsSYN::DynBoxDevice::OnCallBack()
  306. {
  307. //auto HWNotProcess = [](const char* value, int length) -> void
  308. //{
  309. // printf("\n This commands didn't need to process!\n");
  310. //};
  311. //auto HWSignal = [this](const char* value, int length)
  312. //{
  313. // string sCmdID = ((string)value).substr(8, 3);
  314. // int nlen = value[11] * 256 + value[12];
  315. //};
  316. //// 有部分前缀是包含关系, 长的包含短的, 例如 KVS 包含了 KV.
  317. //// 因此长的在前面, 短的在后面
  318. //// !!! Device 是个短寿命对象, 而 arFrame 是静态变量 !!!
  319. //// !!! 因此, 在添加到 arFrame 之前, 务必先清零 !!!
  320. //
  321. //arFrame.push_back(tFrameMapping("SRA", 3, HWNotProcess));
  322. //arFrame.push_back(tFrameMapping("SEC", 3, HWNotProcess));
  323. //arFrame.push_back(tFrameMapping("SPT", 3, HWNotProcess));
  324. //arFrame.push_back(tFrameMapping("SRS", 3, HWNotProcess));
  325. //arFrame.push_back(tFrameMapping("SAI", 3, HWSignal));
  326. //arFrame.push_back(tFrameMapping("SWS", 3, HWSignal));
  327. }
  328. int nsSYN::DynBoxDevice::DealtheSignal(const char* channel, int state)
  329. {
  330. string strchannel = channel;
  331. m_DYNMap.m_MapChannelState[strchannel] = state;
  332. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  333. {
  334. mLog::Error( "DealtheSignal Didn't find SynMode : {$}", m_strSYNMode.c_str());
  335. return -1;
  336. }
  337. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  338. {
  339. mLog::Error( "DealtheSignal Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  340. return -1;
  341. }
  342. size_t count = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"].size();
  343. string strSignalName = "";
  344. int nState = -1;
  345. mLog::Info( "CurrentExamMode = {$}, strchannel = {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str(), strchannel.c_str());
  346. for (int i = 0; i < count; i++)
  347. {
  348. string strKey = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"].GetKey(i);
  349. string confchannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strKey.c_str()]["CHANNEL"];
  350. mLog::Info( "strKey = {$}, confchannel = {$}", strKey.c_str(), confchannel.c_str());
  351. if (confchannel == strchannel)
  352. {
  353. strSignalName = strKey;
  354. nState = state;
  355. mLog::Info( "Signal Name = {$}", strSignalName.c_str());
  356. mLog::Info("\nSignal Name = {$}, state = {$}\n", strSignalName.c_str(), nState);
  357. break;
  358. }
  359. }
  360. if (strSignalName != "" && nState >= 0)
  361. {
  362. if (strSignalName == "XWINDOWSTATUS")
  363. {
  364. strSignalName = "XWINDOWSTATUS";
  365. }
  366. else if (strSignalName == "GENREADY")
  367. {
  368. strSignalName = "GENREADY";
  369. }
  370. NotifySignal(strSignalName.c_str(), nState);
  371. string strSetEnableSignal = (string)ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["SETENABLE"];
  372. string strSetDisableSignal = (string)ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["SETDISABLE"];
  373. if (nState == 1 && strSetEnableSignal != "")
  374. {
  375. string strRelaySignal = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["RELAY"];
  376. if (strRelaySignal != "")
  377. {
  378. string channel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strRelaySignal.c_str()]["CHANNEL"];
  379. if (nState == m_DYNMap.m_MapChannelState[channel])
  380. {
  381. mLog::Info( "Set Enable Signal = {$}", strSetEnableSignal.c_str());
  382. SetSignal(strSetEnableSignal.c_str(), nState);
  383. }
  384. }
  385. else
  386. {
  387. mLog::Info( "Set Enable Signal = {$}", strSetEnableSignal.c_str());
  388. SetSignal(strSetEnableSignal.c_str(), nState);
  389. }
  390. }
  391. else if (state == 0 && strSetDisableSignal != "")
  392. {
  393. string strRelaySignal = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strSignalName.c_str()]["RELAY"];
  394. if (strRelaySignal != "")
  395. {
  396. string channel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["INPUT"][strRelaySignal.c_str()]["CHANNEL"];
  397. if (1 == m_DYNMap.m_MapChannelState[channel])
  398. {
  399. mLog::Info( "Set Disable Signal = {$}", strSetDisableSignal.c_str());
  400. SetSignal(strSetDisableSignal.c_str(), state);
  401. }
  402. }
  403. else
  404. {
  405. mLog::Info( "Set Disable Signal = {$}", strSetDisableSignal.c_str());
  406. SetSignal(strSetDisableSignal.c_str(), state);
  407. }
  408. }
  409. }
  410. return 2;
  411. }
  412. int nsSYN::DynBoxDevice::NotifySignal(const char* name, int state)
  413. {
  414. string strname = name;
  415. mLog::Info( "Send Notify : Name = {$}, State = {$}", name, state);
  416. if (strname == "HANDSWITCHPREP")
  417. {
  418. if (state)
  419. {
  420. m_SynBoxUnit.m_HandSwitchState->Update(1);
  421. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  422. }
  423. else
  424. {
  425. m_SynBoxUnit.m_HandSwitchState->Update(0);
  426. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  427. }
  428. }
  429. else if (strname == "HANDSWITCHREADY")
  430. {
  431. //if (state)
  432. //{
  433. // m_SynBoxUnit.m_HandSwitchState->Update(2);
  434. // FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  435. //}
  436. //else
  437. //{
  438. // m_SynBoxUnit.m_HandSwitchState->Update(0);
  439. // FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  440. //}
  441. if (m_SynBoxUnit.m_ExpMode->JSGet() != "SingleRad")
  442. {
  443. if (state)
  444. {
  445. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_READY);
  446. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  447. m_bSendXindowOnMessage = true;
  448. m_bSendXindowOffMessage = false;
  449. }
  450. else
  451. {
  452. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_OFF);
  453. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  454. if (m_SynBoxUnit.m_ExpMode->JSGet() == "ContinueSerial")
  455. {
  456. StopWindowRequest();
  457. }
  458. m_bSendXindowOnMessage = false;
  459. m_bSendXindowOffMessage = true;
  460. }
  461. }
  462. else
  463. {
  464. if (state)
  465. {
  466. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
  467. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  468. m_bSendXindowOnMessage = true;
  469. m_bSendXindowOffMessage = false;
  470. }
  471. else
  472. {
  473. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  474. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  475. m_bSendXindowOnMessage = false;
  476. m_bSendXindowOffMessage = true;
  477. }
  478. }
  479. }
  480. else if (strname == "GENPREP")
  481. {
  482. if (state)
  483. {
  484. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_PREPARE);
  485. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  486. }
  487. else
  488. {
  489. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  490. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  491. }
  492. }
  493. else if (strname == "GENREADY")
  494. {
  495. if (m_SynBoxUnit.m_ExpMode->JSGet() != "SingleRad")
  496. {
  497. if (state)
  498. {
  499. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_READY);
  500. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  501. m_bSendXindowOnMessage = true;
  502. m_bSendXindowOffMessage = false;
  503. }
  504. else
  505. {
  506. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_OFF);
  507. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  508. if (m_SynBoxUnit.m_ExpMode->JSGet() == "ContinueSerial")
  509. {
  510. StopWindowRequest();
  511. }
  512. m_bSendXindowOnMessage = false;
  513. m_bSendXindowOffMessage = true;
  514. }
  515. }
  516. else
  517. {
  518. if (state)
  519. {
  520. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_READY);
  521. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  522. m_bSendXindowOnMessage = true;
  523. m_bSendXindowOffMessage = false;
  524. }
  525. else
  526. {
  527. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_OFF);
  528. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  529. m_bSendXindowOnMessage = false;
  530. m_bSendXindowOffMessage = true;
  531. }
  532. }
  533. }
  534. else if (strname == "XWINDOWSTATUS")
  535. {
  536. if (state )
  537. {
  538. if (m_bSendXindowOnMessage == true && m_bINEEnable)
  539. {
  540. m_SynBoxUnit.m_DetectorWindowState->Update(AttrKey::XWINDOW_ON);
  541. FireNotify(m_SynBoxUnit.m_DetectorWindowState->GetKey(), m_SynBoxUnit.m_DetectorWindowState->JSGet());
  542. m_bSendXindowOnMessage = false;
  543. }
  544. }
  545. else
  546. {
  547. if (m_bSendXindowOffMessage == true)
  548. {
  549. m_SynBoxUnit.m_DetectorWindowState->Update(AttrKey::XWINDOW_OFF);
  550. FireNotify(m_SynBoxUnit.m_DetectorWindowState->GetKey(), m_SynBoxUnit.m_DetectorWindowState->JSGet());
  551. m_bSendXindowOffMessage = false;
  552. }
  553. }
  554. }
  555. else if (strname == "GENEXPSTATUS")
  556. {
  557. if (m_SynBoxUnit.m_ExpMode->JSGet() != "SingleRad")
  558. {
  559. if (state)
  560. {
  561. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYON);
  562. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  563. m_nCurrentExpTimes++;
  564. }
  565. else
  566. {
  567. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_FLU_XRAYOFF);
  568. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  569. }
  570. }
  571. else
  572. {
  573. if (state)
  574. {
  575. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYON);
  576. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  577. m_nCurrentExpTimes++;
  578. }
  579. else
  580. {
  581. m_SynBoxUnit.m_GenSynState->Update(AttrKey::GENERATOR_RAD_XRAYOFF);
  582. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  583. }
  584. }
  585. }
  586. return 2;
  587. }
  588. int nsSYN::DynBoxDevice::SetSignal(const char* name, int state)
  589. {
  590. string strtemp = name;
  591. string strName = "";
  592. std::size_t npos;
  593. while ((npos = strtemp.find_first_of(",")) != string::npos)
  594. {
  595. strName = strtemp.substr(0, npos);
  596. npos++;
  597. strtemp = strtemp.substr(npos, strtemp.size() - npos);
  598. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  599. {
  600. mLog::Error( "SetSignal Didn't find SynMode : {$}", m_strSYNMode.c_str());
  601. return -1;
  602. }
  603. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  604. {
  605. mLog::Error( "Set Signal {$}, state {$} ", name, state);
  606. mLog::Error( "Didn't find m_SynBoxUnit.m_ExpMode->JSGet() : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  607. return -1;
  608. }
  609. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"][strName.c_str()]["CHANNEL"];
  610. if (strChannel != "")
  611. {
  612. if (strName == "GENEXPREQUEST")
  613. {
  614. if (m_bINEEnable)
  615. {
  616. //m_nCurrentExpTimes++;
  617. if (m_nExpTimes > 0 && m_nCurrentExpTimes > m_nExpTimes)
  618. {
  619. mLog::Warn( "m_nExpTimes has been enough in this sequence! m_nExpTimes={$},m_nCurrentExpTimes={$}", m_nExpTimes, m_nCurrentExpTimes);
  620. return true;
  621. }
  622. }
  623. else
  624. {
  625. mLog::Warn( "Generator didn't ready or detector didn't startAcq, So can't send INE to generator!");
  626. return true;
  627. }
  628. }
  629. mLog::Info( "Set Signal {$}, state {$} ", name, state);
  630. SendBySCF(strChannel.c_str(), state);
  631. //Sleep(10);
  632. }
  633. }
  634. strName = strtemp;
  635. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  636. {
  637. mLog::Error( "ResDYNConfig Didn't find SynMode : {$}", m_strSYNMode.c_str());
  638. return -1;
  639. }
  640. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  641. {
  642. mLog::Error( "Set Signal {$}, state {$} ", name, state);
  643. mLog::Error( "Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  644. return -1;
  645. }
  646. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"][strName.c_str()]["CHANNEL"];
  647. if (strChannel != "")
  648. {
  649. if (strName == "GENEXPREQUEST")
  650. {
  651. if (m_bINEEnable)
  652. {
  653. //m_nCurrentExpTimes++;
  654. if (m_nExpTimes > 0 && m_nCurrentExpTimes > m_nExpTimes)
  655. {
  656. mLog::Warn( "m_nExpTimes has been enough in this sequence! m_nExpTimes={$},m_nCurrentExpTimes={$}", m_nExpTimes, m_nCurrentExpTimes);
  657. return true;
  658. }
  659. }
  660. else
  661. {
  662. mLog::Warn( "Generator didn't ready or detector didn't startAcq, So can't send INE to generator!");
  663. return true;
  664. }
  665. }
  666. mLog::Info( "Set Signal {$}, state {$} ", name, state);
  667. SendBySCF(strChannel.c_str(), state);
  668. return 1;
  669. }
  670. return -1;
  671. }
  672. void nsSYN::DynBoxDevice::ClearSignal()
  673. {
  674. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  675. {
  676. mLog::Error( "ClearSignal Didn't find SynMode : {$}", m_strSYNMode.c_str());
  677. return;
  678. }
  679. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  680. {
  681. mLog::Error( "Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  682. return;
  683. }
  684. SetPWMState(false);
  685. size_t nsize = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"].size();
  686. for (int i = 0; i < nsize; i++)
  687. {
  688. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"][i]["CHANNEL"];
  689. string name = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"].GetKey(i);
  690. mLog::Info( "Clear Name :{$},CurrentExamMode ={$}", name.c_str(), m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  691. if (strChannel != "" && "FRAMERATE" != name)
  692. {
  693. mLog::Info( "Clear Signal {$} ", strChannel);
  694. SendBySCF(strChannel.c_str(), false);
  695. Sleep(10);
  696. }
  697. }
  698. return;
  699. }
  700. int nsSYN::DynBoxDevice::SetPWMState(bool state)
  701. {
  702. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  703. {
  704. mLog::Error( "SetPWMState Didn't find SynMode : {$}", m_strSYNMode.c_str());
  705. return -1;
  706. }
  707. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  708. {
  709. mLog::Warn( "SetPWMState Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  710. return -1;
  711. }
  712. if (ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"].GetFirstOf("FRAMERATE") < 0)
  713. {
  714. return 1;
  715. }
  716. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"]["FRAMERATE"]["CHANNEL"];
  717. if (strChannel != "")
  718. {
  719. if (state)
  720. {
  721. SendSPEBySCF(strChannel.c_str(), 3, 1, 500);
  722. }
  723. else
  724. {
  725. SendSPEBySCF(strChannel.c_str(), 0, 0, 500);
  726. }
  727. return 1;
  728. }
  729. return -1;
  730. }
  731. int nsSYN::DynBoxDevice::SetPWM(float fpps)
  732. {
  733. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  734. {
  735. mLog::Error( "SetPWM Didn't find SynMode : {$}", m_strSYNMode.c_str());
  736. return -1;
  737. }
  738. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  739. {
  740. mLog::Warn( "SetPWM Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  741. return -1;
  742. }
  743. if (ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"].GetFirstOf("FRAMERATE") < 0)
  744. {
  745. mLog::Warn( "SetPWM CurrentExamMode : {$} didn't find FRAMERATE configration", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  746. return 1;
  747. }
  748. if (fpps < 0.5)
  749. {
  750. mLog::Warn( "fpps : %f <0.5", fpps);
  751. return 1;
  752. }
  753. string strChannel = ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["OUTPUT"]["FRAMERATE"]["CHANNEL"];
  754. if (strChannel != "")
  755. {
  756. mLog::Info("\n Set PWM {$} \n", strChannel.c_str());
  757. int nCycle = (int)((float)10000 / fpps + 0.5);
  758. //m_nCircleTime = nCycle;
  759. int pulse = 100;
  760. SendSPSBySCF(strChannel.c_str(), nCycle, pulse, 500);
  761. //SendSPEBySCF(strChannel.c_str(),3,1,500);
  762. return 1;
  763. }
  764. return -1;
  765. }
  766. int nsSYN::DynBoxDevice::SetAreaType()
  767. {
  768. if (ResDYNConfig.GetFirstOf(m_strSYNMode.c_str()) < 0)
  769. {
  770. mLog::Error( "SetAreaType Didn't find SynMode : {$}", m_strSYNMode.c_str());
  771. return 0;
  772. }
  773. if (ResDYNConfig[m_strSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  774. {
  775. mLog::Error( "SetAreaType Didn't find CurrentExamMode : {$}", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  776. return 0;
  777. }
  778. if (ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()].GetFirstOf("AREAID") >= 0 && ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()].GetFirstOf("EXOCOUNTS") >= 0)
  779. {
  780. string areaid = (string)ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["AREAID"];
  781. string exocounts = (string)ResDYNConfig[m_strSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()]["EXOCOUNTS"];
  782. if (areaid.size() > 0 && exocounts.size() >= 2)
  783. {
  784. if (m_nExpTimes != 0)
  785. {
  786. mLog::Info("SetAreaType m_nExpTimes Value {$}", m_nExpTimes);
  787. exocounts = std::to_string(m_nExpTimes);
  788. }
  789. SendSMSBySCF(areaid.c_str(), exocounts.c_str(), 500);
  790. }
  791. return 1;
  792. }
  793. else
  794. {
  795. mLog::Error( "CurrentExamMode : {$} didn't have AREAID or EXOCOUNTS", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  796. return 0;
  797. }
  798. }
  799. RET_STATUS nsSYN::DynBoxDevice::SendBySCF(const char* chChannelID, bool bStatus)
  800. {
  801. int nTimeout = 100;
  802. char cCmd[MAX_COMMAND_LEN] = "SWSA03";
  803. cCmd[6] = chChannelID[0];
  804. cCmd[7] = chChannelID[1];
  805. if (bStatus)
  806. cCmd[8] = '1';
  807. else
  808. cCmd[8] = '0';
  809. int nSize = 9;
  810. FormatCmd(cCmd, nSize);
  811. mLog::Info( "[Send:{$}]", cCmd);
  812. if (!m_SCF)
  813. {
  814. mLog::Error("SCF is NULL");
  815. return RET_STATUS::RET_FAILED;
  816. }
  817. mLog::Info("==OUT==: {$} \n", cCmd);
  818. int ret = 0;
  819. m_SCF.Lock(msTimeOut_Lock)
  820. .SendPacket(cCmd, nSize, nTimeout, ret);
  821. Sleep(nTimeout);
  822. return RET_STATUS::RET_SUCCEED;
  823. }
  824. RET_STATUS nsSYN::DynBoxDevice::SendSPSBySCF(const char* chChannelID, int nCycle, int nPulse, int nWaitTime)
  825. {
  826. int nTimeout = nWaitTime;
  827. char cCmd[MAX_COMMAND_LEN] = "SPSB0A";
  828. cCmd[6] = chChannelID[0];
  829. cCmd[7] = chChannelID[1];
  830. char chrtemp[8];
  831. sprintf_s(chrtemp, 8, "%04x", nCycle);
  832. cCmd[8] = chrtemp[0];
  833. cCmd[9] = chrtemp[1];
  834. cCmd[10] = chrtemp[2];
  835. cCmd[11] = chrtemp[3];
  836. sprintf_s(chrtemp, 8, "%04x", nPulse);
  837. cCmd[12] = chrtemp[0];
  838. cCmd[13] = chrtemp[1];
  839. cCmd[14] = chrtemp[2];
  840. cCmd[15] = chrtemp[3];
  841. int nSize = 16;
  842. FormatCmd(cCmd, nSize);
  843. mLog::Info("==OUT==: {$} \n", cCmd);
  844. int ret = 0;
  845. m_SCF.Lock(msTimeOut_Lock)
  846. .SendPacket(cCmd, nSize, nTimeout, ret);
  847. Sleep(nTimeout);
  848. return RET_STATUS::RET_SUCCEED;
  849. }
  850. RET_STATUS nsSYN::DynBoxDevice::SendSPEBySCF(const char* chChannelID, UCHAR cMode, UCHAR cEnable, int nWaitTime)
  851. {
  852. int nTimeout = nWaitTime;
  853. char cCmd[MAX_COMMAND_LEN] = "SPEA04";
  854. cCmd[6] = chChannelID[0];
  855. cCmd[7] = chChannelID[1];
  856. char chrtemp[2];
  857. sprintf_s(chrtemp, 2, "%01x", cMode);
  858. cCmd[8] = chrtemp[0];
  859. sprintf_s(chrtemp, 2, "%01x", cEnable);
  860. cCmd[9] = chrtemp[0];
  861. int nSize = 10;
  862. FormatCmd(cCmd, nSize);
  863. mLog::Info("==OUT==: {$} \n", cCmd);
  864. int ret = 0;
  865. m_SCF.Lock(msTimeOut_Lock)
  866. .SendPacket(cCmd, nSize, nTimeout, ret);
  867. Sleep(nTimeout);
  868. return RET_STATUS::RET_SUCCEED;
  869. }
  870. RET_STATUS nsSYN::DynBoxDevice::SendSMSBySCF(const char* cExpMode, const char* cExpCount, int nWaitTime)
  871. {
  872. int nTimeout = nWaitTime;
  873. char cCmd[MAX_COMMAND_LEN] = "SMSA03";
  874. string strExpMode = cExpMode;
  875. string strExpCount = cExpCount;
  876. cCmd[6] = strExpMode[0];
  877. cCmd[7] = strExpCount[0];
  878. cCmd[8] = strExpCount[1];
  879. int nSize = 9;
  880. FormatCmd(cCmd, nSize);
  881. mLog::Info("==OUT==: {$} \n", cCmd);
  882. int ret = 0;
  883. m_SCF.Lock(msTimeOut_Lock)
  884. .SendPacket(cCmd, nSize, nTimeout, ret);
  885. Sleep(nTimeout);
  886. return RET_STATUS::RET_SUCCEED;
  887. }
  888. int nsSYN::DynBoxDevice::SetFootSwitchStatus(int signal)
  889. {
  890. string strStateName = "FOOTSWITCHSATUS";
  891. SetSignal(strStateName.c_str(), signal);
  892. return 1;
  893. }