TomoExamHandler.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731
  1. #include "stdafx.h"
  2. #include "TomoExamHandler.h"
  3. #include "LogicDeviceHandSwitch.h"
  4. #include "LogicDeviceManager.h"
  5. #include "IMotionModelManager.h"
  6. #include "IMotionModel.h"
  7. #include "MotionStages.h"
  8. #include "ConfigurerMotion.h"
  9. #include "ConfigurerPositionCode.h"
  10. #include "LogicDriverDPCProxy.h"
  11. #include "FeedbackDefine.h"
  12. #include "PacketDefine.h"
  13. #include "TomoMotionStageArgs.h"
  14. #include "MechnicalMonitor.h"
  15. #include "IPositionManager.h"
  16. #include "DigitalTwinLogger.h"
  17. #include "LogicDeviceMechTomo.h"
  18. #include "RADMotionStageArgs.h"
  19. #include "ConfigurerWS.h"
  20. using namespace DIOS::Dev::Detail::MachineryECOM;
  21. TomoExamHandler::TomoExamHandler()
  22. :m_handSwitchState(HS_NONE),
  23. m_modelLoaded(FALSE),
  24. m_postionManager(nullptr),
  25. m_modelManager(nullptr),
  26. m_tomoLogicGate(TLG_CHANNEL_RESET)
  27. {
  28. }
  29. TomoExamHandler::~TomoExamHandler()
  30. {
  31. }
  32. void TomoExamHandler::OnModelLoaded(IMotionModelManager *modelManager)
  33. {
  34. m_modelManager = modelManager;
  35. }
  36. void TomoExamHandler::OnCoordinatesLoaded(IPositionManager *coordinates)
  37. {
  38. m_postionManager = coordinates;
  39. }
  40. void TomoExamHandler::OnMotionEvent(const std::string &motionEventName)
  41. {
  42. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnMotionEvent]->[Enter][{$}]", motionEventName.c_str());
  43. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  44. auto args = (TomoMotionStageArgs*)model->GetStageArgs();
  45. if (motionEventName == MONITOR_EVENT_TUBEANGLE_MOVE_STOP)
  46. {
  47. args->SetTubeAngleMotionStatus(FALSE);
  48. }
  49. else if (motionEventName == MONITOR_EVENT_TUBEHEIGHT_MOVE_STOP)
  50. {
  51. args->SetTubeHeightMotionStatus(FALSE);
  52. }
  53. else if (motionEventName == MONITOR_EVENT_TUBEHORIZONTAL_MOVE_STOP)
  54. {
  55. args->SetTubeHorizontalMotionStatus(FALSE);
  56. }
  57. if (motionEventName == MONITOR_EVENT_TUBEANGLE_MOVE_STOP
  58. || motionEventName == MONITOR_EVENT_TUBEHEIGHT_MOVE_STOP
  59. || motionEventName == MONITOR_EVENT_TUBEHORIZONTAL_MOVE_STOP)
  60. {
  61. if (args->IsMotionStoped())
  62. {
  63. MechnicalMonitor::Instance()->EndMonitor();
  64. DigitalTwinLogger::Instance()->ReceiveTimePoint();
  65. auto currentStage = model->GetStageName();
  66. if (TOMO_STAGE_ADJUST_SID_MOVE == currentStage)
  67. {
  68. if (ConfigurerWS::IsDoubleWorkstation())
  69. {
  70. ChangeMotionModelStage(TOMO_STAGE_MOVETO_START_POS);
  71. }
  72. }
  73. else if (TOMO_STAGE_MOVETO_START_POS == currentStage)
  74. {
  75. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  76. if (hswDevice)
  77. {
  78. hswDevice->SwitchState(HSW_FIRST_DOWN);
  79. }
  80. UpdateTomoTriggerGate(TLG_CHANNEL_MOTION_READY);
  81. if (m_handSwitchState == HS_GEAR_SECOND_PRESSED)
  82. {
  83. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  84. if (hswDevice)
  85. {
  86. hswDevice->SwitchState(HSW_SECOND_DOWN);
  87. }
  88. }
  89. }
  90. else if (TOMO_STAGE_MOVETO_START_POS_PRE_CENTER_ADJUST == currentStage)
  91. {
  92. if (m_handSwitchState == HS_GEAR_FIRST_PRESSED || m_handSwitchState == HS_GEAR_SECOND_PRESSED)
  93. {
  94. m_postionManager->NotifyAlignStatus(TRUE);
  95. ChangeMotionModelStage(TOMO_STAGE_MOVETO_START_POS);
  96. }
  97. }
  98. }
  99. }
  100. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnMotionEvent]->[Exit][{$}]", motionEventName.c_str());
  101. }
  102. void TomoExamHandler::ChangeMotionModelStage(const std::string& stageName)
  103. {
  104. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][ChangeMotionModelStage]->[{$}]", stageName.c_str());
  105. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  106. if (model)
  107. {
  108. model->ChangeStage(stageName);
  109. if (stageName == TOMO_STAGE_MOVETO_START_POS || stageName == TOMO_STAGE_MOVETO_START_POS_PRE_CENTER_ADJUST
  110. || stageName == TOMO_STAGE_ADJUST_SID_MOVE)
  111. {
  112. auto args = (TomoMotionStageArgs*)model->GetStageArgs();
  113. if (!ConfigurerWS::IsDoubleWorkstation())
  114. {
  115. args->SetTubeAngleMotionStatus(TRUE);
  116. args->SetTubeHeightMotionStatus(TRUE);
  117. args->SetTubeHorizontalMotionStatus(FALSE);
  118. MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_HEIGHT);
  119. MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_ANGLE);
  120. }
  121. else
  122. {
  123. args->SetTubeAngleMotionStatus(TRUE);
  124. args->SetTubeHeightMotionStatus(TRUE);
  125. args->SetTubeHorizontalMotionStatus(TRUE);
  126. MechnicalMonitor::Instance()->BeginMonitor(this);
  127. }
  128. }
  129. }
  130. }
  131. RET_STATUS TomoExamHandler::OnSelectExamMode(const char *pExamKey)
  132. {
  133. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSelectExamMode]->[Enter][{$}]", pExamKey);
  134. ChangeMotionModelStage(TOMO_STAGE_CLEAR_PARAMS);
  135. if (!m_modelLoaded)
  136. {
  137. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  138. if (model)
  139. {
  140. ResDataObject tomoparms;
  141. if (ConfigurerMotion::GetTomoConfigs(tomoparms))
  142. {
  143. model->LoadModelParams(tomoparms);
  144. }
  145. ResDataObject mechparms;
  146. if (ConfigurerMotion::GetMachineryConfigs(mechparms))
  147. {
  148. model->LoadMachineryParams(mechparms);
  149. }
  150. m_modelLoaded = TRUE;
  151. }
  152. }
  153. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSelectExamMode]->[Exit][{$}]", pExamKey);
  154. return RET_STATUS::RET_SUCCEED;
  155. }
  156. RET_STATUS TomoExamHandler::OnFrameAcq()
  157. {
  158. IExamHandler::OnFrameAcq();
  159. UpdateTomoTriggerGate(TLG_CHANNEL_EXPOSURE_READY);
  160. return RET_STATUS::RET_SUCCEED;
  161. }
  162. RET_STATUS TomoExamHandler::OnMoveMech(FLOAT pos)
  163. {
  164. return RET_STATUS::RET_SUCCEED;
  165. }
  166. RET_STATUS TomoExamHandler::OnBlindRotateMech(FLOAT Angle)
  167. {
  168. return RET_STATUS::RET_SUCCEED;
  169. }
  170. RET_STATUS TomoExamHandler::OnRotateMech(FLOAT Angle)
  171. {
  172. return RET_STATUS::RET_SUCCEED;
  173. }
  174. RET_STATUS TomoExamHandler::OnActionMech(FLOAT Pos, FLOAT Angle)
  175. {
  176. return RET_STATUS::RET_SUCCEED;
  177. }
  178. RET_STATUS TomoExamHandler::OnStopMech()
  179. {
  180. ChangeMotionModelStage(TOMO_STAGE_MOTION_ERROR_STOP);
  181. return RET_STATUS::RET_SUCCEED;
  182. }
  183. RET_STATUS TomoExamHandler::OnGetTomoResults(ResDataObject &resultAngle, ResDataObject &resultHeight)
  184. {
  185. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnGetTomoResults]->[Enter]");
  186. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  187. if (model)
  188. {
  189. ResDataObject resAngle;
  190. resAngle.add("key", "AngleResult");
  191. model->GetMotionParams(resAngle);
  192. resultAngle = resAngle;
  193. ResDataObject resHeight;
  194. resHeight.add("key", "HeightResult");
  195. model->GetMotionParams(resHeight);
  196. resultHeight = resHeight;
  197. }
  198. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnGetTomoResults]->[Exit]");
  199. return RET_STATUS::RET_SUCCEED;
  200. }
  201. RET_STATUS TomoExamHandler::OnSetTechParamsInfo(ResDataObject &pParam)
  202. {
  203. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSetTechParamsInfo]->[Enter][{$}]", pParam.encode());
  204. ResDataObject tomoTechnicals;
  205. if (ParseTechnicalParams(pParam, tomoTechnicals))
  206. {
  207. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][ParseTechnicalParams]->[{$}]", tomoTechnicals.encode());
  208. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  209. if (model)
  210. {
  211. model->SetTechnicalParams(tomoTechnicals);
  212. }
  213. ChangeMotionModelStage(TOMO_STAGE_CALCULATE_PARAMS);
  214. NotifyTechParamsToDriver(tomoTechnicals);
  215. }
  216. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSetTechParamsInfo]->[Exit]");
  217. return RET_STATUS::RET_SUCCEED;
  218. }
  219. RET_STATUS TomoExamHandler::OnRecalculateTomoMotionParam()
  220. {
  221. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnRecalculateTomoMotionParam]->[Enter]");
  222. ChangeMotionModelStage(TOMO_STAGE_CALCULATE_PARAMS);
  223. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnRecalculateTomoMotionParam]->[Exit]");
  224. return RET_STATUS::RET_SUCCEED;
  225. }
  226. RET_STATUS TomoExamHandler::OnFramePrep()
  227. {
  228. IExamHandler::OnFramePrep();
  229. return RET_STATUS::RET_SUCCEED;
  230. }
  231. RET_STATUS TomoExamHandler::OnFrameError()
  232. {
  233. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnFrameError]->[Enter]");
  234. IExamHandler::OnFrameError();
  235. ChangeMotionModelStage(TOMO_STAGE_MOTION_ERROR_STOP);
  236. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnFrameError]->[Exit]");
  237. return RET_STATUS::RET_SUCCEED;
  238. }
  239. RET_STATUS TomoExamHandler::OnFrameRecover()
  240. {
  241. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnFrameRecover]->[Enter]");
  242. IExamHandler::OnFrameRecover();
  243. ChangeMotionModelStage(TOMO_STAGE_MOTION_ERROR_RECOVER);
  244. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnFrameRecover]->[Exit]");
  245. return RET_STATUS::RET_SUCCEED;
  246. }
  247. RET_STATUS TomoExamHandler::OnSeqError()
  248. {
  249. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSeqError]->[Enter]");
  250. IExamHandler::OnSeqError();
  251. ChangeMotionModelStage(TOMO_STAGE_MOTION_ERROR_STOP);
  252. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSeqError]->[Exit]");
  253. return RET_STATUS::RET_SUCCEED;
  254. }
  255. RET_STATUS TomoExamHandler::OnSetFrameRate(FLOAT frameRate)
  256. {
  257. IExamHandler::OnSetFrameRate(frameRate);
  258. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnSetFrameRate]->[{$:f6}]", frameRate);
  259. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  260. auto args = (TomoMotionStageArgs*)model->GetStageArgs();
  261. args->FPS = frameRate;
  262. ChangeMotionModelStage(TOMO_STAGE_MOTION_CHANGE_PFS);
  263. return RET_STATUS::RET_SUCCEED;
  264. }
  265. void TomoExamHandler::OnHandSwitchGearFirstPressed()
  266. {
  267. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearFirstPressed]->[Enter]");
  268. printf("[TomoExamHandler][OnHandSwitchGearFirstPressed]->[SwitchState(HSW_FIRST_DOWN)]\n");
  269. m_handSwitchState = HS_GEAR_FIRST_PRESSED;
  270. if (ConfigurerWS::IsDoubleWorkstation())
  271. {
  272. ChangeMotionModelStage(TOMO_STAGE_ADJUST_SID_MOVE);
  273. }
  274. else
  275. {
  276. ChangeMotionModelStage(TOMO_STAGE_MOVETO_START_POS);
  277. }
  278. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearFirstPressed]->[Exit]");
  279. }
  280. void TomoExamHandler::OnHandSwitchGearFirstReleased()
  281. {
  282. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearFirstReleased]->[Enter]");
  283. printf("[TomoExamHandler][OnHandSwitchGearFirstReleased]->[SwitchState(HSW_FIRST_UP)]\n");
  284. m_handSwitchState = HS_GEAR_FIRST_RELEASED;
  285. ChangeMotionModelStage(TOMO_STAGE_MOTION_ERROR_STOP);
  286. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  287. if (hswDevice)
  288. {
  289. hswDevice->SwitchState(HSW_FIRST_UP);
  290. }
  291. if (m_postionManager)
  292. {
  293. auto tubeAngle = m_postionManager->GetCurrentPhysical(TOMO_TUBE_ANGLE);
  294. auto tubeHeight = m_postionManager->GetCurrentPhysical(TOMO_TUBE_HEIGHT);
  295. if (gmotionLog) gmotionLog->Info("[TomoExamHandler][OnHandSwitchGearFirstReleased]->[Current position {$:f3} {$:f3}]", tubeAngle, tubeHeight);
  296. }
  297. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearFirstReleased]->[Exit]");
  298. }
  299. void TomoExamHandler::OnHandSwitchGearSecondPressed()
  300. {
  301. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearSecondPressed]->[Enter]");
  302. try
  303. {
  304. auto lastHandSwitchState = m_handSwitchState;
  305. m_handSwitchState = HS_GEAR_SECOND_PRESSED;
  306. if (lastHandSwitchState != HS_GEAR_FIRST_PRESSED)
  307. {
  308. throw new exception("[lastHandSwitchState != HS_GEAR_FIRST_PRESSED]");
  309. }
  310. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  311. if (!model)
  312. {
  313. throw new exception("[MOTION_MODEL_TOMO is null]");
  314. }
  315. UpdateTomoTriggerGate(TLG_CHANNEL_HANDSWITCH_READY);
  316. auto stageArgs = (TomoMotionStageArgs*)model->GetStageArgs();
  317. if (!stageArgs || !stageArgs->IsMotionStoped())
  318. {
  319. throw new exception("[Motion Not Stoped]");
  320. }
  321. printf("[TomoExamHandler][OnHandSwitchGearSecondPressed]->[LOGICDEVICE_MECH_HSW]\n");
  322. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  323. if (hswDevice)
  324. {
  325. printf("[TomoExamHandler][OnHandSwitchGearSecondPressed]->[SwitchState(HSW_SECOND_DOWN)]\n");
  326. hswDevice->SwitchState(HSW_SECOND_DOWN);
  327. }
  328. }
  329. catch (exception *e)
  330. {
  331. if(gbusinessLog) gbusinessLog->Warn("[TomoExamHandler][OnHandSwitchGearSecondPressed]->[Exception][{$}]",e->what());
  332. }
  333. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearSecondPressed]->[Exit]");
  334. }
  335. void TomoExamHandler::OnHandSwitchGearSecondReleased()
  336. {
  337. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearSecondReleased]->[Enter]");
  338. DigitalTwinLogger::Instance()->ReceiveTimePoint();
  339. m_handSwitchState = HS_GEAR_SECOND_RELEASED;
  340. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  341. if (hswDevice)
  342. {
  343. printf("[TomoExamHandler][OnHandSwitchGearSecondPressed]->[SwitchState(HSW_SECOND_UP)]\n");
  344. hswDevice->SwitchState(HSW_SECOND_UP);
  345. }
  346. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnHandSwitchGearSecondReleased]->[Exit]");
  347. }
  348. void TomoExamHandler::OnPWMOffset(PWMOffsetPacket *pwmoff)
  349. {
  350. }
  351. void TomoExamHandler::OnXrayOn()
  352. {
  353. }
  354. void TomoExamHandler::OnXrayOff()
  355. {
  356. }
  357. void TomoExamHandler::OnTubeAngleEncoder(EncoderPacket *tubeangleEncoder)
  358. {
  359. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnTubeAngleEncoder]->[Enter][{$:d08}]", tubeangleEncoder->encoder);
  360. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  361. if (model)
  362. {
  363. ResDataObject encoders;
  364. encoders.add("key", TOMO_MODEL_FEEDBACK_KEY_ANGLEENCODER.c_str());
  365. encoders.add(TOMO_MODEL_FEEDBACK_KEY_ANGLEENCODER.c_str(), tubeangleEncoder->encoder);
  366. model->OnFeedbackMotionParams(encoders);
  367. }
  368. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnTubeAngleEncoder]->[Exit]");
  369. }
  370. void TomoExamHandler::OnTubeHeightEncoder(EncoderPacket *tubeheightEncoder)
  371. {
  372. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnTubeHeightEncoder]->[Enter][{$:d08}]", tubeheightEncoder->encoder);
  373. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  374. if (model)
  375. {
  376. ResDataObject encoders;
  377. encoders.add("key", TOMO_MODEL_FEEDBACK_KEY_LINEENCODER.c_str());
  378. encoders.add(TOMO_MODEL_FEEDBACK_KEY_LINEENCODER.c_str(), tubeheightEncoder->encoder);
  379. model->OnFeedbackMotionParams(encoders);
  380. }
  381. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnTubeHeightEncoder]->[Exit]");
  382. }
  383. BOOL TomoExamHandler::ParseTechnicalParams(ResDataObject &paramIn, ResDataObject &paramOut)
  384. {
  385. try
  386. {
  387. if (paramIn.GetFirstOf("SID") < 0)
  388. {
  389. TPRINTA_ERROR("SID is not exist");
  390. return FALSE;
  391. }
  392. if (paramIn.GetFirstOf("PositionNumber") < 0)
  393. {
  394. TPRINTA_ERROR("PositionNumber is not exist");
  395. return FALSE;
  396. }
  397. std::string strCode = (const char *)paramIn["PositionNumber"];
  398. int nCode = atoi(strCode.c_str());
  399. ResDataObject PositionCodeParam;
  400. if (!ConfigurerPositionCode::GetPositionCodeConfigs(PositionCodeParam))
  401. {
  402. TPRINTA_ERROR("PositionCode is not exist");
  403. return FALSE;
  404. }
  405. paramOut.clear();
  406. std::string strKey = "PC" + strCode;
  407. if (PositionCodeParam.GetFirstOf(strKey.c_str()) >= 0)
  408. {
  409. //20000到30000之间是Tomo的position code范围
  410. if (nCode > 20000 && nCode < 30000)
  411. {
  412. ResDataObject pcset;
  413. pcset = PositionCodeParam[strKey.c_str()];
  414. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][GetPositionCodeConfigs]->[{$}]", pcset.encode());
  415. paramOut.add("PositionNumber" , nCode);
  416. paramOut.add("TomoScanAngle" ,pcset["TomoScanAngle"]);
  417. paramOut.add("TomoScanMinDistance" , pcset["TomoScanMinDistance"]);
  418. paramOut.add("TomoMotionSpeed" ,pcset["TomoMotionSpeed"]);
  419. paramOut.add("TomoProjectionNumber" ,(int)atoi((const char *)pcset["TomoProjectionNumber"]));
  420. paramOut.add("TomoProjectionDirection" ,(int)atoi((const char *)pcset["TomoProjectionDirection"]));
  421. return TRUE;
  422. }
  423. }
  424. }
  425. catch (ResDataObjectExption &exp)
  426. {
  427. TPRINTA_ERROR(exp.what());
  428. }
  429. catch (...)
  430. {
  431. TPRINTA_ERROR("unknown exp happen");
  432. }
  433. return FALSE;
  434. }
  435. void TomoExamHandler::NotifyTechParamsToDriver(ResDataObject &tomoTechnicals)
  436. {
  437. ResDataObject notify;
  438. float sid = ConfigurerMotion::GetTomoSID();
  439. float tid = ConfigurerMotion::GetTomoTID();
  440. std::string geometry = ConfigurerMotion::GetTomoGeometry();
  441. float angle = strtof((const char *)tomoTechnicals["TomoScanAngle"],nullptr);
  442. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][NotifyTechParamsToDriver]->[{$:f3} {$:f3} {$:f3}]", sid,tid,angle);
  443. auto logicTomo = (LogicDeviceMechTomo*)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_TOMO);
  444. if (logicTomo)
  445. {
  446. logicTomo->NotifyMachineryTechParams(tid * 100, sid * 100, tomoTechnicals["TomoProjectionNumber"], angle, tomoTechnicals["TomoProjectionDirection"], geometry);
  447. }
  448. //LogicDriverDPCProxy::Instance()->UpdateDriverResource(DRIVER_RESOURCE_TOMO, tid, sid, tomoTechnicals["TomoProjectionNumber"], angle, tomoTechnicals["TomoProjectionDirection"], geometry);
  449. }
  450. void TomoExamHandler::UpdateTomoTriggerGate(TOMO_LOGIC_GATE_CHANNEL channel)
  451. {
  452. m_tomoLogicGate |= channel;
  453. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][UpdateTomoLogicGate]->[{$:X03} -> {$:X03}]", channel, m_tomoLogicGate);
  454. printf("[TomoExamHandler][UpdateTomoLogicGate]->[%03x -> %03x]\n", channel, m_tomoLogicGate);
  455. OnTomoTriggerGateChanged(m_tomoLogicGate);
  456. }
  457. void TomoExamHandler::OnTomoTriggerGateChanged(int gateStatus)
  458. {
  459. if (gateStatus == TLG_CHANNEL_PERFORM_READY)
  460. {
  461. DoPerformTomo();
  462. m_tomoLogicGate = TLG_CHANNEL_RESET;
  463. }
  464. }
  465. void TomoExamHandler::DoPerformTomo()
  466. {
  467. ChangeMotionModelStage(TOMO_STAGE_SET_TOMO_SLICE);
  468. ChangeMotionModelStage(TOMO_STAGE_MOVETO_END_POS);
  469. }
  470. BOOL TomoExamHandler::IsMovingEnable()
  471. {
  472. BOOL bRes = TRUE;
  473. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  474. if (model)
  475. {
  476. string stageName;
  477. model->ChangeStage(stageName);
  478. if (stageName == TOMO_STAGE_MOVETO_START_POS || stageName == TOMO_STAGE_MOVETO_END_POS)
  479. {
  480. if (gbusinessLog) gbusinessLog->Warn("[TomoExamHandler][IsMovingEnable]->[Tomo is working, single motion is not allowed]");
  481. bRes = FALSE;
  482. }
  483. }
  484. if (m_bMachineMoving)
  485. {
  486. if (gbusinessLog) gbusinessLog->Warn("[TomoExamHandler][IsMovingEnable]->[Machine is moving, single motion is not allowed]");
  487. bRes = FALSE;
  488. }
  489. return bRes;
  490. }
  491. RET_STATUS TomoExamHandler::OnStartMove(DOF_MECH mech, int nOrientation)
  492. {
  493. auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
  494. if (!model)
  495. {
  496. return RET_STATUS::RET_FAILED;
  497. }
  498. if (!IsMovingEnable())
  499. {
  500. return RET_STATUS::RET_FAILED;
  501. }
  502. auto modelArgs = (RADMotionStageArgs*)model->GetStageArgs();
  503. if (mech == TOMO_TUBE_HEIGHT)
  504. {
  505. modelArgs->TubeHeightDirection = nOrientation;
  506. modelArgs->TubeHeightStep = -1;
  507. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnStartMove]->[Enter][TOMO_TUBE_HEIGHT][Org: {$:d}]", modelArgs->TubeHeightDirection);
  508. model->ChangeStage(RAD_STAGE_MOVE_TUBE_HEIGHT);
  509. }
  510. else if (mech == TOMO_TUBE_HORIZONTAL)
  511. {
  512. modelArgs->TubeHorizontalMoveDirection = nOrientation;
  513. modelArgs->TubeHorizontalMoveStep = -1;
  514. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnStartMove]->[Enter][TOMO_TUBE_HORIZONTAL][Org: {$:d}]", modelArgs->TubeHeightDirection);
  515. model->ChangeStage(RAD_STAGE_MOVE_TUBE_HORIZONTAL);
  516. }
  517. else if (mech == TOMO_TUBE_ANGLE)
  518. {
  519. modelArgs->TubeAngleDirection = nOrientation;
  520. modelArgs->TubeAngleStep = -1;
  521. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnStartMove]->[Enter][TOMO_TUBE_ANGLE][Org: {$:d}]", modelArgs->TubeAngleDirection);
  522. model->ChangeStage(RAD_STAGE_MOVE_TUBE_ROTATION);
  523. }
  524. m_bMachineMoving = TRUE;
  525. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnStartMove]->[Leave]");
  526. return RET_STATUS::RET_SUCCEED;
  527. }
  528. RET_STATUS TomoExamHandler::OnStopMove(DOF_MECH mech)
  529. {
  530. m_bMachineMoving = FALSE;
  531. if (!IsMovingEnable())
  532. {
  533. if (gbusinessLog) gbusinessLog->Warn("[TomoExamHandler][OnStopMove]->[Single motor motion is not allowed]");
  534. return RET_STATUS::RET_FAILED;
  535. }
  536. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnStopMove]->[Enter]");
  537. auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
  538. if (!model)
  539. {
  540. return RET_STATUS::RET_FAILED;
  541. }
  542. model->ChangeStage(RAD_STAGE_STOP_MOVE);
  543. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnStopMove]->[Leave]");
  544. return RET_STATUS::RET_SUCCEED;
  545. }
  546. RET_STATUS TomoExamHandler::OnWorkstationSwitch(const char* pWorkstation)
  547. {
  548. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnWorkstationSwitch]->[{$}]", pWorkstation);
  549. if (!ConfigurerWS::IsDoubleWorkstation())
  550. {
  551. m_CurWS = ConfigurerWS::GetDefaultWS();
  552. if (gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnWorkstationSwitch]->[It is single WS, change to default {$}]", m_CurWS);
  553. }
  554. else
  555. {
  556. m_CurWS = pWorkstation;
  557. }
  558. auto model = m_modelManager->Resove(MOTION_MODEL_TOMO);
  559. if (!model)
  560. {
  561. return RET_STATUS::RET_FAILED;
  562. }
  563. model->SwitchWorkstation(m_CurWS);
  564. return DIOS::Dev::RET_STATUS::RET_SUCCEED;
  565. }