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/test/driver/InputIOStateScannerPage.java b/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java similarity index 99% rename from src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java rename to src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java index 9ce83d9..65ab388 100644 --- a/src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java +++ b/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java @@ -1,4 +1,4 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.driver; import a8k.app.type.exception.AppException; import a8k.app.hardware.driver.InputDetectDriver; diff --git a/src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java b/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java similarity index 99% rename from src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java rename to src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java index 5b8696e..eb12ca5 100644 --- a/src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java +++ b/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java @@ -1,4 +1,4 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.driver; import a8k.app.type.exception.AppException; import a8k.app.hardware.channel.A8kCanBusService; diff --git a/src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java b/src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java similarity index 99% rename from src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java rename to src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java index bf553a6..47fdcef 100644 --- a/src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java +++ b/src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java @@ -1,4 +1,4 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.driver; import a8k.app.type.exception.AppException; import a8k.app.hardware.driver.MiniServoDriver; diff --git a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java similarity index 99% rename from src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java rename to src/main/java/a8k/extui/page/driver/MotorCtrlPage.java index 7ad986b..304990b 100644 --- a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java +++ b/src/main/java/a8k/extui/page/driver/MotorCtrlPage.java @@ -1,4 +1,4 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.driver; import a8k.app.type.exception.AppException; import a8k.app.hardware.driver.StepMotorCtrlDriver; diff --git a/src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java b/src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java similarity index 95% rename from src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java rename to src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java index 7872cc4..05a4e5b 100644 --- a/src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java +++ b/src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java @@ -1,4 +1,4 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.driver; import a8k.app.type.exception.AppException; import a8k.app.hardware.driver.OutputIOCtrlDriver; diff --git a/src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java b/src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java similarity index 98% rename from src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java rename to src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java index 85f4c9e..be9ed79 100644 --- a/src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java +++ b/src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java @@ -1,4 +1,4 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.driver; import a8k.app.hardware.driver.PipetteCtrlDriver; import a8k.extui.mgr.ExtApiPageMgr; diff --git a/src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java b/src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java similarity index 95% rename from src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java rename to src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java index 7295f27..064736b 100644 --- a/src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java +++ b/src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java @@ -1,19 +1,13 @@ -package a8k.extui.page.test.driver; +package a8k.extui.page.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 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/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); + } +}