From 73b205f919eb0c3fabe46bdc266d17ca01a7796e Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 25 Jul 2024 13:08:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E5=9D=97=E5=AF=84?= =?UTF-8?q?=E5=AD=98=E5=99=A8=E5=88=9D=E5=A7=8B=E5=8C=96=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/a8k/app_eventbus/AppEventBusService.java | 32 ++++++--- .../appevent/A8kCanBusOnConnectEvent.java | 6 ++ src/main/java/a8k/canbus/A8kCanBusService.java | 26 +++++--- .../java/a8k/canbus/A8kModParamInitializer.java | 76 +++++++++++++++++++++- .../canbus/custom_param_mgr/A8kModCustomParam.java | 7 +- .../custom_param_mgr/A8kModCustomParamId.java | 14 ---- .../custom_param_mgr/A8kModCustomParamMgr.java | 32 +++++---- .../canbus/custom_param_mgr/ModCustomParamId.java | 14 ++++ src/main/java/a8k/canbus/protocol/RegIndex.java | 3 + 9 files changed, 164 insertions(+), 46 deletions(-) create mode 100644 src/main/java/a8k/app_eventbus/appevent/A8kCanBusOnConnectEvent.java delete mode 100644 src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java create mode 100644 src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java 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/A8kModCustomParamId.java b/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java deleted file mode 100644 index e4efea0..0000000 --- a/src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java +++ /dev/null @@ -1,14 +0,0 @@ -package a8k.canbus.custom_param_mgr; - -public enum A8kModCustomParamId { - - MOTOR_STANDY_POS_COMPENSATE("电机待机位置零点补偿"),//待机位置 = 零点- 零点补偿 - ; - public final String desc; - public final Integer defaultVal; - - A8kModCustomParamId(String desc) { - this.desc = desc; - this.defaultVal = 0; - } -} 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/ModCustomParamId.java b/src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java new file mode 100644 index 0000000..d6aa240 --- /dev/null +++ b/src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java @@ -0,0 +1,14 @@ +package a8k.canbus.custom_param_mgr; + +public enum ModCustomParamId { + + MOTOR_STANDY_POS_COMPENSATE("电机待机位置零点补偿"),//待机位置 = 零点- 零点补偿 + ; + public final String desc; + public final Integer defaultVal; + + 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 *