From 543b1e673f4c5063354379dc227cbe2613a2ae74 Mon Sep 17 00:00:00 2001 From: HSZ_HeSongZhen <210202959@qq.com> Date: Fri, 1 Aug 2025 11:07:53 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E8=93=9D=E7=89=99?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E8=8E=B7=E5=8F=96=202.=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=9D=BF=E5=8D=A1=E7=89=88=E6=9C=AC=E5=8F=B7=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iflytop/handacid/common/enums/Device.java | 1 + .../handacid/common/enums/HardwareType.java | 5 ++ .../command/handlers/BleGamepadHandler.java | 2 + .../command/handlers/HardwareBoardHandler.java | 77 ++++++++++++++++++++++ .../hardware/drivers/BleGamepadDriver.java | 14 ++++ .../com/iflytop/handacid/hardware/type/CmdId.java | 1 + 6 files changed, 100 insertions(+) create mode 100644 src/main/java/com/iflytop/handacid/hardware/command/handlers/HardwareBoardHandler.java diff --git a/src/main/java/com/iflytop/handacid/common/enums/Device.java b/src/main/java/com/iflytop/handacid/common/enums/Device.java index 1bfdf31..78e3099 100644 --- a/src/main/java/com/iflytop/handacid/common/enums/Device.java +++ b/src/main/java/com/iflytop/handacid/common/enums/Device.java @@ -12,6 +12,7 @@ public enum Device { VALVE_3(HardwareType.IO_DEVICE, "阀 3"), VALVE_4(HardwareType.IO_DEVICE, "阀 4"), BLE_GAMEPAD(HardwareType.IO_DEVICE, "蓝牙手柄"), + HARDWARE_BOARD(HardwareType.HARDWARE_BOARD, "硬件主板"), ; /** diff --git a/src/main/java/com/iflytop/handacid/common/enums/HardwareType.java b/src/main/java/com/iflytop/handacid/common/enums/HardwareType.java index a618b14..45deb7e 100644 --- a/src/main/java/com/iflytop/handacid/common/enums/HardwareType.java +++ b/src/main/java/com/iflytop/handacid/common/enums/HardwareType.java @@ -17,6 +17,11 @@ public enum HardwareType { * IO 控制(阀门、风扇、加热器等) */ IO_DEVICE, + + /** + * 硬件板卡 (获取板卡信息) + */ + HARDWARE_BOARD, /** * 相机 */ diff --git a/src/main/java/com/iflytop/handacid/hardware/command/handlers/BleGamepadHandler.java b/src/main/java/com/iflytop/handacid/hardware/command/handlers/BleGamepadHandler.java index fc48611..95010b6 100644 --- a/src/main/java/com/iflytop/handacid/hardware/command/handlers/BleGamepadHandler.java +++ b/src/main/java/com/iflytop/handacid/hardware/command/handlers/BleGamepadHandler.java @@ -57,9 +57,11 @@ public class BleGamepadHandler extends CommandHandler { if (command.getAction() == Action.GET) { Double power = driver_.get_power_state(bleGamepadMid); Boolean is_connected = driver_.is_connected(bleGamepadMid); + String name = driver_.get_ble_name(bleGamepadMid); result = new HashMap() {{ put("power", power); put("is_connected", is_connected); + put("name", name); }}; } return result; diff --git a/src/main/java/com/iflytop/handacid/hardware/command/handlers/HardwareBoardHandler.java b/src/main/java/com/iflytop/handacid/hardware/command/handlers/HardwareBoardHandler.java new file mode 100644 index 0000000..23aadc3 --- /dev/null +++ b/src/main/java/com/iflytop/handacid/hardware/command/handlers/HardwareBoardHandler.java @@ -0,0 +1,77 @@ +package com.iflytop.handacid.hardware.command.handlers; + +import com.iflytop.handacid.app.core.command.DeviceCommand; +import com.iflytop.handacid.common.enums.Action; +import com.iflytop.handacid.common.enums.Device; +import com.iflytop.handacid.hardware.comm.can.A8kCanBusService; +import com.iflytop.handacid.hardware.command.CommandHandler; +import com.iflytop.handacid.hardware.drivers.BleGamepadDriver; +import com.iflytop.handacid.hardware.exception.HardwareException; +import com.iflytop.handacid.hardware.type.BleGamepadMid; +import com.iflytop.handacid.hardware.type.MId; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +// + +@Slf4j +@Component +@RequiredArgsConstructor +public class HardwareBoardHandler extends CommandHandler { + private final A8kCanBusService canBus; + + private final Map supportCmdDeviceMIdMap = Map.ofEntries( + Map.entry(Device.HARDWARE_BOARD, MId.IO1Board) + ); + + private final Set supportActions = Set.of(Action.GET); + + @Override + protected Map getSupportCmdDeviceMIdMap() + { + return supportCmdDeviceMIdMap; + } + + @Override + protected Set getSupportActions() { + return supportActions; + } + + @Override + public Object handleCommand(DeviceCommand command) throws Exception { + // 发送命令 + Object result = null; + Device device = command.getDevice(); + if (!getSupportCmdDeviceMIdMap().containsKey(device)) { + throw new IllegalArgumentException("Device " + device + " not supported by BleGamepadHandler"); + } + + if (command.getAction() == Action.GET) + { + String io_board_version = get_version(MId.IO1Board); + String acid_board_version = get_version(MId.HandAcidBoard); + result = new HashMap() + {{ + put("io_board", io_board_version); + put("acid_board", acid_board_version); + }}; + } + return result; + } + + public String get_version(MId id) throws HardwareException { + Integer verNum = canBus.moduleReadVersion(id); + // 版本号格式为:主版本号.次版本号.修订号 eg.1.0.0 + String version = String.format("%d.%d.%d", (verNum / 100000) % 1000, (verNum / 100) % 1000, verNum % 100); + log.info("mid: {}, version: {}",id.getDescription(), version); + return version; + } + + +} diff --git a/src/main/java/com/iflytop/handacid/hardware/drivers/BleGamepadDriver.java b/src/main/java/com/iflytop/handacid/hardware/drivers/BleGamepadDriver.java index 551d755..6550343 100644 --- a/src/main/java/com/iflytop/handacid/hardware/drivers/BleGamepadDriver.java +++ b/src/main/java/com/iflytop/handacid/hardware/drivers/BleGamepadDriver.java @@ -29,4 +29,18 @@ public class BleGamepadDriver { Double powerPercent = (double) power; return powerPercent; } + + public String get_ble_name(BleGamepadMid id) throws HardwareException { + A8kPacket packet = canBus.callcmd(id.mid, CmdId.ble_gamepad_name); + byte[] content = packet.getCmdContent(); + // content to String + String name = new String(content).trim(); + if (name.isEmpty()) { + name = "Unknown Gamepad"; + } else if (name.length() > 20) { + name = name.substring(0, 20); // 截断到20个字符 + } + log.info("ble name: {}", name); + return name; + } } \ No newline at end of file diff --git a/src/main/java/com/iflytop/handacid/hardware/type/CmdId.java b/src/main/java/com/iflytop/handacid/hardware/type/CmdId.java index e74c411..fa49db3 100644 --- a/src/main/java/com/iflytop/handacid/hardware/type/CmdId.java +++ b/src/main/java/com/iflytop/handacid/hardware/type/CmdId.java @@ -124,6 +124,7 @@ public enum CmdId { event_ble_gamepad_disconnected(0x5904, "EVENT_BLE_GAMEPAD_DISCONNECTED"), ble_gamepad_is_connected(0x5905, "BLE_GAMEPAD_IS_CONNECTED"), ble_gamepad_power_info(0x5906, "BLE_GAMEPAD_POWER_INFO"), + ble_gamepad_name(0x5907, "BLE_GAMEPAD_NAME"), ; public final static int ATTACH_IS_BYTES = 1;