CBCTExamHandler.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. #include "stdafx.h"
  2. #include "CBCTExamHandler.h"
  3. #include "ConfigurerMotion.h"
  4. #include "IMotionModelManager.h"
  5. #include "IMotionModel.h"
  6. #include "ConfigurerPositionCode.h"
  7. #include "MotionStages.h"
  8. #include "CBCTMotionStageArgs.h"
  9. #include "IPositionManager.h"
  10. #include "..\\LogicDeviceHandSwitch.h"
  11. #include "LogicDeviceManager.h"
  12. #include "MechnicalMonitor.h"
  13. #include "PacketDefine.h"
  14. #include "FeedbackDefine.h"
  15. #include "LogicDriverDPCProxy.h"
  16. #include "CArmGeneralMotionStageArgs.h"
  17. #include "LogicDeviceMechCarm.h"
  18. using namespace DIOS::Dev::Detail::MachineryECOM;
  19. CBCTExamHandler::CBCTExamHandler()
  20. :m_handSwitchState(HS_NONE),
  21. m_modelLoaded(FALSE),
  22. m_postionManager(nullptr),
  23. m_modelManager(nullptr),
  24. m_cbctPerformGate(CBCTLG_CHANNEL_RESET),
  25. m_mechCBCT(TOMO_TUBE_HEIGHT)
  26. {
  27. }
  28. CBCTExamHandler::~CBCTExamHandler()
  29. {
  30. }
  31. void CBCTExamHandler::OnModelLoaded(IMotionModelManager *modelManager)
  32. {
  33. m_modelManager = modelManager;
  34. }
  35. void CBCTExamHandler::OnCoordinatesLoaded(IPositionManager *coordinates)
  36. {
  37. m_postionManager = coordinates;
  38. }
  39. RET_STATUS CBCTExamHandler::OnSelectExamMode(const char *pExamKey)
  40. {
  41. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnSelectExamMode]->[Enter][{$}]", pExamKey);
  42. ChangeMotionModelStage(CBCT_STAGE_CLEAR_PARAMS);
  43. if (!m_modelLoaded)
  44. {
  45. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  46. if (model)
  47. {
  48. ResDataObject modelparms;
  49. if (ConfigurerMotion::GetModelConfigs(modelparms))
  50. {
  51. model->LoadModelParams(modelparms);
  52. }
  53. ResDataObject mechparms;
  54. if (ConfigurerMotion::GetMachineryConfigs(mechparms))
  55. {
  56. model->LoadMachineryParams(mechparms);
  57. }
  58. m_modelLoaded = TRUE;
  59. }
  60. }
  61. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnSelectExamMode]->[Exit][{$}]", pExamKey);
  62. return RET_STATUS::RET_SUCCEED;
  63. }
  64. RET_STATUS CBCTExamHandler::OnSetTechParamsInfo(ResDataObject& pParam)
  65. {
  66. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnSetTechParamsInfo]->[Enter][{$}]", pParam.encode());
  67. ResDataObject technicals;
  68. if (ParseTechnicalParams(pParam, technicals))
  69. {
  70. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  71. if (model)
  72. {
  73. model->SetTechnicalParams(technicals);
  74. }
  75. ChangeMotionModelStage(CBCT_STAGE_CALCULATE_PARAMS);
  76. NotifyTechParamsToDriver(technicals);
  77. }
  78. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnSetTechParamsInfo]->[Exit]");
  79. return RET_STATUS::RET_SUCCEED;
  80. }
  81. void CBCTExamHandler::OnMotionEvent(const std::string &motionEventName)
  82. {
  83. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnMotionEvent]->[Enter][{$}]", motionEventName.c_str());
  84. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  85. auto args = (CBCTMotionStageArgs*)model->GetStageArgs();
  86. if (motionEventName == MONITOR_EVENT_TUBEANGLE_MOVE_STOP)
  87. {
  88. args->SetTubeAngleMotionStatus(FALSE);
  89. }
  90. else if (motionEventName == MONITOR_EVENT_TUBEHEIGHT_MOVE_STOP)
  91. {
  92. args->SetTubeHeightMotionStatus(FALSE);
  93. }
  94. if (motionEventName == MONITOR_EVENT_TUBEANGLE_MOVE_STOP
  95. || motionEventName == MONITOR_EVENT_TUBEHEIGHT_MOVE_STOP)
  96. {
  97. if (args->IsMotionStoped())
  98. {
  99. MechnicalMonitor::Instance()->EndMonitor();
  100. auto currentStage = model->GetStageName();
  101. if (CBCT_STAGE_MOVETO_START_POS == currentStage)
  102. {
  103. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  104. UpdateCBCTTriggerGate(CBCTLG_CHANNEL_MOTION_READY);
  105. //OnHandSwitchGearSecondPressed();
  106. }
  107. }
  108. }
  109. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnMotionEvent]->[Exit][{$}]", motionEventName.c_str());
  110. }
  111. RET_STATUS CBCTExamHandler::OnStopMech()
  112. {
  113. ChangeMotionModelStage(CBCT_STAGE_MOTION_ERROR_STOP);
  114. return RET_STATUS::RET_SUCCEED;
  115. }
  116. RET_STATUS CBCTExamHandler::OnFrameAcq()
  117. {
  118. IExamHandler::OnFrameAcq();
  119. UpdateCBCTTriggerGate(CBCTLG_CHANNEL_EXPOSURE_READY);
  120. return RET_STATUS::RET_SUCCEED;
  121. }
  122. RET_STATUS CBCTExamHandler::OnFramePrep()
  123. {
  124. IExamHandler::OnFramePrep();
  125. m_cbctPerformGate = CBCTLG_CHANNEL_RESET;
  126. return RET_STATUS::RET_SUCCEED;
  127. }
  128. RET_STATUS CBCTExamHandler::OnFrameError()
  129. {
  130. IExamHandler::OnFrameError();
  131. ChangeMotionModelStage(CBCT_STAGE_MOTION_ERROR_STOP);
  132. return RET_STATUS::RET_SUCCEED;
  133. }
  134. RET_STATUS CBCTExamHandler::OnFrameRecover()
  135. {
  136. IExamHandler::OnFrameRecover();
  137. ChangeMotionModelStage(CBCT_STAGE_MOTION_ERROR_RECOVER);
  138. return RET_STATUS::RET_SUCCEED;
  139. }
  140. RET_STATUS CBCTExamHandler::OnSeqError()
  141. {
  142. IExamHandler::OnSeqError();
  143. m_cbctPerformGate = CBCTLG_CHANNEL_RESET;
  144. ChangeMotionModelStage(CBCT_STAGE_MOTION_ERROR_STOP);
  145. return RET_STATUS::RET_SUCCEED;
  146. }
  147. RET_STATUS CBCTExamHandler::OnSetFrameRate(FLOAT frameRate)
  148. {
  149. IExamHandler::OnSetFrameRate(frameRate);
  150. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnSetFrameRate]->[{$:f6}]", frameRate);
  151. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  152. auto args = (CBCTMotionStageArgs*)model->GetStageArgs();
  153. args->FPS = frameRate;
  154. ChangeMotionModelStage(CBCT_STAGE_MOTION_CHANGE_PFS);
  155. return RET_STATUS::RET_SUCCEED;
  156. }
  157. void CBCTExamHandler::OnHandSwitchGearFirstPressed()
  158. {
  159. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearFirstPressed]->[Enter]");
  160. m_handSwitchState = HS_GEAR_FIRST_PRESSED;
  161. //m_cbctPerformGate = CBCTLG_CHANNEL_RESET;
  162. ChangeMotionModelStage(CBCT_STAGE_MOVETO_START_POS);
  163. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearFirstPressed]->[Exit]");
  164. }
  165. void CBCTExamHandler::OnHandSwitchGearFirstReleased()
  166. {
  167. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearFirstReleased]->[Enter]");
  168. m_handSwitchState = HS_GEAR_FIRST_RELEASED;
  169. ChangeMotionModelStage(CBCT_STAGE_STOP_EXPOSURE);
  170. ChangeMotionModelStage(CBCT_STAGE_MOTION_ERROR_STOP);
  171. //auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  172. //if (hswDevice)
  173. //{
  174. // hswDevice->SwitchState(HSW_FIRST_UP);
  175. //}
  176. if (m_postionManager)
  177. {
  178. auto tubeswing = m_postionManager->GetCurrentPhysical(CARM_TUBE_SWING);
  179. auto tubecircular = m_postionManager->GetCurrentPhysical(CARM_TUBE_CIRCULAR);
  180. if (gmotionLog) gmotionLog->Info("[CBCTExamHandler][OnHandSwitchGearFirstReleased]->[Current position {$:f3} {$:f3}]", tubeswing, tubecircular);
  181. }
  182. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearFirstReleased]->[Exit]");
  183. }
  184. void CBCTExamHandler::OnHandSwitchGearSecondPressed()
  185. {
  186. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearSecondPressed]->[Enter]");
  187. try
  188. {
  189. auto lastHandSwitchState = m_handSwitchState;
  190. m_handSwitchState = HS_GEAR_SECOND_PRESSED;
  191. if (lastHandSwitchState != HS_GEAR_FIRST_PRESSED)
  192. {
  193. throw new exception("[lastHandSwitchState != HS_GEAR_FIRST_PRESSED]");
  194. }
  195. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  196. if (!model)
  197. {
  198. throw new exception("[MOTION_MODLE_CBCT is null]");
  199. }
  200. UpdateCBCTTriggerGate(CBCTLG_CHANNEL_HANDSWITCH_READY);
  201. auto stageArgs = (CBCTMotionStageArgs*)model->GetStageArgs();
  202. if (!stageArgs || !stageArgs->IsMotionStoped())
  203. {
  204. throw new exception("[Motion Not Stoped]");
  205. }
  206. ChangeMotionModelStage(CBCT_STAGE_START_EXPOSURE);
  207. }
  208. catch (exception *e)
  209. {
  210. if(gbusinessLog) gbusinessLog->Warn("[CBCTExamHandler][OnHandSwitchGearSecondPressed]->[Exception][{$}]", e->what());
  211. }
  212. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearSecondPressed]->[Exit]");
  213. }
  214. void CBCTExamHandler::OnHandSwitchGearSecondReleased()
  215. {
  216. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearSecondReleased]->[Enter]");
  217. m_handSwitchState = HS_GEAR_SECOND_RELEASED;
  218. auto hswDevice = (LogicDeviceHandSwitch *)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_HSW);
  219. if (hswDevice)
  220. {
  221. hswDevice->SwitchState(HSW_SECOND_UP);
  222. }
  223. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnHandSwitchGearSecondReleased]->[Exit]");
  224. }
  225. void CBCTExamHandler::OnPWMOffset(PWMOffsetPacket *pwmoff)
  226. {
  227. }
  228. void CBCTExamHandler::OnXrayOn()
  229. {
  230. }
  231. void CBCTExamHandler::OnXrayOff()
  232. {
  233. }
  234. void CBCTExamHandler::OnTubeAngleEncoder(EncoderPacket *tubeangleEncoder)
  235. {
  236. }
  237. void CBCTExamHandler::OnTubeHeightEncoder(EncoderPacket *tubeheightEncoder)
  238. {
  239. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnTubeHeightEncoder]->[Enter][{$:d08}]", tubeheightEncoder->encoder);
  240. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  241. if (model)
  242. {
  243. ResDataObject encoders;
  244. encoders.add("key", CARM_MODLE_FEEDBACK_KEY_CIRCULARENCODER.c_str());
  245. encoders.add(CARM_MODLE_FEEDBACK_KEY_CIRCULARENCODER.c_str(), tubeheightEncoder->encoder);
  246. model->OnFeedbackMotionParams(encoders);
  247. }
  248. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][OnTubeHeightEncoder]->[Exit]");
  249. }
  250. BOOL CBCTExamHandler::ParseTechnicalParams(ResDataObject &paramIn, ResDataObject &paramOut)
  251. {
  252. try
  253. {
  254. if (paramIn.GetFirstOf("SID") < 0)
  255. {
  256. TPRINTA_ERROR("SID is not exist");
  257. return FALSE;
  258. }
  259. if (paramIn.GetFirstOf("PositionNumber") < 0)
  260. {
  261. TPRINTA_ERROR("PositionNumber is not exist");
  262. return FALSE;
  263. }
  264. std::string strCode = (const char *)paramIn["PositionNumber"];
  265. int nCode = atoi(strCode.c_str());
  266. ResDataObject PositionCodeParam;
  267. if (!ConfigurerPositionCode::GetPositionCodeConfigs(PositionCodeParam))
  268. {
  269. TPRINTA_ERROR("PositionCode is not exist");
  270. return FALSE;
  271. }
  272. paramOut.clear();
  273. std::string strKey = "PC" + strCode;
  274. if (PositionCodeParam.GetFirstOf(strKey.c_str()) >= 0)
  275. {
  276. //30000到40000之间是CBCT的position code范围
  277. if (nCode > 30000 && nCode < 40000)
  278. {
  279. ResDataObject pcset;
  280. pcset = PositionCodeParam[strKey.c_str()];
  281. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][GetPositionCodeConfigs]->[{$}]", pcset.encode());
  282. paramOut.add("PositionNumber", nCode);
  283. paramOut.add("CBCTStartPos", pcset["CBCTStartPos"]);
  284. paramOut.add("CBCTScanAngle", pcset["CBCTScanAngle"]);
  285. paramOut.add("CBCTMotionSpeed", pcset["CBCTMotionSpeed"]);
  286. paramOut.add("CBCTProjectionNumber", (int)atoi((const char *)pcset["CBCTProjectionNumber"]));
  287. paramOut.add("CBCTProjectionDirection", (int)atoi((const char *)pcset["CBCTProjectionDirection"]));
  288. return TRUE;
  289. }
  290. }
  291. }
  292. catch (ResDataObjectExption &exp)
  293. {
  294. TPRINTA_ERROR(exp.what());
  295. }
  296. catch (...)
  297. {
  298. TPRINTA_ERROR("unknown exp happen");
  299. }
  300. return FALSE;
  301. }
  302. void CBCTExamHandler::NotifyTechParamsToDriver(ResDataObject &technics)
  303. {
  304. ResDataObject notify;
  305. float sid = ConfigurerMotion::GetTomoSID();
  306. float tid = ConfigurerMotion::GetTomoTID();
  307. if (m_CurWS == WS_WALL)
  308. {
  309. sid = ConfigurerMotion::GetTomoSID_Wall();
  310. tid = ConfigurerMotion::GetTomoTID_Wall();
  311. }
  312. else if (m_CurWS == WS_TABLE)
  313. {
  314. sid = ConfigurerMotion::GetTomoSID_Table();
  315. tid = ConfigurerMotion::GetTomoTID_Table();
  316. }
  317. std::string geometry = ConfigurerMotion::GetTomoGeometry();
  318. float angle = 180.0;
  319. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][NotifyTechParamsToDriver]->[{$:f3} {$:f3} {$:f3}]", sid, tid, angle);
  320. auto logicCarm = (LogicDeviceMechCarm*)LogicDeviceManager::Instance()->Resove(LOGICDEVICE_MECH_CARM);
  321. if (logicCarm)
  322. {
  323. logicCarm->NotifyMachineryTechParams(tid * 100, sid * 100, technics["CBCTProjectionNumber"], technics["CBCTScanAngle"], technics["CBCTProjectionDirection"], geometry);
  324. }
  325. //LogicDriverDPCProxy::Instance()->UpdateDriverResource(DRIVER_RESOURCE_TOMO, tid, sid, technics["CBCTProjectionNumber"], angle, technics["CBCTProjectionDirection"], geometry);
  326. }
  327. void CBCTExamHandler::ChangeMotionModelStage(const std::string &stageName)
  328. {
  329. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][ChangeMotionModelStage]->[{$}]", stageName.c_str());
  330. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  331. if (model)
  332. {
  333. model->ChangeStage(stageName);
  334. if (stageName == CBCT_STAGE_MOVETO_START_POS)
  335. {
  336. auto args = (CBCTMotionStageArgs*)model->GetStageArgs();
  337. args->SetTubeAngleMotionStatus(TRUE);
  338. args->SetTubeHeightMotionStatus(TRUE);
  339. MechnicalMonitor::Instance()->BeginMonitor(this);
  340. }
  341. //if (stageName == CBCT_STAGE_MOVETO_END_POS)
  342. //{
  343. // auto args = (CBCTMotionStageArgs*)model->GetStageArgs();
  344. // if (m_mechCBCT == TOMO_TUBE_HEIGHT)
  345. // {
  346. // args->SetTubeHeightMotionStatus(TRUE);
  347. // }
  348. // else if (m_mechCBCT == TOMO_TUBE_ANGLE)
  349. // {
  350. // args->SetTubeAngleMotionStatus(TRUE);
  351. // }
  352. // MechnicalMonitor::Instance()->BeginMonitor(this);
  353. //}
  354. }
  355. }
  356. void CBCTExamHandler::UpdateCBCTTriggerGate(CBCT_LOGIC_GATE_CHANNEL channel)
  357. {
  358. m_cbctPerformGate |= channel;
  359. if(gbusinessLog) gbusinessLog->Info("[TomoExamHandler][UpdateTomoLogicGate]->[{$:X03} -> {$:X03}]", channel, m_cbctPerformGate);
  360. OnCBCTTriggerGateChanged(m_cbctPerformGate);
  361. }
  362. void CBCTExamHandler::OnCBCTTriggerGateChanged(int gateStatus)
  363. {
  364. if (gateStatus == CBCTLG_CHANNEL_PERFORM_READY)
  365. {
  366. DoPerformCBCT();
  367. m_cbctPerformGate = CBCTLG_CHANNEL_RESET;
  368. }
  369. }
  370. void CBCTExamHandler::DoPerformCBCT()
  371. {
  372. ChangeMotionModelStage(CBCT_STAGE_SET_CBCT_SLICE);
  373. ChangeMotionModelStage(CBCT_STAGE_MOVETO_END_POS);
  374. }
  375. RET_STATUS CBCTExamHandler::OnGetExposurePositions(ResDataObject &resultSwing, ResDataObject &resultCircular)
  376. {
  377. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnGetExposurePositions]->[Enter]");
  378. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  379. if (model)
  380. {
  381. ResDataObject res;
  382. res.add("key", "CircularResult");
  383. model->GetMotionParams(res);
  384. resultCircular = res;
  385. }
  386. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnGetExposurePositions]->[Exit]");
  387. return RET_STATUS::RET_SUCCEED;
  388. }
  389. RET_STATUS CBCTExamHandler::OnStartMove(DOF_MECH mech, int nOrientation)
  390. {
  391. auto model = m_modelManager->Resove(MOTION_MODLE_CARM_GENERAL);
  392. if (!model)
  393. {
  394. return RET_STATUS::RET_FAILED;
  395. }
  396. if (!IsMovingEnable())
  397. {
  398. if(gbusinessLog) gbusinessLog->Warn("[CBCTExamHandler][OnStartMove]->[CBCT is working, single motion is not allowed]");
  399. return RET_STATUS::RET_FAILED;
  400. }
  401. if (m_bMachineMoving)
  402. {
  403. if(gbusinessLog) gbusinessLog->Warn("[CBCTExamHandler][OnStartMove]->[Machine is movinig, single motion is not allowed]");
  404. return RET_STATUS::RET_FAILED;
  405. }
  406. auto modelArgs = (CArmGeneralMotionStageArgs *)model->GetStageArgs();
  407. if (mech == TOMO_TUBE_HEIGHT)
  408. {
  409. modelArgs->TubeCircularMoveDirection = nOrientation;
  410. modelArgs->TubeCircularMoveStep = -1;
  411. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnStartMove]->[Enter][TOMO_TUBE_HEIGHT][Org: {$:d}]", modelArgs->TubeCircularMoveDirection);
  412. model->ChangeStage(CARM_GENERAL_MOVE_TUBE_CIRCULAR);
  413. }
  414. else if (mech == TOMO_TUBE_ANGLE)
  415. {
  416. modelArgs->TubeSwingDirection = nOrientation;
  417. modelArgs->TubeSwingStep = -1;
  418. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnStartMove]->[Enter][TOMO_TUBE_ANGLE][Org: {$:d}]", modelArgs->TubeSwingDirection);
  419. model->ChangeStage(CARM_GENERAL_MOVE_TUBE_SWING);
  420. }
  421. m_bMachineMoving = TRUE;
  422. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnStartMove]->[Leave]");
  423. return RET_STATUS::RET_SUCCEED;
  424. }
  425. RET_STATUS CBCTExamHandler::OnStopMove(DOF_MECH mech)
  426. {
  427. if (!IsMovingEnable())
  428. {
  429. if(gbusinessLog) gbusinessLog->Warn("[CBCTExamHandler][OnStopMove]->[CBCT is working, single motion is not allowed]");
  430. return RET_STATUS::RET_FAILED;
  431. }
  432. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnStopMove]->[Enter]");
  433. auto model = m_modelManager->Resove(MOTION_MODLE_CARM_GENERAL);
  434. if (!model)
  435. {
  436. return RET_STATUS::RET_FAILED;
  437. }
  438. model->ChangeStage(CARM_GENERAL_STOP_MECH_MOVING);
  439. m_bMachineMoving = FALSE;
  440. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnStopMove]->[Leave]");
  441. return RET_STATUS::RET_SUCCEED;
  442. }
  443. bool CBCTExamHandler::IsMovingEnable()
  444. {
  445. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  446. if (model)
  447. {
  448. string stageName;
  449. model->ChangeStage(stageName);
  450. if (stageName == CBCT_STAGE_MOVETO_START_POS || stageName == CBCT_STAGE_MOVETO_END_POS)
  451. {
  452. return false;
  453. }
  454. }
  455. return true;
  456. }
  457. RET_STATUS CBCTExamHandler::OnScanningSwitch(DOF_MECH mech)
  458. {
  459. auto model = m_modelManager->Resove(MOTION_MODLE_CBCT);
  460. if (model)
  461. {
  462. if (mech == TOMO_TUBE_HEIGHT)
  463. {
  464. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnScanningSwitch]->[Using circular for scanning]");
  465. model->SwitchScanningComponents(0);
  466. }
  467. else if (mech == TOMO_TUBE_ANGLE)
  468. {
  469. if(gbusinessLog) gbusinessLog->Info("[CBCTExamHandler][OnScanningSwitch]->[Using swing for scanning]");
  470. model->SwitchScanningComponents(1);
  471. }
  472. }
  473. return RET_STATUS::RET_SUCCEED;
  474. }