CalibrationHandler.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. #include "stdafx.h"
  2. #include "CalibrationHandler.h"
  3. #include "IMotionModel.h"
  4. #include "IMotionModelManager.h"
  5. #include "CalibrationStageArgs.h"
  6. #include "MotionStages.h"
  7. #include "ConfigurerMotion.h"
  8. #include "ConfigurerCalibration.h"
  9. #include "MechnicalMonitor.h"
  10. #include "RADMotionStageArgs.h"
  11. using namespace DIOS::Dev::Detail::MachineryECOM;
  12. static bool LeastSquare(const vector<float>& x, const vector<float>& y, float &a, float &b)//最小二乘法公式
  13. {
  14. bool bRes = false;
  15. if (x.size() > 0 && x.size() == y.size())
  16. {
  17. float t1 = 0, t2 = 0, t3 = 0, t4 = 0;
  18. for (int i = 0; i < x.size(); ++i)
  19. {
  20. t1 += x[i] * x[i];
  21. t2 += x[i];
  22. t3 += x[i] * y[i];
  23. t4 += y[i];
  24. }
  25. a = (t3 * x.size() - t2 * t4) / (t1 * x.size() - t2 * t2);
  26. b = (t1 * t4 - t2 * t3) / (t1 * x.size() - t2 * t2);
  27. bRes = true;
  28. }
  29. if(gbusinessLog) gbusinessLog->Info("[CalibrationHandler][LeastSquare]->[{$:f9} , {$:f9}]", a, b);
  30. return bRes;
  31. }
  32. CalibrationHandler::CalibrationHandler()
  33. :m_modelLoaded(FALSE),
  34. m_modelManager(nullptr)
  35. {
  36. }
  37. CalibrationHandler::~CalibrationHandler()
  38. {
  39. }
  40. void CalibrationHandler::OnModelLoaded(IMotionModelManager *modelManager)
  41. {
  42. m_modelManager = modelManager;
  43. }
  44. void CalibrationHandler::OnCoordinatesLoaded(IPositionManager *coordinates)
  45. {
  46. }
  47. RET_STATUS CalibrationHandler::OnSelectExamMode(const char *pExamKey)
  48. {
  49. if (!m_modelLoaded)
  50. {
  51. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  52. if (model)
  53. {
  54. ResDataObject mechparms;
  55. if (ConfigurerMotion::GetMachineryConfigs(mechparms))
  56. {
  57. model->LoadMachineryParams(mechparms);
  58. }
  59. }
  60. m_modelLoaded = TRUE;
  61. }
  62. return RET_STATUS::RET_SUCCEED;
  63. }
  64. RET_STATUS CalibrationHandler::OnSetTechParamsInfo(ResDataObject &pParam)
  65. {
  66. return RET_STATUS::RET_SUCCEED;
  67. }
  68. void CalibrationHandler::OnMotionEvent(const std::string &motionEventName)
  69. {
  70. auto model = m_modelManager->Resove(MOTION_MODEL_RESET);
  71. if (!model)
  72. {
  73. return;
  74. }
  75. auto stageArg = model->GetStageArgs();
  76. if (motionEventName == MONITOR_EVENT_TUBEANGLE_MOVE_STOP)
  77. {
  78. stageArg->SetTubeAngleMotionStatus(FALSE);
  79. MechnicalMonitor::Instance()->EndMonitor();
  80. ChangeAutoCalibrationADToNextStage(MO_TUBE_ANGLE);
  81. }
  82. else if (motionEventName == MONITOR_EVENT_TUBEHEIGHT_MOVE_STOP)
  83. {
  84. stageArg->SetTubeHeightMotionStatus(FALSE);
  85. MechnicalMonitor::Instance()->EndMonitor();
  86. ChangeAutoCalibrationADToNextStage(MO_TUBE_HEIGHT);
  87. }
  88. }
  89. RET_STATUS CalibrationHandler::OnStopMech()
  90. {
  91. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  92. if (model)
  93. {
  94. model->ChangeStage(CALIBRATION_STOP_TUBE_HEIGHT_AT_ZAXIS);
  95. model->ChangeStage(CALIBRATION_STOP_TUBE_ANGLE_AT_ZAXIS);
  96. }
  97. return RET_STATUS::RET_SUCCEED;
  98. }
  99. RET_STATUS CalibrationHandler::OnMoveTubeHeight(ResDataObject &ParamIn)
  100. {
  101. int direction = 1;
  102. int steps = 0;
  103. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  104. if (!model)
  105. {
  106. return RET_STATUS::RET_FAILED;
  107. }
  108. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  109. if (ParamIn.GetFirstOf("Orientation") >= 0
  110. && ParamIn.GetFirstOf("StepNumber") >= 0)
  111. {
  112. auto positive = ConfigurerMotion::GetTubeHeightAxisPositiveDirection() > 0 ? 1 : -1;
  113. auto ori = atoi(ParamIn["Orientation"]) > 0 ? positive : (-1 * positive);
  114. modelArgs->TubeHeightMoveDirection = ori;
  115. if (ParamIn.GetFirstOf("AsPhysical") >= 0)
  116. {
  117. modelArgs->TubeHeightMovePhysical = (float)atof(ParamIn["StepNumber"]);
  118. model->ChangeStage(CALIBRATION_MOVE_TUBE_HEIGHT_AS_PHYSICAL);
  119. }
  120. else
  121. {
  122. modelArgs->TubeHeightMoveStep = atoi(ParamIn["StepNumber"]);
  123. model->ChangeStage(CALIBRATION_MOVE_TUBE_HEIGHT);
  124. }
  125. }
  126. return RET_STATUS::RET_SUCCEED;
  127. }
  128. RET_STATUS CalibrationHandler::OnRotateTubeAngle(ResDataObject &ParamIn)
  129. {
  130. int direction = 1;
  131. int steps = 0;
  132. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  133. if (!model)
  134. {
  135. return RET_STATUS::RET_FAILED;
  136. }
  137. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  138. if (ParamIn.GetFirstOf("Orientation") >= 0
  139. && ParamIn.GetFirstOf("StepNumber") >= 0)
  140. {
  141. auto positive = ConfigurerMotion::GetTubeRotateAxisPositiveDirection() > 0 ? 1 : -1;
  142. auto ori = atoi(ParamIn["Orientation"]) > 0 ? positive : (-1 * positive);
  143. modelArgs->TubeAngleRotateDirection = ori;
  144. if (ParamIn.GetFirstOf("AsPhysical") >= 0)
  145. {
  146. modelArgs->TubeAngleRotatePhysical = (float)atof(ParamIn["StepNumber"]);
  147. model->ChangeStage(CALIBRATION_ROTATE_TUBE_ANGLE_AS_PHYSICAL);
  148. }
  149. else
  150. {
  151. modelArgs->TubeAngleRotateStep = atoi(ParamIn["StepNumber"]);
  152. model->ChangeStage(CALIBRATION_ROTATE_TUBE_ANGLE);
  153. }
  154. }
  155. return RET_STATUS::RET_SUCCEED;
  156. }
  157. RET_STATUS CalibrationHandler::OnGetTubeHeightAD(ResDataObject &ParamOut)
  158. {
  159. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  160. if (!model)
  161. {
  162. return RET_STATUS::RET_FAILED;
  163. }
  164. model->ChangeStage(CALIBRATION_GET_TUBE_HEIGHT_AD);
  165. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  166. ParamOut.add("ADTubeHeight", modelArgs->TubeHeightAD);
  167. return RET_STATUS::RET_SUCCEED;
  168. }
  169. RET_STATUS CalibrationHandler::OnGetTubeAngleAD(ResDataObject &ParamOut)
  170. {
  171. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  172. if (!model)
  173. {
  174. return RET_STATUS::RET_FAILED;
  175. }
  176. model->ChangeStage(CALIBRATION_GET_TUBE_ANGLE_AD);
  177. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  178. ParamOut.add("ADTubeAngle", modelArgs->TubeAngleAD);
  179. return RET_STATUS::RET_SUCCEED;
  180. }
  181. RET_STATUS CalibrationHandler::OnGetDetectorHeightAD(ResDataObject &ParamOut)
  182. {
  183. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  184. if (!model)
  185. {
  186. return RET_STATUS::RET_FAILED;
  187. }
  188. model->ChangeStage(CALIBRATION_GET_DETECTOR_HEIGHT_AD);
  189. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  190. ParamOut.add("ADDetectorHeight", modelArgs->DetectorHeightAD);
  191. return RET_STATUS::RET_SUCCEED;
  192. }
  193. RET_STATUS CalibrationHandler::OnGetTubeHeightEncoder(ResDataObject &ParamOut)
  194. {
  195. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  196. if (!model)
  197. {
  198. return RET_STATUS::RET_FAILED;
  199. }
  200. model->ChangeStage(CALIBRATION_GET_TUBE_HEIGHT_ENCODER);
  201. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  202. ParamOut.add("EncoderTubeHeight", modelArgs->TubeHeightEncoder);
  203. return RET_STATUS::RET_SUCCEED;
  204. }
  205. RET_STATUS CalibrationHandler::OnGetTubeAngleEncoder(ResDataObject &ParamOut)
  206. {
  207. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  208. if (!model)
  209. {
  210. return RET_STATUS::RET_FAILED;
  211. }
  212. model->ChangeStage(CALIBRATION_GET_TUBE_ANGLE_ENCODER);
  213. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  214. ParamOut.add("EncoderTubeAngle", modelArgs->TubeAngleEncoder);
  215. return RET_STATUS::RET_SUCCEED;
  216. }
  217. RET_STATUS CalibrationHandler::OnGetDetectorHeightEncoder(ResDataObject &ParamOut)
  218. {
  219. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  220. if (!model)
  221. {
  222. return RET_STATUS::RET_FAILED;
  223. }
  224. model->ChangeStage(CALIBRATION_GET_DETECTOR_HEIGHT_ENCODER);
  225. auto modelArgs = (CalibrationStageArgs *)model->GetStageArgs();
  226. ParamOut.add("EncoderDetectorHeight", modelArgs->DetectorHeightEncoder);
  227. return RET_STATUS::RET_SUCCEED;
  228. }
  229. RET_STATUS CalibrationHandler::OnActiveTubeAngleZAxisClear()
  230. {
  231. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  232. if (!model)
  233. {
  234. return RET_STATUS::RET_FAILED;
  235. }
  236. model->ChangeStage(CALIBRATION_ACTIVE_TUBE_ANGLE_ZAXIS_CLEAR);
  237. return RET_STATUS::RET_SUCCEED;
  238. }
  239. RET_STATUS CalibrationHandler::OnCancleTubeAngleZAxisClear()
  240. {
  241. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  242. if (!model)
  243. {
  244. return RET_STATUS::RET_FAILED;
  245. }
  246. model->ChangeStage(CALIBRATION_CANCEL_TUBE_ANGLE_ZAXIS_CLEAR);
  247. return RET_STATUS::RET_SUCCEED;
  248. }
  249. RET_STATUS CalibrationHandler::OnActiveTubeHeightZAxisClear()
  250. {
  251. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  252. if (!model)
  253. {
  254. return RET_STATUS::RET_FAILED;
  255. }
  256. model->ChangeStage(CALIBRATION_ACTIVE_TUBE_HEIGHT_ZAXIS_CLEAR);
  257. return RET_STATUS::RET_SUCCEED;
  258. }
  259. RET_STATUS CalibrationHandler::OnCancelTubeHeightZAxisClear()
  260. {
  261. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  262. if (!model)
  263. {
  264. return RET_STATUS::RET_FAILED;
  265. }
  266. model->ChangeStage(CALIBRATION_CANCEL_TUBE_HEIGHT_ZAXIS_CLEAR);
  267. return RET_STATUS::RET_SUCCEED;
  268. }
  269. RET_STATUS CalibrationHandler::OnTubeAngleRotateToZAxis()
  270. {
  271. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  272. if (!model)
  273. {
  274. return RET_STATUS::RET_FAILED;
  275. }
  276. model->ChangeStage(CALIBRATION_ROTATE_TUBE_ANGLE_TO_ZAXIS);
  277. return RET_STATUS::RET_SUCCEED;
  278. }
  279. RET_STATUS CalibrationHandler::OnTubeHeightMoveToZAxis()
  280. {
  281. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  282. if (!model)
  283. {
  284. return RET_STATUS::RET_FAILED;
  285. }
  286. model->ChangeStage(CALIBRATION_MVOE_TUBE_HEIGHT_TO_ZAXIS);
  287. return RET_STATUS::RET_SUCCEED;
  288. }
  289. void CalibrationHandler::OnTubeAngleEncoderZPos()
  290. {
  291. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  292. if (model)
  293. {
  294. model->ChangeStage(CALIBRATION_STOP_TUBE_ANGLE_AT_ZAXIS);
  295. }
  296. }
  297. void CalibrationHandler::OnTubeHeightEncoderZPos()
  298. {
  299. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  300. if (model)
  301. {
  302. model->ChangeStage(CALIBRATION_STOP_TUBE_HEIGHT_AT_ZAXIS);
  303. }
  304. }
  305. RET_STATUS CalibrationHandler::OnSwitchSvoStatus(ResDataObject &ParamIn)
  306. {
  307. if (ParamIn.GetFirstOf("DOF") < 0 || ParamIn.GetFirstOf("SvoStatus") < 0)
  308. {
  309. return RET_STATUS::RET_FAILED;
  310. }
  311. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  312. auto stageArgs = (CalibrationStageArgs*)model->GetStageArgs();
  313. stageArgs->SvoStatus = atoi((const char*)ParamIn["SvoStatus"]);
  314. stageArgs->AutoCalADDof = atoi((const char *)ParamIn["DOF"]);
  315. model->ChangeStage(CALIBRATION_SWITCH_SVO_STATUS);
  316. return RET_STATUS::RET_SUCCEED;
  317. }
  318. RET_STATUS CalibrationHandler::OnAutoCalibrationAD(ResDataObject &ParamIn)
  319. {
  320. if (ParamIn.GetFirstOf("DOF") < 0
  321. || ParamIn.GetFirstOf("CurrentHeight") < 0
  322. || ParamIn.GetFirstOf("HighLimit") < 0
  323. || ParamIn.GetFirstOf("LowLimit") < 0)
  324. {
  325. return RET_STATUS::RET_FAILED;
  326. }
  327. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  328. auto stageArgs = (CalibrationStageArgs*)model->GetStageArgs();
  329. stageArgs->AutoCalADDof = atoi(ParamIn["DOF"]);
  330. stageArgs->AutoCalADCurrentPhysical = (float)atof(ParamIn["CurrentHeight"]);
  331. stageArgs->AutoCalADHighLimit = (float)atof(ParamIn["HighLimit"]);
  332. stageArgs->AutoCalADLowLimit = (float)atof(ParamIn["LowLimit"]);
  333. stageArgs->AutoCalADCurrentStep = 0;
  334. stageArgs->AutoCalADTotalStep = 12;
  335. if(gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnAutoCalibrationAD]->[{$:f6} {$:f6} {$:f6}]",
  336. stageArgs->AutoCalADCurrentPhysical,
  337. stageArgs->AutoCalADHighLimit,
  338. stageArgs->AutoCalADLowLimit);
  339. if (stageArgs->AutoCalADCurrentPhysical < 1e-2
  340. || stageArgs->AutoCalADHighLimit < 1e-2
  341. || stageArgs->AutoCalADLowLimit < 1e-2
  342. || (stageArgs->AutoCalADHighLimit < stageArgs->AutoCalADLowLimit))
  343. {
  344. return RET_STATUS::RET_FAILED;
  345. }
  346. model->ChangeStage(CALIBRATION_AUTO_CALIBRATION_AD_START);
  347. if (stageArgs->AutoCalADDof == 0)
  348. {
  349. MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_ANGLE);
  350. }
  351. else if (stageArgs->AutoCalADDof == 1)
  352. {
  353. MechnicalMonitor::Instance()->BeginMonitor(this, MO_TUBE_HEIGHT);
  354. }
  355. return RET_STATUS::RET_SUCCEED;
  356. }
  357. void CalibrationHandler::ChangeAutoCalibrationADToNextStage(int offset)
  358. {
  359. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  360. auto stageArgs = (CalibrationStageArgs*)model->GetStageArgs();
  361. if (stageArgs->AutoCalADTotalStep == stageArgs->AutoCalADCurrentStep)
  362. {
  363. //自动AD校正完成
  364. model->ChangeStage(CALIBRATION_AUTO_CALIBRATION_AD_END);
  365. if (stageArgs->AutoCalADDof == 0)
  366. {
  367. float slope = 0.0f;
  368. float intercept = 0.0f;
  369. if (LeastSquare(stageArgs->AutoCalADADs, stageArgs->AutoCalADPhysicals, slope, intercept))
  370. {
  371. ConfigurerCalibration::UpdateTubeAngleADToAngleCurve(slope, intercept);
  372. }
  373. }
  374. else if (stageArgs->AutoCalADDof == 1)
  375. {
  376. float slope = 0.0f;
  377. float intercept = 0.0f;
  378. if (LeastSquare(stageArgs->AutoCalADADs, stageArgs->AutoCalADPhysicals, slope, intercept))
  379. {
  380. ConfigurerCalibration::UpdateTubeHeightADToHeightCurve(slope, intercept);
  381. }
  382. }
  383. }
  384. else
  385. {
  386. model->ChangeStage(CALIBRATION_AUTO_CALIBRATION_AD_NEXT);
  387. stageArgs->AutoCalADCurrentStep++;
  388. MechnicalMonitor::Instance()->BeginMonitor(this, offset);
  389. }
  390. }
  391. RET_STATUS CalibrationHandler::OnSaveTubeHeightADCalibrationResult(ResDataObject &ParamIn, ResDataObject &pParamOut)
  392. {
  393. if(gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnSaveTubeHeightADCalibrationResult]->[{$}]", ParamIn.encode());
  394. std::vector<float> physicals;
  395. std::vector<float> ads;
  396. if (ParsePhysicsAndADMapParams(ParamIn, physicals, ads))
  397. {
  398. float slope = 0.0f;
  399. float intercept = 0.0f;
  400. if (LeastSquare(ads, physicals, slope, intercept))
  401. {
  402. ConfigurerCalibration::UpdateTubeHeightADToHeightCurve(slope, intercept);
  403. }
  404. }
  405. return RET_STATUS::RET_SUCCEED;
  406. }
  407. RET_STATUS CalibrationHandler::OnSaveTubeAngleADCalibrationResult(ResDataObject &ParamIn, ResDataObject &pParamOut)
  408. {
  409. if(gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnSaveTubeAngleADCalibrationResult]->[{$}]", ParamIn.encode());
  410. std::vector<float> physicals;
  411. std::vector<float> ads;
  412. if (ParsePhysicsAndADMapParams(ParamIn, physicals, ads))
  413. {
  414. float slope = 0.0f;
  415. float intercept = 0.0f;
  416. if (LeastSquare(ads, physicals, slope, intercept))
  417. {
  418. ConfigurerCalibration::UpdateTubeAngleADToAngleCurve(slope, intercept);
  419. }
  420. }
  421. return RET_STATUS::RET_SUCCEED;
  422. }
  423. RET_STATUS CalibrationHandler::OnSaveDetectorADCalibrationResult(ResDataObject &ParamIn, ResDataObject &pParamOut)
  424. {
  425. if(gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnSaveDetectorADCalibrationResult]->[{$}]", ParamIn.encode());
  426. std::vector<float> physicals;
  427. std::vector<float> ads;
  428. if (ParsePhysicsAndADMapParams(ParamIn, physicals, ads))
  429. {
  430. float slope = 0.0f;
  431. float intercept = 0.0f;
  432. if (LeastSquare(ads, physicals, slope, intercept))
  433. {
  434. ConfigurerCalibration::UpdateDetectorHeightADToHeightCurve(slope, intercept);
  435. }
  436. }
  437. return RET_STATUS::RET_SUCCEED;
  438. }
  439. bool CalibrationHandler::ParsePhysicsAndADMapParams(ResDataObject &ParamIn, std::vector<float> &physical, std::vector<float> &ads)
  440. {
  441. string strKeyCount = "PointCount";
  442. int nPointCount = 0;
  443. if (ParamIn.GetFirstOf(strKeyCount.c_str()) >= 0)
  444. {
  445. nPointCount = atoi((const char *)ParamIn[strKeyCount.c_str()]);
  446. }
  447. else
  448. {
  449. return false;
  450. }
  451. for (int n = 0; n < nPointCount; n++)
  452. {
  453. char tmp1[64] = { 0 };
  454. char tmp2[64] = { 0 };
  455. sprintf_s(tmp1, "Physical%d", n);
  456. sprintf_s(tmp2, "AD%d", n);
  457. if (ParamIn.GetFirstOf(tmp1) >= 0 && ParamIn.GetFirstOf(tmp2) >= 0)
  458. {
  459. physical.push_back((float)atof((const char *)ParamIn[tmp1]));
  460. ads.push_back(atoi((const char *)ParamIn[tmp2]) * 1.0f);
  461. }
  462. }
  463. return true;
  464. }
  465. BOOL CalibrationHandler::IsMovingEnable()
  466. {
  467. BOOL bRes = TRUE;
  468. if (m_bMachineMoving)
  469. {
  470. if (gbusinessLog) gbusinessLog->Warn("[CalibrationHandler][IsMovingEnable]->[Machine is moving, single motion is not allowed]");
  471. bRes = FALSE;
  472. }
  473. return bRes;
  474. }
  475. RET_STATUS CalibrationHandler::OnStartMove(DOF_MECH mech, int nOrientation)
  476. {
  477. auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
  478. if (!model)
  479. {
  480. return RET_STATUS::RET_FAILED;
  481. }
  482. if (!IsMovingEnable())
  483. {
  484. return RET_STATUS::RET_FAILED;
  485. }
  486. auto modelArgs = (RADMotionStageArgs*)model->GetStageArgs();
  487. if (mech == TOMO_TUBE_HEIGHT)
  488. {
  489. modelArgs->TubeHeightDirection = nOrientation;
  490. modelArgs->TubeHeightStep = -1;
  491. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnStartMove]->[Enter][TOMO_TUBE_HEIGHT][Org: {$:d}]", modelArgs->TubeHeightDirection);
  492. model->ChangeStage(RAD_STAGE_MOVE_TUBE_HEIGHT);
  493. }
  494. else if (mech == TOMO_TUBE_HORIZONTAL)
  495. {
  496. modelArgs->TubeHorizontalMoveDirection = nOrientation;
  497. modelArgs->TubeHorizontalMoveStep = -1;
  498. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnStartMove]->[Enter][TOMO_TUBE_HORIZONTAL][Org: {$:d}]", modelArgs->TubeHeightDirection);
  499. model->ChangeStage(RAD_STAGE_MOVE_TUBE_HORIZONTAL);
  500. }
  501. else if (mech == TOMO_TUBE_ANGLE)
  502. {
  503. modelArgs->TubeAngleDirection = nOrientation;
  504. modelArgs->TubeAngleStep = -1;
  505. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnStartMove]->[Enter][TOMO_TUBE_ANGLE][Org: {$:d}]", modelArgs->TubeAngleDirection);
  506. model->ChangeStage(RAD_STAGE_MOVE_TUBE_ROTATION);
  507. }
  508. m_bMachineMoving = TRUE;
  509. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnStartMove]->[Leave]");
  510. return RET_STATUS::RET_SUCCEED;
  511. }
  512. RET_STATUS CalibrationHandler::OnStopMove(DOF_MECH mech)
  513. {
  514. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnStopMove]->[Enter]");
  515. auto model = m_modelManager->Resove(MOTION_MODEL_RAD);
  516. if (!model)
  517. {
  518. return RET_STATUS::RET_FAILED;
  519. }
  520. model->ChangeStage(RAD_STAGE_STOP_MOVE);
  521. m_bMachineMoving = FALSE;
  522. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnStopMove]->[Leave]");
  523. return RET_STATUS::RET_SUCCEED;
  524. }
  525. RET_STATUS CalibrationHandler::OnMoveTubeHorizontal(ResDataObject& ParamIn)
  526. {
  527. int direction = 1;
  528. int steps = 0;
  529. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  530. if (!model)
  531. {
  532. return RET_STATUS::RET_FAILED;
  533. }
  534. auto modelArgs = (CalibrationStageArgs*)model->GetStageArgs();
  535. if (ParamIn.GetFirstOf("Orientation") >= 0
  536. && ParamIn.GetFirstOf("StepNumber") >= 0)
  537. {
  538. auto positive = ConfigurerMotion::GetTubeHorizontalAxisPositiveDirection() > 0 ? 1 : -1;
  539. auto ori = atoi(ParamIn["Orientation"]) > 0 ? positive : (-1 * positive);
  540. modelArgs->TubeHorizontalMoveDirection = ori;
  541. if (ParamIn.GetFirstOf("AsPhysical") >= 0)
  542. {
  543. modelArgs->TubeHorizontalMovePhysical = (float)atof(ParamIn["StepNumber"]);
  544. model->ChangeStage(CALIBRATION_MOVE_TUBE_HORIZONTAL_AS_PHYSICAL);
  545. }
  546. else
  547. {
  548. modelArgs->TubeHorizontalMoveStep = atoi(ParamIn["StepNumber"]);
  549. model->ChangeStage(CALIBRATION_MOVE_TUBE_HORIZONTAL);
  550. }
  551. }
  552. return RET_STATUS::RET_SUCCEED;
  553. }
  554. RET_STATUS CalibrationHandler::OnGetTubeHorizontalAD(ResDataObject& ParamOut)
  555. {
  556. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  557. if (!model)
  558. {
  559. return RET_STATUS::RET_FAILED;
  560. }
  561. model->ChangeStage(CALIBRATION_GET_TUBE_HORIZONTAL_AD);
  562. auto modelArgs = (CalibrationStageArgs*)model->GetStageArgs();
  563. ParamOut.add("ADTubeHeight", modelArgs->TubeHorizontalAD);
  564. return RET_STATUS::RET_SUCCEED;
  565. }
  566. RET_STATUS CalibrationHandler::OnGetTubeHorizontalEncoder(ResDataObject& ParamOut)
  567. {
  568. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  569. if (!model)
  570. {
  571. return RET_STATUS::RET_FAILED;
  572. }
  573. model->ChangeStage(CALIBRATION_GET_TUBE_HORIZONTAL_ENCODER);
  574. auto modelArgs = (CalibrationStageArgs*)model->GetStageArgs();
  575. ParamOut.add("EncoderTubeHeight", modelArgs->TubeHorizontalEncoder);
  576. return RET_STATUS::RET_SUCCEED;
  577. }
  578. RET_STATUS CalibrationHandler::OnGetDetectorHorizontalAD(ResDataObject& ParamOut)
  579. {
  580. auto model = m_modelManager->Resove(MOTION_MODEL_CALIBRATION);
  581. if (!model)
  582. {
  583. return RET_STATUS::RET_FAILED;
  584. }
  585. model->ChangeStage(CALIBRATION_GET_DETECTOR_HORIZONTAL_AD);
  586. auto modelArgs = (CalibrationStageArgs*)model->GetStageArgs();
  587. ParamOut.add("ADDetectorHeight", modelArgs->DetectorHorizontalAD);
  588. return RET_STATUS::RET_SUCCEED;
  589. }
  590. RET_STATUS CalibrationHandler::OnSaveTubeHorizontalADCalibrationResult(ResDataObject& ParamIn, ResDataObject& pParamOut)
  591. {
  592. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnSaveTubeHorizontalADCalibrationResult]->[{$}]", ParamIn.encode());
  593. std::vector<float> physicals;
  594. std::vector<float> ads;
  595. if (ParsePhysicsAndADMapParams(ParamIn, physicals, ads))
  596. {
  597. float slope = 0.0f;
  598. float intercept = 0.0f;
  599. if (LeastSquare(ads, physicals, slope, intercept))
  600. {
  601. ConfigurerCalibration::UpdateTubeHorizontalADToPositionCurve(slope, intercept);
  602. }
  603. }
  604. return RET_STATUS::RET_SUCCEED;
  605. }
  606. RET_STATUS CalibrationHandler::OnSaveDetectorHorizontalADCalibrationResult(ResDataObject& ParamIn, ResDataObject& pParamOut)
  607. {
  608. if (gbusinessLog) gbusinessLog->Info("[CalibrationHandler][OnSaveDetectorHorizontalADCalibrationResult]->[{$}]", ParamIn.encode());
  609. std::vector<float> physicals;
  610. std::vector<float> ads;
  611. if (ParsePhysicsAndADMapParams(ParamIn, physicals, ads))
  612. {
  613. float slope = 0.0f;
  614. float intercept = 0.0f;
  615. if (LeastSquare(ads, physicals, slope, intercept))
  616. {
  617. ConfigurerCalibration::UpdateDetectorHorizontalADToPositionCurve(slope, intercept);
  618. }
  619. }
  620. return RET_STATUS::RET_SUCCEED;
  621. }
  622. RET_STATUS CalibrationHandler::OnSaveResetLowPosition(ResDataObject& ParamIn, ResDataObject& pParamOut)
  623. {
  624. string motionUnit;
  625. string lowpos;
  626. if (ParamIn.GetFirstOf("MotionUnit") >= 0)
  627. {
  628. motionUnit = (const char*)(ParamIn["MotionUnit"]);
  629. }
  630. if (ParamIn.GetFirstOf("LowPosition") >= 0)
  631. {
  632. lowpos = (const char*)(ParamIn["LowPosition"]);
  633. }
  634. if (motionUnit == "TubeAngle")
  635. {
  636. if (ParamIn.GetFirstOf("LowPosition") >= 0)
  637. {
  638. ConfigurerMotion::UpdateResetLowPositionTubleAngle(lowpos);
  639. }
  640. }
  641. else if (motionUnit == "TubeVertical")
  642. {
  643. if (ParamIn.GetFirstOf("LowPosition") >= 0)
  644. {
  645. ConfigurerMotion::UpdateResetLowPositionTubleHeight(lowpos);
  646. }
  647. }
  648. else if (motionUnit == "TubeHorizontal")
  649. {
  650. if (ParamIn.GetFirstOf("LowPosition") >= 0)
  651. {
  652. ConfigurerMotion::UpdateResetLowPositionTubleHorizontal(lowpos);
  653. }
  654. }
  655. return RET_STATUS::RET_SUCCEED;
  656. }
  657. RET_STATUS CalibrationHandler::OnSaveResetEncorderZeroPosition(ResDataObject& ParamIn, ResDataObject& pParamOut)
  658. {
  659. string motionUnit;
  660. string encoderzeropos;
  661. if (ParamIn.GetFirstOf("MotionUnit") >= 0)
  662. {
  663. motionUnit = (const char*)ParamIn["MotionUnit"];
  664. }
  665. else
  666. {
  667. return RET_STATUS::RET_FAILED;
  668. }
  669. if (ParamIn.GetFirstOf("EncoderZeroPosition") >= 0)
  670. {
  671. encoderzeropos = (const char*)(ParamIn["EncoderZeroPosition"]);
  672. }
  673. if (motionUnit == "TubeAngle")
  674. {
  675. if (ParamIn.GetFirstOf("EncoderZeroPosition") >= 0)
  676. {
  677. ConfigurerMotion::UpdateResetEncoderZeroPositionTubeAngle(encoderzeropos);
  678. }
  679. }
  680. else if (motionUnit == "TubeVertical")
  681. {
  682. if (ParamIn.GetFirstOf("EncoderZeroPosition") >= 0)
  683. {
  684. ConfigurerMotion::UpdateResetEncoderZeroPositionTubeHeight(encoderzeropos);
  685. }
  686. }
  687. else if (motionUnit == "TubeHorizontal")
  688. {
  689. if (ParamIn.GetFirstOf("EncoderZeroPosition") >= 0)
  690. {
  691. ConfigurerMotion::UpdateResetEncoderZeroPositionTubeHorizontal(encoderzeropos);
  692. }
  693. }
  694. return RET_STATUS::RET_SUCCEED;
  695. }
  696. RET_STATUS CalibrationHandler::OnGetResetPosition(ResDataObject& ParamIn, ResDataObject& pParamOut)
  697. {
  698. ResDataObject SubParamOutTubeHeight;
  699. SubParamOutTubeHeight.add("LowPosition", ConfigurerMotion::GetTubeHeightLowLandmarkPos());
  700. SubParamOutTubeHeight.add("EncoderZeroPosition", ConfigurerMotion::GetAbsoluteValueAtTubeHeightOrigin());
  701. pParamOut.add("TubeHeight", SubParamOutTubeHeight);
  702. ResDataObject SubParamOutTubeHorizontal;
  703. SubParamOutTubeHorizontal.add("LowPosition", ConfigurerMotion::GetTubeHorizontalLowLandmarkPos());
  704. SubParamOutTubeHorizontal.add("EncoderZeroPosition", ConfigurerMotion::GetAbsoluteValueAtTubeHorizontalOrigin());
  705. pParamOut.add("TubeHorizontal", SubParamOutTubeHorizontal);
  706. return RET_STATUS::RET_SUCCEED;
  707. }