Browse Source

改善部分逻辑

master
zhaohe 3 weeks ago
parent
commit
131d3a5713
  1. 21
      src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusConnection.java
  2. 67
      src/main/java/a8k/app/channel/iflytophald/driver/StepMotorCtrlDriver.java
  3. 2
      src/main/java/a8k/app/channel/iflytophald/type/protocol/RegIndex.java
  4. 4
      src/main/java/a8k/app/channel/iflytophald/type/protocol/StepMotorRegIndex.java
  5. 2
      src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java
  6. 2
      src/main/java/a8k/app/constant/MiniServoConstant.java
  7. 60
      src/main/java/a8k/app/service/DeviceVirtualStateMgrService.java
  8. 24
      src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java
  9. 5
      src/main/java/a8k/app/service/os/OSBeepCtrlService.java
  10. 23
      src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java
  11. 10
      src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java
  12. 18
      src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java
  13. 3
      src/main/java/a8k/app/service/statemgr/TubeStateMgr.java
  14. 5
      src/main/java/a8k/extui/page/driver/MotorCtrlPage.java
  15. 45
      src/main/java/a8k/extui/page/extsetting/device/OSDeviceInfoMgrPage.java
  16. 2
      src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java
  17. 59
      src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java
  18. 127
      src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java
  19. 5
      src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java
  20. 2
      src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java
  21. 4
      src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java
  22. 39
      src/main/java/a8k/iflyutils/BitUtils.java

21
src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusConnection.java

