From dc981521c39deb983ef962105b064da4cc857ed0 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 30 Jul 2025 15:09:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=99=9A=E6=8B=9F=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E7=94=9F=E6=88=90=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/SubModuleRegInitialValueMgrService.java | 6 + .../ExperimentConsistencyTestingService.java | 63 ---- .../a8k/app/service/os/OSDeviceInfoMgrService.java | 36 +- .../a8k/app/service/statemgr/AppFlagStateMgr.java | 37 +- .../virtualstate/DeviceVirtualStateMgrService.java | 296 +++++---------- .../virtualstate/TubeVirtualStateGenerator.java | 106 ------ .../app/service/virtualstate/VirtualStateMode.java | 7 + .../service/virtualstate/VirtualStateModeMgr.java | 22 ++ .../generator/ConsumableStateGenerator.java | 51 +++ .../DeviceFlagStateVirtualStateGenerator.java | 118 ++++++ .../generator/TubeVirtualStateGenerator.java | 128 +++++++ .../generator/VirtualDeviceWorkStateGenerator.java | 59 +++ .../VirtualIncubationPlateStateGenerator.java | 139 +++++++ .../generator/VirtualOptScannerStateGenerator.java | 64 ++++ .../VirtualPreReactionGridGroupStateGenerator.java | 101 +++++ .../generator/VirtualSensorStateGenerator.java | 60 +++ src/main/java/a8k/app/type/GState.java | 2 +- .../java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java | 95 ++--- src/main/java/a8k/extui/mgr/ExtApiPageMgr.java | 6 +- .../a8k/extui/page/extapp/A8kOptVerification.java | 274 -------------- .../page/extapp/OptModuleParamCalibration.java | 232 ------------ .../VirtualStateGenerateModeSettingPage.java | 40 ++ .../DeviceVirtualStateMgrSettingPage.java | 35 -- .../VirtualReportModeOperationPage.java | 38 -- .../page/extsetting/db/DeviceExSettingPage.java | 49 --- .../extui/page/factory/DeviceExSettingPage.java | 41 +++ .../extui/page/factory/DeviceIdSettingPage.java | 40 ++ .../A8kSubModuleRegAndConfigInitPage.java | 34 ++ .../factory/hardwaretest/HBotHardwareTestPage.java | 99 +++++ .../factory/hardwaretest/ICCardReaderTestPage.java | 36 ++ .../hardwaretest/InputIOStateHardwareTestPage.java | 58 +++ .../page/factory/hardwaretest/LISUartTestPage.java | 55 +++ .../hardwaretest/MiniServoHardwareTestPage.java | 188 ++++++++++ .../hardwaretest/MiniServoPosCalibratePage.java | 119 ++++++ .../factory/hardwaretest/MiscHardwareTestPage.java | 23 ++ .../hardwaretest/MotorHardwareTestPage.java | 407 +++++++++++++++++++++ .../hardwaretest/MotorPPSHardwareTestPage.java | 151 ++++++++ .../factory/hardwaretest/OutputIOCtrlTestPage.java | 32 ++ .../hardwaretest/PipetteGunHardwareTestPage.java | 82 +++++ .../factory/hardwaretest/SubBoardProberPage.java | 131 +++++++ .../hardwaretest/SubModuleVersionPreviewPage.java | 244 ++++++++++++ .../hardwaretest/WaterTempControllerTestPage.java | 145 ++++++++ .../extui/page/factory/opt/A8kOptVerification.java | 274 ++++++++++++++ .../factory/opt/OptModuleParamCalibration.java | 232 ++++++++++++ .../HbotCodeScanPosVerificationPage.java | 113 ++++++ .../verification/P10ProjejIDCardTestPage.java | 78 ++++ .../P30InfeedAndPreProcessPosVerificationPage.java | 136 +++++++ ...1ReactionPlatesTransmitPosVerificationPage.java | 128 +++++++ .../verification/P32HbotPosVerificationPage.java | 112 ++++++ .../P33HbotSamplePosVerificationPage.java | 34 ++ .../verification/P34LiquidOperationTestPage.java | 135 +++++++ .../verification/P50VerificationScriptPage.java | 185 ++++++++++ .../A8kSubModuleRegAndConfigInitPage.java | 34 -- .../page/hardwaretest/HBotHardwareTestPage.java | 99 ----- .../page/hardwaretest/ICCardReaderTestPage.java | 36 -- .../hardwaretest/InputIOStateHardwareTestPage.java | 58 --- .../extui/page/hardwaretest/LISUartTestPage.java | 55 --- .../hardwaretest/MiniServoHardwareTestPage.java | 188 ---------- .../hardwaretest/MiniServoPosCalibratePage.java | 119 ------ .../page/hardwaretest/MiscHardwareTestPage.java | 23 -- .../page/hardwaretest/MotorHardwareTestPage.java | 407 --------------------- .../hardwaretest/MotorPPSHardwareTestPage.java | 151 -------- .../page/hardwaretest/OutputIOCtrlTestPage.java | 32 -- .../hardwaretest/PipetteGunHardwareTestPage.java | 82 ----- .../page/hardwaretest/SubBoardProberPage.java | 131 ------- .../hardwaretest/SubModuleVersionPreviewPage.java | 244 ------------ .../hardwaretest/WaterTempControllerTestPage.java | 145 -------- .../HbotCodeScanPosVerificationPage.java | 113 ------ .../test/verification/P10ProjejIDCardTestPage.java | 78 ---- .../P30InfeedAndPreProcessPosVerificationPage.java | 136 ------- ...1ReactionPlatesTransmitPosVerificationPage.java | 128 ------- .../verification/P32HbotPosVerificationPage.java | 112 ------ .../P33HbotSamplePosVerificationPage.java | 34 -- .../verification/P34LiquidOperationTestPage.java | 135 ------- .../verification/P50VerificationScriptPage.java | 185 ---------- src/main/resources/application.yml | 20 +- 76 files changed, 4303 insertions(+), 3818 deletions(-) delete mode 100644 src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java create mode 100644 src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java create mode 100644 src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java delete mode 100644 src/main/java/a8k/extui/page/extapp/A8kOptVerification.java delete mode 100644 src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java create mode 100644 src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java delete mode 100644 src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java delete mode 100644 src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java delete mode 100644 src/main/java/a8k/extui/page/extsetting/db/DeviceExSettingPage.java create mode 100644 src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java create mode 100644 src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/SubBoardProberPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java create mode 100644 src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java create mode 100644 src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java create mode 100644 src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/LISUartTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/MiniServoPosCalibratePage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java delete mode 100644 src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P30InfeedAndPreProcessPosVerificationPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java delete mode 100644 src/main/java/a8k/extui/page/test/verification/P50VerificationScriptPage.java diff --git a/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java b/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java index 128824a..f950a93 100644 --- a/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java +++ b/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java @@ -1,6 +1,8 @@ package a8k.app.service.data; import a8k.app.iflytophald.type.protocol.A8kEcode; +import a8k.app.service.statemgr.GStateMgrService; +import a8k.app.type.DeviceRunMode; import a8k.app.type.exception.AppException; import a8k.app.config.A8kSubModuleInitRegConfig; import a8k.app.dao.SubModuleRegInitialValueDao; @@ -25,6 +27,7 @@ public class SubModuleRegInitialValueMgrService { private final SubModuleRegInitialValueDao subModuleRegInitialValueDao; private final A8kCanBusBaseDriver canBus; private final A8kSubModuleInitRegConfig a8kSubModuleInitRegConfig; + private final GStateMgrService gStateMgrService; /** @@ -93,6 +96,9 @@ public class SubModuleRegInitialValueMgrService { public void syncAllInputIOConfig() throws AppException { log.info("===SyncAllInputIOConfig==="); + if (gStateMgrService.isInMode(DeviceRunMode.RealMode)) { + return; + } for (MId mid : MId.values()) { if (mid == MId.NotSet) diff --git a/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java b/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java index 5f1c756..29aa120 100644 --- a/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java +++ b/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java @@ -22,70 +22,7 @@ import org.springframework.stereotype.Component; @Slf4j @RequiredArgsConstructor public class ExperimentConsistencyTestingService { - /* - * 状态管理器 - */ - final private ConsumablesMgrService consumablesMgrService; - final private TubeHolderSettingMgrService tubeHolderSettingMgrService; - final private TubeholderExSettingMgr tubeholderExSettingMgr; - final private MainFlowCtrlScheduler mainFlowCtrlScheduler; - final private ProjInfoMgrService projInfoMgrService; - - /** - * 开始测试 - * @param - * @throws AppException - */ public void startTest() throws AppException { -// /* - // * 检查当前是否有其他项目正在进行测试 - // */ - // BeforeDoEngineerActionChecker.check(); - // /* - // * 核对试管配置是否符合要求 - // */ - // TubeHolderSetting tubeHolderSetting = tubeHolderSettingMgrService.getThelastActiveTubeHolderSetting(); - // if (tubeHolderSetting == null) { - // throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "缺少试管配置"); - // } - // - // for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) { - // for (Integer projId : tubeSetting.projId) { - // if (projId != 1) { - // throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "目前只支持HsCrp项目"); - // } - // } - // } - // - // - // /* - // * 核对耗材数量是否足够 - // */ - // int testTotalTimes = 0; - // for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) { - // for (Integer ignored : tubeSetting.projId) { - // testTotalTimes += tubeholderExSettingMgr.getTubeExConfig().tubeExConfigs.get(tubeSetting.tubeIndex).repeatTimes; - // } - // } - // Integer consumableNum = consumablesMgrService.getConsumableNum(projInfoMgrService.getProjBuildInInfo(1)); - // if (consumableNum < testTotalTimes) { - // throw AppException.of(A8kEcode.APPE_CONSUME_NOT_ENOUGH, - // String.format("反应板,当前剩余:%d,需要:%d",consumableNum, testTotalTimes)); - // } - // if (!consumablesMgrService.isHasEnoughTips((int) (testTotalTimes * 1.2))) { - // throw AppException.of(A8kEcode.APPE_TIP_NOT_ENOUGH, - // String.format("Tip不足,需要:%d", (int) (testTotalTimes * 1.2))); - // } - // - // - // log.info("开始试剂实验一致性检测"); - // tubeholderExSettingMgr.setEnabled(true); - // mainFlowCtrlScheduler.startWork(() -> { - // log.info("试剂实验一致性检测工作线程结束"); - // tubeholderExSettingMgr.setEnabled(false); - // }); } - - } diff --git a/src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java b/src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java index 7c420be..9974c4b 100644 --- a/src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java +++ b/src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java @@ -34,7 +34,7 @@ public class OSDeviceInfoMgrService { } public String readSN() { - return getEnv("/iflytop/env/sn", gStateMgrService::getSn); + return getEnv("/iflytop/env/sn", "TEST001"); } public String setAssetId(String assetId) throws AppException { @@ -43,7 +43,7 @@ public class OSDeviceInfoMgrService { } public String readAssetId() { - return getEnv("/iflytop/env/assetid", gStateMgrService::getAssetId); + return getEnv("/iflytop/env/assetid", "TEST001"); } public String setDeviceType(String deviceType) throws AppException { @@ -52,7 +52,7 @@ public class OSDeviceInfoMgrService { } public String readDeviceType() { - return getEnv("/iflytop/env/device-type", gStateMgrService::getDeviceType); + return getEnv("/iflytop/env/device-type", "A8000"); } public String setDeviceVersion(String deviceVersion) throws AppException { @@ -61,7 +61,7 @@ public class OSDeviceInfoMgrService { } public String readDeviceVersion() { - return getEnv("/iflytop/env/device-version", gStateMgrService::getDeviceVersion); + return getEnv("/iflytop/env/device-version", "1"); } public String setManufactureDate(String manufactureDate) throws AppException { @@ -70,22 +70,22 @@ public class OSDeviceInfoMgrService { } public String readManufactureDate() { - return getEnv("/iflytop/env/manufacture-date", gStateMgrService::getManufactureDate); + return getEnv("/iflytop/env/manufacture-date", "NotSet"); } - private String getEnv(String path, EnvReadCallback readStateFn) { + private String getEnv(String path, String defaultVal) { if (OS.isRunOnWindows()) { - if (readStateFn != null) { - return readStateFn.read(); - } - return "NULL"; + path = "./runenv/virtual/" + path; } try { - return FileUtil.readUtf8String(path); + String val = FileUtil.readUtf8String(path); + if (val == null || val.isEmpty()) { + return defaultVal; + } + return val; } catch (Exception e) { - log.error("读取设备信息失败: {}", e.getMessage()); - return "Error"; + return defaultVal; } } @@ -94,9 +94,7 @@ public class OSDeviceInfoMgrService { throw AppException.of(A8kEcode.CODEERROR, String.format("设备%s不能为空", path)); } if (OS.isRunOnWindows()) { - if (updateStateFn != null) - updateStateFn.update(val); - return; + path = "./runenv/virtual/" + path; } try { @@ -106,18 +104,14 @@ public class OSDeviceInfoMgrService { } catch (Exception e) { throw AppException.of(A8kEcode.CODEERROR, String.format("设备%s设置失败: %s", path, e.getMessage())); } - } + @FunctionalInterface public interface EnvUpdateCallback { void update(String val) throws AppException; } - @FunctionalInterface - public interface EnvReadCallback { - String read(); - } @PostConstruct void init() { diff --git a/src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java b/src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java index 7e2f1a0..bd62fa7 100644 --- a/src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java +++ b/src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java @@ -47,8 +47,7 @@ public class AppFlagStateMgr { private final GStateMgrService gstate; - DeviceWarningFlagStateGroup deviceWarningFlagState = new DeviceWarningFlagStateGroup(); - DeviceWarningFlagStateGroup virtualWarningState = new DeviceWarningFlagStateGroup(); //虚拟状态,用于前端状态测试 + DeviceWarningFlagStateGroup deviceWarningFlagState = new DeviceWarningFlagStateGroup(); @PostConstruct @@ -58,12 +57,13 @@ public class AppFlagStateMgr { continue; deviceWarningFlagState.states.add(new AppFlagState(flagKey, flagKey.flagType)); } - virtualWarningState = deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateInitVal(deviceWarningFlagState); + + deviceVirtualStateMgrService.initDeviceFlagStateVirtualState(deviceWarningFlagState); } synchronized public DeviceWarningFlagStateGroup getFlagState() { if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) { - return virtualWarningState; + return deviceVirtualStateMgrService.getDeviceFlagStateVirtualState(); } // 正常状态下返回值 return ObjectUtil.clone(deviceWarningFlagState); @@ -71,7 +71,7 @@ public class AppFlagStateMgr { synchronized public Integer getStateVersion() { if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) { - return virtualWarningState.version; // + return deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateVersion(); } return deviceWarningFlagState.version; //返回当前状态版本号 } @@ -112,15 +112,15 @@ public class AppFlagStateMgr { if (!flagKey.enabled) return; - var state = deviceWarningFlagState; if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) { - state = virtualWarningState; //如果是虚拟状态,则使用虚拟状态 + deviceVirtualStateMgrService.deviceFlagStateVirtualStateSetFlagStateVal(flagKey, val); + return; } - for (AppFlagState flagState : state.states) { + for (AppFlagState flagState : deviceWarningFlagState.states) { if (flagState.keyName.equals(flagKey)) { flagState.state = val; - state.version++; + deviceWarningFlagState.version++; return; } } @@ -131,17 +131,17 @@ public class AppFlagStateMgr { return; log.info("clearFlagState: {}", flagKey); - var state = deviceWarningFlagState; if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) { - state = virtualWarningState; //如果是虚拟状态,则使用虚拟状态 + deviceVirtualStateMgrService.deviceFlagStateVirtualStateClearFlagState(flagKey); + return; } - for (AppFlagState flagState : state.states) { + for (AppFlagState flagState : deviceWarningFlagState.states) { if (flagState.keyName.equals(flagKey)) { flagState.state = false; flagState.errorDetailInfo = null; flagState.errorPromptInfo = null; - state.version++; + deviceWarningFlagState.version++; return; } } @@ -149,12 +149,12 @@ public class AppFlagStateMgr { synchronized public void clearAllFlagState() { log.info("clearAllFlagState: Clear all DeviceWarningFlagState"); - var state = deviceWarningFlagState; if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) { - state = virtualWarningState; //如果是虚拟状态,则使用虚拟状态 + deviceVirtualStateMgrService.deviceFlagStateVirtualStateClearAllFlagState(); + return; } - for (AppFlagState flagState : state.states) { + for (AppFlagState flagState : deviceWarningFlagState.states) { if (flagState.flagType.equals(AppFlagType.NormalFlag) || flagState.flagType.equals(AppFlagType.WarningFlag)) { continue; } @@ -165,7 +165,7 @@ public class AppFlagStateMgr { } } - state.version++; + deviceWarningFlagState.version++; } synchronized public boolean isFlagTrigger(AppFlagKey flagType) { @@ -183,7 +183,4 @@ public class AppFlagStateMgr { } - synchronized public void resetVirtualState() { - virtualWarningState = deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateInitVal(deviceWarningFlagState); - } } \ No newline at end of file diff --git a/src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java b/src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java index e10009d..7ae76ba 100644 --- a/src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java +++ b/src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java @@ -1,257 +1,161 @@ package a8k.app.service.virtualstate; -import a8k.app.iflytophald.type.protocol.A8kEcode; -import a8k.app.constant.AppConstant; -import a8k.app.factory.FakeA8kConsumableContainerFactory; -import a8k.app.factory.FakeAppErrorFactory; -import a8k.app.factory.ZAppPromptFactory; -import a8k.app.service.utils.ProjInfoUtils; +import a8k.app.service.virtualstate.generator.*; import a8k.app.type.AppFlagKey; import a8k.app.type.DeviceWarningFlagStateGroup; -import a8k.app.type.PreReactionGrid; 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.*; -import a8k.app.type.error.AppError; -import a8k.app.type.exception.AppException; -import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; -import java.util.Date; - @Component @RequiredArgsConstructor @Slf4j public class DeviceVirtualStateMgrService { + private final VirtualStateModeMgr virtualStateModeMgr; + - private final TubeVirtualStateGenerator tubeVirtualStateGenerator; + private final TubeVirtualStateGenerator tubeVirtualStateGenerator; + private final DeviceFlagStateVirtualStateGenerator deviceFlagStateVirtualStateGenerator; + private final ConsumableStateGenerator consumableStateGenerator; + private final VirtualIncubationPlateStateGenerator virtualIncubationPlateStateGenerator; + private final VirtualPreReactionGridGroupStateGenerator virtualPreReactionGridGroupStateGenerator; + private final VirtualOptScannerStateGenerator virtualOptScannerStateGenerator; + private final VirtualDeviceWorkStateGenerator virtualDeviceWorkStateGenerator; + private final VirtualSensorStateGenerator virtualSensorStateGenerator; - public TubeHolder getVirtualTubeHolderState() { + + // + // 试管架状态 + // + + synchronized public TubeHolder getVirtualTubeHolderState() { return tubeVirtualStateGenerator.getVirtualTubeHolderState(); } - public EmergencyTubePos getVirtualEmergencyTube() { + synchronized public EmergencyTubePos getVirtualEmergencyTube() { return tubeVirtualStateGenerator.getVirtualEmergencyTube(); } - public Integer getVirtualTubeStateVersion() { + synchronized public Integer getVirtualTubeStateVersion() { return tubeVirtualStateGenerator.getVirtualTubeStateVersion(); } - public void setEmptyTubeState(TubeState emptyTubeState) { - tubeVirtualStateGenerator.setEmptyTubeState(emptyTubeState); - } + // + // 设备状态标志位 + // - 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; + public void initDeviceFlagStateVirtualState(DeviceWarningFlagStateGroup group) { + deviceFlagStateVirtualStateGenerator.init(group); } - synchronized public Integer getVirtualConsumableContainerStateVersion() { - //虚拟状态生成模式 - return Integer.MAX_VALUE; + public DeviceWarningFlagStateGroup getDeviceFlagStateVirtualState() { + return deviceFlagStateVirtualStateGenerator.getDeviceFlagStateVirtualState(); } + public Integer getDeviceFlagStateVirtualStateVersion() { + return deviceFlagStateVirtualStateGenerator.getVersion(); + } - /** - * 获取虚拟孵育盘状态 - * @return 虚拟孵育盘状态 - */ - synchronized public IncubationPlate getVirtualIncubationPlateState() { - IncubationPlate incubationPlate = new IncubationPlate(); - int i = 0; - for (IncubationSubTank subtank : incubationPlate.subtanks) { - i++; - switch (i) { - case 1 -> subtank.state = IncubationSubTankState.RESERVED; - case 2 -> subtank.state = IncubationSubTankState.WAITING_FOR_DROP; - case 3 -> subtank.state = IncubationSubTankState.INCUBATING; - case 4 -> subtank.state = IncubationSubTankState.ERROR; - case 5 -> subtank.state = IncubationSubTankState.INCUBATION_COMPLETE; - default -> subtank.state = IncubationSubTankState.EMPTY; - } - - subtank.sampleInfo = new SampleInfo( - "250109_001E01", 0, false, false, BloodType.WHOLE_BLOOD, "B3A7KK8DKF", "250109_001E" - ); - - - subtank.sampleInfo.bloodType = BloodType.WHOLE_BLOOD; - subtank.sampleInfo.sampleBarcode = "112334455667"; - subtank.sampleInfo.userid = "250109_001E"; - subtank.projInfo = new ProjBriefInfo(); - subtank.projInfo.projId = 1; - subtank.projInfo.projName = "hsCRP"; - subtank.projInfo.projShortName = "CA"; - subtank.projInfo.color = "#DC143C"; - subtank.sampleInfo.sampleId = "250109_001E01"; - subtank.projId = 1; - subtank.lotId = "CA123456"; - subtank.isEmergency = i == 2; - if (subtank.state.equals(IncubationSubTankState.ERROR)) { - subtank.error = new AppError(A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, ""); - subtank.errorInfo = ZAppPromptFactory.buildAppPrompt(subtank.error); - } - subtank.startIncubatedTime = new Date().getTime(); - subtank.incubatedTimeSec = 3 * 60; - subtank.remainTimeSec = 3 * 60; - } - return incubationPlate; + public void deviceFlagStateVirtualStateSetFlagStateVal(AppFlagKey flagKey, boolean val) { + deviceFlagStateVirtualStateGenerator.setFlagStateVal(flagKey, val); } + public void deviceFlagStateVirtualStateClearFlagState(AppFlagKey flagKey) { + deviceFlagStateVirtualStateGenerator.clearFlagState(flagKey); + } - public PreReactionGridGroup getFakePreReactionGridGroup(ConsumableGroup group) { - PreReactionGridGroup gridGroup = new PreReactionGridGroup(group); - gridGroup.group = group; - if (group.off % 2 == 0) { - gridGroup.installed = true; - gridGroup.hasSomeGridInReacting = true; - gridGroup.hasSomeGridReactedCompleted = true; - } else { - gridGroup.installed = false; - gridGroup.hasSomeGridInReacting = false; - gridGroup.hasSomeGridReactedCompleted = false; - } - gridGroup.consumableType = LittleBottleConsumableType.BufferSolution; - var projBuildInInfo = FakeA8kConsumableContainerFactory.buildFakeProjBuildInInfo(group.off); - gridGroup.projBriefInfo = ProjInfoUtils.buildProjBrefInfo(projBuildInInfo); - gridGroup.version = 10; - for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { - - gridGroup.grids.get(i).projId = projBuildInInfo.projId; - gridGroup.grids.get(i).projBuildinInfo = projBuildInInfo; - gridGroup.grids.get(i).projExtInfoCard = null; - - switch (i / 5) { - case 0 -> { - gridGroup.grids.get(i).state = PreReactionGrid.State.UNINSTALL; - } - case 1 -> { - gridGroup.grids.get(i).state = PreReactionGrid.State.USED; - } - - case 2 -> { - gridGroup.grids.get(i).state = PreReactionGrid.State.REACTION_COMPLETED; - gridGroup.grids.get(i).sampleInfo.userid = "UID123"; - } - case 3 -> { - gridGroup.grids.get(i).state = PreReactionGrid.State.REACTING; - gridGroup.grids.get(i).sampleInfo.userid = "UID123"; - gridGroup.grids.get(i).reactionRemainingTime = 3 * 60L; - } - case 4 -> { - gridGroup.grids.get(i).state = PreReactionGrid.State.TO_BE_USED; - } - } - } - return gridGroup; + public void deviceFlagStateVirtualStateClearAllFlagState() { + deviceFlagStateVirtualStateGenerator.clearAllFlagState(); } - int cnt = 0; + // + // 耗材状态 + // - public SensorState getVirtualSensorState() { - SensorState sensorState = new SensorState(); - sensorState.setPboxTemperature(24); - sensorState.setIncubateBoxTemperature(25); - sensorState.setWasteBinFullFlag(false); - cnt++; - sensorState.setIncubateBoxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态 - sensorState.setPboxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态 + synchronized public A8kConsumableContainer getVirtualConsumableContainerState() { + return consumableStateGenerator.getVirtualConsumableContainerState(); + } + + synchronized public Integer getVirtualConsumableContainerStateVersion() { + return consumableStateGenerator.getVersion(); + } - return sensorState; + // + // 获取虚拟孵育盘状态 + // + synchronized public IncubationPlate getVirtualIncubationPlateState() { + return virtualIncubationPlateStateGenerator.getVirtualIncubationPlateState(); } // - // VIRTUAL_OPERATION + // 获取虚拟预反应格状态 // - public DeviceWarningFlagStateGroup getDeviceFlagStateVirtualStateInitVal(DeviceWarningFlagStateGroup deviceWarningFlagState) { - - DeviceWarningFlagStateGroup virtualWarningState = ObjectUtil.clone(deviceWarningFlagState); //初始化时复制一份状态版本号 - virtualWarningState.version = 10000; - - //设置VirtualState初始值 - var consumeNotEnoughState = virtualWarningState.find(AppFlagKey.ConsumeNotEnoughState); - consumeNotEnoughState.state = true; // - consumeNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildAEConsumeNotEnoughError(); - consumeNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(consumeNotEnoughState.errorDetailInfo); - - var tipNotEnoughState = virtualWarningState.find(AppFlagKey.TipNotEnoughState); - tipNotEnoughState.state = true; // - tipNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_TIP_NOT_ENOUGH); - tipNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(tipNotEnoughState.errorDetailInfo); - - var infeedExceptionState = virtualWarningState.find(AppFlagKey.InfeedExceptionState); - infeedExceptionState.state = true; // - infeedExceptionState.errorDetailInfo = FakeAppErrorFactory.buildAEHardwareError(); - infeedExceptionState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(infeedExceptionState.errorDetailInfo); - - var outfeedAreaFullState = virtualWarningState.find(AppFlagKey.OutfeedAreaFullState); - outfeedAreaFullState.state = true; // - outfeedAreaFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_OUTFEED_AREA_IS_FULL); - outfeedAreaFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(outfeedAreaFullState.errorDetailInfo); - - var wasteBinFullState = virtualWarningState.find(AppFlagKey.WasteBinFull); - wasteBinFullState.state = true; // - wasteBinFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_WAST_BIN_IS_FULL); - wasteBinFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(wasteBinFullState.errorDetailInfo); - - if (AppFlagKey.InfeedPPSFlag.enabled) - virtualWarningState.find(AppFlagKey.InfeedPPSFlag).state = true; //入料区光电 - if (AppFlagKey.OutfeedPPSFlag.enabled) - virtualWarningState.find(AppFlagKey.OutfeedPPSFlag).state = false; //入料区光电 - if (AppFlagKey.TubeholderChannelPPSFlag.enabled) - virtualWarningState.find(AppFlagKey.TubeholderChannelPPSFlag).state = true; //入料区光电 - if (AppFlagKey.PlateBoxLidPPSState.enabled) - virtualWarningState.find(AppFlagKey.PlateBoxLidPPSState).state = false; //入料区光电 - return virtualWarningState; + public PreReactionGridGroup getFakePreReactionGridGroup(ConsumableGroup group) { + return virtualPreReactionGridGroupStateGenerator.getGroupState(group); + } + synchronized public OptScanModuleState getVirtualOptScanModuleState() { + return virtualOptScannerStateGenerator.getVirtualOptScanModuleState(); + } + + synchronized public Integer getVirtualOptScanModuleStateVersion() { + return virtualOptScannerStateGenerator.getVersion(); } + // + // DeviceWorkState + // synchronized public DeviceWorkState getVirtualDeviceWorkState() { - DeviceWorkState deviceWorkState = new DeviceWorkState(); - deviceWorkState.workState = A8kWorkState.WORKING; - return deviceWorkState; + return virtualDeviceWorkStateGenerator.getState(); } synchronized public Integer getVirtualDeviceWorkStateVersion() { - //虚拟状态生成模式 - return Integer.MAX_VALUE; + return virtualDeviceWorkStateGenerator.getVersion(); } - 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; + // + // SensorState + // + public SensorState getVirtualSensorState() { + return virtualSensorStateGenerator.getState(); } - synchronized public Integer getVirtualOptScanModuleStateVersion() { - //虚拟状态生成模式 - return Integer.MAX_VALUE; + + // + // 状态修改方法 + // + + + + synchronized public void changeEmergencyTubeState(TubeState state) { + tubeVirtualStateGenerator.changeEmergencyTubeState(state); + } + + synchronized public TubeState getEmergencyTubeState() { + return tubeVirtualStateGenerator.emergencyTubeState; + } + + synchronized public void changeVirtualStateMode(VirtualStateMode mode) { + virtualStateModeMgr.virtualStateMode = mode; + + tubeVirtualStateGenerator.incrementVersion(); + deviceFlagStateVirtualStateGenerator.incrementVersion(); + consumableStateGenerator.incrementVersion(); + virtualIncubationPlateStateGenerator.incrementVersion(); + virtualPreReactionGridGroupStateGenerator.incrementVersion(); + virtualOptScannerStateGenerator.incrementVersion(); + virtualDeviceWorkStateGenerator.incrementVersion(); + virtualSensorStateGenerator.incrementVersion(); + } + synchronized public VirtualStateMode getMode() { + return virtualStateModeMgr.virtualStateMode; } } diff --git a/src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java deleted file mode 100644 index d408285..0000000 --- a/src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java +++ /dev/null @@ -1,106 +0,0 @@ -package a8k.app.service.virtualstate; - -import a8k.app.factory.FakeA8kConsumableContainerFactory; -import a8k.app.factory.FakeAppErrorFactory; -import a8k.app.factory.ZAppPromptFactory; -import a8k.app.type.a8k.BloodType; -import a8k.app.type.a8k.proj.ProjBriefInfo; -import a8k.app.type.a8k.state.EmergencyTubePos; -import a8k.app.type.a8k.state.Tube; -import a8k.app.type.a8k.state.TubeHolder; -import a8k.app.type.a8k.state.enumtype.TubeHolderState; -import a8k.app.type.a8k.state.enumtype.TubeState; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class TubeVirtualStateGenerator { - - TubeState emptyTubeState = TubeState.EMPTY; - Integer stateVersion = Integer.MAX_VALUE / 2; - - void addProjInfoToTube(Tube tube, Integer projId) { - ProjBriefInfo projBriefInfo = FakeA8kConsumableContainerFactory.buildFakeProjBriefInfo(projId); - tube.getProjInfo().add(projBriefInfo); - tube.getProjIds().add(projBriefInfo.projId); - } - - Tube createFakeTube(Integer pos) { - Tube tube = new Tube(pos); - tube.setSampleId("250109_001E0" + pos); - tube.setBloodType(BloodType.WHOLE_BLOOD); - tube.setSampleBarcode("112334455667"); - tube.setUserid(String.format("250109_%dE", pos)); - - switch (pos) { - case 1 -> tube.setState(TubeState.EMPTY); - case 2 -> { - tube.setState(TubeState.ERROR); - tube.setError(FakeAppErrorFactory.buildAEConsumeNotEnoughError()); - tube.setErrorInfo(ZAppPromptFactory.buildAppPrompt(tube.getError())); - - addProjInfoToTube(tube, 1); - addProjInfoToTube(tube, 2); - - } - case 3, 4, 5, 6 -> { - tube.setState(TubeState.PROCESS_COMPLETE); - addProjInfoToTube(tube, 1); - addProjInfoToTube(tube, 2); - addProjInfoToTube(tube, 3); - } - case 7 -> { - tube.setState(TubeState.PROCESSING); - addProjInfoToTube(tube, 1); - addProjInfoToTube(tube, 2); - addProjInfoToTube(tube, 3); - } - case 8, 9, 10 -> { - tube.setState(TubeState.TO_BE_PROCESSED); - addProjInfoToTube(tube, 1); - addProjInfoToTube(tube, 2); - } - } - tube.setIsHighTube(pos % 2 == 0); //假设偶数位置为高位管 - - return tube; - } - - public TubeHolder getVirtualTubeHolderState() { - TubeHolder tubeHolder = new TubeHolder(); - tubeHolder.setTubes(new Tube[]{ - createFakeTube(1), - createFakeTube(2), - createFakeTube(3), - createFakeTube(4), - createFakeTube(5), - createFakeTube(6), - createFakeTube(7), - createFakeTube(8), - createFakeTube(9), - createFakeTube(10) - }); - tubeHolder.setState(TubeHolderState.PROCESSING); - return tubeHolder; - } - - public EmergencyTubePos getVirtualEmergencyTube() { - var tubePosState = new EmergencyTubePos(); - tubePosState.tube = createFakeTube(0); - tubePosState.tube.setPos(0); - tubePosState.tube.setIsEmergency(true); - tubePosState.tube.setState(emptyTubeState); - return tubePosState; - } - - public Integer getVirtualTubeStateVersion() { - //虚拟状态生成模式 - return stateVersion; - } - - public void setEmptyTubeState(TubeState emptyTubeState) { - this.emptyTubeState = emptyTubeState; - stateVersion++; - } -} diff --git a/src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java b/src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java new file mode 100644 index 0000000..6124370 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java @@ -0,0 +1,7 @@ +package a8k.app.service.virtualstate; + +public enum VirtualStateMode { + UI_TEST_MODE,//状态尽可能能全面的测试前端显示 + INSTRUCTION_BOOK_IDLE,//设备空闲 + INSTRUCTION_BOOK_RUNNING,//设备运行中 +} diff --git a/src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java b/src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java new file mode 100644 index 0000000..0cb8798 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java @@ -0,0 +1,22 @@ +package a8k.app.service.virtualstate; + +import a8k.app.type.a8k.state.enumtype.TubeState; +import org.springframework.stereotype.Component; + +@Component +public class VirtualStateModeMgr { + public VirtualStateMode virtualStateMode = VirtualStateMode.UI_TEST_MODE; + + public Boolean isInMode(VirtualStateMode... modes) { + if (modes == null) { + return false; + } + for (VirtualStateMode m : modes) { + if (virtualStateMode.equals(m)) { + return true; + } + } + return false; + + } +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java new file mode 100644 index 0000000..599ebef --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java @@ -0,0 +1,51 @@ +package a8k.app.service.virtualstate.generator; + + +import a8k.app.factory.FakeA8kConsumableContainerFactory; +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.a8k.container.A8kConsumableContainer; +import a8k.app.type.exception.AppException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class ConsumableStateGenerator { + private final VirtualStateModeMgr virtualStateModeMgr; + private Integer version = Integer.MAX_VALUE / 2; + A8kConsumableContainer state = new A8kConsumableContainer(); + + // + // 耗材状态 + // + + synchronized public A8kConsumableContainer getVirtualConsumableContainerState() { + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE, INSTRUCTION_BOOK_RUNNING, INSTRUCTION_BOOK_IDLE -> { + //虚拟状态生成模式 + 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 getVersion() { + //虚拟状态生成模式 + return version; + } + + synchronized public void incrementVersion() { + version++; + } +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java new file mode 100644 index 0000000..f7f7793 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java @@ -0,0 +1,118 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.factory.FakeAppErrorFactory; +import a8k.app.factory.ZAppPromptFactory; +import a8k.app.iflytophald.type.protocol.A8kEcode; +import a8k.app.service.statemgr.AppFlagStateMgr; +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.AppFlagKey; +import a8k.app.type.AppFlagType; +import a8k.app.type.DeviceWarningFlagStateGroup; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class DeviceFlagStateVirtualStateGenerator { + private final VirtualStateModeMgr virtualStateModeMgr; + + public DeviceWarningFlagStateGroup state; + + // + // VIRTUAL_OPERATION + // + public DeviceWarningFlagStateGroup getDeviceFlagStateVirtualState() { + return state; + } + + public void init(DeviceWarningFlagStateGroup deviceWarningFlagState) { + + DeviceWarningFlagStateGroup virtualWarningState = ObjectUtil.clone(deviceWarningFlagState); //初始化时复制一份状态版本号 + virtualWarningState.version = 10000; + + //设置VirtualState初始值 + var consumeNotEnoughState = virtualWarningState.find(AppFlagKey.ConsumeNotEnoughState); + consumeNotEnoughState.state = true; // + consumeNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildAEConsumeNotEnoughError(); + consumeNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(consumeNotEnoughState.errorDetailInfo); + + var tipNotEnoughState = virtualWarningState.find(AppFlagKey.TipNotEnoughState); + tipNotEnoughState.state = true; // + tipNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_TIP_NOT_ENOUGH); + tipNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(tipNotEnoughState.errorDetailInfo); + + var infeedExceptionState = virtualWarningState.find(AppFlagKey.InfeedExceptionState); + infeedExceptionState.state = true; // + infeedExceptionState.errorDetailInfo = FakeAppErrorFactory.buildAEHardwareError(); + infeedExceptionState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(infeedExceptionState.errorDetailInfo); + + var outfeedAreaFullState = virtualWarningState.find(AppFlagKey.OutfeedAreaFullState); + outfeedAreaFullState.state = true; // + outfeedAreaFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_OUTFEED_AREA_IS_FULL); + outfeedAreaFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(outfeedAreaFullState.errorDetailInfo); + + var wasteBinFullState = virtualWarningState.find(AppFlagKey.WasteBinFull); + wasteBinFullState.state = true; // + wasteBinFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_WAST_BIN_IS_FULL); + wasteBinFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(wasteBinFullState.errorDetailInfo); + + if (AppFlagKey.InfeedPPSFlag.enabled) + virtualWarningState.find(AppFlagKey.InfeedPPSFlag).state = true; //入料区光电 + if (AppFlagKey.OutfeedPPSFlag.enabled) + virtualWarningState.find(AppFlagKey.OutfeedPPSFlag).state = false; //入料区光电 + if (AppFlagKey.TubeholderChannelPPSFlag.enabled) + virtualWarningState.find(AppFlagKey.TubeholderChannelPPSFlag).state = true; //入料区光电 + if (AppFlagKey.PlateBoxLidPPSState.enabled) + virtualWarningState.find(AppFlagKey.PlateBoxLidPPSState).state = false; //入料区光电 + state = virtualWarningState; + state.version = 10000; //初始化时设置版本号为10000 + } + + public void incrementVersion() { + state.version++; + } + + public Integer getVersion() { + return state.version; + } + + + public void setFlagStateVal(AppFlagKey flagKey, boolean val) { + for (AppFlagStateMgr.AppFlagState flagState : state.states) { + if (flagState.keyName.equals(flagKey)) { + flagState.state = val; + incrementVersion(); + return; + } + } + } + + public void clearFlagState(AppFlagKey flagKey) { + for (AppFlagStateMgr.AppFlagState flagState : state.states) { + if (flagState.keyName.equals(flagKey)) { + flagState.state = false; + flagState.errorDetailInfo = null; + flagState.errorPromptInfo = null; + incrementVersion(); + return; + } + } + } + + public void clearAllFlagState() { + for (AppFlagStateMgr.AppFlagState flagState : state.states) { + if (flagState.flagType.equals(AppFlagType.NormalFlag) || flagState.flagType.equals(AppFlagType.WarningFlag)) { + continue; + } + if (flagState.state) { + flagState.state = false; + flagState.errorDetailInfo = null; + flagState.errorPromptInfo = null; + incrementVersion(); + } + } + } +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java new file mode 100644 index 0000000..6d22b1b --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java @@ -0,0 +1,128 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.factory.FakeA8kConsumableContainerFactory; +import a8k.app.factory.FakeAppErrorFactory; +import a8k.app.factory.ZAppPromptFactory; +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.a8k.BloodType; +import a8k.app.type.a8k.proj.ProjBriefInfo; +import a8k.app.type.a8k.state.EmergencyTubePos; +import a8k.app.type.a8k.state.Tube; +import a8k.app.type.a8k.state.TubeHolder; +import a8k.app.type.a8k.state.enumtype.TubeHolderState; +import a8k.app.type.a8k.state.enumtype.TubeState; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class TubeVirtualStateGenerator { + private final VirtualStateModeMgr virtualStateModeMgr; + private Integer version = Integer.MAX_VALUE / 2; + public TubeState emergencyTubeState = TubeState.EMPTY; + + + public TubeHolder getVirtualTubeHolderState() { + TubeHolder tubeHolder = new TubeHolder(); + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE, INSTRUCTION_BOOK_RUNNING -> { + tubeHolder.setState(TubeHolderState.PROCESSING); + tubeHolder.setTubes(new Tube[]{ + createFakeTube(1), + createFakeTube(2), + createFakeTube(3), + createFakeTube(4), + createFakeTube(5), + createFakeTube(6), + createFakeTube(7), + createFakeTube(8), + createFakeTube(9), + createFakeTube(10) + }); + } + case INSTRUCTION_BOOK_IDLE -> { + tubeHolder.setState(TubeHolderState.IDLE); + } + } + return tubeHolder; + } + + public EmergencyTubePos getVirtualEmergencyTube() { + var tubePosState = new EmergencyTubePos(); + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE, INSTRUCTION_BOOK_RUNNING -> { + tubePosState.tube = createFakeTube(0); + tubePosState.tube.setPos(0); + tubePosState.tube.setIsEmergency(true); + tubePosState.tube.setState(emergencyTubeState); + } + case INSTRUCTION_BOOK_IDLE -> { + tubePosState.tube.setState(emergencyTubeState); + } + } + return tubePosState; + } + + public Integer getVirtualTubeStateVersion() { + return version; + } + + public void incrementVersion() { + version++; + } + + private void addProjInfoToTube(Tube tube, Integer projId) { + ProjBriefInfo projBriefInfo = FakeA8kConsumableContainerFactory.buildFakeProjBriefInfo(projId); + tube.getProjInfo().add(projBriefInfo); + tube.getProjIds().add(projBriefInfo.projId); + } + + private Tube createFakeTube(Integer pos) { + Tube tube = new Tube(pos); + tube.setSampleId("250109_001E0" + pos); + tube.setBloodType(BloodType.WHOLE_BLOOD); + tube.setSampleBarcode("112334455667"); + tube.setUserid(String.format("250109_%dE", pos)); + + switch (pos) { + case 1 -> tube.setState(TubeState.EMPTY); + case 2 -> { + tube.setState(TubeState.ERROR); + tube.setError(FakeAppErrorFactory.buildAEConsumeNotEnoughError()); + tube.setErrorInfo(ZAppPromptFactory.buildAppPrompt(tube.getError())); + + addProjInfoToTube(tube, 1); + addProjInfoToTube(tube, 2); + + } + case 3, 4, 5, 6 -> { + tube.setState(TubeState.PROCESS_COMPLETE); + addProjInfoToTube(tube, 1); + addProjInfoToTube(tube, 2); + addProjInfoToTube(tube, 3); + } + case 7 -> { + tube.setState(TubeState.PROCESSING); + addProjInfoToTube(tube, 1); + addProjInfoToTube(tube, 2); + addProjInfoToTube(tube, 3); + } + case 8, 9, 10 -> { + tube.setState(TubeState.TO_BE_PROCESSED); + addProjInfoToTube(tube, 1); + addProjInfoToTube(tube, 2); + } + } + tube.setIsHighTube(pos % 2 == 0); //假设偶数位置为高位管 + + return tube; + } + + synchronized public void changeEmergencyTubeState(TubeState state) { + this.emergencyTubeState = state; + incrementVersion(); + } + +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java new file mode 100644 index 0000000..5e08957 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java @@ -0,0 +1,59 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.constant.AppConstant; +import a8k.app.factory.FakeA8kConsumableContainerFactory; +import a8k.app.service.utils.ProjInfoUtils; +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.PreReactionGrid; +import a8k.app.type.PreReactionGridGroup; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.LittleBottleConsumableType; +import a8k.app.type.a8k.state.DeviceWorkState; +import a8k.app.type.a8k.state.enumtype.A8kWorkState; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VirtualDeviceWorkStateGenerator { + + private final VirtualStateModeMgr virtualStateModeMgr; + private Integer version = Integer.MAX_VALUE / 2; + + synchronized public DeviceWorkState getState() { + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE -> { //UI测试 + return getRunningState(); + } + case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲 + return getIDLEState(); + } + case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中 + return getRunningState(); + } + } + return null; + } + + synchronized public Integer getVersion() { + return version; + } + + synchronized public void incrementVersion() { + version++; + } + + private DeviceWorkState getIDLEState() { + DeviceWorkState deviceWorkState = new DeviceWorkState(); + deviceWorkState.workState = A8kWorkState.IDLE; + return deviceWorkState; + } + + private DeviceWorkState getRunningState() { + DeviceWorkState deviceWorkState = new DeviceWorkState(); + deviceWorkState.workState = A8kWorkState.WORKING; + return deviceWorkState; + } +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java new file mode 100644 index 0000000..9e60aa2 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java @@ -0,0 +1,139 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.factory.ZAppPromptFactory; +import a8k.app.iflytophald.type.protocol.A8kEcode; +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.a8k.BloodType; +import a8k.app.type.a8k.proj.ProjBriefInfo; +import a8k.app.type.a8k.state.IncubationPlate; +import a8k.app.type.a8k.state.IncubationSubTank; +import a8k.app.type.a8k.state.SampleInfo; +import a8k.app.type.a8k.state.enumtype.IncubationSubTankState; +import a8k.app.type.error.AppError; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VirtualIncubationPlateStateGenerator { + private final VirtualStateModeMgr virtualStateModeMgr; + + synchronized public IncubationPlate getVirtualIncubationPlateState() { + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE -> { //UI测试 + return getStateInUITestMode(); + } + case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲 + return getStateInInstructionBookIDLE(); + } + case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中 + return getStateInInstructionBookRunning(); + } + } + return null; + } + + public void incrementVersion() {} + + // + // PRIVATE + // + + synchronized private IncubationPlate getStateInInstructionBookIDLE() { + IncubationPlate incubationPlate = new IncubationPlate(); + for (IncubationSubTank subtank : incubationPlate.subtanks) { + subtank.state = IncubationSubTankState.EMPTY; + } + return incubationPlate; + } + + synchronized private IncubationPlate getStateInUITestMode() { + /* + * 尽可能展示所有状态测试前端页面 + */ + IncubationPlate incubationPlate = new IncubationPlate(); + int i = 0; + for (IncubationSubTank subtank : incubationPlate.subtanks) { + assignSubTankState(subtank); + i++; + switch (i % 6) { + case 1 -> subtank.state = IncubationSubTankState.RESERVED; + case 2 -> subtank.state = IncubationSubTankState.WAITING_FOR_DROP; + case 3 -> subtank.state = IncubationSubTankState.INCUBATING; + case 4 -> subtank.state = IncubationSubTankState.ERROR; + case 5 -> subtank.state = IncubationSubTankState.INCUBATION_COMPLETE; + default -> subtank.state = IncubationSubTankState.EMPTY; + } + subtank.isEmergency = (i % 2 == 0); + } + return incubationPlate; + } + + synchronized private IncubationPlate getStateInInstructionBookRunning() { + IncubationPlate incubationPlate = new IncubationPlate(); + int i = 0; + for (IncubationSubTank subtank : incubationPlate.subtanks) { + i++; + switch (i) { + case 1 -> { + assignSubTankState(subtank); + subtank.state = IncubationSubTankState.RESERVED; + } + case 2 -> { + assignSubTankState(subtank); + subtank.state = IncubationSubTankState.WAITING_FOR_DROP; + subtank.isEmergency = (true); + } + case 3 -> { + assignSubTankState(subtank); + subtank.state = IncubationSubTankState.INCUBATING; + } + case 4 -> { + assignSubTankState(subtank); + subtank.state = IncubationSubTankState.ERROR; + } + case 5 -> { + assignSubTankState(subtank); + subtank.state = IncubationSubTankState.INCUBATION_COMPLETE; + } + default -> { + subtank.state = IncubationSubTankState.EMPTY; + } + } + + } + return incubationPlate; + } + + private void assignSubTankState(IncubationSubTank subtank) { + subtank.sampleInfo = new SampleInfo( + "250109_001E01", 0, false, false, BloodType.WHOLE_BLOOD, "B3A7KK8DKF", "250109_001E" + ); + + + subtank.sampleInfo.bloodType = BloodType.WHOLE_BLOOD; + subtank.sampleInfo.sampleBarcode = "112334455667"; + subtank.sampleInfo.userid = "250109_001E"; + subtank.projInfo = new ProjBriefInfo(); + subtank.projInfo.projId = 1; + subtank.projInfo.projName = "hsCRP"; + subtank.projInfo.projShortName = "CA"; + subtank.projInfo.color = "#DC143C"; + subtank.sampleInfo.sampleId = "250109_001E01"; + subtank.projId = 1; + subtank.lotId = "CA123456"; + subtank.isEmergency = false; + if (subtank.state.equals(IncubationSubTankState.ERROR)) { + subtank.error = new AppError(A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, ""); + subtank.errorInfo = ZAppPromptFactory.buildAppPrompt(subtank.error); + } + subtank.startIncubatedTime = new Date().getTime(); + subtank.incubatedTimeSec = 3 * 60; + subtank.remainTimeSec = 3 * 60; + } + +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java new file mode 100644 index 0000000..50c2ae6 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java @@ -0,0 +1,64 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.a8k.BloodType; +import a8k.app.type.a8k.proj.ProjBriefInfo; +import a8k.app.type.a8k.state.OptScanModuleState; +import a8k.app.type.a8k.state.SampleInfo; +import a8k.app.type.a8k.state.enumtype.OptScanModuleStateEnum; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VirtualOptScannerStateGenerator { + + private final VirtualStateModeMgr virtualStateModeMgr; + private Integer version = Integer.MAX_VALUE / 2; + + synchronized public OptScanModuleState getVirtualOptScanModuleState() { + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE -> { //UI测试 + return getRunningState(); + } + case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲 + return getIDLEState(); + } + case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中 + return getRunningState(); + } + } + return null; + } + + synchronized public Integer getVersion() { + return version; + } + + synchronized public void incrementVersion() { + version++; + } + + synchronized private OptScanModuleState getIDLEState() { + OptScanModuleState optScanModuleState = new OptScanModuleState(); + optScanModuleState.state = OptScanModuleStateEnum.EMPTY; + return optScanModuleState; + } + + + synchronized private OptScanModuleState getRunningState() { + OptScanModuleState optScanModuleState = new OptScanModuleState(); + optScanModuleState.state = OptScanModuleStateEnum.SCANNING; + optScanModuleState.sampleInfo = new SampleInfo( + "SAMPLE-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; + } + + +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java new file mode 100644 index 0000000..cfba0cf --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java @@ -0,0 +1,101 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.constant.AppConstant; +import a8k.app.factory.FakeA8kConsumableContainerFactory; +import a8k.app.service.utils.ProjInfoUtils; +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.PreReactionGrid; +import a8k.app.type.PreReactionGridGroup; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.LittleBottleConsumableType; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VirtualPreReactionGridGroupStateGenerator { + + private final VirtualStateModeMgr virtualStateModeMgr; + private Integer version = Integer.MAX_VALUE / 2; + + synchronized public PreReactionGridGroup getGroupState(ConsumableGroup group) { + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE -> { //UI测试 + return getRunningState(group); + } + case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲 + return getIDLEState(group); + } + case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中 + return getRunningState(group); + } + } + return null; + } + + synchronized public Integer getVersion() { + return version; + } + + synchronized public void incrementVersion() { + version++; + } + + private PreReactionGridGroup getIDLEState(ConsumableGroup group) { + PreReactionGridGroup gridGroup = new PreReactionGridGroup(group); + gridGroup.group = group; + gridGroup.installed = false; + gridGroup.hasSomeGridInReacting = false; + gridGroup.hasSomeGridReactedCompleted = false; + return gridGroup; + } + + private PreReactionGridGroup getRunningState(ConsumableGroup group) { + PreReactionGridGroup gridGroup = new PreReactionGridGroup(group); + gridGroup.group = group; + if (group.off % 2 == 0) { + gridGroup.installed = true; + gridGroup.hasSomeGridInReacting = true; + gridGroup.hasSomeGridReactedCompleted = true; + } else { + gridGroup.installed = false; + gridGroup.hasSomeGridInReacting = false; + gridGroup.hasSomeGridReactedCompleted = false; + } + gridGroup.consumableType = LittleBottleConsumableType.BufferSolution; + var projBuildInInfo = FakeA8kConsumableContainerFactory.buildFakeProjBuildInInfo(group.off); + gridGroup.projBriefInfo = ProjInfoUtils.buildProjBrefInfo(projBuildInInfo); + gridGroup.version = 10; + for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { + + gridGroup.grids.get(i).projId = projBuildInInfo.projId; + gridGroup.grids.get(i).projBuildinInfo = projBuildInInfo; + gridGroup.grids.get(i).projExtInfoCard = null; + + switch (i / 5) { + case 0 -> { + gridGroup.grids.get(i).state = PreReactionGrid.State.UNINSTALL; + } + case 1 -> { + gridGroup.grids.get(i).state = PreReactionGrid.State.USED; + } + + case 2 -> { + gridGroup.grids.get(i).state = PreReactionGrid.State.REACTION_COMPLETED; + gridGroup.grids.get(i).sampleInfo.userid = "UID123"; + } + case 3 -> { + gridGroup.grids.get(i).state = PreReactionGrid.State.REACTING; + gridGroup.grids.get(i).sampleInfo.userid = "UID123"; + gridGroup.grids.get(i).reactionRemainingTime = 3 * 60L; + } + case 4 -> { + gridGroup.grids.get(i).state = PreReactionGrid.State.TO_BE_USED; + } + } + } + return gridGroup; + } +} diff --git a/src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java b/src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java new file mode 100644 index 0000000..702b588 --- /dev/null +++ b/src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java @@ -0,0 +1,60 @@ +package a8k.app.service.virtualstate.generator; + +import a8k.app.service.virtualstate.VirtualStateModeMgr; +import a8k.app.type.a8k.state.DeviceWorkState; +import a8k.app.type.a8k.state.SensorState; +import a8k.app.type.a8k.state.enumtype.A8kWorkState; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VirtualSensorStateGenerator { + + private final VirtualStateModeMgr virtualStateModeMgr; + private Integer version = Integer.MAX_VALUE / 2; + private Integer cnt = 0; + + synchronized public SensorState getState() { + switch (virtualStateModeMgr.virtualStateMode) { + case UI_TEST_MODE -> { //UI测试 + return getRunningState(); + } + case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲 + return getIDLEState(); + } + case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中 + return getRunningState(); + } + } + return null; + } + + + synchronized public void incrementVersion() { + version++; + } + + private SensorState getIDLEState() { + SensorState sensorState = new SensorState(); + sensorState.setPboxTemperature(24); + sensorState.setIncubateBoxTemperature(25); + sensorState.setWasteBinFullFlag(false); + cnt++; + sensorState.setIncubateBoxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态 + sensorState.setPboxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态 + return sensorState; + } + + private SensorState getRunningState() { + SensorState sensorState = new SensorState(); + sensorState.setPboxTemperature(25); + sensorState.setIncubateBoxTemperature(25); + sensorState.setWasteBinFullFlag(false); + sensorState.setIncubateBoxTemperatureReady(true); //每次调用切换一次状态 + sensorState.setPboxTemperatureReady(true); //每次调用切换一次状态 + return sensorState; + } +} diff --git a/src/main/java/a8k/app/type/GState.java b/src/main/java/a8k/app/type/GState.java index 60025f9..a46acf4 100644 --- a/src/main/java/a8k/app/type/GState.java +++ b/src/main/java/a8k/app/type/GState.java @@ -22,7 +22,7 @@ public class GState { public String mcuVersion = ""; public BoardVersions mcuVersionDetail = new BoardVersions(); //MCU版本详细信息 //设备SN - public String sn = "TEST001";// 巴迪泰 叫做 工厂序列号(FactorySerial) + public String sn = "TEST001";// 巴迪泰 叫做 工程序列号(FactorySerial) // public String assetId = "TEST001";// 巴迪泰 叫做 出厂序列号(DeviceSerial) // diff --git a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java index 15ba45a..797badb 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java +++ b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java @@ -12,7 +12,12 @@ import a8k.extui.page.extapp.debug_assistant.*; import a8k.extui.page.extapp.profession_test.ExperimentConsistencyTestingPage; import a8k.extui.page.extapp.profession_test.P01PipetteGunVerification; import a8k.extui.page.extsetting.db.*; -import a8k.extui.page.hardwaretest.*; +import a8k.extui.page.factory.DeviceExSettingPage; +import a8k.extui.page.factory.DeviceIdSettingPage; +import a8k.extui.page.factory.hardwaretest.*; +import a8k.extui.page.factory.opt.A8kOptVerification; +import a8k.extui.page.factory.opt.OptModuleParamCalibration; +import a8k.extui.page.factory.verification.*; import a8k.extui.page.init.DeviceInitPage; import a8k.extui.page.measurement.*; @@ -22,9 +27,6 @@ import a8k.extui.page.test.codetest.OptFormulaTestPageV2; import a8k.extui.page.extsetting.pos_calibration.*; import a8k.extui.page.test.stress_test.PipetteGunStressTest; -import a8k.extui.page.test.verification.*; -import a8k.extui.page.test.verification.P34LiquidOperationTestPage; -import a8k.extui.page.test.verification.P10ProjejIDCardTestPage; import jakarta.annotation.PostConstruct; import org.springframework.stereotype.Component; @@ -84,7 +86,6 @@ public class ExtApiPageGroupCfgMgr { @PostConstruct void init() { pushMenu(new Menu(DeviceInitPage.class, "设备初始化")); - pushMenu(new Menu("状态.数据.设置", ZList.of( new Menu("状态", ZList.of( new Menu(P11IncubationPlateStateDebugPageAll.class, "孵育盘"), @@ -96,18 +97,6 @@ public class ExtApiPageGroupCfgMgr { new Menu(ProjInfoMgrPage.class, "项目信息管理"), new Menu(ReactionRecordMgrDebugPage.class, "反应记录") )), - new Menu(DeviceExSettingPage.class, "设备扩展配置"), - new Menu(A8kSubModuleRegAndConfigSyncPage.class, "单片机-配置管理"), - new Menu("坐标设置", ZList.of( - new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"), - new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"), - new Menu(P03TubePreProcessPosCalibrationPage.class, "试管预处理设置"), - new Menu(P04ReactionPlatesTransmitControlerCalibrationPage.class, "反应板相关位置设置"), - new Menu(P20HbotTipPosCalibrationPage.class, "Tip耗材位置设置"), - new Menu(P21HbotConsumablesPosCalibrationPage.class, "缓冲液&探测物质位置设置"), - new Menu(P24Hbot2DCodeScanPosCalibrationPage.class, "耗材扫描设置"), - new Menu(P25HbotSamplePosCalibrationPage.class, "取样位置设置") - )), new Menu(P20AppSettingDebugPage.class, "系统设置"), new Menu(P00AppEventAndMessageBoxDebugPage.class, "事件与消息") )) @@ -121,7 +110,8 @@ public class ExtApiPageGroupCfgMgr { new Menu(P01ProjInfoDebugPage.class, "ID卡操作") ))); - pushMenu(new Menu("底层驱动", ZList.of( + pushMenu(new Menu("底层驱动&&配置", ZList.of( + new Menu(A8kSubModuleRegAndConfigSyncPage.class, "单片机-配置管理"), new Menu(HbotCtrlPage.class, "HBOT控制"), new Menu("移液枪驱动", ZList.of( new Menu(PipetteGunCfgSync.class, "配置同步"), @@ -135,18 +125,44 @@ public class ExtApiPageGroupCfgMgr { new Menu(PipetteGunLiquidConfigSettingPage.class, "设置液体参数"), new Menu(PipetteGunContainerConfigSettingPage.class, "设置液体容器参数") )), - new Menu(MotorCtrlPage.class, "电机驱动"), new Menu(MiniServoCtrlPage.class, "舵机驱动"), new Menu(CodeScannerDriverCtrlPage.class, "条码扫描仪"), new Menu(PrinterDebugPage.class, "打印机"), new Menu(OptScannerCtrlPage.class, "光学模组"), new Menu(WaterCoolingTempCtrlDriverPage.class, "水冷控温驱动") - ))); pushMenu(new Menu("高级应用", ZList.of( + new Menu("APP测试", ZList.of( + new Menu(LisTestPage.class, "LIS测试"), + new Menu(PrinterDebugPage.class, "打印机测试") + )), + new Menu("过检专用", ZList.of( + new Menu(P01PipetteGunVerification.class, "移液枪验证"), + new Menu(ExperimentConsistencyTestingPage.class, "一致性测试") + )), + new Menu("压力测试", ZList.of( + new Menu(PipetteGunStressTest.class, "移液枪压力测试") + )), + new Menu("代码测试", ZList.of( + new Menu(OptFormulaTestPageV2.class, "光学公式测试1"), + new Menu(OptFormulaTestPage.class, "光学公式测试2"), + new Menu(BiLisDoubleTrackChannelTestPage.class, "BiLis双通道测试") + )), + new Menu("前端测试助手", ZList.of( + new Menu(FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"), + new Menu(VirtualEventGeneratorPage.class, "虚拟事件生成"), + new Menu(IDCardDataGeneratorPage.class, "ID卡数据生成器") + )), + new Menu(VirtualStateGenerateModeSettingPage.class, "虚拟状态生成模式-助手"), + new Menu(UsrOperationSimulationPage.class, "用户行为模拟器"), + new Menu(CodeGeneratorPage.class, "条码字符生成工具") + ))); + + pushMenu(new Menu("工厂生产", ZList.of( + new Menu("硬件测试", ZList.of( new Menu(SubBoardProberPage.class, "子板探测"), new Menu(SubModuleVersionPreviewPage.class, "全部子模块版本预览"), @@ -164,21 +180,21 @@ public class ExtApiPageGroupCfgMgr { new Menu(LISUartTestPage.class, "LIS串口测试"), new Menu(PrinterDebugPage.class, "打印机测试") )), - - new Menu("APP测试", ZList.of( - new Menu(LisTestPage.class, "LIS测试"), - new Menu(PrinterDebugPage.class, "打印机测试") + new Menu("动作参数配置", ZList.of( + new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"), + new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"), + new Menu(P03TubePreProcessPosCalibrationPage.class, "试管预处理设置"), + new Menu(P04ReactionPlatesTransmitControlerCalibrationPage.class, "反应板相关位置设置"), + new Menu(P20HbotTipPosCalibrationPage.class, "Tip耗材位置设置"), + new Menu(P21HbotConsumablesPosCalibrationPage.class, "缓冲液&探测物质位置设置"), + new Menu(P24Hbot2DCodeScanPosCalibrationPage.class, "耗材扫描设置"), + new Menu(P25HbotSamplePosCalibrationPage.class, "取样位置设置") )), - new Menu("光学标定与验证", ZList.of( new Menu(A8kOptVerification.class, "光学模组验证"), new Menu(OptModuleParamCalibration.class, "光学模块参数校准"), new Menu(OptAlgoTestPage.class, "光学算法测试") )), - new Menu("过检专用", ZList.of( - new Menu(P01PipetteGunVerification.class, "移液枪验证"), - new Menu(ExperimentConsistencyTestingPage.class, "一致性测试") - )), new Menu("坐标测量", ZList.of( new Menu(HbotPosMeasurePage.class, "HBOT测量(电控)"), new Menu(HbotFreedomPosMeasurePage.class, "HBO测量(自由模式)"), @@ -199,25 +215,10 @@ public class ExtApiPageGroupCfgMgr { new Menu(HbotCodeScanPosVerificationPage.class, "单步-HBOT扫码"), new Menu(P50VerificationScriptPage.class, "脚本-模块验证") )), - new Menu("压力测试", ZList.of( - new Menu(PipetteGunStressTest.class, "移液枪压力测试") - )), - new Menu("代码测试", ZList.of( - new Menu(OptFormulaTestPageV2.class, "光学公式测试1"), - new Menu(OptFormulaTestPage.class, "光学公式测试2"), - new Menu(BiLisDoubleTrackChannelTestPage.class, "BiLis双通道测试") - )), - new Menu("前端测试助手", ZList.of( - new Menu(FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"), - new Menu(VirtualEventGeneratorPage.class, "虚拟事件生成"), - new Menu(IDCardDataGeneratorPage.class, "ID卡数据生成器"), - new Menu(VirtualReportModeOperationPage.class, "虚拟报告模式操作"), - new Menu(DeviceVirtualStateMgrSettingPage.class, "虚拟状态上报配置") - )), - new Menu(UsrOperationSimulationPage.class, "用户行为模拟器"), - new Menu(CodeGeneratorPage.class, "条码字符生成工具") - ))); + new Menu(DeviceExSettingPage.class, "设备扩展配置"), + new Menu(DeviceIdSettingPage.class, "ID配置") + ))); //////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/main/java/a8k/extui/mgr/ExtApiPageMgr.java b/src/main/java/a8k/extui/mgr/ExtApiPageMgr.java index 28d71ff..fcb2e0b 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiPageMgr.java +++ b/src/main/java/a8k/extui/mgr/ExtApiPageMgr.java @@ -1,7 +1,10 @@ package a8k.extui.mgr; +import a8k.app.service.os.OSDeviceInfoMgrService; import a8k.extui.type.ExUIFunction; import a8k.extui.type.ExtUIPageCfg; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.Assert; @@ -10,8 +13,9 @@ import java.util.ArrayList; import java.util.List; @Component + public class ExtApiPageMgr { - List pages = new ArrayList<>(); + private final List pages = new ArrayList<>(); public void addPage(ExtUIPageCfg page) { pages.add(page); diff --git a/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java b/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java deleted file mode 100644 index df000bb..0000000 --- a/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java +++ /dev/null @@ -1,274 +0,0 @@ -package a8k.extui.page.extapp; - -import a8k.app.dao.type.db.ReactionRecord; -import a8k.app.optalgo.A8kPeakAnalyzer; -import a8k.app.type.a8k.opt.OptScanResult; -import a8k.app.type.a8k.BloodType; -import a8k.app.type.a8k.state.SampleInfo; -import a8k.app.dao.type.db.ProjExtInfoCard; -import a8k.app.service.mainctrl.AppDeviceInitCtrlService; -import a8k.app.type.exception.AppException; -import a8k.extui.factory.A8kScanCurveFactory; -import a8k.app.service.data.ProjIdCardInfoMgrService; -import a8k.app.type.a8k.proj.ProjInfo; -import a8k.extui.type.ExtApiStatu; -import a8k.extui.type.ret.FileToBeDownload; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import a8k.app.service.data.FileMgrService; -import a8k.app.service.data.ProjInfoMgrService; -import a8k.app.service.lowerctrl.OptScanModuleLowerCtrlService; -import a8k.app.service.lowerctrl.PlateBoxCtrlService; -import a8k.extui.type.ret.A8kScanCurve; -import a8k.app.type.a8k.opt.A8kOptType; -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.a8k.pos.IncubatorPos; -import a8k.app.dao.type.combination.ProjBuildInInfo; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; -import org.springframework.util.Assert; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -@Component -public class A8kOptVerification { - - @Resource - AppDeviceInitCtrlService appDeviceInitCtrlService; - - @Resource - PlateBoxCtrlService plateBoxCtrlService; - @Resource - OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; - - @Resource - ProjInfoMgrService projInfoMgrService; - @Resource - FileMgrService fileMgrService; - @Resource - ProjIdCardInfoMgrService projIdCardInfoMgrService; - - @Resource - ExtApiPageMgr extApiPageMgr; - - // Integer activeProjId = 0; - BloodType bloodType = BloodType.WHOLE_BLOOD; - // ProjBuildinInfo projInfo; - - // @ExtApiStatu(name = "", group = "项目信息", order = 1) - // public ProjBuildinInfo getProjInfo() { - // return projInfo; - // } - - @ExtApiStatu(name = "", group = "挂载ID卡信息", order = 2) - public ProjExtInfoCard getMountedProjInfoCard() { - return projIdCardInfoMgrService.getMountedProjInfoCard(); - } - - @ExtApiStatu(name = "", group = "血液类型", order = 2) - public String getBloodType() { - return switch (bloodType) { - case WHOLE_BLOOD -> "全血"; - case SERUM_OR_PLASMA -> "血清/血浆"; - case FECES -> "粪便"; - }; - } - - - @PostConstruct - void init() throws NoSuchMethodException { - ExtUIPageCfg page = new ExtUIPageCfg(this); - - page.newGroup("环境配置"); - page.addFunction("设置血液类型", this::setBloodType); - - page.newGroup("光学测试"); - page.addFunction("推板到光学模组(从板夹仓0号仓推入)", this::pushOnePlateToOptModule); - page.addFunction("光学扫描", this::doOptScan); - page.addFunction("计算扫描结果", this::computeResult); - page.addFunction("丢板", this::dropPlate); - - - page.newGroup("光学结果"); - page.addFunction("预览T光学扫描曲线", this::getScanCurveT); - page.addFunction("预览F光学扫描曲线", this::getScanCurveF); - page.addFunction("下载T光学报告", this::getTOptReport); - page.addFunction("下载F光学报告", this::getFOptReport); - page.newGroup("系统板检查"); - page.addFunction("进行一次光学扫描(自动推板,丢板)", this::autoScanAndDownloadScanResult); - extApiPageMgr.addPage(page); - } - - public Map getProjInfoBreifList() throws AppException { - var allproj = projInfoMgrService.getAllProjBuildInInfo(); - Map result = new java.util.HashMap<>(); - for (var proj : allproj) { - result.put(proj.projId.toString(), - String.format("%s(%s)", proj.projName, proj.getOptMark())); - } - return result; - } - - - // synchronized public void setProj(Integer projId) throws AppException { - // activeProjId = projId; - // projInfo = projInfoMgrService.getProjBuildInInfo(projId); - // } - - synchronized public void setBloodType(BloodType bloodType) { - this.bloodType = bloodType; - } - - - static class OptScanReport { - public A8kOptType optType; - public A8kScanCurve optScanCurve; - public OptScanResult optScanResult; - public ProjBuildInInfo projInfo; - public Integer subProjIndex; - } - - List optScanReports = new ArrayList<>(); - - private OptScanResult getOptScanResult(A8kOptType type) throws AppException { - for (var report : optScanReports) { - if (report.optType.equals(type)) { - return report.optScanResult; - } - } - return null; - } - - public void generateOptReport(ProjBuildInInfo info, Integer subProjIndex, OptScanResult optScanResult) - throws IOException { - OptScanReport report = new OptScanReport(); - report.optScanCurve = A8kScanCurveFactory.createScanCurve1200Point(optScanResult.rawData.rawData); - report.optType = info.optcfg.get(subProjIndex).optType; - report.optScanResult = optScanResult; - report.projInfo = info; - report.subProjIndex = subProjIndex; - optScanReports.add(report); - } - - public void pushOnePlateToOptModule() throws AppException { - optScanModuleLowerCtrlService.dropPlate(); - optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); - optScanModuleLowerCtrlService.dropPlate(); - plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); - optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); - } - - - public String doOptScan(Boolean autoAmpl) throws AppException, IOException { - // fileMgrService.clearOptReport(); - optScanReports.clear(); - var projInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); - if (projInfo == null) { - throw AppException.ofSimplePrompt("请插入项目ID卡"); - } - for (int i = 0; i < projInfo.optcfg.size(); i++) { - OptScanResult scanResult = getOptScanResult(projInfo.optcfg.get(i).optType); - if (scanResult == null) { - scanResult = optScanModuleLowerCtrlService.optScan(projInfo, i, autoAmpl); - } - generateOptReport(projInfo, i, scanResult); - } - return "扫描完成"; - } - - - public List computeResult() throws AppException { - var projBuildinInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); - if (projBuildinInfo == null) { - throw AppException.ofSimplePrompt("请插入项目ID卡"); - } - - // ProjBuildinInfo - - SampleInfo sampleInfo = new SampleInfo( - "TEST_SAMPLE", // sampleId - 1, // tubePosition - false, // isHighTube - false, // isEmergency - bloodType, // bloodType - "TEST_BARCODE", // sampleBarcode - "TEST_USERID" // userid - ); - - ProjInfo projInfo = new ProjInfo(); - projInfo.buildIn = projBuildinInfo; - projInfo.ext = projIdCardInfoMgrService.getMountedProjInfoCard(); - - if (projInfo.ext == null) { - throw AppException.ofSimplePrompt("请插入项目卡"); - } - - - List results = new ArrayList<>(); - for (int i = 0; i < projBuildinInfo.optcfg.size(); i++) { - OptScanResult optScanResult = getOptScanResult(projBuildinInfo.optcfg.get(i).optType); - Assert.notNull(optScanResult, "光学扫描结果为空"); - results.add(A8kPeakAnalyzer.analysisPeakInfo(sampleInfo, projInfo, i, optScanResult.analysResult)); - } - - return results; - } - - public void dropPlate() throws AppException { - optScanModuleLowerCtrlService.dropPlate(); - } - - public A8kScanCurve getScanCurveT() throws AppException { - for (var report : optScanReports) { - if (report.optType.equals(A8kOptType.TOPT)) { - return report.optScanCurve; - } - } - throw AppException.ofSimplePrompt("当前项目没有T光学扫描曲线"); - } - - public A8kScanCurve getScanCurveF() throws AppException { - for (var report : optScanReports) { - if (report.optType.equals(A8kOptType.FOPT)) { - return report.optScanCurve; - } - } - throw AppException.ofSimplePrompt("当前项目没有F光学扫描曲线"); - } - - public FileToBeDownload getTOptReport() throws AppException, IOException { - for (var report : optScanReports) { - if (report.optType.equals(A8kOptType.TOPT)) { - return new FileToBeDownload(fileMgrService.storageOptReport(report.projInfo.projName, report.projInfo.projId, report.optScanResult)); - } - } - throw AppException.ofSimplePrompt("当前项目没有T光学报告"); - } - - public FileToBeDownload getFOptReport() throws AppException, IOException { - for (var report : optScanReports) { - if (report.optType.equals(A8kOptType.FOPT)) { - return new FileToBeDownload(fileMgrService.storageOptReport(report.projInfo.projName, report.projInfo.projId, report.optScanResult)); - } - } - throw AppException.ofSimplePrompt("当前项目没有F光学报告"); - } - - public void autoScanAndDownloadScanResult(Boolean autoAmpl) throws AppException, IOException { - var projInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); - if (projInfo == null) { - throw AppException.ofSimplePrompt("请插入项目ID卡"); - } - - optScanModuleLowerCtrlService.forceDropPlate(IncubatorPos.SPACE01); - plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); - optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); - doOptScan(autoAmpl); - computeResult(); - optScanModuleLowerCtrlService.dropPlate(); - } -} diff --git a/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java b/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java deleted file mode 100644 index b15d4e1..0000000 --- a/src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java +++ /dev/null @@ -1,232 +0,0 @@ -package a8k.extui.page.extapp; - -import a8k.app.dao.type.combination.ProjBuildInInfo; -import a8k.app.optalgo.type.A8kOptPeakInfo; -import a8k.app.service.data.ProjInfoMgrService; -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.a8k.pos.IncubatorPos; -import a8k.app.type.exception.AppException; -import a8k.extui.factory.A8kScanCurveFactory; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ret.A8kScanCurve; -import a8k.extui.type.ExtApiStatu; -import a8k.app.service.lowerctrl.OptScanModuleLowerCtrlService; -import a8k.app.service.lowerctrl.PlateBoxCtrlService; -import a8k.app.service.param.optparam.OptModuleExtParamsMgr; -import a8k.app.type.param.optpos.OptModuleExtParam; -import a8k.app.type.a8k.opt.A8kOptType; -import a8k.app.iflytophald.utils.OptGainConvert; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - - -/** - * - * 1.下面三个位置在ReactionPlatesTransmitControlerCalibration进行标定 - * PullerTargetPos("拉板目标位置"), - * OptScanerDropPos("丢板坐标"), - * OptScanerScandbyPos("扫描待机位"), - * - * 2. 该模块只用来标定 - * TOptScanStartPos (T光学扫描起始位置) - * FOptScanStartPos (F光学扫描起始位置) - */ -@Component -@Slf4j -@RequiredArgsConstructor -public class OptModuleParamCalibration { - - private final OptModuleExtParamsMgr optModuleExtParamsMgr; - private final PlateBoxCtrlService plateBoxCtrlService; - private final OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; - private final ProjInfoMgrService projInfoMgrService; - - - @ExtApiStatu(name = "", group = "F光学参数", order = 1) - public Object getTPara() throws AppException { - return optModuleExtParamsMgr.getParamMap(OptModuleExtParam.FOptEmissionIntensity, OptModuleExtParam.FOptScanGainVal, OptModuleExtParam.FOptScanShift); - } - - @ExtApiStatu(name = "", group = "T光学参数", order = 2) - public Object getFPara() throws AppException { - return optModuleExtParamsMgr.getParamMap(OptModuleExtParam.TOptEmissionIntensity, OptModuleExtParam.TOptScanGainVal, OptModuleExtParam.TOptScanShift); - } - - @ExtApiStatu(name = "", group = "说明", order = 3) - public Object getDesc() { - Map desc = new HashMap<>(); - desc.put("1", "测试使用的位置反应板1号仓"); - desc.put("2", "F光学发射强度参数:越大强度越弱"); - return desc; - } - - - // - // 辅助方法 - // - - /** - * From: 0号仓 - * TrunablePos:0号仓到 - */ - - public void pushOnePlateToOptModule() throws AppException { - //先清空当前通道 - optScanModuleLowerCtrlService.dropPlate(); - optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); - optScanModuleLowerCtrlService.dropPlate(); - - //推板到光学模组 - plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); - optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); - } - - - public void dropPlate() throws AppException { - optScanModuleLowerCtrlService.dropPlate(); - } - - A8kScanCurve FCurveCache = null; - - public void setFOptScanShift(Integer shift) throws AppException { - if (shift < 0) { - throw AppException.ofAECodeError("扫描偏移量必须大于0"); - } - - Integer oldShift = optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptScanShift, Integer.class); - Integer diffShift = shift - oldShift; - - if (FCurveCache != null) { - for (int i = 0; i < FCurveCache.refCurve.size(); i++) { - // log.info("i={}, fcurveCache.refCurve.get(i)={}, diffShift={}", i, fcurveCache.refCurve.get(i), diffShift); - // log.info("new value={}", fcurveCache.refCurve.get(i) - diffShift); - FCurveCache.refCurve.set(i, FCurveCache.refCurve.get(i) + diffShift); - } - } - - - optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanShift, shift); - } - - - public void setFOptEmissionIntensity(Integer val) { - optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptEmissionIntensity, val); - } - - - public void setFOptScanAmplVal(Double val) { - optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanGainVal, val); - } - - - public A8kScanCurve FOptScan() throws AppException { - Double scanGain = optModuleExtParamsMgr.getScanGain(A8kOptType.FOPT); - Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.FOPT, scanGain); - Integer rawLasterGain = optModuleExtParamsMgr.getOptLasterRawGain(A8kOptType.FOPT); - var result = optScanModuleLowerCtrlService.startOptScan(A8kOptType.FOPT, rawLasterGain, rawScanGain); - FCurveCache = A8kScanCurveFactory.createScanCurve1200Point(result); - return FCurveCache; - } - - synchronized public A8kScanCurve getFCurveCache() { - return FCurveCache; - } - - - // - //T光学 - // - A8kScanCurve TCurveCache = null; - - public void setTOptScanShift(Integer shift) throws AppException { - if (shift < 0) { - throw AppException.ofAECodeError("扫描偏移量必须大于0"); - } - optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanShift, shift); - } - - - public void setTOptEmissionIntensity(Integer val) { - optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptEmissionIntensity, val); - } - - - public void setTOptScanAmplVal(Double val) { - optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanGainVal, val); - } - - - public A8kScanCurve TOptScan() throws AppException { - Double scanGain = optModuleExtParamsMgr.getScanGain(A8kOptType.TOPT); - Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.TOPT, scanGain); - Integer rawLasterGain = optModuleExtParamsMgr.getOptLasterRawGain(A8kOptType.TOPT); - - var result = optScanModuleLowerCtrlService.startOptScan(A8kOptType.TOPT, rawLasterGain, rawScanGain); - TCurveCache = A8kScanCurveFactory.createScanCurve1200Point(result); - return TCurveCache; - } - - synchronized public A8kScanCurve getTCurveCache() { - return TCurveCache; - } - - - A8kScanCurve optScanCurve = null; - - public A8kOptPeakInfo doOptScan(Integer projId, Integer subProjIndex) throws AppException { - ProjBuildInInfo projBuildinInfo = projInfoMgrService.getProjBuildInInfo(projId); - var result = optScanModuleLowerCtrlService.optScan(projBuildinInfo, subProjIndex); - optScanCurve = A8kScanCurveFactory.createScanCurve1200Point(result.rawData.rawData); - return result.analysResult; - } - - synchronized public A8kScanCurve getOptScanCurve() { - return optScanCurve; - } - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("基础"); - page.addFunction("推板到光学模组", this::pushOnePlateToOptModule); - page.addFunction("丢板", this::dropPlate); - - page.newGroup("F光学"); - page.addFunction("设置扫描偏移", this::setFOptScanShift) - .setParamVal("shift", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptScanShift, Integer.class)); - page.addFunction("设置发射强度[1->255]()", this::setFOptEmissionIntensity) - .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptEmissionIntensity, Integer.class)); - page.addFunction("设置接收放大倍数[1.1->47]", this::setFOptScanAmplVal) - .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptScanGainVal, Double.class)); - page.addFunction("扫描", this::FOptScan); - page.addFunction("查看波形", this::getFCurveCache); - - page.newGroup("T光学"); - page.addFunction("设置扫描偏移", this::setTOptScanShift) - .setParamVal("shift", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.TOptScanShift, Integer.class)); - page.addFunction("设置发射强度[1->255]", this::setTOptEmissionIntensity) - .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.TOptEmissionIntensity, Integer.class)); - page.addFunction("设置接收放大倍数[0.5->21.7]", this::setTOptScanAmplVal) - .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.TOptScanGainVal, Double.class)); - page.addFunction("扫描", this::TOptScan); - page.addFunction("查看波形", this::getTCurveCache); - - page.newGroup("光学扫描"); - page.addFunction("光学扫描", this::doOptScan).setParamVal("projId", () -> 1).setParamVal("subProjIndex", () -> 0); - page.addFunction("查看光学扫描波形", this::getOptScanCurve); - - extApiPageMgr.addPage(page); - } - -} diff --git a/src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java b/src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java new file mode 100644 index 0000000..f920135 --- /dev/null +++ b/src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java @@ -0,0 +1,40 @@ +package a8k.extui.page.extapp; + +import a8k.app.service.virtualstate.DeviceVirtualStateMgrService; +import a8k.app.service.virtualstate.VirtualStateMode; +import a8k.app.type.a8k.state.EmergencyTubePos; +import a8k.app.type.a8k.state.enumtype.TubeState; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class VirtualStateGenerateModeSettingPage { + private final ExtApiPageMgr extApiPageMgr; + private final DeviceVirtualStateMgrService deviceVirtualStateMgrService; + + public void changeVirtualStateMode(VirtualStateMode mode) { + deviceVirtualStateMgrService.changeVirtualStateMode(mode); + } + + public void changeEmergencyTubeState(TubeState tubeState) { + deviceVirtualStateMgrService.changeEmergencyTubeState(tubeState); + } + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("调试助手"); + page.addFunction("修改虚拟状态模式", this::changeVirtualStateMode) + .setParamVal("mode", deviceVirtualStateMgrService::getMode); + page.addFunction("修改急诊试管状态", this::changeEmergencyTubeState) + .setParamVal("tubeState", deviceVirtualStateMgrService::getEmergencyTubeState); + + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java b/src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java deleted file mode 100644 index 12b943a..0000000 --- a/src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java +++ /dev/null @@ -1,35 +0,0 @@ -package a8k.extui.page.extapp.debug_assistant; - -import a8k.app.service.background.AppEventBusService; -import a8k.app.service.data.ProjInfoMgrService; -import a8k.app.service.statemgr.AppFlagStateMgr; -import a8k.app.service.virtualstate.DeviceVirtualStateMgrService; -import a8k.app.type.a8k.state.enumtype.TubeState; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -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 DeviceVirtualStateMgrSettingPage { - - private final ExtApiPageMgr extApiPageMgr; - private final DeviceVirtualStateMgrService deviceVirtualStateMgrService; - - public void setEmergencyTubeState(TubeState tubeState) { - deviceVirtualStateMgrService.setEmptyTubeState(tubeState); - } - - - @PostConstruct - void init() { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.addFunction("设置应急管状态", this::setEmergencyTubeState); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java b/src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java deleted file mode 100644 index 3a66f12..0000000 --- a/src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java +++ /dev/null @@ -1,38 +0,0 @@ -package a8k.extui.page.extapp.debug_assistant; - -import a8k.app.service.background.AppEventBusService; -import a8k.app.service.data.ProjInfoMgrService; -import a8k.app.service.statemgr.AppFlagStateMgr; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class VirtualReportModeOperationPage { - @Resource - AppEventBusService eventBus; - - @Resource - ExtApiPageMgr extApiPageMgr; - - private final ProjInfoMgrService projInfoMgrService; - - private final AppEventBusService appEventBusService; - private final AppFlagStateMgr appFlagStateMgr; - - public void resetAppWarningFlagState() { - appFlagStateMgr.resetVirtualState(); - } - - - @PostConstruct - void init() { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.addFunction("重置状态列表(虚拟模式下)", this::resetAppWarningFlagState); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/extsetting/db/DeviceExSettingPage.java b/src/main/java/a8k/extui/page/extsetting/db/DeviceExSettingPage.java deleted file mode 100644 index 4b9fbdb..0000000 --- a/src/main/java/a8k/extui/page/extsetting/db/DeviceExSettingPage.java +++ /dev/null @@ -1,49 +0,0 @@ -package a8k.extui.page.extsetting.db; - -import a8k.app.controler.filemgr.StorageControler; -import a8k.app.dao.DeviceActionParameterDao; -import a8k.app.dao.DeviceExSettingDao; -import a8k.app.dao.type.db.DeviceExSetting; -import a8k.app.dao.type.db.Parameter; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import a8k.extui.type.ExtUiTable; -import a8k.extui.type.param.ExtUIFile; -import a8k.extui.type.ret.FileToBeDownload; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class DeviceExSettingPage { - - private final ExtApiPageMgr extApiPageMgr; - private final DeviceExSettingDao deviceExSettingDao; - - - public void setDisableLargeBufferSolutionG3(Boolean disableLargeBufferSolutionG3) { - var setting = deviceExSettingDao.getExSetting(); - setting.disableLargeBufferSolutionG3 = disableLargeBufferSolutionG3; - deviceExSettingDao.setExSetting(setting); - } - - public void setDisableLargeBufferSolutionG6(Boolean disableLargeBufferSolutionG6) { - var setting = deviceExSettingDao.getExSetting(); - setting.disableLargeBufferSolutionG6 = disableLargeBufferSolutionG6; - deviceExSettingDao.setExSetting(setting); - } - - @PostConstruct - void init() throws NoSuchMethodException { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.addFunction("失能大瓶缓冲液G3扫码", this::setDisableLargeBufferSolutionG3) - .setParamVal("disableLargeBufferSolutionG3", () -> deviceExSettingDao.getExSetting().disableLargeBufferSolutionG3); - page.addFunction("失能大瓶缓冲液G6扫码", this::setDisableLargeBufferSolutionG6) - .setParamVal("disableLargeBufferSolutionG6", () -> deviceExSettingDao.getExSetting().disableLargeBufferSolutionG6); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java b/src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java new file mode 100644 index 0000000..66c440c --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java @@ -0,0 +1,41 @@ +package a8k.extui.page.factory; + +import a8k.app.dao.DeviceExSettingDao; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class DeviceExSettingPage { + + private final ExtApiPageMgr extApiPageMgr; + private final DeviceExSettingDao deviceExSettingDao; + + + public void setDisableLargeBufferSolutionG3(Boolean disableLargeBufferSolutionG3) { + var setting = deviceExSettingDao.getExSetting(); + setting.disableLargeBufferSolutionG3 = disableLargeBufferSolutionG3; + deviceExSettingDao.setExSetting(setting); + } + + public void setDisableLargeBufferSolutionG6(Boolean disableLargeBufferSolutionG6) { + var setting = deviceExSettingDao.getExSetting(); + setting.disableLargeBufferSolutionG6 = disableLargeBufferSolutionG6; + deviceExSettingDao.setExSetting(setting); + } + + @PostConstruct + void init() throws NoSuchMethodException { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.addFunction("失能大瓶缓冲液G3扫码", this::setDisableLargeBufferSolutionG3) + .setParamVal("disableLargeBufferSolutionG3", () -> deviceExSettingDao.getExSetting().disableLargeBufferSolutionG3); + page.addFunction("失能大瓶缓冲液G6扫码", this::setDisableLargeBufferSolutionG6) + .setParamVal("disableLargeBufferSolutionG6", () -> deviceExSettingDao.getExSetting().disableLargeBufferSolutionG6); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java b/src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java new file mode 100644 index 0000000..c7453d1 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java @@ -0,0 +1,40 @@ +package a8k.extui.page.factory; + +import a8k.app.dao.DeviceExSettingDao; +import a8k.app.service.os.OSDeviceInfoMgrService; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class DeviceIdSettingPage { + + private final ExtApiPageMgr extApiPageMgr; + private final DeviceExSettingDao deviceExSettingDao; + private final OSDeviceInfoMgrService osDeviceInfoMgrService; + + + public void setSN(String sn) throws AppException { + osDeviceInfoMgrService.setSN(sn); + } + + public void setAssetId(String AssetId) throws AppException { + osDeviceInfoMgrService.setAssetId(AssetId); + } + + @PostConstruct + void init() throws NoSuchMethodException { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.addFunction("设置工程序列号", this::setSN) + .setParamVal("sn", osDeviceInfoMgrService::readSN); + page.addFunction("设置出厂序列号", this::setAssetId) + .setParamVal("AssetId", osDeviceInfoMgrService::readAssetId); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java new file mode 100644 index 0000000..b71dd4d --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java @@ -0,0 +1,34 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.service.data.SubModuleConfigService; +import a8k.app.service.data.SubModuleRegInitialValueMgrService; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class A8kSubModuleRegAndConfigInitPage { + + private final ExtApiPageMgr extApiPageMgr; + private final SubModuleConfigService subModuleConfigService; + private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; + + + public void syncToMirco() throws AppException { + subModuleConfigService.syncToMirco(); + subModuleRegInitialValueMgrService.syncToMirco(); + } + + @PostConstruct + void init() { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.addFunction("initSubBoard", this::syncToMirco); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java new file mode 100644 index 0000000..11578cd --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java @@ -0,0 +1,99 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.HbotDriver; +import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import cn.hutool.core.text.StrBuilder; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class HBotHardwareTestPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final HbotDriver hbotDriver; + private final PipetteCtrlDriverV2 pipetteCtrlDriver; + + public void disableHbot() throws AppException { + hbotDriver.enable(0); + } + + public void enableHbot() throws AppException { + hbotDriver.enable(1); + } + + public void leftMotorMoveClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(-step, 0); + } + + public void leftMotorMoveCounterClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(step, 0); + } + + public void rightMotorMoveClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(0, -step); + } + + public void rightMotorMoveCounterClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(0, step); + } + + + public String checkMotorEncoder(Integer step) throws AppException { + hbotDriver.enable(1); + Integer[] encPos = hbotDriver.readEncDirect(); + hbotDriver.moveByDirectBlock(step, step); + Integer[] afterRunEncPos = hbotDriver.readEncDirect(); + + StrBuilder report = new StrBuilder(); + report.append(String.format("左电机: 实际运行:%d 编码器:%d", step, afterRunEncPos[0] - encPos[0])); + report.append(String.format("右电机: 实际运行:%d 编码器:%d", step, afterRunEncPos[1] - encPos[1])); + return report.toString(); + } + + @ExtApiStatu(name = "", group = "左光电状态", order = 1) + public Boolean getLeftPpsState() { + try { + return hbotDriver.readInIO(0); + } catch (AppException e) { + return false; + } + } + + @ExtApiStatu(name = "", group = "右光电状态", order = 2) + public Boolean getRightPpsState() { + try { + return hbotDriver.readInIO(1); + } catch (AppException e) { + return false; + } + } + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("基础"); + page.addFunction("使能", this::enableHbot); + page.addFunction("失能", this::disableHbot); + page.newGroup("电机测试"); + page.addFunction("左电机顺时针移动(900约等于1/8圈)", this::leftMotorMoveClockwise).setParamVal("step", () -> 900); + page.addFunction("左电机逆时针移动", this::leftMotorMoveCounterClockwise).setParamVal("step", () -> 900); + page.addFunction("右电机顺时针移动", this::rightMotorMoveClockwise).setParamVal("step", () -> 900); + page.addFunction("右电机逆时针移动", this::rightMotorMoveCounterClockwise).setParamVal("step", () -> 900); + page.newGroup("编码器测试"); + page.addFunction("检查电机编码器", this::checkMotorEncoder).setParamVal("step", () -> 100); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java new file mode 100644 index 0000000..5af73ee --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java @@ -0,0 +1,36 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.dao.type.db.ProjExtInfoCard; +import a8k.app.service.background.ProjIDCardCtrlAndMonitorService; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class ICCardReaderTestPage { + private final ExtApiPageMgr extApiPageMgr; + private final ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService; + + public void xxxx() { + + } + + public ProjExtInfoCard readProjExtInfoCard() { + return projIDCardCtrlAndMonitorService.getMountedIdCardInfo(); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("插入卡和拔卡都会正常情况都会弹窗", this::xxxx); + page.addFunction("读取当前挂载卡的内容", this::readProjExtInfoCard); + extApiPageMgr.addPage(page); + + } + + +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java new file mode 100644 index 0000000..6abae51 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java @@ -0,0 +1,58 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.type.exception.AppException; +import a8k.app.iflytophald.driver.InputDetectDriver; +import a8k.app.iflytophald.type.protocol.InputIOId; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class InputIOStateHardwareTestPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private InputDetectDriver inputDetectDriver; + + @ExtApiStatu(name = "入料平移通道-试管高低检测IO", order = 1) + public Boolean getTubeHeightPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeHeightPPS);} + + @ExtApiStatu(name = "入料平移通道-试管有无光电", order = 2) + public Boolean getTubeExistPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeExistPPS);} + + @ExtApiStatu(name = "入料平移通道-外光电", order = 3) + public Boolean getTHChOuterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChOuterPPS);} + + @ExtApiStatu(name = "入料平移通道-内光电", order = 4) + public Boolean getTHChInterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChInterPPS);} + + @ExtApiStatu(name = "入料区有无光电", order = 5) + public Boolean getInfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.InfeedPPS);} + + @ExtApiStatu(name = "出料位有无检测", order = 6) + public Boolean getOutfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.OutfeedPPS);} + + @ExtApiStatu(name = "废料仓满溢检测", order = 7) + public Boolean getRecycleBinOverflowPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinOverflowPPS);} + + @ExtApiStatu(name = "板夹仓-仓门光电(盖:1 不盖:0)", order = 8) + public Boolean getPlateBoxCoverClosurePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS);} + + @ExtApiStatu(name = "板夹仓-卡板光电", order = 9) + public Boolean getPlateBoxPlateStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateInletStuckPPS);} + + @ExtApiStatu(name = "光学模组-卡板光电", order = 10) + public Boolean incubationPlateOutletStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateOutletStuckPPS);} + + @ExtApiStatu(name = "废料仓-到位", order = 15) + public Boolean getRecycleBinInPlacePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinInPlacePPS);} + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java new file mode 100644 index 0000000..81e3d8f --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java @@ -0,0 +1,55 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.channel.LisUartCommunicationChannel; +import a8k.app.type.lis.LISSerialBaudrateType; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class LISUartTestPage { + final private LisUartCommunicationChannel lisUartCommunicationChannel; + private final ExtApiPageMgr extApiPageMgr; + + @ExtApiStatu(name = "", group = "波特率", order = 1) + public Integer getBaudRate() { + return lisUartCommunicationChannel.getBaudRateDirect(); + } + + @ExtApiStatu(name = "", group = "回环模式", order = 1) + public Boolean getLoopbackMode() { + return lisUartCommunicationChannel.isInLoopbackMode(); + } + + @ExtApiStatu(name = "", group = "说明", order = 1) + public String getHelp() { + return "回环模式下,电脑连接上232,发送消息给A8k,会自动发送回电脑"; + } + + + public void setBaudRate(LISSerialBaudrateType baudRate) { + lisUartCommunicationChannel.setBaudRate(baudRate.baudrate); + } + + + public void setInLoopbackMode(Boolean val) { + lisUartCommunicationChannel.setInLoopbackMode(val); + } + + public void sendCommand(String msg) { + lisUartCommunicationChannel.tx(msg); + } + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("设置波特率", this::setBaudRate); + page.addFunction("设置环回模式", this::setInLoopbackMode); + page.addFunction("发送命令", this::sendCommand); + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java new file mode 100644 index 0000000..c6c41d8 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java @@ -0,0 +1,188 @@ +package a8k.extui.page.factory.hardwaretest; + + +import a8k.app.iflytophald.driver.MiniServoDriver; +import a8k.app.iflytophald.type.protocol.MiniServoMId; +import a8k.app.service.mainctrl.AppDeviceInitCtrlService; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MiniServoHardwareTestPage { + + final private MiniServoDriver miniServoDriver; + final private AppDeviceInitCtrlService appDeviceInitCtrlService; + private final ExtApiPageMgr extApiPageMgr; + ExtUIPageCfg pageConfig; + + public void disableAllServos() throws AppException { + appDeviceInitCtrlService.disableAllMiniServo(); + } + + public void enableAllServos() throws AppException { + appDeviceInitCtrlService.enableAllMiniServo(); + } + + public Integer readPos(MiniServoMId id) { + try { + return miniServoDriver.miniServoReadPos(id); + } catch (AppException e) { + log.error("readPos error for {}", id, e); + return 0; + } + } + + public void regBasicFunctions() { + pageConfig.newGroup("基本功能"); + pageConfig.addFunction("使能所有舵机", this::enableAllServos); + pageConfig.addFunction("禁用所有舵机", this::disableAllServos); + } + + // ShakeModTubeScanerRotateSV + public void shakeModTubeScannerRotateSVRotateClockwise() throws AppException { + miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, -300); + } + + public void shakeModTubeScannerRotateSVRotateCounterClockwise() throws AppException { + miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, 300); + } + + public void shakeModTubeScannerRotateSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerRotateSV); + } + + public void registerShakeModTubeScannerRotateSV() { + pageConfig.newGroup("扫码旋转舵机"); + pageConfig.addFunction("顺时针转动", this::shakeModTubeScannerRotateSVRotateClockwise); + pageConfig.addFunction("逆时针转动", this::shakeModTubeScannerRotateSVRotateCounterClockwise); + pageConfig.addFunction("停止转动", this::shakeModTubeScannerRotateSVStop); + } + + // ShakeModTubeScanerClampingSV + public void shakeModTubeScannerClampingSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModTubeScanerClampingSV, step); + } + + public Integer shakeModTubeScannerClampingSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + public void shakeModTubeScannerClampingSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + public void registerShakeModTubeScannerClampingSV() { + pageConfig.newGroup("扫码夹紧舵机"); + pageConfig.addFunction("移动到", this::shakeModTubeScannerClampingSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModTubeScanerClampingSV)); + pageConfig.addFunction("读取位置", this::shakeModTubeScannerClampingSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModTubeScannerClampingSVStop); + } + + // ShakeModGripperYSV(MId.ShakeModGripperYSV),// + public void shakeModGripperYSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, step); + } + + public Integer shakeModGripperYSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); + } + + public void shakeModGripperYSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModGripperYSV); + } + + public void registerShakeModGripperYSV() { + pageConfig.newGroup("摇匀模组-前后移动舵机"); + pageConfig.addFunction("移动到", this::shakeModGripperYSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModGripperYSV)); + pageConfig.addFunction("读取位置", this::shakeModGripperYSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModGripperYSVStop); + } + + // ShakeModGripperSV(MId.ShakeModGripperSV),// + public void shakeModGripperSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperSV, step); + } + + public Integer shakeModGripperSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); + } + + public void shakeModGripperSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModGripperSV); + } + + public void registerShakeModGripperSV() { + pageConfig.newGroup("摇匀模组-夹爪舵机"); + pageConfig.addFunction("移动到", this::shakeModGripperSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModGripperSV)); + pageConfig.addFunction("读取位置", this::shakeModGripperSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModGripperSVStop); + } + + // ShakeModLiftingSV(MId.ShakeModLiftingSV),// + public void shakeModLiftingSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModLiftingSV, step); + } + + public Integer shakeModLiftingSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModLiftingSV); + } + + public void shakeModLiftingSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModLiftingSV); + } + + public void registerShakeModLiftingSV() { + pageConfig.newGroup("摇匀模组-顶升舵机"); + pageConfig.addFunction("移动到", this::shakeModLiftingSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModLiftingSV)); + pageConfig.addFunction("读取位置", this::shakeModLiftingSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModLiftingSVStop); + } + + + public Integer gripperSVSetRefPos() throws AppException { + return miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperSV); + } + + public Integer shakeModGripperYSVSetRefPos() throws AppException { + return miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperYSV); + } + + public void shakeModTubeScanerClampingSVSetRefPos() throws AppException { + miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + //ShakeModLiftingSV + public void shakeModLiftingSVSetRefPos() throws AppException { + miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModLiftingSV); + } + + @PostConstruct + void init() { + pageConfig = extApiPageMgr.newPage(this); + regBasicFunctions(); + registerShakeModTubeScannerRotateSV(); + registerShakeModTubeScannerClampingSV(); + registerShakeModGripperYSV(); + registerShakeModGripperSV(); + registerShakeModLiftingSV(); + + pageConfig.newGroup("参考点设置"); + pageConfig.addFunction("设置<夹爪><参考点>(完全张开的位置)", this::gripperSVSetRefPos); + pageConfig.addFunction("设置<摇匀模组Y轴舵机><参考点>(Y轴最外侧的位置)", this::shakeModGripperYSVSetRefPos); + pageConfig.addFunction("设置<夹紧舵机>参考点(水平位置)", this::shakeModTubeScanerClampingSVSetRefPos); + pageConfig.addFunction("设置<试管升降舵机>参考点(与试管架运行平面刚好水平)", this::shakeModLiftingSVSetRefPos); + + extApiPageMgr.addPage(pageConfig); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java new file mode 100644 index 0000000..7db5469 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java @@ -0,0 +1,119 @@ +package a8k.extui.page.factory.hardwaretest; + + +import a8k.app.service.lowerctrl.TubeFeedingExCtrlService; +import a8k.app.service.lowerctrl.TubePreProcessModuleCtrlService; +import a8k.app.service.param.pos.TubePreProcesPosParamMgr; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.app.iflytophald.driver.MiniServoDriver; +import a8k.app.iflytophald.type.protocol.MiniServoMId; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MiniServoPosCalibratePage { + + + private final MiniServoDriver miniServoDriver; + private final TubePreProcessModuleCtrlService tubePreProcessModuleCtrlService; + private final TubePreProcesPosParamMgr tubePreProcesPosParamMgr; + private final TubeFeedingExCtrlService tubeFeedingExCtrlService; + + + public void disableMotor() throws AppException { + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 0); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 0); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 0); + } + + + public void enableMotor() throws AppException { + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 1); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 1); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 1); + } + + public void gripperSVOpen() throws AppException { + tubePreProcessModuleCtrlService.gripperSVOpen(); + } + + + public void gripperSVClampTube() throws AppException { + tubePreProcessModuleCtrlService.gripperSVClampTube(); + } + + // + // ShakeModGripperYSV + // + + + public void YSVMoveToTakeTubePos() throws AppException { + tubePreProcessModuleCtrlService.YSVMoveToTakeTubePos(); + } + + public void YSVMoveToShakePos() throws AppException { + tubePreProcessModuleCtrlService.YSVMoveToShakePos(); + } + + public void YSVMoveToStandbyPos() throws AppException { + tubePreProcessModuleCtrlService.YSVMoveToStandbyPos(); + } + + + //ShakeModTubeScanerClampingSV + + public void tubeScanClampMoveToZeroBlock() throws AppException { + tubeFeedingExCtrlService.scanClampModRelease(); + } + + public void tubeScanClampMoveToWorkBlock() throws AppException { + tubeFeedingExCtrlService.scanClampModClamp(); + } + + + + public void tubeLiftSVMoveToZeroBlock() throws AppException { + miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModLiftingSV); + } + + public void tubeLiftSVMoveToRefBlock() throws AppException { + miniServoDriver.miniServoMoveToRefBlock(MiniServoMId.ShakeModLiftingSV); + } + + public void tubeLiftSVMoveToWorkBlock() throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModLiftingSV, tubePreProcesPosParamMgr.getShakeModLiftingSVWorkPos()); + } + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础"); + page.addFunction("失能所有舵机", this::disableMotor); + page.addFunction("使能所有舵机", this::enableMotor); + + page.newGroup("夹爪"); + page.addFunction("待机", this::gripperSVOpen); + page.addFunction("夹紧", this::gripperSVClampTube); + page.newGroup("夹爪Y轴-校验"); + page.addFunction("待机", this::YSVMoveToStandbyPos); + page.addFunction("取试管", this::YSVMoveToTakeTubePos); + page.addFunction("摇匀", this::YSVMoveToShakePos); + page.newGroup("扫码夹紧-校验"); + page.addFunction("释放", this::tubeScanClampMoveToZeroBlock); + page.addFunction("夹紧", this::tubeScanClampMoveToWorkBlock); + page.newGroup("试管升降舵机-校验"); + page.addFunction("待机", this::tubeLiftSVMoveToZeroBlock); + page.addFunction("参考位", this::tubeLiftSVMoveToRefBlock); + page.addFunction("工作位", this::tubeLiftSVMoveToWorkBlock); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java new file mode 100644 index 0000000..0e87a7f --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java @@ -0,0 +1,23 @@ +package a8k.extui.page.factory.hardwaretest; + + +import a8k.app.iflytophald.driver.MiniServoDriver; +import a8k.app.service.mainctrl.AppDeviceInitCtrlService; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MiscHardwareTestPage { + final private MiniServoDriver miniServoDriver; + final private AppDeviceInitCtrlService appDeviceInitCtrlService; + final private ExtApiPageMgr extApiPageMgr; + ExtUIPageCfg pageConfig; + + + +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java new file mode 100644 index 0000000..dbc1e7c --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java @@ -0,0 +1,407 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.StepMotorCtrlDriver; +import a8k.app.iflytophald.type.protocol.StepMotorMId; +import a8k.app.iflytophald.type.protocol.StepMotorRegIndex; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MotorHardwareTestPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final StepMotorCtrlDriver stepMotorCtrlDriver; + + ExtUIPageCfg pageConfig; + + // + // 入料电机 + // + public void infeedMotorIn() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModInfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, -1); + } + + public void infeedMotorOut() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModInfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, 1); + } + + public void infeedMotorStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); + } + + void regFeedingModInfeedM() { + pageConfig.newGroup("入料电机"); + pageConfig.addFunction("向内转动", this::infeedMotorIn); + pageConfig.addFunction("向外转动", this::infeedMotorOut); + pageConfig.addFunction("停止", this::infeedMotorStop); + } + + // + // 出料电机 + // + + public void outfeedMotorIn() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModOutfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, -1); + } + + public void outfeedMotorOut() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModOutfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); + } + + public void outfeedMotorStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModOutfeedM); + } + + void regFeedingModOutfeedM() { + pageConfig.newGroup("出料电机"); + pageConfig.addFunction("向内转动", this::outfeedMotorIn); + pageConfig.addFunction("向外转动", this::outfeedMotorOut); + pageConfig.addFunction("停止", this::outfeedMotorStop); + } + + // + // 入料平移电机 + // + public void feedingModXMFLeft(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, step); + } + + public void feedingModXMRight(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, -step); + } + + public Integer feedingModXMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.FeedingModXM); + } + + public void feedingModeStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModXM); + } + + + void regFeedingModXM() { + pageConfig.newGroup("入料平移电机"); + pageConfig.addFunction("归零", this::feedingModXMZero); + pageConfig.addFunction("向左移动", this::feedingModXMFLeft).setParamVal("step", () -> 30); + pageConfig.addFunction("向右移动", this::feedingModXMRight).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::feedingModeStop); + } + + // + // 摇匀模组 + // + public void shakeModGripperZMUp(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, -step); + } + + public void shakeModGripperZMDown(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, step); + } + + public Integer shakeModGripperZMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM); + } + + + public void shakeModGripperZMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModGripperZM); + } + + void regShakeModGripperZM() { + pageConfig.newGroup("摇匀模组Z轴"); + pageConfig.addFunction("归零", this::shakeModGripperZMZero); + pageConfig.addFunction("向上移动", this::shakeModGripperZMUp).setParamVal("step", () -> 30); + pageConfig.addFunction("向下移动", this::shakeModGripperZMDown).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::shakeModGripperZMStop); + } + + + public void shakeModClampingMClamping(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, -step); + } + + public void shakeModClampingMRelease(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, step); + } + + public Integer shakeModClampingMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM); + } + + + public void shakeModClampingMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModClampingM); + } + + void regShakeModClampingM() { + pageConfig.newGroup("摇匀模组夹紧电机"); + pageConfig.addFunction("归零", this::shakeModClampingMZero); + pageConfig.addFunction("夹紧", this::shakeModClampingMClamping).setParamVal("step", () -> 10); + pageConfig.addFunction("释放", this::shakeModClampingMRelease).setParamVal("step", () -> 10); + pageConfig.addFunction("停止", this::shakeModClampingMStop); + } + + public void shakeModShakeMClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, step); + } + + public void shakeModShakeMAntiClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, -step); + } + + public Integer shakeModShakeMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.ShakeModShakeM); + } + + public void shakeModShakeMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModShakeM); + } + + void regShakeModShakeM() { + pageConfig.newGroup("摇匀模组摇匀电机"); + pageConfig.addFunction("归零", this::shakeModShakeMZero); + pageConfig.addFunction("顺时针转动", this::shakeModShakeMClockwise).setParamVal("step", () -> 30); + pageConfig.addFunction("逆时针转动", this::shakeModShakeMAntiClockwise).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::shakeModShakeMStop); + } + + + // + // 板夹仓电机 + // + public void platesBoxYMForward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, step); + } + + public void platesBoxYMBackward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, -step); + } + + public Integer platesBoxYZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM); + } + + + public void platesBoxYMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.PlatesBoxYM); + } + + void regPlatesBoxYM() { + pageConfig.newGroup("板夹仓Y轴"); + pageConfig.addFunction("归零", this::platesBoxYZero); + pageConfig.addFunction("向内移动", this::platesBoxYMForward).setParamVal("step", () -> 30); + pageConfig.addFunction("向外移动", this::platesBoxYMBackward).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::platesBoxYMStop); + } + + public void platesBoxPusherForward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, step); + } + + public void platesBoxPusherBackward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, -step); + } + + public Integer platesBoxPusherZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM); + } + + + public void platesBoxPusherStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.PlatesBoxPusherM); + } + + void regPlatesBoxPusherM() { + pageConfig.newGroup("板夹仓推料电机"); + pageConfig.addFunction("归零", this::platesBoxPusherZero); + pageConfig.addFunction("推出", this::platesBoxPusherForward).setParamVal("step", () -> 30); + pageConfig.addFunction("返回", this::platesBoxPusherBackward).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::platesBoxPusherStop); + } + + // + // 孵育盘 + // + public String incubatorRotateCtrlMDiagnosticEnc() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + + //失能enc + stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_enable_enc, 0); + Integer beforeRunEncPos = stepMotorCtrlDriver.stepMotorReadEncPos(StepMotorMId.IncubatorRotateCtrlM); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, 200); + Integer afterRunEncPos = stepMotorCtrlDriver.stepMotorReadEncPos(StepMotorMId.IncubatorRotateCtrlM); + stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_enable_enc, 1); + int dpos = afterRunEncPos - beforeRunEncPos; + if (Math.abs(dpos) < 10) { + return String.format("编码器接线异常, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + if (dpos < 0) { + return String.format("编码器方向异常或 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + if (Math.abs(200 - dpos) > 2) { + return String.format("电机导程(减速比)错误, 或者编码器一圈脉冲数错误, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + return String.format("编码器诊断正常, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + + public void incubatorRotateCtrlMAntiClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, -step); + } + + public void incubatorRotateCtrlMClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, step); + } + + public Integer incubatorRotateCtrlMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM); + } + + + public void incubatorRotateCtrlMStop() throws AppException { + 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); + } + + + public void optModScannerMLeft(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, step); + } + + public void optModScannerMRight(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, -step); + } + + public Integer optModScannerMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(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); + } + + // + //OptModPullM + // + public void optModPullMLeft(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, -step); + } + + public void optModPullMRight(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, step); + } + + public Integer optModPullMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(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); + } + + + @PostConstruct + void init() { + pageConfig = extApiPageMgr.newPage(this); + regFeedingModInfeedM(); + regFeedingModOutfeedM(); + regFeedingModXM(); + regShakeModGripperZM(); + regShakeModClampingM(); + regShakeModShakeM(); + regPlatesBoxYM(); + regPlatesBoxPusherM(); + regIncubatorRotateCtrlM(); + regOptModScannerM(); + regOptModPullM(); + extApiPageMgr.addPage(pageConfig); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java new file mode 100644 index 0000000..072c5ae --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java @@ -0,0 +1,151 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; +import a8k.app.iflytophald.driver.StepMotorCtrlDriver; +import a8k.app.iflytophald.type.protocol.StepMotorMId; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MotorPPSHardwareTestPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final StepMotorCtrlDriver stepMotorCtrlDriver; + private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; + + ExtUIPageCfg pageConfig; + + // + // 入料平移电机 + // + @ExtApiStatu(name = "入料平移电机", group = "零点光电", order = 1, minWidth = "25%") + public Object feedingModXMReadIOState() { + return readZeroIOState(StepMotorMId.FeedingModXM); + } + + @ExtApiStatu(name = "摇匀模组-Z轴", group = "零点光电", order = 2, minWidth = "25%") + public Object shakeModGripperZMReadIOState() { + return readZeroIOState(StepMotorMId.ShakeModGripperZM); + } + + @ExtApiStatu(name = "摇匀模组-夹紧", group = "零点光电", order = 3, minWidth = "25%") + public Object shakeModClampingMReadIOState() { + return readZeroIOState(StepMotorMId.ShakeModClampingM); + } + + @ExtApiStatu(name = "摇匀模组-摇匀", group = "零点光电", order = 4, minWidth = "25%") + public Object shakeModShakeMReadIOState() { + return readZeroIOState(StepMotorMId.ShakeModShakeM); + } + + @ExtApiStatu(name = "板夹仓-前后移动电机", group = "零点光电", order = 5, minWidth = "25%") + public Object platesBoxYMReadIOState() { + return readZeroIOState(StepMotorMId.PlatesBoxYM); + } + + @ExtApiStatu(name = "板夹仓-推杆电机", group = "零点光电", order = 6, minWidth = "25%") + public Object platesBoxPusherReadIOState() { + return readZeroIOState(StepMotorMId.PlatesBoxPusherM); + } + + @ExtApiStatu(name = "孵育盘电机", group = "零点光电", order = 7, minWidth = "25%") + public Object incubatorRotateCtrlMReadIOState() { + return readZeroIOState(StepMotorMId.IncubatorRotateCtrlM); + } + + @ExtApiStatu(name = "光学模组-扫码电机", group = "零点光电", order = 8, minWidth = "25%") + public Object optModScannerMReadIOState() { + return readZeroIOState(StepMotorMId.OptModScannerM); + } + + @ExtApiStatu(name = "光学模组-拉杆电机", group = "零点光电", order = 9, minWidth = "25%") + public Object optModPullMReadIOState() { + return readZeroIOState(StepMotorMId.OptModPullM); + } + + + // + @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 { + 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 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); + extApiPageMgr.addPage(pageConfig); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java new file mode 100644 index 0000000..a190768 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java @@ -0,0 +1,32 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.OutputIOCtrlDriver; +import a8k.app.iflytophald.type.protocol.OutputIOId; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class OutputIOCtrlTestPage { + final private ExtApiPageMgr extApiPageMgr; + final private OutputIOCtrlDriver outputIOCtrlDriver; + + public void setRecycleBinOverflowPPSPowerCtrlIOState(Boolean state) throws AppException { + outputIOCtrlDriver.setIOState(OutputIOId.RecycleBinOverflowPPSPowerCtrl, state); + } + + public void setBeepCtrlIOState(Boolean state) throws AppException { + outputIOCtrlDriver.setIOState(OutputIOId.BeepCtrl, state); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("废料仓光栅控制", this::setRecycleBinOverflowPPSPowerCtrlIOState).setParamVal("state", () -> true); + page.addFunction("蜂鸣器控制", this::setBeepCtrlIOState).setParamVal("state", () -> true); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java new file mode 100644 index 0000000..53be172 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java @@ -0,0 +1,82 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class PipetteGunHardwareTestPage { + private final ExtApiPageMgr extApiPageMgr; + private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; + + + public void enableMotor() throws AppException { + pipetteCtrlDriverV2.zMotorEnable(1); + } + + public void disableMotor() throws AppException { + pipetteCtrlDriverV2.zMotorEnable(0); + } + + public void stepMotorEasyMoveToZero() throws AppException { + pipetteCtrlDriverV2.zMotorMoveZeroBlock(); + } + + + public void stepMotorStop() throws AppException { + pipetteCtrlDriverV2.moduleStop(); + } + + public void stepMotorEasyMoveForward(Integer dpos) throws AppException { + pipetteCtrlDriverV2.zMotorMoveByBlock(dpos); + } + + public void stepMotorEasyMoveBackward(Integer dpos) throws AppException { + pipetteCtrlDriverV2.zMotorMoveByBlock(-dpos); + } + + + public Integer readPos() throws AppException { + return pipetteCtrlDriverV2.zMotorReadPos(); + } + + + public PipetteCtrlDriverV2.PipetteGunConnectivityTestReport readPipetteConnectedState() throws AppException { + pipetteCtrlDriverV2.pipetteTestConnectivity(); + return pipetteCtrlDriverV2.readPipetteConnectedState(); + } + + public Boolean readZeroSensorState() throws AppException { + return pipetteCtrlDriverV2.zMotorReadZeroPointState(); + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础操作"); + page.addFunction("使能电机", this::enableMotor); + page.addFunction("失能电机", this::disableMotor); + page.addFunction("归零", this::stepMotorEasyMoveToZero); + page.addFunction("正向移动", this::stepMotorEasyMoveForward).setParamVal("dpos", () -> 50); + page.addFunction("反向移动", this::stepMotorEasyMoveBackward).setParamVal("dpos", () -> 50); + page.addFunction("停止", this::stepMotorStop); + + 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/factory/hardwaretest/SubBoardProberPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/SubBoardProberPage.java new file mode 100644 index 0000000..081afb3 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/SubBoardProberPage.java @@ -0,0 +1,131 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.A8kCanBusBaseDriver; +import a8k.app.iflytophald.type.protocol.MId; +import a8k.app.type.VersionInfo; +import a8k.app.type.exception.AppException; +import a8k.app.utils.ZList; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class SubBoardProberPage { + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @Resource + A8kCanBusBaseDriver canBus; + + + Map versionInfos = new HashMap<>(); + + @ExtApiStatu(name = "", group = "机械臂板模块-10", order = 1) + public VersionInfo getHbotBoard() { + return versionInfos.get(MId.HbotBoard); + } + + @ExtApiStatu(name = "", group = "板夹仓模块-20", order = 3) + public VersionInfo getPlatesBoxBoard() { + return versionInfos.get(MId.PlatesBoxBoard); + } + + @ExtApiStatu(name = "", group = "摇匀模组板-30", order = 7) + public VersionInfo getShakeModBoard() { + return versionInfos.get(MId.ShakeModBoard); + } + + @ExtApiStatu(name = "", group = "反应板夹温度控板-40", order = 15) + public VersionInfo getPlatesBoxTCMBoard() { + return versionInfos.get(MId.PlatesBoxTCMBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘温空板-50", order = 18) + public VersionInfo getIncubatorTCMBoard() { + return versionInfos.get(MId.IncubatorTCMBoard); + } + + + @ExtApiStatu(name = "", group = "出入料模块-60", order = 20) + public VersionInfo getFeedingModBoard() { + return versionInfos.get(MId.FeedingModBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘旋转板-70", order = 25) + public VersionInfo getIncubatorRotateBoard() { + return versionInfos.get(MId.IncubatorRotateBoard); + } + + + @ExtApiStatu(name = "", group = "机械臂Z轴板-80", order = 27) + public VersionInfo getPipetteModBoard() { + return versionInfos.get(MId.PipetteModBoard); + } + + @ExtApiStatu(name = "", group = "光学模组板-90", order = 30) + public VersionInfo getOptModBoard() { + return versionInfos.get(MId.OptModBoard); + } + + @ExtApiStatu(name = "", group = "A8K读卡器板-100", order = 34) + public VersionInfo getA8kIdCardReaderBoard() { + return versionInfos.get(MId.A8kIdCardReaderBoard); + } + + + public void refreshBoardState() { + var modules = ZList.of( + MId.HbotBoard, + MId.PlatesBoxBoard, + MId.ShakeModBoard, + MId.PlatesBoxTCMBoard, + MId.IncubatorTCMBoard, + MId.FeedingModBoard, + MId.IncubatorRotateBoard, + MId.PipetteModBoard, + MId.OptModBoard, + MId.A8kIdCardReaderBoard + ); + for (var module : modules) { + if (module == MId.NotSet) { + continue; + } + try { + Integer version = canBus.moduleReadVersion(module); + String modueType = canBus.moduleReadType(module).toString(); + + VersionInfo info = new VersionInfo(); + info.online = true; + info.moduleType = modueType; + info.moduleId = module.index; + info.moduleName = module.chname; + info.version = version; + versionInfos.put(module, info); + + } catch (AppException e) { + VersionInfo info = new VersionInfo(); + info.online = false; + info.moduleId = module.index; + info.moduleName = module.chname; + versionInfos.put(module, info); + } + } + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.regPageInitFn(this::refreshBoardState); + page.addFunction("刷新", this::refreshBoardState); + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java new file mode 100644 index 0000000..49bc7e2 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java @@ -0,0 +1,244 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.type.exception.AppException; +import a8k.app.iflytophald.driver.A8kCanBusBaseDriver; +import a8k.app.iflytophald.type.protocol.MId; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class SubModuleVersionPreviewPage { + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @Resource + A8kCanBusBaseDriver canBus; + + public static class VersionInfo { + public Integer moduleId; + public String moduleName; + public Boolean online; + public String moduleType; + public Integer version; + } + + Map versionInfos = new HashMap<>(); + + @ExtApiStatu(name = "", group = "机械臂板模块", order = 1) + public VersionInfo getHbotBoard() { + return versionInfos.get(MId.HbotBoard); + } + + @ExtApiStatu(name = "", group = "机械臂XY", order = 2) + public VersionInfo getHbotM() { + return versionInfos.get(MId.HbotM); + } + + @ExtApiStatu(name = "", group = "板夹仓模块", order = 3) + public VersionInfo getPlatesBoxBoard() { + return versionInfos.get(MId.PlatesBoxBoard); + } + + @ExtApiStatu(name = "", group = "板夹仓移动电机", order = 4) + public VersionInfo getPlatesBoxYM() { + return versionInfos.get(MId.PlatesBoxYM); + } + + @ExtApiStatu(name = "", group = "板夹仓推杆电机", order = 5) + public VersionInfo getPlatesBoxPusherM() { + return versionInfos.get(MId.PlatesBoxPusherM); + } + +// @ExtApiStatu(name = "", group = "板夹仓扫码模组", order = 6) +// public VersionInfo getPlatesBoxScanner() { +// return versionInfos.get(MId.PlatesBoxScanner); +// } + + @ExtApiStatu(name = "", group = "摇匀模组板", order = 7) + public VersionInfo getShakeModBoard() { + return versionInfos.get(MId.ShakeModBoard); + } + + @ExtApiStatu(name = "", group = "试管固定夹爪电机", order = 8) + public VersionInfo getShakeModClampingM() { + return versionInfos.get(MId.ShakeModClampingM); + } + + @ExtApiStatu(name = "", group = "摇匀升降电机", order = 9) + public VersionInfo getShakeModGripperZM() { + return versionInfos.get(MId.ShakeModGripperZM); + } + + @ExtApiStatu(name = "", group = "试管摇匀电机", order = 10) + public VersionInfo getShakeModShakeM() { + return versionInfos.get(MId.ShakeModShakeM); + } + + @ExtApiStatu(name = "", group = "摇匀前后移动舵机", order = 11) + public VersionInfo getShakeModGripperYSV() { + return versionInfos.get(MId.ShakeModGripperYSV); + } + + @ExtApiStatu(name = "", group = "摇匀试管帽夹爪舵机", order = 12) + public VersionInfo getShakeModGripperSV() { + return versionInfos.get(MId.ShakeModGripperSV); + } + + @ExtApiStatu(name = "", group = "试管架扫码夹紧舵机", order = 13) + public VersionInfo getShakeModTubeScanerClampingSV() { + return versionInfos.get(MId.ShakeModTubeScanerClampingSV); + } + + @ExtApiStatu(name = "", group = "试管架旋转舵机", order = 14) + public VersionInfo getShakeModTubeScanerRotateSV() { + return versionInfos.get(MId.ShakeModTubeScanerRotateSV); + } + + @ExtApiStatu(name = "", group = "反应板夹温度控板", order = 15) + public VersionInfo getPlatesBoxTCMBoard() { + return versionInfos.get(MId.PlatesBoxTCMBoard); + } + + @ExtApiStatu(name = "", group = "反应板夹温度控制模块", order = 16) + public VersionInfo getPlatesBoxTCM() { + return versionInfos.get(MId.PlatesBoxTCM); + } + + @ExtApiStatu(name = "", group = "气溶胶风扇", order = 17) + public VersionInfo getWbTubeFanMod() { + return versionInfos.get(MId.WbTubeFanMod); + } + + @ExtApiStatu(name = "", group = "孵育盘温空板", order = 18) + public VersionInfo getIncubatorTCMBoard() { + return versionInfos.get(MId.IncubatorTCMBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘温控模块", order = 19) + public VersionInfo getIncubatorTCM() { + return versionInfos.get(MId.IncubatorTCM); + } + + @ExtApiStatu(name = "", group = "出入料模块", order = 20) + public VersionInfo getFeedingModBoard() { + return versionInfos.get(MId.FeedingModBoard); + } + + @ExtApiStatu(name = "", group = "入料电机", order = 21) + public VersionInfo getFeedingModInfeedM() { + return versionInfos.get(MId.FeedingModInfeedM); + } + + @ExtApiStatu(name = "", group = "试管架平移电机", order = 22) + public VersionInfo getFeedingModXM() { + return versionInfos.get(MId.FeedingModXM); + } + + @ExtApiStatu(name = "", group = "出料电机", order = 23) + public VersionInfo getFeedingModOutfeedM() { + return versionInfos.get(MId.FeedingModOutfeedM); + } + + @ExtApiStatu(name = "", group = "试管架扫码器", order = 24) + public VersionInfo getFeedingModScannerMod() { + return versionInfos.get(MId.FeedingModScannerMod); + } + + @ExtApiStatu(name = "", group = "孵育盘旋转板", order = 25) + public VersionInfo getIncubatorRotateBoard() { + return versionInfos.get(MId.IncubatorRotateBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘旋转", order = 26) + public VersionInfo getIncubatorRotateCtrlM() { + return versionInfos.get(MId.IncubatorRotateCtrlM); + } + + @ExtApiStatu(name = "", group = "机械臂Z轴板", order = 27) + public VersionInfo getPipetteModBoard() { + return versionInfos.get(MId.PipetteModBoard); + } + + @ExtApiStatu(name = "", group = "移液枪", order = 28) + public VersionInfo getPipetteMod() {return versionInfos.get(MId.PipetteMod);} + + @ExtApiStatu(name = "", group = "物料扫码器", order = 29) + public VersionInfo getPipetteModCodeScanner() { + return versionInfos.get(MId.PipetteModCodeScanner); + } + + @ExtApiStatu(name = "", group = "光学模组板", order = 30) + public VersionInfo getOptModBoard() { + return versionInfos.get(MId.OptModBoard); + } + + @ExtApiStatu(name = "", group = "板卡扫描电机", order = 31) + public VersionInfo getOptModScannerM() { + return versionInfos.get(MId.OptModScannerM); + } + + @ExtApiStatu(name = "", group = "板卡推杆电机", order = 32) + public VersionInfo getOptModPullM() { + return versionInfos.get(MId.OptModPullM); + } + + @ExtApiStatu(name = "", group = "扫描仪", order = 33) + public VersionInfo getOptMod() { + return versionInfos.get(MId.OptMod); + } + + @ExtApiStatu(name = "", group = "A8K读卡器板", order = 34) + public VersionInfo getA8kIdCardReaderBoard() { + return versionInfos.get(MId.A8kIdCardReaderBoard); + } + + @ExtApiStatu(name = "", group = "A8K读卡器", order = 35) + public VersionInfo getA8kIdCardReader() { + return versionInfos.get(MId.A8kIdCardReader); + } + + public void refreshBoardState() { + var modules = MId.values(); + for (var module : modules) { + if (module == MId.NotSet) { + continue; + } + try { + Integer version = canBus.moduleReadVersion(module); + String modueType = canBus.moduleReadType(module).toString(); + + VersionInfo info = new VersionInfo(); + info.online = true; + info.moduleType = modueType; + info.moduleId = module.index; + info.moduleName = module.chname; + info.version = version; + versionInfos.put(module, info); + + } catch (AppException e) { + VersionInfo info = new VersionInfo(); + info.online = false; + info.moduleId = module.index; + info.moduleName = module.chname; + versionInfos.put(module, info); + } + } + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("刷新", this::refreshBoardState); + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java b/src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java new file mode 100644 index 0000000..626bf5d --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java @@ -0,0 +1,145 @@ +package a8k.extui.page.factory.hardwaretest; + +import a8k.app.iflytophald.driver.WaterTemperatureControllerDriver; +import a8k.app.iflytophald.type.protocol.TemperatureControlerMid; +import a8k.app.iflytophald.type.protocol.TemperatureControlerRegIndex; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class WaterTempControllerTestPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private WaterTemperatureControllerDriver waterTemperatureControllerDriver; + + @ExtApiStatu(name = "", group = "孵育盘反馈温度", order = 1, minWidth = "50%") + public Double readIncubateBoxReadFeedbackTemperature() throws AppException { + return waterTemperatureControllerDriver.readTemperature(TemperatureControlerMid.IncubatorTCM); + } + + + @ExtApiStatu(name = "", group = "板夹仓反馈温度", order = 2, minWidth = "50%") + public Double readPlatesBoxTCMFeedbackTemperature() throws AppException { + return waterTemperatureControllerDriver.readTemperature(TemperatureControlerMid.PlatesBoxTCM); + } + + @ExtApiStatu(name = "", group = "孵育盘温度传感器", order = 3, minWidth = "50%") + public String readIncubateBoxReadTemperatures() throws AppException { + Integer temp0 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp0); + Integer temp1 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp1); + Integer temp2 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp2); + Integer temp3 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp3); + return String.format("S0: %d, S1: %d, S2: %d, S3: %d", temp0, temp1, temp2, temp3); + } + + @ExtApiStatu(name = "", group = "板夹仓温度传感器", order = 4, minWidth = "50%") + public String readPlatesBoxTCMReadTemperatures() throws AppException { + Integer temp0 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp0); + Integer temp1 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp1); + Integer temp2 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp2); + Integer temp3 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp3); + return String.format("S0: %d, S1: %d, S2: %d, S3: %d", temp0, temp1, temp2, temp3); + } + + + public void incubatorTCMStartCtrlTemperature(Double targetTemp) throws AppException { + waterTemperatureControllerDriver.startCtrlTemperature(TemperatureControlerMid.IncubatorTCM, targetTemp); + } + + public void incubatorTCMStopCtrlTemperature() throws AppException { + waterTemperatureControllerDriver.stopCtrlTemperature(TemperatureControlerMid.IncubatorTCM); + } + + + public void incubatorTCMSetPeltierPower(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.IncubatorTCM, val0To100); + } + public void incubatorTCMSetPeltierClose() throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.IncubatorTCM, 0); + } + + + public void incubatorTCMSetCtrlFanLevel(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.IncubatorTCM, val0To100); + } + public void incubatorTCMSetCtrlFanClose() throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.IncubatorTCM, 0); + } + + public void incubatorTCMSetWaterPumpSpeed(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.IncubatorTCM, val0To100); + } + public void incubatorTCMSetWaterPumpClose() throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.IncubatorTCM, 0); + } + + + public void platesBoxTCMStartCtrlTemperature(Double targetTemp) throws AppException { + waterTemperatureControllerDriver.startCtrlTemperature(TemperatureControlerMid.PlatesBoxTCM, targetTemp); + } + + + public void platesBoxTCMStopCtrlTemperature() throws AppException { + waterTemperatureControllerDriver.stopCtrlTemperature(TemperatureControlerMid.PlatesBoxTCM); + } + + public void platesBoxTCMSetPeltierPower(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.PlatesBoxTCM, val0To100); + } + + public void platesBoxTCMSetPeltierClose() throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.PlatesBoxTCM, 0); + } + + + public void platesBoxTCMSetCtrlFanLevel(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.PlatesBoxTCM, val0To100); + } + public void platesBoxTCMSetCtrlFanClose() throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.PlatesBoxTCM, 0); + } + + public void platesBoxTCMSetWaterPumpSpeed(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.PlatesBoxTCM, val0To100); + } + public void platesBoxTCMSetWaterPumpClose() throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.PlatesBoxTCM, 0); + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("孵育盘-温度控制"); + page.addFunction("孵育箱TCM开始控温", this::incubatorTCMStartCtrlTemperature); + page.addFunction("孵育箱TCM停止控温", this::incubatorTCMStopCtrlTemperature); + page.newGroup("孵育盘-温度控制-测试"); + page.addFunction("设置加热片功率(-100...+100)", this::incubatorTCMSetPeltierPower); + page.addFunction("关闭加热片", this::incubatorTCMSetPeltierClose); + page.addFunction("设置风扇转速", this::incubatorTCMSetCtrlFanLevel); + page.addFunction("关闭风扇", this::incubatorTCMSetCtrlFanClose); + page.addFunction("设置水泵转速", this::incubatorTCMSetWaterPumpSpeed); + page.addFunction("关闭水泵", this::incubatorTCMSetWaterPumpClose); + page.newGroup("板夹仓-温度控制"); + page.addFunction("板夹仓TCM开始控温", this::platesBoxTCMStartCtrlTemperature); + page.addFunction("板夹仓TCM停止控温", this::platesBoxTCMStopCtrlTemperature); + page.newGroup("板夹仓-温度控制-测试"); + page.addFunction("设置加热片功率(-100...+100)", this::platesBoxTCMSetPeltierPower); + page.addFunction("关闭加热片", this::platesBoxTCMSetPeltierClose); + page.addFunction("设置风扇转速", this::platesBoxTCMSetCtrlFanLevel); + page.addFunction("关闭风扇", this::platesBoxTCMSetCtrlFanClose); + page.addFunction("设置水泵转速", this::platesBoxTCMSetWaterPumpSpeed); + page.addFunction("关闭水泵", this::platesBoxTCMSetWaterPumpClose); + extApiPageMgr.addPage(page); + } + + +} diff --git a/src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java b/src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java new file mode 100644 index 0000000..02fdda7 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java @@ -0,0 +1,274 @@ +package a8k.extui.page.factory.opt; + +import a8k.app.dao.type.db.ReactionRecord; +import a8k.app.optalgo.A8kPeakAnalyzer; +import a8k.app.type.a8k.opt.OptScanResult; +import a8k.app.type.a8k.BloodType; +import a8k.app.type.a8k.state.SampleInfo; +import a8k.app.dao.type.db.ProjExtInfoCard; +import a8k.app.service.mainctrl.AppDeviceInitCtrlService; +import a8k.app.type.exception.AppException; +import a8k.extui.factory.A8kScanCurveFactory; +import a8k.app.service.data.ProjIdCardInfoMgrService; +import a8k.app.type.a8k.proj.ProjInfo; +import a8k.extui.type.ExtApiStatu; +import a8k.extui.type.ret.FileToBeDownload; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import a8k.app.service.data.FileMgrService; +import a8k.app.service.data.ProjInfoMgrService; +import a8k.app.service.lowerctrl.OptScanModuleLowerCtrlService; +import a8k.app.service.lowerctrl.PlateBoxCtrlService; +import a8k.extui.type.ret.A8kScanCurve; +import a8k.app.type.a8k.opt.A8kOptType; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.pos.IncubatorPos; +import a8k.app.dao.type.combination.ProjBuildInInfo; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +public class A8kOptVerification { + + @Resource + AppDeviceInitCtrlService appDeviceInitCtrlService; + + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; + + @Resource + ProjInfoMgrService projInfoMgrService; + @Resource + FileMgrService fileMgrService; + @Resource + ProjIdCardInfoMgrService projIdCardInfoMgrService; + + @Resource + ExtApiPageMgr extApiPageMgr; + + // Integer activeProjId = 0; + BloodType bloodType = BloodType.WHOLE_BLOOD; + // ProjBuildinInfo projInfo; + + // @ExtApiStatu(name = "", group = "项目信息", order = 1) + // public ProjBuildinInfo getProjInfo() { + // return projInfo; + // } + + @ExtApiStatu(name = "", group = "挂载ID卡信息", order = 2) + public ProjExtInfoCard getMountedProjInfoCard() { + return projIdCardInfoMgrService.getMountedProjInfoCard(); + } + + @ExtApiStatu(name = "", group = "血液类型", order = 2) + public String getBloodType() { + return switch (bloodType) { + case WHOLE_BLOOD -> "全血"; + case SERUM_OR_PLASMA -> "血清/血浆"; + case FECES -> "粪便"; + }; + } + + + @PostConstruct + void init() throws NoSuchMethodException { + ExtUIPageCfg page = new ExtUIPageCfg(this); + + page.newGroup("环境配置"); + page.addFunction("设置血液类型", this::setBloodType); + + page.newGroup("光学测试"); + page.addFunction("推板到光学模组(从板夹仓0号仓推入)", this::pushOnePlateToOptModule); + page.addFunction("光学扫描", this::doOptScan); + page.addFunction("计算扫描结果", this::computeResult); + page.addFunction("丢板", this::dropPlate); + + + page.newGroup("光学结果"); + page.addFunction("预览T光学扫描曲线", this::getScanCurveT); + page.addFunction("预览F光学扫描曲线", this::getScanCurveF); + page.addFunction("下载T光学报告", this::getTOptReport); + page.addFunction("下载F光学报告", this::getFOptReport); + page.newGroup("系统板检查"); + page.addFunction("进行一次光学扫描(自动推板,丢板)", this::autoScanAndDownloadScanResult); + extApiPageMgr.addPage(page); + } + + public Map getProjInfoBreifList() throws AppException { + var allproj = projInfoMgrService.getAllProjBuildInInfo(); + Map result = new java.util.HashMap<>(); + for (var proj : allproj) { + result.put(proj.projId.toString(), + String.format("%s(%s)", proj.projName, proj.getOptMark())); + } + return result; + } + + + // synchronized public void setProj(Integer projId) throws AppException { + // activeProjId = projId; + // projInfo = projInfoMgrService.getProjBuildInInfo(projId); + // } + + synchronized public void setBloodType(BloodType bloodType) { + this.bloodType = bloodType; + } + + + static class OptScanReport { + public A8kOptType optType; + public A8kScanCurve optScanCurve; + public OptScanResult optScanResult; + public ProjBuildInInfo projInfo; + public Integer subProjIndex; + } + + List optScanReports = new ArrayList<>(); + + private OptScanResult getOptScanResult(A8kOptType type) throws AppException { + for (var report : optScanReports) { + if (report.optType.equals(type)) { + return report.optScanResult; + } + } + return null; + } + + public void generateOptReport(ProjBuildInInfo info, Integer subProjIndex, OptScanResult optScanResult) + throws IOException { + OptScanReport report = new OptScanReport(); + report.optScanCurve = A8kScanCurveFactory.createScanCurve1200Point(optScanResult.rawData.rawData); + report.optType = info.optcfg.get(subProjIndex).optType; + report.optScanResult = optScanResult; + report.projInfo = info; + report.subProjIndex = subProjIndex; + optScanReports.add(report); + } + + public void pushOnePlateToOptModule() throws AppException { + optScanModuleLowerCtrlService.dropPlate(); + optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); + optScanModuleLowerCtrlService.dropPlate(); + plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); + optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); + } + + + public String doOptScan(Boolean autoAmpl) throws AppException, IOException { + // fileMgrService.clearOptReport(); + optScanReports.clear(); + var projInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); + if (projInfo == null) { + throw AppException.ofSimplePrompt("请插入项目ID卡"); + } + for (int i = 0; i < projInfo.optcfg.size(); i++) { + OptScanResult scanResult = getOptScanResult(projInfo.optcfg.get(i).optType); + if (scanResult == null) { + scanResult = optScanModuleLowerCtrlService.optScan(projInfo, i, autoAmpl); + } + generateOptReport(projInfo, i, scanResult); + } + return "扫描完成"; + } + + + public List computeResult() throws AppException { + var projBuildinInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); + if (projBuildinInfo == null) { + throw AppException.ofSimplePrompt("请插入项目ID卡"); + } + + // ProjBuildinInfo + + SampleInfo sampleInfo = new SampleInfo( + "TEST_SAMPLE", // sampleId + 1, // tubePosition + false, // isHighTube + false, // isEmergency + bloodType, // bloodType + "TEST_BARCODE", // sampleBarcode + "TEST_USERID" // userid + ); + + ProjInfo projInfo = new ProjInfo(); + projInfo.buildIn = projBuildinInfo; + projInfo.ext = projIdCardInfoMgrService.getMountedProjInfoCard(); + + if (projInfo.ext == null) { + throw AppException.ofSimplePrompt("请插入项目卡"); + } + + + List results = new ArrayList<>(); + for (int i = 0; i < projBuildinInfo.optcfg.size(); i++) { + OptScanResult optScanResult = getOptScanResult(projBuildinInfo.optcfg.get(i).optType); + Assert.notNull(optScanResult, "光学扫描结果为空"); + results.add(A8kPeakAnalyzer.analysisPeakInfo(sampleInfo, projInfo, i, optScanResult.analysResult)); + } + + return results; + } + + public void dropPlate() throws AppException { + optScanModuleLowerCtrlService.dropPlate(); + } + + public A8kScanCurve getScanCurveT() throws AppException { + for (var report : optScanReports) { + if (report.optType.equals(A8kOptType.TOPT)) { + return report.optScanCurve; + } + } + throw AppException.ofSimplePrompt("当前项目没有T光学扫描曲线"); + } + + public A8kScanCurve getScanCurveF() throws AppException { + for (var report : optScanReports) { + if (report.optType.equals(A8kOptType.FOPT)) { + return report.optScanCurve; + } + } + throw AppException.ofSimplePrompt("当前项目没有F光学扫描曲线"); + } + + public FileToBeDownload getTOptReport() throws AppException, IOException { + for (var report : optScanReports) { + if (report.optType.equals(A8kOptType.TOPT)) { + return new FileToBeDownload(fileMgrService.storageOptReport(report.projInfo.projName, report.projInfo.projId, report.optScanResult)); + } + } + throw AppException.ofSimplePrompt("当前项目没有T光学报告"); + } + + public FileToBeDownload getFOptReport() throws AppException, IOException { + for (var report : optScanReports) { + if (report.optType.equals(A8kOptType.FOPT)) { + return new FileToBeDownload(fileMgrService.storageOptReport(report.projInfo.projName, report.projInfo.projId, report.optScanResult)); + } + } + throw AppException.ofSimplePrompt("当前项目没有F光学报告"); + } + + public void autoScanAndDownloadScanResult(Boolean autoAmpl) throws AppException, IOException { + var projInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); + if (projInfo == null) { + throw AppException.ofSimplePrompt("请插入项目ID卡"); + } + + optScanModuleLowerCtrlService.forceDropPlate(IncubatorPos.SPACE01); + plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); + optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); + doOptScan(autoAmpl); + computeResult(); + optScanModuleLowerCtrlService.dropPlate(); + } +} diff --git a/src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java b/src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java new file mode 100644 index 0000000..1a4a228 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java @@ -0,0 +1,232 @@ +package a8k.extui.page.factory.opt; + +import a8k.app.dao.type.combination.ProjBuildInInfo; +import a8k.app.optalgo.type.A8kOptPeakInfo; +import a8k.app.service.data.ProjInfoMgrService; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.pos.IncubatorPos; +import a8k.app.type.exception.AppException; +import a8k.extui.factory.A8kScanCurveFactory; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ret.A8kScanCurve; +import a8k.extui.type.ExtApiStatu; +import a8k.app.service.lowerctrl.OptScanModuleLowerCtrlService; +import a8k.app.service.lowerctrl.PlateBoxCtrlService; +import a8k.app.service.param.optparam.OptModuleExtParamsMgr; +import a8k.app.type.param.optpos.OptModuleExtParam; +import a8k.app.type.a8k.opt.A8kOptType; +import a8k.app.iflytophald.utils.OptGainConvert; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + + +/** + * + * 1.下面三个位置在ReactionPlatesTransmitControlerCalibration进行标定 + * PullerTargetPos("拉板目标位置"), + * OptScanerDropPos("丢板坐标"), + * OptScanerScandbyPos("扫描待机位"), + * + * 2. 该模块只用来标定 + * TOptScanStartPos (T光学扫描起始位置) + * FOptScanStartPos (F光学扫描起始位置) + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class OptModuleParamCalibration { + + private final OptModuleExtParamsMgr optModuleExtParamsMgr; + private final PlateBoxCtrlService plateBoxCtrlService; + private final OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; + private final ProjInfoMgrService projInfoMgrService; + + + @ExtApiStatu(name = "", group = "F光学参数", order = 1) + public Object getTPara() throws AppException { + return optModuleExtParamsMgr.getParamMap(OptModuleExtParam.FOptEmissionIntensity, OptModuleExtParam.FOptScanGainVal, OptModuleExtParam.FOptScanShift); + } + + @ExtApiStatu(name = "", group = "T光学参数", order = 2) + public Object getFPara() throws AppException { + return optModuleExtParamsMgr.getParamMap(OptModuleExtParam.TOptEmissionIntensity, OptModuleExtParam.TOptScanGainVal, OptModuleExtParam.TOptScanShift); + } + + @ExtApiStatu(name = "", group = "说明", order = 3) + public Object getDesc() { + Map desc = new HashMap<>(); + desc.put("1", "测试使用的位置反应板1号仓"); + desc.put("2", "F光学发射强度参数:越大强度越弱"); + return desc; + } + + + // + // 辅助方法 + // + + /** + * From: 0号仓 + * TrunablePos:0号仓到 + */ + + public void pushOnePlateToOptModule() throws AppException { + //先清空当前通道 + optScanModuleLowerCtrlService.dropPlate(); + optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); + optScanModuleLowerCtrlService.dropPlate(); + + //推板到光学模组 + plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); + optScanModuleLowerCtrlService.pullPlate(IncubatorPos.SPACE01); + } + + + public void dropPlate() throws AppException { + optScanModuleLowerCtrlService.dropPlate(); + } + + A8kScanCurve FCurveCache = null; + + public void setFOptScanShift(Integer shift) throws AppException { + if (shift < 0) { + throw AppException.ofAECodeError("扫描偏移量必须大于0"); + } + + Integer oldShift = optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptScanShift, Integer.class); + Integer diffShift = shift - oldShift; + + if (FCurveCache != null) { + for (int i = 0; i < FCurveCache.refCurve.size(); i++) { + // log.info("i={}, fcurveCache.refCurve.get(i)={}, diffShift={}", i, fcurveCache.refCurve.get(i), diffShift); + // log.info("new value={}", fcurveCache.refCurve.get(i) - diffShift); + FCurveCache.refCurve.set(i, FCurveCache.refCurve.get(i) + diffShift); + } + } + + + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanShift, shift); + } + + + public void setFOptEmissionIntensity(Integer val) { + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptEmissionIntensity, val); + } + + + public void setFOptScanAmplVal(Double val) { + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.FOptScanGainVal, val); + } + + + public A8kScanCurve FOptScan() throws AppException { + Double scanGain = optModuleExtParamsMgr.getScanGain(A8kOptType.FOPT); + Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.FOPT, scanGain); + Integer rawLasterGain = optModuleExtParamsMgr.getOptLasterRawGain(A8kOptType.FOPT); + var result = optScanModuleLowerCtrlService.startOptScan(A8kOptType.FOPT, rawLasterGain, rawScanGain); + FCurveCache = A8kScanCurveFactory.createScanCurve1200Point(result); + return FCurveCache; + } + + synchronized public A8kScanCurve getFCurveCache() { + return FCurveCache; + } + + + // + //T光学 + // + A8kScanCurve TCurveCache = null; + + public void setTOptScanShift(Integer shift) throws AppException { + if (shift < 0) { + throw AppException.ofAECodeError("扫描偏移量必须大于0"); + } + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanShift, shift); + } + + + public void setTOptEmissionIntensity(Integer val) { + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptEmissionIntensity, val); + } + + + public void setTOptScanAmplVal(Double val) { + optModuleExtParamsMgr.setOptParam(OptModuleExtParam.TOptScanGainVal, val); + } + + + public A8kScanCurve TOptScan() throws AppException { + Double scanGain = optModuleExtParamsMgr.getScanGain(A8kOptType.TOPT); + Integer rawScanGain = OptGainConvert.scanerToRawGain(A8kOptType.TOPT, scanGain); + Integer rawLasterGain = optModuleExtParamsMgr.getOptLasterRawGain(A8kOptType.TOPT); + + var result = optScanModuleLowerCtrlService.startOptScan(A8kOptType.TOPT, rawLasterGain, rawScanGain); + TCurveCache = A8kScanCurveFactory.createScanCurve1200Point(result); + return TCurveCache; + } + + synchronized public A8kScanCurve getTCurveCache() { + return TCurveCache; + } + + + A8kScanCurve optScanCurve = null; + + public A8kOptPeakInfo doOptScan(Integer projId, Integer subProjIndex) throws AppException { + ProjBuildInInfo projBuildinInfo = projInfoMgrService.getProjBuildInInfo(projId); + var result = optScanModuleLowerCtrlService.optScan(projBuildinInfo, subProjIndex); + optScanCurve = A8kScanCurveFactory.createScanCurve1200Point(result.rawData.rawData); + return result.analysResult; + } + + synchronized public A8kScanCurve getOptScanCurve() { + return optScanCurve; + } + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础"); + page.addFunction("推板到光学模组", this::pushOnePlateToOptModule); + page.addFunction("丢板", this::dropPlate); + + page.newGroup("F光学"); + page.addFunction("设置扫描偏移", this::setFOptScanShift) + .setParamVal("shift", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptScanShift, Integer.class)); + page.addFunction("设置发射强度[1->255]()", this::setFOptEmissionIntensity) + .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptEmissionIntensity, Integer.class)); + page.addFunction("设置接收放大倍数[1.1->47]", this::setFOptScanAmplVal) + .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.FOptScanGainVal, Double.class)); + page.addFunction("扫描", this::FOptScan); + page.addFunction("查看波形", this::getFCurveCache); + + page.newGroup("T光学"); + page.addFunction("设置扫描偏移", this::setTOptScanShift) + .setParamVal("shift", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.TOptScanShift, Integer.class)); + page.addFunction("设置发射强度[1->255]", this::setTOptEmissionIntensity) + .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.TOptEmissionIntensity, Integer.class)); + page.addFunction("设置接收放大倍数[0.5->21.7]", this::setTOptScanAmplVal) + .setParamVal("val", () -> optModuleExtParamsMgr.getParam(OptModuleExtParam.TOptScanGainVal, Double.class)); + page.addFunction("扫描", this::TOptScan); + page.addFunction("查看波形", this::getTCurveCache); + + page.newGroup("光学扫描"); + page.addFunction("光学扫描", this::doOptScan).setParamVal("projId", () -> 1).setParamVal("subProjIndex", () -> 0); + page.addFunction("查看光学扫描波形", this::getOptScanCurve); + + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java b/src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java new file mode 100644 index 0000000..d0927e5 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java @@ -0,0 +1,113 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.iflytophald.driver.CodeScanerDriver; +import a8k.app.service.lowerctrl.HbotMoveExCtrlService; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import static a8k.OS.threadSleep; + +@Component +@Slf4j +@RequiredArgsConstructor +public class HbotCodeScanPosVerificationPage { + private final ExtApiPageMgr extApiPageMgr; + private final HbotMoveExCtrlService hbotMoveExCtrlService; + private final CodeScanerDriver codeScanerDriver; + + // + // 基础操作 + // + + public void moveToPBScanPos(ConsumableGroup group) throws AppException { + hbotMoveExCtrlService.moveToPBCodeScanPos(group); + } + + public void moveToLittleBSCodeScanPos(ConsumableGroup group) throws AppException { + hbotMoveExCtrlService.moveToLittleBSCodeScanPos(group); + } + + public void moveToLargeBSCodeScanPos(ConsumableGroup group) throws AppException { + hbotMoveExCtrlService.moveToLargeBSCodeScanPos(group); + } + + public void startCodeScan() throws AppException { + codeScanerDriver.pipetteModCodeScannerStartScan(); + } + + public void stopCodeScan() throws AppException { + codeScanerDriver.pipetteModCodeScannerStopScan(); + } + + public void batchCodeScan(Integer times, Integer overtime) throws AppException { + if(overtime < 0){ + overtime = 0; + } + + log.info("batchCodeScan times:{} overtime:{}", times, overtime); + + for (int i = 0; i < times; i++) { + log.info("batchCodeScan times:{}", i); + hbotMoveExCtrlService.moveQuickToZero(); + + for(var cg: ConsumableGroup.values()){ + moveToPBScanPos(cg); + threadSleep(overtime); + String result = codeScanerDriver.pipetteModCodeScannerScanCode(); + if(result == null || result.isEmpty()){ + log.info("cg {} 扫码失败", cg); + } + log.info("cg {} 扫码结果:{}", cg, result); + } + } + } + + public void codeScan(ConsumableGroup cg, Integer overtime) throws AppException + { + moveToPBScanPos(cg); + threadSleep(overtime); + String result = codeScanerDriver.pipetteModCodeScannerScanCode(); + if(result == null || result.isEmpty()){ + log.info("cg {} 扫码失败", cg); + } + log.info("cg {} 扫码结果:{}", cg, result); + } + + public void batchCodeScanWithCheck(ConsumableGroup cg, Integer times, Integer overtime) throws AppException { + if(overtime < 0){ + overtime = 0; + } + + log.info("batchCodeScanWithCheck times:{} overtime:{}", times, overtime); + + for (int i = 0; i < times; i++) { + log.info("batchCodeScanWithCheck times:{}", i); + hbotMoveExCtrlService.moveQuickToZero(); + codeScan(cg, overtime); + } + } + + + @PostConstruct + void init() { + ExtUIPageCfg cfg = extApiPageMgr.newPage(this); + cfg.newGroup("位置移动"); + cfg.addFunction("移动到PB扫码位置", this::moveToPBScanPos); + cfg.addFunction("移动到小瓶扫码位置", this::moveToLittleBSCodeScanPos); + cfg.addFunction("移动到大瓶扫码位置", this::moveToLargeBSCodeScanPos); + cfg.addFunction("扫码", this::startCodeScan); + cfg.addFunction("停止扫码", this::stopCodeScan); + + cfg.newGroup("扫码测试"); + cfg.addFunction("批量扫码(One)", this::batchCodeScanWithCheck); + cfg.addFunction("批量扫码", this::batchCodeScan); + + extApiPageMgr.addPage(cfg); + } +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java b/src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java new file mode 100644 index 0000000..bb9d7c5 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java @@ -0,0 +1,78 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.type.exception.AppException; +import a8k.app.dao.type.db.ProjExtInfoCard; +import a8k.app.iflytophald.type.protocol.A8kEcode; +import a8k.app.i18n.Internationalization; +import a8k.app.service.data.ProjIdCardInfoMgrService; +import a8k.app.service.mainctrl.AppDeviceInitCtrlService; +import a8k.app.service.background.ProjIDCardCtrlAndMonitorService; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import com.fasterxml.jackson.annotation.JsonInclude; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +@Slf4j +public class P10ProjejIDCardTestPage { + @Resource + ExtApiPageMgr extApiPageMgr; + @Resource + AppDeviceInitCtrlService appDeviceInitCtrlService; + + @Resource + ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService; + + @Resource + ProjIdCardInfoMgrService projIdCardInfoMgrService; + + // + // 基础操作 + // + + + public ProjExtInfoCard readMountProjIDCard() throws AppException { + var val = projIDCardCtrlAndMonitorService.getMountedIdCardInfo(); + if (val == null) { + throw new AppException(A8kEcode.APPE_A8K_ID_CARD_NOT_MOUNTED); + } + return val; + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class A8kIDCardVerifyResult { + public List errorList; + public String state; + } + + public A8kIDCardVerifyResult verifyMountProjIDCard() throws AppException { + var erroList = projIdCardInfoMgrService.verifyProjExtInfoCard(projIDCardCtrlAndMonitorService.getMountedIdCardInfo()); + var result = new A8kIDCardVerifyResult(); + if (!erroList.isEmpty()) { + result.errorList = new ArrayList<>(); + for (var e : erroList) { + result.errorList.add(Internationalization.A8kEcode2String(e)); + } + result.state = "校验失败"; + } else { + result.state = "校验成功"; + } + return result; + } + + @PostConstruct + void init() { + ExtUIPageCfg cfg = extApiPageMgr.newPage(this); + cfg.addFunction("读取挂载ID卡信息", this::readMountProjIDCard); + cfg.addFunction("校验挂载ID卡信息", this::verifyMountProjIDCard); + extApiPageMgr.addPage(cfg); + } + + +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java b/src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java new file mode 100644 index 0000000..b4cfaaa --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java @@ -0,0 +1,136 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.type.exception.AppException; +import a8k.app.service.lowerctrl.*; +import a8k.app.type.misc.TubeHolderScanResult; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class P30InfeedAndPreProcessPosVerificationPage { + + @Resource + TubeFeedingCtrlService tubeFeedingCtrlService; + + @Resource + TubePreProcessModuleExCtrlService tubePreProcessModuleExCtrlService; + + public void enterTubeHolder() throws AppException { + tubeFeedingCtrlService.enterTubeHolder(); + } + + //移动到试管架存在检测位置 + public String moveAndJudgeTubeExist(Integer tubeIndex) throws AppException { + boolean exit = tubeFeedingCtrlService.moveAndjudgeTubeExist(tubeIndex - 1); + return exit ? "存在" : "不存在"; + } + + public String moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { + boolean altit = tubeFeedingCtrlService.moveAndJudgeTubeAltit(tubeIndex - 1); + return altit ? "高" : "低"; + } + + public String moveToTubeScanPosAndScan(Integer tubeIndex) throws AppException { + return tubeFeedingCtrlService.moveToTubeScanPosAndScan(tubeIndex - 1); + } + + public String moveToTubeRackScanPosAndScan() throws AppException { + return tubeFeedingCtrlService.moveToTubeRackScanPosAndScan(); + } + + + /** + * 扫描管架 + * @return 管架扫描结果 + * @throws AppException ae + */ + public TubeHolderScanResult scanTubeHolder() throws AppException { + TubeHolderScanResult result = tubeFeedingCtrlService.enterAndScanTubeholder(); + tubeFeedingCtrlService.ejectTubeHolder(); + return result; + } + + /** + * 从管架中取出管子 + * @throws AppException ae + */ + public void ejectTubeFromTubeHolder() throws AppException { + tubeFeedingCtrlService.ejectTubeHolder(); + } + + /** + * 将管子移动到扫描位置 + * @param tubeIndex 管子编号 + * @throws AppException ae + */ + public void moveTubeToPreProcessPos(Integer tubeIndex) throws AppException { + tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex - 1); + } + + /** + * 预处理试管 + * @param isHTube 是否是H管 + * @throws AppException ae + */ + public void preProcessTube(Boolean isHTube) throws AppException { + tubePreProcessModuleExCtrlService.takeTubeFromTubeholderToShakePos(isHTube); + tubePreProcessModuleExCtrlService.shakeTube(45, 5); + tubePreProcessModuleExCtrlService.takeTubeCap(); + tubePreProcessModuleExCtrlService.putbakTubeCapAndPutbakTubeToTubeHolder(); + } + + //取试管到预处理位 + public void takeTubeFromTubeholderToShakePos(Integer tubeIndex,Boolean isHTube) throws AppException { + if (!tubePreProcessModuleExCtrlService.isModuleInIdleProgress()) { + throw AppException.ofAECodeError("有试管正在处理中"); + } + + tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex); + tubePreProcessModuleExCtrlService.takeTubeFromTubeholderToShakePos(isHTube); + tubePreProcessModuleExCtrlService.shakeTube(45, 5); + tubePreProcessModuleExCtrlService.takeTubeCap(); + + } + + //放试管盖和试管回试管架 + public void putTubeBackToTubeHolder() throws AppException { + tubePreProcessModuleExCtrlService.resetModule(); + } + + public void shakeTube(Integer angle, Integer times) throws AppException { + tubePreProcessModuleExCtrlService.shakeTube(angle, times); + } + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("入料操作"); + page.addFunction("入料", this::enterTubeHolder); + page.addFunction("移动到[试管]扫描位置,并扫描", this::moveToTubeScanPosAndScan).setParamVal("tubeIndex",()-> 1); + page.addFunction("移动到[试管]存在检测位置,并判断", this::moveAndJudgeTubeExist).setParamVal("tubeIndex", ()->1); + page.addFunction("移动到[试管]高低检测位置,并判断", this::moveAndJudgeTubeAltit).setParamVal("tubeIndex", ()->1); + page.addFunction("移动到[试管]预处理位置", this::moveTubeToPreProcessPos).setParamVal("tubeIndex",()-> 1); + page.addFunction("移动到[试管架]扫描位置,并扫描", this::moveToTubeRackScanPosAndScan); + page.addFunction("出料", this::ejectTubeFromTubeHolder); + page.newGroup("入料操作-脚本"); + page.addFunction("入料,并扫描试管架和试管,出料", this::scanTubeHolder); + + page.newGroup("预处理校准.单步"); + page.addFunction("摇匀试管", this::shakeTube).setParamVal("angle", ()->45).setParamVal("times", ()->5); + page.newGroup("预处理校准.脚本"); + page.addFunction("取试管到预处理位", this::takeTubeFromTubeholderToShakePos); + page.addFunction("放试管回试管架", this::putTubeBackToTubeHolder); + + + + extApiPageMgr.addPage(page); + + + } +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java b/src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java new file mode 100644 index 0000000..11cd68c --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java @@ -0,0 +1,128 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.pos.IncubatorPos; +import a8k.app.type.exception.AppException; +import a8k.app.iflytophald.driver.MiniServoDriver; +import a8k.app.iflytophald.driver.StepMotorCtrlDriver; +import a8k.app.service.lowerctrl.*; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class P31ReactionPlatesTransmitPosVerificationPage { + + @Resource + TubeFeedingCtrlService tubeFeedingCtrlService; + + @Resource + TubePreProcessModuleExCtrlService tubePreProcessModuleExCtrlService; + + @Resource + MiniServoDriver miniServoDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + TurntableMoveCtrlService turntableMoveCtrlService; + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; + @Resource + HbotMoveCtrlService hbotMoveCtrlService; + + @Resource + HbotMoveExCtrlService hbotMoveExCtrlService; + + + + + //孵育盘单步 + + //光学模组单步 + + + public void pushPlateQuick(ConsumableGroup group,IncubatorPos index) throws AppException { + plateBoxCtrlService.pushPlateQuick(group, index); + } + + public void pullPlate(IncubatorPos index) throws AppException { + optScanModuleLowerCtrlService.pullPlate(index); + } + + public void dropPlate() throws AppException { + optScanModuleLowerCtrlService.dropPlate(); + } + + public void turntableMoveToDropLiquidPos(IncubatorPos index) throws AppException { + turntableMoveCtrlService.trunableMoveToDropLiquidPos(index); + } + + public void turntableMoveToPullPos(IncubatorPos index) throws AppException { + turntableMoveCtrlService.trunableMoveToPullPos(index); + } + + public void turntableMoveToPushPos(IncubatorPos index) throws AppException { + turntableMoveCtrlService.trunableMoveToPushPos(index); + } + + + public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { + plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); + optScanModuleLowerCtrlService.pullPlate(incubatorPos); + optScanModuleLowerCtrlService.dropPlate(); + } + + public void pushAllAndRemoveAll() throws AppException { + pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE01); + } + + + + public void pushAllIncubator(ConsumableGroup PBCh) throws AppException { + for (var space : IncubatorPos.values()) { + plateBoxCtrlService.pushPlateQuick(PBCh, space); + } + } + + public void removeAllIncubator() throws AppException { + for (var space : IncubatorPos.values()) { + optScanModuleLowerCtrlService.pullPlate(space); + optScanModuleLowerCtrlService.dropPlate(); + } + } + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("单步测试"); + page.addFunction("推入", this::pushPlateQuick); + page.addFunction("拉出", this::pullPlate); + page.addFunction("丢弃", this::dropPlate); + page.addFunction("转盘-移动到滴液位置", this::turntableMoveToDropLiquidPos); + page.addFunction("转盘-移动到拉出位置", this::turntableMoveToPullPos); + page.addFunction("转盘-移动到推入位置", this::turntableMoveToPushPos); + + page.newGroup("反应板夹仓-脚本测试"); + page.addFunction("推入&&推出(One)", this::pushOneAndRemove); + page.addFunction("推入&&推出(All 测试<板夹仓>坐标)", this::pushAllAndRemoveAll); + + page.addFunction("推入孵育盘板夹(All)", this::pushAllIncubator); + page.addFunction("推出孵育盘板夹(All)", this::removeAllIncubator); + + extApiPageMgr.addPage(page); + } + + +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java b/src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java new file mode 100644 index 0000000..a197d7e --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java @@ -0,0 +1,112 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.service.ctrlmodule.TipOperationCtrlModule; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.pos.TipGroupPos; +import a8k.app.type.exception.AppException; +import a8k.app.service.lowerctrl.*; +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 +@Slf4j +@RequiredArgsConstructor +public class P32HbotPosVerificationPage { + private final HbotMoveExCtrlService hbotMoveExCtrlService; + private final TipOperationCtrlModule tipOperationCtrlModule; + + + public void takeTip(TipGroupPos tipGroupPos, Integer index) throws AppException { + tipOperationCtrlModule.testDoTakeTipAction(tipGroupPos, index); + } + + public void moveToTakeTipObservationPos(TipGroupPos tipGroupPos, Integer index, Integer zpos) throws AppException { + hbotMoveExCtrlService.moveToTakeTipObservationPos(tipGroupPos, index, zpos); + } + + public void takeAndDropTip(TipGroupPos tipGroupPos, Integer index) throws AppException { + try { + tipOperationCtrlModule.testTakeTip(tipGroupPos, index); + } catch (AppException e) { + hbotMoveExCtrlService.initializePipette(); + hbotMoveExCtrlService.zAxisMoveToZeroPointBlock(); + throw e; + } + } + public void putBakTip(TipGroupPos tipGroupPos, Integer index) throws AppException { + try { + tipOperationCtrlModule.testPutBakTip(tipGroupPos, index); + } catch (AppException e) { + hbotMoveExCtrlService.initializePipette(); + hbotMoveExCtrlService.zAxisMoveToZeroPointBlock(); + throw e; + } + } + + + public void dropTip() throws AppException { + tipOperationCtrlModule.dropTip(); + } + + + public void moveToDropLiquidPos() throws AppException { + hbotMoveExCtrlService.moveToDropLiquidPos(); + } + + + public void moveToLittleBufferPircePos(ConsumableGroup group, Integer off) throws AppException { + hbotMoveExCtrlService.moveToLittleBufferPiercePos(group, off); + } + + public void moveToLittleBufferSamplePos(ConsumableGroup group, Integer off) throws AppException { + hbotMoveExCtrlService.moveToLittleBufferContainerPos(group, off); + } + + public void moveToProbeSubstanceSamplePos(ConsumableGroup group, Integer off) throws AppException { + hbotMoveExCtrlService.moveToProbeSubstanceContainerPos(group, off); + } + + public void moveToProbeSubstancePiercePos(ConsumableGroup group, Integer off) throws AppException { + hbotMoveExCtrlService.moveToProbeSubstancePiercePos(group, off); + } + + public void moveToLargeBufferPos(ConsumableGroup group) throws AppException { + hbotMoveExCtrlService.moveToLargeBSContainerPos(group); + } + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("TIP"); + page.addFunction("取Tip", this::takeTip); + page.addFunction("放回Tip", this::putBakTip); + page.addFunction("取Tip并放回", this::takeAndDropTip); + page.addFunction("移动到取Tip观察位", this::moveToTakeTipObservationPos); + page.addFunction("丢Tip", this::dropTip); + page.addFunction("移动滴液位", this::moveToDropLiquidPos); + + page.newGroup("小瓶缓冲液"); + page.addFunction("移动到小瓶缓冲液穿刺位", this::moveToLittleBufferPircePos); + page.addFunction("移动到小瓶缓冲液采样位", this::moveToLittleBufferSamplePos); + + page.newGroup("探测物质"); + page.addFunction("移动到探测物质穿刺位", this::moveToProbeSubstancePiercePos); + page.addFunction("移动到探测物质采样位", this::moveToProbeSubstanceSamplePos); + + page.newGroup("大瓶缓冲液"); + page.addFunction("移动到大瓶缓冲液容器位置", this::moveToLargeBufferPos); + + extApiPageMgr.addPage(page); + } + + +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java b/src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java new file mode 100644 index 0000000..562dd58 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java @@ -0,0 +1,34 @@ +package a8k.extui.page.factory.verification; + + + +import a8k.app.type.exception.AppException; +import a8k.app.service.lowerctrl.HbotMoveExCtrlService; +import a8k.app.type.param.type.A8kSamplePos; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class P33HbotSamplePosVerificationPage { + @Resource + HbotMoveExCtrlService hbotMoveExCtrlService; + + public void moveToSamplePos(A8kSamplePos a8kSamplePos) throws AppException { + hbotMoveExCtrlService.moveToSampleContainerPos(a8kSamplePos); + } + + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("移动到样本位置", this::moveToSamplePos); + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java b/src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java new file mode 100644 index 0000000..57ae3b5 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java @@ -0,0 +1,135 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.service.lowerctrl.TurntableMoveCtrlService; +import a8k.app.service.ctrlmodule.TipOperationCtrlModule; +import a8k.app.type.a8k.*; +import a8k.app.type.a8k.pos.IncubatorPos; +import a8k.app.type.a8k.pos.LargeBufferPos; +import a8k.app.type.a8k.pos.PreReactionPos; +import a8k.app.type.exception.AppException; +import a8k.app.type.param.type.A8kSamplePos; +import a8k.app.service.lowerctrl.LiquidOperationCtrService; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class P34LiquidOperationTestPage { + + @Resource + LiquidOperationCtrService liquidOperationCtrService; + @Resource + TurntableMoveCtrlService turntableMoveCtrlService; + @Resource + TipOperationCtrlModule tipOperationCtrlModule; + @Resource + ExtApiPageMgr extApiPageMgr; + + Boolean autoDropTip = true; // 是否自动丢弃Tip + + // + // 液体操作 + // + public void takeTip() throws AppException { + tipOperationCtrlModule.tryTakeTip(); + } + + public void dropTip() throws AppException { + tipOperationCtrlModule.dropTip(); + } + + synchronized public void setAutoDropTip(Boolean autoDropTip) { + this.autoDropTip = autoDropTip; + } + + public void takeLargeBottleBufferLiquidToProbeSubstance(LargeBufferPos from, ConsumableGroup group, Integer index, Integer ul) throws AppException { + tryDropTip(); + PreReactionPos topos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, group, index); + liquidOperationCtrService.takeLargeBottleBufferLiquidToProbeSubstance(from, topos, ul); + } + + + public void pierceLittleBuffer(ConsumableGroup toGroup, Integer toIndex) throws AppException { + PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.BufferSolution, toGroup, toIndex); + liquidOperationCtrService.pierceThrough(pos); + } + + public void pierceProbeSubstance(ConsumableGroup toGroup, Integer toIndex) throws AppException { + PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, toGroup, toIndex); + liquidOperationCtrService.pierceThrough(pos); + } + + + public void dropLiquidToReactionPlate(IncubatorPos pos) throws AppException { + turntableMoveCtrlService.trunableMoveToDropLiquidPos(pos); + liquidOperationCtrService.dropLiquidToReactionPlate(true); + } + + public void takeSample(A8kSamplePos from, Integer ul) throws AppException { + tryDropTip(); + liquidOperationCtrService.takeSample(from, ul); + } + + public void dropSampleToProbeSubstance(ConsumableGroup toGroup, Integer toIndex) throws AppException { + PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, toGroup, toIndex); + liquidOperationCtrService.distributeSampleToPreReactionPos(pos, true, true); + } + + public void aspiratePreReactionLiquidFromProbeSubstance(ConsumableGroup fromGroup, Integer fromIndex) throws AppException { + PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, fromGroup, fromIndex); + liquidOperationCtrService.takePreReactionLiquid(pos, true); + } + + public void dropSampleToSmallBufferPos(ConsumableGroup toGroup, Integer toIndex) throws AppException { + PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, toGroup, toIndex); + liquidOperationCtrService.distributeSampleToPreReactionPos(pos, true, true); + } + + public void aspiratePreReactionLiquidFromSmallBufferPos(ConsumableGroup fromGroup, Integer fromIndex) throws AppException { + PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, fromGroup, fromIndex); + liquidOperationCtrService.takePreReactionLiquid(pos, true); + } + + public void tryDropTip() { + if (autoDropTip) { + try { + if (tipOperationCtrlModule.isHasTipInGun()) + tipOperationCtrlModule.dropTip(); + } catch (AppException e) { + log.error("自动丢弃Tip失败", e); + } + + } + } + + + @PostConstruct + void init() { + ExtUIPageCfg cfg = extApiPageMgr.newPage(this); + cfg.newGroup("液体操作-通用"); + cfg.addFunction("取Tip", this::takeTip); + cfg.addFunction("丢Tip", this::dropTip); + cfg.addFunction("设置自动丢弃Tip", this::setAutoDropTip) + .setParamVal("autoDropTip", () -> autoDropTip); + cfg.newGroup("液体操作-大瓶缓冲液/探测物质"); + cfg.addFunction("刺破", this::pierceProbeSubstance); + cfg.addFunction("取大瓶缓冲液到探测物质位置", this::takeLargeBottleBufferLiquidToProbeSubstance); + cfg.addFunction("取样品", this::takeSample); + cfg.addFunction("放样品", this::dropSampleToProbeSubstance); + cfg.addFunction("取混合液", this::aspiratePreReactionLiquidFromProbeSubstance); + cfg.addFunction("滴入反应板", this::dropLiquidToReactionPlate); + cfg.newGroup("液体操作-小瓶缓冲液"); + cfg.addFunction("刺破", this::pierceLittleBuffer); + cfg.addFunction("取样品", this::takeSample); + cfg.addFunction("放样品", this::dropSampleToSmallBufferPos); + cfg.addFunction("取混合液", this::aspiratePreReactionLiquidFromSmallBufferPos); + cfg.addFunction("滴入反应板", this::dropLiquidToReactionPlate); + extApiPageMgr.addPage(cfg); + } + + +} diff --git a/src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java b/src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java new file mode 100644 index 0000000..d7e9373 --- /dev/null +++ b/src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java @@ -0,0 +1,185 @@ +package a8k.extui.page.factory.verification; + +import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; +import a8k.app.service.ctrlmodule.TipOperationCtrlModule; +import a8k.app.type.a8k.A8kTubeHolderType; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.pos.IncubatorPos; +import a8k.app.type.a8k.pos.TipGroupPos; +import a8k.app.type.exception.AppException; +import a8k.app.constant.AppConstant; +import a8k.app.service.lowerctrl.TubeFeedingCtrlService; +import a8k.app.service.lowerctrl.TubePreProcessModuleExCtrlService; +import a8k.app.service.lowerctrl.*; +import a8k.app.type.misc.TubeHolderScanResult; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + + +@Component +public class P50VerificationScriptPage { + + @Resource + TubeFeedingCtrlService tubeFeedingCtrlService; + + @Resource + TubePreProcessModuleExCtrlService tubePreProcessModuleExCtrlService; + + TubeHolderScanResult tubeHolderScanResult; + + + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; + + + @Resource + PipetteCtrlDriverV2 pipetteCtrlDriver; + + + @Resource + HbotMoveExCtrlService hbotMoveExCtrlService; + + @Resource + TipOperationCtrlModule tipOperationCtrlModule; + + public void verifyTubePreProcess(A8kTubeHolderType expectTubeHolderType, Boolean expectTubeAltitude) throws AppException { + tubeFeedingCtrlService.enterTubeHolder(); + + tubeHolderScanResult = tubeFeedingCtrlService.enterAndScanTubeholder(); + if (tubeHolderScanResult == null) { + tubeFeedingCtrlService.ejectTubeHolder(); + throw AppException.ofAECodeError("扫描试管架失败"); + } + + A8kTubeHolderType scanTubeHolderType = A8kTubeHolderType.of(tubeHolderScanResult.tubeHolderType); + assert scanTubeHolderType != null; + if (!scanTubeHolderType.equals(expectTubeHolderType)) { + tubeFeedingCtrlService.ejectTubeHolder(); + throw AppException.ofAECodeError("扫描到的试管架类型与预期不符"); + } + if (!scanTubeHolderType.equals(A8kTubeHolderType.BloodTube)) { + tubeFeedingCtrlService.ejectTubeHolder(); + return; + } + + for (int i = 0; i < 10; i++) { + if (!tubeHolderScanResult.tube[i].isTubeExist) { + continue; + } + + if (tubeHolderScanResult.tube[i].isHighTube != expectTubeAltitude) { + tubeFeedingCtrlService.ejectTubeHolder(); + throw AppException.ofAECodeError("扫描到的试管高低与预期不符"); + } + } + + + //脱帽盖帽摇匀 + for (int i = 0; i < 10; i++) { + if (!tubeHolderScanResult.tube[i].isTubeExist) { + continue; + } + tubeFeedingCtrlService.moveTubeToPreProcessPos(i); + tubePreProcessModuleExCtrlService.takeTubeFromTubeholderToShakePos(tubeHolderScanResult.tube[i].isHighTube); + tubePreProcessModuleExCtrlService.shakeTube(45, 5); + tubePreProcessModuleExCtrlService.takeTubeCap(); + tubePreProcessModuleExCtrlService.putbakTubeCapAndPutbakTubeToTubeHolder(); + } + + } + + private void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { + plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); + optScanModuleLowerCtrlService.pullPlate(incubatorPos); + optScanModuleLowerCtrlService.dropPlate(); + } + + public void verifyPlateTransmit() throws AppException { + pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE02); + pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE03); + pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE04); + pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE05); + pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE06); + + pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE07); + pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE08); + pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE09); + pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE10); + pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE11); + pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE12); + + pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE13); + pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE14); + pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE15); + pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE16); + pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE17); + pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE18); + + pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE19); + pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE20); + } + + public void verifyTakeTip(TipGroupPos tipGroupPos) throws AppException { + pipetteCtrlDriver.zMotorMoveZeroBlock(); + for (int i = 0; i < AppConstant.TIP_NUM; i++) { + tipOperationCtrlModule.testTakeTip(tipGroupPos, i); + // if (checkStopFlag()) + // return; + } + } + + public void verifyLittleBSPierceAndSamplePos(ConsumableGroup group) throws AppException { + for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { + hbotMoveExCtrlService.moveToLittleBufferPiercePos(group, i); + hbotMoveExCtrlService.moveToLittleBufferContainerPos(group, i); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + // if (checkStopFlag()) + // break; + } + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + } + + public void verifyProbeSubstancePierceAndSamplePos(ConsumableGroup group) throws AppException { + for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { + hbotMoveExCtrlService.moveToProbeSubstanceContainerPos(group, i); + hbotMoveExCtrlService.moveToProbeSubstancePiercePos(group, i); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + // if (checkStopFlag()) + // break; + } + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + } + + public void verifyLargeBSSamplePos() throws AppException { + pipetteCtrlDriver.zMotorMoveZeroBlock(); + for (ConsumableGroup group : ConsumableGroup.values()) { + hbotMoveExCtrlService.moveToLargeBSContainerPos(group); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + // if (checkStopFlag()) + // break; + } + } + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.addFunction("验证试管预处理", this::verifyTubePreProcess); + page.addFunction("验证反应板传输", this::verifyPlateTransmit); + page.addFunction("验证取Tip", this::verifyTakeTip); + page.addFunction("验证小瓶缓冲液穿刺和取样位置", this::verifyLittleBSPierceAndSamplePos); + page.addFunction("验证探测物质穿刺和取样位置", this::verifyProbeSubstancePierceAndSamplePos); + page.addFunction("验证大瓶缓冲液取样位置", this::verifyLargeBSSamplePos); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java b/src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java deleted file mode 100644 index 883b947..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java +++ /dev/null @@ -1,34 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.service.data.SubModuleConfigService; -import a8k.app.service.data.SubModuleRegInitialValueMgrService; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class A8kSubModuleRegAndConfigInitPage { - - private final ExtApiPageMgr extApiPageMgr; - private final SubModuleConfigService subModuleConfigService; - private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; - - - public void syncToMirco() throws AppException { - subModuleConfigService.syncToMirco(); - subModuleRegInitialValueMgrService.syncToMirco(); - } - - @PostConstruct - void init() { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.addFunction("initSubBoard", this::syncToMirco); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java deleted file mode 100644 index 6e55bc4..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java +++ /dev/null @@ -1,99 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.HbotDriver; -import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import cn.hutool.core.text.StrBuilder; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class HBotHardwareTestPage { - - - private final ExtApiPageMgr extApiPageMgr; - private final HbotDriver hbotDriver; - private final PipetteCtrlDriverV2 pipetteCtrlDriver; - - public void disableHbot() throws AppException { - hbotDriver.enable(0); - } - - public void enableHbot() throws AppException { - hbotDriver.enable(1); - } - - public void leftMotorMoveClockwise(Integer step) throws AppException { - hbotDriver.enable(1); - hbotDriver.moveByDirectBlock(-step, 0); - } - - public void leftMotorMoveCounterClockwise(Integer step) throws AppException { - hbotDriver.enable(1); - hbotDriver.moveByDirectBlock(step, 0); - } - - public void rightMotorMoveClockwise(Integer step) throws AppException { - hbotDriver.enable(1); - hbotDriver.moveByDirectBlock(0, -step); - } - - public void rightMotorMoveCounterClockwise(Integer step) throws AppException { - hbotDriver.enable(1); - hbotDriver.moveByDirectBlock(0, step); - } - - - public String checkMotorEncoder(Integer step) throws AppException { - hbotDriver.enable(1); - Integer[] encPos = hbotDriver.readEncDirect(); - hbotDriver.moveByDirectBlock(step, step); - Integer[] afterRunEncPos = hbotDriver.readEncDirect(); - - StrBuilder report = new StrBuilder(); - report.append(String.format("左电机: 实际运行:%d 编码器:%d", step, afterRunEncPos[0] - encPos[0])); - report.append(String.format("右电机: 实际运行:%d 编码器:%d", step, afterRunEncPos[1] - encPos[1])); - return report.toString(); - } - - @ExtApiStatu(name = "", group = "左光电状态", order = 1) - public Boolean getLeftPpsState() { - try { - return hbotDriver.readInIO(0); - } catch (AppException e) { - return false; - } - } - - @ExtApiStatu(name = "", group = "右光电状态", order = 2) - public Boolean getRightPpsState() { - try { - return hbotDriver.readInIO(1); - } catch (AppException e) { - return false; - } - } - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - page.newGroup("基础"); - page.addFunction("使能", this::enableHbot); - page.addFunction("失能", this::disableHbot); - page.newGroup("电机测试"); - page.addFunction("左电机顺时针移动(900约等于1/8圈)", this::leftMotorMoveClockwise).setParamVal("step", () -> 900); - page.addFunction("左电机逆时针移动", this::leftMotorMoveCounterClockwise).setParamVal("step", () -> 900); - page.addFunction("右电机顺时针移动", this::rightMotorMoveClockwise).setParamVal("step", () -> 900); - page.addFunction("右电机逆时针移动", this::rightMotorMoveCounterClockwise).setParamVal("step", () -> 900); - page.newGroup("编码器测试"); - page.addFunction("检查电机编码器", this::checkMotorEncoder).setParamVal("step", () -> 100); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java deleted file mode 100644 index a4da0a2..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java +++ /dev/null @@ -1,36 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.dao.type.db.ProjExtInfoCard; -import a8k.app.service.background.ProjIDCardCtrlAndMonitorService; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class ICCardReaderTestPage { - private final ExtApiPageMgr extApiPageMgr; - private final ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService; - - public void xxxx() { - - } - - public ProjExtInfoCard readProjExtInfoCard() { - return projIDCardCtrlAndMonitorService.getMountedIdCardInfo(); - } - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("插入卡和拔卡都会正常情况都会弹窗", this::xxxx); - page.addFunction("读取当前挂载卡的内容", this::readProjExtInfoCard); - 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 deleted file mode 100644 index f3948d8..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java +++ /dev/null @@ -1,58 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.type.exception.AppException; -import a8k.app.iflytophald.driver.InputDetectDriver; -import a8k.app.iflytophald.type.protocol.InputIOId; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class InputIOStateHardwareTestPage { - - - final private ExtApiPageMgr extApiPageMgr; - final private InputDetectDriver inputDetectDriver; - - @ExtApiStatu(name = "入料平移通道-试管高低检测IO", order = 1) - public Boolean getTubeHeightPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeHeightPPS);} - - @ExtApiStatu(name = "入料平移通道-试管有无光电", order = 2) - public Boolean getTubeExistPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeExistPPS);} - - @ExtApiStatu(name = "入料平移通道-外光电", order = 3) - public Boolean getTHChOuterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChOuterPPS);} - - @ExtApiStatu(name = "入料平移通道-内光电", order = 4) - public Boolean getTHChInterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChInterPPS);} - - @ExtApiStatu(name = "入料区有无光电", order = 5) - public Boolean getInfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.InfeedPPS);} - - @ExtApiStatu(name = "出料位有无检测", order = 6) - public Boolean getOutfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.OutfeedPPS);} - - @ExtApiStatu(name = "废料仓满溢检测", order = 7) - public Boolean getRecycleBinOverflowPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinOverflowPPS);} - - @ExtApiStatu(name = "板夹仓-仓门光电(盖:1 不盖:0)", order = 8) - public Boolean getPlateBoxCoverClosurePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS);} - - @ExtApiStatu(name = "板夹仓-卡板光电", order = 9) - public Boolean getPlateBoxPlateStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateInletStuckPPS);} - - @ExtApiStatu(name = "光学模组-卡板光电", order = 10) - public Boolean incubationPlateOutletStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateOutletStuckPPS);} - - @ExtApiStatu(name = "废料仓-到位", order = 15) - public Boolean getRecycleBinInPlacePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinInPlacePPS);} - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/LISUartTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/LISUartTestPage.java deleted file mode 100644 index 5af4775..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/LISUartTestPage.java +++ /dev/null @@ -1,55 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.channel.LisUartCommunicationChannel; -import a8k.app.type.lis.LISSerialBaudrateType; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class LISUartTestPage { - final private LisUartCommunicationChannel lisUartCommunicationChannel; - private final ExtApiPageMgr extApiPageMgr; - - @ExtApiStatu(name = "", group = "波特率", order = 1) - public Integer getBaudRate() { - return lisUartCommunicationChannel.getBaudRateDirect(); - } - - @ExtApiStatu(name = "", group = "回环模式", order = 1) - public Boolean getLoopbackMode() { - return lisUartCommunicationChannel.isInLoopbackMode(); - } - - @ExtApiStatu(name = "", group = "说明", order = 1) - public String getHelp() { - return "回环模式下,电脑连接上232,发送消息给A8k,会自动发送回电脑"; - } - - - public void setBaudRate(LISSerialBaudrateType baudRate) { - lisUartCommunicationChannel.setBaudRate(baudRate.baudrate); - } - - - public void setInLoopbackMode(Boolean val) { - lisUartCommunicationChannel.setInLoopbackMode(val); - } - - public void sendCommand(String msg) { - lisUartCommunicationChannel.tx(msg); - } - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("设置波特率", this::setBaudRate); - page.addFunction("设置环回模式", this::setInLoopbackMode); - page.addFunction("发送命令", this::sendCommand); - extApiPageMgr.addPage(page); - } - -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java deleted file mode 100644 index 6dbd747..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java +++ /dev/null @@ -1,188 +0,0 @@ -package a8k.extui.page.hardwaretest; - - -import a8k.app.iflytophald.driver.MiniServoDriver; -import a8k.app.iflytophald.type.protocol.MiniServoMId; -import a8k.app.service.mainctrl.AppDeviceInitCtrlService; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class MiniServoHardwareTestPage { - - final private MiniServoDriver miniServoDriver; - final private AppDeviceInitCtrlService appDeviceInitCtrlService; - private final ExtApiPageMgr extApiPageMgr; - ExtUIPageCfg pageConfig; - - public void disableAllServos() throws AppException { - appDeviceInitCtrlService.disableAllMiniServo(); - } - - public void enableAllServos() throws AppException { - appDeviceInitCtrlService.enableAllMiniServo(); - } - - public Integer readPos(MiniServoMId id) { - try { - return miniServoDriver.miniServoReadPos(id); - } catch (AppException e) { - log.error("readPos error for {}", id, e); - return 0; - } - } - - public void regBasicFunctions() { - pageConfig.newGroup("基本功能"); - pageConfig.addFunction("使能所有舵机", this::enableAllServos); - pageConfig.addFunction("禁用所有舵机", this::disableAllServos); - } - - // ShakeModTubeScanerRotateSV - public void shakeModTubeScannerRotateSVRotateClockwise() throws AppException { - miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, -300); - } - - public void shakeModTubeScannerRotateSVRotateCounterClockwise() throws AppException { - miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, 300); - } - - public void shakeModTubeScannerRotateSVStop() throws AppException { - miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerRotateSV); - } - - public void registerShakeModTubeScannerRotateSV() { - pageConfig.newGroup("扫码旋转舵机"); - pageConfig.addFunction("顺时针转动", this::shakeModTubeScannerRotateSVRotateClockwise); - pageConfig.addFunction("逆时针转动", this::shakeModTubeScannerRotateSVRotateCounterClockwise); - pageConfig.addFunction("停止转动", this::shakeModTubeScannerRotateSVStop); - } - - // ShakeModTubeScanerClampingSV - public void shakeModTubeScannerClampingSVMoveTo(Integer step) throws AppException { - miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModTubeScanerClampingSV, step); - } - - public Integer shakeModTubeScannerClampingSVReadPos() throws AppException { - return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModTubeScanerClampingSV); - } - - public void shakeModTubeScannerClampingSVStop() throws AppException { - miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerClampingSV); - } - - public void registerShakeModTubeScannerClampingSV() { - pageConfig.newGroup("扫码夹紧舵机"); - pageConfig.addFunction("移动到", this::shakeModTubeScannerClampingSVMoveTo) - .setParamVal("step", () -> readPos(MiniServoMId.ShakeModTubeScanerClampingSV)); - pageConfig.addFunction("读取位置", this::shakeModTubeScannerClampingSVReadPos); - pageConfig.addFunction("停止转动", this::shakeModTubeScannerClampingSVStop); - } - - // ShakeModGripperYSV(MId.ShakeModGripperYSV),// - public void shakeModGripperYSVMoveTo(Integer step) throws AppException { - miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, step); - } - - public Integer shakeModGripperYSVReadPos() throws AppException { - return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); - } - - public void shakeModGripperYSVStop() throws AppException { - miniServoDriver.moduleStop(MiniServoMId.ShakeModGripperYSV); - } - - public void registerShakeModGripperYSV() { - pageConfig.newGroup("摇匀模组-前后移动舵机"); - pageConfig.addFunction("移动到", this::shakeModGripperYSVMoveTo) - .setParamVal("step", () -> readPos(MiniServoMId.ShakeModGripperYSV)); - pageConfig.addFunction("读取位置", this::shakeModGripperYSVReadPos); - pageConfig.addFunction("停止转动", this::shakeModGripperYSVStop); - } - - // ShakeModGripperSV(MId.ShakeModGripperSV),// - public void shakeModGripperSVMoveTo(Integer step) throws AppException { - miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperSV, step); - } - - public Integer shakeModGripperSVReadPos() throws AppException { - return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); - } - - public void shakeModGripperSVStop() throws AppException { - miniServoDriver.moduleStop(MiniServoMId.ShakeModGripperSV); - } - - public void registerShakeModGripperSV() { - pageConfig.newGroup("摇匀模组-夹爪舵机"); - pageConfig.addFunction("移动到", this::shakeModGripperSVMoveTo) - .setParamVal("step", () -> readPos(MiniServoMId.ShakeModGripperSV)); - pageConfig.addFunction("读取位置", this::shakeModGripperSVReadPos); - pageConfig.addFunction("停止转动", this::shakeModGripperSVStop); - } - - // ShakeModLiftingSV(MId.ShakeModLiftingSV),// - public void shakeModLiftingSVMoveTo(Integer step) throws AppException { - miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModLiftingSV, step); - } - - public Integer shakeModLiftingSVReadPos() throws AppException { - return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModLiftingSV); - } - - public void shakeModLiftingSVStop() throws AppException { - miniServoDriver.moduleStop(MiniServoMId.ShakeModLiftingSV); - } - - public void registerShakeModLiftingSV() { - pageConfig.newGroup("摇匀模组-顶升舵机"); - pageConfig.addFunction("移动到", this::shakeModLiftingSVMoveTo) - .setParamVal("step", () -> readPos(MiniServoMId.ShakeModLiftingSV)); - pageConfig.addFunction("读取位置", this::shakeModLiftingSVReadPos); - pageConfig.addFunction("停止转动", this::shakeModLiftingSVStop); - } - - - public Integer gripperSVSetRefPos() throws AppException { - return miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperSV); - } - - public Integer shakeModGripperYSVSetRefPos() throws AppException { - return miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperYSV); - } - - public void shakeModTubeScanerClampingSVSetRefPos() throws AppException { - miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModTubeScanerClampingSV); - } - - //ShakeModLiftingSV - public void shakeModLiftingSVSetRefPos() throws AppException { - miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModLiftingSV); - } - - @PostConstruct - void init() { - pageConfig = extApiPageMgr.newPage(this); - regBasicFunctions(); - registerShakeModTubeScannerRotateSV(); - registerShakeModTubeScannerClampingSV(); - registerShakeModGripperYSV(); - registerShakeModGripperSV(); - registerShakeModLiftingSV(); - - pageConfig.newGroup("参考点设置"); - pageConfig.addFunction("设置<夹爪><参考点>(完全张开的位置)", this::gripperSVSetRefPos); - pageConfig.addFunction("设置<摇匀模组Y轴舵机><参考点>(Y轴最外侧的位置)", this::shakeModGripperYSVSetRefPos); - pageConfig.addFunction("设置<夹紧舵机>参考点(水平位置)", this::shakeModTubeScanerClampingSVSetRefPos); - pageConfig.addFunction("设置<试管升降舵机>参考点(与试管架运行平面刚好水平)", this::shakeModLiftingSVSetRefPos); - - extApiPageMgr.addPage(pageConfig); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MiniServoPosCalibratePage.java b/src/main/java/a8k/extui/page/hardwaretest/MiniServoPosCalibratePage.java deleted file mode 100644 index 609bbb9..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/MiniServoPosCalibratePage.java +++ /dev/null @@ -1,119 +0,0 @@ -package a8k.extui.page.hardwaretest; - - -import a8k.app.service.lowerctrl.TubeFeedingExCtrlService; -import a8k.app.service.lowerctrl.TubePreProcessModuleCtrlService; -import a8k.app.service.param.pos.TubePreProcesPosParamMgr; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.app.iflytophald.driver.MiniServoDriver; -import a8k.app.iflytophald.type.protocol.MiniServoMId; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class MiniServoPosCalibratePage { - - - private final MiniServoDriver miniServoDriver; - private final TubePreProcessModuleCtrlService tubePreProcessModuleCtrlService; - private final TubePreProcesPosParamMgr tubePreProcesPosParamMgr; - private final TubeFeedingExCtrlService tubeFeedingExCtrlService; - - - public void disableMotor() throws AppException { - miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 0); - miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 0); - miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 0); - } - - - public void enableMotor() throws AppException { - miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 1); - miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 1); - miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 1); - } - - public void gripperSVOpen() throws AppException { - tubePreProcessModuleCtrlService.gripperSVOpen(); - } - - - public void gripperSVClampTube() throws AppException { - tubePreProcessModuleCtrlService.gripperSVClampTube(); - } - - // - // ShakeModGripperYSV - // - - - public void YSVMoveToTakeTubePos() throws AppException { - tubePreProcessModuleCtrlService.YSVMoveToTakeTubePos(); - } - - public void YSVMoveToShakePos() throws AppException { - tubePreProcessModuleCtrlService.YSVMoveToShakePos(); - } - - public void YSVMoveToStandbyPos() throws AppException { - tubePreProcessModuleCtrlService.YSVMoveToStandbyPos(); - } - - - //ShakeModTubeScanerClampingSV - - public void tubeScanClampMoveToZeroBlock() throws AppException { - tubeFeedingExCtrlService.scanClampModRelease(); - } - - public void tubeScanClampMoveToWorkBlock() throws AppException { - tubeFeedingExCtrlService.scanClampModClamp(); - } - - - - public void tubeLiftSVMoveToZeroBlock() throws AppException { - miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModLiftingSV); - } - - public void tubeLiftSVMoveToRefBlock() throws AppException { - miniServoDriver.miniServoMoveToRefBlock(MiniServoMId.ShakeModLiftingSV); - } - - public void tubeLiftSVMoveToWorkBlock() throws AppException { - miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModLiftingSV, tubePreProcesPosParamMgr.getShakeModLiftingSVWorkPos()); - } - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("基础"); - page.addFunction("失能所有舵机", this::disableMotor); - page.addFunction("使能所有舵机", this::enableMotor); - - page.newGroup("夹爪"); - page.addFunction("待机", this::gripperSVOpen); - page.addFunction("夹紧", this::gripperSVClampTube); - page.newGroup("夹爪Y轴-校验"); - page.addFunction("待机", this::YSVMoveToStandbyPos); - page.addFunction("取试管", this::YSVMoveToTakeTubePos); - page.addFunction("摇匀", this::YSVMoveToShakePos); - page.newGroup("扫码夹紧-校验"); - page.addFunction("释放", this::tubeScanClampMoveToZeroBlock); - page.addFunction("夹紧", this::tubeScanClampMoveToWorkBlock); - page.newGroup("试管升降舵机-校验"); - page.addFunction("待机", this::tubeLiftSVMoveToZeroBlock); - page.addFunction("参考位", this::tubeLiftSVMoveToRefBlock); - page.addFunction("工作位", this::tubeLiftSVMoveToWorkBlock); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java deleted file mode 100644 index 78dfc2e..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java +++ /dev/null @@ -1,23 +0,0 @@ -package a8k.extui.page.hardwaretest; - - -import a8k.app.iflytophald.driver.MiniServoDriver; -import a8k.app.service.mainctrl.AppDeviceInitCtrlService; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class MiscHardwareTestPage { - final private MiniServoDriver miniServoDriver; - final private AppDeviceInitCtrlService appDeviceInitCtrlService; - final private ExtApiPageMgr extApiPageMgr; - ExtUIPageCfg pageConfig; - - - -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java deleted file mode 100644 index bb77326..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java +++ /dev/null @@ -1,407 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.StepMotorCtrlDriver; -import a8k.app.iflytophald.type.protocol.StepMotorMId; -import a8k.app.iflytophald.type.protocol.StepMotorRegIndex; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class MotorHardwareTestPage { - - - private final ExtApiPageMgr extApiPageMgr; - private final StepMotorCtrlDriver stepMotorCtrlDriver; - - ExtUIPageCfg pageConfig; - - // - // 入料电机 - // - public void infeedMotorIn() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModInfeedM, 1); - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, -1); - } - - public void infeedMotorOut() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModInfeedM, 1); - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, 1); - } - - public void infeedMotorStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); - } - - void regFeedingModInfeedM() { - pageConfig.newGroup("入料电机"); - pageConfig.addFunction("向内转动", this::infeedMotorIn); - pageConfig.addFunction("向外转动", this::infeedMotorOut); - pageConfig.addFunction("停止", this::infeedMotorStop); - } - - // - // 出料电机 - // - - public void outfeedMotorIn() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModOutfeedM, 1); - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, -1); - } - - public void outfeedMotorOut() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModOutfeedM, 1); - stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); - } - - public void outfeedMotorStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModOutfeedM); - } - - void regFeedingModOutfeedM() { - pageConfig.newGroup("出料电机"); - pageConfig.addFunction("向内转动", this::outfeedMotorIn); - pageConfig.addFunction("向外转动", this::outfeedMotorOut); - pageConfig.addFunction("停止", this::outfeedMotorStop); - } - - // - // 入料平移电机 - // - public void feedingModXMFLeft(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, step); - } - - public void feedingModXMRight(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, -step); - } - - public Integer feedingModXMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.FeedingModXM); - } - - public void feedingModeStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModXM); - } - - - void regFeedingModXM() { - pageConfig.newGroup("入料平移电机"); - pageConfig.addFunction("归零", this::feedingModXMZero); - pageConfig.addFunction("向左移动", this::feedingModXMFLeft).setParamVal("step", () -> 30); - pageConfig.addFunction("向右移动", this::feedingModXMRight).setParamVal("step", () -> 30); - pageConfig.addFunction("停止", this::feedingModeStop); - } - - // - // 摇匀模组 - // - public void shakeModGripperZMUp(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, -step); - } - - public void shakeModGripperZMDown(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, step); - } - - public Integer shakeModGripperZMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM); - } - - - public void shakeModGripperZMStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModGripperZM); - } - - void regShakeModGripperZM() { - pageConfig.newGroup("摇匀模组Z轴"); - pageConfig.addFunction("归零", this::shakeModGripperZMZero); - pageConfig.addFunction("向上移动", this::shakeModGripperZMUp).setParamVal("step", () -> 30); - pageConfig.addFunction("向下移动", this::shakeModGripperZMDown).setParamVal("step", () -> 30); - pageConfig.addFunction("停止", this::shakeModGripperZMStop); - } - - - public void shakeModClampingMClamping(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, -step); - } - - public void shakeModClampingMRelease(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, step); - } - - public Integer shakeModClampingMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM); - } - - - public void shakeModClampingMStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModClampingM); - } - - void regShakeModClampingM() { - pageConfig.newGroup("摇匀模组夹紧电机"); - pageConfig.addFunction("归零", this::shakeModClampingMZero); - pageConfig.addFunction("夹紧", this::shakeModClampingMClamping).setParamVal("step", () -> 10); - pageConfig.addFunction("释放", this::shakeModClampingMRelease).setParamVal("step", () -> 10); - pageConfig.addFunction("停止", this::shakeModClampingMStop); - } - - public void shakeModShakeMClockwise(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, step); - } - - public void shakeModShakeMAntiClockwise(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, -step); - } - - public Integer shakeModShakeMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.ShakeModShakeM); - } - - public void shakeModShakeMStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModShakeM); - } - - void regShakeModShakeM() { - pageConfig.newGroup("摇匀模组摇匀电机"); - pageConfig.addFunction("归零", this::shakeModShakeMZero); - pageConfig.addFunction("顺时针转动", this::shakeModShakeMClockwise).setParamVal("step", () -> 30); - pageConfig.addFunction("逆时针转动", this::shakeModShakeMAntiClockwise).setParamVal("step", () -> 30); - pageConfig.addFunction("停止", this::shakeModShakeMStop); - } - - - // - // 板夹仓电机 - // - public void platesBoxYMForward(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, step); - } - - public void platesBoxYMBackward(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, -step); - } - - public Integer platesBoxYZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM); - } - - - public void platesBoxYMStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.PlatesBoxYM); - } - - void regPlatesBoxYM() { - pageConfig.newGroup("板夹仓Y轴"); - pageConfig.addFunction("归零", this::platesBoxYZero); - pageConfig.addFunction("向内移动", this::platesBoxYMForward).setParamVal("step", () -> 30); - pageConfig.addFunction("向外移动", this::platesBoxYMBackward).setParamVal("step", () -> 30); - pageConfig.addFunction("停止", this::platesBoxYMStop); - } - - public void platesBoxPusherForward(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, step); - } - - public void platesBoxPusherBackward(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, -step); - } - - public Integer platesBoxPusherZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM); - } - - - public void platesBoxPusherStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(StepMotorMId.PlatesBoxPusherM); - } - - void regPlatesBoxPusherM() { - pageConfig.newGroup("板夹仓推料电机"); - pageConfig.addFunction("归零", this::platesBoxPusherZero); - pageConfig.addFunction("推出", this::platesBoxPusherForward).setParamVal("step", () -> 30); - pageConfig.addFunction("返回", this::platesBoxPusherBackward).setParamVal("step", () -> 30); - pageConfig.addFunction("停止", this::platesBoxPusherStop); - } - - // - // 孵育盘 - // - public String incubatorRotateCtrlMDiagnosticEnc() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); - - //失能enc - stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_enable_enc, 0); - Integer beforeRunEncPos = stepMotorCtrlDriver.stepMotorReadEncPos(StepMotorMId.IncubatorRotateCtrlM); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, 200); - Integer afterRunEncPos = stepMotorCtrlDriver.stepMotorReadEncPos(StepMotorMId.IncubatorRotateCtrlM); - stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_enable_enc, 1); - int dpos = afterRunEncPos - beforeRunEncPos; - if (Math.abs(dpos) < 10) { - return String.format("编码器接线异常, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); - } - if (dpos < 0) { - return String.format("编码器方向异常或 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); - } - if (Math.abs(200 - dpos) > 2) { - return String.format("电机导程(减速比)错误, 或者编码器一圈脉冲数错误, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); - } - return String.format("编码器诊断正常, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); - } - - public void incubatorRotateCtrlMAntiClockwise(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, -step); - } - - public void incubatorRotateCtrlMClockwise(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, step); - } - - public Integer incubatorRotateCtrlMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM); - } - - - public void incubatorRotateCtrlMStop() throws AppException { - 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); - } - - - public void optModScannerMLeft(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, step); - } - - public void optModScannerMRight(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); - - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, -step); - } - - public Integer optModScannerMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); - - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(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); - } - - // - //OptModPullM - // - public void optModPullMLeft(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, -step); - } - - public void optModPullMRight(Integer step) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, step); - } - - public Integer optModPullMZero() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); - return stepMotorCtrlDriver.measurePosByMoveToZeroBlock(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); - } - - - @PostConstruct - void init() { - pageConfig = extApiPageMgr.newPage(this); - regFeedingModInfeedM(); - regFeedingModOutfeedM(); - regFeedingModXM(); - regShakeModGripperZM(); - regShakeModClampingM(); - regShakeModShakeM(); - regPlatesBoxYM(); - regPlatesBoxPusherM(); - regIncubatorRotateCtrlM(); - regOptModScannerM(); - regOptModPullM(); - extApiPageMgr.addPage(pageConfig); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java deleted file mode 100644 index 6bccfcf..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java +++ /dev/null @@ -1,151 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; -import a8k.app.iflytophald.driver.StepMotorCtrlDriver; -import a8k.app.iflytophald.type.protocol.StepMotorMId; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class MotorPPSHardwareTestPage { - - - private final ExtApiPageMgr extApiPageMgr; - private final StepMotorCtrlDriver stepMotorCtrlDriver; - private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; - - ExtUIPageCfg pageConfig; - - // - // 入料平移电机 - // - @ExtApiStatu(name = "入料平移电机", group = "零点光电", order = 1, minWidth = "25%") - public Object feedingModXMReadIOState() { - return readZeroIOState(StepMotorMId.FeedingModXM); - } - - @ExtApiStatu(name = "摇匀模组-Z轴", group = "零点光电", order = 2, minWidth = "25%") - public Object shakeModGripperZMReadIOState() { - return readZeroIOState(StepMotorMId.ShakeModGripperZM); - } - - @ExtApiStatu(name = "摇匀模组-夹紧", group = "零点光电", order = 3, minWidth = "25%") - public Object shakeModClampingMReadIOState() { - return readZeroIOState(StepMotorMId.ShakeModClampingM); - } - - @ExtApiStatu(name = "摇匀模组-摇匀", group = "零点光电", order = 4, minWidth = "25%") - public Object shakeModShakeMReadIOState() { - return readZeroIOState(StepMotorMId.ShakeModShakeM); - } - - @ExtApiStatu(name = "板夹仓-前后移动电机", group = "零点光电", order = 5, minWidth = "25%") - public Object platesBoxYMReadIOState() { - return readZeroIOState(StepMotorMId.PlatesBoxYM); - } - - @ExtApiStatu(name = "板夹仓-推杆电机", group = "零点光电", order = 6, minWidth = "25%") - public Object platesBoxPusherReadIOState() { - return readZeroIOState(StepMotorMId.PlatesBoxPusherM); - } - - @ExtApiStatu(name = "孵育盘电机", group = "零点光电", order = 7, minWidth = "25%") - public Object incubatorRotateCtrlMReadIOState() { - return readZeroIOState(StepMotorMId.IncubatorRotateCtrlM); - } - - @ExtApiStatu(name = "光学模组-扫码电机", group = "零点光电", order = 8, minWidth = "25%") - public Object optModScannerMReadIOState() { - return readZeroIOState(StepMotorMId.OptModScannerM); - } - - @ExtApiStatu(name = "光学模组-拉杆电机", group = "零点光电", order = 9, minWidth = "25%") - public Object optModPullMReadIOState() { - return readZeroIOState(StepMotorMId.OptModPullM); - } - - - // - @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 { - 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 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); - extApiPageMgr.addPage(pageConfig); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java deleted file mode 100644 index e8fb0e3..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java +++ /dev/null @@ -1,32 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.OutputIOCtrlDriver; -import a8k.app.iflytophald.type.protocol.OutputIOId; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class OutputIOCtrlTestPage { - final private ExtApiPageMgr extApiPageMgr; - final private OutputIOCtrlDriver outputIOCtrlDriver; - - public void setRecycleBinOverflowPPSPowerCtrlIOState(Boolean state) throws AppException { - outputIOCtrlDriver.setIOState(OutputIOId.RecycleBinOverflowPPSPowerCtrl, state); - } - - public void setBeepCtrlIOState(Boolean state) throws AppException { - outputIOCtrlDriver.setIOState(OutputIOId.BeepCtrl, state); - } - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("废料仓光栅控制", this::setRecycleBinOverflowPPSPowerCtrlIOState).setParamVal("state", () -> true); - page.addFunction("蜂鸣器控制", this::setBeepCtrlIOState).setParamVal("state", () -> true); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java deleted file mode 100644 index f48aa3d..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java +++ /dev/null @@ -1,82 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class PipetteGunHardwareTestPage { - private final ExtApiPageMgr extApiPageMgr; - private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; - - - public void enableMotor() throws AppException { - pipetteCtrlDriverV2.zMotorEnable(1); - } - - public void disableMotor() throws AppException { - pipetteCtrlDriverV2.zMotorEnable(0); - } - - public void stepMotorEasyMoveToZero() throws AppException { - pipetteCtrlDriverV2.zMotorMoveZeroBlock(); - } - - - public void stepMotorStop() throws AppException { - pipetteCtrlDriverV2.moduleStop(); - } - - public void stepMotorEasyMoveForward(Integer dpos) throws AppException { - pipetteCtrlDriverV2.zMotorMoveByBlock(dpos); - } - - public void stepMotorEasyMoveBackward(Integer dpos) throws AppException { - pipetteCtrlDriverV2.zMotorMoveByBlock(-dpos); - } - - - public Integer readPos() throws AppException { - return pipetteCtrlDriverV2.zMotorReadPos(); - } - - - public PipetteCtrlDriverV2.PipetteGunConnectivityTestReport readPipetteConnectedState() throws AppException { - pipetteCtrlDriverV2.pipetteTestConnectivity(); - return pipetteCtrlDriverV2.readPipetteConnectedState(); - } - - public Boolean readZeroSensorState() throws AppException { - return pipetteCtrlDriverV2.zMotorReadZeroPointState(); - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("基础操作"); - page.addFunction("使能电机", this::enableMotor); - page.addFunction("失能电机", this::disableMotor); - page.addFunction("归零", this::stepMotorEasyMoveToZero); - page.addFunction("正向移动", this::stepMotorEasyMoveForward).setParamVal("dpos", () -> 50); - page.addFunction("反向移动", this::stepMotorEasyMoveBackward).setParamVal("dpos", () -> 50); - page.addFunction("停止", this::stepMotorStop); - - 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/SubBoardProberPage.java b/src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java deleted file mode 100644 index 935d708..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java +++ /dev/null @@ -1,131 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.A8kCanBusBaseDriver; -import a8k.app.iflytophald.type.protocol.MId; -import a8k.app.type.VersionInfo; -import a8k.app.type.exception.AppException; -import a8k.app.utils.ZList; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class SubBoardProberPage { - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @Resource - A8kCanBusBaseDriver canBus; - - - Map versionInfos = new HashMap<>(); - - @ExtApiStatu(name = "", group = "机械臂板模块-10", order = 1) - public VersionInfo getHbotBoard() { - return versionInfos.get(MId.HbotBoard); - } - - @ExtApiStatu(name = "", group = "板夹仓模块-20", order = 3) - public VersionInfo getPlatesBoxBoard() { - return versionInfos.get(MId.PlatesBoxBoard); - } - - @ExtApiStatu(name = "", group = "摇匀模组板-30", order = 7) - public VersionInfo getShakeModBoard() { - return versionInfos.get(MId.ShakeModBoard); - } - - @ExtApiStatu(name = "", group = "反应板夹温度控板-40", order = 15) - public VersionInfo getPlatesBoxTCMBoard() { - return versionInfos.get(MId.PlatesBoxTCMBoard); - } - - @ExtApiStatu(name = "", group = "孵育盘温空板-50", order = 18) - public VersionInfo getIncubatorTCMBoard() { - return versionInfos.get(MId.IncubatorTCMBoard); - } - - - @ExtApiStatu(name = "", group = "出入料模块-60", order = 20) - public VersionInfo getFeedingModBoard() { - return versionInfos.get(MId.FeedingModBoard); - } - - @ExtApiStatu(name = "", group = "孵育盘旋转板-70", order = 25) - public VersionInfo getIncubatorRotateBoard() { - return versionInfos.get(MId.IncubatorRotateBoard); - } - - - @ExtApiStatu(name = "", group = "机械臂Z轴板-80", order = 27) - public VersionInfo getPipetteModBoard() { - return versionInfos.get(MId.PipetteModBoard); - } - - @ExtApiStatu(name = "", group = "光学模组板-90", order = 30) - public VersionInfo getOptModBoard() { - return versionInfos.get(MId.OptModBoard); - } - - @ExtApiStatu(name = "", group = "A8K读卡器板-100", order = 34) - public VersionInfo getA8kIdCardReaderBoard() { - return versionInfos.get(MId.A8kIdCardReaderBoard); - } - - - public void refreshBoardState() { - var modules = ZList.of( - MId.HbotBoard, - MId.PlatesBoxBoard, - MId.ShakeModBoard, - MId.PlatesBoxTCMBoard, - MId.IncubatorTCMBoard, - MId.FeedingModBoard, - MId.IncubatorRotateBoard, - MId.PipetteModBoard, - MId.OptModBoard, - MId.A8kIdCardReaderBoard - ); - for (var module : modules) { - if (module == MId.NotSet) { - continue; - } - try { - Integer version = canBus.moduleReadVersion(module); - String modueType = canBus.moduleReadType(module).toString(); - - VersionInfo info = new VersionInfo(); - info.online = true; - info.moduleType = modueType; - info.moduleId = module.index; - info.moduleName = module.chname; - info.version = version; - versionInfos.put(module, info); - - } catch (AppException e) { - VersionInfo info = new VersionInfo(); - info.online = false; - info.moduleId = module.index; - info.moduleName = module.chname; - versionInfos.put(module, info); - } - } - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.regPageInitFn(this::refreshBoardState); - page.addFunction("刷新", this::refreshBoardState); - extApiPageMgr.addPage(page); - } - -} diff --git a/src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java b/src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java deleted file mode 100644 index b515bc4..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java +++ /dev/null @@ -1,244 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.type.exception.AppException; -import a8k.app.iflytophald.driver.A8kCanBusBaseDriver; -import a8k.app.iflytophald.type.protocol.MId; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class SubModuleVersionPreviewPage { - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @Resource - A8kCanBusBaseDriver canBus; - - public static class VersionInfo { - public Integer moduleId; - public String moduleName; - public Boolean online; - public String moduleType; - public Integer version; - } - - Map versionInfos = new HashMap<>(); - - @ExtApiStatu(name = "", group = "机械臂板模块", order = 1) - public VersionInfo getHbotBoard() { - return versionInfos.get(MId.HbotBoard); - } - - @ExtApiStatu(name = "", group = "机械臂XY", order = 2) - public VersionInfo getHbotM() { - return versionInfos.get(MId.HbotM); - } - - @ExtApiStatu(name = "", group = "板夹仓模块", order = 3) - public VersionInfo getPlatesBoxBoard() { - return versionInfos.get(MId.PlatesBoxBoard); - } - - @ExtApiStatu(name = "", group = "板夹仓移动电机", order = 4) - public VersionInfo getPlatesBoxYM() { - return versionInfos.get(MId.PlatesBoxYM); - } - - @ExtApiStatu(name = "", group = "板夹仓推杆电机", order = 5) - public VersionInfo getPlatesBoxPusherM() { - return versionInfos.get(MId.PlatesBoxPusherM); - } - -// @ExtApiStatu(name = "", group = "板夹仓扫码模组", order = 6) -// public VersionInfo getPlatesBoxScanner() { -// return versionInfos.get(MId.PlatesBoxScanner); -// } - - @ExtApiStatu(name = "", group = "摇匀模组板", order = 7) - public VersionInfo getShakeModBoard() { - return versionInfos.get(MId.ShakeModBoard); - } - - @ExtApiStatu(name = "", group = "试管固定夹爪电机", order = 8) - public VersionInfo getShakeModClampingM() { - return versionInfos.get(MId.ShakeModClampingM); - } - - @ExtApiStatu(name = "", group = "摇匀升降电机", order = 9) - public VersionInfo getShakeModGripperZM() { - return versionInfos.get(MId.ShakeModGripperZM); - } - - @ExtApiStatu(name = "", group = "试管摇匀电机", order = 10) - public VersionInfo getShakeModShakeM() { - return versionInfos.get(MId.ShakeModShakeM); - } - - @ExtApiStatu(name = "", group = "摇匀前后移动舵机", order = 11) - public VersionInfo getShakeModGripperYSV() { - return versionInfos.get(MId.ShakeModGripperYSV); - } - - @ExtApiStatu(name = "", group = "摇匀试管帽夹爪舵机", order = 12) - public VersionInfo getShakeModGripperSV() { - return versionInfos.get(MId.ShakeModGripperSV); - } - - @ExtApiStatu(name = "", group = "试管架扫码夹紧舵机", order = 13) - public VersionInfo getShakeModTubeScanerClampingSV() { - return versionInfos.get(MId.ShakeModTubeScanerClampingSV); - } - - @ExtApiStatu(name = "", group = "试管架旋转舵机", order = 14) - public VersionInfo getShakeModTubeScanerRotateSV() { - return versionInfos.get(MId.ShakeModTubeScanerRotateSV); - } - - @ExtApiStatu(name = "", group = "反应板夹温度控板", order = 15) - public VersionInfo getPlatesBoxTCMBoard() { - return versionInfos.get(MId.PlatesBoxTCMBoard); - } - - @ExtApiStatu(name = "", group = "反应板夹温度控制模块", order = 16) - public VersionInfo getPlatesBoxTCM() { - return versionInfos.get(MId.PlatesBoxTCM); - } - - @ExtApiStatu(name = "", group = "气溶胶风扇", order = 17) - public VersionInfo getWbTubeFanMod() { - return versionInfos.get(MId.WbTubeFanMod); - } - - @ExtApiStatu(name = "", group = "孵育盘温空板", order = 18) - public VersionInfo getIncubatorTCMBoard() { - return versionInfos.get(MId.IncubatorTCMBoard); - } - - @ExtApiStatu(name = "", group = "孵育盘温控模块", order = 19) - public VersionInfo getIncubatorTCM() { - return versionInfos.get(MId.IncubatorTCM); - } - - @ExtApiStatu(name = "", group = "出入料模块", order = 20) - public VersionInfo getFeedingModBoard() { - return versionInfos.get(MId.FeedingModBoard); - } - - @ExtApiStatu(name = "", group = "入料电机", order = 21) - public VersionInfo getFeedingModInfeedM() { - return versionInfos.get(MId.FeedingModInfeedM); - } - - @ExtApiStatu(name = "", group = "试管架平移电机", order = 22) - public VersionInfo getFeedingModXM() { - return versionInfos.get(MId.FeedingModXM); - } - - @ExtApiStatu(name = "", group = "出料电机", order = 23) - public VersionInfo getFeedingModOutfeedM() { - return versionInfos.get(MId.FeedingModOutfeedM); - } - - @ExtApiStatu(name = "", group = "试管架扫码器", order = 24) - public VersionInfo getFeedingModScannerMod() { - return versionInfos.get(MId.FeedingModScannerMod); - } - - @ExtApiStatu(name = "", group = "孵育盘旋转板", order = 25) - public VersionInfo getIncubatorRotateBoard() { - return versionInfos.get(MId.IncubatorRotateBoard); - } - - @ExtApiStatu(name = "", group = "孵育盘旋转", order = 26) - public VersionInfo getIncubatorRotateCtrlM() { - return versionInfos.get(MId.IncubatorRotateCtrlM); - } - - @ExtApiStatu(name = "", group = "机械臂Z轴板", order = 27) - public VersionInfo getPipetteModBoard() { - return versionInfos.get(MId.PipetteModBoard); - } - - @ExtApiStatu(name = "", group = "移液枪", order = 28) - public VersionInfo getPipetteMod() {return versionInfos.get(MId.PipetteMod);} - - @ExtApiStatu(name = "", group = "物料扫码器", order = 29) - public VersionInfo getPipetteModCodeScanner() { - return versionInfos.get(MId.PipetteModCodeScanner); - } - - @ExtApiStatu(name = "", group = "光学模组板", order = 30) - public VersionInfo getOptModBoard() { - return versionInfos.get(MId.OptModBoard); - } - - @ExtApiStatu(name = "", group = "板卡扫描电机", order = 31) - public VersionInfo getOptModScannerM() { - return versionInfos.get(MId.OptModScannerM); - } - - @ExtApiStatu(name = "", group = "板卡推杆电机", order = 32) - public VersionInfo getOptModPullM() { - return versionInfos.get(MId.OptModPullM); - } - - @ExtApiStatu(name = "", group = "扫描仪", order = 33) - public VersionInfo getOptMod() { - return versionInfos.get(MId.OptMod); - } - - @ExtApiStatu(name = "", group = "A8K读卡器板", order = 34) - public VersionInfo getA8kIdCardReaderBoard() { - return versionInfos.get(MId.A8kIdCardReaderBoard); - } - - @ExtApiStatu(name = "", group = "A8K读卡器", order = 35) - public VersionInfo getA8kIdCardReader() { - return versionInfos.get(MId.A8kIdCardReader); - } - - public void refreshBoardState() { - var modules = MId.values(); - for (var module : modules) { - if (module == MId.NotSet) { - continue; - } - try { - Integer version = canBus.moduleReadVersion(module); - String modueType = canBus.moduleReadType(module).toString(); - - VersionInfo info = new VersionInfo(); - info.online = true; - info.moduleType = modueType; - info.moduleId = module.index; - info.moduleName = module.chname; - info.version = version; - versionInfos.put(module, info); - - } catch (AppException e) { - VersionInfo info = new VersionInfo(); - info.online = false; - info.moduleId = module.index; - info.moduleName = module.chname; - versionInfos.put(module, info); - } - } - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("刷新", this::refreshBoardState); - 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 deleted file mode 100644 index 63ac74a..0000000 --- a/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java +++ /dev/null @@ -1,145 +0,0 @@ -package a8k.extui.page.hardwaretest; - -import a8k.app.iflytophald.driver.WaterTemperatureControllerDriver; -import a8k.app.iflytophald.type.protocol.TemperatureControlerMid; -import a8k.app.iflytophald.type.protocol.TemperatureControlerRegIndex; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class WaterTempControllerTestPage { - - - final private ExtApiPageMgr extApiPageMgr; - final private WaterTemperatureControllerDriver waterTemperatureControllerDriver; - - @ExtApiStatu(name = "", group = "孵育盘反馈温度", order = 1, minWidth = "50%") - public Double readIncubateBoxReadFeedbackTemperature() throws AppException { - return waterTemperatureControllerDriver.readTemperature(TemperatureControlerMid.IncubatorTCM); - } - - - @ExtApiStatu(name = "", group = "板夹仓反馈温度", order = 2, minWidth = "50%") - public Double readPlatesBoxTCMFeedbackTemperature() throws AppException { - return waterTemperatureControllerDriver.readTemperature(TemperatureControlerMid.PlatesBoxTCM); - } - - @ExtApiStatu(name = "", group = "孵育盘温度传感器", order = 3, minWidth = "50%") - public String readIncubateBoxReadTemperatures() throws AppException { - Integer temp0 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp0); - Integer temp1 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp1); - Integer temp2 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp2); - Integer temp3 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp3); - return String.format("S0: %d, S1: %d, S2: %d, S3: %d", temp0, temp1, temp2, temp3); - } - - @ExtApiStatu(name = "", group = "板夹仓温度传感器", order = 4, minWidth = "50%") - public String readPlatesBoxTCMReadTemperatures() throws AppException { - Integer temp0 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp0); - Integer temp1 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp1); - Integer temp2 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp2); - Integer temp3 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp3); - return String.format("S0: %d, S1: %d, S2: %d, S3: %d", temp0, temp1, temp2, temp3); - } - - - public void incubatorTCMStartCtrlTemperature(Double targetTemp) throws AppException { - waterTemperatureControllerDriver.startCtrlTemperature(TemperatureControlerMid.IncubatorTCM, targetTemp); - } - - public void incubatorTCMStopCtrlTemperature() throws AppException { - waterTemperatureControllerDriver.stopCtrlTemperature(TemperatureControlerMid.IncubatorTCM); - } - - - public void incubatorTCMSetPeltierPower(Integer val0To100) throws AppException { - waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.IncubatorTCM, val0To100); - } - public void incubatorTCMSetPeltierClose() throws AppException { - waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.IncubatorTCM, 0); - } - - - public void incubatorTCMSetCtrlFanLevel(Integer val0To100) throws AppException { - waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.IncubatorTCM, val0To100); - } - public void incubatorTCMSetCtrlFanClose() throws AppException { - waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.IncubatorTCM, 0); - } - - public void incubatorTCMSetWaterPumpSpeed(Integer val0To100) throws AppException { - waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.IncubatorTCM, val0To100); - } - public void incubatorTCMSetWaterPumpClose() throws AppException { - waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.IncubatorTCM, 0); - } - - - public void platesBoxTCMStartCtrlTemperature(Double targetTemp) throws AppException { - waterTemperatureControllerDriver.startCtrlTemperature(TemperatureControlerMid.PlatesBoxTCM, targetTemp); - } - - - public void platesBoxTCMStopCtrlTemperature() throws AppException { - waterTemperatureControllerDriver.stopCtrlTemperature(TemperatureControlerMid.PlatesBoxTCM); - } - - public void platesBoxTCMSetPeltierPower(Integer val0To100) throws AppException { - waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.PlatesBoxTCM, val0To100); - } - - public void platesBoxTCMSetPeltierClose() throws AppException { - waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.PlatesBoxTCM, 0); - } - - - public void platesBoxTCMSetCtrlFanLevel(Integer val0To100) throws AppException { - waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.PlatesBoxTCM, val0To100); - } - public void platesBoxTCMSetCtrlFanClose() throws AppException { - waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.PlatesBoxTCM, 0); - } - - public void platesBoxTCMSetWaterPumpSpeed(Integer val0To100) throws AppException { - waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.PlatesBoxTCM, val0To100); - } - public void platesBoxTCMSetWaterPumpClose() throws AppException { - waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.PlatesBoxTCM, 0); - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.newGroup("孵育盘-温度控制"); - page.addFunction("孵育箱TCM开始控温", this::incubatorTCMStartCtrlTemperature); - page.addFunction("孵育箱TCM停止控温", this::incubatorTCMStopCtrlTemperature); - page.newGroup("孵育盘-温度控制-测试"); - page.addFunction("设置加热片功率(-100...+100)", this::incubatorTCMSetPeltierPower); - page.addFunction("关闭加热片", this::incubatorTCMSetPeltierClose); - page.addFunction("设置风扇转速", this::incubatorTCMSetCtrlFanLevel); - page.addFunction("关闭风扇", this::incubatorTCMSetCtrlFanClose); - page.addFunction("设置水泵转速", this::incubatorTCMSetWaterPumpSpeed); - page.addFunction("关闭水泵", this::incubatorTCMSetWaterPumpClose); - page.newGroup("板夹仓-温度控制"); - page.addFunction("板夹仓TCM开始控温", this::platesBoxTCMStartCtrlTemperature); - page.addFunction("板夹仓TCM停止控温", this::platesBoxTCMStopCtrlTemperature); - page.newGroup("板夹仓-温度控制-测试"); - page.addFunction("设置加热片功率(-100...+100)", this::platesBoxTCMSetPeltierPower); - page.addFunction("关闭加热片", this::platesBoxTCMSetPeltierClose); - page.addFunction("设置风扇转速", this::platesBoxTCMSetCtrlFanLevel); - page.addFunction("关闭风扇", this::platesBoxTCMSetCtrlFanClose); - page.addFunction("设置水泵转速", this::platesBoxTCMSetWaterPumpSpeed); - page.addFunction("关闭水泵", this::platesBoxTCMSetWaterPumpClose); - extApiPageMgr.addPage(page); - } - - -} diff --git a/src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java deleted file mode 100644 index 7856af1..0000000 --- a/src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java +++ /dev/null @@ -1,113 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.iflytophald.driver.CodeScanerDriver; -import a8k.app.service.lowerctrl.HbotMoveExCtrlService; -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import static a8k.OS.threadSleep; - -@Component -@Slf4j -@RequiredArgsConstructor -public class HbotCodeScanPosVerificationPage { - private final ExtApiPageMgr extApiPageMgr; - private final HbotMoveExCtrlService hbotMoveExCtrlService; - private final CodeScanerDriver codeScanerDriver; - - // - // 基础操作 - // - - public void moveToPBScanPos(ConsumableGroup group) throws AppException { - hbotMoveExCtrlService.moveToPBCodeScanPos(group); - } - - public void moveToLittleBSCodeScanPos(ConsumableGroup group) throws AppException { - hbotMoveExCtrlService.moveToLittleBSCodeScanPos(group); - } - - public void moveToLargeBSCodeScanPos(ConsumableGroup group) throws AppException { - hbotMoveExCtrlService.moveToLargeBSCodeScanPos(group); - } - - public void startCodeScan() throws AppException { - codeScanerDriver.pipetteModCodeScannerStartScan(); - } - - public void stopCodeScan() throws AppException { - codeScanerDriver.pipetteModCodeScannerStopScan(); - } - - public void batchCodeScan(Integer times, Integer overtime) throws AppException { - if(overtime < 0){ - overtime = 0; - } - - log.info("batchCodeScan times:{} overtime:{}", times, overtime); - - for (int i = 0; i < times; i++) { - log.info("batchCodeScan times:{}", i); - hbotMoveExCtrlService.moveQuickToZero(); - - for(var cg: ConsumableGroup.values()){ - moveToPBScanPos(cg); - threadSleep(overtime); - String result = codeScanerDriver.pipetteModCodeScannerScanCode(); - if(result == null || result.isEmpty()){ - log.info("cg {} 扫码失败", cg); - } - log.info("cg {} 扫码结果:{}", cg, result); - } - } - } - - public void codeScan(ConsumableGroup cg, Integer overtime) throws AppException - { - moveToPBScanPos(cg); - threadSleep(overtime); - String result = codeScanerDriver.pipetteModCodeScannerScanCode(); - if(result == null || result.isEmpty()){ - log.info("cg {} 扫码失败", cg); - } - log.info("cg {} 扫码结果:{}", cg, result); - } - - public void batchCodeScanWithCheck(ConsumableGroup cg, Integer times, Integer overtime) throws AppException { - if(overtime < 0){ - overtime = 0; - } - - log.info("batchCodeScanWithCheck times:{} overtime:{}", times, overtime); - - for (int i = 0; i < times; i++) { - log.info("batchCodeScanWithCheck times:{}", i); - hbotMoveExCtrlService.moveQuickToZero(); - codeScan(cg, overtime); - } - } - - - @PostConstruct - void init() { - ExtUIPageCfg cfg = extApiPageMgr.newPage(this); - cfg.newGroup("位置移动"); - cfg.addFunction("移动到PB扫码位置", this::moveToPBScanPos); - cfg.addFunction("移动到小瓶扫码位置", this::moveToLittleBSCodeScanPos); - cfg.addFunction("移动到大瓶扫码位置", this::moveToLargeBSCodeScanPos); - cfg.addFunction("扫码", this::startCodeScan); - cfg.addFunction("停止扫码", this::stopCodeScan); - - cfg.newGroup("扫码测试"); - cfg.addFunction("批量扫码(One)", this::batchCodeScanWithCheck); - cfg.addFunction("批量扫码", this::batchCodeScan); - - extApiPageMgr.addPage(cfg); - } -} diff --git a/src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java b/src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java deleted file mode 100644 index fad9cbf..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java +++ /dev/null @@ -1,78 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.type.exception.AppException; -import a8k.app.dao.type.db.ProjExtInfoCard; -import a8k.app.iflytophald.type.protocol.A8kEcode; -import a8k.app.i18n.Internationalization; -import a8k.app.service.data.ProjIdCardInfoMgrService; -import a8k.app.service.mainctrl.AppDeviceInitCtrlService; -import a8k.app.service.background.ProjIDCardCtrlAndMonitorService; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import com.fasterxml.jackson.annotation.JsonInclude; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - -@Component -@Slf4j -public class P10ProjejIDCardTestPage { - @Resource - ExtApiPageMgr extApiPageMgr; - @Resource - AppDeviceInitCtrlService appDeviceInitCtrlService; - - @Resource - ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService; - - @Resource - ProjIdCardInfoMgrService projIdCardInfoMgrService; - - // - // 基础操作 - // - - - public ProjExtInfoCard readMountProjIDCard() throws AppException { - var val = projIDCardCtrlAndMonitorService.getMountedIdCardInfo(); - if (val == null) { - throw new AppException(A8kEcode.APPE_A8K_ID_CARD_NOT_MOUNTED); - } - return val; - } - - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class A8kIDCardVerifyResult { - public List errorList; - public String state; - } - - public A8kIDCardVerifyResult verifyMountProjIDCard() throws AppException { - var erroList = projIdCardInfoMgrService.verifyProjExtInfoCard(projIDCardCtrlAndMonitorService.getMountedIdCardInfo()); - var result = new A8kIDCardVerifyResult(); - if (!erroList.isEmpty()) { - result.errorList = new ArrayList<>(); - for (var e : erroList) { - result.errorList.add(Internationalization.A8kEcode2String(e)); - } - result.state = "校验失败"; - } else { - result.state = "校验成功"; - } - return result; - } - - @PostConstruct - void init() { - ExtUIPageCfg cfg = extApiPageMgr.newPage(this); - cfg.addFunction("读取挂载ID卡信息", this::readMountProjIDCard); - cfg.addFunction("校验挂载ID卡信息", this::verifyMountProjIDCard); - extApiPageMgr.addPage(cfg); - } - - -} diff --git a/src/main/java/a8k/extui/page/test/verification/P30InfeedAndPreProcessPosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P30InfeedAndPreProcessPosVerificationPage.java deleted file mode 100644 index cf71d85..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P30InfeedAndPreProcessPosVerificationPage.java +++ /dev/null @@ -1,136 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.type.exception.AppException; -import a8k.app.service.lowerctrl.*; -import a8k.app.type.misc.TubeHolderScanResult; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class P30InfeedAndPreProcessPosVerificationPage { - - @Resource - TubeFeedingCtrlService tubeFeedingCtrlService; - - @Resource - TubePreProcessModuleExCtrlService tubePreProcessModuleExCtrlService; - - public void enterTubeHolder() throws AppException { - tubeFeedingCtrlService.enterTubeHolder(); - } - - //移动到试管架存在检测位置 - public String moveAndJudgeTubeExist(Integer tubeIndex) throws AppException { - boolean exit = tubeFeedingCtrlService.moveAndjudgeTubeExist(tubeIndex - 1); - return exit ? "存在" : "不存在"; - } - - public String moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { - boolean altit = tubeFeedingCtrlService.moveAndJudgeTubeAltit(tubeIndex - 1); - return altit ? "高" : "低"; - } - - public String moveToTubeScanPosAndScan(Integer tubeIndex) throws AppException { - return tubeFeedingCtrlService.moveToTubeScanPosAndScan(tubeIndex - 1); - } - - public String moveToTubeRackScanPosAndScan() throws AppException { - return tubeFeedingCtrlService.moveToTubeRackScanPosAndScan(); - } - - - /** - * 扫描管架 - * @return 管架扫描结果 - * @throws AppException ae - */ - public TubeHolderScanResult scanTubeHolder() throws AppException { - TubeHolderScanResult result = tubeFeedingCtrlService.enterAndScanTubeholder(); - tubeFeedingCtrlService.ejectTubeHolder(); - return result; - } - - /** - * 从管架中取出管子 - * @throws AppException ae - */ - public void ejectTubeFromTubeHolder() throws AppException { - tubeFeedingCtrlService.ejectTubeHolder(); - } - - /** - * 将管子移动到扫描位置 - * @param tubeIndex 管子编号 - * @throws AppException ae - */ - public void moveTubeToPreProcessPos(Integer tubeIndex) throws AppException { - tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex - 1); - } - - /** - * 预处理试管 - * @param isHTube 是否是H管 - * @throws AppException ae - */ - public void preProcessTube(Boolean isHTube) throws AppException { - tubePreProcessModuleExCtrlService.takeTubeFromTubeholderToShakePos(isHTube); - tubePreProcessModuleExCtrlService.shakeTube(45, 5); - tubePreProcessModuleExCtrlService.takeTubeCap(); - tubePreProcessModuleExCtrlService.putbakTubeCapAndPutbakTubeToTubeHolder(); - } - - //取试管到预处理位 - public void takeTubeFromTubeholderToShakePos(Integer tubeIndex,Boolean isHTube) throws AppException { - if (!tubePreProcessModuleExCtrlService.isModuleInIdleProgress()) { - throw AppException.ofAECodeError("有试管正在处理中"); - } - - tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex); - tubePreProcessModuleExCtrlService.takeTubeFromTubeholderToShakePos(isHTube); - tubePreProcessModuleExCtrlService.shakeTube(45, 5); - tubePreProcessModuleExCtrlService.takeTubeCap(); - - } - - //放试管盖和试管回试管架 - public void putTubeBackToTubeHolder() throws AppException { - tubePreProcessModuleExCtrlService.resetModule(); - } - - public void shakeTube(Integer angle, Integer times) throws AppException { - tubePreProcessModuleExCtrlService.shakeTube(angle, times); - } - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - page.newGroup("入料操作"); - page.addFunction("入料", this::enterTubeHolder); - page.addFunction("移动到[试管]扫描位置,并扫描", this::moveToTubeScanPosAndScan).setParamVal("tubeIndex",()-> 1); - page.addFunction("移动到[试管]存在检测位置,并判断", this::moveAndJudgeTubeExist).setParamVal("tubeIndex", ()->1); - page.addFunction("移动到[试管]高低检测位置,并判断", this::moveAndJudgeTubeAltit).setParamVal("tubeIndex", ()->1); - page.addFunction("移动到[试管]预处理位置", this::moveTubeToPreProcessPos).setParamVal("tubeIndex",()-> 1); - page.addFunction("移动到[试管架]扫描位置,并扫描", this::moveToTubeRackScanPosAndScan); - page.addFunction("出料", this::ejectTubeFromTubeHolder); - page.newGroup("入料操作-脚本"); - page.addFunction("入料,并扫描试管架和试管,出料", this::scanTubeHolder); - - page.newGroup("预处理校准.单步"); - page.addFunction("摇匀试管", this::shakeTube).setParamVal("angle", ()->45).setParamVal("times", ()->5); - page.newGroup("预处理校准.脚本"); - page.addFunction("取试管到预处理位", this::takeTubeFromTubeholderToShakePos); - page.addFunction("放试管回试管架", this::putTubeBackToTubeHolder); - - - - extApiPageMgr.addPage(page); - - - } -} diff --git a/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java deleted file mode 100644 index 90b0b00..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java +++ /dev/null @@ -1,128 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.a8k.pos.IncubatorPos; -import a8k.app.type.exception.AppException; -import a8k.app.iflytophald.driver.MiniServoDriver; -import a8k.app.iflytophald.driver.StepMotorCtrlDriver; -import a8k.app.service.lowerctrl.*; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class P31ReactionPlatesTransmitPosVerificationPage { - - @Resource - TubeFeedingCtrlService tubeFeedingCtrlService; - - @Resource - TubePreProcessModuleExCtrlService tubePreProcessModuleExCtrlService; - - @Resource - MiniServoDriver miniServoDriver; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - @Resource - TurntableMoveCtrlService turntableMoveCtrlService; - @Resource - PlateBoxCtrlService plateBoxCtrlService; - @Resource - OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; - @Resource - HbotMoveCtrlService hbotMoveCtrlService; - - @Resource - HbotMoveExCtrlService hbotMoveExCtrlService; - - - - - //孵育盘单步 - - //光学模组单步 - - - public void pushPlateQuick(ConsumableGroup group,IncubatorPos index) throws AppException { - plateBoxCtrlService.pushPlateQuick(group, index); - } - - public void pullPlate(IncubatorPos index) throws AppException { - optScanModuleLowerCtrlService.pullPlate(index); - } - - public void dropPlate() throws AppException { - optScanModuleLowerCtrlService.dropPlate(); - } - - public void turntableMoveToDropLiquidPos(IncubatorPos index) throws AppException { - turntableMoveCtrlService.trunableMoveToDropLiquidPos(index); - } - - public void turntableMoveToPullPos(IncubatorPos index) throws AppException { - turntableMoveCtrlService.trunableMoveToPullPos(index); - } - - public void turntableMoveToPushPos(IncubatorPos index) throws AppException { - turntableMoveCtrlService.trunableMoveToPushPos(index); - } - - - public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { - plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); - optScanModuleLowerCtrlService.pullPlate(incubatorPos); - optScanModuleLowerCtrlService.dropPlate(); - } - - public void pushAllAndRemoveAll() throws AppException { - pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE01); - } - - - - public void pushAllIncubator(ConsumableGroup PBCh) throws AppException { - for (var space : IncubatorPos.values()) { - plateBoxCtrlService.pushPlateQuick(PBCh, space); - } - } - - public void removeAllIncubator() throws AppException { - for (var space : IncubatorPos.values()) { - optScanModuleLowerCtrlService.pullPlate(space); - optScanModuleLowerCtrlService.dropPlate(); - } - } - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - page.newGroup("单步测试"); - page.addFunction("推入", this::pushPlateQuick); - page.addFunction("拉出", this::pullPlate); - page.addFunction("丢弃", this::dropPlate); - page.addFunction("转盘-移动到滴液位置", this::turntableMoveToDropLiquidPos); - page.addFunction("转盘-移动到拉出位置", this::turntableMoveToPullPos); - page.addFunction("转盘-移动到推入位置", this::turntableMoveToPushPos); - - page.newGroup("反应板夹仓-脚本测试"); - page.addFunction("推入&&推出(One)", this::pushOneAndRemove); - page.addFunction("推入&&推出(All 测试<板夹仓>坐标)", this::pushAllAndRemoveAll); - - page.addFunction("推入孵育盘板夹(All)", this::pushAllIncubator); - page.addFunction("推出孵育盘板夹(All)", this::removeAllIncubator); - - extApiPageMgr.addPage(page); - } - - -} diff --git a/src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java deleted file mode 100644 index 193f12e..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java +++ /dev/null @@ -1,112 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.service.ctrlmodule.TipOperationCtrlModule; -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.a8k.pos.TipGroupPos; -import a8k.app.type.exception.AppException; -import a8k.app.service.lowerctrl.*; -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 -@Slf4j -@RequiredArgsConstructor -public class P32HbotPosVerificationPage { - private final HbotMoveExCtrlService hbotMoveExCtrlService; - private final TipOperationCtrlModule tipOperationCtrlModule; - - - public void takeTip(TipGroupPos tipGroupPos, Integer index) throws AppException { - tipOperationCtrlModule.testDoTakeTipAction(tipGroupPos, index); - } - - public void moveToTakeTipObservationPos(TipGroupPos tipGroupPos, Integer index, Integer zpos) throws AppException { - hbotMoveExCtrlService.moveToTakeTipObservationPos(tipGroupPos, index, zpos); - } - - public void takeAndDropTip(TipGroupPos tipGroupPos, Integer index) throws AppException { - try { - tipOperationCtrlModule.testTakeTip(tipGroupPos, index); - } catch (AppException e) { - hbotMoveExCtrlService.initializePipette(); - hbotMoveExCtrlService.zAxisMoveToZeroPointBlock(); - throw e; - } - } - public void putBakTip(TipGroupPos tipGroupPos, Integer index) throws AppException { - try { - tipOperationCtrlModule.testPutBakTip(tipGroupPos, index); - } catch (AppException e) { - hbotMoveExCtrlService.initializePipette(); - hbotMoveExCtrlService.zAxisMoveToZeroPointBlock(); - throw e; - } - } - - - public void dropTip() throws AppException { - tipOperationCtrlModule.dropTip(); - } - - - public void moveToDropLiquidPos() throws AppException { - hbotMoveExCtrlService.moveToDropLiquidPos(); - } - - - public void moveToLittleBufferPircePos(ConsumableGroup group, Integer off) throws AppException { - hbotMoveExCtrlService.moveToLittleBufferPiercePos(group, off); - } - - public void moveToLittleBufferSamplePos(ConsumableGroup group, Integer off) throws AppException { - hbotMoveExCtrlService.moveToLittleBufferContainerPos(group, off); - } - - public void moveToProbeSubstanceSamplePos(ConsumableGroup group, Integer off) throws AppException { - hbotMoveExCtrlService.moveToProbeSubstanceContainerPos(group, off); - } - - public void moveToProbeSubstancePiercePos(ConsumableGroup group, Integer off) throws AppException { - hbotMoveExCtrlService.moveToProbeSubstancePiercePos(group, off); - } - - public void moveToLargeBufferPos(ConsumableGroup group) throws AppException { - hbotMoveExCtrlService.moveToLargeBSContainerPos(group); - } - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("TIP"); - page.addFunction("取Tip", this::takeTip); - page.addFunction("放回Tip", this::putBakTip); - page.addFunction("取Tip并放回", this::takeAndDropTip); - page.addFunction("移动到取Tip观察位", this::moveToTakeTipObservationPos); - page.addFunction("丢Tip", this::dropTip); - page.addFunction("移动滴液位", this::moveToDropLiquidPos); - - page.newGroup("小瓶缓冲液"); - page.addFunction("移动到小瓶缓冲液穿刺位", this::moveToLittleBufferPircePos); - page.addFunction("移动到小瓶缓冲液采样位", this::moveToLittleBufferSamplePos); - - page.newGroup("探测物质"); - page.addFunction("移动到探测物质穿刺位", this::moveToProbeSubstancePiercePos); - page.addFunction("移动到探测物质采样位", this::moveToProbeSubstanceSamplePos); - - page.newGroup("大瓶缓冲液"); - page.addFunction("移动到大瓶缓冲液容器位置", this::moveToLargeBufferPos); - - extApiPageMgr.addPage(page); - } - - -} diff --git a/src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java deleted file mode 100644 index 4347304..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java +++ /dev/null @@ -1,34 +0,0 @@ -package a8k.extui.page.test.verification; - - - -import a8k.app.type.exception.AppException; -import a8k.app.service.lowerctrl.HbotMoveExCtrlService; -import a8k.app.type.param.type.A8kSamplePos; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class P33HbotSamplePosVerificationPage { - @Resource - HbotMoveExCtrlService hbotMoveExCtrlService; - - public void moveToSamplePos(A8kSamplePos a8kSamplePos) throws AppException { - hbotMoveExCtrlService.moveToSampleContainerPos(a8kSamplePos); - } - - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("移动到样本位置", this::moveToSamplePos); - extApiPageMgr.addPage(page); - } - -} diff --git a/src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java b/src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java deleted file mode 100644 index 9acc882..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java +++ /dev/null @@ -1,135 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.service.lowerctrl.TurntableMoveCtrlService; -import a8k.app.service.ctrlmodule.TipOperationCtrlModule; -import a8k.app.type.a8k.*; -import a8k.app.type.a8k.pos.IncubatorPos; -import a8k.app.type.a8k.pos.LargeBufferPos; -import a8k.app.type.a8k.pos.PreReactionPos; -import a8k.app.type.exception.AppException; -import a8k.app.type.param.type.A8kSamplePos; -import a8k.app.service.lowerctrl.LiquidOperationCtrService; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class P34LiquidOperationTestPage { - - @Resource - LiquidOperationCtrService liquidOperationCtrService; - @Resource - TurntableMoveCtrlService turntableMoveCtrlService; - @Resource - TipOperationCtrlModule tipOperationCtrlModule; - @Resource - ExtApiPageMgr extApiPageMgr; - - Boolean autoDropTip = true; // 是否自动丢弃Tip - - // - // 液体操作 - // - public void takeTip() throws AppException { - tipOperationCtrlModule.tryTakeTip(); - } - - public void dropTip() throws AppException { - tipOperationCtrlModule.dropTip(); - } - - synchronized public void setAutoDropTip(Boolean autoDropTip) { - this.autoDropTip = autoDropTip; - } - - public void takeLargeBottleBufferLiquidToProbeSubstance(LargeBufferPos from, ConsumableGroup group, Integer index, Integer ul) throws AppException { - tryDropTip(); - PreReactionPos topos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, group, index); - liquidOperationCtrService.takeLargeBottleBufferLiquidToProbeSubstance(from, topos, ul); - } - - - public void pierceLittleBuffer(ConsumableGroup toGroup, Integer toIndex) throws AppException { - PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.BufferSolution, toGroup, toIndex); - liquidOperationCtrService.pierceThrough(pos); - } - - public void pierceProbeSubstance(ConsumableGroup toGroup, Integer toIndex) throws AppException { - PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, toGroup, toIndex); - liquidOperationCtrService.pierceThrough(pos); - } - - - public void dropLiquidToReactionPlate(IncubatorPos pos) throws AppException { - turntableMoveCtrlService.trunableMoveToDropLiquidPos(pos); - liquidOperationCtrService.dropLiquidToReactionPlate(true); - } - - public void takeSample(A8kSamplePos from, Integer ul) throws AppException { - tryDropTip(); - liquidOperationCtrService.takeSample(from, ul); - } - - public void dropSampleToProbeSubstance(ConsumableGroup toGroup, Integer toIndex) throws AppException { - PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, toGroup, toIndex); - liquidOperationCtrService.distributeSampleToPreReactionPos(pos, true, true); - } - - public void aspiratePreReactionLiquidFromProbeSubstance(ConsumableGroup fromGroup, Integer fromIndex) throws AppException { - PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, fromGroup, fromIndex); - liquidOperationCtrService.takePreReactionLiquid(pos, true); - } - - public void dropSampleToSmallBufferPos(ConsumableGroup toGroup, Integer toIndex) throws AppException { - PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, toGroup, toIndex); - liquidOperationCtrService.distributeSampleToPreReactionPos(pos, true, true); - } - - public void aspiratePreReactionLiquidFromSmallBufferPos(ConsumableGroup fromGroup, Integer fromIndex) throws AppException { - PreReactionPos pos = new PreReactionPos(LittleBottleConsumableType.ProbeSubstance, fromGroup, fromIndex); - liquidOperationCtrService.takePreReactionLiquid(pos, true); - } - - public void tryDropTip() { - if (autoDropTip) { - try { - if (tipOperationCtrlModule.isHasTipInGun()) - tipOperationCtrlModule.dropTip(); - } catch (AppException e) { - log.error("自动丢弃Tip失败", e); - } - - } - } - - - @PostConstruct - void init() { - ExtUIPageCfg cfg = extApiPageMgr.newPage(this); - cfg.newGroup("液体操作-通用"); - cfg.addFunction("取Tip", this::takeTip); - cfg.addFunction("丢Tip", this::dropTip); - cfg.addFunction("设置自动丢弃Tip", this::setAutoDropTip) - .setParamVal("autoDropTip", () -> autoDropTip); - cfg.newGroup("液体操作-大瓶缓冲液/探测物质"); - cfg.addFunction("刺破", this::pierceProbeSubstance); - cfg.addFunction("取大瓶缓冲液到探测物质位置", this::takeLargeBottleBufferLiquidToProbeSubstance); - cfg.addFunction("取样品", this::takeSample); - cfg.addFunction("放样品", this::dropSampleToProbeSubstance); - cfg.addFunction("取混合液", this::aspiratePreReactionLiquidFromProbeSubstance); - cfg.addFunction("滴入反应板", this::dropLiquidToReactionPlate); - cfg.newGroup("液体操作-小瓶缓冲液"); - cfg.addFunction("刺破", this::pierceLittleBuffer); - cfg.addFunction("取样品", this::takeSample); - cfg.addFunction("放样品", this::dropSampleToSmallBufferPos); - cfg.addFunction("取混合液", this::aspiratePreReactionLiquidFromSmallBufferPos); - cfg.addFunction("滴入反应板", this::dropLiquidToReactionPlate); - extApiPageMgr.addPage(cfg); - } - - -} diff --git a/src/main/java/a8k/extui/page/test/verification/P50VerificationScriptPage.java b/src/main/java/a8k/extui/page/test/verification/P50VerificationScriptPage.java deleted file mode 100644 index 8ae6722..0000000 --- a/src/main/java/a8k/extui/page/test/verification/P50VerificationScriptPage.java +++ /dev/null @@ -1,185 +0,0 @@ -package a8k.extui.page.test.verification; - -import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; -import a8k.app.service.ctrlmodule.TipOperationCtrlModule; -import a8k.app.type.a8k.A8kTubeHolderType; -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.a8k.pos.IncubatorPos; -import a8k.app.type.a8k.pos.TipGroupPos; -import a8k.app.type.exception.AppException; -import a8k.app.constant.AppConstant; -import a8k.app.service.lowerctrl.TubeFeedingCtrlService; -import a8k.app.service.lowerctrl.TubePreProcessModuleExCtrlService; -import a8k.app.service.lowerctrl.*; -import a8k.app.type.misc.TubeHolderScanResult; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - - -@Component -public class P50VerificationScriptPage { - - @Resource - TubeFeedingCtrlService tubeFeedingCtrlService; - - @Resource - TubePreProcessModuleExCtrlService tubePreProcessModuleExCtrlService; - - TubeHolderScanResult tubeHolderScanResult; - - - @Resource - PlateBoxCtrlService plateBoxCtrlService; - @Resource - OptScanModuleLowerCtrlService optScanModuleLowerCtrlService; - - - @Resource - PipetteCtrlDriverV2 pipetteCtrlDriver; - - - @Resource - HbotMoveExCtrlService hbotMoveExCtrlService; - - @Resource - TipOperationCtrlModule tipOperationCtrlModule; - - public void verifyTubePreProcess(A8kTubeHolderType expectTubeHolderType, Boolean expectTubeAltitude) throws AppException { - tubeFeedingCtrlService.enterTubeHolder(); - - tubeHolderScanResult = tubeFeedingCtrlService.enterAndScanTubeholder(); - if (tubeHolderScanResult == null) { - tubeFeedingCtrlService.ejectTubeHolder(); - throw AppException.ofAECodeError("扫描试管架失败"); - } - - A8kTubeHolderType scanTubeHolderType = A8kTubeHolderType.of(tubeHolderScanResult.tubeHolderType); - assert scanTubeHolderType != null; - if (!scanTubeHolderType.equals(expectTubeHolderType)) { - tubeFeedingCtrlService.ejectTubeHolder(); - throw AppException.ofAECodeError("扫描到的试管架类型与预期不符"); - } - if (!scanTubeHolderType.equals(A8kTubeHolderType.BloodTube)) { - tubeFeedingCtrlService.ejectTubeHolder(); - return; - } - - for (int i = 0; i < 10; i++) { - if (!tubeHolderScanResult.tube[i].isTubeExist) { - continue; - } - - if (tubeHolderScanResult.tube[i].isHighTube != expectTubeAltitude) { - tubeFeedingCtrlService.ejectTubeHolder(); - throw AppException.ofAECodeError("扫描到的试管高低与预期不符"); - } - } - - - //脱帽盖帽摇匀 - for (int i = 0; i < 10; i++) { - if (!tubeHolderScanResult.tube[i].isTubeExist) { - continue; - } - tubeFeedingCtrlService.moveTubeToPreProcessPos(i); - tubePreProcessModuleExCtrlService.takeTubeFromTubeholderToShakePos(tubeHolderScanResult.tube[i].isHighTube); - tubePreProcessModuleExCtrlService.shakeTube(45, 5); - tubePreProcessModuleExCtrlService.takeTubeCap(); - tubePreProcessModuleExCtrlService.putbakTubeCapAndPutbakTubeToTubeHolder(); - } - - } - - private void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { - plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); - optScanModuleLowerCtrlService.pullPlate(incubatorPos); - optScanModuleLowerCtrlService.dropPlate(); - } - - public void verifyPlateTransmit() throws AppException { - pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE02); - pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE03); - pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE04); - pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE05); - pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE06); - - pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE07); - pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE08); - pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE09); - pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE10); - pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE11); - pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE12); - - pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE13); - pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE14); - pushOneAndRemove(ConsumableGroup.CG3, IncubatorPos.SPACE15); - pushOneAndRemove(ConsumableGroup.CG4, IncubatorPos.SPACE16); - pushOneAndRemove(ConsumableGroup.CG5, IncubatorPos.SPACE17); - pushOneAndRemove(ConsumableGroup.CG6, IncubatorPos.SPACE18); - - pushOneAndRemove(ConsumableGroup.CG1, IncubatorPos.SPACE19); - pushOneAndRemove(ConsumableGroup.CG2, IncubatorPos.SPACE20); - } - - public void verifyTakeTip(TipGroupPos tipGroupPos) throws AppException { - pipetteCtrlDriver.zMotorMoveZeroBlock(); - for (int i = 0; i < AppConstant.TIP_NUM; i++) { - tipOperationCtrlModule.testTakeTip(tipGroupPos, i); - // if (checkStopFlag()) - // return; - } - } - - public void verifyLittleBSPierceAndSamplePos(ConsumableGroup group) throws AppException { - for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { - hbotMoveExCtrlService.moveToLittleBufferPiercePos(group, i); - hbotMoveExCtrlService.moveToLittleBufferContainerPos(group, i); - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - // if (checkStopFlag()) - // break; - } - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - } - - public void verifyProbeSubstancePierceAndSamplePos(ConsumableGroup group) throws AppException { - for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { - hbotMoveExCtrlService.moveToProbeSubstanceContainerPos(group, i); - hbotMoveExCtrlService.moveToProbeSubstancePiercePos(group, i); - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - // if (checkStopFlag()) - // break; - } - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - } - - public void verifyLargeBSSamplePos() throws AppException { - pipetteCtrlDriver.zMotorMoveZeroBlock(); - for (ConsumableGroup group : ConsumableGroup.values()) { - hbotMoveExCtrlService.moveToLargeBSContainerPos(group); - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - // if (checkStopFlag()) - // break; - } - } - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - - page.addFunction("验证试管预处理", this::verifyTubePreProcess); - page.addFunction("验证反应板传输", this::verifyPlateTransmit); - page.addFunction("验证取Tip", this::verifyTakeTip); - page.addFunction("验证小瓶缓冲液穿刺和取样位置", this::verifyLittleBSPierceAndSamplePos); - page.addFunction("验证探测物质穿刺和取样位置", this::verifyProbeSubstancePierceAndSamplePos); - page.addFunction("验证大瓶缓冲液取样位置", this::verifyLargeBSSamplePos); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f4b7fac..e988c21 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,17 +1,17 @@ #WEB虚拟后端 -#server.port: 80 -#iflytophald.ip: 127.0.0.1 -#iflytophald.enable: false -#device.runmode: "VirtualStateGenerateMode" -#lis.enable: false - -#PC调试 server.port: 80 -device.runmode: "RealMode" -iflytophald.ip: 192.168.8.10 -iflytophald.enable: true +iflytophald.ip: 127.0.0.1 +iflytophald.enable: false +device.runmode: "VirtualStateGenerateMode" lis.enable: false +#PC调试 +#server.port: 80 +#device.runmode: "RealMode" +#iflytophald.ip: 192.168.8.10 +#iflytophald.enable: true +#lis.enable: false + #硬件测试 #server.port: 8082 #iflytophald.ip: 192.168.8.10