Browse Source

添加模块寄存器初始化服务

tags/v0
zhaohe 1 year ago
parent
commit
73b205f919
  1. 32
      src/main/java/a8k/app_eventbus/AppEventBusService.java
  2. 6
      src/main/java/a8k/app_eventbus/appevent/A8kCanBusOnConnectEvent.java
  3. 26
      src/main/java/a8k/canbus/A8kCanBusService.java
  4. 76
      src/main/java/a8k/canbus/A8kModParamInitializer.java
  5. 7
      src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParam.java
  6. 32
      src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamMgr.java
  7. 4
      src/main/java/a8k/canbus/custom_param_mgr/ModCustomParamId.java
  8. 3
      src/main/java/a8k/canbus/protocol/RegIndex.java

32
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<ContextRefreshedEvent> {
public static final Logger logger = LoggerFactory.getLogger(AppEventBusService.class);
Thread eventProcessorThread;
BlockingQueue<AppEvent> eventQueue;
List<AppEventListener> listeners;
BlockingQueue<AppEvent> eventQueue = new LinkedBlockingQueue<>();
List<AppEventListener> listeners = new ArrayList<>();
@PostConstruct
public void init() {
eventQueue = new LinkedBlockingQueue<AppEvent>();
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();
}
}
}

6
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() {
}
}

26
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));
}
}

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

7
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;
}

32
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<A8kModCustomParamId, A8kModCustomParam> customParamMap;
Set<A8kModCustomParam> 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);
}
}

4
src/main/java/a8k/canbus/custom_param_mgr/A8kModCustomParamId.java → 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;
}

3
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 *

Loading…
Cancel
Save