diff --git a/src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusConnection.java b/src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusConnection.java index ca9a2a3..bc9e71c 100644 --- a/src/main/java/a8k/app/channel/iflytophald/channel/A8kCanBusConnection.java +++ b/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()))); } diff --git a/src/main/java/a8k/app/channel/iflytophald/driver/StepMotorCtrlDriver.java b/src/main/java/a8k/app/channel/iflytophald/driver/StepMotorCtrlDriver.java index a4cad8b..9b3ad0c 100644 --- a/src/main/java/a8k/app/channel/iflytophald/driver/StepMotorCtrlDriver.java +++ b/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; diff --git a/src/main/java/a8k/app/channel/iflytophald/type/protocol/RegIndex.java b/src/main/java/a8k/app/channel/iflytophald/type/protocol/RegIndex.java index 6c26e2a..3a04fc0 100644 --- a/src/main/java/a8k/app/channel/iflytophald/type/protocol/RegIndex.java +++ b/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 * diff --git a/src/main/java/a8k/app/channel/iflytophald/type/protocol/StepMotorRegIndex.java b/src/main/java/a8k/app/channel/iflytophald/type/protocol/StepMotorRegIndex.java index d9238ee..da3caa3 100644 --- a/src/main/java/a8k/app/channel/iflytophald/type/protocol/StepMotorRegIndex.java +++ b/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; diff --git a/src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java b/src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java index 2d64091..bd929e7 100644 --- a/src/main/java/a8k/app/config/A8kSubModuleInitRegConfig.java +++ b/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); diff --git a/src/main/java/a8k/app/constant/MiniServoConstant.java b/src/main/java/a8k/app/constant/MiniServoConstant.java index 8ca1d81..7c5c363 100644 --- a/src/main/java/a8k/app/constant/MiniServoConstant.java +++ b/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() {{ diff --git a/src/main/java/a8k/app/service/DeviceVirtualStateMgrService.java b/src/main/java/a8k/app/service/DeviceVirtualStateMgrService.java index 92cdf86..c91ce37 100644 --- a/src/main/java/a8k/app/service/DeviceVirtualStateMgrService.java +++ b/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; + } } diff --git a/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java b/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java index 99952e8..06a66a6 100644 --- a/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java +++ b/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("="); } diff --git a/src/main/java/a8k/app/service/os/OSBeepCtrlService.java b/src/main/java/a8k/app/service/os/OSBeepCtrlService.java index 3605883..9562dae 100644 --- a/src/main/java/a8k/app/service/os/OSBeepCtrlService.java +++ b/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); } diff --git a/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java b/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java index 5c854e7..3af940a 100644 --- a/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java +++ b/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)); diff --git a/src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java b/src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java index f0f03c0..967bad1 100644 --- a/src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java +++ b/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 // diff --git a/src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java b/src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java index e38c93f..e40e78b 100644 --- a/src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java +++ b/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; } diff --git a/src/main/java/a8k/app/service/statemgr/TubeStateMgr.java b/src/main/java/a8k/app/service/statemgr/TubeStateMgr.java index dd9b5a0..1924f80 100644 --- a/src/main/java/a8k/app/service/statemgr/TubeStateMgr.java +++ b/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; } diff --git a/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java index 1fb48a2..3dee261 100644 --- a/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java +++ b/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); diff --git a/src/main/java/a8k/extui/page/extsetting/device/OSDeviceInfoMgrPage.java b/src/main/java/a8k/extui/page/extsetting/device/OSDeviceInfoMgrPage.java new file mode 100644 index 0000000..ed38aa0 --- /dev/null +++ b/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); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java index cae3ebb..105240e 100644 --- a/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java +++ b/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) diff --git a/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java index 6fa9a61..d356d6b 100644 --- a/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java +++ b/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); } diff --git a/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java index 228daf3..d5903a4 100644 --- a/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java +++ b/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); diff --git a/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java index da57623..a986d8a 100644 --- a/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java +++ b/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); diff --git a/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java index 47f9004..5f5b275 100644 --- a/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java +++ b/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%") diff --git a/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java index f00ddde..f167942 100644 --- a/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java +++ b/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 { diff --git a/src/main/java/a8k/iflyutils/BitUtils.java b/src/main/java/a8k/iflyutils/BitUtils.java new file mode 100644 index 0000000..227bf55 --- /dev/null +++ b/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); + } +}