diff --git a/src/main/java/com/iflytop/gd/app/config/CraftsStateMachineConfig.java b/src/main/java/com/iflytop/gd/app/config/CraftsStateMachineConfig.java index 17a980c..cf556b0 100644 --- a/src/main/java/com/iflytop/gd/app/config/CraftsStateMachineConfig.java +++ b/src/main/java/com/iflytop/gd/app/config/CraftsStateMachineConfig.java @@ -1,7 +1,7 @@ package com.iflytop.gd.app.config; -import com.iflytop.gd.common.enums.CraftEvents; -import com.iflytop.gd.common.enums.CraftStates; +import com.iflytop.gd.common.enums.automaton.CraftEvents; +import com.iflytop.gd.common.enums.automaton.CraftStates; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.config.EnableStateMachineFactory; import org.springframework.statemachine.config.StateMachineConfigurerAdapter; diff --git a/src/main/java/com/iflytop/gd/app/controller/AuthController.java b/src/main/java/com/iflytop/gd/app/controller/AuthController.java index 83dd60c..4cf3699 100644 --- a/src/main/java/com/iflytop/gd/app/controller/AuthController.java +++ b/src/main/java/com/iflytop/gd/app/controller/AuthController.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.iflytop.gd.app.model.dto.LoginDTO; import com.iflytop.gd.app.model.entity.User; import com.iflytop.gd.app.service.UserService; -import com.iflytop.gd.common.enums.Deleted; +import com.iflytop.gd.common.enums.data.Deleted; import com.iflytop.gd.common.result.Result; import com.iflytop.gd.common.result.ResultCode; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/com/iflytop/gd/app/core/CraftsContext.java b/src/main/java/com/iflytop/gd/app/core/CraftsContext.java index 6865d34..ed5e96f 100644 --- a/src/main/java/com/iflytop/gd/app/core/CraftsContext.java +++ b/src/main/java/com/iflytop/gd/app/core/CraftsContext.java @@ -1,8 +1,8 @@ package com.iflytop.gd.app.core; import cn.hutool.json.JSONUtil; -import com.iflytop.gd.common.enums.CraftEvents; -import com.iflytop.gd.common.enums.CraftStates; +import com.iflytop.gd.common.enums.automaton.CraftEvents; +import com.iflytop.gd.common.enums.automaton.CraftStates; import com.iflytop.gd.app.model.bo.CraftsStep; import com.iflytop.gd.app.model.entity.Crafts; import com.iflytop.gd.app.model.entity.Ores; @@ -94,7 +94,7 @@ public class CraftsContext implements Runnable { Message finishMsg = MessageBuilder.withPayload(CraftEvents.FINISH).build(); Mono.from(sm.sendEvent(Mono.just(finishMsg))).block(); } - } catch (InterruptedException e) { + } catch (Exception e) { Message stopMsg = MessageBuilder.withPayload(CraftEvents.STOP).build(); Mono.from(sm.sendEvent(Mono.just(stopMsg))).block(); } @@ -107,7 +107,7 @@ public class CraftsContext implements Runnable { * @return 是否执行成功 * @throws InterruptedException 执行中被中断 */ - private boolean executeStep(CraftsStep step) throws InterruptedException { + private boolean executeStep(CraftsStep step) throws Exception { Map startData = new HashMap<>(); startData.put("heatId", heatId); startData.put("currentStep", step.getMethod()); diff --git a/src/main/java/com/iflytop/gd/app/core/DeviceState.java b/src/main/java/com/iflytop/gd/app/core/DeviceState.java index 9c18507..fc79b31 100644 --- a/src/main/java/com/iflytop/gd/app/core/DeviceState.java +++ b/src/main/java/com/iflytop/gd/app/core/DeviceState.java @@ -3,14 +3,21 @@ package com.iflytop.gd.app.core; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; @Schema(description = "当前设备状态") @Data public class DeviceState { + private final Lock liquidLock = new ReentrantLock(); + private final Condition liquidIdleCondition = liquidLock.newCondition(); + @Schema(description = "是否是急停状态,true为急停") private AtomicBoolean emergencyStop = new AtomicBoolean(false); @@ -24,25 +31,19 @@ public class DeviceState { private AtomicReference liquidArea = new AtomicReference<>(new LiquidArea()); @Schema(description = "加热操作区属性") - private CopyOnWriteArrayList heatArea = new CopyOnWriteArrayList<>(); + private List heatArea = new ArrayList<>(); @Schema(description = "碱容器状态") private AtomicReference alkaliBucket = new AtomicReference<>(new LiquidBucket()); - /** - * 龙门架机械臂属性 - */ @Data private static class GantryArm { @Schema(description = "是否空闲,true为空闲,false为占用") private AtomicBoolean idle = new AtomicBoolean(true); } - /** - * 加液操作区属性 - */ @Data - private static class LiquidArea { + public static class LiquidArea { @Schema(description = "是否空闲,true为空闲,false为占用") private AtomicBoolean idle = new AtomicBoolean(true); @@ -53,17 +54,14 @@ public class DeviceState { private AtomicInteger trayStatus = new AtomicInteger(0); @Schema(description = "溶液容器状态") - private CopyOnWriteArrayList solutionBucket = new CopyOnWriteArrayList<>(); + private List solutionBucket = new ArrayList<>(); - @Schema(description = "加液泵状态") - private CopyOnWriteArrayList pump = new CopyOnWriteArrayList<>(); + @Schema(description = "是否正在加液,true正在加液,false未运行") + private AtomicBoolean isPumping = new AtomicBoolean(false); } - /** - * 加热操作区属性 - */ @Data - private static class HeatArea { + public static class HeatArea { @Schema(description = "加热器设备id") private String hardwareId; @@ -77,23 +75,11 @@ public class DeviceState { private AtomicBoolean capStatus = new AtomicBoolean(false); @Schema(description = "加热器当前温度") - private AtomicReference temperature = new AtomicReference<>(0.0); - } - - /** - * 泵属性 - */ - @Data - private static class Pump { - @Schema(description = "加液泵id") - private String pumpId; - - @Schema(description = "是否正在加液,true正在加液,false未运行") - private AtomicInteger isPumping = new AtomicInteger(0); + private AtomicInteger temperature = new AtomicInteger(0); } @Data - private static class LiquidBucket { + public static class LiquidBucket { @Schema(description = "容器是否为空,true为空,false不为空") private AtomicBoolean isEmpty = new AtomicBoolean(false); @@ -111,4 +97,34 @@ public class DeviceState { private static class DeviceStateHolder { private static final DeviceState INSTANCE = new DeviceState(); } + + + /** + * 等待加液区空闲 + */ + public void waitLiquidIdle() { + liquidLock.lock(); + try { + while (!DeviceState.getInstance().getLiquidArea().get().getIdle().get()) { + liquidIdleCondition.await(); + } + } catch (InterruptedException e) { + throw new RuntimeException("等待加液区空闲错误", e); + } finally { + liquidLock.unlock(); + } + } + + /** + * 释放加液区 + */ + public void setLiquidIdleTrue() { + liquidLock.lock(); + try { + DeviceState.getInstance().getLiquidArea().get().getIdle().set(true); + liquidIdleCondition.signalAll(); // 唤醒所有等待的线程 + } finally { + liquidLock.unlock(); + } + } } diff --git a/src/main/java/com/iflytop/gd/app/model/bo/Point2D.java b/src/main/java/com/iflytop/gd/app/model/bo/Point2D.java new file mode 100644 index 0000000..80876c0 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/model/bo/Point2D.java @@ -0,0 +1,17 @@ +package com.iflytop.gd.app.model.bo; + + +import lombok.Getter; + +@Getter +public class Point2D { + private final Double x; + private final Double y; + + public Point2D(Double x, Double y) { + this.x = x; + this.y = y; + } + + +} diff --git a/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java b/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java index 7ab4aa7..e0b4e6b 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/Point3D.java @@ -5,19 +5,15 @@ import lombok.Getter; @Getter public class Point3D { - private final Integer x; - private final Integer y; - private final Integer z; + private final Double x; + private final Double y; + private final Double z; - public Point3D(Integer x, Integer y, Integer z) { + public Point3D(Double x, Double y, Double z) { this.x = x; this.y = y; this.z = z; } - public Point3D(Integer x, Integer y) { - this.x = x; - this.y = y; - this.z = 0; - } + } diff --git a/src/main/java/com/iflytop/gd/app/model/entity/User.java b/src/main/java/com/iflytop/gd/app/model/entity/User.java index d06733e..58679f0 100644 --- a/src/main/java/com/iflytop/gd/app/model/entity/User.java +++ b/src/main/java/com/iflytop/gd/app/model/entity/User.java @@ -2,9 +2,9 @@ package com.iflytop.gd.app.model.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.iflytop.gd.common.base.BaseEntity; -import com.iflytop.gd.common.enums.Deleted; -import com.iflytop.gd.common.enums.FixedUser; -import com.iflytop.gd.common.enums.UsrRole; +import com.iflytop.gd.common.enums.data.Deleted; +import com.iflytop.gd.common.enums.data.FixedUser; +import com.iflytop.gd.common.enums.data.UsrRole; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; diff --git a/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java b/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java index f028f9a..b68d1ac 100644 --- a/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java +++ b/src/main/java/com/iflytop/gd/app/model/vo/CraftStatusVO.java @@ -1,6 +1,6 @@ package com.iflytop.gd.app.model.vo; -import com.iflytop.gd.common.enums.CraftStates; +import com.iflytop.gd.common.enums.automaton.CraftStates; import com.iflytop.gd.app.model.bo.CraftsStep; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/src/main/java/com/iflytop/gd/app/service/CraftsService.java b/src/main/java/com/iflytop/gd/app/service/CraftsService.java index 1101eb3..74066d8 100644 --- a/src/main/java/com/iflytop/gd/app/service/CraftsService.java +++ b/src/main/java/com/iflytop/gd/app/service/CraftsService.java @@ -2,8 +2,8 @@ package com.iflytop.gd.app.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.iflytop.gd.common.enums.CraftEvents; -import com.iflytop.gd.common.enums.CraftStates; +import com.iflytop.gd.common.enums.automaton.CraftEvents; +import com.iflytop.gd.common.enums.automaton.CraftStates; import com.iflytop.gd.app.core.CraftsContext; import com.iflytop.gd.app.mapper.CraftsMapper; import com.iflytop.gd.app.model.entity.Crafts; diff --git a/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java b/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java index 8363c02..fa88bd8 100644 --- a/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java +++ b/src/main/java/com/iflytop/gd/app/service/CraftsStepService.java @@ -1,7 +1,13 @@ package com.iflytop.gd.app.service; import cn.hutool.json.JSONObject; +import com.iflytop.gd.app.core.DeviceState; import com.iflytop.gd.app.model.bo.CraftsStep; +import com.iflytop.gd.app.model.bo.Point3D; +import com.iflytop.gd.common.cmd.CommandFuture; +import com.iflytop.gd.common.cmd.DeviceCommandBundle; +import com.iflytop.gd.common.cmd.DeviceCommandGenerator; +import com.iflytop.gd.common.enums.HeatModuleId; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -11,44 +17,58 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class CraftsStepService { + private final DeviceCommandService deviceCommandService; + private final DeviceCommandUtilService deviceCommandUtilService; /** * 执行单个工艺步骤 * * @param heatId 加热区 ID - * @param step 工艺步骤,包括 method 和 params - * @return true 表示执行成功,false 表示失败 + * @param step 工艺步骤,包括 method 和 params + * @return true 表示执行成功,false 表示失败 */ - public boolean executeStep(String heatId, CraftsStep step){ + public boolean executeStep(String heatId, CraftsStep step) throws Exception { String method = step.getMethod(); JSONObject params = step.getParams(); delay(3); return switch (method) { - case "ADD_LIQUID" -> addLiquid(heatId, params); - case "SHAKING" -> shaking(params); - case "HEATING" -> heating(heatId, params); - case "TAKE_PHOTO" -> takePhoto(heatId); - default -> true; + case "ADD_LIQUID" -> addLiquid(heatId, params); + case "SHAKING" -> shaking(params); + case "HEATING" -> heating(heatId, params); + case "TAKE_PHOTO" -> takePhoto(heatId); + default -> true; }; } /** * 添加溶液 */ - private boolean addLiquid(String heatId, JSONObject params) { - //if 判断加液区是否空闲 - //等待空闲 - //if 判断托盘电机是否升起 - //升起托盘 - //if 判断托盘是否有拍子 - //将机械臂移动至托盘上方 - //下降机械臂使夹爪可以夹住拍子 - //夹住拍子 - //机械臂提升至安全高度 - //下降拍子存放区1个位置 - //将机械臂移动至拍子存放区上方 - //下降机械臂 - //松开夹爪 + private boolean addLiquid(String heatId, JSONObject params) throws Exception { + //TODO 判断加液区是否空闲 + DeviceState.getInstance().waitLiquidIdle();//等待加液区空闲 + //TODO 判断托盘电机是否升起 + //升起托盘 + HeatModuleId heatModuleId = HeatModuleId.valueOf(heatId); + double heaterMotorMoveUpPosition = 0.0; //TODO 加热位抬升托盘位置 从数据库中获取 + deviceCommandUtilService.heaterMotorMove(heatModuleId, heaterMotorMoveUpPosition); + //TODO 判断托盘是否有拍子 + //将机械臂移动至托盘上方 + Point3D aboveTrayPoint3D = new Point3D(0.0, 0.0, 0.0);//TODO 托盘上方点位 从数据库中获取 + deviceCommandUtilService.gantryMove(aboveTrayPoint3D); + //下降机械臂使夹爪可以夹住拍子 + double aboveTrayCapPosition = 0.0;//TODO 下降机械臂使夹爪可以夹住拍子的位置 从数据库中获取 + deviceCommandUtilService.gantryXMove(aboveTrayCapPosition); + //夹住拍子 + double clawClampPosition = 0.0;//TODO 夹拍子收紧度 从数据库中获取 + deviceCommandUtilService.clawClamp(clawClampPosition); + //机械臂提升至安全高度 + double gantryCarryCapUpSafePosition = 0.0;//TODO 机械臂携带拍子的安全高度位置 从数据库中获取 + deviceCommandUtilService.gantryZMove(gantryCarryCapUpSafePosition); + //下降拍子存放区1个位置 + deviceCommandUtilService.capMotorMove(-1); + //将机械臂移动至拍子存放区上方 + //下降机械臂 + //松开夹爪 //将机械臂移动至托盘上方 //下降机械臂使夹爪可以夹住托盘 //机械臂提升至安全位置 @@ -57,8 +77,8 @@ public class CraftsStepService { //松开夹爪 //提升机械臂至安全高度 //for 根据工艺配置添加溶液 - //加液机械臂移动至第N个试管 - //启动x加液泵添加m毫升溶液 + //加液机械臂移动至第N个试管 + //启动x加液泵添加m毫升溶液 return true; } @@ -76,24 +96,24 @@ public class CraftsStepService { */ private boolean heating(String heatId, JSONObject params) { //if 判断加液区是否有托盘 - //将机械臂移动至加液区托盘上方 - //下降机械臂使夹爪可以夹住托盘 - //夹住托盘 - //将托盘提升至安全高度 - //将机械臂移动至加热区上方 - //下降机械臂使托盘与试管落入加热区 - //将机械臂提升至安全高度 - //移动机械臂至拍子存放区上方 - //下降机械臂使夹爪可以夹住拍子 - //提升机械臂携带拍子至安全高度 - //将机械臂移动至加热区托盘上方 - //降下机械臂使拍子盖住托盘试管 - //松开夹爪 - //提升机械臂至安全高度 - //降下托盘 - //根据配置开始加热 + //将机械臂移动至加液区托盘上方 + //下降机械臂使夹爪可以夹住托盘 + //夹住托盘 + //将托盘提升至安全高度 + //将机械臂移动至加热区上方 + //下降机械臂使托盘与试管落入加热区 + //将机械臂提升至安全高度 + //移动机械臂至拍子存放区上方 + //下降机械臂使夹爪可以夹住拍子 + //提升机械臂携带拍子至安全高度 + //将机械臂移动至加热区托盘上方 + //降下机械臂使拍子盖住托盘试管 + //松开夹爪 + //提升机械臂至安全高度 + //降下托盘 + //根据配置开始加热 //else - //根据配置开始加热 + //根据配置开始加热 //加热结束,提升托盘 return true; } @@ -103,34 +123,34 @@ public class CraftsStepService { */ private boolean takePhoto(String heatId) { //if 判断加液位是否有托盘 - //进行拍照 + //进行拍照 //else - //if 判断托盘电机是否升起 - //升起托盘 - //if 判断托盘是否有拍子 - //将机械臂移动至托盘上方 - //下降机械臂使夹爪可以夹住拍子 - //夹住拍子 - //机械臂提升至安全高度 - //下降拍子存放区1个位置 - //将机械臂移动至拍子存放区上方 - //下降机械臂 - //松开夹爪 - //将机械臂移动至托盘上方 - //下降机械臂使夹爪可以夹住托盘 - //机械臂提升至安全位置 - //移动机械臂至加液区 - //下降机械臂将托盘与试管落入加液区 - //松开夹爪 - //提升机械臂至安全高度 - //进行拍照 + //if 判断托盘电机是否升起 + //升起托盘 + //if 判断托盘是否有拍子 + //将机械臂移动至托盘上方 + //下降机械臂使夹爪可以夹住拍子 + //夹住拍子 + //机械臂提升至安全高度 + //下降拍子存放区1个位置 + //将机械臂移动至拍子存放区上方 + //下降机械臂 + //松开夹爪 + //将机械臂移动至托盘上方 + //下降机械臂使夹爪可以夹住托盘 + //机械臂提升至安全位置 + //移动机械臂至加液区 + //下降机械臂将托盘与试管落入加液区 + //松开夹爪 + //提升机械臂至安全高度 + //进行拍照 return true; } /** * 延时等待 */ - private boolean delay(int seconds){ + private boolean delay(int seconds) { try { Thread.sleep(seconds * 1000L); } catch (InterruptedException e) { diff --git a/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java b/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java new file mode 100644 index 0000000..e0bc23b --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java @@ -0,0 +1,105 @@ +package com.iflytop.gd.app.service; + +import com.iflytop.gd.app.model.bo.Point3D; +import com.iflytop.gd.common.cmd.CommandFuture; +import com.iflytop.gd.common.cmd.DeviceCommandBundle; +import com.iflytop.gd.common.cmd.DeviceCommandGenerator; +import com.iflytop.gd.common.enums.HeatModuleId; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.TimeUnit; + +@Component +@RequiredArgsConstructor +public class DeviceCommandUtilService { + private final DeviceCommandService deviceCommandService; + + /** + * 龙门架机械臂移动到指定点 + */ + public void gantryMove(Point3D point) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryXMove(point.getX()); + DeviceCommandBundle gantryYMoveDeviceCommand = DeviceCommandGenerator.gantryYMove(point.getY()); + DeviceCommandBundle gantryZMoveDeviceCommand = DeviceCommandGenerator.gantryZMove(point.getZ()); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + CommandFuture gantryYMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryYMoveDeviceCommand); + CommandFuture gantryZMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryZMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture, gantryYMoveDeviceCommandFuture, gantryZMoveDeviceCommandFuture); + } + + /** + * 龙门架机械臂X轴移动到指定点 + */ + public void gantryXMove(double position) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryXMove(position); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture); + } + + /** + * 龙门架机械臂Y轴移动到指定点 + */ + public void gantryYMove(double position) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryYMove(position); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture); + } + + /** + * 龙门架机械臂Z轴移动到指定点 + */ + public void gantryZMove(double position) throws Exception { + DeviceCommandBundle gantryXMoveDeviceCommand = DeviceCommandGenerator.gantryZMove(position); + CommandFuture gantryXMoveDeviceCommandFuture = deviceCommandService.sendCommand(gantryXMoveDeviceCommand); + commandWait(gantryXMoveDeviceCommandFuture); + } + + /** + * 收紧夹爪 + */ + public void clawClamp(double position) throws Exception { + DeviceCommandBundle deviceCommand = DeviceCommandGenerator.clawMove(position); + CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(deviceCommand); + commandWait(deviceCommandFuture); + } + + /** + * 调整拍子升降电机位置 + * @param num 1为上升1格,-1为下降1格 + */ + public void capMotorMove(int num) throws Exception { + double capHeight = 0.0; //TODO 每个拍子的高度 从数据库中获取 + //TODO 获取当前拍子升降电机位置 + DeviceCommandBundle deviceCommand = DeviceCommandGenerator.trayMotorMove(num * capHeight); + CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(deviceCommand); + commandWait(deviceCommandFuture); + } + + + /** + * 加热模块升降电机移动到指定位置 + */ + public void heaterMotorMove(HeatModuleId heatModuleId, double position) throws Exception { + DeviceCommandBundle deviceCommand = switch (heatModuleId) { + case HeatModuleId.MODULE_01 -> DeviceCommandGenerator.heaterMotor1Move(position); + case HeatModuleId.MODULE_02 -> DeviceCommandGenerator.heaterMotor2Move(position); + case HeatModuleId.MODULE_03 -> DeviceCommandGenerator.heaterMotor3Move(position); + case HeatModuleId.MODULE_04 -> DeviceCommandGenerator.heaterMotor4Move(position); + case HeatModuleId.MODULE_05 -> DeviceCommandGenerator.heaterMotor5Move(position); + case HeatModuleId.MODULE_06 -> DeviceCommandGenerator.heaterMotor6Move(position); + }; + CommandFuture deviceCommandFuture = deviceCommandService.sendCommand(deviceCommand); + commandWait(deviceCommandFuture); + } + + public void commandWait(CommandFuture... futures) throws Exception { + CompletableFuture[] responseFutures = Arrays.stream(futures) + .map(CommandFuture::getResponseFuture) + .toArray(CompletableFuture[]::new); + CompletableFuture.allOf(responseFutures) + .get(120, TimeUnit.SECONDS); + } +} diff --git a/src/main/java/com/iflytop/gd/app/service/UserService.java b/src/main/java/com/iflytop/gd/app/service/UserService.java index afd8b03..89a0add 100644 --- a/src/main/java/com/iflytop/gd/app/service/UserService.java +++ b/src/main/java/com/iflytop/gd/app/service/UserService.java @@ -1,7 +1,7 @@ package com.iflytop.gd.app.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.iflytop.gd.common.enums.FixedUser; +import com.iflytop.gd.common.enums.data.FixedUser; import com.iflytop.gd.app.mapper.UserMapper; import com.iflytop.gd.app.model.entity.User; import lombok.Getter; diff --git a/src/main/java/com/iflytop/gd/common/enums/AcidPumpDevice.java b/src/main/java/com/iflytop/gd/common/enums/AcidPumpDevice.java index ae1d082..7ade500 100644 --- a/src/main/java/com/iflytop/gd/common/enums/AcidPumpDevice.java +++ b/src/main/java/com/iflytop/gd/common/enums/AcidPumpDevice.java @@ -4,18 +4,19 @@ import lombok.Getter; /** * 泵设备id枚举 + * 格式为 "acid_pump_01" ~ "acid_pump_08" */ @Getter public enum AcidPumpDevice { - PUMP_01("acid_pump1"), - PUMP_02("acid_pump2"), - PUMP_03("acid_pump3"), - PUMP_04("acid_pump4"), - PUMP_05("acid_pump5"), - PUMP_06("acid_pump6"), - PUMP_07("acid_pump7"), - PUMP_08("acid_pump8"); - + PUMP_01("acid_pump_01"), + PUMP_02("acid_pump_02"), + PUMP_03("acid_pump_03"), + PUMP_04("acid_pump_04"), + PUMP_05("acid_pump_05"), + PUMP_06("acid_pump_06"), + PUMP_07("acid_pump_07"), + PUMP_08("acid_pump_08"); +0 private final String id; AcidPumpDevice(String id) { diff --git a/src/main/java/com/iflytop/gd/common/enums/TrayLiftStatus.java b/src/main/java/com/iflytop/gd/common/enums/TrayLiftStatus.java deleted file mode 100644 index a6a9571..0000000 --- a/src/main/java/com/iflytop/gd/common/enums/TrayLiftStatus.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.iflytop.gd.common.enums; - -/** - * 托盘升降状态 - */ -public enum TrayLiftStatus { - UP, - DOWN -} diff --git a/src/main/java/com/iflytop/gd/common/enums/CraftEvents.java b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java similarity index 88% rename from src/main/java/com/iflytop/gd/common/enums/CraftEvents.java rename to src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java index 3b5b403..d4b6d16 100644 --- a/src/main/java/com/iflytop/gd/common/enums/CraftEvents.java +++ b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java @@ -1,4 +1,4 @@ -package com.iflytop.gd.common.enums; +package com.iflytop.gd.common.enums.automaton; /** * 工艺状态机事件枚举 diff --git a/src/main/java/com/iflytop/gd/common/enums/CraftStates.java b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java similarity index 89% rename from src/main/java/com/iflytop/gd/common/enums/CraftStates.java rename to src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java index 183d2ed..5f81fe2 100644 --- a/src/main/java/com/iflytop/gd/common/enums/CraftStates.java +++ b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java @@ -1,4 +1,4 @@ -package com.iflytop.gd.common.enums; +package com.iflytop.gd.common.enums.automaton; /** * 工艺状态机状态枚举 diff --git a/src/main/java/com/iflytop/gd/common/enums/Deleted.java b/src/main/java/com/iflytop/gd/common/enums/data/Deleted.java similarity index 72% rename from src/main/java/com/iflytop/gd/common/enums/Deleted.java rename to src/main/java/com/iflytop/gd/common/enums/data/Deleted.java index 86e69a7..75cdcb1 100644 --- a/src/main/java/com/iflytop/gd/common/enums/Deleted.java +++ b/src/main/java/com/iflytop/gd/common/enums/data/Deleted.java @@ -1,4 +1,4 @@ -package com.iflytop.gd.common.enums; +package com.iflytop.gd.common.enums.data; import lombok.Getter; diff --git a/src/main/java/com/iflytop/gd/common/enums/FixedUser.java b/src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java similarity index 72% rename from src/main/java/com/iflytop/gd/common/enums/FixedUser.java rename to src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java index 355e7bc..1b11f15 100644 --- a/src/main/java/com/iflytop/gd/common/enums/FixedUser.java +++ b/src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java @@ -1,4 +1,4 @@ -package com.iflytop.gd.common.enums; +package com.iflytop.gd.common.enums.data; import lombok.Getter; diff --git a/src/main/java/com/iflytop/gd/common/enums/UsrRole.java b/src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java similarity index 57% rename from src/main/java/com/iflytop/gd/common/enums/UsrRole.java rename to src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java index ee6b1ac..9d033fa 100644 --- a/src/main/java/com/iflytop/gd/common/enums/UsrRole.java +++ b/src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java @@ -1,4 +1,4 @@ -package com.iflytop.gd.common.enums; +package com.iflytop.gd.common.enums.data; public enum UsrRole { ADMIN,