石墨消解仪后端服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
8.7 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. package com.iflytop.gd.app.service;
  2. import com.iflytop.gd.app.core.device.DeviceState;
  3. import com.iflytop.gd.app.core.device.HeatModuleState;
  4. import com.iflytop.gd.app.core.device.SolutionContainerState;
  5. import com.iflytop.gd.app.model.bo.DeviceInitializationData;
  6. import com.iflytop.gd.app.model.entity.Container;
  7. import com.iflytop.gd.app.model.entity.DeviceParamConfig;
  8. import com.iflytop.gd.common.enums.ContainerCode;
  9. import com.iflytop.gd.common.enums.ContainerType;
  10. import com.iflytop.gd.common.enums.HeatModuleCode;
  11. import com.iflytop.gd.hardware.comm.can.A8kCanBusService;
  12. import com.iflytop.gd.hardware.constants.ActionOvertimeConstant;
  13. import com.iflytop.gd.hardware.drivers.DODriver.OutputIOCtrlDriver;
  14. import com.iflytop.gd.hardware.drivers.LeisaiServoDriver;
  15. import com.iflytop.gd.hardware.drivers.MiniServoDriver.MiniServoDriver;
  16. import com.iflytop.gd.hardware.drivers.StepMotorDriver.StepMotorCtrlDriver;
  17. import com.iflytop.gd.hardware.drivers.TricolorLightDriver;
  18. import com.iflytop.gd.hardware.exception.HardwareException;
  19. import com.iflytop.gd.hardware.type.CmdId;
  20. import com.iflytop.gd.hardware.drivers.LiquidDistributionArmDriver;
  21. import com.iflytop.gd.hardware.type.IO.OutputIOMId;
  22. import com.iflytop.gd.hardware.type.MId;
  23. import com.iflytop.gd.hardware.type.RegIndex;
  24. import com.iflytop.gd.hardware.type.Servo.LeisaiServoMId;
  25. import com.iflytop.gd.hardware.type.Servo.LiquidArmMId;
  26. import com.iflytop.gd.hardware.type.Servo.MiniServoMId;
  27. import com.iflytop.gd.hardware.type.StepMotor.StepMotorMId;
  28. import com.opencsv.CSVReader;
  29. import jakarta.annotation.PostConstruct;
  30. import lombok.RequiredArgsConstructor;
  31. import lombok.extern.slf4j.Slf4j;
  32. import org.springframework.core.io.ClassPathResource;
  33. import org.springframework.stereotype.Service;
  34. import java.io.InputStreamReader;
  35. import java.util.List;
  36. import java.util.concurrent.CompletableFuture;
  37. @Slf4j
  38. @Service
  39. @RequiredArgsConstructor
  40. public class DeviceInitService {
  41. private final ContainerService containerService;
  42. private final DeviceStateService deviceStateService;
  43. private final A8kCanBusService canBusService;
  44. private final StepMotorCtrlDriver stepMotorCtrlDriver;
  45. private final MiniServoDriver miniServoDriver;
  46. private final LiquidDistributionArmDriver liquidDistributionArmDriver;
  47. private final TricolorLightDriver tricolorLightDriver;
  48. private final LeisaiServoDriver leisaiServoDriver;
  49. private final ActionOvertimeConstant actionOvertimeConstant;
  50. private final OutputIOCtrlDriver outputIOCtrlDriver;
  51. private final DeviceParamConfigService deviceParamConfigService;
  52. @PostConstruct
  53. public void init() {
  54. new Thread(() -> {
  55. try {
  56. Thread.sleep(2000);
  57. CompletableFuture.runAsync(() -> {
  58. try {
  59. tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.BLUE);
  60. } catch (HardwareException e) {
  61. log.error("设备初始化灯光失败,Color.BLUE");
  62. }
  63. });
  64. initDeviceState();
  65. initDeviceSetData();
  66. initOvertime();
  67. initEnable();
  68. try {
  69. tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.GREEN);
  70. } catch (HardwareException e) {
  71. log.error("设备初始化灯光失败,Color.GREEN");
  72. }
  73. deviceStateService.setInitComplete(true);
  74. } catch (Exception e) {
  75. try {
  76. tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.RED);
  77. } catch (Exception ignored) {
  78. }
  79. log.error("设备初始化失败", e);
  80. }
  81. }).start();
  82. }
  83. /**
  84. * 设置各动作超时时间
  85. */
  86. public void initOvertime() {
  87. actionOvertimeConstant.pushNewConfig(StepMotorMId.DOOR_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 90 * 1000);
  88. actionOvertimeConstant.pushNewConfig(LeisaiServoMId.MainXSV, CmdId.step_motor_easy_move_to_zero, 300 * 1000);
  89. actionOvertimeConstant.pushNewConfig(LeisaiServoMId.MainYSV, CmdId.step_motor_easy_move_to_zero, 120 * 1000);
  90. actionOvertimeConstant.pushNewConfig(StepMotorMId.HBOT_Z_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 30 * 1000);
  91. actionOvertimeConstant.pushNewConfig(StepMotorMId.HEATER_1_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 60 * 1000);
  92. actionOvertimeConstant.pushNewConfig(StepMotorMId.HEATER_2_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 60 * 1000);
  93. actionOvertimeConstant.pushNewConfig(StepMotorMId.HEATER_3_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 60 * 1000);
  94. actionOvertimeConstant.pushNewConfig(StepMotorMId.HEATER_4_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 60 * 1000);
  95. actionOvertimeConstant.pushNewConfig(StepMotorMId.HEATER_5_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 60 * 1000);
  96. actionOvertimeConstant.pushNewConfig(StepMotorMId.HEATER_6_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 60 * 1000);
  97. actionOvertimeConstant.pushNewConfig(StepMotorMId.TRAY_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 300 * 1000);
  98. actionOvertimeConstant.pushNewConfig(LiquidArmMId.LiquidDistributionArm, CmdId.liquid_distribution_arm_move_to, 6 * 1000);
  99. }
  100. /**
  101. * 初始化所有设备使能
  102. */
  103. public void initEnable() throws Exception {
  104. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.DOOR_MOTOR_MID, 1);
  105. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.SHAKE_MOTOR_MID, 1);
  106. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.TRAY_MOTOR_MID, 1);
  107. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HBOT_Z_MOTOR_MID, 1);
  108. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HEATER_1_MOTOR_MID, 1);
  109. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HEATER_2_MOTOR_MID, 1);
  110. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HEATER_3_MOTOR_MID, 1);
  111. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HEATER_4_MOTOR_MID, 1);
  112. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HEATER_5_MOTOR_MID, 1);
  113. stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.HEATER_6_MOTOR_MID, 1);
  114. liquidDistributionArmDriver.liquidDistributionArmEnable(LiquidArmMId.LiquidDistributionArm, 1);
  115. miniServoDriver.miniServoForceEnable(MiniServoMId.CLAW_MID, 1);
  116. leisaiServoDriver.enable(LeisaiServoMId.MainXSV, 1);
  117. leisaiServoDriver.enable(LeisaiServoMId.MainYSV, 1);
  118. outputIOCtrlDriver.open(OutputIOMId.DO_HBOTZ_MOTOR_CLAMP);
  119. outputIOCtrlDriver.open(OutputIOMId.DO_TRAY_MOTOR_CLAMP);
  120. }
  121. public void initDeviceSetData() throws Exception {
  122. if (deviceStateService.getDeviceState().isVirtual() || deviceStateService.getDeviceState().isInitComplete()) {
  123. return;
  124. }
  125. //从数据库中读取数据通过串口进行数据初始化
  126. List<DeviceParamConfig> deviceParamConfigs = deviceParamConfigService.list();
  127. for (DeviceParamConfig deviceParamConfig : deviceParamConfigs) {
  128. DeviceInitializationData data = new DeviceInitializationData();
  129. data.setId(Math.toIntExact(deviceParamConfig.getId()));
  130. data.setMid(deviceParamConfig.getMid());
  131. data.setRegIndex(deviceParamConfig.getRegIndex());
  132. data.setRegInitVal(deviceParamConfig.getRegVal());
  133. try {
  134. sendToDevice(data);
  135. } catch (Exception e) {
  136. log.error("设备初始化写入参数失败,2秒后重试", e);
  137. Thread.sleep(2000);
  138. initDeviceSetData();
  139. }
  140. }
  141. }
  142. public void sendToDevice(DeviceInitializationData data) throws Exception {
  143. canBusService.moduleSetReg(MId.valueOf(data.getMid()), RegIndex.valueOf(data.getRegIndex()), data.getRegInitVal());
  144. }
  145. public void initDeviceState() {
  146. DeviceState deviceState = deviceStateService.getDeviceState();
  147. List<HeatModuleState> heatArea = deviceState.getHeatModule();
  148. for (HeatModuleCode code : HeatModuleCode.values()) {
  149. heatArea.add(new HeatModuleState(code));
  150. }
  151. List<Container> containerList = containerService.getList();
  152. List<SolutionContainerState> solutionBucket = deviceState.getSolutionModule().getSolutionContainer();
  153. for (Container container : containerList) {
  154. if (container.getType() == 0) {
  155. solutionBucket.add(new SolutionContainerState(container.getId(), ContainerCode.valueOf(container.getCode()), ContainerType.solution));
  156. } else {
  157. solutionBucket.add(new SolutionContainerState(container.getId(), ContainerCode.valueOf(container.getCode()), ContainerType.neutralization));
  158. }
  159. }
  160. }
  161. }