From 5cd63bc98d2ccf9fe83854e811b4ec07fb7f47bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Tue, 6 May 2025 20:46:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=B7=A5=E8=89=BA=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/app/config/CraftsStateMachineConfig.java | 4 +- .../iflytop/gd/app/controller/AuthController.java | 2 +- .../com/iflytop/gd/app/core/CraftsContext.java | 8 +- .../java/com/iflytop/gd/app/core/DeviceState.java | 76 ++++++----- .../java/com/iflytop/gd/app/model/bo/Point2D.java | 17 +++ .../java/com/iflytop/gd/app/model/bo/Point3D.java | 14 +- .../java/com/iflytop/gd/app/model/entity/User.java | 6 +- .../com/iflytop/gd/app/model/vo/CraftStatusVO.java | 2 +- .../com/iflytop/gd/app/service/CraftsService.java | 4 +- .../iflytop/gd/app/service/CraftsStepService.java | 144 ++++++++++++--------- .../gd/app/service/DeviceCommandUtilService.java | 105 +++++++++++++++ .../com/iflytop/gd/app/service/UserService.java | 2 +- .../iflytop/gd/common/enums/AcidPumpDevice.java | 19 +-- .../com/iflytop/gd/common/enums/CraftEvents.java | 22 ---- .../com/iflytop/gd/common/enums/CraftStates.java | 19 --- .../java/com/iflytop/gd/common/enums/Deleted.java | 12 -- .../com/iflytop/gd/common/enums/FixedUser.java | 12 -- .../iflytop/gd/common/enums/TrayLiftStatus.java | 9 -- .../java/com/iflytop/gd/common/enums/UsrRole.java | 7 - .../gd/common/enums/automaton/CraftEvents.java | 22 ++++ .../gd/common/enums/automaton/CraftStates.java | 19 +++ .../com/iflytop/gd/common/enums/data/Deleted.java | 12 ++ .../iflytop/gd/common/enums/data/FixedUser.java | 12 ++ .../com/iflytop/gd/common/enums/data/UsrRole.java | 7 + 24 files changed, 351 insertions(+), 205 deletions(-) create mode 100644 src/main/java/com/iflytop/gd/app/model/bo/Point2D.java create mode 100644 src/main/java/com/iflytop/gd/app/service/DeviceCommandUtilService.java delete mode 100644 src/main/java/com/iflytop/gd/common/enums/CraftEvents.java delete mode 100644 src/main/java/com/iflytop/gd/common/enums/CraftStates.java delete mode 100644 src/main/java/com/iflytop/gd/common/enums/Deleted.java delete mode 100644 src/main/java/com/iflytop/gd/common/enums/FixedUser.java delete mode 100644 src/main/java/com/iflytop/gd/common/enums/TrayLiftStatus.java delete mode 100644 src/main/java/com/iflytop/gd/common/enums/UsrRole.java create mode 100644 src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java create mode 100644 src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java create mode 100644 src/main/java/com/iflytop/gd/common/enums/data/Deleted.java create mode 100644 src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java create mode 100644 src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java 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/CraftEvents.java b/src/main/java/com/iflytop/gd/common/enums/CraftEvents.java deleted file mode 100644 index 3b5b403..0000000 --- a/src/main/java/com/iflytop/gd/common/enums/CraftEvents.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iflytop.gd.common.enums; - -/** - * 工艺状态机事件枚举 - */ -public enum CraftEvents { - /** 启动工艺 */ - START, - /** 单步完成 */ - STEP_COMPLETE, - /** 暂停执行 */ - PAUSE, - /** 恢复执行 */ - RESUME, - /** 用户手动停止 */ - STOP, - /** 执行过程中发生错误 */ - ERROR_OCCUR, - /** 工艺正常完成 */ - FINISH - -} diff --git a/src/main/java/com/iflytop/gd/common/enums/CraftStates.java b/src/main/java/com/iflytop/gd/common/enums/CraftStates.java deleted file mode 100644 index 183d2ed..0000000 --- a/src/main/java/com/iflytop/gd/common/enums/CraftStates.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.iflytop.gd.common.enums; - -/** - * 工艺状态机状态枚举 - */ -public enum CraftStates { - /** 初始状态,尚未启动工艺 */ - READY, - /** 工艺正在执行中 */ - RUNNING, - /** 工艺已暂停,等待恢复 */ - PAUSED, - /** 工艺已被手动停止 */ - STOPPED, - /** 工艺执行过程中发生错误 */ - ERROR, - /** 工艺已正常执行完毕 */ - FINISHED -} diff --git a/src/main/java/com/iflytop/gd/common/enums/Deleted.java b/src/main/java/com/iflytop/gd/common/enums/Deleted.java deleted file mode 100644 index 86e69a7..0000000 --- a/src/main/java/com/iflytop/gd/common/enums/Deleted.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iflytop.gd.common.enums; - -import lombok.Getter; - -/** - * 删除状态枚举 - */ -@Getter -public enum Deleted { - ENABLE, - DISABLE -} diff --git a/src/main/java/com/iflytop/gd/common/enums/FixedUser.java b/src/main/java/com/iflytop/gd/common/enums/FixedUser.java deleted file mode 100644 index 355e7bc..0000000 --- a/src/main/java/com/iflytop/gd/common/enums/FixedUser.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iflytop.gd.common.enums; - -import lombok.Getter; - -/** - * 系統固定用户 - */ -@Getter -public enum FixedUser { - ENABLE, - DISABLE -} 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/UsrRole.java b/src/main/java/com/iflytop/gd/common/enums/UsrRole.java deleted file mode 100644 index ee6b1ac..0000000 --- a/src/main/java/com/iflytop/gd/common/enums/UsrRole.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.iflytop.gd.common.enums; - -public enum UsrRole { - ADMIN, - DEVELOPER, - USER; -} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java new file mode 100644 index 0000000..d4b6d16 --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftEvents.java @@ -0,0 +1,22 @@ +package com.iflytop.gd.common.enums.automaton; + +/** + * 工艺状态机事件枚举 + */ +public enum CraftEvents { + /** 启动工艺 */ + START, + /** 单步完成 */ + STEP_COMPLETE, + /** 暂停执行 */ + PAUSE, + /** 恢复执行 */ + RESUME, + /** 用户手动停止 */ + STOP, + /** 执行过程中发生错误 */ + ERROR_OCCUR, + /** 工艺正常完成 */ + FINISH + +} diff --git a/src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java new file mode 100644 index 0000000..5f81fe2 --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/enums/automaton/CraftStates.java @@ -0,0 +1,19 @@ +package com.iflytop.gd.common.enums.automaton; + +/** + * 工艺状态机状态枚举 + */ +public enum CraftStates { + /** 初始状态,尚未启动工艺 */ + READY, + /** 工艺正在执行中 */ + RUNNING, + /** 工艺已暂停,等待恢复 */ + PAUSED, + /** 工艺已被手动停止 */ + STOPPED, + /** 工艺执行过程中发生错误 */ + ERROR, + /** 工艺已正常执行完毕 */ + FINISHED +} diff --git a/src/main/java/com/iflytop/gd/common/enums/data/Deleted.java b/src/main/java/com/iflytop/gd/common/enums/data/Deleted.java new file mode 100644 index 0000000..75cdcb1 --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/enums/data/Deleted.java @@ -0,0 +1,12 @@ +package com.iflytop.gd.common.enums.data; + +import lombok.Getter; + +/** + * 删除状态枚举 + */ +@Getter +public enum Deleted { + ENABLE, + DISABLE +} diff --git a/src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java b/src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java new file mode 100644 index 0000000..1b11f15 --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/enums/data/FixedUser.java @@ -0,0 +1,12 @@ +package com.iflytop.gd.common.enums.data; + +import lombok.Getter; + +/** + * 系統固定用户 + */ +@Getter +public enum FixedUser { + ENABLE, + DISABLE +} diff --git a/src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java b/src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java new file mode 100644 index 0000000..9d033fa --- /dev/null +++ b/src/main/java/com/iflytop/gd/common/enums/data/UsrRole.java @@ -0,0 +1,7 @@ +package com.iflytop.gd.common.enums.data; + +public enum UsrRole { + ADMIN, + DEVELOPER, + USER; +} \ No newline at end of file