From d08f9091ccfad8b071ccaabcea2fb6788500f7ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Thu, 31 Jul 2025 09:34:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=89=8B=E6=9F=84=E6=8E=A7=E5=88=B6?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E5=BC=80=E5=A7=8B=E9=A2=84=E5=85=85=E3=80=81?= =?UTF-8?q?=E5=8A=A0=E6=B6=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command/control/SolutionAddStopCommand.java | 17 +----- .../control/SolutionPreFillStopCommand.java | 18 +----- .../app/core/listener/BleGamepadEventListener.java | 26 +++++++-- .../handacid/app/core/state/DeviceState.java | 22 ++++++++ .../handacid/app/service/ChannelCtrlService.java | 65 ++++++++++++++++------ 5 files changed, 91 insertions(+), 57 deletions(-) diff --git a/src/main/java/com/iflytop/handacid/app/command/control/SolutionAddStopCommand.java b/src/main/java/com/iflytop/handacid/app/command/control/SolutionAddStopCommand.java index 2490e2f..2b6685b 100644 --- a/src/main/java/com/iflytop/handacid/app/command/control/SolutionAddStopCommand.java +++ b/src/main/java/com/iflytop/handacid/app/command/control/SolutionAddStopCommand.java @@ -27,28 +27,13 @@ import java.util.concurrent.CompletableFuture; @RequiredArgsConstructor @CommandMapping("solution_add_stop") public class SolutionAddStopCommand extends BaseCommandHandler { - private final DeviceCommandService deviceCommandService; private final ChannelCtrlService channelCtrlService; - private final DeviceState deviceState; @Override public CompletableFuture handle(CommandDTO commandDTO) { return runAsync(() -> { - List channelCodeList = deviceState.filterChannelStatesByState(ChannelStateCode.ADD); - deviceState.setSolutionAddStop(true); - try { - List commandFutureList = new ArrayList<>(); - for (ChannelState channelState : channelCodeList) { - DeviceCommand deviceCommand = channelCtrlService.getPumpStopCommandByChannel(channelState.getChannelCode()); - commandFutureList.add(deviceCommandService.sendCommand(deviceCommand)); - } - CommandUtil.wait(commandFutureList); - } finally { - for (ChannelState channelCode : channelCodeList) { - channelCode.setStateCode(ChannelStateCode.IDLE); - } - } + channelCtrlService.solutionAddStop(); }); } } diff --git a/src/main/java/com/iflytop/handacid/app/command/control/SolutionPreFillStopCommand.java b/src/main/java/com/iflytop/handacid/app/command/control/SolutionPreFillStopCommand.java index 3b328c9..6373d4e 100644 --- a/src/main/java/com/iflytop/handacid/app/command/control/SolutionPreFillStopCommand.java +++ b/src/main/java/com/iflytop/handacid/app/command/control/SolutionPreFillStopCommand.java @@ -27,29 +27,13 @@ import java.util.concurrent.CompletableFuture; @RequiredArgsConstructor @CommandMapping("solution_pre_fill_stop") public class SolutionPreFillStopCommand extends BaseCommandHandler { - private final DeviceCommandService deviceCommandService; private final ChannelCtrlService channelCtrlService; - private final DeviceState deviceState; @Override public CompletableFuture handle(CommandDTO commandDTO) { return runAsync(() -> { - List channelCodeList = deviceState.filterChannelStatesByState(ChannelStateCode.PRE); - deviceState.setSolutionAddStop(true); - try { - List commandFutureList = new ArrayList<>(); - for (ChannelState channelState : channelCodeList) { - DeviceCommand deviceCommand = channelCtrlService.getPumpStopCommandByChannel(channelState.getChannelCode()); - commandFutureList.add(deviceCommandService.sendCommand(deviceCommand)); - } - CommandUtil.wait(commandFutureList); - } finally { - for (ChannelState channelCode : channelCodeList) { - channelCode.setPre(true); - channelCode.setStateCode(ChannelStateCode.IDLE); - } - } + channelCtrlService.solutionPreFillStop(); }); } } diff --git a/src/main/java/com/iflytop/handacid/app/core/listener/BleGamepadEventListener.java b/src/main/java/com/iflytop/handacid/app/core/listener/BleGamepadEventListener.java index f92bdc6..63d742b 100644 --- a/src/main/java/com/iflytop/handacid/app/core/listener/BleGamepadEventListener.java +++ b/src/main/java/com/iflytop/handacid/app/core/listener/BleGamepadEventListener.java @@ -1,5 +1,7 @@ package com.iflytop.handacid.app.core.listener; +import com.iflytop.handacid.app.core.state.DeviceState; +import com.iflytop.handacid.app.service.ChannelCtrlService; import com.iflytop.handacid.hardware.service.AppEventBusService; import com.iflytop.handacid.hardware.type.A8kPacket; import com.iflytop.handacid.hardware.type.CmdId; @@ -12,7 +14,6 @@ import org.springframework.stereotype.Component; /** * 蓝牙手柄按钮事件监听 - * */ @Component @@ -20,6 +21,8 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class BleGamepadEventListener { private final AppEventBusService eventBus; + private final ChannelCtrlService channelCtrlService; + private final DeviceState deviceState; @PostConstruct synchronized public void init() { @@ -28,23 +31,34 @@ public class BleGamepadEventListener { /** * 事件总线事件处理 + * * @param event e */ private void onAppEvent(AppEvent event) { if (event instanceof A8kHardwareReport canPacket) { A8kPacket packet = canPacket.getReportPacket(); - CmdId cmdId = CmdId.valueOf(packet.getCmdId()); + CmdId cmdId = CmdId.valueOf(packet.getCmdId()); if (CmdId.event_ble_gamepad_liquid_acid.equals(cmdId)) { //判断当前的设备状态 log.info("蓝牙手柄 加酸按钮 按下"); + if(deviceState.isSolutionAdding()){ + channelCtrlService.solutionAddStop(); + }else{ + channelCtrlService.solutionAddStart(); + } } else if (CmdId.event_ble_gamepad_liquid_acid_prefilling.equals(cmdId)) { log.info("蓝牙手柄 预充按钮 按下"); - } - else if (CmdId.event_ble_gamepad_connected.equals(cmdId)) { + if(deviceState.isSolutionPreFillStart()){ + channelCtrlService.solutionPreFillStart(); + }else{ + channelCtrlService.solutionPreFillStop(); + } + } else if (CmdId.event_ble_gamepad_connected.equals(cmdId)) { log.info("蓝牙手柄 连接成功"); - } - else if (CmdId.event_ble_gamepad_disconnected.equals(cmdId)) { + deviceState.setBluetoothConnected(true); + } else if (CmdId.event_ble_gamepad_disconnected.equals(cmdId)) { log.info("蓝牙手柄 连接断开"); + deviceState.setBluetoothConnected(false); } } diff --git a/src/main/java/com/iflytop/handacid/app/core/state/DeviceState.java b/src/main/java/com/iflytop/handacid/app/core/state/DeviceState.java index d0b67a0..54863dc 100644 --- a/src/main/java/com/iflytop/handacid/app/core/state/DeviceState.java +++ b/src/main/java/com/iflytop/handacid/app/core/state/DeviceState.java @@ -40,6 +40,9 @@ public class DeviceState { @Schema(description = "是否是急停状态,true为急停") private volatile boolean emergencyStop = false; + @Schema(description = "蓝牙是否连接") + private volatile boolean bluetoothConnected = false; + @Schema(description = "当前登录用户") private volatile User currentUser; @@ -51,6 +54,7 @@ public class DeviceState { json.putOnce("virtual", virtual); json.putOnce("initComplete", initComplete); json.putOnce("emergencyStop", emergencyStop); + json.putOnce("bluetoothConnected", bluetoothConnected); json.putOnce("currentUser", currentUser); return json; } @@ -81,4 +85,22 @@ public class DeviceState { .filter(ChannelState::isSelected) .collect(Collectors.toList()); } + + /** + * 是否正在加液 + * 如果有任何通道处于 ADD 状态 + */ + public boolean isSolutionAdding() { + return channelStateMap.values().stream() + .anyMatch(cs -> cs.getStateCode() == ChannelStateCode.ADD); + } + + /** + * 是否正在预充 + * 如果有任何通道处于 PRE 状态 + */ + public boolean isSolutionPreFillStart() { + return channelStateMap.values().stream() + .anyMatch(cs -> cs.getStateCode() == ChannelStateCode.ADD); + } } \ No newline at end of file diff --git a/src/main/java/com/iflytop/handacid/app/service/ChannelCtrlService.java b/src/main/java/com/iflytop/handacid/app/service/ChannelCtrlService.java index c2683ba..7f74e41 100644 --- a/src/main/java/com/iflytop/handacid/app/service/ChannelCtrlService.java +++ b/src/main/java/com/iflytop/handacid/app/service/ChannelCtrlService.java @@ -74,6 +74,28 @@ public class ChannelCtrlService { } /** + * 停止加液 + */ + public void solutionAddStop() { + List channelCodeList = deviceState.filterChannelStatesByState(ChannelStateCode.ADD); + deviceState.setSolutionAddStop(true); + try { + List commandFutureList = new ArrayList<>(); + for (ChannelState channelState : channelCodeList) { + DeviceCommand deviceCommand = getPumpStopCommandByChannel(channelState.getChannelCode()); + commandFutureList.add(deviceCommandService.sendCommand(deviceCommand)); + } + CommandUtil.wait(commandFutureList); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + for (ChannelState channelCode : channelCodeList) { + channelCode.setStateCode(ChannelStateCode.IDLE); + } + } + } + + /** * 开始预充 */ public void solutionPreFillStart() { @@ -96,6 +118,31 @@ public class ChannelCtrlService { } /** + * 结束预充 + */ + public void solutionPreFillStop() { + CompletableFuture.runAsync(() -> { + List channelCodeList = deviceState.filterChannelStatesByState(ChannelStateCode.PRE); + deviceState.setSolutionAddStop(true); + try { + List commandFutureList = new ArrayList<>(); + for (ChannelState channelState : channelCodeList) { + DeviceCommand deviceCommand = getPumpStopCommandByChannel(channelState.getChannelCode()); + commandFutureList.add(deviceCommandService.sendCommand(deviceCommand)); + } + CommandUtil.wait(commandFutureList); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + for (ChannelState channelCode : channelCodeList) { + channelCode.setPre(true); + channelCode.setStateCode(ChannelStateCode.IDLE); + } + } + }); + } + + /** * 根据通道code获取泵相对移动指令 */ public DeviceCommand getPumpMoveByCommandByChannel(ChannelCode channelCode, Double position) { @@ -143,23 +190,5 @@ public class ChannelCtrlService { }; } - /** - * 加液 - * - * @param channelCode 通道code - * @param volume 加液量 - */ - public void solutionAddStart(ChannelCode channelCode, Double volume) { - - } - - /** - * 停止加液 - * - * @param channelCode 通道code - */ - public void solutionAddStop(ChannelCode channelCode) { - deviceState.getChannelStateMap().get(channelCode).setStateCode(ChannelStateCode.IDLE); - } }