From 3264f13705cfbf81b30265baa2e299a456fbe9b2 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 16 Apr 2025 21:56:47 +0800 Subject: [PATCH] update --- .../a8k/app/hardware/driver/CodeScanerDriver.java | 32 ++- .../lowerctrl/ConsumablesScanCtrlService.java | 43 +--- .../service/lowerctrl/HbotMoveExCtrlService.java | 58 +++-- .../service/lowerctrl/TubeFeedingCtrlService.java | 3 +- .../param/hbotpos/Hbot2DCodeScanParamMgr.java | 66 +++-- .../param/hbotpos/HbotLargeBottleBSPosMgr.java | 14 +- .../app/type/param/hbotpos/Hbot2DCodeScanPos.java | 7 +- .../type/param/hbotpos/HbotLargeBottleBSPos.java | 3 +- .../app/type/param/hbotpos/HbotLittleBSPos.java | 4 + .../java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java | 3 +- .../page/driver/CodeScanerDriverCtrlPage.java | 66 +++++ .../java/a8k/extui/page/driver/HbotCtrlPage.java | 172 +++++++++++++ .../extui/page/driver/InputIOStateScannerPage.java | 80 ++++++ .../driver/LowLevelBoardVersionPreviewPage.java | 281 +++++++++++++++++++++ .../a8k/extui/page/driver/MiniServoCtrlPage.java | 115 +++++++++ .../java/a8k/extui/page/driver/MotorCtrlPage.java | 212 ++++++++++++++++ .../extui/page/driver/OutputIOCtrlDebugPage.java | 28 ++ .../extui/page/driver/PipetteCtrlDriverPage.java | 48 ++++ .../extui/page/driver/PipetteMotorCtrlPage.java | 182 +++++++++++++ .../P24Hbot2DCodeScanPosCalibrationPage.java | 28 +- .../extui/page/measurement/HbotPosMeasurePage.java | 23 +- .../page/test/driver/CodeScanerDriverCtrlPage.java | 44 ---- .../page/test/driver/InputIOStateScannerPage.java | 80 ------ .../driver/LowLevelBoardVersionPreviewPage.java | 281 --------------------- .../extui/page/test/driver/MiniServoCtrlPage.java | 115 --------- .../a8k/extui/page/test/driver/MotorCtrlPage.java | 212 ---------------- .../page/test/driver/OutputIOCtrlDebugPage.java | 28 -- .../page/test/driver/PipetteCtrlDriverPage.java | 48 ---- .../page/test/driver/PipetteMotorCtrlPage.java | 188 -------------- .../HbotCodeScanPosVerificationPage.java | 71 ++++++ 30 files changed, 1451 insertions(+), 1084 deletions(-) create mode 100644 src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java create mode 100644 src/main/java/a8k/extui/page/driver/HbotCtrlPage.java create mode 100644 src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java create mode 100644 src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java create mode 100644 src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java create mode 100644 src/main/java/a8k/extui/page/driver/MotorCtrlPage.java create mode 100644 src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java create mode 100644 src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java create mode 100644 src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/CodeScanerDriverCtrlPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java delete mode 100644 src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java create mode 100644 src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java diff --git a/src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java b/src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java index 9ca48aa..59ce537 100644 --- a/src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java +++ b/src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java @@ -30,6 +30,14 @@ public class CodeScanerDriver { return pipetteModCodeScannerScanCode(300); } + public void pipetteModCodeScannerStartScan() throws AppException { + codeScanerStartScan(MId.PipetteModCodeScanner); + } + + public void pipetteModCodeScannerStopScan() throws AppException { + codeScanerStopScan(MId.PipetteModCodeScanner); + } + public String feedingModScannerModCodeScannerScanCode(Integer waittime) { try { @@ -42,27 +50,26 @@ public class CodeScanerDriver { } } - - public void codeScanerStartScan(MId id) throws AppException { - canBus.callcmd(id, CmdId.code_scaner_start_scan); + public void feedingModScannerModCodeScannerStartScan() throws AppException { + codeScanerStartScan(MId.FeedingModScannerMod); } - public void codeScanerStopScan(MId id) throws AppException { - canBus.callcmd(id, CmdId.code_scaner_stop_scan); + public void feedingModScannerModCodeScannerStopScan() throws AppException { + codeScanerStopScan(MId.FeedingModScannerMod); } - public String codeScanerReadScanerResult(MId id) throws AppException { + private String codeScanerReadScanerResult(MId id) throws AppException { A8kPacket ack = canBus.callcmd(id, CmdId.code_scaner_read_scaner_result); var contentBytes = ack.getCmdContent(); return new String(contentBytes); } - public Boolean codeScanerResultIsReady(MId id) throws AppException { + private Boolean codeScanerResultIsReady(MId id) throws AppException { var packet = canBus.callcmd(id, CmdId.code_scaner_result_is_ready); return packet.getContentI32(0) != 0; } - public String codeScanerWaittingForResult(MId mid, Integer acitionOvertime) throws AppException { + private String codeScanerWaittingForResult(MId mid, Integer acitionOvertime) throws AppException { long startedAt = System.currentTimeMillis(); do { if (codeScanerResultIsReady(mid)) @@ -78,4 +85,13 @@ public class CodeScanerDriver { return codeScanerReadScanerResult(mid); } + + private void codeScanerStartScan(MId id) throws AppException { + canBus.callcmd(id, CmdId.code_scaner_start_scan); + } + + private void codeScanerStopScan(MId id) throws AppException { + canBus.callcmd(id, CmdId.code_scaner_stop_scan); + } } + diff --git a/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java index 37f070d..7276b1f 100644 --- a/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java @@ -8,12 +8,14 @@ import a8k.app.type.exception.AppException; import a8k.app.utils.DoAction; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component +@RequiredArgsConstructor public class ConsumablesScanCtrlService { public static class ConsumableOneChRawResult { @@ -32,14 +34,10 @@ public class ConsumablesScanCtrlService { } } - @Resource - VirtualDevice virtualDevice; - @Resource - Hbot2DCodeScanParamMgr hbotScanPos; - @Resource - CodeScanerDriver codeScaner; - @Resource - HbotMoveCtrlService hbot; + + private final VirtualDevice virtualDevice; + private final CodeScanerDriver codeScaner; + private final HbotMoveExCtrlService hbotMoveExCtrlService; // // VIRTUAL @@ -82,7 +80,7 @@ public class ConsumablesScanCtrlService { larBSScanResult[i] = virtualDevice.isEnable() ? virtualLarBSScanResult[i] : scanLarBS(i); } - DoAction.doIt("扫描耗材", () -> hbotMoveTo(new Pos2d(0, 0))); + DoAction.doIt("扫描耗材", hbotMoveExCtrlService::moveQuickToZero); for (int i = 0; i < 6; i++) { @@ -101,34 +99,19 @@ public class ConsumablesScanCtrlService { } - // - // PRIVATE - // - private void hbotMoveTo(Pos2d tpos) throws AppException { - hbot.hbotMoveTo(tpos); - } - - private String scan2dCode() throws AppException { - return codeScaner.pipetteModCodeScannerScanCode(); - } - public String scanPB(int ch) throws AppException { - Pos2d pos = hbotScanPos.getPBScanPosX(ch); - hbotMoveTo(pos); - return scan2dCode(); - + hbotMoveExCtrlService.moveToPBCodeScanPos(ch); + return codeScaner.pipetteModCodeScannerScanCode(); } public String scanLittBS(int ch) throws AppException { - Pos2d pos = hbotScanPos.getLittBSX(ch); - hbotMoveTo(pos); - return scan2dCode(); + hbotMoveExCtrlService.moveToLittleBSCodeScanPos(ch); + return codeScaner.pipetteModCodeScannerScanCode(); } public String scanLarBS(int ch) throws AppException { - Pos2d pos = hbotScanPos.getLarBSX(ch); - hbotMoveTo(pos); - return scan2dCode(); + hbotMoveExCtrlService.moveToLargeBSCodeScanPos(ch); + return codeScaner.pipetteModCodeScannerScanCode(); } diff --git a/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java index 0e2a37d..1a50dd9 100644 --- a/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java @@ -1,5 +1,6 @@ package a8k.app.service.lowerctrl; +import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr; import a8k.app.type.a8k.ConsumableGroup; import a8k.app.type.a8k.pos.TipGroupPos; import a8k.app.type.a8k.pos.TipPos; @@ -19,32 +20,28 @@ import a8k.app.type.param.hbotpos.HbotSamplePos; import a8k.app.type.exception.AppException; import a8k.app.service.utils.ZAppChecker; import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.Assert; @Slf4j @Component +@RequiredArgsConstructor public class HbotMoveExCtrlService { - @Resource - HbotFixedPosParamMgr hbotFixedPosParamMgr; - @Resource - HbotSamplePosParamMgr hbotSamplePosParamMgr; - @Resource - HbotConsumableExParamMgr hbotConsumableExParamMgr; - @Resource - HbotTipPosMgr hbotTipPosMgr; - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotMoveCtrlService hbotMoveCtrlService; - @Resource - HbotDriver hbotDriver; - - @Resource - ZAppChecker checker; + + private final HbotFixedPosParamMgr hbotFixedPosParamMgr; + private final HbotSamplePosParamMgr hbotSamplePosParamMgr; + private final HbotConsumableExParamMgr hbotConsumableExParamMgr; + private final HbotTipPosMgr hbotTipPosMgr; + private final Hbot2DCodeScanParamMgr hbot2DCodeScanParamMgr; + + private final PipetteCtrlDriver pipetteCtrlDriver; + private final HbotMoveCtrlService hbotMoveCtrlService; + private final HbotDriver hbotDriver; + + private final ZAppChecker checker; public void checkTipIndex(TipGroupPos tipGroupPos, Integer index) throws AppException { if (index >= AppConstant.TIP_NUM) { @@ -91,7 +88,7 @@ public class HbotMoveExCtrlService { pipetteCtrlDriver.zMotorMoveByBlock(-100); Boolean isHasTip = pipetteCtrlDriver.isHasTip(); - pipetteCtrlDriver.pipetteInitDeviceBlock(); //相当于丢弃tip + pipetteCtrlDriver.pipetteInitDeviceBlock(); //相当于丢弃tip pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); return isHasTip; @@ -245,6 +242,29 @@ public class HbotMoveExCtrlService { hbotMoveCtrlService.hbotMoveTo(topos); } + public void moveToPBCodeScanPos(Integer groupoff) throws AppException { + hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getPBScanPosX(groupoff)); + } + + public void moveToLittleBSCodeScanPos(Integer groupoff) throws AppException { + hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLittBSX(groupoff)); + } + + public void moveToLargeBSCodeScanPos(Integer groupoff) throws AppException { + hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLarBSX(groupoff)); + } + + public void moveToPBCodeScanPos(ConsumableGroup group) throws AppException { + hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getPBScanPosX(group.off)); + } + + public void moveToLittleBSCodeScanPos(ConsumableGroup group) throws AppException { + hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLittBSX(group.off)); + } + + public void moveToLargeBSCodeScanPos(ConsumableGroup group) throws AppException { + hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLarBSX(group.off)); + } public void moveQuickToZero() throws AppException { log.info("Hbot快速归零"); diff --git a/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java index 6a440cb..9b6450f 100644 --- a/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java @@ -191,8 +191,7 @@ public class TubeFeedingCtrlService { moveTubeRackToScanPos(); tubeFeedingExCtrlService.scanClampModClamp(); - codeScaner.codeScanerStartScan(MId.FeedingModScannerMod); - result = codeScaner.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000); + result = codeScaner.feedingModScannerModCodeScannerScanCode(1000); tubeFeedingExCtrlService.scanClampModRelease(); if (result == null || result.isEmpty()) { return ""; diff --git a/src/main/java/a8k/app/service/param/hbotpos/Hbot2DCodeScanParamMgr.java b/src/main/java/a8k/app/service/param/hbotpos/Hbot2DCodeScanParamMgr.java index 14bc54a..05a0fef 100644 --- a/src/main/java/a8k/app/service/param/hbotpos/Hbot2DCodeScanParamMgr.java +++ b/src/main/java/a8k/app/service/param/hbotpos/Hbot2DCodeScanParamMgr.java @@ -4,23 +4,17 @@ import a8k.app.service.param.base.ParamMgr; import a8k.app.type.param.hbotpos.Hbot2DCodeScanPos; import a8k.app.type.a8k.Pos2d; import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * HBOT二维码扫描坐标参数 */ @Component +@RequiredArgsConstructor +@Slf4j public class Hbot2DCodeScanParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(Hbot2DCodeScanParamMgr.class); - - @Resource - HbotLittleBSPosMgr hbotLittleBSPosMgr; - - @Resource - HbotLargeBottleBSPosMgr largeBottleBSPosMgr; @PostConstruct @@ -28,7 +22,11 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr { for (Hbot2DCodeScanPos pos : Hbot2DCodeScanPos.values()) { initParam(pos, pos.chName, pos.type); } - initParam(Hbot2DCodeScanPos.PBDY, Hbot2DCodeScanPos.PBDY.chName, Hbot2DCodeScanPos.PBDY.type, 265.0); + initParam(Hbot2DCodeScanPos.PBQRCodeDY, Hbot2DCodeScanPos.PBQRCodeDY.chName, Hbot2DCodeScanPos.PBQRCodeDY.type, 2650.0); + initParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, Hbot2DCodeScanPos.LargeBSQRCodeDX.chName, Hbot2DCodeScanPos.LargeBSQRCodeDX.type, 2650.0); + initParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, Hbot2DCodeScanPos.LargeBSQRCodeDY.chName, Hbot2DCodeScanPos.LargeBSQRCodeDY.type, 2650.0); + initParam(Hbot2DCodeScanPos.LittleBQRCodeDX, Hbot2DCodeScanPos.LittleBQRCodeDX.chName, Hbot2DCodeScanPos.LittleBQRCodeDX.type, 12300.0); + initParam(Hbot2DCodeScanPos.LittleBQRCodeDY, Hbot2DCodeScanPos.LittleBQRCodeDY.chName, Hbot2DCodeScanPos.LittleBQRCodeDY.type, 12540.0); for (int i = 0; i < 6; i++) { getPBScanPosX(i); getLittBSX(i); @@ -40,10 +38,44 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr { setParam(Hbot2DCodeScanPos.PBScanPos0, pos); } + public void setPBDY(Double dy) { + setParam(Hbot2DCodeScanPos.PBQRCodeDY, dy); + } + + public Double getPBDY() { + return getParam(Hbot2DCodeScanPos.PBQRCodeDY, Double.class); + } + public void setLittBSX(Pos2d pos) { setParam(Hbot2DCodeScanPos.LittBS0, pos); } + public void setLittleBQRCodeDxAndDy(Double dx, Double dy) { + setParam(Hbot2DCodeScanPos.LittleBQRCodeDX, dx); + setParam(Hbot2DCodeScanPos.LittleBQRCodeDY, dy); + } + + public Double getLittleBQRCodeDX() { + return getParam(Hbot2DCodeScanPos.LittleBQRCodeDX, Double.class); + } + + public Double getLittleBQRCodeDY() { + return getParam(Hbot2DCodeScanPos.LittleBQRCodeDY, Double.class); + } + + public void setLargeBSQRCodeDxAndDy(Double dx, Double dy) { + setParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, dx); + setParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, dy); + } + + public Double getLargeBSQRCodeDX() { + return getParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, Double.class); + } + + public Double getLargeBSQRCodeDY() { + return getParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, Double.class); + } + public void setLarBSX(Pos2d pos) { setParam(Hbot2DCodeScanPos.LarBS0, pos); } @@ -53,7 +85,7 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr { if (pos == null) { return null; } - Double dy = getParam(Hbot2DCodeScanPos.PBDY, Double.class); + Double dy = getParam(Hbot2DCodeScanPos.PBQRCodeDY, Double.class); pos.y = (int) (pos.y + dy * channel); @@ -67,10 +99,12 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr { if (pos == null) { return null; } - pos.x = (int) (pos.x + xoff * hbotLittleBSPosMgr.getGroupDX()); - pos.y = (int) (pos.y + yoff * hbotLittleBSPosMgr.getGroupDY()); + pos.x = (int) (pos.x + xoff * getParam(Hbot2DCodeScanPos.LittleBQRCodeDX, Double.class)); + pos.y = (int) (pos.y + yoff * getParam(Hbot2DCodeScanPos.LittleBQRCodeDY, Double.class)); return pos; } + // LargeBufferScanPos_DX("大瓶缓冲液的扫码位置dx", Double.class), + // LargeBufferScanPos_DY("大瓶缓冲液的扫码位置dy", Double.class), public Pos2d getLarBSX(Integer X) { @@ -80,8 +114,8 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr { if (pos == null) { return null; } - pos.x = (int) (pos.x + xoff * largeBottleBSPosMgr.getLargeBufferScanPosDx()); - pos.y = (int) (pos.y + yoff * largeBottleBSPosMgr.getLargeBufferScanPosDy()); + pos.x = (int) (pos.x + xoff * getParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, Double.class)); + pos.y = (int) (pos.y + yoff * getParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, Double.class)); return pos; } diff --git a/src/main/java/a8k/app/service/param/hbotpos/HbotLargeBottleBSPosMgr.java b/src/main/java/a8k/app/service/param/hbotpos/HbotLargeBottleBSPosMgr.java index 6b539be..16230a0 100644 --- a/src/main/java/a8k/app/service/param/hbotpos/HbotLargeBottleBSPosMgr.java +++ b/src/main/java/a8k/app/service/param/hbotpos/HbotLargeBottleBSPosMgr.java @@ -68,11 +68,11 @@ public class HbotLargeBottleBSPosMgr extends ParamMgr { var.z = getParam(HbotLargeBottleBSPos.LargeBottleBufferBottomZAxisPos, Double.class).intValue(); return var; } - public Double getLargeBufferScanPosDx() { - return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DX, Double.class); - } - - public Double getLargeBufferScanPosDy() { - return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DY, Double.class); - } +// public Double getLargeBufferScanPosDx() { +// return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DX, Double.class); +// } +// +// public Double getLargeBufferScanPosDy() { +// return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DY, Double.class); +// } } diff --git a/src/main/java/a8k/app/type/param/hbotpos/Hbot2DCodeScanPos.java b/src/main/java/a8k/app/type/param/hbotpos/Hbot2DCodeScanPos.java index 2807a79..ea3ee1b 100644 --- a/src/main/java/a8k/app/type/param/hbotpos/Hbot2DCodeScanPos.java +++ b/src/main/java/a8k/app/type/param/hbotpos/Hbot2DCodeScanPos.java @@ -7,7 +7,12 @@ public enum Hbot2DCodeScanPos { LittBS0("小缓冲液扫码位置0", Pos2d.class), LarBS0("大缓冲液扫码位置0", Pos2d.class), - PBDY("板夹仓扫码位置Y", Double.class), + PBQRCodeDY("板夹仓扫码GROUP间距", Double.class), + LargeBSQRCodeDX("大瓶缓冲液的扫码GROUP间距", Double.class), + LargeBSQRCodeDY("大瓶缓冲液的扫码GROUP间距", Double.class), + + LittleBQRCodeDX("小瓶缓冲液的GROUP间距", Double.class), + LittleBQRCodeDY("小瓶缓冲液的GROUP间距", Double.class), ; public final String chName; diff --git a/src/main/java/a8k/app/type/param/hbotpos/HbotLargeBottleBSPos.java b/src/main/java/a8k/app/type/param/hbotpos/HbotLargeBottleBSPos.java index 3a06160..322c5be 100644 --- a/src/main/java/a8k/app/type/param/hbotpos/HbotLargeBottleBSPos.java +++ b/src/main/java/a8k/app/type/param/hbotpos/HbotLargeBottleBSPos.java @@ -7,8 +7,7 @@ public enum HbotLargeBottleBSPos { LargeBuffer_0Pos("大瓶缓冲液的第1个位置", Pos2d.class), LargeBuffer_DX("大瓶缓冲液的X间距", Double.class), LargeBuffer_DY("大瓶缓冲液的Y间距", Double.class), - LargeBufferScanPos_DX("大瓶缓冲液的扫码位置dx", Double.class), - LargeBufferScanPos_DY("大瓶缓冲液的扫码位置dy", Double.class), + LargeBottleBufferLLDStartZAxisPos("大瓶缓冲液LLD起始Z轴坐标", Double.class), LargeBottleBufferBottomZAxisPos("大瓶缓冲液瓶底Z轴坐标", Double.class), diff --git a/src/main/java/a8k/app/type/param/hbotpos/HbotLittleBSPos.java b/src/main/java/a8k/app/type/param/hbotpos/HbotLittleBSPos.java index 9fd8aec..051f836 100644 --- a/src/main/java/a8k/app/type/param/hbotpos/HbotLittleBSPos.java +++ b/src/main/java/a8k/app/type/param/hbotpos/HbotLittleBSPos.java @@ -1,3 +1,7 @@ + + + + package a8k.app.type.param.hbotpos; import a8k.app.type.a8k.Pos2d; diff --git a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java index d62dcb6..4f31332 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java +++ b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java @@ -2,6 +2,7 @@ package a8k.extui.mgr; import a8k.app.utils.ZList; import a8k.extui.page.debug.*; +import a8k.extui.page.driver.*; import a8k.extui.page.extapp.*; import a8k.extui.page.extapp.debug_assistant.IDCardDataGeneratorPage; import a8k.extui.page.extsetting.db.A8kSubModuleParameterInitDebugPage; @@ -10,7 +11,6 @@ import a8k.extui.page.extsetting.db.ProjInfoMgrPage; import a8k.extui.page.extsetting.db.ReactionRecordMgrDebugPage; import a8k.extui.page.init.DeviceInitPage; import a8k.extui.page.measurement.*; -import a8k.extui.page.test.driver.*; import a8k.extui.page.test.codetest.OptFormulaTestPage; import a8k.extui.page.test.codetest.OptFormulaTestPageV2; @@ -156,6 +156,7 @@ public class ExtApiPageGroupCfgMgr { new Menu(P32HbotPosVerificationPage.class, "单步-HBOT位置"), new Menu(P33HbotSamplePosVerificationPage.class, "单步-取样品位置"), new Menu(P34LiquidOperationTestPage.class, "单步-液体操作"), + new Menu(HbotCodeScanPosVerificationPage.class, "单步-HBOT扫码"), new Menu(P50VerificationScriptPage.class, "脚本-模块验证"), new Menu(P51FullFlowVerificationPage.class, "脚本-全流程验证") )), diff --git a/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java b/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java new file mode 100644 index 0000000..6a07ef9 --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java @@ -0,0 +1,66 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.CodeScanerDriver; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CodeScanerDriverCtrlPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private CodeScanerDriver codeScanerDriver; + + public String pipetteModCodeScannerScanCode() throws AppException { + var ret = codeScanerDriver.pipetteModCodeScannerScanCode(10 * 1000); + if (ret == null || ret.isEmpty()) { + return "null"; + } + return ret; + } + + public void pipetteGunStartScan() throws AppException { + codeScanerDriver.pipetteModCodeScannerStartScan(); + } + + public void pipetteGunStopScan() throws AppException { + codeScanerDriver.pipetteModCodeScannerStopScan(); + } + + public String feedingModScannerModCodeScannerScanCode() { + var ret = codeScanerDriver.feedingModScannerModCodeScannerScanCode(10 * 1000); + if (ret == null || ret.isEmpty()) { + return "null"; + } + return ret; + } + + public void feedingModScannerModCodeScannerStartScan() throws AppException { + codeScanerDriver.feedingModScannerModCodeScannerStartScan(); + } + + public void feedingModScannerModCodeScannerStopScan() throws AppException { + codeScanerDriver.feedingModScannerModCodeScannerStopScan(); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("Z轴扫码器"); + page.addFunction("扫码(阻塞)", this::pipetteModCodeScannerScanCode); + page.addFunction("扫码开始", this::pipetteGunStartScan); + page.addFunction("扫码停止", this::pipetteGunStopScan); + + page.newGroup("进出料扫描"); + page.addFunction("扫码(阻塞)", this::feedingModScannerModCodeScannerScanCode); + page.addFunction("扫码开始", this::feedingModScannerModCodeScannerStartScan); + page.addFunction("扫码停止", this::feedingModScannerModCodeScannerStopScan); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/driver/HbotCtrlPage.java b/src/main/java/a8k/extui/page/driver/HbotCtrlPage.java new file mode 100644 index 0000000..e495611 --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/HbotCtrlPage.java @@ -0,0 +1,172 @@ +package a8k.extui.page.driver; + +import a8k.app.constant.GearBacklashConstant; +import a8k.app.hardware.driver.HbotDriver; +import a8k.app.hardware.driver.PipetteCtrlDriver; +import a8k.app.hardware.type.PipetteRegIndex; +import a8k.app.type.a8k.Pos2d; +import a8k.app.type.a8k.Pos3d; +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 HbotCtrlPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final HbotDriver hbotDriver; + private final PipetteCtrlDriver pipetteCtrlDriver; + + @ExtApiStatu(group = "Hbot当前坐标") + public Pos3d readPos() throws AppException { + Pos3d pos = new Pos3d(); + pos.x = hbotDriver.readPos().x; + pos.y = hbotDriver.readPos().y; + pos.z = pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos); + return pos; + } + + Integer moveByDistance = 100; + Integer zMotorMoveByDistance = 10; + + @ExtApiStatu(group = "HBOT相对移动距离") + public Integer getMoveByDistance() { + return moveByDistance; + } + + @ExtApiStatu(group = "Z轴相对移动距离") + public Integer getZMotorMoveByDistance() { + return zMotorMoveByDistance; + } + + public void moveBy(Integer dx, Integer dy) throws AppException { + hbotDriver.enable(1); + pipetteCtrlDriver.zMotorEnable(1); + Pos2d pos = hbotDriver.readPos(); + pos.x += dx; + pos.y += dy; + hbotDriver.moveToBlock(pos.x - GearBacklashConstant.HBOT_GEAR_BACKLASH, pos.y); + hbotDriver.moveToBlock(pos.x, pos.y); + } + + public void moveTo(Integer x, Integer y) throws AppException { + hbotDriver.enable(1); + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.moveToBlock(x - GearBacklashConstant.HBOT_GEAR_BACKLASH, y); + hbotDriver.moveToBlock(x, y); + } + + public void zMotorMoveTo(Integer z) throws AppException { + pipetteCtrlDriver.zMotorMoveToBlock(z); + } + + void zMotorMoveBy(Integer dz) throws AppException { + pipetteCtrlDriver.zMotorMoveByBlock(dz); + } + + + synchronized public void setMoveByDistance(Integer distance) { + moveByDistance = distance; + } + + synchronized public void setzMotorMoveByDistance(Integer distance) { + zMotorMoveByDistance = distance; + } + + + synchronized public void mveoToZero() throws AppException { + hbotDriver.enable(1); + pipetteCtrlDriver.zMotorEnable(1); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + public void moveBackward() throws AppException { + moveBy(0, -moveByDistance); + } + + public void moveForward() throws AppException { + moveBy(0, moveByDistance); + } + + public void moveLeft() throws AppException { + moveBy(-moveByDistance, 0); + } + + public void moveRight() throws AppException { + moveBy(moveByDistance, 0); + } + + public void zmoveUp() throws AppException { + zMotorMoveBy(-zMotorMoveByDistance); + } + + public void zmoveDown() throws AppException { + zMotorMoveBy(zMotorMoveByDistance); + } + + + public Pos3d measurementCurrentPos() throws AppException { + pipetteCtrlDriver.zMotorMeasureDistance(); + Pos3d pos = new Pos3d(); + pos.z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); + pos.x = hbotDriver.readPos().x; + pos.y = hbotDriver.readPos().y; + return pos; + } + + public void measurementMoveTo(Integer x, Integer y, Integer z) throws AppException { + hbotDriver.enable(1); + pipetteCtrlDriver.zMotorEnable(1); + pipetteCtrlDriver.zMotorMoveToBlock(0); + hbotDriver.moveToBlock(x - GearBacklashConstant.HBOT_GEAR_BACKLASH, y); + hbotDriver.moveToBlock(x, y); + pipetteCtrlDriver.zMotorMoveToBlock(z); + } + + public Pos3d readPosNoEx() { + try { + return readPos(); + } catch (AppException e) { + log.error("readPosNoEx error", e); + return new Pos3d(); + } + } + + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础"); + page.addFunction("归零", this::mveoToZero); + + page.newGroup("Hbot"); + page.addFunction("设置相对移动距离", this::setMoveByDistance).setParamVal("distance", () -> moveByDistance); + page.addFunction("前(向人移动)", this::moveForward); + page.addFunction("后", this::moveBackward); + page.addFunction("左", this::moveLeft); + page.addFunction("右", this::moveRight); + page.addFunction("移动到", this::moveTo).setParamVal("x", 0).setParamVal("y", 0); + + page.newGroup("Z轴"); + page.addFunction("设置Z轴相对移动距离", this::setzMotorMoveByDistance).setParamVal("distance", () -> zMotorMoveByDistance); + page.addFunction("上", this::zmoveUp); + page.addFunction("下", this::zmoveDown); + page.addFunction("移动到", this::zMotorMoveTo).setParamVal("z", 0); + + page.newGroup("移动到"); + page.addFunction("移动到", this::measurementMoveTo); + page.addFunction("移动到", this::measurementMoveTo); + page.addFunction("移动到", this::measurementMoveTo).setParamVal("x", readPosNoEx().x).setParamVal("y", readPosNoEx().y).setParamVal("z", readPosNoEx().z); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java b/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java new file mode 100644 index 0000000..65ab388 --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java @@ -0,0 +1,80 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.InputDetectDriver; +import a8k.app.hardware.type.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 InputIOStateScannerPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private InputDetectDriver inputDetectDriver; + + // @ExtApiStatu(name = "", group = "输入光电状态", order = 5) + // public Object getIOState() throws AppException { + // a8kCanBusService.getIOState(IOId.PusherMZeroPPS); + // ZJsonNode node = new ZJsonNode(); + // node.get("Input-IO").setAsArray(); + // + // for (IOId ioId : IOId.values()) { + // ZJsonNode iostate = new ZJsonNode(); + // iostate.get("chname").set(ioId.chname); + // iostate.get("value").set(a8kCanBusService.getIOState(ioId)); + // node.get("Input-IO").push(iostate); + // } + // return node.get(); + // } + + @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 = "板夹仓-仓门光电", 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.PlateBoxPlateStuckPPS);} + + @ExtApiStatu(name = "光学模组-拉杆电机-零点光电", order = 10) + public Boolean getPullerMZeroPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PullerMZeroPPS);} + + @ExtApiStatu(name = "光学模组-拉杆电机-限位光电", order = 11) + public Boolean getPullerMEndPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PullerMEndPPS);} + + @ExtApiStatu(name = "推杆电机-零点光电", order = 12) + public Boolean getPusherMZeroPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PusherMZeroPPS);} + + @ExtApiStatu(name = "推杆电机-终点光电", order = 13) + public Boolean getPusherMEndPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PusherMEndPPS);} + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java b/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java new file mode 100644 index 0000000..eb12ca5 --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java @@ -0,0 +1,281 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.channel.A8kCanBusService; +import a8k.app.hardware.type.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 LowLevelBoardVersionPreviewPage { + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @Resource + A8kCanBusService canBus; + + public static class VersionInfo { + public Integer moduleId; + public String moduleName; + public Boolean online; + public String moduleType; + public Integer version; + } + + Map versionInfos = new HashMap<>(); + // HbotBoard(10, "机械臂板模块"),// + // HbotM(11, "机械臂XY"),// + // PlatesBoxBoard(20, "板夹仓模块"),// + // PlatesBoxYM(21, "板夹仓移动电机"),// + // PlatesBoxPusherM(22, "板夹仓推杆电机"),// + // PlatesBoxScanner(23, "板夹仓扫码模组"),// + // ShakeModBoard(30, "摇匀模组板"),// + // ShakeModClampingM(31, "试管固定夹爪电机"),// + // ShakeModGripperZM(32, "摇匀升降电机"),// + // ShakeModShakeM(33, "试管摇匀电机"),// + // ShakeModGripperYSV(34, "摇匀前后移动舵机"),// + // ShakeModGripperSV(35, "摇匀试管帽夹爪舵机"),// + // ShakeModTubeScanerClampingSV(36, "试管架扫码夹紧舵机"),// + // ShakeModTubeScanerRotateSV(37, "试管架旋转舵机"),// + // PlatesBoxTCMBoard(40, "反应板夹温度控制板"),// + // PlatesBoxTCM(41, "反应板夹温度控制模块"),// + // WbTubeFanMod(42, "气溶胶风扇"),// + // IncubatorTCMBoard(50, "温度控制"),// + // IncubatorTCM(51, "温度控制"),// + // FeedingModBoard(60, "出入料模块"),// + // FeedingModInfeedM(61, "入料电机"),// + // FeedingModXM(62, "试管架平移电机"),// + // FeedingModOutfeedM(63, "出料电机"),// + // FeedingModScannerMod(64, "试管架扫码器"),// + // IncubatorRotateBoard(70, "孵育盘旋转板"),// + // IncubatorRotateCtrlM(71, "孵育盘旋转"),// + // PipetteModBoard(80, "机械臂Z轴板"),// + // PipetteMod(82, "移液枪"),// + // PipetteModCodeScanner(83, "物料扫码器"),// + // OptModBoard(90, "光学模组板"),// + // OptModScannerM(91, "板卡扫描电机"),// + // OptModPullM(92, "板卡推杆电机"),// + // OptMod(93, "扫描仪"),// + // A8kIdCardReaderBoard(100, "A8K读卡器板"),// + // A8kIdCardReader(101, "A8K读卡器"),// + + @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/driver/MiniServoCtrlPage.java b/src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java new file mode 100644 index 0000000..47fdcef --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java @@ -0,0 +1,115 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.MiniServoDriver; +import a8k.app.hardware.type.MiniServoMId; +import a8k.app.hardware.type.MiniServoRegIndex; +import a8k.app.utils.ZJsonNode; +import a8k.extui.mgr.ExtApiPageMgr; +import com.fasterxml.jackson.databind.JsonNode; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class MiniServoCtrlPage { + + private final MiniServoDriver miniServoDriver; + private final ExtApiPageMgr extApiPageMgr; + + MiniServoMId id = MiniServoMId.ShakeModGripperYSV; + + public void setStepMotorId(MiniServoMId id) { + this.id = id; + } + + public void enable(Boolean enable) throws AppException { + miniServoDriver.miniServoEnable(id, enable ? 1 : 0); + } + + public void stop() throws AppException { + miniServoDriver.moduleStop(id); + } + + public void moveTo(Integer pos) throws AppException { + miniServoDriver.miniServoMoveToBlock(id, pos); + } + + public void rotate(Integer direction) throws AppException { + miniServoDriver.miniServoRotate(id, direction); + } + + public void rotateWithTorque(Integer pos) throws AppException { + miniServoDriver.miniServoRotateWithTorque(id, pos); + } + + public void setReg(MiniServoRegIndex reg, Integer val) throws AppException { + miniServoDriver.setReg(id, reg, val); + } + + public JsonNode getAllReg() { + ZJsonNode jsonNode = new ZJsonNode(); + for (MiniServoRegIndex reg : MiniServoRegIndex.values()) { + try { + jsonNode.get(reg.name()).set(miniServoDriver.getReg(id, reg)); + } catch (AppException e) { + jsonNode.get(reg.name()).set("error"); + } + } //enable + return jsonNode.get(); + } + + public void setLimitVelocity(Integer val) throws AppException { + miniServoDriver.setReg(id, MiniServoRegIndex.kreg_mini_servo_limit_velocity, val); + } + + public void setLimitTorque(Integer val) throws AppException { + miniServoDriver.setReg(id, MiniServoRegIndex.kreg_mini_servo_limit_torque, val); + } + + public void setProtectiveTorque(Integer val) throws AppException { + miniServoDriver.setReg(id, MiniServoRegIndex.kreg_mini_servo_protective_torque, val); + } + + public Integer readPos() throws AppException { + return miniServoDriver.miniServoReadPos(id); + } + + public void moveToZero() throws AppException { + miniServoDriver.miniServoMoveToZero(id); + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("上下文"); + page.addFunction("设置电机ID", this::setStepMotorId).setParamVal("id", () -> id); + + page.newGroup("电机控制"); + page.addFunction("读取位置", this::readPos); + page.addFunction("使能", this::enable).setParamVal("enable", () -> true); + page.addFunction("停止", this::stop); + page.addFunction("移动到", this::moveTo).setParamVal("pos", () -> 0); + page.addFunction("旋转", this::rotate).setParamVal("direction", () -> 0); + page.addFunction("旋转(力矩)", this::rotateWithTorque).setParamVal("pos", () -> 0); + page.addFunction("移动到零点(业务零点)", this::moveToZero); + + page.newGroup("寄存器"); + page.addFunction("设置限速", this::setLimitVelocity).setParamVal("val", + () -> miniServoDriver.getRegNoEx(id, MiniServoRegIndex.kreg_mini_servo_limit_velocity)); + page.addFunction("设置限力矩", this::setLimitTorque).setParamVal("val", + () -> miniServoDriver.getRegNoEx(id, MiniServoRegIndex.kreg_mini_servo_limit_torque)); + page.addFunction("设置保护力矩", this::setProtectiveTorque).setParamVal("val", + () -> miniServoDriver.getRegNoEx(id, MiniServoRegIndex.kreg_mini_servo_protective_torque)); + page.addFunction("设置寄存器", this::setReg); + page.addFunction("获取寄存器", this::getAllReg); + + extApiPageMgr.addPage(page); + + + } +} diff --git a/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java new file mode 100644 index 0000000..304990b --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java @@ -0,0 +1,212 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.StepMotorCtrlDriver; +import a8k.app.hardware.type.StepMotorMId; +import a8k.app.hardware.type.StepMotorRegIndex; +import a8k.app.utils.ZJsonNode; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class MotorCtrlPage { + private static final Logger log = LoggerFactory.getLogger(MotorCtrlPage.class); + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + + @Resource + ExtApiPageMgr extApiPageMgr; + + StepMotorMId id = StepMotorMId.FeedingModXM; + Integer dpos = 10; + + + public void setStepMotorIdRefreshPage(StepMotorMId id) { + this.id = id; + } + + public void setStepMotorDpos(Integer dpos) { + this.dpos = dpos; + } + + // + + public void enableMotor() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(id, 1); + } + + public void disableMotor() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(id, 0); + } + + + public void stepMotorEasyMoveToZero() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToZero(id); + } + + public void stepMotorStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(id); + } + + public void stepMotorEasyMoveForward() throws AppException { + log.info("stepMotorEasyMoveForward: {} {}", id, dpos); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, dpos); + } + + public void stepMotorEasyMoveBackward() throws AppException { + log.info("stepMotorEasyMoveBackward: {} {}", id, -dpos); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, -dpos); + } + + public void stepMotorEasyMoveTo(Integer pos) throws AppException { + log.info("stepMotorEasyMoveTo: {} {}", id, pos); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(id, pos); + } + + public void rotateForward() throws AppException { + stepMotorCtrlDriver.stepMotorEasyRotate(id, 1); + } + + public void rotateBackward() throws AppException { + stepMotorCtrlDriver.stepMotorEasyRotate(id, -1); + } + + public Integer readEncPos() throws AppException { + return stepMotorCtrlDriver.stepMotorReadEncPos(id); + } + + public Integer readPos() throws AppException { + return stepMotorCtrlDriver.stepMotorReadPos(id); + } + + public Object readIOState() throws AppException { + ZJsonNode node = new ZJsonNode(); + node.get("IO1").set(stepMotorCtrlDriver.stepMotorReadIoState(id, 0)); + node.get("IO2").set(stepMotorCtrlDriver.stepMotorReadIoState(id, 1)); + return node.get(); + } + + public Object readAllRegs() throws AppException { + ZJsonNode node = new ZJsonNode(); + for (StepMotorRegIndex reg : StepMotorRegIndex.values()) { + try { + Integer val = stepMotorCtrlDriver.getReg(id, reg); + node.get(reg.name()).set(val); + } catch (AppException e) { + node.get(reg.name()).set(e.getError().code); + } + + } + return node.get(); + } + + public void setReg(StepMotorRegIndex reg, Integer val) throws AppException { + stepMotorCtrlDriver.setReg(id, reg, val); + } + + public void setStartAndStopVel(Integer v) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_vstart, v); + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_vstop, v); + } + + public void setV1(Integer v) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_v1, v); + } + + public void setA1AndD1(Integer acc) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_a1, acc); + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_d1, acc); + } + + public void setAmaxAndDmax(Integer acc) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_amax, acc); + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_dmax, acc); + } + + public void setDefaultVel(Integer v) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_default_velocity, v); + } + + public void setMres(Integer mres) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_mres, mres); + } + + public void setIRUN(Integer irun) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_irun, irun); + } + + public void setIHOLD(Integer ihold) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_ihold, ihold); + } + + public void setOneCirclePulse(Integer pulse, Integer denominator) throws AppException { + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, pulse); + stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_one_circle_pulse_denominator, denominator); + } + + public Integer readReg(StepMotorRegIndex reg) { + try { + return stepMotorCtrlDriver.getReg(id, reg); + } catch (AppException e) { + return 0; + } + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("上下文"); + page.addFunction("设置电机ID", this::setStepMotorIdRefreshPage).setParamVal("id", () -> id); + + page.newGroup("基础操作"); + page.addFunction("使能电机", this::enableMotor); + page.addFunction("失能电机", this::disableMotor); + page.addFunction("归零", this::stepMotorEasyMoveToZero); + page.addFunction("停止", this::stepMotorStop); + + page.newGroup("相对移动"); + page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos); + page.addFunction("正向移动", this::stepMotorEasyMoveForward); + page.addFunction("反向移动", this::stepMotorEasyMoveBackward); + + page.newGroup("绝对移动"); + page.addFunction("绝对移动", this::stepMotorEasyMoveTo); + + page.newGroup("旋转"); + page.addFunction("顺时针旋转", this::rotateForward); + page.addFunction("逆时针旋转", this::rotateBackward); + + + page.newGroup("寄存器配置"); + page.addFunction("设置细分", this::setMres).setParamVal("mres", () -> readReg(StepMotorRegIndex.kreg_step_motor_mres)); + page.addFunction("设置IRUN", this::setIRUN).setParamVal("irun", () -> readReg(StepMotorRegIndex.kreg_step_motor_irun)); + page.addFunction("设置IHOLD", this::setIHOLD).setParamVal("ihold", () -> readReg(StepMotorRegIndex.kreg_step_motor_ihold)); + page.addFunction("设置起停速度", this::setStartAndStopVel).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_vstart)); + page.addFunction("设置V1", this::setV1).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_v1)); + page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(StepMotorRegIndex.kreg_step_motor_a1)); + page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(StepMotorRegIndex.kreg_step_motor_amax)); + page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_default_velocity)); + page.addFunction("设置一圈脉冲数", this::setOneCirclePulse) + .setParamVal("pulse", () -> readReg(StepMotorRegIndex.kreg_step_motor_one_circle_pulse)).setParamVal("denominator", + () -> readReg(StepMotorRegIndex.kreg_step_motor_one_circle_pulse_denominator)); + + page.addFunction("设置寄存器", this::setReg); + page.addFunction("读取所有寄存器", this::readAllRegs); + + + page.newGroup("状态"); + page.addFunction("读取IO状态", this::readIOState); + page.addFunction("读取位置", this::readPos); + page.addFunction("读取编码器位置", this::readEncPos); + + + extApiPageMgr.addPage(page); + + + } +} diff --git a/src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java b/src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java new file mode 100644 index 0000000..05a4e5b --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java @@ -0,0 +1,28 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.OutputIOCtrlDriver; +import a8k.app.hardware.type.OutputIOId; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class OutputIOCtrlDebugPage { + final private ExtApiPageMgr extApiPageMgr; + final private OutputIOCtrlDriver outputIOCtrlDriver; + + + public void setIOState(Boolean state) throws AppException { + outputIOCtrlDriver.setIOState(OutputIOId.RecycleBinOverflowPPSPowerCtrl, state); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("废料仓光栅控制", this::setIOState).setParamVal("state", true); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java b/src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java new file mode 100644 index 0000000..be9ed79 --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java @@ -0,0 +1,48 @@ +package a8k.extui.page.driver; + +import a8k.app.hardware.driver.PipetteCtrlDriver; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class PipetteCtrlDriverPage { + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + + @Resource + ExtApiPageMgr extApiPageMgr; + + static public Class getPageClass() { + return PipetteCtrlDriver.class; + } + + @PostConstruct + void init() { + ExtUIPageCfg page = new ExtUIPageCfg(pipetteCtrlDriver); + page.addFunction("模块停止", pipetteCtrlDriver::moduleStop); + page.addFunction("移动液枪初始化设备", pipetteCtrlDriver::pipetteInitDeviceBlock); + page.addFunction("放置吸头", pipetteCtrlDriver::putTipBlock); + page.addFunction("LLD.获取传感器采样数据", pipetteCtrlDriver::getSensorSampleData); + page.addFunction("液体操作.清除参数", pipetteCtrlDriver::liquidOperationClearParams); + page.addFunction("液体操作.设置移液枪运行参数", pipetteCtrlDriver::liquidOperationSetGunRunParams); + page.addFunction("液体操作.设置z轴电机运行参数", pipetteCtrlDriver::liquidOperationSetZMotorRunParams); + page.addFunction("液体操作.使能LLD记录", pipetteCtrlDriver::liquidOperationEnableLldRecord); + page.addFunction("液体操作.刷新参数", pipetteCtrlDriver::liquidOperationFreshParams); + page.addFunction("LLD.读取电容值", pipetteCtrlDriver::readCapacitance); + page.addFunction("放置吸头", pipetteCtrlDriver::pipettePutTip); + page.addFunction("泵移动到", pipetteCtrlDriver::pipettePumpMoveTo); + page.addFunction("LLD", pipetteCtrlDriver::pipetteLld); + page.addFunction("吸液", pipetteCtrlDriver::pipetteAspirate); + page.addFunction("分液", pipetteCtrlDriver::pipetteDistribu); + page.addFunction("振荡", pipetteCtrlDriver::pipetteShakeUp); + page.addFunction("清除悬液", pipetteCtrlDriver::pipetteClearHangingLiquid); + page.addFunction("设置寄存器", pipetteCtrlDriver::setReg); + page.addFunction("获取寄存器", pipetteCtrlDriver::getReg); + page.addFunction("获取所有寄存器", pipetteCtrlDriver::getAllRegs); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java b/src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java new file mode 100644 index 0000000..064736b --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java @@ -0,0 +1,182 @@ +package a8k.extui.page.driver; + +import a8k.app.hardware.driver.PipetteCtrlDriver; +import a8k.app.hardware.type.PipetteRegIndex; +import a8k.app.type.exception.AppException; +import a8k.app.utils.ZJsonNode; +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 PipetteMotorCtrlPage { + private final PipetteCtrlDriver pipetteCtrlDriver; + + private final ExtApiPageMgr extApiPageMgr; + + Integer dpos = 10; + + + public void setStepMotorDpos(Integer dpos) { + this.dpos = dpos; + } + + // + + public void enableMotor() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + } + + public void disableMotor() throws AppException { + pipetteCtrlDriver.zMotorEnable(0); + } + + + public void stepMotorEasyMoveToZero() throws AppException { + pipetteCtrlDriver.zMotorMoveZeroBlock(); + } + + public void stepMotorStop() throws AppException { + pipetteCtrlDriver.moduleStop(); + } + + public void stepMotorEasyMoveForward() throws AppException { + pipetteCtrlDriver.zMotorMoveByBlock(dpos); + } + + public void stepMotorEasyMoveBackward() throws AppException { + pipetteCtrlDriver.zMotorMoveByBlock(-dpos); + } + + public void stepMotorEasyMoveTo(Integer pos) throws AppException { + log.info("stepMotorEasyMoveTo: {}", pos); + pipetteCtrlDriver.zMotorMoveToBlock(pos); + } + + + public Integer readPos() throws AppException { + return pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos); + } + + public Integer readEncPos() throws AppException { + return pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_encpos); + } + + + public Object readAllRegs() throws AppException { + ZJsonNode node = new ZJsonNode(); + for (PipetteRegIndex reg : PipetteRegIndex.values()) { + try { + Integer val = pipetteCtrlDriver.getReg(reg); + node.get(reg.name()).set(val); + } catch (AppException e) { + node.get(reg.name()).set(e.getError().code); + } + + } + return node.get(); + } + + public void setReg(PipetteRegIndex reg, Integer val) throws AppException { + pipetteCtrlDriver.setReg(reg, val); + } + + public void setMres(Integer mres) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_mres, mres); + } + + public void setStartAndStopVel(Integer v) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_vstart, v); + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_vstop, v); + } + + public void setV1(Integer v) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_v1, v); + } + + public void setA1AndD1(Integer acc) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_a1, acc); + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_d1, acc); + } + + public void setAmaxAndDmax(Integer acc) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_amax, acc); + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_dmax, acc); + } + + public void setDefaultVel(Integer v) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_default_velocity, v); + } + + + public void setIRUN(Integer irun) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_irun, irun); + } + + public void setIHOLD(Integer ihold) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_ihold, ihold); + } + + public void setOneCirclePulse(Integer pulse, Integer denominator) throws AppException { + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse, pulse); + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse_denominator, denominator); + } + + public Integer readReg(PipetteRegIndex reg) { + try { + return pipetteCtrlDriver.getReg(reg); + } catch (AppException e) { + return 0; + } + } + + + @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::stepMotorStop); + + page.newGroup("相对移动"); + page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos); + page.addFunction("正向移动", this::stepMotorEasyMoveForward); + page.addFunction("反向移动", this::stepMotorEasyMoveBackward); + + page.newGroup("绝对移动"); + page.addFunction("绝对移动", this::stepMotorEasyMoveTo); + + page.newGroup("寄存器配置"); + page.addFunction("设备MRES", this::setMres).setParamVal("mres", () -> readReg(PipetteRegIndex.kreg_pipette_zm_mres)); + page.addFunction("设置IRUN", this::setIRUN).setParamVal("irun", () -> readReg(PipetteRegIndex.kreg_pipette_zm_irun)); + page.addFunction("设置IHOLD", this::setIHOLD).setParamVal("ihold", () -> readReg(PipetteRegIndex.kreg_pipette_zm_ihold)); + page.addFunction("设置起停速度", this::setStartAndStopVel).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_vstart)); + page.addFunction("设置V1", this::setV1).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_v1)); + page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(PipetteRegIndex.kreg_pipette_zm_a1)); + page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(PipetteRegIndex.kreg_pipette_zm_amax)); + page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_default_velocity)); + page.addFunction("设置一圈脉冲数", this::setOneCirclePulse) + .setParamVal("pulse", () -> readReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse)).setParamVal("denominator", + () -> readReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse_denominator)); + + page.addFunction("设置寄存器", this::setReg); + page.addFunction("读取所有寄存器", this::readAllRegs); + + + page.newGroup("状态"); + page.addFunction("读取位置", this::readPos); + page.addFunction("读取编码器位置", this::readEncPos); + + + extApiPageMgr.addPage(page); + + + } +} diff --git a/src/main/java/a8k/extui/page/extsetting/pos_calibration/P24Hbot2DCodeScanPosCalibrationPage.java b/src/main/java/a8k/extui/page/extsetting/pos_calibration/P24Hbot2DCodeScanPosCalibrationPage.java index 3501885..e768df2 100644 --- a/src/main/java/a8k/extui/page/extsetting/pos_calibration/P24Hbot2DCodeScanPosCalibrationPage.java +++ b/src/main/java/a8k/extui/page/extsetting/pos_calibration/P24Hbot2DCodeScanPosCalibrationPage.java @@ -19,14 +19,27 @@ public class P24Hbot2DCodeScanPosCalibrationPage { hbot2DCodeScanParamMgr.setPBScanPosX(new Pos2d(x, y)); } + public void setPBDY(Double dy) { + hbot2DCodeScanParamMgr.setPBDY(dy); + } + public void setLittBSX(Integer x, Integer y) { hbot2DCodeScanParamMgr.setLittBSX(new Pos2d(x, y)); } + public void setLittleBQRCodeDxAndDy(Double dx, Double dy) { + hbot2DCodeScanParamMgr.setLittleBQRCodeDxAndDy(dx, dy); + } + + public void setLargeBSQRCodeDxAndDy(Double dx, Double dy) { + hbot2DCodeScanParamMgr.setLargeBSQRCodeDxAndDy(dx, dy); + } + public void setLarBSX(Integer x, Integer y) { hbot2DCodeScanParamMgr.setLarBSX(new Pos2d(x, y)); } + @Resource ExtApiPageMgr extApiPageMgr; @@ -34,16 +47,29 @@ public class P24Hbot2DCodeScanPosCalibrationPage { public void init() { var page = extApiPageMgr.newPage(this); - page.newGroup(""); + page.newGroup("板夹仓"); page.addFunction("设置PB扫描位置", this::setPBScanPosX) .setParamVal("x", () -> hbot2DCodeScanParamMgr.getPBScanPosX(0).x) .setParamVal("y", () -> hbot2DCodeScanParamMgr.getPBScanPosX(0).y); + page.addFunction("设置PB扫描Y轴位置", this::setPBDY) + .setParamVal("dy", () -> hbot2DCodeScanParamMgr.getPBDY()); + + page.newGroup("小瓶缓冲液"); page.addFunction("设置小瓶缓冲液0位置", this::setLittBSX) .setParamVal("x", () -> hbot2DCodeScanParamMgr.getLittBSX(0).x) .setParamVal("y", () -> hbot2DCodeScanParamMgr.getLittBSX(0).y); + page.addFunction("设置小瓶缓冲液间距", this::setLittleBQRCodeDxAndDy) + .setParamVal("dx", () -> hbot2DCodeScanParamMgr.getLittleBQRCodeDX()) + .setParamVal("dy", () -> hbot2DCodeScanParamMgr.getLittleBQRCodeDY()); + + + page.newGroup("大瓶缓冲液"); page.addFunction("设大瓶缓冲液0位置", this::setLarBSX) .setParamVal("x", () -> hbot2DCodeScanParamMgr.getLarBSX(0).x) .setParamVal("y", () -> hbot2DCodeScanParamMgr.getLarBSX(0).y); + page.addFunction("设置大瓶缓冲液间距", this::setLargeBSQRCodeDxAndDy) + .setParamVal("dx", () -> hbot2DCodeScanParamMgr.getLargeBSQRCodeDX()) + .setParamVal("dy", () -> hbot2DCodeScanParamMgr.getLargeBSQRCodeDY()); extApiPageMgr.addPage(page); diff --git a/src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java b/src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java index 5ae0cad..f136392 100644 --- a/src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java +++ b/src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java @@ -1,6 +1,8 @@ package a8k.extui.page.measurement; import a8k.app.constant.GearBacklashConstant; +import a8k.app.hardware.driver.CodeScanerDriver; +import a8k.app.service.lowerctrl.HbotMoveExCtrlService; import a8k.app.type.a8k.Pos2d; import a8k.app.type.a8k.Pos3d; import a8k.app.type.exception.AppException; @@ -25,6 +27,7 @@ public class HbotPosMeasurePage { private final ExtApiPageMgr extApiPageMgr; private final HbotDriver hbotDriver; private final PipetteCtrlDriver pipetteCtrlDriver; + private final CodeScanerDriver codeScanerDriver; @ExtApiStatu(group = "Hbot当前坐标") public Pos3d readPos() throws AppException { @@ -48,6 +51,18 @@ public class HbotPosMeasurePage { return zMotorMoveByDistance; } + public void openCodeScanner() throws AppException { + codeScanerDriver.pipetteModCodeScannerStartScan(); + } + + public void closeCodeScanner() throws AppException { + codeScanerDriver.pipetteModCodeScannerStopScan(); + } + + public String scanCode() throws AppException { + return codeScanerDriver.pipetteModCodeScannerScanCode(); + } + public void moveBy(Integer dx, Integer dy) throws AppException { hbotDriver.enable(1); pipetteCtrlDriver.zMotorEnable(1); @@ -139,7 +154,8 @@ public class HbotPosMeasurePage { var page = extApiPageMgr.newPage(this); page.newGroup("基础"); - page.addFunction("开始测量", this::enableMeasurment); + page.addFunction("HBOT归零", this::enableMeasurment); + page.addFunction("测量当前位置",this::measurementCurrentPos); page.newGroup("Hbot"); page.addFunction("设置相对移动距离", this::setMoveByDistance).setParamVal("distance", () -> moveByDistance); @@ -155,6 +171,11 @@ public class HbotPosMeasurePage { page.addFunction("下", this::zmoveDown); page.addFunction("移动到", this::zMotorMoveTo).setParamVal("z", 0); + page.newGroup("扫码"); + page.addFunction("打开扫码灯", this::openCodeScanner); + page.addFunction("关闭扫码灯", this::closeCodeScanner); + page.addFunction("扫码(阻塞)", this::scanCode); + page.newGroup("移动到"); page.addFunction("移动到", this::measurementMoveTo); page.addFunction("移动到", this::measurementMoveTo); diff --git a/src/main/java/a8k/extui/page/test/driver/CodeScanerDriverCtrlPage.java b/src/main/java/a8k/extui/page/test/driver/CodeScanerDriverCtrlPage.java deleted file mode 100644 index ca04404..0000000 --- a/src/main/java/a8k/extui/page/test/driver/CodeScanerDriverCtrlPage.java +++ /dev/null @@ -1,44 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.CodeScanerDriver; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class CodeScanerDriverCtrlPage { - - - final private ExtApiPageMgr extApiPageMgr; - final private CodeScanerDriver codeScanerDriver; - - public String pipetteModCodeScannerScanCode() throws AppException { - var ret = codeScanerDriver.pipetteModCodeScannerScanCode(10 * 1000); - if (ret == null || ret.isEmpty()) { - return "null"; - } - return ret; - } - - public String feedingModScannerModCodeScannerScanCode() { - var ret = codeScanerDriver.feedingModScannerModCodeScannerScanCode(10 * 1000); - if (ret == null || ret.isEmpty()) { - return "null"; - } - return ret; - } - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("扫码"); - page.addFunction("机械臂Z轴板扫码", this::pipetteModCodeScannerScanCode); - page.addFunction("出入料模块扫码", this::feedingModScannerModCodeScannerScanCode); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java b/src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java deleted file mode 100644 index 9ce83d9..0000000 --- a/src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java +++ /dev/null @@ -1,80 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.InputDetectDriver; -import a8k.app.hardware.type.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 InputIOStateScannerPage { - - - final private ExtApiPageMgr extApiPageMgr; - final private InputDetectDriver inputDetectDriver; - - // @ExtApiStatu(name = "", group = "输入光电状态", order = 5) - // public Object getIOState() throws AppException { - // a8kCanBusService.getIOState(IOId.PusherMZeroPPS); - // ZJsonNode node = new ZJsonNode(); - // node.get("Input-IO").setAsArray(); - // - // for (IOId ioId : IOId.values()) { - // ZJsonNode iostate = new ZJsonNode(); - // iostate.get("chname").set(ioId.chname); - // iostate.get("value").set(a8kCanBusService.getIOState(ioId)); - // node.get("Input-IO").push(iostate); - // } - // return node.get(); - // } - - @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 = "板夹仓-仓门光电", 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.PlateBoxPlateStuckPPS);} - - @ExtApiStatu(name = "光学模组-拉杆电机-零点光电", order = 10) - public Boolean getPullerMZeroPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PullerMZeroPPS);} - - @ExtApiStatu(name = "光学模组-拉杆电机-限位光电", order = 11) - public Boolean getPullerMEndPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PullerMEndPPS);} - - @ExtApiStatu(name = "推杆电机-零点光电", order = 12) - public Boolean getPusherMZeroPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PusherMZeroPPS);} - - @ExtApiStatu(name = "推杆电机-终点光电", order = 13) - public Boolean getPusherMEndPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PusherMEndPPS);} - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java b/src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java deleted file mode 100644 index 5b8696e..0000000 --- a/src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java +++ /dev/null @@ -1,281 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.channel.A8kCanBusService; -import a8k.app.hardware.type.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 LowLevelBoardVersionPreviewPage { - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @Resource - A8kCanBusService canBus; - - public static class VersionInfo { - public Integer moduleId; - public String moduleName; - public Boolean online; - public String moduleType; - public Integer version; - } - - Map versionInfos = new HashMap<>(); - // HbotBoard(10, "机械臂板模块"),// - // HbotM(11, "机械臂XY"),// - // PlatesBoxBoard(20, "板夹仓模块"),// - // PlatesBoxYM(21, "板夹仓移动电机"),// - // PlatesBoxPusherM(22, "板夹仓推杆电机"),// - // PlatesBoxScanner(23, "板夹仓扫码模组"),// - // ShakeModBoard(30, "摇匀模组板"),// - // ShakeModClampingM(31, "试管固定夹爪电机"),// - // ShakeModGripperZM(32, "摇匀升降电机"),// - // ShakeModShakeM(33, "试管摇匀电机"),// - // ShakeModGripperYSV(34, "摇匀前后移动舵机"),// - // ShakeModGripperSV(35, "摇匀试管帽夹爪舵机"),// - // ShakeModTubeScanerClampingSV(36, "试管架扫码夹紧舵机"),// - // ShakeModTubeScanerRotateSV(37, "试管架旋转舵机"),// - // PlatesBoxTCMBoard(40, "反应板夹温度控制板"),// - // PlatesBoxTCM(41, "反应板夹温度控制模块"),// - // WbTubeFanMod(42, "气溶胶风扇"),// - // IncubatorTCMBoard(50, "温度控制"),// - // IncubatorTCM(51, "温度控制"),// - // FeedingModBoard(60, "出入料模块"),// - // FeedingModInfeedM(61, "入料电机"),// - // FeedingModXM(62, "试管架平移电机"),// - // FeedingModOutfeedM(63, "出料电机"),// - // FeedingModScannerMod(64, "试管架扫码器"),// - // IncubatorRotateBoard(70, "孵育盘旋转板"),// - // IncubatorRotateCtrlM(71, "孵育盘旋转"),// - // PipetteModBoard(80, "机械臂Z轴板"),// - // PipetteMod(82, "移液枪"),// - // PipetteModCodeScanner(83, "物料扫码器"),// - // OptModBoard(90, "光学模组板"),// - // OptModScannerM(91, "板卡扫描电机"),// - // OptModPullM(92, "板卡推杆电机"),// - // OptMod(93, "扫描仪"),// - // A8kIdCardReaderBoard(100, "A8K读卡器板"),// - // A8kIdCardReader(101, "A8K读卡器"),// - - @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/test/driver/MiniServoCtrlPage.java b/src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java deleted file mode 100644 index bf553a6..0000000 --- a/src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java +++ /dev/null @@ -1,115 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.MiniServoDriver; -import a8k.app.hardware.type.MiniServoMId; -import a8k.app.hardware.type.MiniServoRegIndex; -import a8k.app.utils.ZJsonNode; -import a8k.extui.mgr.ExtApiPageMgr; -import com.fasterxml.jackson.databind.JsonNode; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class MiniServoCtrlPage { - - private final MiniServoDriver miniServoDriver; - private final ExtApiPageMgr extApiPageMgr; - - MiniServoMId id = MiniServoMId.ShakeModGripperYSV; - - public void setStepMotorId(MiniServoMId id) { - this.id = id; - } - - public void enable(Boolean enable) throws AppException { - miniServoDriver.miniServoEnable(id, enable ? 1 : 0); - } - - public void stop() throws AppException { - miniServoDriver.moduleStop(id); - } - - public void moveTo(Integer pos) throws AppException { - miniServoDriver.miniServoMoveToBlock(id, pos); - } - - public void rotate(Integer direction) throws AppException { - miniServoDriver.miniServoRotate(id, direction); - } - - public void rotateWithTorque(Integer pos) throws AppException { - miniServoDriver.miniServoRotateWithTorque(id, pos); - } - - public void setReg(MiniServoRegIndex reg, Integer val) throws AppException { - miniServoDriver.setReg(id, reg, val); - } - - public JsonNode getAllReg() { - ZJsonNode jsonNode = new ZJsonNode(); - for (MiniServoRegIndex reg : MiniServoRegIndex.values()) { - try { - jsonNode.get(reg.name()).set(miniServoDriver.getReg(id, reg)); - } catch (AppException e) { - jsonNode.get(reg.name()).set("error"); - } - } //enable - return jsonNode.get(); - } - - public void setLimitVelocity(Integer val) throws AppException { - miniServoDriver.setReg(id, MiniServoRegIndex.kreg_mini_servo_limit_velocity, val); - } - - public void setLimitTorque(Integer val) throws AppException { - miniServoDriver.setReg(id, MiniServoRegIndex.kreg_mini_servo_limit_torque, val); - } - - public void setProtectiveTorque(Integer val) throws AppException { - miniServoDriver.setReg(id, MiniServoRegIndex.kreg_mini_servo_protective_torque, val); - } - - public Integer readPos() throws AppException { - return miniServoDriver.miniServoReadPos(id); - } - - public void moveToZero() throws AppException { - miniServoDriver.miniServoMoveToZero(id); - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.newGroup("上下文"); - page.addFunction("设置电机ID", this::setStepMotorId).setParamVal("id", () -> id); - - page.newGroup("电机控制"); - page.addFunction("读取位置", this::readPos); - page.addFunction("使能", this::enable).setParamVal("enable", () -> true); - page.addFunction("停止", this::stop); - page.addFunction("移动到", this::moveTo).setParamVal("pos", () -> 0); - page.addFunction("旋转", this::rotate).setParamVal("direction", () -> 0); - page.addFunction("旋转(力矩)", this::rotateWithTorque).setParamVal("pos", () -> 0); - page.addFunction("移动到零点(业务零点)", this::moveToZero); - - page.newGroup("寄存器"); - page.addFunction("设置限速", this::setLimitVelocity).setParamVal("val", - () -> miniServoDriver.getRegNoEx(id, MiniServoRegIndex.kreg_mini_servo_limit_velocity)); - page.addFunction("设置限力矩", this::setLimitTorque).setParamVal("val", - () -> miniServoDriver.getRegNoEx(id, MiniServoRegIndex.kreg_mini_servo_limit_torque)); - page.addFunction("设置保护力矩", this::setProtectiveTorque).setParamVal("val", - () -> miniServoDriver.getRegNoEx(id, MiniServoRegIndex.kreg_mini_servo_protective_torque)); - page.addFunction("设置寄存器", this::setReg); - page.addFunction("获取寄存器", this::getAllReg); - - extApiPageMgr.addPage(page); - - - } -} diff --git a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java deleted file mode 100644 index 7ad986b..0000000 --- a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java +++ /dev/null @@ -1,212 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.StepMotorCtrlDriver; -import a8k.app.hardware.type.StepMotorMId; -import a8k.app.hardware.type.StepMotorRegIndex; -import a8k.app.utils.ZJsonNode; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class MotorCtrlPage { - private static final Logger log = LoggerFactory.getLogger(MotorCtrlPage.class); - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - - @Resource - ExtApiPageMgr extApiPageMgr; - - StepMotorMId id = StepMotorMId.FeedingModXM; - Integer dpos = 10; - - - public void setStepMotorIdRefreshPage(StepMotorMId id) { - this.id = id; - } - - public void setStepMotorDpos(Integer dpos) { - this.dpos = dpos; - } - - // - - public void enableMotor() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(id, 1); - } - - public void disableMotor() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(id, 0); - } - - - public void stepMotorEasyMoveToZero() throws AppException { - stepMotorCtrlDriver.stepMotorEasyMoveToZero(id); - } - - public void stepMotorStop() throws AppException { - stepMotorCtrlDriver.stepMotorStop(id); - } - - public void stepMotorEasyMoveForward() throws AppException { - log.info("stepMotorEasyMoveForward: {} {}", id, dpos); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, dpos); - } - - public void stepMotorEasyMoveBackward() throws AppException { - log.info("stepMotorEasyMoveBackward: {} {}", id, -dpos); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, -dpos); - } - - public void stepMotorEasyMoveTo(Integer pos) throws AppException { - log.info("stepMotorEasyMoveTo: {} {}", id, pos); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(id, pos); - } - - public void rotateForward() throws AppException { - stepMotorCtrlDriver.stepMotorEasyRotate(id, 1); - } - - public void rotateBackward() throws AppException { - stepMotorCtrlDriver.stepMotorEasyRotate(id, -1); - } - - public Integer readEncPos() throws AppException { - return stepMotorCtrlDriver.stepMotorReadEncPos(id); - } - - public Integer readPos() throws AppException { - return stepMotorCtrlDriver.stepMotorReadPos(id); - } - - public Object readIOState() throws AppException { - ZJsonNode node = new ZJsonNode(); - node.get("IO1").set(stepMotorCtrlDriver.stepMotorReadIoState(id, 0)); - node.get("IO2").set(stepMotorCtrlDriver.stepMotorReadIoState(id, 1)); - return node.get(); - } - - public Object readAllRegs() throws AppException { - ZJsonNode node = new ZJsonNode(); - for (StepMotorRegIndex reg : StepMotorRegIndex.values()) { - try { - Integer val = stepMotorCtrlDriver.getReg(id, reg); - node.get(reg.name()).set(val); - } catch (AppException e) { - node.get(reg.name()).set(e.getError().code); - } - - } - return node.get(); - } - - public void setReg(StepMotorRegIndex reg, Integer val) throws AppException { - stepMotorCtrlDriver.setReg(id, reg, val); - } - - public void setStartAndStopVel(Integer v) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_vstart, v); - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_vstop, v); - } - - public void setV1(Integer v) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_v1, v); - } - - public void setA1AndD1(Integer acc) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_a1, acc); - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_d1, acc); - } - - public void setAmaxAndDmax(Integer acc) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_amax, acc); - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_dmax, acc); - } - - public void setDefaultVel(Integer v) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_default_velocity, v); - } - - public void setMres(Integer mres) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_mres, mres); - } - - public void setIRUN(Integer irun) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_irun, irun); - } - - public void setIHOLD(Integer ihold) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_ihold, ihold); - } - - public void setOneCirclePulse(Integer pulse, Integer denominator) throws AppException { - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, pulse); - stepMotorCtrlDriver.setReg(id, StepMotorRegIndex.kreg_step_motor_one_circle_pulse_denominator, denominator); - } - - public Integer readReg(StepMotorRegIndex reg) { - try { - return stepMotorCtrlDriver.getReg(id, reg); - } catch (AppException e) { - return 0; - } - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.newGroup("上下文"); - page.addFunction("设置电机ID", this::setStepMotorIdRefreshPage).setParamVal("id", () -> id); - - page.newGroup("基础操作"); - page.addFunction("使能电机", this::enableMotor); - page.addFunction("失能电机", this::disableMotor); - page.addFunction("归零", this::stepMotorEasyMoveToZero); - page.addFunction("停止", this::stepMotorStop); - - page.newGroup("相对移动"); - page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos); - page.addFunction("正向移动", this::stepMotorEasyMoveForward); - page.addFunction("反向移动", this::stepMotorEasyMoveBackward); - - page.newGroup("绝对移动"); - page.addFunction("绝对移动", this::stepMotorEasyMoveTo); - - page.newGroup("旋转"); - page.addFunction("顺时针旋转", this::rotateForward); - page.addFunction("逆时针旋转", this::rotateBackward); - - - page.newGroup("寄存器配置"); - page.addFunction("设置细分", this::setMres).setParamVal("mres", () -> readReg(StepMotorRegIndex.kreg_step_motor_mres)); - page.addFunction("设置IRUN", this::setIRUN).setParamVal("irun", () -> readReg(StepMotorRegIndex.kreg_step_motor_irun)); - page.addFunction("设置IHOLD", this::setIHOLD).setParamVal("ihold", () -> readReg(StepMotorRegIndex.kreg_step_motor_ihold)); - page.addFunction("设置起停速度", this::setStartAndStopVel).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_vstart)); - page.addFunction("设置V1", this::setV1).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_v1)); - page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(StepMotorRegIndex.kreg_step_motor_a1)); - page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(StepMotorRegIndex.kreg_step_motor_amax)); - page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(StepMotorRegIndex.kreg_step_motor_default_velocity)); - page.addFunction("设置一圈脉冲数", this::setOneCirclePulse) - .setParamVal("pulse", () -> readReg(StepMotorRegIndex.kreg_step_motor_one_circle_pulse)).setParamVal("denominator", - () -> readReg(StepMotorRegIndex.kreg_step_motor_one_circle_pulse_denominator)); - - page.addFunction("设置寄存器", this::setReg); - page.addFunction("读取所有寄存器", this::readAllRegs); - - - page.newGroup("状态"); - page.addFunction("读取IO状态", this::readIOState); - page.addFunction("读取位置", this::readPos); - page.addFunction("读取编码器位置", this::readEncPos); - - - extApiPageMgr.addPage(page); - - - } -} diff --git a/src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java b/src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java deleted file mode 100644 index 7872cc4..0000000 --- a/src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java +++ /dev/null @@ -1,28 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.OutputIOCtrlDriver; -import a8k.app.hardware.type.OutputIOId; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class OutputIOCtrlDebugPage { - final private ExtApiPageMgr extApiPageMgr; - final private OutputIOCtrlDriver outputIOCtrlDriver; - - - public void setIOState(Boolean state) throws AppException { - outputIOCtrlDriver.setIOState(OutputIOId.RecycleBinOverflowPPSPowerCtrl, state); - } - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("废料仓光栅控制", this::setIOState).setParamVal("state", true); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java b/src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java deleted file mode 100644 index 85f4c9e..0000000 --- a/src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java +++ /dev/null @@ -1,48 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.hardware.driver.PipetteCtrlDriver; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class PipetteCtrlDriverPage { - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - - @Resource - ExtApiPageMgr extApiPageMgr; - - static public Class getPageClass() { - return PipetteCtrlDriver.class; - } - - @PostConstruct - void init() { - ExtUIPageCfg page = new ExtUIPageCfg(pipetteCtrlDriver); - page.addFunction("模块停止", pipetteCtrlDriver::moduleStop); - page.addFunction("移动液枪初始化设备", pipetteCtrlDriver::pipetteInitDeviceBlock); - page.addFunction("放置吸头", pipetteCtrlDriver::putTipBlock); - page.addFunction("LLD.获取传感器采样数据", pipetteCtrlDriver::getSensorSampleData); - page.addFunction("液体操作.清除参数", pipetteCtrlDriver::liquidOperationClearParams); - page.addFunction("液体操作.设置移液枪运行参数", pipetteCtrlDriver::liquidOperationSetGunRunParams); - page.addFunction("液体操作.设置z轴电机运行参数", pipetteCtrlDriver::liquidOperationSetZMotorRunParams); - page.addFunction("液体操作.使能LLD记录", pipetteCtrlDriver::liquidOperationEnableLldRecord); - page.addFunction("液体操作.刷新参数", pipetteCtrlDriver::liquidOperationFreshParams); - page.addFunction("LLD.读取电容值", pipetteCtrlDriver::readCapacitance); - page.addFunction("放置吸头", pipetteCtrlDriver::pipettePutTip); - page.addFunction("泵移动到", pipetteCtrlDriver::pipettePumpMoveTo); - page.addFunction("LLD", pipetteCtrlDriver::pipetteLld); - page.addFunction("吸液", pipetteCtrlDriver::pipetteAspirate); - page.addFunction("分液", pipetteCtrlDriver::pipetteDistribu); - page.addFunction("振荡", pipetteCtrlDriver::pipetteShakeUp); - page.addFunction("清除悬液", pipetteCtrlDriver::pipetteClearHangingLiquid); - page.addFunction("设置寄存器", pipetteCtrlDriver::setReg); - page.addFunction("获取寄存器", pipetteCtrlDriver::getReg); - page.addFunction("获取所有寄存器", pipetteCtrlDriver::getAllRegs); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java b/src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java deleted file mode 100644 index 7295f27..0000000 --- a/src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java +++ /dev/null @@ -1,188 +0,0 @@ -package a8k.extui.page.test.driver; - -import a8k.app.hardware.driver.PipetteCtrlDriver; -import a8k.app.hardware.driver.StepMotorCtrlDriver; -import a8k.app.hardware.type.PipetteRegIndex; -import a8k.app.hardware.type.StepMotorMId; -import a8k.app.hardware.type.PipetteRegIndex; -import a8k.app.type.exception.AppException; -import a8k.app.utils.ZJsonNode; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class PipetteMotorCtrlPage { - private final PipetteCtrlDriver pipetteCtrlDriver; - - private final ExtApiPageMgr extApiPageMgr; - - Integer dpos = 10; - - - public void setStepMotorDpos(Integer dpos) { - this.dpos = dpos; - } - - // - - public void enableMotor() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - } - - public void disableMotor() throws AppException { - pipetteCtrlDriver.zMotorEnable(0); - } - - - public void stepMotorEasyMoveToZero() throws AppException { - pipetteCtrlDriver.zMotorMoveZeroBlock(); - } - - public void stepMotorStop() throws AppException { - pipetteCtrlDriver.moduleStop(); - } - - public void stepMotorEasyMoveForward() throws AppException { - pipetteCtrlDriver.zMotorMoveByBlock(dpos); - } - - public void stepMotorEasyMoveBackward() throws AppException { - pipetteCtrlDriver.zMotorMoveByBlock(-dpos); - } - - public void stepMotorEasyMoveTo(Integer pos) throws AppException { - log.info("stepMotorEasyMoveTo: {}", pos); - pipetteCtrlDriver.zMotorMoveToBlock(pos); - } - - - public Integer readPos() throws AppException { - return pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos); - } - - public Integer readEncPos() throws AppException { - return pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_encpos); - } - - - public Object readAllRegs() throws AppException { - ZJsonNode node = new ZJsonNode(); - for (PipetteRegIndex reg : PipetteRegIndex.values()) { - try { - Integer val = pipetteCtrlDriver.getReg(reg); - node.get(reg.name()).set(val); - } catch (AppException e) { - node.get(reg.name()).set(e.getError().code); - } - - } - return node.get(); - } - - public void setReg(PipetteRegIndex reg, Integer val) throws AppException { - pipetteCtrlDriver.setReg(reg, val); - } - - public void setMres(Integer mres) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_mres, mres); - } - - public void setStartAndStopVel(Integer v) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_vstart, v); - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_vstop, v); - } - - public void setV1(Integer v) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_v1, v); - } - - public void setA1AndD1(Integer acc) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_a1, acc); - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_d1, acc); - } - - public void setAmaxAndDmax(Integer acc) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_amax, acc); - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_dmax, acc); - } - - public void setDefaultVel(Integer v) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_default_velocity, v); - } - - - public void setIRUN(Integer irun) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_irun, irun); - } - - public void setIHOLD(Integer ihold) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_ihold, ihold); - } - - public void setOneCirclePulse(Integer pulse, Integer denominator) throws AppException { - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse, pulse); - pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse_denominator, denominator); - } - - public Integer readReg(PipetteRegIndex reg) { - try { - return pipetteCtrlDriver.getReg(reg); - } catch (AppException e) { - return 0; - } - } - - - @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::stepMotorStop); - - page.newGroup("相对移动"); - page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos); - page.addFunction("正向移动", this::stepMotorEasyMoveForward); - page.addFunction("反向移动", this::stepMotorEasyMoveBackward); - - page.newGroup("绝对移动"); - page.addFunction("绝对移动", this::stepMotorEasyMoveTo); - - page.newGroup("寄存器配置"); - page.addFunction("设备MRES", this::setMres).setParamVal("mres", () -> readReg(PipetteRegIndex.kreg_pipette_zm_mres)); - page.addFunction("设置IRUN", this::setIRUN).setParamVal("irun", () -> readReg(PipetteRegIndex.kreg_pipette_zm_irun)); - page.addFunction("设置IHOLD", this::setIHOLD).setParamVal("ihold", () -> readReg(PipetteRegIndex.kreg_pipette_zm_ihold)); - page.addFunction("设置起停速度", this::setStartAndStopVel).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_vstart)); - page.addFunction("设置V1", this::setV1).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_v1)); - page.addFunction("设置加速度", this::setA1AndD1).setParamVal("acc", () -> readReg(PipetteRegIndex.kreg_pipette_zm_a1)); - page.addFunction("设置最大加速度", this::setAmaxAndDmax).setParamVal("acc", () -> readReg(PipetteRegIndex.kreg_pipette_zm_amax)); - page.addFunction("设置默认速度", this::setDefaultVel).setParamVal("v", () -> readReg(PipetteRegIndex.kreg_pipette_zm_default_velocity)); - page.addFunction("设置一圈脉冲数", this::setOneCirclePulse) - .setParamVal("pulse", () -> readReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse)).setParamVal("denominator", - () -> readReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse_denominator)); - - page.addFunction("设置寄存器", this::setReg); - page.addFunction("读取所有寄存器", this::readAllRegs); - - - page.newGroup("状态"); - page.addFunction("读取位置", this::readPos); - page.addFunction("读取编码器位置", this::readEncPos); - - - 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 new file mode 100644 index 0000000..9c7d778 --- /dev/null +++ b/src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java @@ -0,0 +1,71 @@ +package a8k.extui.page.test.verification; + +import a8k.app.dao.type.db.ProjExtInfoCard; +import a8k.app.hardware.driver.CodeScanerDriver; +import a8k.app.hardware.type.A8kEcode; +import a8k.app.i18n.Internationalization; +import a8k.app.service.background.ProjIDCardCtrlAndMonitorService; +import a8k.app.service.data.ProjIdCardInfoMgrService; +import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService; +import a8k.app.service.lowerctrl.HbotMoveCtrlService; +import a8k.app.service.lowerctrl.HbotMoveExCtrlService; +import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.exception.AppException; +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.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@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(); + } + + + @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); + extApiPageMgr.addPage(cfg); + } +}