From 8507561d8bc9743c7f9089a84b639640aad51be8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Wed, 11 Jun 2025 13:38:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E4=B8=8Ews=E9=93=BE=E6=8E=A5=E6=88=90=E7=8B=97=E5=9B=9E?= =?UTF-8?q?=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/GraphiteDigesterServiceApplication.java | 14 +-- .../gd/app/service/device/DeviceInitService.java | 93 +++++++------- .../gd/hardware/comm/can/A8kCanBusConnection.java | 15 ++- .../service/setup/A8kSubModuleRegInitService.java | 137 --------------------- .../setup/SubModuleRegInitialValueMgrService.java | 86 ------------- 5 files changed, 71 insertions(+), 274 deletions(-) delete mode 100644 src/main/java/com/iflytop/gd/hardware/service/setup/A8kSubModuleRegInitService.java delete mode 100644 src/main/java/com/iflytop/gd/hardware/service/setup/SubModuleRegInitialValueMgrService.java diff --git a/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java b/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java index b03c04d..cf776ea 100644 --- a/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java +++ b/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java @@ -15,13 +15,13 @@ public class GraphiteDigesterServiceApplication { public static void main(String[] args) { SpringApplication app = new SpringApplication(GraphiteDigesterServiceApplication.class); - app.addInitializers(ctx -> { - try { - Thread.sleep(0); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } - }); +// app.addInitializers(ctx -> { +// try { +// Thread.sleep(0); +// } catch (InterruptedException e) { +// Thread.currentThread().interrupt(); +// } +// }); ConfigurableApplicationContext ctx = app.run(args); ConfigurableEnvironment env = ctx.getEnvironment(); diff --git a/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java b/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java index c038586..f04807e 100644 --- a/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java +++ b/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java @@ -21,6 +21,7 @@ import com.iflytop.gd.hardware.drivers.MiniServoDriver.MiniServoDriver; import com.iflytop.gd.hardware.drivers.StepMotorDriver.StepMotorCtrlDriver; import com.iflytop.gd.hardware.drivers.TricolorLightDriver; import com.iflytop.gd.hardware.exception.HardwareException; +import com.iflytop.gd.hardware.service.AppEventBusService; import com.iflytop.gd.hardware.type.CmdId; import com.iflytop.gd.hardware.type.IO.OutputIOMId; import com.iflytop.gd.hardware.type.MId; @@ -29,6 +30,8 @@ import com.iflytop.gd.hardware.type.Servo.LeisaiServoMId; import com.iflytop.gd.hardware.type.Servo.LiquidArmMId; import com.iflytop.gd.hardware.type.Servo.MiniServoMId; import com.iflytop.gd.hardware.type.StepMotor.StepMotorMId; +import com.iflytop.gd.hardware.type.appevent.A8kCanBusOnConnectEvent; +import com.iflytop.gd.hardware.type.appevent.AppEvent; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -55,38 +58,45 @@ public class DeviceInitService { private final DeviceParamConfigService deviceParamConfigService; private final ObjectProvider heatModuleStateProvider; private final ObjectProvider solutionContainerStateProvider; + private final AppEventBusService eventBus; @PostConstruct public void init() { - new Thread(() -> { - try { - log.info("初始化开始"); - CompletableFuture.runAsync(() -> { + eventBus.regListener(this::onAppEvent); + } + + private void onAppEvent(AppEvent event) { + if (event instanceof A8kCanBusOnConnectEvent) { + new Thread(() -> { + try { + log.info("初始化开始"); + CompletableFuture.runAsync(() -> { + try { + tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.BLUE); + } catch (HardwareException e) { + log.error("设备初始化灯光失败,Color.BLUE", e); + } + }); + initDeviceState(); + initDeviceSetData(); + initOvertime(); + initEnable(); try { - tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.BLUE); + tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.GREEN); } catch (HardwareException e) { - log.error("设备初始化灯光失败,Color.BLUE", e); + log.error("设备初始化灯光失败,Color.GREEN", e); } - }); - initDeviceState(); - initDeviceSetData(); - initOvertime(); - initEnable(); - try { - tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.GREEN); - } catch (HardwareException e) { - log.error("设备初始化灯光失败,Color.GREEN", e); - } - deviceStateService.getDeviceState().setInitComplete(true); - log.info("初始化完毕"); - } catch (Exception e) { - try { - tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.RED); - } catch (Exception ignored) { + deviceStateService.getDeviceState().setInitComplete(true); + log.info("初始化完毕"); + } catch (Exception e) { + try { + tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.RED); + } catch (Exception ignored) { + } + log.error("设备初始化失败", e); } - log.error("设备初始化失败", e); - } - }).start(); + }).start(); + } } /** @@ -142,28 +152,27 @@ public class DeviceInitService { log.info("初始化 initDeviceSetData"); //从数据库中读取数据通过串口进行数据初始化 List deviceParamConfigs = deviceParamConfigService.list(); - try { - for (DeviceParamConfig deviceParamConfig : deviceParamConfigs) { - DeviceInitializationData data = new DeviceInitializationData(); - data.setId(Math.toIntExact(deviceParamConfig.getId())); - data.setMid(deviceParamConfig.getMid()); - data.setRegIndex(deviceParamConfig.getRegIndex()); - data.setRegInitVal(deviceParamConfig.getRegVal()); - log.info("初始化 initDeviceSetData: {}", JSONUtil.toJsonStr(data)); - sendToDevice(data); + for (DeviceParamConfig deviceParamConfig : deviceParamConfigs) { + DeviceInitializationData data = new DeviceInitializationData(); + data.setId(Math.toIntExact(deviceParamConfig.getId())); + data.setMid(deviceParamConfig.getMid()); + data.setRegIndex(deviceParamConfig.getRegIndex()); + data.setRegInitVal(deviceParamConfig.getRegVal()); + log.info("初始化 initDeviceSetData: {}", JSONUtil.toJsonStr(data)); + boolean success = false; // 标记是否执行成功 + while (!success) { + try { + canBusService.moduleSetReg(MId.valueOf(data.getMid()), RegIndex.valueOf(data.getRegIndex()), data.getRegInitVal()); + success = true; + } catch (Exception e) { + log.error("设备初始化写入参数失败,错误: {}", e.getMessage()); + Thread.sleep(2000); + } } - } catch (Exception e) { - log.error("设备初始化写入参数失败,2秒后重试", e); - Thread.sleep(2000); - initDeviceSetData(); } log.info("初始化 initDeviceSetData完毕"); } - public void sendToDevice(DeviceInitializationData data) throws Exception { - canBusService.moduleSetReg(MId.valueOf(data.getMid()), RegIndex.valueOf(data.getRegIndex()), data.getRegInitVal()); - } - public void initDeviceState() { log.info("初始化 initDeviceState"); DeviceState deviceState = deviceStateService.getDeviceState(); diff --git a/src/main/java/com/iflytop/gd/hardware/comm/can/A8kCanBusConnection.java b/src/main/java/com/iflytop/gd/hardware/comm/can/A8kCanBusConnection.java index 47acfa0..c777611 100644 --- a/src/main/java/com/iflytop/gd/hardware/comm/can/A8kCanBusConnection.java +++ b/src/main/java/com/iflytop/gd/hardware/comm/can/A8kCanBusConnection.java @@ -4,7 +4,10 @@ import com.iflytop.gd.common.utils.ByteArray; import com.iflytop.gd.hardware.exception.HardwareException; import com.iflytop.gd.hardware.factory.A8kPacketFactory; import com.iflytop.gd.hardware.service.AppEventBusService; -import com.iflytop.gd.hardware.type.*; +import com.iflytop.gd.hardware.type.A8kPacket; +import com.iflytop.gd.hardware.type.CmdId; +import com.iflytop.gd.hardware.type.MId; +import com.iflytop.gd.hardware.type.ModuleStatus; import com.iflytop.gd.hardware.type.appevent.A8kCanBusOnConnectEvent; import com.iflytop.gd.hardware.type.error.A8kEcode; import com.iflytop.gd.hardware.type.error.AEHardwareError; @@ -180,7 +183,7 @@ public class A8kCanBusConnection extends WebSocketClient { // // PRIVATE // - @Scheduled(fixedRate = 10000) + @Scheduled(fixedRate = 2000) private void autoConnect() { if (!enableCanBus) return; @@ -188,10 +191,18 @@ public class A8kCanBusConnection extends WebSocketClient { if (!isOpen()) { if (getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { try { + log.warn("canbus connect ..."); connect(); + log.warn("canbus connect success"); } catch (IllegalStateException ignored) { + log.warn("a8k canbus connect failed, maybe already connected"); + } catch (Exception e) { + log.error("a8k canbus connect error", e); + // 连接失败,等待重试 + return; } } else if (getReadyState().equals(ReadyState.CLOSED)) { + log.warn("a8k canbus connection closed, try to reconnect"); reconnect(); } } diff --git a/src/main/java/com/iflytop/gd/hardware/service/setup/A8kSubModuleRegInitService.java b/src/main/java/com/iflytop/gd/hardware/service/setup/A8kSubModuleRegInitService.java deleted file mode 100644 index 0da6774..0000000 --- a/src/main/java/com/iflytop/gd/hardware/service/setup/A8kSubModuleRegInitService.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.iflytop.gd.hardware.service.setup; - -import com.iflytop.gd.hardware.comm.can.A8kCanBusService; -import com.iflytop.gd.hardware.config.A8kSubModuleInitRegConfig; -import com.iflytop.gd.hardware.drivers.ModuleEnableCtrlDriver; -import com.iflytop.gd.hardware.exception.HardwareException; -import com.iflytop.gd.hardware.service.AppEventBusService; -import com.iflytop.gd.hardware.type.MId; -import com.iflytop.gd.hardware.type.ModuleType; -import com.iflytop.gd.hardware.type.RegIndex; -import com.iflytop.gd.hardware.type.appevent.A8kCanBusOnConnectEvent; -import com.iflytop.gd.hardware.type.appevent.AppEvent; -import com.iflytop.gd.hardware.type.db.SubModuleRegInitialValue; -import com.iflytop.gd.hardware.utils.OS; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 子设备寄存器初始化服务 - */ - -@Component -@Slf4j -@RequiredArgsConstructor -public class A8kSubModuleRegInitService { - private final A8kCanBusService canBus; - private final ModuleEnableCtrlDriver moduleEnableCtrlDriver; - private final AppEventBusService eventBus; - private final A8kSubModuleInitRegConfig a8kSubModuleInitRegConfig; - private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; - private Boolean isInited = false; - - @PostConstruct - void init() { - eventBus.regListener(this::onAppEvent); - } - - public synchronized boolean getIsInited() { - return isInited; - } - - - private void onAppEvent(AppEvent event) { - if (event instanceof A8kCanBusOnConnectEvent) { - var initThread = new Thread(this::initModuleRegVal); - initThread.setName("initModuleRegVal"); - initThread.start(); - } - } - - private void initModuleRegVal() { - do { -// try { - log.info("forceInitA8kModParams"); - dumpAllSubBoardVersion(); -// initA8kModParams(); - isInited = true; - - log.info("======================================================"); - log.info("= init hardware param success...... ="); - log.info("======================================================"); - break; -// } catch (HardwareException e) { -// log.error("init hardware param fail......, try init it after 5s", e); -// } - } while (false); - } - - private void dumpAllSubBoardVersion() { - log.info("======================================================="); - log.info("= dump all sub board version...... ="); - log.info("="); - - boolean hasDiffVersion = false; - Integer maxVersion = null; - for (MId mid : MId.values()) { - if (mid == MId.NotSet) { - continue; - } - try { - if (!canBus.ping(mid)) { - log.error(String.format("+ %-40s(%d): offline", mid, mid.index)); - continue; - } - - Integer ver = canBus.moduleReadVersion(mid); - String moduleType = canBus.moduleReadType(mid).toString(); - if (maxVersion != null && !maxVersion.equals(ver)) { - hasDiffVersion = true; - } - if (maxVersion == null || ver > maxVersion) { - maxVersion = ver; - } - log.info(String.format("+ %-40s(%d): type:%-20s version:%s", mid, mid.index, moduleType, ver)); - } catch (HardwareException e) { - log.error(String.format("+ %20s(%d): offline", mid, mid.index)); - - } - } - - if (!hasDiffVersion) { - // gStateMgrService.setMcuVersion(String.format("V%04d", maxVersion)); - } else { - //版本不一致,标记为(*),表示需要升级 - // gStateMgrService.setMcuVersion(String.format("V%04d(*)", maxVersion)); - } - } - - - private void initA8kModParams() throws HardwareException { - for (MId mid : MId.values()) { - if (mid == MId.NotSet) - continue; - - log.info("============== {}({}) ===============", mid, mid.index); - - ModuleType moduleType = canBus.moduleReadType(mid); - List regIndexes = a8kSubModuleInitRegConfig.findRegIndexByModuleType(moduleType); - - for (RegIndex regIndex : regIndexes) { - SubModuleRegInitialValue val = subModuleRegInitialValueMgrService.findByIDAndRegIndex(mid, regIndex); - if (val == null) - continue; - - log.info(String.format("= init %s(%d) %-45s: %d", mid, mid.index, regIndex, val.regInitVal)); - canBus.moduleSetReg(mid, regIndex, val.regInitVal); - } - log.info("="); - } - } - - -} diff --git a/src/main/java/com/iflytop/gd/hardware/service/setup/SubModuleRegInitialValueMgrService.java b/src/main/java/com/iflytop/gd/hardware/service/setup/SubModuleRegInitialValueMgrService.java deleted file mode 100644 index a073704..0000000 --- a/src/main/java/com/iflytop/gd/hardware/service/setup/SubModuleRegInitialValueMgrService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.iflytop.gd.hardware.service.setup; - - -import com.iflytop.gd.hardware.comm.can.A8kCanBusService; -import com.iflytop.gd.hardware.config.A8kSubModuleInitRegConfig; -import com.iflytop.gd.hardware.dao.SubModuleRegInitialValueDao; -import com.iflytop.gd.hardware.exception.HardwareException; -import com.iflytop.gd.hardware.type.MId; -import com.iflytop.gd.hardware.type.ModuleType; -import com.iflytop.gd.hardware.type.RegIndex; -import com.iflytop.gd.hardware.type.db.SubModuleRegInitialValue; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.List; - - -@Component -@Slf4j -@RequiredArgsConstructor -public class SubModuleRegInitialValueMgrService { - - private final SubModuleRegInitialValueDao subModuleRegInitialValueDao; - private final A8kCanBusService canBus; - private final A8kSubModuleInitRegConfig a8kSubModuleInitRegConfig; - - - /** - * 从微控制器同步寄存器值到数据库 - * @throws HardwareException e - */ - public void syncFromMirco() throws HardwareException { - List regcache = List.of(); - for (MId mid : MId.values()) { - if (mid == MId.NotSet) - continue; - - ModuleType moduleType = canBus.moduleReadType(mid); - List regIndexes = a8kSubModuleInitRegConfig.findRegIndexByModuleType(moduleType); - - for (RegIndex regIndex : regIndexes) { - log.info("read {}({})-{}", mid, mid.index, regIndex); - Integer val = canBus.moduleGetReg(mid, regIndex); - regcache.add(new SubModuleRegInitialValue(mid, regIndex, val)); - } - } - for (SubModuleRegInitialValue reg : regcache) { - log.info(String.format("storage %s(%d) %-40s: %d", reg.mid, reg.mid.index, reg.regIndex, reg.regInitVal)); - subModuleRegInitialValueDao.update(reg.mid, reg.regIndex, reg.regInitVal); - } - - // - // 删除掉不需要的寄存器 - // - var allConfigs = subModuleRegInitialValueDao.getAll(); - for (SubModuleRegInitialValue reg : allConfigs) { - //TODO:模块类型存储到数据库中,而不是从微控制器读取 - ModuleType moduleType = canBus.moduleReadType(reg.mid); - if (!a8kSubModuleInitRegConfig.isNeeded(moduleType, reg.regIndex)) { - subModuleRegInitialValueDao.delete(reg.id); - } - } - } - - public void export() { - subModuleRegInitialValueDao.export(); - } - - public String getExportPath() { - return subModuleRegInitialValueDao.getExportPATH(); - } - - public void importFromCSV(String filecontent) { - subModuleRegInitialValueDao.importFromCSV(filecontent, true); - } - - public List getAll() { - return subModuleRegInitialValueDao.getAll(); - } - - public SubModuleRegInitialValue findByIDAndRegIndex(MId mid, RegIndex regIndex) { - return subModuleRegInitialValueDao.findByIDAndRegIndex(mid, regIndex); - } - -}