DeviceFullUCB.cpp 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080
  1. #include "stdafx.h"
  2. #include "DeviceFullUCB.hpp"
  3. #include "Helper.JSON.hpp"
  4. using namespace DIOS::Dev::Detail::SYNBOX;
  5. namespace nsSYN = DIOS::Dev::Detail::SYNBOX;
  6. //-----------------------------------------------------------------------------
  7. // DeviceFullUCB
  8. //-----------------------------------------------------------------------------
  9. nsSYN::DeviceFullUCB::DeviceFullUCB(std::shared_ptr <IOEventCenter> center, string configfile)
  10. {
  11. EventCenter = center;
  12. m_SynBoxUnit.m_SynBoxState.reset(new SYNSTATEMould(AttrKey::SYNBOX_STATUS_STANDBY, AttrKey::SYNBOX_STATUS_SHUTDOWN, AttrKey::SYNBOX_STATUS_SERVICE, 1));
  13. m_SynBoxUnit.m_WS.reset(new WORKSTATIONMould(""));
  14. m_SynBoxUnit.m_CurrentExpNumber.reset(new CUREXPNUMMould(0, 0, 10000, 1));
  15. m_SynBoxUnit.m_HandSwitchState.reset(new HANDSWITCHMould(AttrKey::HAND_OFF, AttrKey::HAND_OFF, AttrKey::HAND_MAX, 1));
  16. m_SynBoxUnit.m_GenSynState.reset(new GENSYNSTATEMould(AttrKey::GENERATOR_RAD_OFF, AttrKey::GENERATOR_RAD_OFF, AttrKey::GENERATOR_SYNC_MAX, 1));
  17. m_SynBoxUnit.m_TotalExpNumber.reset(new TOTALEXPNUMMould(0, 0, 10000, 1));
  18. m_SynBoxUnit.m_DetectorState.reset(new DETECTORSTATUSMould(AttrKey::DETECTOR_STATUS_SHUTDOWN, AttrKey::DETECTOR_STATUS_SHUTDOWN, AttrKey::DETECTOR_STATUS_MAX, 1));
  19. m_SynBoxUnit.m_DetectorWindowState.reset(new XWINDOWSTATUSMould(AttrKey::XWINDOW_OFF, AttrKey::XWINDOW_OFF, AttrKey::XWINDOW_ON, 1));
  20. m_SynBoxUnit.m_ExpMode.reset(new EXPMODEMould(""));
  21. m_SynBoxUnit.m_GenExpFrameRate.reset(new EXPFRAMERATEMould(0, 0, 100, 1));
  22. m_SynBoxUnit.m_GenExpTimes.reset(new EXPTIMESMould(0, 0, 255, 1));
  23. m_SynBoxUnit.m_GridStatue.reset(new GRIDSYNSTATEMould(AttrKey::XGRID_DISABLE, AttrKey::XGRID_DISABLE, AttrKey::XGRID_ENABLE, 1));
  24. m_strCurrSYNMode = "SYN0";
  25. m_FullUCBMap_IN.clear();
  26. m_FullUCBMap_OUT.clear();
  27. m_WorkStationMap.clear();
  28. GetConfData(configfile);
  29. StartHardwareThread();
  30. }
  31. nsSYN::DeviceFullUCB::~DeviceFullUCB()
  32. {
  33. SetEvent(m_hExitEvent);
  34. Sleep(1000);
  35. if (m_pHardwareThread != NULL)
  36. {
  37. TerminateThread(m_pHardwareThread, 0);
  38. m_pHardwareThread = NULL;
  39. }
  40. }
  41. void nsSYN::DeviceFullUCB::Register(Dispatch* Dispatch)
  42. {
  43. superGen::Register(Dispatch);
  44. }
  45. RET_STATUS nsSYN::DeviceFullUCB::RefreshData()
  46. {
  47. mLog::FDEBUG("Enter RefreshData");
  48. UCBCmdSEC();
  49. return RET_STATUS::RET_SUCCEED;
  50. }
  51. bool nsSYN::DeviceFullUCB::StartHardwareThread()
  52. {
  53. mLog::FINFO("Enter Start HardwareStatus Thread");
  54. m_hExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  55. m_hPWMEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  56. if (m_pHardwareThread == NULL)
  57. {
  58. DWORD m_HardwareStatusID;
  59. m_pHardwareThread = CreateThread(0, 0, HardwareStatusThread, this, 0, &m_HardwareStatusID);
  60. if (m_pHardwareThread == NULL)
  61. {
  62. mLog::FERROR("Start HardwareStatus Thread Failed");
  63. return false;
  64. }
  65. }
  66. return true;
  67. }
  68. DWORD nsSYN::DeviceFullUCB::HardwareStatusThread(LPVOID pParam)
  69. {
  70. DeviceFullUCB* pCurSyn = (DeviceFullUCB*)pParam;
  71. if (pCurSyn == NULL)
  72. {
  73. return false;
  74. }
  75. mLog::FINFO("HardwareStatusThread start");
  76. DWORD event = 0;
  77. bool bExit = false;
  78. vector<HANDLE> waitList; //事件等待列表
  79. waitList.push_back(pCurSyn->m_hExitEvent);
  80. waitList.push_back(pCurSyn->m_hPWMEvent);
  81. while (!bExit)
  82. {
  83. event = WaitForMultipleObjects(waitList.size(), waitList.data(), FALSE, INFINITE);
  84. switch (event)
  85. {
  86. case (WAIT_TIMEOUT):
  87. {
  88. mLog::FWARN("HardwareStatusThread: Get loop EVENT timeout");
  89. }
  90. case WAIT_OBJECT_0:
  91. {
  92. mLog::FDEBUG("HardwareStatusThread: exited");
  93. bExit = true;
  94. break;
  95. }break;
  96. case (WAIT_OBJECT_0 + 1):
  97. {
  98. mLog::FDEBUG("HardwareStatusThread: wait[{$}]ms to stop PWM Enable", pCurSyn->m_PulseWidth);
  99. auto item = pCurSyn->m_FullUCBMap_OUT.find(CONF_FRAMERATE);
  100. if (item != pCurSyn->m_FullUCBMap_OUT.end())
  101. {
  102. string strChannel = item->second.strChannel;
  103. Sleep(pCurSyn->m_PulseWidth);
  104. //pCurSyn->UCBCmdSPE(strChannel, '0', '0');
  105. pCurSyn->UCBCmdSWS(strChannel, 0);
  106. item->second.nCurrStateValue = 0;
  107. pCurSyn->SetAreaType();
  108. }
  109. else
  110. {
  111. mLog::FWARN("HardwareStatusThread: not find CONF_FRAMERATE in FullUCBMap_OUT");
  112. }
  113. }break;
  114. default:
  115. {
  116. mLog::FDEBUG("HardwareStatusThread: unknown event");
  117. }break;
  118. }
  119. }
  120. pCurSyn->m_pHardwareThread = NULL;
  121. mLog::FINFO("HardwareStatusThread stop");
  122. return true;
  123. }
  124. //配置项获取
  125. bool nsSYN::DeviceFullUCB::GetConfData(string& configfile)
  126. {
  127. try {
  128. ResDataObject r_config;
  129. if (r_config.loadFile(configfile.c_str()))
  130. {
  131. m_ResFullUCBConfig = r_config["CONFIGURATION"];
  132. TransJsonText(m_ResFullUCBConfig);
  133. //UCB信号名
  134. if (m_ResFullUCBConfig.GetKeyCount("UCBTool") > 0)
  135. {
  136. string UCBTool = m_ResFullUCBConfig["UCBTool"];
  137. mLog::FDEBUG("cfg UCBTool[{$}]", UCBTool.c_str());
  138. }
  139. //是否代为发送发生器曝光状态
  140. if (m_ResFullUCBConfig.GetKeyCount("IsUpdateGenStatus") > 0)
  141. {
  142. string value = m_ResFullUCBConfig["IsUpdateGenStatus"];
  143. if (value.length() == AttrKey::GENERATOR_SYNC_MAX)
  144. m_bUpdateGenSyncStatusFlag = value;
  145. mLog::FDEBUG("cfg UpdateGenSyncStatusFlag[{$}]", m_bUpdateGenSyncStatusFlag.c_str());
  146. }
  147. //是否代为发送探测器开窗状态
  148. if (m_ResFullUCBConfig.GetKeyCount("IsUpdateFPDStatus") > 0)
  149. {
  150. string value = m_ResFullUCBConfig["IsUpdateFPDStatus"];
  151. if (value.length() == AttrKey::XWINDOW_MAX)
  152. m_bUpdateFPDXWinStatusFlag = value;
  153. mLog::FDEBUG("cfg UpdateFPDXWinStatusFlag[{$}]", m_bUpdateFPDXWinStatusFlag.c_str());
  154. }
  155. //是否在更新曝光模式时自动重置所有输出信号
  156. if (m_ResFullUCBConfig.GetKeyCount("IsAutoClearSignalFlag") > 0)
  157. {
  158. m_bIsAutoClearSignalFlag = (int)m_ResFullUCBConfig["IsAutoClearSignalFlag"];
  159. mLog::FDEBUG("cfg IsAutoClearSignalFlag[{$}]", m_bIsAutoClearSignalFlag);
  160. }
  161. //是否按模式控制PWM脉冲数量
  162. if (m_ResFullUCBConfig.GetKeyCount("IsCtlPWMWithModeFlag") > 0)
  163. {
  164. m_bIsCtlPWMWithMode = (int)m_ResFullUCBConfig["IsCtlPWMWithModeFlag"];
  165. mLog::FDEBUG("cfg IsCtlPWMWithModeFlag[{$}]", m_bIsCtlPWMWithMode);
  166. }
  167. //是否按发生器状态控制PWM使能
  168. if (m_ResFullUCBConfig.GetKeyCount("IsCtlPWMWithGenFlag") > 0)
  169. {
  170. m_bIsCtlPWMWithGen = (int)m_ResFullUCBConfig["IsCtlPWMWithGenFlag"];
  171. mLog::FDEBUG("cfg IsCtlPWMWithGenFlag[{$}]", m_bIsCtlPWMWithGen);
  172. }
  173. //同步信号表
  174. if (m_ResFullUCBConfig.GetKeyCount(CONF_TABLE) > 0)
  175. {
  176. string WS = m_ResFullUCBConfig[CONF_TABLE];
  177. m_WorkStationMap[CONF_TABLE] = WS;
  178. mLog::FDEBUG("cfg WS[{$}],SYN[{$}]", CONF_TABLE, WS.c_str());
  179. }
  180. if (m_ResFullUCBConfig.GetKeyCount(CONF_WALL) > 0)
  181. {
  182. string WS = m_ResFullUCBConfig[CONF_WALL];
  183. m_WorkStationMap[CONF_WALL] = WS;
  184. mLog::FDEBUG("cfg WS[{$}],SYN[{$}]", CONF_WALL, WS.c_str());
  185. }
  186. if (m_ResFullUCBConfig.GetKeyCount(CONF_FREE) > 0)
  187. {
  188. string WS = m_ResFullUCBConfig[CONF_FREE];
  189. m_WorkStationMap[CONF_FREE] = WS;
  190. mLog::FDEBUG("cfg WS[{$}],SYN[{$}]", CONF_FREE, WS.c_str());
  191. }
  192. if (m_ResFullUCBConfig.GetKeyCount(CONF_DIRE) > 0)
  193. {
  194. string WS = m_ResFullUCBConfig[CONF_DIRE];
  195. m_WorkStationMap[CONF_DIRE] = WS;
  196. mLog::FDEBUG("cfg WS[{$}],SYN[{$}]", CONF_DIRE, WS.c_str());
  197. }
  198. }
  199. else
  200. {
  201. mLog::FERROR("loadFullUCBConfigFile [{$}] failed", configfile.c_str());
  202. }
  203. }
  204. catch (ResDataObjectExption& e)
  205. {
  206. mLog::FERROR("GetConfData crashed: Exption[{$}]", e.what());
  207. return false;
  208. }
  209. catch (...)
  210. {
  211. mLog::FERROR("GetConfData crashed: unll[{$}]", configfile.c_str());
  212. return false;
  213. }
  214. return true;
  215. }
  216. bool nsSYN::DeviceFullUCB::GetConfChannel(string expMode)
  217. {
  218. mLog::FDEBUG("Enter GetConfChannel:SYN[{$}],mode[{$}]", m_strCurrSYNMode.c_str(), m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  219. try {
  220. if (m_ResFullUCBConfig.size() > 0)
  221. {
  222. if (!m_strCurrSYNMode.empty())
  223. {
  224. if (m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()].GetFirstOf(m_SynBoxUnit.m_ExpMode->JSGet().c_str()) < 0)
  225. {
  226. mLog::FERROR("Didn't find CurrentExpMode:[{$}]", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  227. return false;
  228. }
  229. m_AreaID = (string)m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_AREAID];
  230. m_ExpCounts = (string)m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_EXOCOUNTS];
  231. mLog::FDEBUG("conf IO_MODE:AreaID[{$}], ExpCounts[{$}]", m_AreaID.c_str(), m_ExpCounts.c_str());
  232. //输入信号配置
  233. size_t count_in = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT].size();
  234. for (int i = 0; i < count_in; i++)
  235. {
  236. string strName = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT].GetKey(i);
  237. string confchannel = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT][strName.c_str()][CONF_CHANNEL];
  238. string confEnable = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT][strName.c_str()][CONF_ENABLE];
  239. string confDisable = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT][strName.c_str()][CONF_DISABLE];
  240. string confRelay = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT][strName.c_str()][CONF_RELAY];
  241. string confSetEnable = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT][strName.c_str()][CONF_SETENABLE];
  242. string confSetDisable = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_INPUT][strName.c_str()][CONF_SETDISABLE];
  243. mLog::FDEBUG("conf IO_IN:strName[{$}], confchannel[{$}]", strName.c_str(), confchannel.c_str());
  244. string strKey = confchannel;
  245. if (strKey.empty())
  246. {
  247. strKey = strName;
  248. }
  249. m_FullUCBMap_IN[strKey] = stru_IN_Signal(strName, confchannel, confEnable, confDisable, confRelay, confSetEnable, confSetDisable);
  250. }
  251. //输出信号配置
  252. size_t count_out = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT].size();
  253. for (int i = 0; i < count_out; i++)
  254. {
  255. string strName = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT].GetKey(i);
  256. string confchannel = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT][strName.c_str()][CONF_CHANNEL];
  257. string confEnableValue = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT][strName.c_str()][CONF_ENABLE];
  258. string confDisableValue = m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT][strName.c_str()][CONF_DISABLE];
  259. if (m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT][strName.c_str()].GetKeyCount(CONF_ALLOWANCE) > 0)
  260. {
  261. int confAllowance = (int)m_ResFullUCBConfig[CONFIG][m_strCurrSYNMode.c_str()][m_SynBoxUnit.m_ExpMode->JSGet().c_str()][CONF_OUTPUT][strName.c_str()][CONF_ALLOWANCE];
  262. m_FullUCBMap_OUT[strName] = stru_OUT_Signal(strName, confchannel, confEnableValue, confDisableValue, confAllowance);
  263. mLog::FDEBUG("conf IO_OUT:strName[{$}],confchannel[{$}],EnableValue[{$}],DisableValue[{$}],allowance[{$}]",
  264. strName.c_str(), confchannel.c_str(), confEnableValue.c_str(), confDisableValue.c_str(), confAllowance);
  265. }
  266. else
  267. {
  268. m_FullUCBMap_OUT[strName] = stru_OUT_Signal(strName, confchannel, confEnableValue, confDisableValue);
  269. mLog::FDEBUG("conf IO_OUT:strName[{$}],confchannel[{$}],EnableValue[{$}],DisableValue[{$}]",
  270. strName.c_str(), confchannel.c_str(), confEnableValue.c_str(), confDisableValue.c_str());
  271. }
  272. }
  273. }
  274. else
  275. {
  276. mLog::FERROR("strSYNMode is empty");
  277. }
  278. }
  279. else
  280. {
  281. mLog::FERROR("ResFullUCBConfig is empty");
  282. }
  283. }
  284. catch (ResDataObjectExption& e)
  285. {
  286. mLog::FERROR("GetConfChannel crashed: Exption[{$}]", e.what());
  287. return false;
  288. }
  289. catch (...)
  290. {
  291. mLog::FERROR("GetConfChannel crashed: unll[{$}]", expMode.c_str());
  292. return false;
  293. }
  294. return true;
  295. }
  296. // 同步盒方法
  297. RET_STATUS nsSYN::DeviceFullUCB::SetWS(std::string value)
  298. {
  299. mLog::FDEBUG("Enter SetWS:[{$}]", value.c_str());
  300. if (m_ResFullUCBConfig.GetFirstOf(value.c_str()) >= 0)
  301. {
  302. m_SynBoxUnit.m_WS->Update(value);
  303. string wsSYNValue = (string)m_ResFullUCBConfig[value.c_str()];
  304. if (wsSYNValue.find("SYN") != string::npos)
  305. {
  306. m_strCurrSYNMode = wsSYNValue;
  307. }
  308. else
  309. {
  310. m_strCurrSYNMode = "SYN" + wsSYNValue;
  311. }
  312. }
  313. else
  314. {
  315. m_strCurrSYNMode = "SYN0";
  316. mLog::FDEBUG("Syncbox configuration didn't find the workstation {$}, use defualt config SYN0", value.c_str());
  317. }
  318. return RET_STATUS::RET_SUCCEED;
  319. }
  320. RET_STATUS nsSYN::DeviceFullUCB::SetExpMode(std::string value)
  321. {
  322. mLog::FDEBUG("Enter SetExpMode:[{$}]", value.c_str());
  323. if (value == CONF_DR ||
  324. value == CONF_SR ||
  325. value == CONF_CF ||
  326. value == CONF_PF ||
  327. value == CONF_TOMO ||
  328. value == CONF_Stitch)
  329. {
  330. if (m_bIsAutoClearSignalFlag)
  331. {
  332. ClearSignal();
  333. }
  334. if (m_SynBoxUnit.m_ExpMode->Update(value))
  335. {
  336. GetConfChannel(value);
  337. SetAreaType();
  338. }
  339. if (value == CONF_CF ||
  340. value == CONF_PF)
  341. {
  342. if (m_fPPS != 0)
  343. {
  344. SetPWMParam(m_fPPS, m_PulseWidth);
  345. }
  346. }
  347. }
  348. else
  349. {
  350. mLog::FERROR("SetExpMode:mode[{$}] failed", value.c_str());
  351. }
  352. return RET_STATUS::RET_SUCCEED;
  353. }
  354. RET_STATUS nsSYN::DeviceFullUCB::SetGenAECSignal(int signal)
  355. {
  356. return RET_STATUS::RET_SUCCEED;
  357. }
  358. RET_STATUS nsSYN::DeviceFullUCB::SimulateFootSwitchSignal(int signal)
  359. {
  360. mLog::FDEBUG("Enter SimulateFootSwitchSignal:[{$}]", signal);
  361. if (signal)
  362. {
  363. if (m_FootSwitchState >= AttrKey::FOOT_DWON1)
  364. SetSignal(CONF_FOOTSWITCHSTATUS, AttrKey::FOOT_DWON1);
  365. }
  366. else
  367. {
  368. SetSignal(CONF_FOOTSWITCHSTATUS, AttrKey::FOOT_OFF);
  369. }
  370. return RET_STATUS::RET_SUCCEED;
  371. }
  372. RET_STATUS nsSYN::DeviceFullUCB::SimulateHandSwitchSignal(int signal)
  373. {
  374. mLog::FDEBUG("Enter SimulateHandSwitchSignal:[{$}]", signal);
  375. if (signal)
  376. {
  377. if (m_SynBoxUnit.m_HandSwitchState->Get() >= AttrKey::HAND_DWON1)
  378. SetSignal(CONF_HANDSWITCHPREPREQUEST, AttrKey::HAND_DWON1);
  379. if (m_SynBoxUnit.m_HandSwitchState->Get() >= AttrKey::HAND_DWON2)
  380. SetSignal(CONF_HANDSWITCHREADYREQUEST, AttrKey::HAND_DWON1);
  381. }
  382. else
  383. {
  384. SetSignal(CONF_HANDSWITCHREADYREQUEST, AttrKey::HAND_OFF);
  385. SetSignal(CONF_HANDSWITCHPREPREQUEST, AttrKey::HAND_OFF);
  386. }
  387. return RET_STATUS::RET_SUCCEED;
  388. }
  389. RET_STATUS nsSYN::DeviceFullUCB::SetDirectSignal(string channel, bool state)
  390. {
  391. mLog::FDEBUG("Enter SetDirectSignal:[{$}]", channel.c_str(), state);
  392. UCBCmdSWS(channel, state);
  393. return RET_STATUS::RET_SUCCEED;
  394. }
  395. //发生器方法
  396. RET_STATUS nsSYN::DeviceFullUCB::SetGeneratorHandSwitchStatus(int state)
  397. {
  398. mLog::FDEBUG("SetGeneratorHandSwitchStatus:[{$}->{$}]", m_SynBoxUnit.m_HandSwitchState->Get(), state);
  399. string strStateName = "";
  400. int nstate = -1;
  401. if (m_SynBoxUnit.m_HandSwitchState->Get() != state)
  402. {
  403. switch (state)
  404. {
  405. case AttrKey::HAND_OFF:
  406. {
  407. }break;
  408. case AttrKey::HAND_DWON1:
  409. {
  410. }break;
  411. case AttrKey::HAND_DWON2:
  412. {
  413. }break;
  414. default:
  415. {
  416. mLog::FERROR("SetGeneratorHandSwitchStatus:unknow HandStatus[{$}]", state);
  417. return RET_STATUS::RET_SUCCEED;
  418. }break;
  419. }
  420. if (m_SynBoxUnit.m_HandSwitchState->Update(state))
  421. {
  422. FireNotify(m_SynBoxUnit.m_HandSwitchState->GetKey(), m_SynBoxUnit.m_HandSwitchState->JSGet());
  423. }
  424. }
  425. return RET_STATUS::RET_SUCCEED;
  426. }
  427. RET_STATUS nsSYN::DeviceFullUCB::SetGeneratorFootSwitchStatus(int state)
  428. {
  429. mLog::FDEBUG("SetGeneratorFootSwitchStatus:[{$}->{$}]", m_FootSwitchState, state);
  430. string strStateName = "";
  431. int nstate = -1;
  432. if (m_FootSwitchState != state)
  433. {
  434. switch (state)
  435. {
  436. case AttrKey::FOOT_OFF:
  437. {
  438. }break;
  439. case AttrKey::FOOT_DWON1:
  440. {
  441. }break;
  442. default:
  443. {
  444. mLog::FERROR("SetGeneratorFootSwitchStatus:unknow HandStatus[{$}]", state);
  445. return RET_STATUS::RET_SUCCEED;
  446. }break;
  447. }
  448. m_FootSwitchState = state;
  449. FireNotify(AttrKey::DiosFootSwitch, m_FootSwitchState);
  450. }
  451. return RET_STATUS::RET_SUCCEED;
  452. }
  453. RET_STATUS nsSYN::DeviceFullUCB::SetGeneratortoSyncStatus(int state)
  454. {
  455. mLog::FDEBUG("SetGeneratortoSyncStatus:[{$}->{$}],UpdateGenSynStatusFlag[{$}]", m_SynBoxUnit.m_GenSynState->Get(),state, m_bUpdateGenSyncStatusFlag.c_str());
  456. string strStateName = "";
  457. int nstate = -1;
  458. if (m_SynBoxUnit.m_GenSynState->Get() != state)
  459. {
  460. switch (state)
  461. {
  462. case AttrKey::GENERATOR_RAD_OFF:
  463. {
  464. m_nCurrentExpCount = 0;
  465. m_nExpMaxCount = -1;
  466. if(m_bINEEnable_Gen)
  467. m_bINEEnable_Gen = false;
  468. if (m_bIsCtlPWMWithGen)
  469. SetPWMState(false);
  470. }break;
  471. case AttrKey::GENERATOR_RAD_PREPARE:
  472. {
  473. m_nCurrentExpCount = 0;
  474. if (m_bINEEnable_Gen)
  475. m_bINEEnable_Gen = false;
  476. }break;
  477. case AttrKey::GENERATOR_RAD_READY:
  478. {
  479. m_nCurrentExpCount = 0;
  480. if (!m_bINEEnable_Gen)
  481. m_bINEEnable_Gen = true;
  482. }break;
  483. case AttrKey::GENERATOR_RAD_XRAYON:
  484. {
  485. m_nCurrentExpCount++;
  486. if (!m_bINEEnable_Gen)
  487. m_bINEEnable_Gen = true;
  488. if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_DR)
  489. {
  490. strStateName = CONF_GENEXPREQUEST;
  491. nstate = 1;
  492. }
  493. else if(m_SynBoxUnit.m_ExpMode->JSGet() == CONF_Stitch)//拼接特殊处理手闸信号
  494. {
  495. if (m_SynBoxUnit.m_HandSwitchState->Get() == AttrKey::HAND_DWON1)
  496. {
  497. SetSignal(CONF_HANDSWITCHPREPREQUEST, AttrKey::HAND_DWON1);
  498. }
  499. else if (m_SynBoxUnit.m_HandSwitchState->Get() == AttrKey::HAND_DWON2)
  500. {
  501. SetSignal(CONF_HANDSWITCHPREPREQUEST, AttrKey::HAND_DWON1);
  502. SetSignal(CONF_HANDSWITCHREADYREQUEST, AttrKey::HAND_DWON1);
  503. }
  504. else
  505. {
  506. mLog::FWARN("GeneratorHandSwitchStatus:[{$}] not press", m_SynBoxUnit.m_HandSwitchState->Get());
  507. }
  508. }
  509. }break;
  510. case AttrKey::GENERATOR_RAD_XRAYOFF:
  511. {
  512. if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_DR)
  513. {
  514. strStateName = CONF_GENEXPREQUEST;
  515. nstate = 0;
  516. }
  517. else if(m_SynBoxUnit.m_ExpMode->JSGet() == CONF_Stitch)//拼接特殊处理手闸信号
  518. {
  519. if (m_SynBoxUnit.m_HandSwitchState->Get() == AttrKey::HAND_DWON1)
  520. {
  521. SetSignal(CONF_HANDSWITCHPREPREQUEST, AttrKey::HAND_OFF);
  522. }
  523. else if (m_SynBoxUnit.m_HandSwitchState->Get() == AttrKey::HAND_DWON2)
  524. {
  525. SetSignal(CONF_HANDSWITCHPREPREQUEST, AttrKey::HAND_OFF);
  526. SetSignal(CONF_HANDSWITCHREADYREQUEST, AttrKey::HAND_OFF);
  527. }
  528. else
  529. {
  530. mLog::FWARN("GeneratorHandSwitchStatus:[{$}] not press", m_SynBoxUnit.m_HandSwitchState->Get());
  531. }
  532. }
  533. }break;
  534. case AttrKey::GENERATOR_FLU_OFF:
  535. {
  536. m_nCurrentExpCount = 0;
  537. m_nExpMaxCount = -1;
  538. if (m_bINEEnable_Gen)
  539. m_bINEEnable_Gen = false;
  540. if (m_bIsCtlPWMWithGen)
  541. SetPWMState(false);
  542. }break;
  543. case AttrKey::GENERATOR_FLU_READY:
  544. {
  545. m_nCurrentExpCount = 0;
  546. strStateName = CONF_FOOTSWITCHSTATUS;
  547. if (!m_bINEEnable_Gen)
  548. m_bINEEnable_Gen = true;
  549. }break;
  550. case AttrKey::GENERATOR_FLU_XRAYON:
  551. {
  552. m_nCurrentExpCount++;
  553. if (!m_bINEEnable_Gen)
  554. m_bINEEnable_Gen = true;
  555. }break;
  556. case AttrKey::GENERATOR_FLU_XRAYOFF:
  557. {
  558. }break;
  559. case AttrKey::GENERATOR_FLU_CINE_READY:
  560. {
  561. }break;
  562. default:
  563. {
  564. mLog::FERROR("SetGeneratortoSyncStatus:unknow GenSynStatus[{$}]", state);
  565. return RET_STATUS::RET_SUCCEED;
  566. }break;
  567. }
  568. if (m_SynBoxUnit.m_GenSynState->Update(state))
  569. {
  570. mLog::FDEBUG("Enter SetGeneratortoSyncStatus:[{$}]", strStateName.c_str());
  571. auto item_out = m_FullUCBMap_OUT.find(strStateName.c_str());
  572. if (item_out == m_FullUCBMap_OUT.end())
  573. {
  574. mLog::FERROR("SetGeneratortoSyncStatus:[{$}] not in m_FullUCBMap_OUT", strStateName.c_str());
  575. }
  576. else
  577. {
  578. string strChannel = item_out->second.strChannel;
  579. if (strChannel.empty())
  580. mLog::FERROR("SetGeneratortoSyncStatus:[{$}] Channel[{$}] is empty", strStateName.c_str(), strChannel.c_str());
  581. else
  582. UCBCmdSWS(strChannel, nstate);
  583. }
  584. if (m_bUpdateGenSyncStatusFlag.at(state) == '1')
  585. FireNotify(m_SynBoxUnit.m_GenSynState->GetKey(), m_SynBoxUnit.m_GenSynState->JSGet());
  586. }
  587. }
  588. return RET_STATUS::RET_SUCCEED;
  589. }
  590. RET_STATUS nsSYN::DeviceFullUCB::SetExposureTimes(int nNum)
  591. {
  592. mLog::FDEBUG("Enter SetExposureTimes:[{$}]", nNum);
  593. if (m_SynBoxUnit.m_ExpMode->JSGet() != CONF_TOMO)
  594. {
  595. m_nExpMaxCount = nNum;
  596. }
  597. else
  598. {
  599. m_nExpMaxCount = -1;
  600. }
  601. SetAreaType();
  602. return RET_STATUS::RET_SUCCEED;
  603. }
  604. RET_STATUS nsSYN::DeviceFullUCB::SetExpEnable()
  605. {
  606. mLog::FDEBUG("Enter SetExpEnable");
  607. SetPWMState(true);
  608. return RET_STATUS::RET_SUCCEED;
  609. }
  610. RET_STATUS nsSYN::DeviceFullUCB::SetExpDisable()
  611. {
  612. mLog::FDEBUG("Enter SetExpDisable");
  613. StopWindowRequest();
  614. SimulateFootSwitchSignal(0);
  615. ClearSignal();
  616. return RET_STATUS::RET_SUCCEED;
  617. }
  618. //探测器方法
  619. RET_STATUS nsSYN::DeviceFullUCB::SetFPDXwinStatus(int state)
  620. {
  621. mLog::FDEBUG("SetFPDXwinStatus:[{$}->{$}],UpdateFPDXwinStatusFlag[{$}]", m_SynBoxUnit.m_DetectorWindowState->Get(), state, m_bUpdateFPDXWinStatusFlag.c_str());
  622. if (m_SynBoxUnit.m_DetectorWindowState->Get() != state)
  623. {
  624. switch (state)
  625. {
  626. case AttrKey::XWINDOW_OFF:
  627. {
  628. m_bINEEnable_FPD = false;
  629. }break;
  630. case AttrKey::XWINDOW_ON:
  631. {
  632. m_bINEEnable_FPD = true;
  633. }break;
  634. default:
  635. {
  636. mLog::FERROR("SetFPDXwinStatus:unknow FPDXwinStatus[{$}]", state);
  637. return RET_STATUS::RET_SUCCEED;
  638. }break;
  639. }
  640. if (m_SynBoxUnit.m_DetectorWindowState->Update(state))
  641. {
  642. if (m_bUpdateFPDXWinStatusFlag.at(state) == '1')
  643. FireNotify(m_SynBoxUnit.m_DetectorWindowState->GetKey(), m_SynBoxUnit.m_DetectorWindowState->JSGet());
  644. }
  645. }
  646. return RET_STATUS::RET_SUCCEED;
  647. }
  648. RET_STATUS nsSYN::DeviceFullUCB::PrepareAcquisition()
  649. {
  650. mLog::FDEBUG("Enter PrepareAcquisition");
  651. SetAreaType();
  652. return RET_STATUS::RET_SUCCEED;
  653. }
  654. RET_STATUS nsSYN::DeviceFullUCB::StartWindowRequest()
  655. {
  656. mLog::FDEBUG("Enter StartWindowRequest");
  657. if(!m_bINEEnable_FPD)
  658. {
  659. m_bINEEnable_FPD = true;
  660. SetSignal(CONF_DETREACQREQUEST, 1);
  661. if(m_SynBoxUnit.m_ExpMode->JSGet() != CONF_Stitch)
  662. SetPWMState(m_bINEEnable_FPD);
  663. }
  664. else
  665. {
  666. mLog::FWARN("already INEEnable_FPD");
  667. }
  668. return RET_STATUS::RET_SUCCEED;
  669. }
  670. RET_STATUS nsSYN::DeviceFullUCB::StopWindowRequest()
  671. {
  672. mLog::FDEBUG("Enter StopWindowRequest");
  673. if (m_bINEEnable_FPD)
  674. {
  675. m_bINEEnable_FPD = false;
  676. SetSignal(CONF_DETREACQREQUEST, 0);
  677. if (m_SynBoxUnit.m_ExpMode->JSGet() != CONF_Stitch)
  678. SetPWMState(m_bINEEnable_FPD);
  679. }
  680. else
  681. {
  682. mLog::FWARN("already INEEnable_FPD");
  683. }
  684. return RET_STATUS::RET_SUCCEED;
  685. }
  686. RET_STATUS nsSYN::DeviceFullUCB::SetFrameRate(FLOAT frameRate)
  687. {
  688. mLog::FDEBUG("Enter SetFrameRate:[{$}]", frameRate);
  689. if (m_fPPS != frameRate)
  690. {
  691. m_fPPS = frameRate;
  692. SetPWMParam(frameRate, m_PulseWidth);
  693. }
  694. return RET_STATUS::RET_SUCCEED;
  695. }
  696. //由工作流调用
  697. RET_STATUS nsSYN::DeviceFullUCB::SetDirectExpSignal(int signal)
  698. {
  699. mLog::FDEBUG("Enter SetDirectExpSignal:[{$}]", signal);
  700. auto item_out = m_FullUCBMap_OUT.find(CONF_GENEXPREQUEST);
  701. if (item_out == m_FullUCBMap_OUT.end())
  702. {
  703. mLog::FERROR("SetDirectExpSignal:[{$}] not in m_FullUCBMap_OUT", CONF_GENEXPREQUEST);
  704. }
  705. else
  706. {
  707. string strChannel = item_out->second.strChannel;
  708. if(strChannel.empty())
  709. mLog::FERROR("SetDirectExpSignal:[{$}] Channel[{$}] is empty", CONF_GENEXPREQUEST, strChannel.c_str());
  710. else
  711. UCBCmdSWS(strChannel, signal);
  712. }
  713. return RET_STATUS::RET_SUCCEED;
  714. }
  715. RET_STATUS nsSYN::DeviceFullUCB::SetValue_PPS(FLOAT fluframerate)
  716. {
  717. mLog::FDEBUG("Enter SetValue_PPS:[{$}]", fluframerate);
  718. if (m_fPPS != fluframerate)
  719. {
  720. m_fPPS = fluframerate;
  721. SetPWMParam(fluframerate, m_PulseWidth);
  722. }
  723. return RET_STATUS::RET_SUCCEED;
  724. }
  725. RET_STATUS nsSYN::DeviceFullUCB::ActiveSyncMode(_tSyncModeArgs value)
  726. {
  727. mLog::FDEBUG("Enter ActiveSyncMode:Sync[{$},{$}],WS[{$}]", value.strSyncMode.c_str(), value.strSyncValue.c_str(), value.strWS.c_str());
  728. m_SynBoxUnit.m_WS->Update(value.strWS);
  729. if(!value.strSyncValue.empty())
  730. {
  731. string temp = "SYN" + value.strSyncValue;
  732. if (m_strCurrSYNMode != temp)
  733. {
  734. m_strCurrSYNMode = temp;
  735. mLog::FDEBUG("will read[{$}]signal table", m_strCurrSYNMode.c_str());
  736. GetConfChannel(m_strCurrSYNMode);
  737. SetAreaType();
  738. }
  739. }
  740. return RET_STATUS::RET_SUCCEED;
  741. }
  742. RET_STATUS nsSYN::DeviceFullUCB::SetPulseWidth(int value)
  743. {
  744. mLog::FDEBUG("Enter SetPulseWidth:[{$}]", value);
  745. if (m_PulseWidth != value)
  746. {
  747. m_PulseWidth = value;
  748. SetPWMState(false);
  749. SetPWMParam(m_fPPS, value);
  750. }
  751. return RET_STATUS::RET_SUCCEED;
  752. }
  753. //-----------------------------------------------------------------------------
  754. // ProcessCmd
  755. //-----------------------------------------------------------------------------
  756. //属性上报
  757. void nsSYN::DeviceFullUCB::FireNotify(std::string key, std::string content)
  758. {
  759. EventCenter->OnNotify(1, key, content);
  760. }
  761. void nsSYN::DeviceFullUCB::FireNotify(std::string key, int content)
  762. {
  763. std::string str = to_string(content);
  764. EventCenter->OnNotify(1, key, str);
  765. }
  766. //设备属性处理
  767. int nsSYN::DeviceFullUCB::NotifyUnitAttribute(const string& strname, int& state)
  768. {
  769. mLog::FDEBUG("NotifyUnitAttribute: Name[{$}], State[{$}]", strname.c_str(), state);
  770. if (strname == CONF_HANDSWITCHPREP)//手闸
  771. {
  772. if (state)
  773. {
  774. SetGeneratorHandSwitchStatus(AttrKey::HAND_DWON1);
  775. }
  776. else
  777. {
  778. SetGeneratorHandSwitchStatus(AttrKey::HAND_OFF);
  779. }
  780. }
  781. else if (strname == CONF_HANDSWITCHREADY)
  782. {
  783. if (state)
  784. {
  785. SetGeneratorHandSwitchStatus(AttrKey::HAND_DWON2);
  786. }
  787. else
  788. {
  789. SetGeneratorHandSwitchStatus(AttrKey::HAND_OFF);
  790. }
  791. }
  792. else if (strname == CONF_FOOTSWITCHREADY)
  793. {
  794. if (state)
  795. {
  796. SetGeneratorFootSwitchStatus(AttrKey::FOOT_DWON1);
  797. }
  798. else
  799. {
  800. SetGeneratorFootSwitchStatus(AttrKey::FOOT_OFF);
  801. }
  802. }
  803. else if (strname == CONF_GENPREP)//发生器曝光状态
  804. {
  805. if (state)
  806. {
  807. SetGeneratortoSyncStatus(AttrKey::GENERATOR_RAD_PREPARE);
  808. }
  809. else
  810. {
  811. SetGeneratortoSyncStatus(AttrKey::GENERATOR_RAD_OFF);
  812. }
  813. }
  814. else if (strname == CONF_GENREADY)
  815. {
  816. if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_DR || m_SynBoxUnit.m_ExpMode->JSGet() == CONF_SR)
  817. {
  818. if (state)
  819. {
  820. SetGeneratortoSyncStatus(AttrKey::GENERATOR_RAD_READY);
  821. }
  822. else
  823. {
  824. SetGeneratortoSyncStatus(AttrKey::GENERATOR_RAD_OFF);
  825. }
  826. }
  827. else if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_CF || m_SynBoxUnit.m_ExpMode->JSGet() == CONF_PF)
  828. {
  829. if (state)
  830. {
  831. SetGeneratortoSyncStatus(AttrKey::GENERATOR_FLU_READY);
  832. }
  833. else
  834. {
  835. SetGeneratortoSyncStatus(AttrKey::GENERATOR_FLU_OFF);
  836. }
  837. }
  838. else
  839. {
  840. mLog::FWARN("NotifyUnitAttribute: Name[{$}], ignore ExpMode[{$}]", strname.c_str(), m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  841. }
  842. }
  843. else if (strname == CONF_GENEXPSTATUS)
  844. {
  845. if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_DR || m_SynBoxUnit.m_ExpMode->JSGet() == CONF_SR)
  846. {
  847. if (state)
  848. {
  849. SetGeneratortoSyncStatus(AttrKey::GENERATOR_RAD_XRAYON);
  850. }
  851. else
  852. {
  853. SetGeneratortoSyncStatus(AttrKey::GENERATOR_RAD_XRAYOFF);
  854. }
  855. }
  856. else if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_CF || m_SynBoxUnit.m_ExpMode->JSGet() == CONF_PF)
  857. {
  858. if (state)
  859. {
  860. SetGeneratortoSyncStatus(AttrKey::GENERATOR_FLU_XRAYON);
  861. }
  862. else
  863. {
  864. SetGeneratortoSyncStatus(AttrKey::GENERATOR_FLU_XRAYOFF);
  865. }
  866. }
  867. else
  868. {
  869. mLog::FWARN("NotifyUnitAttribute: Name[{$}], ignore ExpMode[{$}]", strname.c_str(), m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  870. }
  871. }
  872. else if (strname == CONF_XWINDOWSTATUS)//开窗状态
  873. {
  874. if (state)
  875. {
  876. SetFPDXwinStatus(AttrKey::XWINDOW_ON);
  877. }
  878. else
  879. {
  880. SetFPDXwinStatus(AttrKey::XWINDOW_OFF);
  881. }
  882. }
  883. return 2;
  884. }
  885. //收到硬件的通知, 有包到达
  886. void nsSYN::DeviceFullUCB::OnCallBack()
  887. {
  888. }
  889. //处理信号
  890. bool nsSYN::DeviceFullUCB::DealtheSignal(const string& channel, int& state)
  891. {
  892. mLog::FDEBUG("DealtheSignal:channel[{$}],state[{$}]", channel.c_str(), state);
  893. if (channel.empty() || (state != 0 && state != 1))
  894. {
  895. return false;
  896. }
  897. if (m_FullUCBMap_IN.empty())
  898. {
  899. mLog::FERROR("DealtheSignal:m_FullUCBMap_IN is empty");
  900. return false;
  901. }
  902. //mLog::FDEBUG( "DealtheSignal: SYN[{$}],mode[{$}]", m_strSYNMode.c_str(), m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  903. auto item_in = m_FullUCBMap_IN.find(channel);
  904. if (item_in == m_FullUCBMap_IN.end())
  905. {
  906. mLog::FERROR("DealtheSignal:m_FullUCBMap_IN not find[{$}]", channel.c_str());
  907. return false;
  908. }
  909. else
  910. {
  911. string strName = item_in->second.strSyncName;
  912. string strSetEnableSignal = item_in->second.strEnableIo;
  913. string strSetDisableSignal = item_in->second.strDisableIo;
  914. string strSetRelaySignal = item_in->second.strRELAYIo;
  915. NotifyUnitAttribute(strName, state);
  916. if (state)
  917. {
  918. mLog::FDEBUG("name[{$}] channel[{$}] state[{$}] Enable[{$}] Relay[{$}]",
  919. strName.c_str(), channel.c_str(), state, strSetEnableSignal.c_str(), strSetRelaySignal.c_str());
  920. if (!strSetRelaySignal.empty())
  921. {
  922. mLog::FDEBUG("Set Relay Signal = {$}", strSetRelaySignal.c_str());
  923. SetSignal(strSetRelaySignal.c_str(), state);
  924. }
  925. if (!strSetEnableSignal.empty())
  926. {
  927. mLog::FDEBUG("Set Signal = {$}", strSetEnableSignal.c_str());
  928. SetMultipleSignal(strSetEnableSignal.c_str(), state);
  929. }
  930. }
  931. else
  932. {
  933. mLog::FDEBUG("name[{$}] channel[{$}] state[{$}] Disable[{$}] Relay[{$}]",
  934. strName.c_str(), channel.c_str(), state, strSetDisableSignal.c_str(), strSetRelaySignal.c_str());
  935. if (!strSetRelaySignal.empty())
  936. {
  937. mLog::FDEBUG("Set Relay Signal = {$}", strSetRelaySignal.c_str());
  938. SetSignal(strSetRelaySignal.c_str(), state);
  939. }
  940. if (!strSetDisableSignal.empty())
  941. {
  942. mLog::FDEBUG("Set Signal = {$}", strSetDisableSignal.c_str());
  943. SetMultipleSignal(strSetDisableSignal.c_str(), state);
  944. }
  945. }
  946. }
  947. return true;
  948. }
  949. void nsSYN::DeviceFullUCB::SetMultipleSignal(const string& strname, int& state) //change by wxx:原截取字符串操作有问题
  950. {
  951. string strtemp = strname;
  952. string strName = strtemp;
  953. bool lastFlag = false;
  954. std::size_t oldPos = 0;
  955. while (!strName.empty())
  956. {
  957. std::size_t findPos = strtemp.find(",", oldPos);
  958. if (findPos != string::npos)
  959. {
  960. strName = strtemp.substr(oldPos, findPos - oldPos);
  961. }
  962. else
  963. {
  964. strName = strtemp.substr(oldPos, strtemp.length() - oldPos);
  965. lastFlag = true;
  966. }
  967. SetSignal(strName, state);
  968. Sleep(10);
  969. if (lastFlag)
  970. {
  971. break;
  972. }
  973. else
  974. {
  975. oldPos = findPos + 1;
  976. }
  977. }
  978. }
  979. bool nsSYN::DeviceFullUCB::SetSignal(const string& strname, int state)
  980. {
  981. auto item_out = m_FullUCBMap_OUT.find(strname);
  982. if (item_out == m_FullUCBMap_OUT.end())
  983. {
  984. mLog::FERROR("SetSignal:[{$}] not in m_FullUCBMap_OUT", strname.c_str());
  985. return false;
  986. }
  987. else
  988. {
  989. string strChannel = item_out->second.strChannel;
  990. string strEnable = item_out->second.strEnableValue;
  991. string strDisable = item_out->second.strDisableValue;
  992. //if (item_out->second.nCurrStateValue == state)
  993. //{
  994. // mLog::FDEBUG("Set Name[{$}],Signal[{$}],state[{$}] already send at last once", strname.c_str(), strChannel.c_str(), state);
  995. // return true;
  996. //}
  997. //else
  998. {
  999. mLog::FDEBUG("Set Name[{$}],Signal[{$}],state[{$}]", strname.c_str(), strChannel.c_str(), state);
  1000. item_out->second.nCurrStateValue = state;
  1001. }
  1002. if (!strEnable.empty() && item_out->second.nConfAllowance > 0 && item_out->second.nCurrAllowance < item_out->second.nConfAllowance)
  1003. {
  1004. if (state == atoi(item_out->second.strEnableValue.c_str()))
  1005. {
  1006. mLog::FDEBUG("Set Name[{$}],need wait[{$}->{$}] count", strname.c_str(), item_out->second.nCurrAllowance, item_out->second.nConfAllowance);
  1007. item_out->second.nCurrAllowance++;
  1008. return false;
  1009. }
  1010. }
  1011. if (strChannel != "")
  1012. {
  1013. if (strname == CONF_GENEXPREQUEST)
  1014. {
  1015. if (m_bINEEnable_Gen && m_bINEEnable_FPD)
  1016. {
  1017. if (m_nExpMaxCount > 0 && m_nCurrentExpCount > m_nExpMaxCount)
  1018. {
  1019. mLog::FWARN("m_nExpMaxCount[{$}] has been enough in this sequence[{$}]!", m_nExpMaxCount, m_nCurrentExpCount);
  1020. return true;
  1021. }
  1022. }
  1023. else
  1024. {
  1025. mLog::FWARN("Generator[{$}] or detector[{$}] not ready, So can't send INE to generator!", m_bINEEnable_Gen, m_bINEEnable_FPD);
  1026. return true;
  1027. }
  1028. }
  1029. switch (state)
  1030. {
  1031. case 0:
  1032. {
  1033. if (!strDisable.empty())
  1034. {
  1035. mLog::FDEBUG("Signal[{$}],state[{$}],confDisable[{$}]", strChannel.c_str(), state, strDisable.c_str());
  1036. int confState = atoi(strDisable.c_str());
  1037. UCBCmdSWS(strChannel, confState);
  1038. }
  1039. else
  1040. {
  1041. UCBCmdSWS(strChannel, state);
  1042. }
  1043. }break;
  1044. case 1:
  1045. {
  1046. if (!strEnable.empty())
  1047. {
  1048. mLog::FDEBUG("Signal[{$}],state[{$}],confEnable[{$}]", strChannel.c_str(), state, strEnable.c_str());
  1049. int confState = atoi(strEnable.c_str());
  1050. UCBCmdSWS(strChannel, confState);
  1051. }
  1052. else
  1053. {
  1054. UCBCmdSWS(strChannel, state);
  1055. }
  1056. }break;
  1057. default:
  1058. break;
  1059. }
  1060. return true;
  1061. }
  1062. }
  1063. return false;
  1064. }
  1065. void nsSYN::DeviceFullUCB::ClearSignal()
  1066. {
  1067. mLog::FDEBUG("Enter ClearSignal");
  1068. if (m_FullUCBMap_OUT.empty())
  1069. {
  1070. return;
  1071. }
  1072. for (auto & item : m_FullUCBMap_OUT)
  1073. {
  1074. string strDisable = item.second.strDisableValue;
  1075. mLog::FDEBUG("out_IO [{$}=={$}],Disable[{$}]", item.first.c_str(), item.second.strChannel.c_str(), strDisable.c_str());
  1076. if (!strDisable.empty())
  1077. {
  1078. int confState = atoi(strDisable.c_str());
  1079. UCBCmdSWS(item.second.strChannel, confState);
  1080. }
  1081. else
  1082. {
  1083. UCBCmdSWS(item.second.strChannel, 0);
  1084. }
  1085. item.second.nCurrAllowance = 0;
  1086. }
  1087. SetPWMState(0);
  1088. }
  1089. // 指令发送前预处理
  1090. int nsSYN::DeviceFullUCB::SetPWMState(bool state)
  1091. {
  1092. mLog::FDEBUG("Enter SetPWMState:[{$}]", state);
  1093. auto item = m_FullUCBMap_OUT.find(CONF_FRAMERATE);
  1094. if (item != m_FullUCBMap_OUT.end())
  1095. {
  1096. string strChannel = item->second.strChannel;
  1097. if (item->second.nCurrStateValue == state)
  1098. {
  1099. mLog::FDEBUG("SetPWMState:Signal[{$}],state[{$}] already send at last once", strChannel.c_str(), state);
  1100. return true;
  1101. }
  1102. else
  1103. {
  1104. item->second.nCurrStateValue = state;
  1105. }
  1106. if (strChannel != "")
  1107. {
  1108. //模式:0表示禁止,1表示允许,2表示发送一个脉冲,3表示连续发送脉冲
  1109. //使能:通道信号打开或者关闭
  1110. if (state)
  1111. {
  1112. if (m_bIsCtlPWMWithMode)
  1113. {
  1114. mLog::FDEBUG("in [{$}] mode", m_SynBoxUnit.m_ExpMode->JSGet().c_str());
  1115. if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_SR ||
  1116. m_SynBoxUnit.m_ExpMode->JSGet() == CONF_PF ||
  1117. m_SynBoxUnit.m_ExpMode->JSGet() == CONF_TOMO)
  1118. {
  1119. UCBCmdSPE(strChannel, '3', '1');
  1120. }
  1121. else if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_CF)
  1122. {
  1123. UCBCmdSPE(strChannel, '1', '1');
  1124. }
  1125. else if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_DR)
  1126. {
  1127. int EXOcounts{ 0 };
  1128. if (!m_ExpCounts.empty())
  1129. {
  1130. if (m_ExpCounts == "FF")
  1131. {
  1132. EXOcounts = 255;
  1133. }
  1134. else
  1135. {
  1136. EXOcounts = atoi(m_ExpCounts.c_str());
  1137. }
  1138. }
  1139. if (EXOcounts <= 1)
  1140. {
  1141. //UCBCmdSPE(strChannel, '2', '1');
  1142. //UCBCmdSPE(strChannel, '1', '1');
  1143. UCBCmdSWS(strChannel, 1);
  1144. SetEvent(m_hPWMEvent);
  1145. }
  1146. else
  1147. {
  1148. UCBCmdSPE(strChannel, '3', '1');
  1149. }
  1150. }
  1151. else if (m_SynBoxUnit.m_ExpMode->JSGet() == CONF_Stitch)
  1152. {
  1153. int EXOcounts{ 0 };
  1154. if (!m_ExpCounts.empty())
  1155. {
  1156. if (m_ExpCounts == "FF")
  1157. {
  1158. EXOcounts = 255;
  1159. }
  1160. else
  1161. {
  1162. EXOcounts = atoi(m_ExpCounts.c_str());
  1163. }
  1164. }
  1165. if (EXOcounts <= 1)
  1166. {
  1167. //UCBCmdSPE(strChannel, '2', '1');
  1168. //UCBCmdSPE(strChannel, '1', '1');
  1169. UCBCmdSWS(strChannel, 1);
  1170. SetEvent(m_hPWMEvent);
  1171. }
  1172. else
  1173. {
  1174. UCBCmdSPE(strChannel, '3', '1');
  1175. }
  1176. }
  1177. else
  1178. {
  1179. UCBCmdSPE(strChannel, '3', '1');
  1180. }
  1181. }
  1182. else
  1183. {
  1184. UCBCmdSPE(strChannel, '3', '1');
  1185. }
  1186. }
  1187. else
  1188. {
  1189. UCBCmdSPE(strChannel, '0', '0');
  1190. }
  1191. return 1;
  1192. }
  1193. }
  1194. return 0;
  1195. }
  1196. int nsSYN::DeviceFullUCB::SetPWMParam(float fpps, int width)
  1197. {
  1198. mLog::FDEBUG("Enter SetPWM:[{$}]", fpps);
  1199. if (fpps < 0.5)
  1200. {
  1201. mLog::FWARN( "PPS:[{$}]<0.5", fpps);
  1202. return 1;
  1203. }
  1204. auto item = m_FullUCBMap_OUT.find(CONF_FRAMERATE);
  1205. if (item != m_FullUCBMap_OUT.end())
  1206. {
  1207. string strChannel = item->second.strChannel;
  1208. if (strChannel != "")
  1209. {
  1210. int nCycle = 10 * (1000.0 / fpps);
  1211. int pulse = 10 * width;
  1212. mLog::FDEBUG("Set PWM Signal[{$}] cycle[{$}] PulseWidth[{$}]", strChannel.c_str(), nCycle/10, pulse/10);
  1213. UCBCmdSPS(strChannel, nCycle, pulse);
  1214. return 1;
  1215. }
  1216. }
  1217. return -1;
  1218. }
  1219. int nsSYN::DeviceFullUCB::SetAreaType()
  1220. {
  1221. mLog::FDEBUG("Enter SetAreaType");
  1222. char areaID{ 0 };
  1223. int EXOcounts{ 0 };
  1224. if (!m_AreaID.empty())
  1225. areaID = m_AreaID.at(0);
  1226. if (!m_ExpCounts.empty())
  1227. {
  1228. if (m_ExpCounts == "FF")
  1229. {
  1230. EXOcounts = 255;
  1231. }
  1232. else
  1233. {
  1234. EXOcounts = atoi(m_ExpCounts.c_str());
  1235. }
  1236. }
  1237. mLog::FDEBUG("user area ID[{$}], exp max count[{$}]", areaID, EXOcounts);
  1238. if ((areaID >= '0' && areaID <= '2') && (EXOcounts >= 0 && EXOcounts <= 255))
  1239. {
  1240. //曝光模式:0表示I/O通道设置的存取段1的配置,1表示存取段2,依次类推
  1241. //可以设置曝光次数,范围0~200,值255表示一直曝光
  1242. UCBCmdSMS(areaID, EXOcounts);
  1243. }
  1244. else
  1245. {
  1246. mLog::FERROR("areaID[{$:C}],EXOcounts[{$}] not right", areaID, EXOcounts);
  1247. }
  1248. return 1;
  1249. }
  1250. //通信(握手)测试
  1251. bool DeviceFullUCB::UCBCmdSEC()
  1252. {
  1253. char cCmd[FullUCB_Com_NormalLen] = "SECA00";
  1254. int nSize = 6;
  1255. FormatCmd(cCmd, nSize);
  1256. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1257. {
  1258. return true;
  1259. }
  1260. return false;
  1261. }
  1262. //读取版本号
  1263. bool DeviceFullUCB::UCBCmdSVR()
  1264. {
  1265. char cCmd[FullUCB_Com_NormalLen] = "SVRA00";
  1266. int nSize = 6;
  1267. FormatCmd(cCmd, nSize);
  1268. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1269. {
  1270. return true;
  1271. }
  1272. else
  1273. {
  1274. mLog::FERROR("Command: 'SVR' ERROR!");
  1275. }
  1276. return false;
  1277. }
  1278. //写序列号
  1279. bool DeviceFullUCB::UCBCmdSSN(const string& strSerial)
  1280. {
  1281. char cCmd[FullUCB_Com_NormalLen]{ 0 };
  1282. int nSize = 6;
  1283. sprintf_s(cCmd,"SSNA0F%s", strSerial.c_str());
  1284. nSize += strSerial.length();
  1285. FormatCmd(cCmd, nSize);
  1286. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1287. {
  1288. return true;
  1289. }
  1290. else
  1291. {
  1292. mLog::FERROR("Command: 'SSN' false!");
  1293. }
  1294. return false;
  1295. }
  1296. //蜂鸣器提示功能
  1297. bool DeviceFullUCB::UCBCmdSSP()
  1298. {
  1299. return true;
  1300. }
  1301. //输出端口初始化
  1302. bool DeviceFullUCB::UCBCmdSIT()
  1303. {
  1304. return true;
  1305. }
  1306. //冷启动
  1307. bool DeviceFullUCB::UCBCmdSRE()
  1308. {
  1309. char cCmd[FullUCB_Com_NormalLen] = "SREA00";
  1310. int nSize = 6;
  1311. FormatCmd(cCmd, nSize);
  1312. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1313. {
  1314. return true;
  1315. }
  1316. else
  1317. {
  1318. mLog::FERROR("Command: 'SRE' false!");
  1319. }
  1320. return false;
  1321. }
  1322. //出厂恢复
  1323. bool DeviceFullUCB::UCBCmdSFR()
  1324. {
  1325. char cCmd[FullUCB_Com_NormalLen] = "SFRA00";
  1326. int nSize = 6;
  1327. FormatCmd(cCmd, nSize);
  1328. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1329. {
  1330. return true;
  1331. }
  1332. else
  1333. {
  1334. mLog::FERROR("Command: 'SFR' false!");
  1335. }
  1336. return false;
  1337. }
  1338. //EEPROM拷贝
  1339. bool DeviceFullUCB::UCBCmdSEE(const char& cZ1, const char& cZ2)
  1340. {
  1341. char cCmd[FullUCB_Com_NormalLen] = "SEEA02";
  1342. int nSize = 6;
  1343. mLog::FDEBUG("EEPROM Copy [{$:C}] -> [{$:C}]", cZ1, cZ2);
  1344. if (cZ1 == cZ2)
  1345. {
  1346. mLog::FWARN("The same zone!");
  1347. return false;
  1348. }
  1349. if (cZ1 != 'A' && cZ1 != 'B')
  1350. {
  1351. mLog::FERROR("Z1 ERROR");
  1352. return false;
  1353. }
  1354. if (cZ2 != 'A' && cZ2 != 'B')
  1355. {
  1356. mLog::FERROR("Z2 ERROR");
  1357. return false;
  1358. }
  1359. cCmd[6] = cZ1;
  1360. cCmd[7] = cZ2;
  1361. nSize = 8;
  1362. FormatCmd(cCmd, nSize);
  1363. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1364. {
  1365. return true;
  1366. }
  1367. else
  1368. {
  1369. mLog::FERROR("Command: 'SEE' false!");
  1370. }
  1371. return false;
  1372. }
  1373. //工作状态查询命令
  1374. bool DeviceFullUCB::UCBCmdSRF(void)
  1375. {
  1376. return true;
  1377. }
  1378. //清除工作状态存储区
  1379. bool DeviceFullUCB::UCBCmdSCF(void)
  1380. {
  1381. return true;
  1382. }
  1383. //ABS输出
  1384. bool DeviceFullUCB::UCBCmdSAS(const string& strChannelID, const int& nValue, const char& cEnable)
  1385. {
  1386. char cCmd[FullUCB_Com_NormalLen] = "SASB07";
  1387. int nSize = 6;
  1388. if(strChannelID.length() < 2)
  1389. {
  1390. mLog::FERROR("SAS param Error strChannelID:{$}", strChannelID.c_str());
  1391. return false;
  1392. }
  1393. if (strChannelID[0] >= '0' && strChannelID[0] <= '9')
  1394. {
  1395. cCmd[6] = strChannelID[0];
  1396. }
  1397. else
  1398. {
  1399. mLog::FERROR("SAS param Error Channel:{$}", strChannelID[0]);
  1400. return false;
  1401. }
  1402. if (strChannelID[1] == '0' || strChannelID[1] == '1')
  1403. {
  1404. cCmd[7] = strChannelID[1];
  1405. }
  1406. else
  1407. {
  1408. mLog::FERROR("SAS param Error Ampli{$}", strChannelID[1]);
  1409. return false;
  1410. }
  1411. if (nValue < 0 || nValue > 65535)
  1412. {
  1413. mLog::FERROR("SAS param Error Value{$}", nValue);
  1414. return false;
  1415. }
  1416. string strTemp = std::format("{:04X}", nValue);
  1417. cCmd[8] = strTemp.at(0);
  1418. cCmd[9] = strTemp.at(1);
  1419. cCmd[10] = strTemp.at(2);
  1420. cCmd[11] = strTemp.at(3);
  1421. if (cEnable == '0' || cEnable == '1')
  1422. {
  1423. cCmd[12] = cEnable;
  1424. }
  1425. else
  1426. {
  1427. mLog::FERROR("SAS param Error Enable{$}", cEnable);
  1428. return false;
  1429. }
  1430. nSize = 13;
  1431. FormatCmd(cCmd, nSize);
  1432. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1433. {
  1434. return true;
  1435. }
  1436. else
  1437. {
  1438. mLog::FERROR("Command: 'SAS' false!");
  1439. }
  1440. return false;
  1441. }
  1442. //ADC开启/关闭命令
  1443. bool DeviceFullUCB::UCBCmdSAD(const string& strChannelID)
  1444. {
  1445. char cCmd[FullUCB_Com_NormalLen] = "SADA02";
  1446. int nSize = 6;
  1447. if (strChannelID.length() < 2)
  1448. {
  1449. mLog::FERROR("SAD param Error strChannelID:{$}", strChannelID.c_str());
  1450. return false;
  1451. }
  1452. if ((strChannelID[0] >= '0' && strChannelID[0] <= '9') || strChannelID[0] == 'F')
  1453. {
  1454. cCmd[6] = strChannelID[0];
  1455. }
  1456. else
  1457. {
  1458. mLog::FERROR("SAD param Error Channel{$}", strChannelID[0]);
  1459. return false;
  1460. }
  1461. if (strChannelID[1] == '0' || strChannelID[1] == '1')
  1462. {
  1463. cCmd[7] = strChannelID[1];
  1464. }
  1465. else
  1466. {
  1467. mLog::FERROR("SAD param Error Enable{$}", strChannelID[1]);
  1468. return false;
  1469. }
  1470. nSize = 8;
  1471. FormatCmd(cCmd, nSize);
  1472. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1473. {
  1474. return true;
  1475. }
  1476. else
  1477. {
  1478. mLog::FERROR("Command: 'SAD' false!");
  1479. }
  1480. return false;
  1481. }
  1482. //ADC读取命令
  1483. bool DeviceFullUCB::UCBCmdSRA(const string& strChannelID)
  1484. {
  1485. char cCmd[FullUCB_Com_NormalLen] = "SRAA01";
  1486. int nSize = 6;
  1487. if (strChannelID.length() < 1)
  1488. {
  1489. mLog::FERROR("SRA param Error strChannelID:{$}", strChannelID.c_str());
  1490. return false;
  1491. }
  1492. if (strChannelID[0] >= '0' && strChannelID[0] <= '9')
  1493. {
  1494. cCmd[6] = strChannelID[0];
  1495. }
  1496. else
  1497. {
  1498. mLog::FERROR("SRA param Error Channel{$}", strChannelID[0]);
  1499. return false;
  1500. }
  1501. nSize = 7;
  1502. FormatCmd(cCmd, nSize);
  1503. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1504. {
  1505. return true;
  1506. }
  1507. mLog::FERROR("Command: 'SAD' false!");
  1508. return false;
  1509. }
  1510. //AEC开启/关闭功能
  1511. bool DeviceFullUCB::UCBCmdSAE(const char& cInChannel, const char& cOutChannel, const char& cIO, const char& cChannel, const int& nTime, const int& nMode, const bool& bEnable)
  1512. {
  1513. char cCmd[FullUCB_Com_NormalLen] = "SAEA0A";
  1514. int nSize = 6;
  1515. if (HexUCtoInt(cInChannel) != -1)
  1516. {
  1517. cCmd[6] = cInChannel;
  1518. }
  1519. else
  1520. {
  1521. mLog::FERROR("SAE param Error cInChannel{$}", cInChannel);
  1522. return false;
  1523. }
  1524. if (HexUCtoInt(cOutChannel) != -1)
  1525. {
  1526. cCmd[7] = cOutChannel;
  1527. }
  1528. else
  1529. {
  1530. mLog::FERROR("SAE param Error cOutChannel{$}", cOutChannel);
  1531. return false;
  1532. }
  1533. if (cIO == 'I' || cIO == 'O')
  1534. {
  1535. cCmd[8] = cIO;
  1536. }
  1537. else
  1538. {
  1539. mLog::FERROR("SAE param Error cIO{$}", cIO);
  1540. return false;
  1541. }
  1542. if (HexUCtoInt(cChannel) != -1)
  1543. {
  1544. cCmd[9] = cChannel;
  1545. }
  1546. else
  1547. {
  1548. mLog::FERROR("SAE param Error cChannel{$}", cChannel);
  1549. return false;
  1550. }
  1551. string strTemp = std::format("{:04X}", nTime);
  1552. cCmd[10] = strTemp.at(0);
  1553. cCmd[11] = strTemp.at(1);
  1554. cCmd[12] = strTemp.at(2);
  1555. cCmd[13] = strTemp.at(3);
  1556. if (0 <= nMode && nMode <= 2)
  1557. {
  1558. strTemp = std::format("{:x}", nMode);
  1559. cCmd[14] = strTemp.at(0);
  1560. }
  1561. else
  1562. {
  1563. mLog::FERROR("SAE param Error nMode{$}", nMode);
  1564. return false;
  1565. }
  1566. if (bEnable)
  1567. {
  1568. cCmd[15] = 0x31;
  1569. }
  1570. else
  1571. {
  1572. cCmd[15] = 0x30;
  1573. }
  1574. nSize = 16;
  1575. FormatCmd(cCmd, nSize);
  1576. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1577. {
  1578. return true;
  1579. }
  1580. else
  1581. {
  1582. mLog::FERROR("Command: 'SAE' false!");
  1583. }
  1584. return false;
  1585. }
  1586. //PT_STOP时间读取功能
  1587. bool DeviceFullUCB::UCBCmdSPT(const char& cInChannel, const int& nTime)
  1588. {
  1589. char cCmd[FullUCB_Com_NormalLen] = "SPTA01";
  1590. int nSize = 6;
  1591. if (HexUCtoInt(cInChannel) != -1)
  1592. {
  1593. cCmd[6] = cInChannel;
  1594. }
  1595. else
  1596. {
  1597. mLog::FERROR("SPT param Error cInChannel{$}", cInChannel);
  1598. return false;
  1599. }
  1600. nSize = 7;
  1601. FormatCmd(cCmd, nSize);
  1602. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1603. {
  1604. return true;
  1605. }
  1606. else
  1607. {
  1608. mLog::FERROR("Command: 'SAE' false!");
  1609. }
  1610. return false;
  1611. }
  1612. //Can发送数据
  1613. bool DeviceFullUCB::UCBCmdSTL(const int& nType, const char* cID, const int& nLen, const char* cData)
  1614. {
  1615. char cCmd[FullUCB_Com_NormalLen] = "STLB";
  1616. int nSize = 6;
  1617. string strTemp = std::format("{:02X}", 2 * nLen + 10);
  1618. cCmd[4] = strTemp.at(0);
  1619. cCmd[5] = strTemp.at(1);
  1620. memcpy((void*)(cCmd + 6), (void*)cID, 8);
  1621. cCmd[14] = InttoHexUC(nType);
  1622. cCmd[15] = InttoHexUC(nLen);
  1623. memcpy((void*)(cCmd + 16), (void*)cData, nLen * 2);
  1624. nSize = 2 * nLen + 16;
  1625. FormatCmd(cCmd, nSize);
  1626. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1627. {
  1628. return true;
  1629. }
  1630. mLog::FERROR("Command: 'STL' false!");
  1631. return false;
  1632. }
  1633. //Can设置
  1634. bool DeviceFullUCB::UCBCmdSCS(const char& cProtocol, const char& cBaud, const char* cFilter, const char& cEnable)
  1635. {
  1636. char cCmd[FullUCB_Com_NormalLen] = "SCSA13";
  1637. int nSize = 6;
  1638. if (cProtocol == '0' || cProtocol == '1')
  1639. {
  1640. cCmd[6] = cProtocol;
  1641. }
  1642. else
  1643. {
  1644. mLog::FERROR("SCS param Error Protocol{$}", cProtocol);
  1645. return false;
  1646. }
  1647. if (HexUCtoInt(cBaud) != -1)
  1648. {
  1649. cCmd[7] = cBaud;
  1650. }
  1651. else
  1652. {
  1653. mLog::FERROR("SCS param Error Baud{$}", cBaud);
  1654. return false;
  1655. }
  1656. memcpy((void*)(cCmd + 8), (void*)cFilter, 16);
  1657. if (cEnable == '0' || cEnable == '1')
  1658. {
  1659. cCmd[24] = cEnable;
  1660. }
  1661. else
  1662. {
  1663. mLog::FERROR("SCS param Error Enable{$}", cEnable);
  1664. return false;
  1665. }
  1666. nSize = 25;
  1667. FormatCmd(cCmd, nSize);
  1668. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1669. {
  1670. return true;
  1671. }
  1672. else
  1673. {
  1674. mLog::FERROR("Command: 'SCS' false!");
  1675. }
  1676. return false;
  1677. }
  1678. //PWM设置
  1679. bool DeviceFullUCB::UCBCmdSPS(const string& strChannelID, const int& nCycle, const int& nPulse)
  1680. {
  1681. char cCmd[FullUCB_Com_NormalLen] = "SPSB0A";
  1682. int nSize = 6;
  1683. if (strChannelID.length() != 2)
  1684. {
  1685. mLog::FERROR("SPS ChannelID[{$}] not right", strChannelID.c_str());
  1686. return false;
  1687. }
  1688. else
  1689. {
  1690. cCmd[6] = strChannelID.at(0);
  1691. cCmd[7] = strChannelID.at(1);
  1692. }
  1693. if (!(1 <= nCycle && nCycle <= 50000))
  1694. {
  1695. mLog::FERROR("SPS param Error Cycle{$}", nCycle);
  1696. return false;
  1697. }
  1698. string strTemp = std::format("{:04X}", nCycle);
  1699. cCmd[8] = strTemp.at(0);
  1700. cCmd[9] = strTemp.at(1);
  1701. cCmd[10] = strTemp.at(2);
  1702. cCmd[11] = strTemp.at(3);
  1703. if (!(0 <= nPulse && nPulse <= nCycle))
  1704. {
  1705. mLog::FERROR("SPS param Error Pulse:{$},Cycle:{$}", nPulse, nCycle);
  1706. return false;
  1707. }
  1708. strTemp = std::format("{:04X}", nPulse);
  1709. cCmd[12] = strTemp.at(0);
  1710. cCmd[13] = strTemp.at(1);
  1711. cCmd[14] = strTemp.at(2);
  1712. cCmd[15] = strTemp.at(3);
  1713. nSize = 16;
  1714. FormatCmd(cCmd, nSize);
  1715. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1716. {
  1717. return true;
  1718. }
  1719. else
  1720. {
  1721. mLog::FERROR("Command: 'SPS' false!");
  1722. }
  1723. return false;
  1724. }
  1725. //PWM使能
  1726. bool DeviceFullUCB::UCBCmdSPE(const string& strChannelID, const char& cMode, const char& cEnable)
  1727. {
  1728. char cCmd[FullUCB_Com_NormalLen] = "SPEA04";
  1729. int nSize = 6;
  1730. if (strChannelID.length() != 2)
  1731. {
  1732. mLog::FERROR("SPE ChannelID[{$}] not right", strChannelID.c_str());
  1733. return false;
  1734. }
  1735. else
  1736. {
  1737. cCmd[6] = strChannelID.at(0);
  1738. cCmd[7] = strChannelID.at(1);
  1739. }
  1740. if ('0' <= cMode && cMode <= '3')
  1741. {
  1742. cCmd[8] = cMode;
  1743. }
  1744. else
  1745. {
  1746. mLog::FERROR("SPE param Error Mode[{$:C}]", cMode);
  1747. return false;
  1748. }
  1749. if ('0' == cEnable || '1' == cEnable)
  1750. {
  1751. cCmd[9] = cEnable;
  1752. }
  1753. else
  1754. {
  1755. mLog::FERROR("SPE param Error Enable[{$:C}]", cEnable);
  1756. return false;
  1757. }
  1758. nSize = 10;
  1759. FormatCmd(cCmd, nSize);
  1760. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1761. {
  1762. return true;
  1763. }
  1764. else
  1765. {
  1766. mLog::FERROR("Command: 'SPE' false!");
  1767. }
  1768. return false;
  1769. }
  1770. //曝光模式切换
  1771. bool DeviceFullUCB::UCBCmdSMS(const char& cExpMode, const int& nExpCount)
  1772. {
  1773. char cCmd[FullUCB_Com_NormalLen] = "SMSA03";
  1774. int nSize = 6;
  1775. if (!('0' <= cExpMode && cExpMode <= '3'))
  1776. {
  1777. mLog::FERROR("SMS param Exposure Mode error!");
  1778. return false;
  1779. }
  1780. if (!((0 <= nExpCount && nExpCount <= 200) || nExpCount == 255))
  1781. {
  1782. mLog::FERROR("SMS param nCount error!");
  1783. return false;
  1784. }
  1785. cCmd[6] = cExpMode;
  1786. string strTemp = std::format("{:02X}", nExpCount);
  1787. cCmd[7] = strTemp.at(0);
  1788. cCmd[8] = strTemp.at(1);
  1789. nSize = 9;
  1790. FormatCmd(cCmd, nSize);
  1791. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1792. {
  1793. return false;
  1794. }
  1795. else
  1796. {
  1797. mLog::FERROR("Command: 'SMS' false!");
  1798. }
  1799. return false;
  1800. }
  1801. //通道属性设置
  1802. bool DeviceFullUCB::UCBCmdSCP(const char& cZone, const int& cZoneIndex, const string& strChannelID, const char* cIOSet)
  1803. {
  1804. char cCmd[FullUCB_Com_NormalLen] = "SCPA0A";
  1805. int nSize = 6;
  1806. if (cZone == 'A' || cZone == 'B')
  1807. {
  1808. cCmd[6] = cZone;
  1809. }
  1810. else
  1811. {
  1812. mLog::FERROR("SCP param Error Zone{$}", cZone);
  1813. return false;
  1814. }
  1815. if ('0' <= cZoneIndex && cZoneIndex <= '3')
  1816. {
  1817. cCmd[7] = cZoneIndex;
  1818. }
  1819. else
  1820. {
  1821. mLog::FERROR("SCP param Error ZoneIndex{$}", cZoneIndex);
  1822. return false;
  1823. }
  1824. if (strChannelID.length() != 2)
  1825. {
  1826. mLog::FERROR("SCP ChannelID[{$}] not right", strChannelID.c_str());
  1827. return false;
  1828. }
  1829. else
  1830. {
  1831. cCmd[8] = strChannelID.at(0);
  1832. cCmd[9] = strChannelID.at(1);
  1833. }
  1834. memcpy((void*)(cCmd + 10), (void*)cIOSet, 6);
  1835. nSize = 16;
  1836. FormatCmd(cCmd, nSize);
  1837. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1838. {
  1839. return true;
  1840. }
  1841. else
  1842. {
  1843. mLog::FERROR("Command: 'SCP' false!");
  1844. }
  1845. return false;
  1846. }
  1847. //通道属性读取确认
  1848. bool DeviceFullUCB::UCBCmdSCD(const char& cZone, const int& cZoneIndex, const string& strChannelID, const char* cIOSet)
  1849. {
  1850. char cCmd[FullUCB_Com_NormalLen] = "SCDA04";
  1851. int nSize = 6;
  1852. if (cZone == 'A' || cZone == 'B')
  1853. {
  1854. cCmd[6] = cZone;
  1855. }
  1856. else
  1857. {
  1858. mLog::FERROR("SCD param Error Zone{$}", cZone);
  1859. return false;
  1860. }
  1861. if ('0' <= cZoneIndex && cZoneIndex <= '3')
  1862. {
  1863. cCmd[7] = cZoneIndex;
  1864. }
  1865. else
  1866. {
  1867. mLog::FERROR("SCD param Error ZoneIndex{$}", cZoneIndex);
  1868. return false;
  1869. }
  1870. if (strChannelID.length() != 2)
  1871. {
  1872. mLog::FERROR("SCD ChannelID[{$}] not right", strChannelID.c_str());
  1873. return false;
  1874. }
  1875. else
  1876. {
  1877. cCmd[8] = strChannelID.at(0);
  1878. cCmd[9] = strChannelID.at(1);
  1879. }
  1880. nSize = 10;
  1881. FormatCmd(cCmd, nSize);
  1882. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1883. {
  1884. return true;
  1885. }
  1886. else
  1887. {
  1888. mLog::FERROR("Command: 'SCD' false!");
  1889. }
  1890. return false;
  1891. }
  1892. //写入通道版本
  1893. bool DeviceFullUCB::UCBCmdSPW(const char& cZone, const char* cIOConfVer)
  1894. {
  1895. char cCmd[FullUCB_Com_NormalLen] = "SPWA11";
  1896. int nSize = 6;
  1897. if (cZone == 'A' || cZone == 'B')
  1898. {
  1899. cCmd[6] = cZone;
  1900. }
  1901. else
  1902. {
  1903. mLog::FERROR("SPW param Error Zone{$}", cZone);
  1904. return false;
  1905. }
  1906. memcpy((void*)(cCmd + 7), (void*)cIOConfVer, 16);
  1907. nSize = 23;
  1908. FormatCmd(cCmd, nSize);
  1909. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1910. {
  1911. return true;
  1912. }
  1913. else
  1914. {
  1915. mLog::FERROR("Command: 'SPW' false!");
  1916. }
  1917. return false;
  1918. }
  1919. //读取通道版本
  1920. bool DeviceFullUCB::UCBCmdSPR(const char& cZone, const char* cIOConfVer)
  1921. {
  1922. char cCmd[FullUCB_Com_NormalLen] = "SPRA01";
  1923. int nSize = 6;
  1924. if (cZone == 'A' || cZone == 'B')
  1925. cCmd[6] = cZone;
  1926. else
  1927. {
  1928. mLog::FERROR("SPR param Error Zone{$}", cZone);
  1929. return false;
  1930. }
  1931. nSize = 7;
  1932. FormatCmd(cCmd, nSize);
  1933. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1934. {
  1935. return true;
  1936. }
  1937. else
  1938. {
  1939. mLog::FERROR("Command: 'SPW' false!");
  1940. }
  1941. return false;
  1942. }
  1943. //读取通道状态
  1944. bool DeviceFullUCB::UCBCmdSRS(const string& strChannelID, const char& cValue)
  1945. {
  1946. char cCmd[FullUCB_Com_NormalLen] = "SRSA02";
  1947. int nSize = 6;
  1948. if (strChannelID.length() != 2)
  1949. {
  1950. mLog::FERROR("SWS ChannelID[{$}] not right", strChannelID.c_str());
  1951. return false;
  1952. }
  1953. else
  1954. {
  1955. cCmd[6] = strChannelID.at(0);
  1956. cCmd[7] = strChannelID.at(1);
  1957. }
  1958. nSize = 8;
  1959. FormatCmd(cCmd, nSize);
  1960. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1961. {
  1962. return true;
  1963. }
  1964. else
  1965. {
  1966. mLog::FERROR("Command: 'SRS' false!");
  1967. }
  1968. return false;
  1969. }
  1970. //通道输出设置
  1971. bool DeviceFullUCB::UCBCmdSWS(const string& strChannelID, const bool& bValue)
  1972. {
  1973. char cCmd[FullUCB_Com_NormalLen] = "SWSA03";
  1974. int nSize = 6;
  1975. if (strChannelID.length() != 2)
  1976. {
  1977. mLog::FERROR("SWS ChannelID[{$}] not right", strChannelID.c_str());
  1978. return false;
  1979. }
  1980. else
  1981. {
  1982. cCmd[6] = strChannelID.at(0);
  1983. cCmd[7] = strChannelID.at(1);
  1984. }
  1985. if (bValue)
  1986. cCmd[8] = '1';
  1987. else
  1988. cCmd[8] = '0';
  1989. nSize = 9;
  1990. FormatCmd(cCmd, nSize);
  1991. if (RET_STATUS::RET_SUCCEED == HWSendNormal(cCmd, nSize, FullUCB_Com_HeadLen))
  1992. {
  1993. return true;
  1994. }
  1995. else
  1996. {
  1997. mLog::FERROR("Command: 'SWS' false!");
  1998. }
  1999. return false;
  2000. }