From 9f674d3a3d550fedc32927ccbc4404bd9019b08e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Fri, 25 Jul 2025 16:13:22 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=B0=83=E6=95=B4=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E7=BB=93=E6=9E=84=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9C=BA=E6=A2=B0=E8=87=82=E7=94=B3=E8=AF=B7=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../colortitration/app/core/state/DeviceState.java | 3 +- .../app/core/state/TitrationModule.java | 24 ------------ .../app/core/state/TitrationModuleState.java | 24 ++++++++++++ .../colortitration/app/core/state/TubeState.java | 3 ++ .../app/service/DeviceInitService.java | 8 ++-- .../app/service/module/TransferModuleService.java | 44 ++++++++++++++++++---- 6 files changed, 68 insertions(+), 38 deletions(-) delete mode 100644 src/main/java/com/iflytop/colortitration/app/core/state/TitrationModule.java create mode 100644 src/main/java/com/iflytop/colortitration/app/core/state/TitrationModuleState.java diff --git a/src/main/java/com/iflytop/colortitration/app/core/state/DeviceState.java b/src/main/java/com/iflytop/colortitration/app/core/state/DeviceState.java index 8970ca4..df132ce 100644 --- a/src/main/java/com/iflytop/colortitration/app/core/state/DeviceState.java +++ b/src/main/java/com/iflytop/colortitration/app/core/state/DeviceState.java @@ -17,9 +17,8 @@ import java.util.Map; @Component @JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class DeviceState { - @Schema(description = "滴定模块") - private final Map titrationModuleStateMap = new HashMap<>(); + private final Map titrationModuleStateMap = new HashMap<>(); @Schema(description = "加热模块") private final Map heatModuleStateMap = new HashMap<>(); diff --git a/src/main/java/com/iflytop/colortitration/app/core/state/TitrationModule.java b/src/main/java/com/iflytop/colortitration/app/core/state/TitrationModule.java deleted file mode 100644 index d897b6b..0000000 --- a/src/main/java/com/iflytop/colortitration/app/core/state/TitrationModule.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.iflytop.colortitration.app.core.state; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.iflytop.colortitration.app.common.enums.MultipleModuleCode; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Schema(description = "当前滴定模块状态") -@Data -@Component -@Scope("prototype") -@RequiredArgsConstructor -@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) -public class TitrationModule { - @Schema(description = "滴定模块code") - private MultipleModuleCode moduleCode; - - @Schema(description = "是否存在试管,true 存在 false不存在") - private boolean bubeExist = false; - -} diff --git a/src/main/java/com/iflytop/colortitration/app/core/state/TitrationModuleState.java b/src/main/java/com/iflytop/colortitration/app/core/state/TitrationModuleState.java new file mode 100644 index 0000000..34a0de5 --- /dev/null +++ b/src/main/java/com/iflytop/colortitration/app/core/state/TitrationModuleState.java @@ -0,0 +1,24 @@ +package com.iflytop.colortitration.app.core.state; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.iflytop.colortitration.app.common.enums.MultipleModuleCode; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Schema(description = "当前滴定模块状态") +@Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) +public class TitrationModuleState { + @Schema(description = "滴定模块code") + private MultipleModuleCode moduleCode; + + @Schema(description = "是否存在试管,true 存在 false不存在") + private boolean bubeExist = false; + +} diff --git a/src/main/java/com/iflytop/colortitration/app/core/state/TubeState.java b/src/main/java/com/iflytop/colortitration/app/core/state/TubeState.java index 65fbd5a..9b5b6d1 100644 --- a/src/main/java/com/iflytop/colortitration/app/core/state/TubeState.java +++ b/src/main/java/com/iflytop/colortitration/app/core/state/TubeState.java @@ -43,6 +43,9 @@ public class TubeState { @Schema(description = "可以使用的滴定模块") private List titrationModuleCodes; + @Schema(description = "当前试管工艺队列的编号") + private Integer queueNum; + public TubeState(Integer bubeNum) { this.bubeNum = bubeNum; } diff --git a/src/main/java/com/iflytop/colortitration/app/service/DeviceInitService.java b/src/main/java/com/iflytop/colortitration/app/service/DeviceInitService.java index d627fbc..67707a8 100644 --- a/src/main/java/com/iflytop/colortitration/app/service/DeviceInitService.java +++ b/src/main/java/com/iflytop/colortitration/app/service/DeviceInitService.java @@ -2,7 +2,7 @@ package com.iflytop.colortitration.app.service; import com.iflytop.colortitration.app.common.enums.MultipleModuleCode; import com.iflytop.colortitration.app.core.state.DeviceState; -import com.iflytop.colortitration.app.core.state.TitrationModule; +import com.iflytop.colortitration.app.core.state.TitrationModuleState; import com.iflytop.colortitration.hardware.service.AppEventBusService; import com.iflytop.colortitration.hardware.type.appevent.A8kCanBusOnConnectEvent; import com.iflytop.colortitration.hardware.type.appevent.AppEvent; @@ -19,7 +19,7 @@ public class DeviceInitService { private final AppEventBusService eventBus; private boolean isLink = false; private final DeviceState deviceState; - private final ObjectProvider titrationModuleObjectProvider; + private final ObjectProvider titrationModuleObjectProvider; @PostConstruct public void init() { @@ -47,10 +47,10 @@ public class DeviceInitService { public void initDeviceState() { log.info("初始化 initDeviceState"); - TitrationModule trayModule1 = titrationModuleObjectProvider.getObject(); + TitrationModuleState trayModule1 = titrationModuleObjectProvider.getObject(); trayModule1.setModuleCode(MultipleModuleCode.MODULE_1); deviceState.getTitrationModuleStateMap().put(MultipleModuleCode.MODULE_1, trayModule1); - TitrationModule trayModule2 = titrationModuleObjectProvider.getObject(); + TitrationModuleState trayModule2 = titrationModuleObjectProvider.getObject(); trayModule2.setModuleCode(MultipleModuleCode.MODULE_2); deviceState.getTitrationModuleStateMap().put(MultipleModuleCode.MODULE_2, trayModule2); log.info("初始化 initDeviceState完毕"); diff --git a/src/main/java/com/iflytop/colortitration/app/service/module/TransferModuleService.java b/src/main/java/com/iflytop/colortitration/app/service/module/TransferModuleService.java index b975165..59b7e8d 100644 --- a/src/main/java/com/iflytop/colortitration/app/service/module/TransferModuleService.java +++ b/src/main/java/com/iflytop/colortitration/app/service/module/TransferModuleService.java @@ -13,6 +13,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.concurrent.Semaphore; + /** * 转运模块 */ @@ -22,6 +24,36 @@ import org.springframework.stereotype.Service; public class TransferModuleService { private final DeviceCommandService deviceCommandService; private final PositionService positionService; + private final Semaphore armSemaphore = new Semaphore(1, true); + + /** + * 申请使用机械臂 + */ + public void requestTransferModule() { + log.info("申请使用转运机械臂"); + try { + armSemaphore.acquire(); + log.info("转运机械臂申请成功"); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new RuntimeException("等待转运机械臂空闲失败", e); + } + } + + /** + * 释放机械臂 + */ + public void releaseTransferModule() { + log.info("释放转运机械臂占用"); + armSemaphore.release(); //释放许可证 + } + + /** + * 查询机械臂是否繁忙 + */ + public boolean isTransferModuleBusy() { + return armSemaphore.availablePermits() == 0; + } /** * 机械臂回原点 @@ -63,10 +95,8 @@ public class TransferModuleService { */ public void roboticMoveToTitration(MultipleModuleCode moduleCode) throws Exception { Point3D position = switch (moduleCode) { //1、首先检测试管所在的托盘传感器的值 - case MultipleModuleCode.MODULE_1 -> - positionService.getPositionByCode(DevicePositionCode.titrationArea_1).getPoint3D(); - case MultipleModuleCode.MODULE_2 -> - positionService.getPositionByCode(DevicePositionCode.titrationArea_2).getPoint3D(); + case MultipleModuleCode.MODULE_1 -> positionService.getPositionByCode(DevicePositionCode.titrationArea_1).getPoint3D(); + case MultipleModuleCode.MODULE_2 -> positionService.getPositionByCode(DevicePositionCode.titrationArea_2).getPoint3D(); }; // Z轴回零点 DeviceCommand zOriginCommand = DeviceCommandGenerator.zMove(0.0); @@ -86,10 +116,8 @@ public class TransferModuleService { */ public void roboticMoveToHeat(MultipleModuleCode moduleCode) throws Exception { Point3D position = switch (moduleCode) { //1、首先检测试管所在的托盘传感器的值 - case MultipleModuleCode.MODULE_1 -> - positionService.getPositionByCode(DevicePositionCode.heatArea_1).getPoint3D(); - case MultipleModuleCode.MODULE_2 -> - positionService.getPositionByCode(DevicePositionCode.heatArea_2).getPoint3D(); + case MultipleModuleCode.MODULE_1 -> positionService.getPositionByCode(DevicePositionCode.heatArea_1).getPoint3D(); + case MultipleModuleCode.MODULE_2 -> positionService.getPositionByCode(DevicePositionCode.heatArea_2).getPoint3D(); }; // Z轴回零点 DeviceCommand zOriginCommand = DeviceCommandGenerator.zMove(0.0);