CArmMachineryManager.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #include "stdafx.h"
  2. #include "CArmMachineryManager.h"
  3. #include "CArmComponentNameDef.h"
  4. #include "IMechnicalComponentFactory.h"
  5. #include "ServoDriveManager.h"
  6. #include "ICircularController.h"
  7. #include "ISwingController.h"
  8. #include "IExposureController.h"
  9. #include "ICollimatorController.h"
  10. #include "ISensorEncoderController.h"
  11. #include "..\\ServoDriveNameDef.h"
  12. #include "ConfigurerMotion.h"
  13. #include "ICommunicateEntity.h"
  14. #include "ILandmarkController.h"
  15. #include "FluoroSwitchController.h"
  16. using namespace DIOS::Dev::Detail::MachineryECOM;
  17. CArmMachineryManager *CArmMachineryManager::m_instance = nullptr;
  18. CArmMachineryManager::CArmMachineryManager()
  19. :m_communicate(nullptr),
  20. m_mechnicalFactory(nullptr),
  21. m_cirular(nullptr),
  22. m_swing(nullptr),
  23. m_exposure(nullptr),
  24. m_collimator(nullptr),
  25. m_encoderCircular(nullptr),
  26. m_encoderSwing(nullptr),
  27. m_landmark(nullptr),
  28. m_fluoroSwitch(nullptr)
  29. {
  30. }
  31. CArmMachineryManager::~CArmMachineryManager()
  32. {
  33. }
  34. CArmMachineryManager *CArmMachineryManager::Instance()
  35. {
  36. if (m_instance == nullptr)
  37. {
  38. m_instance = new CArmMachineryManager();
  39. }
  40. return m_instance;
  41. }
  42. void CArmMachineryManager::Initialize(IMechnicalComponentFactory *factory)
  43. {
  44. m_mechnicalFactory = factory;
  45. CreateComponents();
  46. DistributeServoDrive();
  47. m_swing->AttachCommunicateID(IOInterfaceMapper::ID_TUBE_ANGLE_PULSE);
  48. m_cirular->AttachCommunicateID(IOInterfaceMapper::ID_TUBE_HEIGHT_PULSE);
  49. m_encoderSwing->AttachCommunicateID(IOInterfaceMapper::ID_TUBE_ANGLE_ENCODER);
  50. m_encoderCircular->AttachCommunicateID(IOInterfaceMapper::ID_TUBE_HEIGHT_ENCODER);
  51. m_exposure->AttachCommunicateID(IOInterfaceMapper::ID_EXPOSURE_TRIGGER);
  52. m_collimator->AttachCommunicateID(IOInterfaceMapper::ID_CAN);
  53. m_fluoroSwitch->AttachCommunicateID(IOInterfaceMapper::ID_FLUORO_SWITCH_OUT);
  54. m_encoderSwing->LoadAxisInterfaceID(
  55. IOInterfaceMapper::ID_TUBE_ANGLE_ENCODER_AXIS_A,
  56. IOInterfaceMapper::ID_TUBE_ANGLE_ENCODER_AXIS_B,
  57. IOInterfaceMapper::ID_TUBE_ANGLE_ENCODER_AXIS_Z);
  58. m_encoderCircular->LoadAxisInterfaceID(
  59. IOInterfaceMapper::ID_TUBE_HEIGHT_ENCODER_AXIS_A,
  60. IOInterfaceMapper::ID_TUBE_HEIGHT_ENCODER_AXIS_B,
  61. IOInterfaceMapper::ID_TUBE_HEIGHT_ENCODER_AXIS_Z
  62. );
  63. LoadSwingCommunicateInterfaceIDs();
  64. LoadCircularCommunicateInterfaceIDs();
  65. LoadSwingEncoderCommunicateInterfaceIDs();
  66. LoadCircularEncoderCommunicateInterfaceIDs();
  67. LoadExposureCommunicateInterfaceIDs();
  68. LoadLandmarkCommunicateInterfaceIDs();
  69. LoadOutputSignalInterfaceIDs();
  70. }
  71. void CArmMachineryManager::OnCommunicationEstablished(ICommunicateEntity *communicate)
  72. {
  73. m_communicate = communicate;
  74. if(gcommLog) gcommLog->Info("[CArmMachineryManager][OnCommunicationEstablished]");
  75. SetFilterTimeOnComponents();
  76. SetupAutouploadOnComponents();
  77. SetupPFSTrigger();
  78. m_cirular->OnCommunicationEstablished(m_communicate);
  79. m_swing->OnCommunicationEstablished(m_communicate);
  80. m_encoderCircular->OnCommunicationEstablished(m_communicate);
  81. m_encoderCircular->BindABAxis();
  82. m_encoderSwing->OnCommunicationEstablished(m_communicate);
  83. m_encoderSwing->BindABAxis();
  84. m_exposure->OnCommunicationEstablished(m_communicate);
  85. m_collimator->OnCommunicationEstablished(m_communicate);
  86. m_landmark->OnCommunicationEstablished(m_communicate);
  87. m_fluoroSwitch->OnCommunicationEstablished(m_communicate);
  88. auto pulseonecircletubeAngle = ConfigurerMotion::GetPulseInOneCircleOfTubeAngleMotor();
  89. m_swing->SetPulseOneCircle((unsigned short)pulseonecircletubeAngle);
  90. auto pulseonecircletubeHeight = ConfigurerMotion::GetPulseInOneCircleOfTubeHeightMotor();
  91. m_cirular->SetPulseOneCircle((unsigned short)pulseonecircletubeHeight);
  92. auto dutyCycleoftubeangle = ConfigurerMotion::GetPulseDutyCycleOfTubeAngleMoror();
  93. m_swing->SetPulseDutyCycle(dutyCycleoftubeangle);
  94. auto dutyCycleoftubeHeight = ConfigurerMotion::GetPulseDutyCycleOfTubeHeightMotor();
  95. m_cirular->SetPulseDutyCycle(dutyCycleoftubeHeight);
  96. }
  97. void *CArmMachineryManager::Resove(const std::string &name)
  98. {
  99. if (name == CONTROLLER_CARM_TUBE_CIRCULAR)
  100. {
  101. return m_cirular;
  102. }
  103. else if (name == CONTROLLER_CARM_TUBE_SWING)
  104. {
  105. return m_swing;
  106. }
  107. else if (name == CONTROLLER_CARM_TUBE_CIRCULAR_ENCODER)
  108. {
  109. return m_encoderCircular;
  110. }
  111. else if (name == CONTROLLER_CARM_TUBE_SWING_ENCODER)
  112. {
  113. return m_encoderSwing;
  114. }
  115. else if (name == CONTROLLER_EXPOSURE)
  116. {
  117. return m_exposure;
  118. }
  119. else if (name == CONTROLLER_COLLIMATOR)
  120. {
  121. return m_collimator;
  122. }
  123. else if (name == CONTROLLER_LANDMARK)
  124. {
  125. return m_landmark;
  126. }
  127. else if (name == CONTROLLER_FLUOROSWITCH)
  128. {
  129. return m_fluoroSwitch;
  130. }
  131. else
  132. {
  133. return nullptr;
  134. }
  135. }
  136. void CArmMachineryManager::CreateComponents()
  137. {
  138. m_cirular = (ICircularController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_CARM_TUBECIRCULAR, CONTROLLER_CARM_TUBE_CIRCULAR);
  139. m_swing = (ISwingController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_CARM_TUBESWING, CONTROLLER_CARM_TUBE_SWING);
  140. m_encoderCircular = (ISensorEncoderController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_ENCODER, CONTROLLER_CARM_TUBE_CIRCULAR_ENCODER);
  141. m_encoderSwing = (ISensorEncoderController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_ENCODER, CONTROLLER_CARM_TUBE_SWING_ENCODER);
  142. m_exposure = (IExposureController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_EXPOSURE, CONTROLLER_EXPOSURE);
  143. m_collimator = (ICollimatorController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_COLLIMATOR, CONTROLLER_COLLIMATOR);
  144. m_landmark = (ILandmarkController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_LANDMARK, CONTROLLER_LANDMARK);
  145. m_fluoroSwitch = (IOutputController*)m_mechnicalFactory->CreateController(COMPONENT_CONTROLLER_FLUOROSWITCH, CONTROLLER_FLUOROSWITCH);
  146. }
  147. void CArmMachineryManager::DistributeServoDrive()
  148. {
  149. auto servoDriveTubeCircular = ServoDriveManager::Instance()->Resove(SERVO_DRIVE_TUBE_CIRCULAR);
  150. if (servoDriveTubeCircular != nullptr)
  151. {
  152. m_cirular->AttachServoDrive(servoDriveTubeCircular);
  153. }
  154. auto servodriveTubeSwing = ServoDriveManager::Instance()->Resove(SERVO_DRIVE_TUBE_SWING);
  155. if (servodriveTubeSwing != nullptr)
  156. {
  157. m_swing->AttachServoDrive(servodriveTubeSwing);
  158. }
  159. }
  160. void CArmMachineryManager::LoadSwingCommunicateInterfaceIDs()
  161. {
  162. std::map<string, int> interfaceIDs;
  163. interfaceIDs[ID_RS232] = IOInterfaceMapper::ID_RS232;
  164. interfaceIDs[ID_CAN] = IOInterfaceMapper::ID_CAN;
  165. interfaceIDs[ID_TUBE_ANGLE_DIRECTION] = IOInterfaceMapper::ID_TUBE_ANGLE_DIRECTION;
  166. interfaceIDs[ID_TUBE_ANGLE_PULSE] = IOInterfaceMapper::ID_TUBE_ANGLE_PULSE;
  167. interfaceIDs[ID_TUBE_ANGLE_SERVO_ON] = IOInterfaceMapper::ID_TUBE_ANGLE_SERVO_ON;
  168. m_swing->LoadCommunicationInterfaceIDs(interfaceIDs);
  169. }
  170. void CArmMachineryManager::LoadCircularCommunicateInterfaceIDs()
  171. {
  172. std::map<string, int> interfaceIDs;
  173. interfaceIDs[ID_RS232] = IOInterfaceMapper::ID_RS232;
  174. interfaceIDs[ID_CAN] = IOInterfaceMapper::ID_CAN;
  175. interfaceIDs[ID_TUBE_HEIGHT_DIRECTION] = IOInterfaceMapper::ID_TUBE_HEIGHT_DIRECTION;
  176. interfaceIDs[ID_TUBE_HEIGHT_PULSE] = IOInterfaceMapper::ID_TUBE_HEIGHT_PULSE;
  177. interfaceIDs[ID_TUBE_HEIGHT_SERVO_ON] = IOInterfaceMapper::ID_TUBE_HEIGHT_SERVO_ON;
  178. m_cirular->LoadCommunicationInterfaceIDs(interfaceIDs);
  179. }
  180. void CArmMachineryManager::LoadSwingEncoderCommunicateInterfaceIDs()
  181. {
  182. std::map<string, int> interfaceIDs;
  183. interfaceIDs[ID_TUBE_ANGLE_ENCODER] = IOInterfaceMapper::ID_TUBE_ANGLE_ENCODER;
  184. interfaceIDs[ID_CAN] = IOInterfaceMapper::ID_CAN;
  185. m_encoderSwing->LoadCommunicationInterfaceIDs(interfaceIDs);
  186. m_encoderSwing->DistributeCanSequence(IOInterfaceMapper::ID_CAN_STDID_TUBE_SWING_ENCODER);
  187. }
  188. void CArmMachineryManager::LoadCircularEncoderCommunicateInterfaceIDs()
  189. {
  190. std::map<string, int> interfaceIDs;
  191. interfaceIDs[ID_TUBE_HEIGHT_ENCODER] = IOInterfaceMapper::ID_TUBE_HEIGHT_ENCODER;
  192. interfaceIDs[ID_CAN] = IOInterfaceMapper::ID_CAN;
  193. m_encoderCircular->LoadCommunicationInterfaceIDs(interfaceIDs);
  194. m_encoderCircular->DistributeCanSequence(IOInterfaceMapper::ID_CAN_STDID_TUBE_CIRCULAR_ENCODER);
  195. }
  196. void CArmMachineryManager::LoadExposureCommunicateInterfaceIDs()
  197. {
  198. std::map<string, int> interfaceIDs;
  199. interfaceIDs[ID_XRAYON_NOTIFY] = IOInterfaceMapper::ID_XRAYON_NOTIFY;
  200. m_exposure->LoadCommunicationInterfaceIDs(interfaceIDs);
  201. }
  202. void CArmMachineryManager::LoadLandmarkCommunicateInterfaceIDs()
  203. {
  204. std::map<string, int> interfaceIDs;
  205. interfaceIDs[ID_TUBE_ANGLE_LOW_LIMIT] = IOInterfaceMapper::ID_TUBE_ANGLE_LOW_LIMIT;
  206. interfaceIDs[ID_TUBE_ANGLE_HIGH_LIMIT] = IOInterfaceMapper::ID_TUBE_ANGLE_HIGH_LIMIT;
  207. interfaceIDs[ID_TUBE_HEIGHT_LOW_LIMIT] = IOInterfaceMapper::ID_TUBE_HEIGHT_LOW_LIMIT;
  208. interfaceIDs[ID_TUBE_HEIGHT_HIGH_LIMIT] = IOInterfaceMapper::ID_TUBE_HEIGHT_HIGH_LIMIT;
  209. m_landmark->LoadCommunicationInterfaceIDs(interfaceIDs);
  210. }
  211. void CArmMachineryManager::LoadOutputSignalInterfaceIDs()
  212. {
  213. std::map<string, int> interfaceIDs;
  214. interfaceIDs[ID_FLUORO_SWITCH_OUT] = IOInterfaceMapper::ID_FLUORO_SWITCH_OUT;
  215. m_fluoroSwitch->LoadCommunicationInterfaceIDs(interfaceIDs);
  216. }
  217. void CArmMachineryManager::SetFilterTimeOnComponents()
  218. {
  219. auto hswfiltertime = ConfigurerMotion::GetFilterTimeHandSwitchDISignal();
  220. auto lswfiltertime = ConfigurerMotion::GetFilterTimeLimitSwitchDISignal();
  221. GPIO_DI_PARAM param;
  222. param.autoupload_switch = (unsigned char)GAUTO_DI_UPLOAD_ON;
  223. param.input_mode = (unsigned char)GIM_DIGITAL;
  224. param.filter_time = (unsigned char)hswfiltertime;
  225. if (IOInterfaceMapper::ID_SYSTEM_RESET > 0)
  226. {
  227. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_SYSTEM_RESET, DI_ATTR_SET_AUTO_UPLOAD, param);
  228. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_SYSTEM_RESET, DI_ATTR_SET_MODE, param);
  229. }
  230. if (IOInterfaceMapper::ID_SYSTEM_RESET_SWING > 0)
  231. {
  232. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_SYSTEM_RESET_SWING, DI_ATTR_SET_AUTO_UPLOAD, param);
  233. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_SYSTEM_RESET_SWING, DI_ATTR_SET_MODE, param);
  234. }
  235. if (IOInterfaceMapper::ID_SYSTEM_RESET_CIRCULAR > 0)
  236. {
  237. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_SYSTEM_RESET_CIRCULAR, DI_ATTR_SET_AUTO_UPLOAD, param);
  238. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_SYSTEM_RESET_CIRCULAR, DI_ATTR_SET_MODE, param);
  239. }
  240. if (IOInterfaceMapper::ID_TUBE_HEIGHT_CONTROLLER_DIRECTION_1 > 0)
  241. {
  242. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_CONTROLLER_DIRECTION_1, DI_ATTR_SET_AUTO_UPLOAD, param);
  243. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_CONTROLLER_DIRECTION_1, DI_ATTR_SET_MODE, param);
  244. }
  245. if (IOInterfaceMapper::ID_TUBE_HEIGHT_CONTROLLER_DIRECTION_2 > 0)
  246. {
  247. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_CONTROLLER_DIRECTION_2, DI_ATTR_SET_AUTO_UPLOAD, param);
  248. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_CONTROLLER_DIRECTION_2, DI_ATTR_SET_MODE, param);
  249. }
  250. if (IOInterfaceMapper::ID_TUBE_ANGLE_CONTROLLER_DIRECTION_1 > 0)
  251. {
  252. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_CONTROLLER_DIRECTION_1, DI_ATTR_SET_AUTO_UPLOAD, param);
  253. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_CONTROLLER_DIRECTION_1, DI_ATTR_SET_MODE, param);
  254. }
  255. if (IOInterfaceMapper::ID_TUBE_ANGLE_CONTROLLER_DIRECTION_2 > 0)
  256. {
  257. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_CONTROLLER_DIRECTION_2, DI_ATTR_SET_AUTO_UPLOAD, param);
  258. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_CONTROLLER_DIRECTION_2, DI_ATTR_SET_MODE, param);
  259. }
  260. if (IOInterfaceMapper::ID_CARM_SCANNING_SWITCH > 0)
  261. {
  262. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_CARM_SCANNING_SWITCH, DI_ATTR_SET_AUTO_UPLOAD, param);
  263. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_CARM_SCANNING_SWITCH, DI_ATTR_SET_MODE, param);
  264. }
  265. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_HAND_SWITCH_GEAR_FIRST, DI_ATTR_SET_AUTO_UPLOAD, param);
  266. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_HAND_SWITCH_GEAR_FIRST, DI_ATTR_SET_MODE, param);
  267. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_HAND_SWITCH_GEAR_SECOND, DI_ATTR_SET_AUTO_UPLOAD, param);
  268. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_HAND_SWITCH_GEAR_SECOND, DI_ATTR_SET_MODE, param);
  269. param.filter_time = (unsigned char)lswfiltertime;
  270. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_HIGH_LIMIT, DI_ATTR_SET_MODE, param);
  271. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_HIGH_LIMIT, DI_ATTR_SET_MODE, param);
  272. }
  273. void CArmMachineryManager::SetupAutouploadOnComponents()
  274. {
  275. GPIO_DI_PARAM diparam;
  276. diparam.autoupload_switch = (unsigned char)GAUTO_DI_UPLOAD_ON;
  277. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_LOW_LIMIT, DI_ATTR_SET_AUTO_UPLOAD, diparam);
  278. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_ANGLE_HIGH_LIMIT, DI_ATTR_SET_AUTO_UPLOAD, diparam);
  279. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_XRAYON_NOTIFY, DI_ATTR_SET_AUTO_UPLOAD, diparam);
  280. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_HIGH_LIMIT, DI_ATTR_SET_AUTO_UPLOAD, diparam);
  281. m_communicate->GPIO_DI_Ctrl(OP_SET, (GPIO_DI_ID)IOInterfaceMapper::ID_TUBE_HEIGHT_LOW_LIMIT, DI_ATTR_SET_AUTO_UPLOAD, diparam);
  282. }
  283. void CArmMachineryManager::SetupPFSTrigger()
  284. {
  285. GPIO_DO_PARAM params;
  286. params.output_mode = GOM_PWM;
  287. params.peroid.pwmperiod_short = 20002;
  288. params.effective.pwmperiod_short = 20000;
  289. params.pwm_step.pwmstep_int = 1;
  290. m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)IOInterfaceMapper::ID_EXPOSURE_TRIGGER,
  291. DO_ATTR_SET_MODE, params);
  292. m_communicate->GPIO_DO_Ctrl(OP_SET, (GPIO_DO_ID)IOInterfaceMapper::ID_EXPOSURE_TRIGGER,
  293. DO_ATTR_SET_PWM_PARAM_TABLE, params);
  294. }