diff --git a/src/main/java/a8k/app_eventbus/AppEventBusService.java b/src/main/java/a8k/app_eventbus/AppEventBusService.java index 7448d6f..23ee31a 100644 --- a/src/main/java/a8k/app_eventbus/AppEventBusService.java +++ b/src/main/java/a8k/app_eventbus/AppEventBusService.java @@ -5,34 +5,33 @@ import a8k.app_eventbus.appevent.AppEvent; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @Component -public class AppEventBusService { +public class AppEventBusService implements ApplicationListener { public static final Logger logger = LoggerFactory.getLogger(AppEventBusService.class); Thread eventProcessorThread; - BlockingQueue eventQueue; - List listeners; + BlockingQueue eventQueue = new LinkedBlockingQueue<>(); + List listeners = new ArrayList<>(); @PostConstruct public void init() { - eventQueue = new LinkedBlockingQueue(); - eventProcessorThread = new Thread(new Runnable() { - public void run() { - eventBusSchedule(); - } - }); + } public void regListener(AppEventListener listener) { listeners.add(listener); } + public void pushEvent(AppEvent event) { logger.info("pushEvent: {}", event); eventQueue.add(event); @@ -42,6 +41,7 @@ public class AppEventBusService { while (!Thread.currentThread().isInterrupted()) { try { AppEvent event = eventQueue.take(); + callOnEvent(event); } catch (InterruptedException ignored) { } } @@ -53,4 +53,18 @@ public class AppEventBusService { listener.onAppEvent(event); } } + + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + logger.info("Spring context refreshed"); + if (eventProcessorThread == null) { + eventProcessorThread = new Thread(new Runnable() { + public void run() { + logger.info("Starting event bus schedule"); + eventBusSchedule(); + } + }); + eventProcessorThread.start(); + } + } } diff --git a/src/main/java/a8k/app_eventbus/appevent/A8kCanBusOnConnectEvent.java b/src/main/java/a8k/app_eventbus/appevent/A8kCanBusOnConnectEvent.java new file mode 100644 index 0000000..5f3cd88 --- /dev/null +++ b/src/main/java/a8k/app_eventbus/appevent/A8kCanBusOnConnectEvent.java @@ -0,0 +1,6 @@ +package a8k.app_eventbus.appevent; + +public class A8kCanBusOnConnectEvent extends AppEvent { + public A8kCanBusOnConnectEvent() { + } +} diff --git a/src/main/java/a8k/canbus/A8kCanBusService.java b/src/main/java/a8k/canbus/A8kCanBusService.java index 915d403..8530b39 100644 --- a/src/main/java/a8k/canbus/A8kCanBusService.java +++ b/src/main/java/a8k/canbus/A8kCanBusService.java @@ -1,5 +1,7 @@ package a8k.canbus; +import a8k.app_eventbus.appevent.A8kCanBusOnConnectEvent; +import a8k.canbus.custom_param_mgr.A8kModCustomParamMgr; import a8k.canbus.protocol.*; import a8k.canbus.protocol.MId; import a8k.appbean.HardwareException; @@ -8,12 +10,12 @@ import a8k.app_eventbus.appevent.A8kHardwareReport; import a8k.app_eventbus.AppEventBusService; import a8k.utils.ByteArray; import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.java_websocket.client.WebSocketClient; import org.java_websocket.enums.ReadyState; import org.java_websocket.handshake.ServerHandshake; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.net.URI; @@ -53,8 +55,11 @@ public class A8kCanBusService { * */ - @Autowired - private AppEventBusService eventBusService; + @Resource + private AppEventBusService eventBus; + + @Resource + private A8kModCustomParamMgr customParamMgr; public String uri; // assign by application.yml private WebSocketClient client; @@ -89,7 +94,8 @@ public class A8kCanBusService { client = new WebSocketClient(uri) { @Override public void onOpen(ServerHandshake serverHandshake) { - logger.info("onOpen"); + logger.info("a8k canbus connect sucess"); + eventBus.pushEvent(new A8kCanBusOnConnectEvent()); } @Override @@ -99,7 +105,7 @@ public class A8kCanBusService { @Override public void onClose(int i, String s, boolean b) { - logger.info("onClose"); + logger.warn("a8k canbus lost connection..."); } @Override @@ -118,7 +124,7 @@ public class A8kCanBusService { client.connect(); } catch (IllegalStateException e) { } - } else if (client.getReadyState().equals(ReadyState.CLOSING) || client.getReadyState().equals(ReadyState.CLOSED)) { + } else if (client.getReadyState().equals(ReadyState.CLOSED)) { client.reconnect(); } } @@ -126,6 +132,10 @@ public class A8kCanBusService { }, 0, 1000); } + public void forceShutdown() { + client.close(); + } + private A8kPacket packParamsToPacket(Integer moduleId, Integer cmdId, Integer[] params) { int subCmdId = cmdId & 0xFF; @@ -654,9 +664,7 @@ public class A8kCanBusService { } if (packet.getPacketType() == A8kPacket.PACKET_TYPE_EVENT) { - if (eventBusService != null) { - eventBusService.pushEvent(new A8kHardwareReport(packet)); - } + eventBus.pushEvent(new A8kHardwareReport(packet)); } } diff --git a/src/main/java/a8k/canbus/A8kModParamInitializer.java b/src/main/java/a8k/canbus/A8kModParamInitializer.java index f60f2d7..98c836b 100644 --- a/src/main/java/a8k/canbus/A8kModParamInitializer.java +++ b/src/main/java/a8k/canbus/A8kModParamInitializer.java @@ -1,16 +1,90 @@ package a8k.canbus; +import a8k.app_eventbus.AppEventBusService; +import a8k.app_eventbus.appevent.A8kCanBusOnConnectEvent; +import a8k.app_eventbus.appevent.AppEvent; +import a8k.appbean.AppEventListener; +import a8k.appbean.HardwareException; +import a8k.canbus.custom_param_mgr.ModCustomParamId; +import a8k.canbus.custom_param_mgr.A8kModCustomParamMgr; +import a8k.canbus.protocol.MId; +import a8k.canbus.protocol.RegIndex; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component -public class A8kModParamInitializer { +public class A8kModParamInitializer implements AppEventListener { static Logger logger = LoggerFactory.getLogger(A8kModParamInitializer.class); + @Resource + AppEventBusService eventBus; + + @Resource + A8kCanBusService canBus; + + @Resource + A8kModCustomParamMgr customParamMgr; + + @PostConstruct public void init() { logger.info("A8kModInitializer init"); + eventBus.regListener(this); } + public void initA8kCustcomParams() { + customParamMgr.setCustomParam(MId.FeedingModXM, ModCustomParamId.MOTOR_STANDY_POS_COMPENSATE, -10); + customParamMgr.setCustomParam(MId.ShakeModGripperZM, ModCustomParamId.MOTOR_STANDY_POS_COMPENSATE, -10); + customParamMgr.setCustomParam(MId.ShakeModClampingM, ModCustomParamId.MOTOR_STANDY_POS_COMPENSATE, -10); + } + + public void initA8kModParams() throws HardwareException { + /* + * 设置位置偏差容忍度 + * 1.如果电机配置有编码器器,则每次调用moveBy,moveTo都会进行位置检查 + * 2.如果电机没有配备编码,则每次调用moveQuickToZeroPoint,都会进行一次位置检查 + */ + canBus.moduleSetReg(MId.FeedingModXM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.ShakeModClampingM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.ShakeModGripperZM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.ShakeModShakeM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.OptModPullM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.PipetteModZM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.IncubatorRotateCtrlM, RegIndex.kret_step_motor_pos_devi_tolerance, 5); + canBus.moduleSetReg(MId.FeedingModXM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.ShakeModClampingM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.ShakeModGripperZM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.ShakeModShakeM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.PlatesBoxYM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.PlatesBoxPusherM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.OptModPullM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.PipetteModZM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + canBus.moduleSetReg(MId.IncubatorRotateCtrlM, RegIndex.kret_step_motor_io_trigger_append_distance, 10); + } + + public void forceInitA8kModParams() { + try { + logger.info("forceInitA8kModParams"); + initA8kModParams(); + } catch (HardwareException e) { + logger.error("init hardware param fail......", e); + //TODO:校验这里的逻辑 + canBus.forceShutdown(); + } + } + + + @Override + public void onAppEvent(AppEvent event) { + if (event instanceof A8kCanBusOnConnectEvent) { + forceInitA8kModParams(); + } + } } diff --git a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java index 484cde6..b9f3f2c 100644 --- a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java +++ b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java @@ -1,7 +1,10 @@ package a8k.canbus.custom_param_mgr; +import a8k.canbus.protocol.MId; + public class A8kModCustomParam { - public A8kModCustomParamId id; - public Integer value; + MId mid; + public ModCustomParamId id; + public Integer value; } diff --git a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java index 3b703f3..b8ad602 100644 --- a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java +++ b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java @@ -1,25 +1,35 @@ package a8k.canbus.custom_param_mgr; +import a8k.canbus.protocol.MId; import org.springframework.stereotype.Component; -import java.util.Map; +import java.util.Set; @Component public class A8kModCustomParamMgr { - Map customParamMap; + Set customParamSet; - public Integer getCustomParam(A8kModCustomParamId id) { - var vaule = customParamMap.get(id); - if (vaule != null) { - return vaule.value; - } else { - return id.defaultVal; + public Integer getCustomParam(MId mid, ModCustomParamId id) { + for (A8kModCustomParam param : customParamSet) { + if (param.mid == mid && param.id == id) { + return param.value; + } } - + return id.defaultVal; } - public void setCustomParam(A8kModCustomParam param) { - customParamMap.put(param.id, param); + public void setCustomParam(MId mid, ModCustomParamId id, Integer val) { + for (A8kModCustomParam param : customParamSet) { + if (param.mid == mid && param.id == id) { + param.value = val; + return; + } + } + A8kModCustomParam param = new A8kModCustomParam(); + param.mid = mid; + param.id = id; + param.value = val; + customParamSet.add(param); } } diff --git a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java b/src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java similarity index 78% rename from src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java rename to src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java index e4efea0..d6aa240 100644 --- a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java +++ b/src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java @@ -1,13 +1,13 @@ package a8k.canbus.custom_param_mgr; -public enum A8kModCustomParamId { +public enum ModCustomParamId { MOTOR_STANDY_POS_COMPENSATE("电机待机位置零点补偿"),//待机位置 = 零点- 零点补偿 ; public final String desc; public final Integer defaultVal; - A8kModCustomParamId(String desc) { + ModCustomParamId(String desc) { this.desc = desc; this.defaultVal = 0; } diff --git a/src/main/java/a8k/canbus/protocol/RegIndex.java b/src/main/java/a8k/canbus/protocol/RegIndex.java index b9f8514..72c0bf6 100644 --- a/src/main/java/a8k/canbus/protocol/RegIndex.java +++ b/src/main/java/a8k/canbus/protocol/RegIndex.java @@ -140,6 +140,9 @@ public enum RegIndex { kreg_step_motor_enc_resolution(10189), // 编码器分辨率 1000,1024,4000,4096,16384 kreg_step_motor_enable_enc(10190), // kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式 + kret_step_motor_pos_devi_tolerance(10192), // 位置偏差容忍度 + kret_step_motor_io_trigger_append_distance(10193), // 移动到io时,附加的距离 + /*********************************************************************************************************************** * step_motor *