@ -210,19 +210,22 @@ public class A8kCanBusConnection extends WebSocketClient {
restartCanif();
}
for (int i = 0; i < 5; i++) {
try {
return this.priSend(pack, overtime);
} catch (AppException e) {
if (!e.error.code.equals(A8kEcode.LOW_ERROR_OVERTIME)) {
throw e;
for (int j = 0; j < 2; j++) {
for (int i = 0; i < 5; i++) {
try {
return this.priSend(pack, overtime);
} catch (AppException e) {
if (!e.error.code.equals(A8kEcode.LOW_ERROR_OVERTIME)) {
throw e;
}
}
log.error("send cmd {} {} fail", pack, pack.toByteString());
OS.hsleep(100);
log.error("retry {}", i);
}
log.error("send cmd {} {} fail", pack, pack.toByteString());
restartCanif();
// OS.hsleep(1000);
log.error("retry {}", i);
}
throw AppException.of(new AEHardwareError(A8kEcode.LOW_ERROR_OVERTIME, MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId())));
}

67
src/main/java/a8k/app/channel/iflytophald/driver/StepMotorCtrlDriver.java

@ -5,20 +5,77 @@ import a8k.app.constant.ActionOvertimeConstant;
import a8k.app.channel.iflytophald.type.protocol.*;
import a8k.app.type.exception.AppException;
import a8k.app.utils.ZJsonHelper;
import a8k.iflyutils.BitUtils;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
@Slf4j
public class StepMotorCtrlDriver {
static Logger logger = org.slf4j.LoggerFactory.getLogger(StepMotorCtrlDriver.class);
final private A8kCanBusService canBus;
private final ActionOvertimeConstant actionOvertimeConstant;
public static class StepMotorErrorInfo {
public A8kEcode ecode;
public Integer sgResult;
public Integer fsActive;
public Integer csActual;
public Integer stallGuard;
public Integer ot;
public Integer otpw;
public Integer s2ga;
public Integer s2gb;
public Integer ola;
public Integer olb;
public Integer stst;
static StepMotorErrorInfo build(A8kEcode ecode, Integer detailEcode) throws AppException {
StepMotorErrorInfo errorInfo = new StepMotorErrorInfo();
errorInfo.ecode = ecode;
int ioff = 0;
errorInfo.sgResult = BitUtils.getBitValueAsInt(detailEcode, ioff, 10);
ioff += 10;
ioff += 5;
errorInfo.fsActive = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.csActual = BitUtils.getBitValueAsInt(detailEcode, ioff, 5);
ioff += 5;
ioff += 3;
errorInfo.stallGuard = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.ot = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.otpw = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.s2ga = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.s2gb = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.ola = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.olb = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
ioff += 1;
errorInfo.stst = BitUtils.getBitValueAsInt(detailEcode, ioff, 1);
return errorInfo;
}
public static void main(String[] args) {
}
}
public StepMotorErrorInfo readErrorInfo(StepMotorMId mid) throws AppException {
A8kEcode ecode = canBus.moduleGetError(mid.mid);
Integer detailEcode = canBus.moduleGetDetailError(mid.mid);
return StepMotorErrorInfo.build(ecode, detailEcode);
}
public void stepMotorEasyMoveBy(StepMotorMId id, Integer dpos) throws AppException {
canBus.callcmd(id.mid, CmdId.step_motor_easy_move_by, dpos);
}
@ -62,7 +119,7 @@ public class StepMotorCtrlDriver {
}
public void stepMotorEasyMoveByBlock(StepMotorMId id, Integer dpos) throws AppException {
logger.debug("stepMotorEasyMoveByBlock {} {}", id, dpos);
log.debug("stepMotorEasyMoveByBlock {} {}", id, dpos);
stepMotorEasyMoveBy(id, dpos);
canBus.waitForMod(id.mid, actionOvertimeConstant.get(id, CmdId.step_motor_easy_move_by));
}
@ -72,13 +129,13 @@ public class StepMotorCtrlDriver {
}
public void stepMotorEasyMoveToBlock(StepMotorMId id, Integer pos) throws AppException {
logger.debug("stepMotorEasyMoveToBlock {} {}", id, pos);
log.debug("stepMotorEasyMoveToBlock {} {}", id, pos);
stepMotorEasyMoveTo(id, pos);
canBus.waitForMod(id.mid, actionOvertimeConstant.get(id, CmdId.step_motor_easy_move_to));
}
public void stepMotorEasyMoveToZeroBlock(StepMotorMId id) throws AppException {
logger.debug("stepMotorEasyMoveToZeroBlock {}", id);
log.debug("stepMotorEasyMoveToZeroBlock {}", id);
stepMotorEasyMoveToZero(id);
canBus.waitForMod(id.mid, actionOvertimeConstant.get(id, CmdId.step_motor_easy_move_to_zero));
}
@ -166,7 +223,7 @@ public class StepMotorCtrlDriver {
ObjectNode node = ZJsonHelper.createObjectNode();
for (StepMotorRegIndex regIndex : StepMotorRegIndex.values()) {
Integer regVal = getReg(id, regIndex);
logger.debug("read reg {} -> {}", regIndex, regVal);
log.debug("read reg {} -> {}", regIndex, regVal);
node.put(regIndex.name(), getReg(id, regIndex));
}
return node;

2
src/main/java/a8k/app/channel/iflytophald/type/protocol/RegIndex.java

@ -209,6 +209,8 @@ public enum RegIndex {
kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式
kret_step_motor_pos_devi_tolerance(10192), // 位置偏差容忍度
kret_step_motor_io_trigger_append_distance(10193), // 移动到io时附加的距离
kreg_step_motor_zero_io_mirror(10194), //零点IO有效位是否翻转
kreg_step_motor_limit_io_mirror(10195), //限位IO有效位是否翻转
/***********************************************************************************************************************
* step_motor *

4
src/main/java/a8k/app/channel/iflytophald/type/protocol/StepMotorRegIndex.java

@ -44,8 +44,8 @@ public enum StepMotorRegIndex {
kreg_step_motor_dzero_pos(RegIndex.kreg_step_motor_dzero_pos), // 驱动器处于调试模式
kret_step_motor_pos_devi_tolerance(RegIndex.kret_step_motor_pos_devi_tolerance), // 位置偏差容忍度
kret_step_motor_io_trigger_append_distance(RegIndex.kret_step_motor_io_trigger_append_distance), // 移动到io时附加的距离
kreg_step_motor_zero_io_mirror(RegIndex.kreg_step_motor_zero_io_mirror), // 零点io镜像
kreg_step_motor_limit_io_mirror(RegIndex.kreg_step_motor_limit_io_mirror), // 限位io镜像
;
public final RegIndex regIndex;

2
src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java

@ -115,6 +115,8 @@ public class A8kSubModuleInitRegConfig {
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_dzero_pos);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kret_step_motor_pos_devi_tolerance);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kret_step_motor_io_trigger_append_distance);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_zero_io_mirror);
addRegMarker(ModuleType.TMCStepMotor, RegIndex.kreg_step_motor_limit_io_mirror);

2
src/main/java/a8k/app/constant/MiniServoConstant.java

@ -22,7 +22,7 @@ public class MiniServoConstant {
//摇匀模组夹爪
MiniServoMId.ShakeModGripperSV, new MiniServoFixPosConfig() {{
zeroPos = 1600;
refPos = 1800;//完全张开的位置
refPos = 1477;//完全闭合的位置
}},
//试管架夹紧
MiniServoMId.ShakeModTubeScanerClampingSV, new MiniServoFixPosConfig() {{

60
src/main/java/a8k/app/service/DeviceVirtualStateMgrService.java

@ -14,12 +14,12 @@ import a8k.app.type.PreReactionGridGroup;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.LittleBottleConsumableType;
import a8k.app.type.a8k.container.A8kConsumableContainer;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.a8k.state.*;
import a8k.app.type.a8k.state.enumtype.IncubationSubTankState;
import a8k.app.type.a8k.state.enumtype.TubeHolderState;
import a8k.app.type.a8k.state.enumtype.TubeState;
import a8k.app.type.a8k.state.enumtype.*;
import a8k.app.type.error.AppError;
import a8k.app.type.exception.AppException;
import a8k.app.utils.ZList;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
@ -34,6 +34,27 @@ import java.util.Date;
public class DeviceVirtualStateMgrService {
synchronized public A8kConsumableContainer getVirtualConsumableContainerState() {
//虚拟状态生成模式
A8kConsumableContainer state = new A8kConsumableContainer();
state.tips[0].tipNum = 100;
state.tips[1].tipNum = 101;
state.tips[2].tipNum = 102;
for (int i = 0; i < 6; i++) {
try {
FakeA8kConsumableContainerFactory.buildA8kConsumableContainerState(state, i);
} catch (AppException ignored) {
}
}
return state;
}
synchronized public Integer getVirtualConsumableContainerStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
}
/**
* 获取虚拟孵育盘状态
* @return 虚拟孵育盘状态
@ -154,6 +175,11 @@ public class DeviceVirtualStateMgrService {
return tubePosState;
}
public Integer getVirtualTubeStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
}
public PreReactionGridGroup getFakePreReactionGridGroup(ConsumableGroup group) {
PreReactionGridGroup gridGroup = new PreReactionGridGroup(group);
@ -255,4 +281,32 @@ public class DeviceVirtualStateMgrService {
return virtualWarningState;
}
synchronized public DeviceWorkState getVirtualDeviceWorkState() {
DeviceWorkState deviceWorkState = new DeviceWorkState();
deviceWorkState.workState = A8kWorkState.WORKING;
return deviceWorkState;
}
synchronized public Integer getVirtualDeviceWorkStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
}
synchronized public OptScanModuleState getVirtualOptScanModuleState() {
OptScanModuleState optScanModuleState = new OptScanModuleState();
optScanModuleState.state = OptScanModuleStateEnum.SCANNING;
optScanModuleState.sampleInfo = new SampleInfo(
"SAMPLEID-123456", 1, true, false, BloodType.WHOLE_BLOOD, "1234567890", "2250103_003"
);
optScanModuleState.setProjInfo(new ProjBriefInfo(1, "hsCRP", "CA", "#DC143C"));
optScanModuleState.setProjId(1);
optScanModuleState.setLotId("CA123456");
return optScanModuleState;
}
synchronized public Integer getVirtualOptScanModuleStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
}
}

24
src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java

@ -1,5 +1,6 @@
package a8k.app.service.data;
import a8k.app.channel.iflytophald.type.protocol.A8kEcode;
import a8k.app.type.exception.AppException;
import a8k.app.config.A8kSubModuleInitRegConfig;
import a8k.app.dao.SubModuleRegInitialValueDao;
@ -41,7 +42,18 @@ public class SubModuleRegInitialValueMgrService {
for (RegIndex regIndex : regIndexes) {
log.info("read {}({})-{}", mid, mid.index, regIndex);
Integer val = canBus.moduleGetReg(mid, regIndex);
Integer val = null;
try {
val = canBus.moduleGetReg(mid, regIndex);
} catch (AppException e) {
if (e.getError().eq(A8kEcode.LOW_ERROR_MODULE_NOT_FIND_REG)) {
log.warn("read reg {}({})-{} fail, register not found, skip", mid, mid.index, regIndex);
continue;
} else {
throw e;
}
}
regcache.add(new SubModuleRegInitialValue(mid, regIndex, val));
}
}
@ -79,7 +91,15 @@ public class SubModuleRegInitialValueMgrService {
continue;
log.info(String.format("= init %s(%d) %-45s: %d", mid, mid.index, regIndex, val.regInitVal));
canBus.moduleSetReg(mid, regIndex, val.regInitVal);
try {
canBus.moduleSetReg(mid, regIndex, val.regInitVal);
} catch (AppException e) {
if (e.getError().eq(A8kEcode.LOW_ERROR_MODULE_NOT_FIND_REG)) {
log.warn("set reg {}({})-{} fail, register not found, skip", mid, mid.index, regIndex);
} else {
throw e;
}
}
}
log.info("=");
}

5
src/main/java/a8k/app/service/os/OSBeepCtrlService.java

@ -59,6 +59,11 @@ public class OSBeepCtrlService {
continue;
}
if (!gStateMgrService.isDeviceInited()) {
OS.forceSleep(1000);
continue;
}
if (!beepStateIsSync) {
setBeepState(beepState);
}

23
src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java

@ -4,6 +4,7 @@ import a8k.app.dao.AppStatePersistenceDao;
import a8k.app.dao.type.combination.ProjBuildInInfo;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.statemgr.consumables_mgr.LarBottleContainerStateMgr;
import a8k.app.service.statemgr.consumables_mgr.LittBottleContainerStateMgr;
@ -63,8 +64,9 @@ public class ConsumablesMgrService {
private final TipStateMgr tipStateMgr;
private final PreReactionStateMgr preReactionStateMgr;
private final AppStatePersistenceDao appStatePersistenceDao;
private final ProjInfoMgrService projInfoMgrService;
private final AppStatePersistenceDao appStatePersistenceDao;
private final ProjInfoMgrService projInfoMgrService;
private final DeviceVirtualStateMgrService deviceVirtualStateMgrService;
@PostConstruct
void init() {
@ -78,17 +80,7 @@ public class ConsumablesMgrService {
synchronized public A8kConsumableContainer getState() {
A8kConsumableContainer state = new A8kConsumableContainer();
if (gStateMgrService.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
//虚拟状态生成模式
state.tips[0].tipNum = 100;
state.tips[1].tipNum = 101;
state.tips[2].tipNum = 102;
for (int i = 0; i < 6; i++) {
try {
FakeA8kConsumableContainerFactory.buildA8kConsumableContainerState(state, i);
} catch (AppException ignored) {
}
}
return state;
return deviceVirtualStateMgrService.getVirtualConsumableContainerState();
}
state.tips = tipStateMgr.tips;
@ -100,6 +92,9 @@ public class ConsumablesMgrService {
}
synchronized public Integer getStateVersion() {
if (gStateMgrService.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
return deviceVirtualStateMgrService.getVirtualConsumableContainerStateVersion();
}
return stateVersion;
}
@ -170,7 +165,7 @@ public class ConsumablesMgrService {
ReactionPlateContainerInfo reactionPlateContainerInfo,
LittBottleConsumablesInfo littBottleConsumablesInfo,
LargeBottleConsumablesInfo largeBottleConsumablesInfo) {
reactionPlateContainerStateMgr.uninstall(ConsumableGroup.of(ch));
littBottleContainerStateMgr.uninstall(ConsumableGroup.of(ch));
larBottleContainerStateMgr.uninstall(ConsumableGroup.of(ch));

10
src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java

@ -1,5 +1,6 @@
package a8k.app.service.statemgr;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
@ -17,20 +18,22 @@ import java.util.List;
@RequiredArgsConstructor
public class DeviceWorkStateMgrService {
final private GStateMgrService gstate;
private final DeviceVirtualStateMgrService deviceVirtualStateMgrService;
DeviceWorkState deviceWorkState = new DeviceWorkState();
Integer version = 0;
synchronized public DeviceWorkState getDeviceWorkState() {
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
var cpy = ObjectUtil.clone(deviceWorkState);
cpy.workState = A8kWorkState.WORKING;
return cpy;
return deviceVirtualStateMgrService.getVirtualDeviceWorkState();
}
return deviceWorkState;
}
synchronized public Integer getVersion() {
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
return deviceVirtualStateMgrService.getVirtualDeviceWorkStateVersion();
}
return version;
}
@ -139,7 +142,6 @@ public class DeviceWorkStateMgrService {
return deviceWorkState.workTaskType.equals(A8kWorkTaskType.EngineerTask);
}
//
// ERROR FLAG FUNCTIONS
//

18
src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java

@ -1,5 +1,6 @@
package a8k.app.service.statemgr;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.a8k.BloodType;
@ -14,6 +15,7 @@ import a8k.app.dao.type.combination.ProjBuildInInfo;
import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@ -26,7 +28,9 @@ public class OptScanModuleStateMgr {
Integer version = 0;
//光学模组状态
private final OptScanModuleState optScanModule = new OptScanModuleState();
private final OptScanModuleState optScanModule = new OptScanModuleState();
@Autowired
private DeviceVirtualStateMgrService deviceVirtualStateMgrService;
synchronized public Boolean isEmpty() {
return optScanModule.state.equals(OptScanModuleStateEnum.EMPTY);
@ -51,22 +55,14 @@ public class OptScanModuleStateMgr {
synchronized public OptScanModuleState getOptScanModule() {
if (gStateMgrService.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
OptScanModuleState virstate = new OptScanModuleState();
virstate.state = OptScanModuleStateEnum.SCANNING;
virstate.sampleInfo = new SampleInfo(
"SAMPLEID-123456", 1, true, false, BloodType.WHOLE_BLOOD, "1234567890", "2250103_003"
);
virstate.setProjInfo(new ProjBriefInfo(1, "hsCRP", "CA", UtilsProjectColorAllocer.getProjColor(1)));
virstate.setProjId(1);
virstate.setLotId("CA123456");
return virstate;
return deviceVirtualStateMgrService.getVirtualOptScanModuleState();
}
return ObjectUtil.cloneByStream(optScanModule);
}
synchronized public Integer getStateVersion() {
if (gStateMgrService.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
return 1;
return deviceVirtualStateMgrService.getVirtualOptScanModuleStateVersion();
}
return version;
}

3
src/main/java/a8k/app/service/statemgr/TubeStateMgr.java

@ -75,6 +75,9 @@ public class TubeStateMgr {
}
public synchronized Integer getVersion() {
if (gStateMgrService.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
return deviceVirtualStateMgrService.getVirtualTubeStateVersion();
}
return version;
}

5
src/main/java/a8k/extui/page/driver/MotorCtrlPage.java

@ -94,6 +94,10 @@ public class MotorCtrlPage {
return stepMotorCtrlDriver.stepMotorReadPos(id);
}
public StepMotorCtrlDriver.StepMotorErrorInfo readErrorInfo() throws AppException {
return stepMotorCtrlDriver.readErrorInfo(id);
}
public Object readIOState() throws AppException {
ZJsonNode node = new ZJsonNode();
node.get("IO1").set(stepMotorCtrlDriver.stepMotorReadIoState(id, 0));
@ -232,6 +236,7 @@ public class MotorCtrlPage {
page.addFunction("读取IO状态", this::readIOState);
page.addFunction("读取位置", this::readPos);
page.addFunction("读取编码器位置", this::readEncPos);
page.addFunction("读取错误信息", this::readErrorInfo);
extApiPageMgr.addPage(page);

45
src/main/java/a8k/extui/page/extsetting/device/OSDeviceInfoMgrPage.java

@ -0,0 +1,45 @@
package a8k.extui.page.extsetting.device;
import a8k.app.service.os.OSDeviceInfoMgrService;
import a8k.app.type.exception.AppException;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
@Slf4j
public class OSDeviceInfoMgrPage {
private final ExtApiPageMgr extApiPageMgr;
private final OSDeviceInfoMgrService osDeviceInfoMgrService;
public void setSN(String sn) throws AppException {
}
public String readSN() {
return osDeviceInfoMgrService.readSN();
}
//
// public String setAssetId(String assetId) throws AppException {
// setEnv("/iflytop/env/assetid", assetId, gStateMgrService::setAssetId);
// return assetId;
// }
@PostConstruct
void init() {
var page = extApiPageMgr.newPage(this);
//
// page.newGroup("设置");
// page.addFunction("设置TipG1-000坐标", this::setTipG1Pos000)
// .setParamVal("x", () -> hbotTipPosMgr.getTipPosCfg(TipGroupPos.TipG1).tip000.x)
// .setParamVal("y", () -> hbotTipPosMgr.getTipPosCfg(TipGroupPos.TipG1).tip000.y);
//
extApiPageMgr.addPage(page);
}
}

2
src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java

@ -38,7 +38,7 @@ public class InputIOStateHardwareTestPage {
@ExtApiStatu(name = "废料仓满溢检测", order = 7)
public Boolean getRecycleBinOverflowPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinOverflowPPS);}
@ExtApiStatu(name = "板夹仓-仓门光电", order = 8)
@ExtApiStatu(name = "板夹仓-仓门光电(盖:1 不盖:0)", order = 8)
public Boolean getPlateBoxCoverClosurePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS);}
@ExtApiStatu(name = "板夹仓-卡板光电", order = 9)

59
src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java

@ -85,9 +85,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, -step);
}
public void feedingModXMZero() throws AppException {
public Integer feedingModXMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.FeedingModXM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.FeedingModXM);
}
public void feedingModeStop() throws AppException {
@ -116,9 +116,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, step);
}
public void shakeModGripperZMZero() throws AppException {
public Integer shakeModGripperZMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM);
}
@ -145,9 +145,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, step);
}
public void shakeModClampingMZero() throws AppException {
public Integer shakeModClampingMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModClampingM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM);
}
@ -173,9 +173,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, -step);
}
public void shakeModShakeMZero() throws AppException {
public Integer shakeModShakeMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModShakeM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModShakeM);
}
public void shakeModShakeMStop() throws AppException {
@ -204,9 +204,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, -step);
}
public void platesBoxYZero() throws AppException {
public Integer platesBoxYZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM);
}
@ -232,9 +232,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, -step);
}
public void platesBoxPusherZero() throws AppException {
public Integer platesBoxPusherZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM);
}
@ -285,9 +285,9 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, step);
}
public void incubatorRotateCtrlMZero() throws AppException {
public Integer incubatorRotateCtrlMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM);
}
@ -295,11 +295,19 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorStop(StepMotorMId.IncubatorRotateCtrlM);
}
public void incubatorRotateCtrlMoveTo(String mark,Integer pos) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.IncubatorRotateCtrlM, pos);
}
void regIncubatorRotateCtrlM() {
pageConfig.newGroup("孵育盘转动电机");
pageConfig.addFunction("归零", this::incubatorRotateCtrlMZero);
pageConfig.addFunction("逆时针转动", this::incubatorRotateCtrlMAntiClockwise).setParamVal("step", () -> 200);
pageConfig.addFunction("顺时针转动", this::incubatorRotateCtrlMClockwise).setParamVal("step", () -> 200);
pageConfig.addFunction("移动到", this::incubatorRotateCtrlMoveTo).setParamVal("pos", () -> 0);
pageConfig.addFunction("移动到", this::incubatorRotateCtrlMoveTo).setParamVal("pos", () -> 0);
pageConfig.addFunction("停止", this::incubatorRotateCtrlMStop);
pageConfig.addFunction("编码器诊断", this::incubatorRotateCtrlMDiagnosticEnc);
}
@ -316,21 +324,29 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, -step);
}
public void optModScannerMZero() throws AppException {
public Integer optModScannerMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM);
}
public void optModScannerMStop() throws AppException {
stepMotorCtrlDriver.stepMotorStop(StepMotorMId.OptModScannerM);
}
public void optModScannerMMoveTo0(String mark,Integer pos) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, pos);
}
void regOptModScannerM() {
pageConfig.newGroup("光学模组扫描电机");
pageConfig.addFunction("归零", this::optModScannerMZero);
pageConfig.addFunction("向左移动", this::optModScannerMLeft).setParamVal("step", () -> 30);
pageConfig.addFunction("向右移动", this::optModScannerMRight).setParamVal("step", () -> 30);
pageConfig.addFunction("移动到", this::optModScannerMMoveTo0).setParamVal("pos", () -> 0);
pageConfig.addFunction("移动到", this::optModScannerMMoveTo0).setParamVal("pos", () -> 0);
pageConfig.addFunction("停止", this::optModScannerMStop);
}
@ -347,21 +363,28 @@ public class MotorHardwareTestPage {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, step);
}
public void optModPullMZero() throws AppException {
public Integer optModPullMZero() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModPullM);
}
public void optModPullMStop() throws AppException {
stepMotorCtrlDriver.stepMotorStop(StepMotorMId.OptModPullM);
}
public void optModPullMMoveTo0(String mark,Integer pos) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, pos);
}
void regOptModPullM() {
pageConfig.newGroup("光学模组拉伸电机");
pageConfig.addFunction("归零", this::optModPullMZero);
pageConfig.addFunction("回零方向移动", this::optModPullMLeft).setParamVal("step", () -> 30);
pageConfig.addFunction("勾取方向移动", this::optModPullMRight).setParamVal("step", () -> 30);
pageConfig.addFunction("移动到", this::optModPullMMoveTo0).setParamVal("pos", () -> 0);
pageConfig.addFunction("移动到", this::optModPullMMoveTo0).setParamVal("pos", () -> 0);
pageConfig.addFunction("停止", this::optModPullMStop);
}

127
src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java

@ -1,5 +1,6 @@
package a8k.extui.page.hardwaretest;
import a8k.app.channel.iflytophald.driver.PipetteCtrlDriverV2;
import a8k.app.channel.iflytophald.driver.StepMotorCtrlDriver;
import a8k.app.channel.iflytophald.type.protocol.StepMotorMId;
import a8k.app.channel.iflytophald.type.protocol.StepMotorRegIndex;
@ -20,67 +21,129 @@ public class MotorPPSHardwareTestPage {
private final ExtApiPageMgr extApiPageMgr;
private final StepMotorCtrlDriver stepMotorCtrlDriver;
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2;
ExtUIPageCfg pageConfig;
//
// 入料平移电机
//
@ExtApiStatu(name = "", group = "入料平移电机-IO", order = 1, minWidth = "100%")
public String feedingModXMReadIOState() {
return readIOState(StepMotorMId.FeedingModXM);
@ExtApiStatu(name = "入料平移电机", group = "零点光电", order = 1, minWidth = "25%")
public Object feedingModXMReadIOState() {
return readZeroIOState(StepMotorMId.FeedingModXM);
}
@ExtApiStatu(name = "", group = "摇匀模组-Z轴-IO", order = 2, minWidth = "100%")
public String shakeModGripperZMReadIOState() {
return readIOState(StepMotorMId.ShakeModGripperZM);
@ExtApiStatu(name = "摇匀模组-Z轴", group = "零点光电", order = 2, minWidth = "25%")
public Object shakeModGripperZMReadIOState() {
return readZeroIOState(StepMotorMId.ShakeModGripperZM);
}
@ExtApiStatu(name = "", group = "摇匀模组-夹紧-IO", order = 3, minWidth = "100%")
public String shakeModClampingMReadIOState() {
return readIOState(StepMotorMId.ShakeModClampingM);
@ExtApiStatu(name = "摇匀模组-夹紧", group = "零点光电", order = 3, minWidth = "25%")
public Object shakeModClampingMReadIOState() {
return readZeroIOState(StepMotorMId.ShakeModClampingM);
}
@ExtApiStatu(name = "", group = "摇匀模组-摇匀-IO", order = 4, minWidth = "100%")
public String shakeModShakeMReadIOState() {
return readIOState(StepMotorMId.ShakeModShakeM);
@ExtApiStatu(name = "摇匀模组-摇匀", group = "零点光电", order = 4, minWidth = "25%")
public Object shakeModShakeMReadIOState() {
return readZeroIOState(StepMotorMId.ShakeModShakeM);
}
@ExtApiStatu(name = "", group = "板夹仓-前后移动电机-IO", order = 5, minWidth = "100%")
public String platesBoxYMReadIOState() {
return readIOState(StepMotorMId.PlatesBoxYM);
@ExtApiStatu(name = "板夹仓-前后移动电机", group = "零点光电", order = 5, minWidth = "25%")
public Object platesBoxYMReadIOState() {
return readZeroIOState(StepMotorMId.PlatesBoxYM);
}
@ExtApiStatu(name = "", group = "板夹仓-推杆电机-IO", order = 6, minWidth = "100%")
public String platesBoxPusherReadIOState() {
return readIOState(StepMotorMId.PlatesBoxPusherM);
@ExtApiStatu(name = "板夹仓-推杆电机", group = "零点光电", order = 6, minWidth = "25%")
public Object platesBoxPusherReadIOState() {
return readZeroIOState(StepMotorMId.PlatesBoxPusherM);
}
@ExtApiStatu(name = "", group = "孵育盘电机-IO", order = 7, minWidth = "100%")
public String incubatorRotateCtrlMReadIOState() {
return readIOState(StepMotorMId.IncubatorRotateCtrlM);
@ExtApiStatu(name = "孵育盘电机", group = "零点光电", order = 7, minWidth = "25%")
public Object incubatorRotateCtrlMReadIOState() {
return readZeroIOState(StepMotorMId.IncubatorRotateCtrlM);
}
@ExtApiStatu(name = "", group = "光学模组-扫码机-IO", order = 8, minWidth = "100%")
public String optModScannerMReadIOState() {
return readIOState(StepMotorMId.OptModScannerM);
@ExtApiStatu(name = "光学模组-扫码电机", group = "零点光电", order = 8, minWidth = "25%")
public Object optModScannerMReadIOState() {
return readZeroIOState(StepMotorMId.OptModScannerM);
}
@ExtApiStatu(name = "", group = "光学模组-拉杆机-IO", order = 9, minWidth = "100%")
public String optModPullMReadIOState() {
return readIOState(StepMotorMId.OptModPullM);
@ExtApiStatu(name = "光学模组-拉杆电机", group = "零点光电", order = 9, minWidth = "25%")
public Object optModPullMReadIOState() {
return readZeroIOState(StepMotorMId.OptModPullM);
}
private String readIOState(StepMotorMId mid) {
//
@ExtApiStatu(name = "入料平移电机", group = "限位光电", order = 11, minWidth = "25%")
public Object feedingModXMReadLimitIOState() {
return readLimitIOState(StepMotorMId.FeedingModXM);
}
@ExtApiStatu(name = "摇匀模组-Z轴", group = "限位光电", order = 12, minWidth = "25%")
public Object shakeModGripperZMReadLimitIOState() {
return readLimitIOState(StepMotorMId.ShakeModGripperZM);
}
@ExtApiStatu(name = "摇匀模组-夹紧", group = "限位光电", order = 13, minWidth = "25%")
public Object shakeModClampingMReadLimitIOState() {
return readLimitIOState(StepMotorMId.ShakeModClampingM);
}
@ExtApiStatu(name = "摇匀模组-摇匀", group = "限位光电", order = 14, minWidth = "25%")
public Object shakeModShakeMReadLimitIOState() {
return readLimitIOState(StepMotorMId.ShakeModShakeM);
}
@ExtApiStatu(name = "板夹仓-前后移动电机", group = "限位光电", order = 15, minWidth = "25%")
public Object platesBoxYMReadLimitIOState() {
return readLimitIOState(StepMotorMId.PlatesBoxYM);
}
@ExtApiStatu(name = "板夹仓-推杆电机", group = "限位光电", order = 16, minWidth = "25%")
public Object platesBoxPusherReadLimitIOState() {
return readLimitIOState(StepMotorMId.PlatesBoxPusherM);
}
@ExtApiStatu(name = "孵育盘电机", group = "限位光电", order = 17, minWidth = "25%")
public Object incubatorRotateCtrlMReadLimitIOState() {
return readLimitIOState(StepMotorMId.IncubatorRotateCtrlM);
}
@ExtApiStatu(name = "光学模组-扫码电机", group = "限位光电", order = 18, minWidth = "25%")
public Object optModScannerMReadLimitIOState() {
return readLimitIOState(StepMotorMId.OptModScannerM);
}
@ExtApiStatu(name = "光学模组-拉杆电机", group = "限位光电", order = 19, minWidth = "25%")
public Object optModPullMReadLimitIOState() {
return readLimitIOState(StepMotorMId.OptModPullM);
}
private Object readZeroIOState(StepMotorMId mid) {
try {
Boolean zeroIOState = stepMotorCtrlDriver.stepMotorReadIoState(mid, 0);
Boolean limitIOState = stepMotorCtrlDriver.stepMotorReadIoState(mid, 1);
return String.format("ZERO IO: [%s] LIMIT IO: [%s]", zeroIOState ? 1 : 0, limitIOState ? 1 : 0);
return stepMotorCtrlDriver.stepMotorReadIoState(mid, 0);
// Boolean limitIOState = stepMotorCtrlDriver.stepMotorReadIoState(mid, 1);
// return String.format("ZERO IO: [%s] LIMIT IO: [%s]", zeroIOState ? 1 : 0, limitIOState ? 1 : 0);
} catch (AppException e) {
return "读取IO异常";
// return "读取IO异常";
}
return false;
}
private Object readLimitIOState(StepMotorMId mid) {
try {
return stepMotorCtrlDriver.stepMotorReadIoState(mid, 1);
// return String.format("ZERO IO: [%s] LIMIT IO: [%s]", zeroIOState ? 1 : 0, limitIOState ? 1 : 0);
} catch (AppException e) {
// return "读取IO异常";
}
return false;
}
@PostConstruct
void init() {
pageConfig = extApiPageMgr.newPage(this);

5
src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java

@ -53,6 +53,10 @@ public class PipetteGunHardwareTestPage {
return pipetteCtrlDriverV2.readPipetteConnectedState();
}
public Boolean readZeroSensorState() throws AppException {
return pipetteCtrlDriverV2.zMotorReadZeroPointState();
}
@PostConstruct
void init() {
@ -69,6 +73,7 @@ public class PipetteGunHardwareTestPage {
page.newGroup("状态");
page.addFunction("读取位置", this::readPos);
page.addFunction("读取连接状态", this::readPipetteConnectedState);
page.addFunction("读取零点传感器状态", this::readZeroSensorState);
extApiPageMgr.addPage(page);

2
src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java

@ -28,7 +28,7 @@ public class WaterTempControllerTestPage {
@ExtApiStatu(name = "", group = "板夹仓反馈温度", order = 2, minWidth = "50%")
public Double readPlatesBoxTCMFeedbackTemperature() throws AppException {
return waterTemperatureControllerDriver.readIncubateBoxTemperature();
return waterTemperatureControllerDriver.readPlateBoxTemperature();
}
@ExtApiStatu(name = "", group = "孵育盘温度传感器", order = 3, minWidth = "50%")

4
src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java

@ -44,8 +44,8 @@ public class P31ReactionPlatesTransmitPosVerificationPage {
//光学模组单步
public void trunableMoveToPushPos(IncubatorPos index) throws AppException {
plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, index);
public void trunableMoveToPushPos(ConsumableGroup group,IncubatorPos index) throws AppException {
plateBoxCtrlService.pushPlateQuick(group, index);
}
public void trunableMoveToPullPos(IncubatorPos index) throws AppException {

39
src/main/java/a8k/iflyutils/BitUtils.java

@ -0,0 +1,39 @@
package a8k.iflyutils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class BitUtils {
public static Boolean getBitValue(Integer value, int bitOff) {
if (bitOff < 0 || bitOff > 31) {
throw new IllegalArgumentException("Bit index must be between 0 and 31");
}
return (value & (1 << bitOff)) != 0;
}
public static Integer getBitValueAsInt(Integer value, int bitOff, int bitlen) {
if (bitOff < 0 || bitOff > 31 || bitlen < 1 || bitlen > 32) {
throw new IllegalArgumentException("Bit index must be between 0 and 31 and bit length must be between 1 and 32");
}
int mask = (1 << bitlen) - 1; // Create a mask for the specified bit length
return (value >> bitOff) & mask; // Shift right and apply the mask
}
public static void main(String[] args) {
Integer value = 0b11111010; // Example value
log.info("Bit value at offset {}: {}", 0, getBitValue(value, 0));
log.info("Bit value at offset {}: {}", 1, getBitValue(value, 1));
log.info("Bit value at offset [{}..{}]: {}", 2, 1, getBitValueAsInt(value, 2, 1));
log.info("Bit value at offset [{}..{}]: {}", 2, 2, getBitValueAsInt(value, 2, 2));
log.info("Bit value at offset [{}..{}]: {}", 2, 3, getBitValueAsInt(value, 2, 3));
log.info("Bit value at offset [{}..{}]: {}", 2, 4, getBitValueAsInt(value, 2, 4));
log.info("Bit value at offset [{}..{}]: {}", 2, 5, getBitValueAsInt(value, 2, 5));
// System.out.println("Bit value as int from offset " + bitOff + " with length " + bitlen + ": " + bitValueAsInt);
}
}
Loading…
Cancel
Save