Browse Source

设备初始化调整,增加重试与ws链接成狗回调

master
白凤吉 2 months ago
parent
commit
8507561d8b
  1. 14
      src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java
  2. 93
      src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java
  3. 15
      src/main/java/com/iflytop/gd/hardware/comm/can/A8kCanBusConnection.java
  4. 137
      src/main/java/com/iflytop/gd/hardware/service/setup/A8kSubModuleRegInitService.java
  5. 86
      src/main/java/com/iflytop/gd/hardware/service/setup/SubModuleRegInitialValueMgrService.java

14
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();

93
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<HeatModuleState> heatModuleStateProvider;
private final ObjectProvider<SolutionContainerState> 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<DeviceParamConfig> 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();

15
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();
}
}

137
src/main/java/com/iflytop/gd/hardware/service/setup/A8kSubModuleRegInitService.java

@ -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<RegIndex> 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("=");
}
}
}

86
src/main/java/com/iflytop/gd/hardware/service/setup/SubModuleRegInitialValueMgrService.java

@ -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<SubModuleRegInitialValue> regcache = List.of();
for (MId mid : MId.values()) {
if (mid == MId.NotSet)
continue;
ModuleType moduleType = canBus.moduleReadType(mid);
List<RegIndex> 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<SubModuleRegInitialValue> getAll() {
return subModuleRegInitialValueDao.getAll();
}
public SubModuleRegInitialValue findByIDAndRegIndex(MId mid, RegIndex regIndex) {
return subModuleRegInitialValueDao.findByIDAndRegIndex(mid, regIndex);
}
}
Loading…
Cancel
Save