From 9fcf4db5ce71ca10ed5b5aca05f4fa63d4db27c1 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 22 Oct 2024 18:04:20 +0800 Subject: [PATCH] update --- .../app/devicectrl/param/LowerDeviceParamMgr.java | 2 + .../param/algo/HbotLittleBSCalibrationAlgo.java | 102 ++++++++ .../calibration/Hbot2DCodeScanPosCalibration.java | 108 +++++++++ .../HbotLargeBottleBSPosCalibration.java | 200 +++++++++++++++ .../calibration/HbotLittleBSPosCalibration.java | 170 +++++++++++++ .../HbotProbeSubstancePosCalibration.java | 171 +++++++++++++ .../calibration/HbotSamplePosCalibration.java | 146 +++++++++++ .../param/calibration/HbotTipPosCalibration.java | 232 ++++++++++++++++++ ...ReactionPlatesTransmitControlerCalibration.java | 269 +++++++++++++++++++++ .../TubeFeedingModulePosCalibration.java | 147 +++++++++++ .../calibration/TubePreProcesPosCalibration.java | 207 ++++++++++++++++ .../ext_param_mgr/HbotConsumableParamMgr.java | 66 +++++ .../param/param_mgr/Hbot2DCodeScanParamMgr.java | 53 ++++ .../param/param_mgr/HbotFixedPosParamMgr.java | 42 ++++ .../param/param_mgr/HbotLargeBottleBSPosMgr.java | 66 +++++ .../param/param_mgr/HbotLittleBSPosMgr.java | 90 +++++++ .../param/param_mgr/HbotProbeSubstancePosMgr.java | 87 +++++++ .../param/param_mgr/HbotSamplePosParamMgr.java | 36 +++ .../devicectrl/param/param_mgr/HbotTipPosMgr.java | 101 ++++++++ .../param/param_mgr/OptModuleParamsMgr.java | 89 +++++++ .../param/param_mgr/PlatesBoxPosParamMgr.java | 75 ++++++ .../param/param_mgr/TubeFeedingModuleParamMgr.java | 101 ++++++++ .../param/param_mgr/TubePreProcesPosParamMgr.java | 80 ++++++ .../param/param_mgr/TurntablePosParamMgr.java | 75 ++++++ .../devicectrl/param/param_mgr/base/ParamMgr.java | 49 ++++ .../devicectrl/param/type/Hbot2DCodeScanPos.java | 30 +++ .../param/type/HbotLargeBottleBSPos.java | 19 ++ .../app/devicectrl/param/type/HbotLittleBSPos.java | 26 ++ .../param/type/HbotProbeSubstancePos.java | 26 ++ .../app/devicectrl/param/type/HbotSamplePos.java | 35 +++ .../app/devicectrl/param/type/HbotTipPosParam.java | 27 +++ .../pos/algo/HbotLittleBSCalibrationAlgo.java | 102 -------- .../calibration/Hbot2DCodeScanPosCalibration.java | 108 --------- .../HbotLargeBottleBSPosCalibration.java | 200 --------------- .../calibration/HbotLittleBSPosCalibration.java | 170 ------------- .../HbotProbeSubstancePosCalibration.java | 171 ------------- .../pos/calibration/HbotSamplePosCalibration.java | 146 ----------- .../pos/calibration/HbotTipPosCalibration.java | 232 ------------------ ...ReactionPlatesTransmitControlerCalibration.java | 269 --------------------- .../TubeFeedingModulePosCalibration.java | 147 ----------- .../calibration/TubePreProcesPosCalibration.java | 207 ---------------- .../pos/ext_param_mgr/HbotConsumableParamMgr.java | 66 ----- .../pos/param_mgr/Hbot2DCodeScanParamMgr.java | 53 ---- .../pos/param_mgr/HbotFixedPosParamMgr.java | 42 ---- .../pos/param_mgr/HbotLargeBottleBSPosMgr.java | 66 ----- .../pos/param_mgr/HbotLittleBSPosMgr.java | 90 ------- .../pos/param_mgr/HbotProbeSubstancePosMgr.java | 87 ------- .../pos/param_mgr/HbotSamplePosParamMgr.java | 36 --- .../devicectrl/pos/param_mgr/HbotTipPosMgr.java | 101 -------- .../pos/param_mgr/OptModuleParamsMgr.java | 89 ------- .../pos/param_mgr/PlatesBoxPosParamMgr.java | 75 ------ .../pos/param_mgr/TubeFeedingModuleParamMgr.java | 101 -------- .../pos/param_mgr/TubePreProcesPosParamMgr.java | 80 ------ .../pos/param_mgr/TurntablePosParamMgr.java | 75 ------ .../devicectrl/pos/param_mgr/base/ParamMgr.java | 49 ---- .../app/devicectrl/pos/type/Hbot2DCodeScanPos.java | 30 --- .../devicectrl/pos/type/HbotLargeBottleBSPos.java | 19 -- .../app/devicectrl/pos/type/HbotLittleBSPos.java | 26 -- .../devicectrl/pos/type/HbotProbeSubstancePos.java | 26 -- .../app/devicectrl/pos/type/HbotSamplePos.java | 35 --- .../app/devicectrl/pos/type/HbotTipPosParam.java | 27 --- 61 files changed, 2927 insertions(+), 2925 deletions(-) create mode 100644 src/main/java/a8k/service/app/devicectrl/param/LowerDeviceParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/algo/HbotLittleBSCalibrationAlgo.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/Hbot2DCodeScanPosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLargeBottleBSPosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLittleBSPosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/HbotProbeSubstancePosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/HbotSamplePosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/ReactionPlatesTransmitControlerCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/TubeFeedingModulePosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/HbotConsumableParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/Hbot2DCodeScanParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotFixedPosParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLargeBottleBSPosMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLittleBSPosMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotProbeSubstancePosMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotSamplePosParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/PlatesBoxPosParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubeFeedingModuleParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/TurntablePosParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/param_mgr/base/ParamMgr.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/type/Hbot2DCodeScanPos.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/type/HbotLargeBottleBSPos.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/type/HbotLittleBSPos.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/type/HbotProbeSubstancePos.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/type/HbotSamplePos.java create mode 100644 src/main/java/a8k/service/app/devicectrl/param/type/HbotTipPosParam.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/algo/HbotLittleBSCalibrationAlgo.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/Hbot2DCodeScanPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLargeBottleBSPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLittleBSPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotProbeSubstancePosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotSamplePosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotTipPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/ReactionPlatesTransmitControlerCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/TubeFeedingModulePosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/calibration/TubePreProcesPosCalibration.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/ext_param_mgr/HbotConsumableParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/Hbot2DCodeScanParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotFixedPosParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLargeBottleBSPosMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLittleBSPosMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotProbeSubstancePosMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotSamplePosParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotTipPosMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/OptModuleParamsMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/PlatesBoxPosParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubeFeedingModuleParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubePreProcesPosParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TurntablePosParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/param_mgr/base/ParamMgr.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/type/Hbot2DCodeScanPos.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/type/HbotLargeBottleBSPos.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/type/HbotLittleBSPos.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/type/HbotProbeSubstancePos.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/type/HbotSamplePos.java delete mode 100644 src/main/java/a8k/service/app/devicectrl/pos/type/HbotTipPosParam.java diff --git a/src/main/java/a8k/service/app/devicectrl/param/LowerDeviceParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/LowerDeviceParamMgr.java new file mode 100644 index 0000000..53f7545 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/LowerDeviceParamMgr.java @@ -0,0 +1,2 @@ +package a8k.service.app.devicectrl.param;public class LowerDeviceParamMgr { +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/algo/HbotLittleBSCalibrationAlgo.java b/src/main/java/a8k/service/app/devicectrl/param/algo/HbotLittleBSCalibrationAlgo.java new file mode 100644 index 0000000..a6f70ae --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/algo/HbotLittleBSCalibrationAlgo.java @@ -0,0 +1,102 @@ +package a8k.service.app.devicectrl.pos.algo; + + + +import a8k.type.ConsumableGroup; +import a8k.type.LittleBottleConsumablePosInfo; +import a8k.type.LittleBottleConsumableRefPoint; +import a8k.type.cfg.Pos3d; +import a8k.utils.ZSimplAlgo; +import org.slf4j.Logger; +import java.util.List; + +public class HbotLittleBSCalibrationAlgo { + static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotLittleBSCalibrationAlgo.class); + + + static public LittleBottleConsumablePosInfo compute(List refPoint) { + //计算y0,所有group==0,1,2,同时0<=off<5的点,求平均 + Double[] y = new Double[2]; + Double[] x = new Double[3]; + Double[] dxs = new Double[6]; + Double[] dys = new Double[6]; + Double dx; + Double dy; + // double z = 0.0; + + LittleBottleConsumableRefPoint[] gx_00 = new LittleBottleConsumableRefPoint[6]; + + gx_00[0] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP0 && point.index == 0).findFirst().orElse(null); + gx_00[1] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP1 && point.index == 0).findFirst().orElse(null); + gx_00[2] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP2 && point.index == 0).findFirst().orElse(null); + gx_00[3] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP3 && point.index == 0).findFirst().orElse(null); + gx_00[4] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP4 && point.index == 0).findFirst().orElse(null); + gx_00[5] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP5 && point.index == 0).findFirst().orElse(null); + + y[0] = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() < 3 && point.index < 5). + map(point -> point.pos.y).toList() + ); + //计算y1,所有group==3,4,5,同时0<=off<5的点,求平均 + y[1] = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() >= 3 && point.index < 5). + map(point -> point.pos.y).toList() + ); + + //计算x0,所有group==0,3,同时off==0,5,10,15,20的点,求y平均 + x[0] = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() % 3 == 0 && point.index % 5 == 0). + map(point -> point.pos.x).toList() + ); + //计算x1,所有group==1,4,同时off==0,5,10,15,20的点,求y平均 + x[1] = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() % 3 == 1 && point.index % 5 == 0). + map(point -> point.pos.x).toList() + ); + //计算x2 + x[2] = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() % 3 == 2 && point.index % 5 == 0). + map(point -> point.pos.x).toList() + ); + // z = ZSimplAlgo.computeAverage(zpos); + //计算d0x,所有 非0,5,10,15,20的点,到x0的距离/偏移差值,求平均 + for (int i = 0; i < 6; i++) { + int finalI = i; + + if (gx_00[i] == null) { + continue; + } + Double val = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() == finalI && point.getColOff() != 0). + map(point -> (point.pos.x - gx_00[finalI].pos.x) / (point.getColOff())).toList() + ); + dxs[i] = val; + } + dx = ZSimplAlgo.computeAverage(dxs); + //计算dy, + for (int i = 0; i < 6; i++) { + int finalI = i; + if (gx_00[i] == null) + continue; + + dys[i] = ZSimplAlgo.computeAverage( + refPoint.stream().filter(point -> point.group.ordinal() == finalI && point.getRowOff() != 0). + map(point -> (point.pos.y - gx_00[finalI].pos.y) / (point.getRowOff())).toList() + ); + } + dy = ZSimplAlgo.computeAverage(dys); + + var littleBottleConsumablePosInfo = new LittleBottleConsumablePosInfo(); + littleBottleConsumablePosInfo.g0_000 = new Pos3d(x[0].intValue(), y[0].intValue(), 0); + littleBottleConsumablePosInfo.g1_000 = new Pos3d(x[1].intValue(), y[0].intValue(), 0); + littleBottleConsumablePosInfo.g2_000 = new Pos3d(x[2].intValue(), y[0].intValue(), 0); + littleBottleConsumablePosInfo.g3_000 = new Pos3d(x[0].intValue(), y[1].intValue(), 0); + littleBottleConsumablePosInfo.g4_000 = new Pos3d(x[1].intValue(), y[1].intValue(), 0); + littleBottleConsumablePosInfo.g5_000 = new Pos3d(x[2].intValue(), y[1].intValue(), 0); + littleBottleConsumablePosInfo.dx = dx; + littleBottleConsumablePosInfo.dy = dy; + return littleBottleConsumablePosInfo; + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/Hbot2DCodeScanPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/Hbot2DCodeScanPosCalibration.java new file mode 100644 index 0000000..e4e11f5 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/Hbot2DCodeScanPosCalibration.java @@ -0,0 +1,108 @@ +package a8k.service.app.devicectrl.pos.calibration; + + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.exdriver.CodeScanerExDriver; +import a8k.service.app.devicectrl.ctrlservice.ConsumablesScanCtrlService; +import a8k.service.app.devicectrl.pos.param_mgr.Hbot2DCodeScanParamMgr; +import a8k.type.ConsumableGroup; +import a8k.type.ConsumableScanRawResult; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +@ExtApiTab(cfg = ExtApiTabConfig.Hbot2DCodeScanPosCalibration) +@Component +public class Hbot2DCodeScanPosCalibration { + static Logger logger = org.slf4j.LoggerFactory.getLogger(Hbot2DCodeScanPosCalibration.class); + + @Resource + CodeScanerExDriver codeScaner; + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + @Resource + HbotBaseMoveExDriver hbotBaseMoveExDriver; + @Resource + ConsumablesScanCtrlService consumablesScanCtrlService; + + @Resource + Hbot2DCodeScanParamMgr hbot2DCodeScanParamMgr; + + + @ExtApiFn(name = "获取所有坐标", group = "基础", order = 1) + public Object getParams() throws AppException { + return hbot2DCodeScanParamMgr.getParams(); + } + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void deviceReset() throws AppException { + enableModule(); + hbotBaseMoveExDriver.checkBeforeMove(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.enable(1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(0); + hbotDriver.enable(0); + } + + @ExtApiFn(name = "扫码", group = "测试工具", order = 14) + public String scanCode() throws AppException { + return codeScaner.pipetteModCodeScannerScanCode(); + } + + // + @ExtApiFn(name = "设置当前位置为<板夹>扫码位", group = "标定", order = 21) + public void setPBScanPos(ConsumableGroup group) throws AppException { + hbot2DCodeScanParamMgr.setPBScanPosX(group.off, hbotDriver.readPos()); + } + + @ExtApiFn(name = "设置当前位置为<小缓冲>扫码位", group = "标定", order = 22) + public void setLittBSScanPos(ConsumableGroup group) throws AppException { + hbot2DCodeScanParamMgr.setLittBSX(group.off, hbotDriver.readPos()); + } + + @ExtApiFn(name = "设置当前位置为<大缓冲>扫码位", group = "标定", order = 23) + public void setLarBSScanPos(ConsumableGroup group) throws AppException { + hbot2DCodeScanParamMgr.setLarBSX(group.off, hbotDriver.readPos()); + } + + @ExtApiFn(name = "扫码测试(全部位置)", group = "校验", order = 31) + public ConsumableScanRawResult scanAll() throws AppException { + return consumablesScanCtrlService.doScanConsumablesAction(); + } + + @ExtApiFn(name = "扫描板夹仓X", group = "校验", order = 31) + public String scanPBScanPos(ConsumableGroup group) throws AppException { + return consumablesScanCtrlService.scanPB(group.off); + } + + @ExtApiFn(name = "扫描小缓冲液X", group = "校验", order = 32) + public String scanLittBSScanPos(ConsumableGroup group) throws AppException { + return consumablesScanCtrlService.scanLittBS(group.off); + } + + @ExtApiFn(name = "扫描大瓶缓冲液X)", group = "校验", order = 33) + public String scanLarBSScanPos(ConsumableGroup group) throws AppException { + return consumablesScanCtrlService.scanLarBS(group.off); + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLargeBottleBSPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLargeBottleBSPosCalibration.java new file mode 100644 index 0000000..0001be1 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLargeBottleBSPosCalibration.java @@ -0,0 +1,200 @@ +package a8k.service.app.devicectrl.pos.calibration; + + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.pos.type.HbotLargeBottleBSPos; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.pos.param_mgr.HbotLargeBottleBSPosMgr; +import a8k.type.*; +import a8k.type.cfg.Pos2d; +import a8k.type.cfg.Pos3d; +import a8k.type.exception.AppException; +import a8k.utils.ZJsonHelper; +import a8k.utils.ZSimplAlgo; +import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.annotation.Resource; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; + +@ExtApiTab(cfg = ExtApiTabConfig.HbotLargeBottleBSPosCalibration) +@Component +@Aspect +public class HbotLargeBottleBSPosCalibration { + static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotLargeBottleBSPosCalibration.class); + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + + @Resource + HbotCtrlService hbotCtrlService; + @Resource + HbotLargeBottleBSPosMgr posMgr; + + Boolean stopFlag = false; + + Boolean checkStopFlag() { + if (stopFlag) { + stopFlag = false; + return true; + } + return false; + } + + void resetStopFlag() { + stopFlag = false; + } + + void setStopFlag() { + stopFlag = true; + } + + + @ExtApiFn(name = "获取坐标", group = "基础", order = 1) + public Object getPoss() throws AppException { + return posMgr.getParams(); + } + + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void moveToZero() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.enable(1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(0); + hbotDriver.enable(0); + } + + + List refpoints = new java.util.ArrayList<>(); + + + @ExtApiFn(name = "开始标定大瓶坐标", group = "标定大瓶缓液XY坐标", order = 30) + public void startCalibrate() throws AppException { + refpoints = new java.util.ArrayList<>(); + moveToZero(); + disableModule(); + } + + @ExtApiFn(name = "添加大瓶参考点", group = "标定大瓶缓液XY坐标", order = 31) + public Object addRefPoint(ConsumableGroup group) throws AppException { + enableModule(); + Pos2d xypos = hbotDriver.readPos(); + // pipetteCtrlModule.zMotorMeasureDistance(); + // Integer z = pipetteCtrlModule.zMotorReadMeasureDistanceResult(); + LargeBottleConsumableRefPoint refPoints = new LargeBottleConsumableRefPoint(group, new Pos3d(xypos.x, xypos.y, 0)); + this.refpoints.add(refPoints); + disableModule(); + ObjectNode node = ZJsonHelper.createObjectNode(); + node.put("newPoint", ZJsonHelper.createObjectNode(refPoints)); + node.put("computeResult", ZJsonHelper.createObjectNode(computeLittleBottlePosInfo())); + return node; + } + + @ExtApiFn(name = "移除最后一个参考点", group = "标定大瓶缓液XY坐标", order = 32) + public void removeTheLastRefPoint() { + if (!refpoints.isEmpty()) { + refpoints.remove(refpoints.size() - 1); + } + } + + + @ExtApiFn(name = "读取坐标计算结果", group = "标定大瓶缓液XY坐标", order = 33) + public LargeBottoleConsumablePosInfo computeLittleBottlePosInfo() { + //第一排x求平均 + // x[0] = ZSimplAlgo.computeAverage( + // littleBottleConsumableRefPoint.stream().filter(point -> point.group.ordinal() % 3 == 0 && point.index % 5 == 0). + // map(point -> point.pos.x).toList() + // ); + + var p00 = refpoints.stream().filter(point -> point.group == ConsumableGroup.GROUP0).findFirst().orElse(null); + Double x, y, dx = null, dy = null; + + x = ZSimplAlgo.computeAverage( + refpoints.stream().filter(point -> point.group.ordinal() / 3 == 0). + map(point -> point.pos.x).toList()); + //第一列y求平均 + y = ZSimplAlgo.computeAverage( + refpoints.stream().filter(point -> point.group.ordinal() % 3 == 0). + map(point -> point.pos.y).toList()); + //除了第一列的所有点,减少x,相加,求平均 + if (p00 != null) { + dx = ZSimplAlgo.computeAverage( + refpoints.stream().filter(point -> point.getCol() != 0). + map(point -> (point.pos.x - p00.pos.x) * 1.0 / point.getCol()).toList()); + //除了第一排的所有点,减少y,相加,求平均 + dy = ZSimplAlgo.computeAverage( + refpoints.stream().filter(point -> point.getRow() != 0). + map(point -> (point.pos.y - p00.pos.y) * 1.0 / point.getRow()).toList()); + } + + return new LargeBottoleConsumablePosInfo(new Pos3d(x.intValue(), y.intValue(), 0), dx, dy); + } + + @ExtApiFn(name = "保存计算结果", group = "标定大瓶缓液XY坐标", order = 34) + public void savePosInfo() throws AppException { + posMgr.setLargeBufferGroupPosInfo(computeLittleBottlePosInfo()); + } + + @ExtApiFn(name = "读取所有参考点", group = "标定大瓶缓液XY坐标", order = 35) + public Object readAllRefPoint() throws AppException { + return refpoints; + } + + // + // 标定Z轴 + // + public void setZPos(HbotLargeBottleBSPos posName) throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMeasureDistance(); + posMgr.setParam(posName, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); + disableModule(); + } + + @ExtApiFn(name = "校准.大瓶缓冲液Z轴位置", group = "标定Z轴", order = 104) + public void setLargeBSSSampleZPos() throws AppException {setZPos(HbotLargeBottleBSPos.LargeBSSSampleZPos);} + + @ExtApiFn(name = "校准.大瓶缓冲液Z轴结束位置", group = "标定Z轴", order = 105) + public void setLargeBSSSampleEndZPos() throws AppException {setZPos(HbotLargeBottleBSPos.LargeBSSSampleEndZPos);} + + // + // 校验 + // + + @ExtApiFn(name = "校验大瓶缓冲液坐标", group = "校验", order = 303) + public void testMoveToLargeBufferPos() throws AppException { + resetStopFlag(); + enableModule(); + for (ConsumableGroup group : ConsumableGroup.values()) { + hbotCtrlService.moveToLargeBufferPos(group); + if (checkStopFlag()) + return; + } + } + + @ExtApiFn(name = "停止校验", group = "校验", order = 304) + public void stopTest() throws AppException { + setStopFlag(); + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLittleBSPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLittleBSPosCalibration.java new file mode 100644 index 0000000..07d54be --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotLittleBSPosCalibration.java @@ -0,0 +1,170 @@ +package a8k.service.app.devicectrl.pos.calibration; + + +import a8k.constant.AppConstant; +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.pos.algo.HbotLittleBSCalibrationAlgo; +import a8k.service.app.devicectrl.pos.param_mgr.HbotLittleBSPosMgr; +import a8k.service.app.devicectrl.pos.type.HbotLittleBSPos; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.type.*; +import a8k.type.cfg.Pos2d; +import a8k.type.cfg.Pos3d; +import a8k.type.exception.AppException; +import a8k.utils.ZJsonHelper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; + +@ExtApiTab(cfg = ExtApiTabConfig.HbotLittleBSPosCalibration) +@Component +public class HbotLittleBSPosCalibration { + static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotLittleBSPosCalibration.class); + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + + @Resource + HbotCtrlService hbotCtrlService; + @Resource + HbotLittleBSPosMgr hbotLittleBSPosMgr; + + List refPoint = new java.util.ArrayList<>(); + + Boolean stopFlag = false; + + Boolean checkStopFlag() { + if (stopFlag) { + stopFlag = false; + return true; + } + return false; + } + + void resetStopFlag() { + stopFlag = false; + } + + void setStopFlag() { + stopFlag = true; + } + + + @ExtApiFn(name = "获取坐标", group = "基础", order = 1) + public Object getPoss() throws AppException { + return hbotLittleBSPosMgr.getParams(); + } + + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void moveToZero() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.enable(1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(0); + hbotDriver.enable(0); + } + + + @ExtApiFn(name = "开始标定", group = "标定小瓶XY坐标", order = 30) + public void startCalibrateLittleBottleGroup(LittleBottleConsumableType type) throws AppException { + refPoint = new java.util.ArrayList<>(); + moveToZero(); + disableModule(); + } + + @ExtApiFn(name = "添加参考点", group = "标定小瓶XY坐标", order = 31) + public Object addLittleBottleGroupRefPoint(ConsumableGroup group, Integer off0To24) throws AppException { + enableModule(); + Pos2d xypos = hbotDriver.readPos(); + LittleBottleConsumableRefPoint littleBufferRefPoint = new LittleBottleConsumableRefPoint(group, off0To24, new Pos3d(xypos.x, xypos.y, 0)); + this.refPoint.add(littleBufferRefPoint); + disableModule(); + ObjectNode node = ZJsonHelper.createObjectNode(); + node.put("newPoint", ZJsonHelper.createObjectNode(littleBufferRefPoint)); + node.put("computeResult", ZJsonHelper.createObjectNode(computeLittleBottlePosInfo())); + return node; + } + + @ExtApiFn(name = "移除最后一个参考点", group = "标定小瓶XY坐标", order = 32) + public void removeTheLastLittleBottleGroupRefPoint() { + if (!refPoint.isEmpty()) { + refPoint.remove(refPoint.size() - 1); + } + } + + + @ExtApiFn(name = "读取坐标计算结果", group = "标定小瓶XY坐标", order = 33) + public LittleBottleConsumablePosInfo computeLittleBottlePosInfo() { + return HbotLittleBSCalibrationAlgo.compute(refPoint); + } + + @ExtApiFn(name = "保存计算结果", group = "标定小瓶XY坐标", order = 34) + public void saveLittleBottleConsumablePosInfo() throws AppException { + hbotLittleBSPosMgr.setPosInfo(computeLittleBottlePosInfo()); + } + + @ExtApiFn(name = "读取所有参考点", group = "标定小瓶XY坐标", order = 35) + public Object readAllRefPoint() throws AppException { + return refPoint; + } + + // + // 标定Z轴 + // + + public void setZPos(HbotLittleBSPos posName) throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMeasureDistance(); + hbotLittleBSPosMgr.setParam(posName, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); + disableModule(); + } + + @ExtApiFn(name = "校准.小瓶穿孔Z轴位置", group = "标定Z轴", order = 101) + public void setPierceZPos() throws AppException {setZPos(HbotLittleBSPos.LittleBSPierceZPos);} + + @ExtApiFn(name = "校准.小瓶取样Z轴位置", group = "标定Z轴", order = 102) + public void setSampleZPos() throws AppException {setZPos(HbotLittleBSPos.LittleBSSampleZPos);} + + @ExtApiFn(name = "校准.小瓶缓冲液取样结束Z轴位置", group = "标定Z轴", order = 104) + public void setSampleEndZPos() throws AppException {setZPos(HbotLittleBSPos.LittleBSSampleEndZPos);} + + // + // 校验 + // + @ExtApiFn(name = "校验小瓶缓冲液坐标", group = "校验", order = 301) + public void testMoveToLittleBufferPos(ConsumableGroup group) throws AppException { + resetStopFlag(); + enableModule(); + for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { + hbotCtrlService.moveToLittleBufferPiercePos(group, i); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + if (checkStopFlag()) + return; + } + } + @ExtApiFn(name = "停止校验", group = "校验", order = 304) + public void stopTest() throws AppException { + setStopFlag(); + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotProbeSubstancePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotProbeSubstancePosCalibration.java new file mode 100644 index 0000000..4bfa548 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotProbeSubstancePosCalibration.java @@ -0,0 +1,171 @@ +package a8k.service.app.devicectrl.pos.calibration; + + +import a8k.constant.AppConstant; +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.pos.algo.HbotLittleBSCalibrationAlgo; +import a8k.service.app.devicectrl.pos.param_mgr.HbotProbeSubstancePosMgr; +import a8k.service.app.devicectrl.pos.type.HbotProbeSubstancePos; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.type.ConsumableGroup; +import a8k.type.LittleBottleConsumablePosInfo; +import a8k.type.LittleBottleConsumableRefPoint; +import a8k.type.LittleBottleConsumableType; +import a8k.type.cfg.Pos2d; +import a8k.type.cfg.Pos3d; +import a8k.type.exception.AppException; +import a8k.utils.ZJsonHelper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; + +@ExtApiTab(cfg = ExtApiTabConfig.HbotProbeSubstancePosCalibration) +@Component +public class HbotProbeSubstancePosCalibration { + static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotProbeSubstancePosCalibration.class); + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + + @Resource + HbotCtrlService hbotCtrlService; + @Resource + HbotProbeSubstancePosMgr posMgr; + + List refPoint = new java.util.ArrayList<>(); + + Boolean stopFlag = false; + + Boolean checkStopFlag() { + if (stopFlag) { + stopFlag = false; + return true; + } + return false; + } + + void resetStopFlag() { + stopFlag = false; + } + + void setStopFlag() { + stopFlag = true; + } + + + @ExtApiFn(name = "获取坐标", group = "基础", order = 1) + public Object getPoss() throws AppException { + return posMgr.getParams(); + } + + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void moveToZero() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.enable(1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(0); + hbotDriver.enable(0); + } + + + @ExtApiFn(name = "开始标定", group = "标定小瓶XY坐标", order = 30) + public void startCalibrateLittleBottleGroup(LittleBottleConsumableType type) throws AppException { + refPoint = new java.util.ArrayList<>(); + moveToZero(); + disableModule(); + } + + @ExtApiFn(name = "添加参考点", group = "标定小瓶XY坐标", order = 31) + public Object addLittleBottleGroupRefPoint(ConsumableGroup group, Integer off0To24) throws AppException { + enableModule(); + Pos2d xypos = hbotDriver.readPos(); + LittleBottleConsumableRefPoint littleBufferRefPoint = new LittleBottleConsumableRefPoint(group, off0To24, new Pos3d(xypos.x, xypos.y, 0)); + this.refPoint.add(littleBufferRefPoint); + disableModule(); + ObjectNode node = ZJsonHelper.createObjectNode(); + node.put("newPoint", ZJsonHelper.createObjectNode(littleBufferRefPoint)); + node.put("computeResult", ZJsonHelper.createObjectNode(computeLittleBottlePosInfo())); + return node; + } + + @ExtApiFn(name = "移除最后一个参考点", group = "标定小瓶XY坐标", order = 32) + public void removeTheLastLittleBottleGroupRefPoint() { + if (!refPoint.isEmpty()) { + refPoint.remove(refPoint.size() - 1); + } + } + + + @ExtApiFn(name = "读取坐标计算结果", group = "标定小瓶XY坐标", order = 33) + public LittleBottleConsumablePosInfo computeLittleBottlePosInfo() { + return HbotLittleBSCalibrationAlgo.compute(refPoint); + } + + @ExtApiFn(name = "保存计算结果", group = "标定小瓶XY坐标", order = 34) + public void saveLittleBottleConsumablePosInfo() throws AppException { + posMgr.setPosInfo(computeLittleBottlePosInfo()); + } + + @ExtApiFn(name = "读取所有参考点", group = "标定小瓶XY坐标", order = 35) + public Object readAllRefPoint() throws AppException { + return refPoint; + } + + // + // 标定Z轴 + // + + public void setZPos(HbotProbeSubstancePos posName) throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMeasureDistance(); + posMgr.setParam(posName, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); + disableModule(); + } + + @ExtApiFn(name = "校准.小瓶取样Z轴位置", group = "标定Z轴", order = 102) + public void setSampleZPos() throws AppException {setZPos(HbotProbeSubstancePos.ProbeSubstanceSampleZPos);} + + @ExtApiFn(name = "校准.小瓶缓冲液取样结束Z轴位置", group = "标定Z轴", order = 104) + public void setSampleEndZPos() throws AppException {setZPos(HbotProbeSubstancePos.ProbeSubstanceSampleEndZPos);} + + // + // 校验 + // + @ExtApiFn(name = "校验", group = "校验", order = 301) + public void testMoveToLittleBufferPos(ConsumableGroup group) throws AppException { + resetStopFlag(); + enableModule(); + for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { + hbotCtrlService.moveToProbeSubstanceSamplePos(group, i); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + if (checkStopFlag()) + return; + } + } + + @ExtApiFn(name = "停止校验", group = "校验", order = 304) + public void stopTest() throws AppException { + setStopFlag(); + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotSamplePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotSamplePosCalibration.java new file mode 100644 index 0000000..3952231 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotSamplePosCalibration.java @@ -0,0 +1,146 @@ +package a8k.service.app.devicectrl.pos.calibration; + + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.pos.type.HbotSamplePos; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.exdriver.TubePreProcesModuleExDriver; +import a8k.service.app.devicectrl.pos.param_mgr.HbotSamplePosParamMgr; +import a8k.type.cfg.Pos2d; +import a8k.type.cfg.Pos3d; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +@ExtApiTab(cfg = ExtApiTabConfig.HbotSamplePosCalibration) +@Component +@Aspect +public class HbotSamplePosCalibration { + static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotSamplePosCalibration.class); + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + @Resource + MotorEnableExDriver motorEnableExDriver; + @Resource + TubePreProcesModuleExDriver tubePreProcesModuleExDriver; + + + @Resource + HbotCtrlService hbotCtrlService; + @Resource + HbotSamplePosParamMgr hbotSamplePosParamMgr; + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + + Boolean stopFlag = false; + Boolean checkStopFlag() { + if (stopFlag) { + stopFlag = false; + return true; + } + return false; + } + + void resetStopFlag() { + stopFlag = false; + } + + void setStopFlag() { + stopFlag = true; + } + + + @ExtApiFn(name = "获取坐标", group = "基础", order = 1) + public Object getPoss() throws AppException { + return hbotSamplePosParamMgr.getParams(); + } + + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void moveToZero() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.enable(1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + motorEnableExDriver.forceDisableAllMotor(); + } + + + @ExtApiFn(name = "试管夹具复位", group = "辅助工具", order = 21) + public void tubeClampMoveZero() throws AppException { + + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModShakeM, 5000); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModShakeM, 90, 5000); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModClampingM, 5000); + tubePreProcesModuleExDriver.clampingMReleaseTube(); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 0); + } + + @ExtApiFn(name = "释放试管", group = "辅助工具", order = 22) + public void releaseTubeClamp() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, 20, 5000); + // tubePreProcesModuleExDriver.clampingMReleaseTube(); + } + + @ExtApiFn(name = "夹紧试管", group = "辅助工具", order = 23) + public void clampTubeClamp() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + tubePreProcesModuleExDriver.clampingMclampTube(); + } + + + // + // 标定Z轴 + // + public Pos3d readPos() throws AppException { + enableModule(); + Pos2d xypos = hbotDriver.readPos(); + pipetteCtrlDriver.zMotorMeasureDistance(); + Integer z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); + Pos3d var = new Pos3d(xypos.x, xypos.y, z); + disableModule(); + return var; + } + + @ExtApiFn(name = "校准.采样位置", group = "标定", order = 104) + public void calibrationSamplePos(HbotSamplePos posType) throws AppException { + Pos3d pos3d = readPos(); + hbotSamplePosParamMgr.setSamplePos(posType, pos3d); + } + + + // + // 校验 + // + @ExtApiFn(name = "校验坐标", group = "校验", order = 303) + public void testSamplePos(HbotSamplePos posType) throws AppException { + hbotCtrlService.moveToSamplePos(posType); + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java new file mode 100644 index 0000000..2d720d8 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/HbotTipPosCalibration.java @@ -0,0 +1,232 @@ +package a8k.service.app.devicectrl.pos.calibration; + + +import a8k.constant.AppConstant; +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.devicectrl.pos.param_mgr.HbotTipPosMgr; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.type.*; +import a8k.type.cfg.Pos2d; +import a8k.type.cfg.Pos3d; +import a8k.type.exception.AppException; +import a8k.type.type.TipGroup; +import a8k.utils.ZJsonHelper; +import a8k.utils.ZSimplAlgo; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.annotation.Resource; +import org.aspectj.lang.annotation.Aspect; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +@ExtApiTab(cfg = ExtApiTabConfig.HbotTipPosCalibration) +@Component +@Aspect +public class HbotTipPosCalibration { + static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotTipPosCalibration.class); + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + + @Resource + HbotCtrlService hbotCtrlService; + @Resource + HbotTipPosMgr hbotTipPosMgr; + + Boolean stopFlag = false; + + Boolean checkStopFlag() { + if (stopFlag) { + stopFlag = false; + return true; + } + return false; + } + + void resetStopFlag() { + stopFlag = false; + } + + void setStopFlag() { + stopFlag = true; + } + + + @ExtApiFn(name = "获取所有坐标", group = "基础", order = 1) + public Object getPoss() throws AppException { + return hbotTipPosMgr.getParams(); + } + + + // 测试工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void moveToZero() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(1); + hbotDriver.enable(1); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + pipetteCtrlDriver.zMotorEnable(0); + hbotDriver.enable(0); + } + + // + // 标定 + // + + TipGroup tipGroup; + List tipRefPosList; + Pos3d tip000; + Double tipdx; + Double tipdy; + + + @ExtApiFn(name = "开始标定Tip坐标", group = "标定TIP坐标", order = 20) + public void startCalibrateTipPos(TipGroup tipGroup) throws AppException { + this.tipGroup = tipGroup; + tipRefPosList = new java.util.ArrayList<>(); + moveToZero(); + disableModule(); + tipdx = 0.0; + tipdy = 0.0; + tip000 = new Pos3d(0, 0, 0); + } + + + @ExtApiFn(name = "添加Tip参考点", group = "标定TIP坐标", order = 21) + public Object addTipPosRefPoint(TipRowNum row, TipColumnNum columnNum) throws AppException { + enableModule(); + Pos2d xypos = hbotDriver.readPos(); + pipetteCtrlDriver.zMotorMeasureDistance(); + Integer z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); + pipetteCtrlDriver.putTipBlock(); + TipRefPoint tipRefPoint = new TipRefPoint(row, columnNum, new Pos3d(xypos.x, xypos.y, z)); + tipRefPosList.add(tipRefPoint); + disableModule(); + + Map ret = new java.util.HashMap<>(); + ret.put("newPoint", tipRefPoint); + ret.put("computeResult", computeTipGroupPos()); + return ret; + } + + @ExtApiFn(name = "删除上一个Tip参考点", group = "标定TIP坐标", order = 22) + public Object removeTipPosRefPoint() throws AppException { + if (!tipRefPosList.isEmpty()) { + tipRefPosList.remove(tipRefPosList.size() - 1); + } + Map ret = new java.util.HashMap<>(); + ret.put("computeResult", computeTipGroupPos()); + return ret; + } + + + @ExtApiFn(name = "计算Tip坐标", group = "标定TIP坐标", order = 23) + public ObjectNode computeTipGroupPos() throws AppException { + TipRefPoint tip_ref_01_01 = tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.eq(TipRowNum.ROW00, TipColumnNum.Colu00)).findFirst().orElse(null); + + if (tip_ref_01_01 == null) { + throw new AppException(A8kEcode.CALIBRATION_TIP_REF_POINT_NOT_ENOUGH); + } + + + //计算tip01_01_x,取所有第一列tip坐标x的平局值 + Double tip01_01_x = ZSimplAlgo.computeAverage( + tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.col == TipColumnNum.Colu00). + map(tipRefPoint -> Double.valueOf(tipRefPoint.pos.x)).toList() + ); + + //计算tip01_01_y,取所有第1行tip坐标y的平局值 + Double tip01_01_y = ZSimplAlgo.computeAverage( + tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.row == TipRowNum.ROW00). + map(tipRefPoint -> Double.valueOf(tipRefPoint.pos.y)).toList() + ); + + //计算z,取所有tip坐标z的平局值 + Double tip01_01_z = ZSimplAlgo.computeAverage( + tipRefPosList.stream().map(tipRefPoint -> Double.valueOf(tipRefPoint.pos.z)).toList() + ); + //计算dx,所有点到tip01_01的距离除以行数 之后的平均值 + Double dx = ZSimplAlgo.computeAverage( + tipRefPosList.stream().filter(point -> !point.col.equals(TipColumnNum.Colu00)). + map(point -> Math.abs(point.pos.x - Double.valueOf(tip_ref_01_01.pos.x)) / point.col.ordinal()).toList() + ); + //计算dy,所有点到tip01_01的距离除以列数 之后的平均值 + Double dy = ZSimplAlgo.computeAverage( + tipRefPosList.stream().filter(point -> !point.row.equals(TipRowNum.ROW00)). + map(point -> Math.abs(point.pos.y - Double.valueOf(tip_ref_01_01.pos.y)) / point.row.ordinal()).toList() + ); + + tip01_01_z += 3; + + tip000 = new Pos3d(tip01_01_x.intValue(), tip01_01_y.intValue(), tip01_01_z.intValue()); + tipdx = dx; + tipdy = dy; + + + ObjectNode node = new ObjectMapper().createObjectNode(); + node.put("tip000", ZJsonHelper.createObjectNode(tip000)); + node.put("tipdx", tipdx); + node.put("tipdy", tipdy); + return node; + } + + + @ExtApiFn(name = "保存计算结果", group = "标定TIP坐标", order = 24) + public void saveTipGroupPos() throws AppException { + hbotTipPosMgr.setTipGroupParam(tipGroup, tip000, tipdx, tipdy); + } + + + @ExtApiFn(name = "标定.丢Tip坐标", group = "标定.丢Tip坐标", order = 30) + public void calibrateDropTipPos() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMeasureDistance(); + hbotTipPosMgr.setDropTipPos(new Pos3d(hbotDriver.readPos().x, hbotDriver.readPos().y, pipetteCtrlDriver.zMotorReadMeasureDistanceResult())); + disableModule(); + } + + // + // 校验 + // + @ExtApiFn(name = "校验取Tip坐标", group = "校验", order = 300) + public void testTakeTip(TipGroup tipGroup) throws AppException { + resetStopFlag(); + enableModule(); + for (int i = 0; i < AppConstant.TIP_NUM; i++) { + hbotCtrlService.testTakeTip(tipGroup, i); + if (checkStopFlag()) + return; + } + } + + @ExtApiFn(name = "校验丢Tip", group = "校验", order = 301) + public void testDropTipPos() throws AppException { + hbotCtrlService.dropTip(); + } + + @ExtApiFn(name = "停止校验", group = "校验", order = 304) + public void stopTest() throws AppException { + setStopFlag(); + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/ReactionPlatesTransmitControlerCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/ReactionPlatesTransmitControlerCalibration.java new file mode 100644 index 0000000..2ae690c --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/ReactionPlatesTransmitControlerCalibration.java @@ -0,0 +1,269 @@ +package a8k.service.app.devicectrl.pos.calibration; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.pos.param_mgr.HbotFixedPosParamMgr; +import a8k.service.app.devicectrl.pos.param_mgr.OptModuleParamsMgr; +import a8k.service.app.devicectrl.pos.param_mgr.PlatesBoxPosParamMgr; +import a8k.service.app.devicectrl.pos.param_mgr.TurntablePosParamMgr; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; +import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.MiniServoDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.cfg.Pos3d; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitControlerCalibration) +public class ReactionPlatesTransmitControlerCalibration { + + final static int overtime = 10000; + + @Resource + MiniServoDriver miniServoDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + OptModuleParamsMgr optModuleParamsMgr; + @Resource + TurntablePosParamMgr turntablePosParamMgr; + @Resource + PlatesBoxPosParamMgr platesBoxPosParamMgr; + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModuleCtrlService optScanModuleCtrlService; + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotDriver hbotDriver; + + + @Resource + HbotCtrlService hbotCtrlService; + @Resource + HbotFixedPosParamMgr hbotFixedPosParamMgr; + + @Resource + MotorEnableExDriver motorEnableExDriver; + + //基础工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 1) + public void deviceReset() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMoveZeroBlock(); + hbotDriver.moveToZeroBlock(); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, overtime); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 2) + public void enableModule() throws AppException { + motorEnableExDriver.reactionPlatesRelateModuleEnable(true); + motorEnableExDriver.hbotRelateModuleEnable(true); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 3) + public void disableModule() throws AppException { + motorEnableExDriver.reactionPlatesRelateModuleEnable(false); + motorEnableExDriver.hbotRelateModuleEnable(false); + } + + @ExtApiFn(name = "读取板夹仓坐标", group = "测试工具", order = 5) + public Object getPlatesBoxPos() { + return platesBoxPosParamMgr.getParams(); + } + + @ExtApiFn(name = "读取光学模组坐标", group = "测试工具", order = 6) + public Object getOptModulePos() { + return optModuleParamsMgr.getParams(); + } + + @ExtApiFn(name = "读取孵育盘坐标", group = "测试工具", order = 7) + public Object getTurntablePos() { + return turntablePosParamMgr.getParams(); + } + + + // + // 孵育盘校准 + // + + @ExtApiFn(name = "设置孵育盘间距", group = "孵育盘.校准", order = 100) + public void TurntablePosMgr_setPosSpacing(Integer posSpacing) { + turntablePosParamMgr.setPosSpacing(posSpacing); + } + + + @ExtApiFn(name = "设置孵育盘-仓0-入口位", group = "孵育盘.校准", order = 101) + public Integer TurntablePosMgr_setPushPos0() throws AppException { + Integer pushPos0 = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); + turntablePosParamMgr.setPushPos0(pushPos0); + return pushPos0; + } + + @ExtApiFn(name = "设置孵育盘-仓0-出口位", group = "孵育盘.校准", order = 102) + public Integer TurntablePosMgr_setPullPos0() throws AppException { + Integer pullPos0 = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); + turntablePosParamMgr.setPullPos0(pullPos0); + return pullPos0; + } + + @ExtApiFn(name = "设置孵育盘-仓0-放液位", group = "孵育盘.校准", order = 103) + public Integer TurntablePosMgr_setDropLiquidPos0() throws AppException { + Integer dropLiquidPos0 = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); + turntablePosParamMgr.setDropLiquidPos0(dropLiquidPos0); + return dropLiquidPos0; + } + + @ExtApiFn(name = "标定", group = "HbotTip滴定位.校准", order = 104) + public Pos3d Hbot_dropLiquidPosCalibration() throws AppException { + enableModule(); + pipetteCtrlDriver.zMotorMeasureDistance(); + var pos = new Pos3d(hbotDriver.readPos().x, hbotDriver.readPos().y, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); + hbotFixedPosParamMgr.setDropLiquidPos(pos); + disableModule(); + return pos; + } + + + // + // 板夹仓位置 + // + // @ExtApiFn(name = "设置板夹仓-Y轴间距", group = "板夹仓.校准", order = 200) + // public void PlatesBoxPosMgr_setYSpacing(Integer spaceing) throws AppException { + // platesBoxPosMgr.setYSpacing(spaceing); + // } + + @ExtApiFn(name = "设置板夹仓-仓0-Y轴坐标", group = "板夹仓.校准", order = 201) + public Integer PlatesBoxPosMgr_setCh0YPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); + platesBoxPosParamMgr.setCh0YPos(pos); + return pos; + } + + @ExtApiFn(name = "设置板夹仓-仓5-Y轴坐标", group = "板夹仓.校准", order = 202) + public Integer PlatesBoxPosMgr_setCh5YPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); + platesBoxPosParamMgr.setCh5YPos(pos); + return pos; + } + + @ExtApiFn(name = "设置板夹仓-仓0-X轴到位坐标", group = "板夹仓.校准", order = 203) + public Integer PlatesBoxPosMgr_setPushEndXPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + Integer pushEndXPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, overtime); + platesBoxPosParamMgr.setPushEndXPos(pushEndXPos); + return pushEndXPos; + } + + // + // 光学 + // + + // PullerTargetPos("拉板目标位置"), + // OptScanerDropPos("丢板坐标"), + // OptScanerScandbyPos("扫描待机位"), + + @ExtApiFn(name = "设置<拉板>目标位置", group = "光学模组基础坐标.校准", order = 300) + public Integer OptModulePosMgr_setPullerTargetPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + Integer pullerTargetPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModPullM, overtime); + optModuleParamsMgr.setPullerTargetPos(pullerTargetPos); + return pullerTargetPos; + } + + @ExtApiFn(name = "设置<光学扫描器>丢板坐标", group = "光学模组基础坐标.校准", order = 301) + public Integer OptModulePosMgr_setOptScanerDropPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + Integer optScanerDropPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); + optModuleParamsMgr.setOptScanerDropPos(optScanerDropPos); + return optScanerDropPos; + } + + @ExtApiFn(name = "设置<光学扫描器>扫描待机位", group = "光学模组基础坐标.校准", order = 302) + public Integer OptModulePosMgr_setOptScanerScandbyPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + Integer optScanerScandbyPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); + optModuleParamsMgr.setOptScanerScandbyPos(optScanerScandbyPos); + return optScanerScandbyPos; + } + + + // + // 校验 + // + + @ExtApiFn(name = "滴定", group = "校验", order = 1000) + public void turntableMoveDropPos(IncubatorPos pos) throws AppException { + turnableMoveCtrlService.trunableMoveToDropLiquidPos(pos); + hbotCtrlService.moveToDropLiquidPos(); + } + + @ExtApiFn(name = "孵育盘移动到拉板位", group = "校验", order = 1001) + public void turntableMovePullPos(IncubatorPos pos) throws AppException { + turnableMoveCtrlService.trunableMoveToPullPos(pos); + } + + @ExtApiFn(name = "孵育盘移动到推板位", group = "校验", order = 1002) + public void turntableMovePushPos(IncubatorPos pos) throws AppException { + turnableMoveCtrlService.trunableMoveToPushPos(pos); + } + + @ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003) + public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { + plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); + optScanModuleCtrlService.pullPlate(incubatorPos); + optScanModuleCtrlService.dropPlate(); + } + + @ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004) + public void pushAllAndRemoveAll() throws AppException { + pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE01); + pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE02); + pushOneAndRemove(ConsumableGroup.GROUP2, IncubatorPos.SPACE03); + pushOneAndRemove(ConsumableGroup.GROUP3, IncubatorPos.SPACE04); + pushOneAndRemove(ConsumableGroup.GROUP4, IncubatorPos.SPACE05); + pushOneAndRemove(ConsumableGroup.GROUP5, IncubatorPos.SPACE06); + + pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE07); + pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE08); + pushOneAndRemove(ConsumableGroup.GROUP2, IncubatorPos.SPACE09); + pushOneAndRemove(ConsumableGroup.GROUP3, IncubatorPos.SPACE10); + pushOneAndRemove(ConsumableGroup.GROUP4, IncubatorPos.SPACE11); + pushOneAndRemove(ConsumableGroup.GROUP5, IncubatorPos.SPACE12); + + pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE13); + pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE14); + pushOneAndRemove(ConsumableGroup.GROUP2, IncubatorPos.SPACE15); + pushOneAndRemove(ConsumableGroup.GROUP3, IncubatorPos.SPACE16); + pushOneAndRemove(ConsumableGroup.GROUP4, IncubatorPos.SPACE17); + pushOneAndRemove(ConsumableGroup.GROUP5, IncubatorPos.SPACE18); + + pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE19); + pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE20); + + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/TubeFeedingModulePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/TubeFeedingModulePosCalibration.java new file mode 100644 index 0000000..b40fa77 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/TubeFeedingModulePosCalibration.java @@ -0,0 +1,147 @@ +package a8k.service.app.devicectrl.pos.calibration; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.exdriver.MotorMoveZeroExDriver; +import a8k.service.app.devicectrl.exdriver.TubeTransportExDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; +import a8k.service.app.devicectrl.pos.param_mgr.TubeFeedingModuleParamMgr; +import a8k.service.db.type.Parameter; +import a8k.type.TubeFeedingModulePos; +import a8k.type.TubeFeedingModuleSetting; +import a8k.type.TubeHolderScanResult; +import a8k.type.ecode.AppCodeError; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.List; + + +@ExtApiTab(cfg = ExtApiTabConfig.TubeFeedingModulePosCalibration) +@Component +public class TubeFeedingModulePosCalibration { + + @Resource + TubeFeedingModuleParamMgr tubeScanPosMgr; + + @Resource + A8kCanBusService canBus; + @Resource + TubeFeedingCtrlService tubeFeedingCtrlService; + @Resource + TubeTransportExDriver tubeTransportExDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + MotorEnableExDriver motorEnableExDriver; + @Resource + MotorMoveZeroExDriver motorMoveZeroExDriver; + + + @ExtApiFn(name = "获得参数", group = "基础", order = 1) + public List getParams() throws AppException { + return tubeScanPosMgr.getParams(); + } + + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void deviceReset() throws AppException { + enableModule(); + motorMoveZeroExDriver.tubeFeeddingModuleMoveToZero(); + + //预处理归零 + motorEnableExDriver.preProcessRelatedModuleEnable(true); + motorMoveZeroExDriver.preProcessModuleMoveToZero(); + motorEnableExDriver.preProcessRelatedModuleEnable(false); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) + public void enableModule() throws AppException { + motorEnableExDriver.tubeFeedRelatedModuleEnable(true); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) + public void disableModule() throws AppException { + motorEnableExDriver.tubeFeedRelatedModuleEnable(false); + motorEnableExDriver.preProcessRelatedModuleEnable(false); + } + + // + // 辅助方法 + // + + private Integer readFeedingModXMPos() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.FeedingModXM, 15000); + } + + + // + // 设置 + // + + + @ExtApiFn(name = "设置试管扫描旋转舵机扭矩(0->1000)", group = "设置", order = 200) + public void setTubeScanServoTorque(Integer val) throws AppException { + tubeScanPosMgr.setParam(TubeFeedingModuleSetting.TubeScanServoTorque, val); + } + + + Integer tube01pos; + Integer tube10pos; + + @ExtApiFn(name = "标记当前位置为-试管1号位", group = "辅助设置试管间距", order = 201) + public Integer labelPosAsTube01Pos() throws AppException { + tube01pos = readFeedingModXMPos(); + disableModule(); + return tube01pos; + } + + @ExtApiFn(name = "标记当前位置为-试管10号位", group = "辅助设置试管间距", order = 202) + public Integer labelPosAsTube10Pos() throws AppException { + tube10pos = readFeedingModXMPos(); + disableModule(); + return tube10pos; + } + + @ExtApiFn(name = "计算并设置设置试管间距", group = "辅助设置试管间距", order = 203) + public Double setTubeSpacing() throws AppException { + if (tube01pos == null || tube10pos == null) { + throw new AppException(new AppCodeError("未标记试管1号位和10号位")); + } + Double spacing = (tube10pos - tube01pos) / 9.0; + tubeScanPosMgr.setParam(TubeFeedingModuleSetting.TubeSpacing, spacing); + return spacing; + } + + + // + // 标定坐标 + // + @ExtApiFn(name = "标定位置", group = "标定", order = 300) + public void calibratePos(TubeFeedingModulePos posType) throws AppException { + tubeScanPosMgr.setParam(posType, readFeedingModXMPos()); + disableModule(); + } + + // + // 校验 + // + + @ExtApiFn(name = "扫描试管架", group = "校验", order = 400) + public TubeHolderScanResult calibrateScanTubeHolder() throws AppException { + TubeHolderScanResult result = tubeFeedingCtrlService.scanTubeHodler(); + tubeFeedingCtrlService.ejectTubeHolder(); + return result; + } + + @ExtApiFn(name = "移动试管到预处理位置", group = "校验", order = 401) + public void calibrateMoveTubeToPreProcessPos(Integer tubeIndex0To9) throws AppException { + tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex0To9); + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java new file mode 100644 index 0000000..6a9b145 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/calibration/TubePreProcesPosCalibration.java @@ -0,0 +1,207 @@ +package a8k.service.app.devicectrl.pos.calibration; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.driver.MiniServoDriver; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.MiniServoMId; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.exdriver.MotorMoveZeroExDriver; +import a8k.service.app.devicectrl.exdriver.TubePreProcesModuleExDriver; +import a8k.service.app.devicectrl.pos.param_mgr.TubePreProcesPosParamMgr; +import a8k.type.TubePreProcessGripperPos; +import a8k.type.TubePreProcessTubeClamp; +import a8k.type.TubePreProcessYPos; +import a8k.type.TubePreProcessZAxisPos; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@ExtApiTab(cfg = ExtApiTabConfig.TubePreProcesPosCalibration) +@Component +public class TubePreProcesPosCalibration { + + final static Integer overtime = 6000; + + @Resource + TubePreProcesPosParamMgr posMgr; + + @Resource + MiniServoDriver miniServoDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + TubePreProcesCtrlService controler; + @Resource + MotorEnableExDriver motorEnableExDriver; + @Resource + MotorMoveZeroExDriver motorMoveZeroExDriver; + @Resource + TubePreProcesModuleExDriver tubePreProcesModuleExDriver; + + //基础工具 + @ExtApiFn(name = "归零", group = "测试工具", order = 1) + public void deviceReset() throws AppException { + enableModule(); + motorMoveZeroExDriver.preProcessModuleMoveToZero(); + } + + @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 2) + public void enableModule() throws AppException { + motorEnableExDriver.preProcessRelatedModuleEnable(true); + } + + @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 3) + public void disableModule() throws AppException { + motorEnableExDriver.preProcessRelatedModuleEnable(false); + motorEnableExDriver.tubeFeedRelatedModuleEnable(false); + } + + @ExtApiFn(name = "读取所有设定值", group = "测试工具", order = 5) + public Object getPoss() { + return posMgr.getParams(); + } + + + //TubePreProcessYPos + //TubePreProcessZAxisPos + //TubePreProcessGripperPos + //TubePreProcessTubeClamp + + + // + // 标定坐标 + // + @ExtApiFn(name = "标定前后移动伺服坐标", group = "标定", order = 100) + public Integer calibrateTubePreProcessYPos(TubePreProcessYPos posType) throws AppException { + Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); + posMgr.setPos(posType, pos); + return pos; + } + + @ExtApiFn(name = "标定Z轴坐标", group = "标定", order = 101) + public Integer calibrateTubePreProcessZAxisPos(TubePreProcessZAxisPos posType) throws AppException { + enableModule(); + Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, 10000); + posMgr.setPos(posType, pos); + disableModule(); + return pos; + } + + @ExtApiFn(name = "标定夹爪伺服坐标", group = "标定", order = 102) + public Integer calibrateTubePreProcessGripperPos(TubePreProcessGripperPos posType) throws AppException { + enableModule(); + Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); + posMgr.setPos(posType, pos); + disableModule(); + return pos; + } + + @ExtApiFn(name = "标定试管夹紧伺服坐标", group = "标定", order = 103) + public Integer calibrateTubePreProcessTubeClamp(TubePreProcessTubeClamp posType) throws AppException { + enableModule(); + Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM, 10000); + if (posType.equals(TubePreProcessTubeClamp.ShakeClampMotorClampPos)) { + posMgr.setPos(posType, pos - 2); + } else { + posMgr.setPos(posType, pos); + } + disableModule(); + return pos; + } + + // + // 夹爪标定,校准,校验 + // + @ExtApiFn(name = "<校验>张开", group = "校验.夹爪", order = 206) + public void gripperSVOpen() throws AppException { + miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); + tubePreProcesModuleExDriver.gripperSVOpen(); + } + + @ExtApiFn(name = "<校验>夹紧", group = "校验.夹爪", order = 205) + public void gripperSVCClose() throws AppException { + miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); + tubePreProcesModuleExDriver.gripperSVCClose(); + } + + @ExtApiFn(name = "<校验>夹住试管", group = "校验.夹爪", order = 205) + public void gripperSVClampTube() throws AppException { + miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); + tubePreProcesModuleExDriver.gripperSVClampTube(); + } + + // + //YSV : 设置参考点,标定,验证 + // + @ExtApiFn(name = "<校验>移动到摇匀位", group = "校验.YSV", order = 305) + public void YAxixServoShake() throws AppException { + miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); + tubePreProcesModuleExDriver.YSVMoveToShakePos(); + } + + @ExtApiFn(name = "<校验>移动到取试管位", group = "校验.YSV", order = 306) + public void YAxixServoTakeTube() throws AppException { + miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); + tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); + } + + @ExtApiFn(name = "<校验>移动到待机位", group = "校验.YSV", order = 307) + public void YAxixServoMoveToStandyPos() throws AppException { + miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); + tubePreProcesModuleExDriver.YSVMoveToStandyPos(); + } + // + //ZM : 标定,验证 + // + + @ExtApiFn(name = "<校验>取试管", group = "校验.ZM", order = 405) + public void takeTube(Boolean isHTube) throws AppException { + enableModule(); + tubePreProcesModuleExDriver.takeTubeFromTubeholder(isHTube); + } + + @ExtApiFn(name = "<校验>放试管", group = "校验.ZM", order = 406) + public void putTube(Boolean isHTube) throws AppException { + enableModule(); + tubePreProcesModuleExDriver.putTubeToTubeholder(isHTube); + } + + @ExtApiFn(name = "<校验>Z轴移动到取试管位置", group = "校验.ZM", order = 407) + public void zMotorMoveToTakeHTubePos(Boolean isHTube) throws AppException { + enableModule(); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); + tubePreProcesModuleExDriver.zMotorMoveToTakeHTubePos(isHTube); + } + + @ExtApiFn(name = "<校验>Z轴移动到摇匀位置", group = "校验.ZM", order = 408) + public void zMotorMoveToShakeTubePos() throws AppException { + enableModule(); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); + tubePreProcesModuleExDriver.zMotorMoveToShakeTubePos(); + } + + @ExtApiFn(name = "<校验>夹紧", group = "校验.夹紧", order = 503) + + public void clampTube() throws AppException { + tubePreProcesModuleExDriver.clampingMclampTube(); + } + + @ExtApiFn(name = "<校验>释放", group = "校验.夹紧", order = 504) + public void unclampTube() throws AppException { + tubePreProcesModuleExDriver.clampingMReleaseTube(); + } + + @ExtApiFn(name = "<校验>全部流程", group = "校验.全部", order = 600) + public void testAll(Boolean isHTube) throws AppException { + controler.takeTubeFromTubeholderToShakePos(isHTube); + controler.shakeTube(45, 5); + controler.takeTubeCap(isHTube); + controler.putbakTubeCapAndPutbakTubeToTubeHolder(isHTube); + } +} + + diff --git a/src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/HbotConsumableParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/HbotConsumableParamMgr.java new file mode 100644 index 0000000..e71fb85 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/ext_param_mgr/HbotConsumableParamMgr.java @@ -0,0 +1,66 @@ +package a8k.service.app.devicectrl.pos.ext_param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.HbotLargeBottleBSPosMgr; +import a8k.service.app.devicectrl.pos.param_mgr.HbotLittleBSPosMgr; +import a8k.service.app.devicectrl.pos.param_mgr.HbotProbeSubstancePosMgr; +import a8k.service.app.devicectrl.pos.param_mgr.HbotTipPosMgr; +import a8k.type.*; +import a8k.type.cfg.Pos3d; +import a8k.type.type.TipGroup; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotConsumableParamMgr { + @Resource + HbotLittleBSPosMgr hbotLittleBSPosMgr; + @Resource + HbotLargeBottleBSPosMgr hbotLargeBottleBSPosMgr; + @Resource + HbotTipPosMgr hbotTipPosMgr; + @Resource + HbotProbeSubstancePosMgr hbotProbeSubstancePosMgr; + + @PostConstruct + void initialize() { + } + + public Pos3d getTipPos(TipGroup tipGroup, Integer tipoff) { + return hbotTipPosMgr.getTipPos(tipGroup, tipoff); + } + + public Pos3d getLittleBufferPiercePos(ConsumableGroup group, Integer off) { + return hbotLittleBSPosMgr.getPiercePos(group, off); + } + + public Pos3d getLittleBufferSamplePos(ConsumableGroup group, Integer off) { + return hbotLittleBSPosMgr.getSamplePos(group, off); + } + + public Pos3d getLittleBufferSamplePosEnd(ConsumableGroup group, Integer off) { + return hbotLittleBSPosMgr.getSampleEndPos(group, off); + } + + public Pos3d getProbeSubstanceSamplePos(ConsumableGroup group, Integer off) { + return hbotProbeSubstancePosMgr.getSamplePos(group, off); + } + + public Pos3d getProbeSubstanceSamplePosEnd(ConsumableGroup group, Integer off) { + return hbotProbeSubstancePosMgr.getSampleEndPos(group, off); + } + + public Pos3d getLargeBufferSamplePos(ConsumableGroup group) { + return hbotLargeBottleBSPosMgr.getSamplePos(group); + } + + public Pos3d getLargeBufferSamplePosEnd(ConsumableGroup group){ + return hbotLargeBottleBSPosMgr.getSamplePosEnd(group); + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/Hbot2DCodeScanParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/Hbot2DCodeScanParamMgr.java new file mode 100644 index 0000000..6ae0090 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/Hbot2DCodeScanParamMgr.java @@ -0,0 +1,53 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.pos.type.Hbot2DCodeScanPos; +import a8k.type.cfg.Pos2d; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class Hbot2DCodeScanParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(Hbot2DCodeScanParamMgr.class); + + + @PostConstruct + void initialize() { + for (Hbot2DCodeScanPos pos : Hbot2DCodeScanPos.values()) { + setParamChName(pos, pos.chName); + } + } + + public void setPBScanPosX(Integer X, Pos2d pos) { + logger.info("setPBScanPos{} {}", X, pos); + setParam("PBScanPos" + X, pos); + } + + public void setLittBSX(Integer X, Pos2d pos) { + logger.info("setLittBS{} {}", X, pos); + setParam("LittBS" + X, pos); + } + + public void setLarBSX(Integer X, Pos2d pos) { + logger.info("setLarBS{} {}", X, pos); + setParam("LarBS" + X, pos); + } + + public Pos2d getPBScanPosX(Integer X) {return getPos("PBScanPos" + X, Pos2d.class);} + + public Pos2d getLittBSX(Integer X) { + return getPos("LittBS" + X, Pos2d.class); + } + + public Pos2d getLarBSX(Integer X) { + return getPos("LarBS" + X, Pos2d.class); + } + + +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotFixedPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotFixedPosParamMgr.java new file mode 100644 index 0000000..62f38bd --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotFixedPosParamMgr.java @@ -0,0 +1,42 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.type.cfg.Pos3d; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotFixedPosParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(HbotFixedPosParamMgr.class); + + enum Pos { + DropLiquidPos("滴液位置"), + ; + public final String chName; + + Pos(String chName) { + this.chName = chName; + } + } + + @PostConstruct + void initialize() { + for (Pos pos : Pos.values()) { + setParamChName(pos, pos.chName); + } + } + + public Pos3d getDropLiquidPos() { + return getPos(Pos.DropLiquidPos, Pos3d.class); + } + + public void setDropLiquidPos(Pos3d pos) { + setParam(Pos.DropLiquidPos.name(), pos); + } +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLargeBottleBSPosMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLargeBottleBSPosMgr.java new file mode 100644 index 0000000..070f385 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLargeBottleBSPosMgr.java @@ -0,0 +1,66 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.pos.type.HbotLargeBottleBSPos; +import a8k.type.*; +import a8k.type.cfg.Pos3d; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotLargeBottleBSPosMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(HbotLargeBottleBSPosMgr.class); + + + @PostConstruct + void initialize() { + for (HbotLargeBottleBSPos param : HbotLargeBottleBSPos.values()) { + setParamChName(param, param.chName); + } + } + public void setParam(HbotLargeBottleBSPos param, Object val) { + setParam(param.name(), val); + } + + public LargeBottoleConsumablePosInfo getLargeBufferGroupPosInfo() { + LargeBottoleConsumablePosInfo info = new LargeBottoleConsumablePosInfo(); + info.pos00 = getPos(HbotLargeBottleBSPos.LargeBuffer_0Pos, Pos3d.class); + info.dx = getPos(HbotLargeBottleBSPos.LargeBuffer_DX, Double.class); + info.dy = getPos(HbotLargeBottleBSPos.LargeBuffer_DY, Double.class); + return info; + } + + + public void setLargeBufferGroupPosInfo(LargeBottoleConsumablePosInfo info) { + setParam(HbotLargeBottleBSPos.LargeBuffer_0Pos, info.pos00); + setParam(HbotLargeBottleBSPos.LargeBuffer_DX, info.dx); + setParam(HbotLargeBottleBSPos.LargeBuffer_DY, info.dy); + } + + public Pos3d getSamplePos(ConsumableGroup group) { + Pos3d pos00 = getPos(HbotLargeBottleBSPos.LargeBuffer_0Pos.name(), Pos3d.class); + Double dx = getPos(HbotLargeBottleBSPos.LargeBuffer_DX, Double.class); + Double dy = getPos(HbotLargeBottleBSPos.LargeBuffer_DY, Double.class); + + + int xoff = group.off % 3; + int yoff = group.off / 3; + + double x = pos00.x + xoff * dx; + double y = pos00.y + yoff * dy; + double z = getPos(HbotLargeBottleBSPos.LargeBSSSampleZPos, Double.class); + return new Pos3d((int) x, (int) y, (int) z); + } + + public Pos3d getSamplePosEnd(ConsumableGroup group) { + Pos3d var = getSamplePos(group); + var.z = getPos(HbotLargeBottleBSPos.LargeBSSSampleEndZPos, Double.class).intValue(); + return var; + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLittleBSPosMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLittleBSPosMgr.java new file mode 100644 index 0000000..93a8fea --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotLittleBSPosMgr.java @@ -0,0 +1,90 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.pos.type.HbotLittleBSPos; +import a8k.type.*; +import a8k.type.cfg.Pos3d; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotLittleBSPosMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(HbotLittleBSPosMgr.class); + + + @PostConstruct + void initialize() { + for (HbotLittleBSPos param : HbotLittleBSPos.values()) { + setParamChName(param, param.chName); + } + } + + public void setParam(HbotLittleBSPos param, Object val) { + setParam(param.name(), val); + } + + + public LittleBottleConsumablePosInfo getPosInfo() { + LittleBottleConsumablePosInfo info = new LittleBottleConsumablePosInfo(); + info.g0_000 = getPos(HbotLittleBSPos.LittleBufferGroup0_000Pos, Pos3d.class); + info.g1_000 = getPos(HbotLittleBSPos.LittleBufferGroup1_000Pos, Pos3d.class); + info.g2_000 = getPos(HbotLittleBSPos.LittleBufferGroup2_000Pos, Pos3d.class); + info.g3_000 = getPos(HbotLittleBSPos.LittleBufferGroup3_000Pos, Pos3d.class); + info.g4_000 = getPos(HbotLittleBSPos.LittleBufferGroup4_000Pos, Pos3d.class); + info.g5_000 = getPos(HbotLittleBSPos.LittleBufferGroup5_000Pos, Pos3d.class); + info.dx = getPos(HbotLittleBSPos.LittleBufferGroupDX, Double.class); + info.dy = getPos(HbotLittleBSPos.LittleBufferGroupDY, Double.class); + return info; + } + + + public void setPosInfo(LittleBottleConsumablePosInfo info) { + setParam(HbotLittleBSPos.LittleBufferGroup0_000Pos, info.g0_000); + setParam(HbotLittleBSPos.LittleBufferGroup1_000Pos, info.g1_000); + setParam(HbotLittleBSPos.LittleBufferGroup2_000Pos, info.g2_000); + setParam(HbotLittleBSPos.LittleBufferGroup3_000Pos, info.g3_000); + setParam(HbotLittleBSPos.LittleBufferGroup4_000Pos, info.g4_000); + setParam(HbotLittleBSPos.LittleBufferGroup5_000Pos, info.g5_000); + setParam(HbotLittleBSPos.LittleBufferGroupDX, info.dx); + setParam(HbotLittleBSPos.LittleBufferGroupDY, info.dy); + } + + + + public Pos3d getPiercePos(ConsumableGroup group, Integer off) { + HbotLittleBSPos param = HbotLittleBSPos.valueOf(HbotLittleBSPos.LittleBufferGroup0_000Pos.ordinal() + group.ordinal()); + + Pos3d pos00 = getPos(param, Pos3d.class); + Double dx = getPos(HbotLittleBSPos.LittleBufferGroupDX, Double.class); + Double dy = getPos(HbotLittleBSPos.LittleBufferGroupDY, Double.class); + + Integer xoff = off % 5; + Integer yoff = off / 5; + + double x = pos00.x + xoff * dx; + double y = pos00.y + yoff * dy; + + Double z = getPos(HbotLittleBSPos.LittleBSPierceZPos, Double.class); + + + return new Pos3d((int) x, (int) y, z.intValue()); + } + + public Pos3d getSamplePos(ConsumableGroup group, Integer off) { + Pos3d pos = getPiercePos(group, off); + pos.z = getPos(HbotLittleBSPos.LittleBSSampleZPos, Double.class).intValue(); + return pos; + } + + public Pos3d getSampleEndPos(ConsumableGroup group, Integer off) { + Pos3d pos = getSamplePos(group, off); + pos.z = getPos(HbotLittleBSPos.LittleBSSampleEndZPos, Double.class).intValue(); + return pos; + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotProbeSubstancePosMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotProbeSubstancePosMgr.java new file mode 100644 index 0000000..99f0aaf --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotProbeSubstancePosMgr.java @@ -0,0 +1,87 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.pos.type.HbotProbeSubstancePos; +import a8k.type.ConsumableGroup; +import a8k.type.LittleBottleConsumablePosInfo; +import a8k.type.cfg.Pos3d; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotProbeSubstancePosMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(HbotProbeSubstancePosMgr.class); + + + @PostConstruct + void initialize() { + for (HbotProbeSubstancePos param : HbotProbeSubstancePos.values()) { + setParamChName(param, param.chName); + } + } + + public void setParam(HbotProbeSubstancePos param, Object val) { + setParam(param.name(), val); + } + + + public LittleBottleConsumablePosInfo getPosInfo() { + LittleBottleConsumablePosInfo info = new LittleBottleConsumablePosInfo(); + info.g0_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup0_000Pos, Pos3d.class); + info.g1_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup1_000Pos, Pos3d.class); + info.g2_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup2_000Pos, Pos3d.class); + info.g3_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup3_000Pos, Pos3d.class); + info.g4_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup4_000Pos, Pos3d.class); + info.g5_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup5_000Pos, Pos3d.class); + info.dx = getPos(HbotProbeSubstancePos.ProbeSubstanceDX, Double.class); + info.dy = getPos(HbotProbeSubstancePos.ProbeSubstanceDY, Double.class); + return info; + } + + + public void setPosInfo(LittleBottleConsumablePosInfo info) { + setParam(HbotProbeSubstancePos.ProbeSubstanceGroup0_000Pos, info.g0_000); + setParam(HbotProbeSubstancePos.ProbeSubstanceGroup1_000Pos, info.g1_000); + setParam(HbotProbeSubstancePos.ProbeSubstanceGroup2_000Pos, info.g2_000); + setParam(HbotProbeSubstancePos.ProbeSubstanceGroup3_000Pos, info.g3_000); + setParam(HbotProbeSubstancePos.ProbeSubstanceGroup4_000Pos, info.g4_000); + setParam(HbotProbeSubstancePos.ProbeSubstanceGroup5_000Pos, info.g5_000); + setParam(HbotProbeSubstancePos.ProbeSubstanceDX, info.dx); + setParam(HbotProbeSubstancePos.ProbeSubstanceDY, info.dy); + } + + + Pos3d getXYPos(ConsumableGroup group, Integer off) { + HbotProbeSubstancePos param = HbotProbeSubstancePos.valueOf(HbotProbeSubstancePos.ProbeSubstanceGroup0_000Pos.ordinal() + group.ordinal()); + + Pos3d pos00 = getPos(param, Pos3d.class); + Double dx = getPos(HbotProbeSubstancePos.ProbeSubstanceDX, Double.class); + Double dy = getPos(HbotProbeSubstancePos.ProbeSubstanceDY, Double.class); + + Integer xoff = off % 5; + Integer yoff = off / 5; + + double x = pos00.x + xoff * dx; + double y = pos00.y + yoff * dy; + + return new Pos3d((int) x, (int) y, 0); + } + + public Pos3d getSamplePos(ConsumableGroup group, Integer off) { + Pos3d pos = getXYPos(group, off); + pos.z = getPos(HbotProbeSubstancePos.ProbeSubstanceSampleZPos, Double.class).intValue(); + return pos; + } + + public Pos3d getSampleEndPos(ConsumableGroup group, Integer off) { + Pos3d pos = getSamplePos(group, off); + pos.z = getPos(HbotProbeSubstancePos.ProbeSubstanceSampleEndZPos, Double.class).intValue(); + return pos; + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotSamplePosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotSamplePosParamMgr.java new file mode 100644 index 0000000..1631fa9 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotSamplePosParamMgr.java @@ -0,0 +1,36 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.pos.type.HbotSamplePos; +import a8k.type.cfg.Pos3d; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotSamplePosParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(HbotSamplePosParamMgr.class); + + + + @PostConstruct + void initialize() { + for (HbotSamplePos pos : HbotSamplePos.values()) { + setParamChName(pos, pos.chName); + } + + } + + public Pos3d getSamplePos(HbotSamplePos pos) { + return getPos(pos, Pos3d.class); + } + + public void setSamplePos(HbotSamplePos pos, Pos3d pos3d) { + setParam(pos, pos3d); + } +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java new file mode 100644 index 0000000..3abdd82 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/HbotTipPosMgr.java @@ -0,0 +1,101 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.service.app.devicectrl.pos.type.HbotTipPosParam; +import a8k.type.cfg.Pos3d; +import a8k.type.type.TipGroup; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.util.Assert; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class HbotTipPosMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(HbotTipPosMgr.class); + + + + @PostConstruct + void initialize() { + for (HbotTipPosParam param : HbotTipPosParam.values()) { + setParamChName(param, param.chName); + } + + } + + public void setParam(HbotTipPosParam param, Object val) { + setParam(param.name(), val); + } + + public void setTipGroupParam(TipGroup tipGroup, Pos3d tip000, Double dx, Double dy) { + HbotTipPosParam tip000Pos = null; + HbotTipPosParam tipDxPos = null; + HbotTipPosParam tipDyPos = null; + + if (tipGroup == TipGroup.GROUP0) { + tip000Pos = HbotTipPosParam.TipGroup0_000Pos; + tipDxPos = HbotTipPosParam.TipGroup0_SpaceingX; + tipDyPos = HbotTipPosParam.TipGroup0_SpaceingY; + } else if (tipGroup == TipGroup.GROUP1) { + tip000Pos = HbotTipPosParam.TipGroup1_000Pos; + tipDxPos = HbotTipPosParam.TipGroup1_SpaceingX; + tipDyPos = HbotTipPosParam.TipGroup2_SpaceingY; + } else if (tipGroup == TipGroup.GROUP2) { + tip000Pos = HbotTipPosParam.TipGroup2_000Pos; + tipDxPos = HbotTipPosParam.TipGroup2_SpaceingX; + tipDyPos = HbotTipPosParam.TipGroup2_SpaceingY; + } + + Assert.isTrue(tip000Pos != null, "tip000Pos != null"); + + setParam(tip000Pos, tip000); + setParam(tipDxPos, dx); + setParam(tipDyPos, dy); + } + + public Pos3d getTipPos(TipGroup tipGroup, Integer tipoff) { + Pos3d tip000 = null; + Double dx = 0.0; + Double dy = 0.0; + + if (tipGroup == TipGroup.GROUP0) { + tip000 = getPos(HbotTipPosParam.TipGroup0_000Pos, Pos3d.class); + dx = getPos(HbotTipPosParam.TipGroup0_SpaceingX, Double.class); + dy = getPos(HbotTipPosParam.TipGroup0_SpaceingY, Double.class); + + } else if (tipGroup == TipGroup.GROUP1) { + tip000 = getPos(HbotTipPosParam.TipGroup1_000Pos, Pos3d.class); + dx = getPos(HbotTipPosParam.TipGroup1_SpaceingX, Double.class); + dy = getPos(HbotTipPosParam.TipGroup2_SpaceingY, Double.class); + } else if (tipGroup == TipGroup.GROUP2) { + tip000 = getPos(HbotTipPosParam.TipGroup2_000Pos, Pos3d.class); + dx = getPos(HbotTipPosParam.TipGroup2_SpaceingX, Double.class); + dy = getPos(HbotTipPosParam.TipGroup2_SpaceingY, Double.class); + } + Assert.isTrue(tip000 != null, "tip000 != null"); + Assert.isTrue(dx != null, "dx != null"); + Assert.isTrue(dy != null, "dy != null"); + + int xoff = tipoff % 12; + int yoff = tipoff / 12; + + double x = tip000.x + xoff * dx; + double y = tip000.y + yoff * dy; + double z = tip000.z; + + return new Pos3d((int) x, (int) y, (int) z); + } + + + public void setDropTipPos(Pos3d pos){ + setParam(HbotTipPosParam.DropTipPos, pos); + } + + public Pos3d getDropTipPos(){ + return getPos(HbotTipPosParam.DropTipPos, Pos3d.class); + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java new file mode 100644 index 0000000..0a33617 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/OptModuleParamsMgr.java @@ -0,0 +1,89 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class OptModuleParamsMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(OptModuleParamsMgr.class); + + + enum POS { + PullerTargetPos("拉板目标位置"), + OptScanerDropPos("丢板坐标"), + OptScanerScandbyPos("扫描待机位"), + TOptScanStartPos("T光学扫描起始坐标"), + FOptScanStartPos("F光学扫描起始坐标"), + ; + public final String chName; + + POS(String chName) { + this.chName = chName; + } + } + + + @PostConstruct + void initialize() { + for (POS pos : POS.values()) { + setParamChName(pos, pos.chName); + } + } + + public void paramReset() { + logger.info("init param"); + setParam(POS.PullerTargetPos, 1147); + setParam(POS.OptScanerDropPos, -349); + setParam(POS.OptScanerScandbyPos, 305); + setParam(POS.TOptScanStartPos, 3723); + setParam(POS.FOptScanStartPos, 2559); + } + + public Integer getPullerTargetPos() { + return getPos(POS.PullerTargetPos, Integer.class); + } + + public Integer getOptScanerDropPos() { + return getPos(POS.OptScanerDropPos, Integer.class); + } + + public Integer getOptScanerScandbyPos() { + return getPos(POS.OptScanerScandbyPos, Integer.class); + } + + public Integer getTOptScanStartPos() { + return getPos(POS.TOptScanStartPos, Integer.class); + } + + public Integer getFOptScanStartPos() { + return getPos(POS.FOptScanStartPos, Integer.class); + } + + public void setPullerTargetPos(Integer pos) { + setParam(POS.PullerTargetPos, pos); + } + + public void setOptScanerDropPos(Integer pos) { + setParam(POS.OptScanerDropPos, pos); + } + + public void setOptScanerScandbyPos(Integer pos) { + setParam(POS.OptScanerScandbyPos, pos); + } + + public void setTOptScanStartPos(Integer pos) { + setParam(POS.TOptScanStartPos, pos); + } + + public void setFOptScanStartPos(Integer pos) { + setParam(POS.FOptScanStartPos, pos); + } +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/PlatesBoxPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/PlatesBoxPosParamMgr.java new file mode 100644 index 0000000..0a687a3 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/PlatesBoxPosParamMgr.java @@ -0,0 +1,75 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +@Component +public class PlatesBoxPosParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(PlatesBoxPosParamMgr.class); + + enum POS { + Ch0YPos("通道0Y轴位置"), + Ch5YPos("通道5Y轴位置"), + PushEndXPos("推杆到位坐标"), + ; + public final String chName; + + POS(String chName) { + this.chName = chName; + } + } + + + @PostConstruct + void initialize() { + for (POS pos : POS.values()) { + setParamChName(pos, pos.chName); + } + } + + + public void paramReset() { + logger.info("init param"); + setParam(POS.Ch0YPos, -17); + setParam(POS.Ch5YPos, 1308); + setParam(POS.PushEndXPos, 1160); + } + + public Integer getCh0YPos() { + return getPos(POS.Ch0YPos, Integer.class); + } + + public Integer getCh5YPos() { + return getPos(POS.Ch0YPos, Integer.class); + } + + public Double getYSpacing() { + return (getCh5YPos() - getCh0YPos()) / 5.0; + } + + public Integer getChXPos(int ch) { + return (int) (getCh0YPos() + ch * getYSpacing()); + } + + public Integer getPushEndXPos() { + return getPos(POS.PushEndXPos, Integer.class); + } + + public void setCh0YPos(Integer pos) { + setParam(POS.Ch0YPos, pos); + } + + public void setCh5YPos(Integer pos) { + setParam(POS.Ch5YPos, pos); + } + + public void setPushEndXPos(Integer pos) { + setParam(POS.PushEndXPos, pos); + } +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubeFeedingModuleParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubeFeedingModuleParamMgr.java new file mode 100644 index 0000000..5b68369 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubeFeedingModuleParamMgr.java @@ -0,0 +1,101 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.type.TubeFeedingModuleSetting; +import a8k.type.TubeFeedingModulePos; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + + +@Component +public class TubeFeedingModuleParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(TubeFeedingModuleParamMgr.class); + @PostConstruct + void initialize() { + for (TubeFeedingModulePos pos : TubeFeedingModulePos.values()) { + setParamChName(pos, pos.chName); + } + for (TubeFeedingModuleSetting param : TubeFeedingModuleSetting.values()) { + setParamChName(param, param.chName); + } + } + + /** + * 获取管子预处理位置 + * @param tubeIndex 管子序号 + * @return 坐标 + */ + public Integer getTubePreProcessPos(Integer tubeIndex) { + Integer startPos = getPos(TubeFeedingModulePos.Tube0PreProcessPos, Integer.class); + Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); + return (int)(startPos + spacing * tubeIndex); + } + + /** + * 获取试管扫描位置 + * @param tubeIndex 管子序号 + * @return 坐标 + */ + public Integer getTubeScanPos(Integer tubeIndex) { + Integer startPos = getPos(TubeFeedingModulePos.Tube0ScanPos, Integer.class); + Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); + return (int)(startPos + spacing * tubeIndex); + } + + /** + * 获取试管高度判断位置 + * @param tubeIndex 管子序号 + * @return 坐标 + */ + public Integer getTubeAltitJudgPos(Integer tubeIndex) { + Integer startPos = getPos(TubeFeedingModulePos.Tube0AltitJudgPos, Integer.class); + Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); + return (int)(startPos + spacing * tubeIndex); + } + + /** + * 获取试管存在判断位置 + * @param tubeIndex 管子序号 + * @return 坐标 + */ + public Integer getTubeExistJudgPos(Integer tubeIndex) { + Integer startPos = getPos(TubeFeedingModulePos.Tube0ExistJudgPos, Integer.class); + Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); + return (int)(startPos + spacing * tubeIndex); + } + + + /** + * 获取试管架进入位置 + * @return X轴坐标 + */ + public Integer getTubeHolderEnterXPos() { + return getPos(TubeFeedingModulePos.TubeHolderEnterXPos, Integer.class); + } + + /** + * 获取试管架出口位置 + * @return X轴坐标 + */ + public Integer getTubeHolderExitXPos() { + return getPos(TubeFeedingModulePos.TubeHolderExitXPos, Integer.class); + } + + /** + * 获取试管架扫描位置 + * @return X轴坐标 + */ + public Integer getTubeHolderScanXPos() { + return getPos(TubeFeedingModulePos.TubeHolderScanXPos, Integer.class); + } + + /** + * 获取试管架扫描位置 + * @return X轴坐标 + */ + public Integer getTubeScanServoTorque() { + return getPos(TubeFeedingModuleSetting.TubeScanServoTorque, Integer.class); + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java new file mode 100644 index 0000000..2d55764 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TubePreProcesPosParamMgr.java @@ -0,0 +1,80 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import a8k.type.TubePreProcessGripperPos; +import a8k.type.TubePreProcessTubeClamp; +import a8k.type.TubePreProcessYPos; +import a8k.type.TubePreProcessZAxisPos; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +public class TubePreProcesPosParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(TubeFeedingModuleParamMgr.class); + @PostConstruct + void initialize() { + for (var pos : TubePreProcessGripperPos.values()) { + setParamChName(pos, pos.chName); + } + for (var pos : TubePreProcessTubeClamp.values()) { + setParamChName(pos, pos.chName); + } + for (var pos : TubePreProcessYPos.values()) { + setParamChName(pos, pos.chName); + } + for (var pos : TubePreProcessZAxisPos.values()) { + setParamChName(pos, pos.chName); + } + } + + public void setPos(TubePreProcessGripperPos pos, Integer value) {setParam(pos, value);} + + public void setPos(TubePreProcessTubeClamp pos, Integer value) {setParam(pos, value);} + + public void setPos(TubePreProcessYPos pos, Integer value) {setParam(pos, value);} + + public void setPos(TubePreProcessZAxisPos pos, Integer value) {setParam(pos, value);} + + private Integer getParam(Enum pos) {return getPos(pos, Integer.class);} + + //Public + + public Integer getPos(TubePreProcessGripperPos pos) {return getParam(pos);} + + public Integer getPos(TubePreProcessTubeClamp pos) {return getParam(pos);} + + public Integer getPos(TubePreProcessYPos pos) {return getParam(pos);} + + public Integer getPos(TubePreProcessZAxisPos pos) {return getParam(pos);} + + + public Integer getGripperServoOpenPos() {return getParam(TubePreProcessGripperPos.GripperServoOpenPos);} + + public Integer getGripperServoClosePos() {return getParam(TubePreProcessGripperPos.GripperServoClosePos);} + + public Integer getGripperServoTakeCapPos() {return getParam(TubePreProcessGripperPos.GripperServoTakeCapPos);} + + public Integer getYServoTakeTubePos() {return getParam(TubePreProcessYPos.YServoTakeTubePos);} + + public Integer getYServoShakePos() {return getParam(TubePreProcessYPos.YServoShakePos);} + + public Integer getZMotorTakeTubePos(Boolean hightTuhe) { + if (hightTuhe) { + return getParam(TubePreProcessZAxisPos.ZMotorTakeHTubePos); + } else { + return getParam(TubePreProcessZAxisPos.ZMotorTakeSTubePos); + } + } + + public Integer getZMotorShakeTubePos() {return getParam(TubePreProcessZAxisPos.ZMotorShakeTubePos);} + + public Integer getZMotorPutCapPos() {return getParam(TubePreProcessZAxisPos.ZMotorPutTubeCapPos);} + + public Integer getShakeClampMotorClampPos() {return getParam(TubePreProcessTubeClamp.ShakeClampMotorClampPos);} + + public Integer getShakeClampMotorReleasePos() {return getParam(TubePreProcessTubeClamp.ShakeClampMotorReleasePos);} + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TurntablePosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TurntablePosParamMgr.java new file mode 100644 index 0000000..993b53b --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/TurntablePosParamMgr.java @@ -0,0 +1,75 @@ +package a8k.service.app.devicectrl.pos.param_mgr; + +import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * HBOT二维码扫描坐标参数 + */ +@Component +public class TurntablePosParamMgr extends ParamMgr { + static final Logger logger = LoggerFactory.getLogger(TurntablePosParamMgr.class); + /* + * 转盘相关位置 + */ + enum POS { + PushPos0("入板位置"), + PullPos0("出板位置"), + DropLiquidPos0("滴液位置"), + PosSpacing("位置间隔"), + ; + final String chName; + POS(String chName) { + this.chName = chName; + } + } + @PostConstruct + void initialize() { + for (POS pos : POS.values()) { + setParamChName(pos, pos.chName); + } + } + + public void paramReset() { + logger.info("init param"); + setParam(POS.PushPos0, 1650); + setParam(POS.PullPos0, 19700); + setParam(POS.DropLiquidPos0, 1650 + 8950); + setParam(POS.PosSpacing, 1800); + } + public Integer getPushPos0() { + return getPos(POS.PushPos0, Integer.class); + } + + public Integer getPullPos0() { + return getPos(POS.PullPos0, Integer.class); + } + + public Integer getDropLiquidPos0() { + return getPos(POS.DropLiquidPos0, Integer.class); + } + + public Integer getPosSpacing() { + return getPos(POS.PosSpacing, Integer.class); + } + + public void setPushPos0(Integer pos) { + setParam(POS.PushPos0, pos); + } + + public void setPullPos0(Integer pos) { + setParam(POS.PullPos0, pos); + } + + public void setDropLiquidPos0(Integer pos) { + setParam(POS.DropLiquidPos0, pos); + } + + public void setPosSpacing(Integer pos) { + setParam(POS.PosSpacing, pos); + } +} + diff --git a/src/main/java/a8k/service/app/devicectrl/param/param_mgr/base/ParamMgr.java b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/base/ParamMgr.java new file mode 100644 index 0000000..72f266e --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/param_mgr/base/ParamMgr.java @@ -0,0 +1,49 @@ +package a8k.service.app.devicectrl.pos.param_mgr.base; + +import a8k.service.db.LowerDeviceParameterDBService; +import a8k.service.db.type.Parameter; +import jakarta.annotation.Resource; + +import java.util.List; + +public class ParamMgr { + @Resource + LowerDeviceParameterDBService db; + String serviceName = this.getClass().getSimpleName(); + + + public List getParams() { + return db.getParams(serviceName); + } + + public void resetParams() { + db.resetParamByService(serviceName); + } + + public void resetParam(String key) { + db.resetParam(serviceName, key); + } + + + public T getPos(String key, Class tClass) { + return db.getParam(this.serviceName, key, tClass); + } + + public T getPos(Enum key, Class tClass) { + return db.getParam(this.serviceName, key.name(), tClass); + } + + public void setParamChName(Enum key, String chName) { + db.setParamChName(serviceName, key.name(), chName); + } + + + public void setParam(String key, Object pos) { + db.updateParam(serviceName, key, pos); + } + + public void setParam(Enum key, Object pos) { + db.updateParam(serviceName, key.name(), pos); + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/Hbot2DCodeScanPos.java b/src/main/java/a8k/service/app/devicectrl/param/type/Hbot2DCodeScanPos.java new file mode 100644 index 0000000..fa1399a --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/Hbot2DCodeScanPos.java @@ -0,0 +1,30 @@ +package a8k.service.app.devicectrl.pos.type; + +public enum Hbot2DCodeScanPos { + PBScanPos0("板夹仓扫码位置0"), + PBScanPos1("板夹仓扫码位置1"), + PBScanPos2("板夹仓扫码位置2"), + PBScanPos3("板夹仓扫码位置3"), + PBScanPos4("板夹仓扫码位置4"), + PBScanPos5("板夹仓扫码位置5"), + + LittBS0("小缓冲液扫码位置0"), + LittBS1("小缓冲液扫码位置1"), + LittBS2("小缓冲液扫码位置2"), + LittBS3("小缓冲液扫码位置3"), + LittBS4("小缓冲液扫码位置4"), + LittBS5("小缓冲液扫码位置5"), + + LarBS0("大缓冲液扫码位置0"), + LarBS1("大缓冲液扫码位置1"), + LarBS2("大缓冲液扫码位置2"), + LarBS3("大缓冲液扫码位置3"), + LarBS4("大缓冲液扫码位置4"), + LarBS5("大缓冲液扫码位置5"), + ; + public final String chName; + + Hbot2DCodeScanPos(String chName) { + this.chName = chName; + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/HbotLargeBottleBSPos.java b/src/main/java/a8k/service/app/devicectrl/param/type/HbotLargeBottleBSPos.java new file mode 100644 index 0000000..cd2475f --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/HbotLargeBottleBSPos.java @@ -0,0 +1,19 @@ +package a8k.service.app.devicectrl.pos.type; + +public enum HbotLargeBottleBSPos { + LargeBuffer_0Pos("大瓶缓冲液的第1个位置"), + LargeBuffer_DX("大瓶缓冲液的X间距"), + LargeBuffer_DY("大瓶缓冲液的Y间距"), + LargeBSSSampleZPos("大瓶缓冲液取样Z坐标"), + LargeBSSSampleEndZPos("大瓶缓冲液取样结束Z坐标"), + ; + final public String chName; + + HbotLargeBottleBSPos(String chName) { + this.chName = chName; + } + + public static HbotLargeBottleBSPos valueOf(int off) { + return HbotLargeBottleBSPos.values()[off]; + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/HbotLittleBSPos.java b/src/main/java/a8k/service/app/devicectrl/param/type/HbotLittleBSPos.java new file mode 100644 index 0000000..99aedfe --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/HbotLittleBSPos.java @@ -0,0 +1,26 @@ +package a8k.service.app.devicectrl.pos.type; + +public enum HbotLittleBSPos { + LittleBufferGroup0_000Pos("第1组小瓶缓冲液的第1个位置"), + LittleBufferGroup1_000Pos("第1组小瓶缓冲液的第2个位置"), + LittleBufferGroup2_000Pos("第1组小瓶缓冲液的第3个位置"), + LittleBufferGroup3_000Pos("第1组小瓶缓冲液的第4个位置"), + LittleBufferGroup4_000Pos("第1组小瓶缓冲液的第5个位置"), + LittleBufferGroup5_000Pos("第1组小瓶缓冲液的第6个位置"), + LittleBufferGroupDX("小瓶缓冲液的X间距"), + LittleBufferGroupDY("小瓶缓冲液的Y间距"), + + LittleBSPierceZPos("小瓶缓冲液刺破Z坐标"), + LittleBSSampleZPos("小瓶缓冲液取样Z坐标"), + LittleBSSampleEndZPos("小瓶缓冲液取样结束Z坐标"), + ; + final public String chName; + + HbotLittleBSPos(String chName) { + this.chName = chName; + } + + public static HbotLittleBSPos valueOf(int off) { + return HbotLittleBSPos.values()[off]; + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/HbotProbeSubstancePos.java b/src/main/java/a8k/service/app/devicectrl/param/type/HbotProbeSubstancePos.java new file mode 100644 index 0000000..62d6e10 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/HbotProbeSubstancePos.java @@ -0,0 +1,26 @@ +package a8k.service.app.devicectrl.pos.type; + +public enum HbotProbeSubstancePos { + ProbeSubstanceGroup0_000Pos("第1组探测物质的第1个位置"), + ProbeSubstanceGroup1_000Pos("第1组探测物质的第2个位置"), + ProbeSubstanceGroup2_000Pos("第1组探测物质的第3个位置"), + ProbeSubstanceGroup3_000Pos("第1组探测物质的第4个位置"), + ProbeSubstanceGroup4_000Pos("第1组探测物质的第5个位置"), + ProbeSubstanceGroup5_000Pos("第1组探测物质的第6个位置"), + ProbeSubstanceDX("探测物质的X间距"), + ProbeSubstanceDY("探测物质的Y间距"), + + ProbeSubstanceSampleZPos("探测物质取样Z坐标"), + ProbeSubstanceSampleEndZPos("探测物质取样结束Z坐标"), + + ; + final public String chName; + + HbotProbeSubstancePos(String chName) { + this.chName = chName; + } + + public static HbotProbeSubstancePos valueOf(int off) { + return HbotProbeSubstancePos.values()[off]; + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/HbotSamplePos.java b/src/main/java/a8k/service/app/devicectrl/param/type/HbotSamplePos.java new file mode 100644 index 0000000..3935401 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/HbotSamplePos.java @@ -0,0 +1,35 @@ +package a8k.service.app.devicectrl.pos.type; + +public enum HbotSamplePos { + EmergencyTubeSamplePos("<急诊位>取样位置"), + EmergencyTubeSampleEndPos("<急诊位>取样结束位置"), + + BloodHTubeSamplePos("<全血高试管>取样位置"), + BloodHTubeSampleEndPos("<全血高试管>取样结束位置"), + + BloodSTubeSamplePos("<全血低试管>取样位置"), + BloodSTubeSampleEndPos("<全血低试管>取样结束位置"), + + MiniTubeSamplePos("<迷你试管>取样位置"), + MinitubeSampleEndPos("<迷你试管>取样结束位置"), + + MiniBloodSamplePos("<阳普管>取样位置"), + MiniBloodSampleEndPos("<阳普管>取样结束位置"), + + Bulltube1P5SamplePos("<子弹头试管1.5mL>取样位置"), + Bulltube1P5SampleEndPos("<子弹头试管1.5mL>取样结束位置"), + + Bulltube0P5SamplePos("<子弹头试管0.5mL>取样位置"), + Bulltube0P5SampleEndPos("<子弹头试管0.5mL>取样结束位置"), + + StoolTestTubeSamplePos("<粪便试管>取样位置"), + StoolTestTubeSampleEndPos("<粪便试管>取样结束位置"), + ; + public final String chName; + + HbotSamplePos(String chName) { + this.chName = chName; + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/param/type/HbotTipPosParam.java b/src/main/java/a8k/service/app/devicectrl/param/type/HbotTipPosParam.java new file mode 100644 index 0000000..30eba82 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/param/type/HbotTipPosParam.java @@ -0,0 +1,27 @@ +package a8k.service.app.devicectrl.pos.type; + +public enum HbotTipPosParam { + TipGroup0_000Pos("第1组TIP的第1个位置"), + TipGroup0_SpaceingX("第1组TIP的X间距"), + TipGroup0_SpaceingY("第1组TIP的Y间距"), + + TipGroup1_000Pos("第2组TIP的第1个位置"), + TipGroup1_SpaceingX("第2组TIP的X间距"), + TipGroup1_SpaceingY("第2组TIP的Y间距"), + + TipGroup2_000Pos("第3组TIP的第1个位置"), + TipGroup2_SpaceingX("第3组TIP的X间距"), + TipGroup2_SpaceingY("第3组TIP的Y间距"), + + DropTipPos("丢TIP位置"), + ; + final public String chName; + + HbotTipPosParam(String chName) { + this.chName = chName; + } + + public static HbotTipPosParam valueOf(int off) { + return HbotTipPosParam.values()[off]; + } +} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/algo/HbotLittleBSCalibrationAlgo.java b/src/main/java/a8k/service/app/devicectrl/pos/algo/HbotLittleBSCalibrationAlgo.java deleted file mode 100644 index a6f70ae..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/algo/HbotLittleBSCalibrationAlgo.java +++ /dev/null @@ -1,102 +0,0 @@ -package a8k.service.app.devicectrl.pos.algo; - - - -import a8k.type.ConsumableGroup; -import a8k.type.LittleBottleConsumablePosInfo; -import a8k.type.LittleBottleConsumableRefPoint; -import a8k.type.cfg.Pos3d; -import a8k.utils.ZSimplAlgo; -import org.slf4j.Logger; -import java.util.List; - -public class HbotLittleBSCalibrationAlgo { - static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotLittleBSCalibrationAlgo.class); - - - static public LittleBottleConsumablePosInfo compute(List refPoint) { - //计算y0,所有group==0,1,2,同时0<=off<5的点,求平均 - Double[] y = new Double[2]; - Double[] x = new Double[3]; - Double[] dxs = new Double[6]; - Double[] dys = new Double[6]; - Double dx; - Double dy; - // double z = 0.0; - - LittleBottleConsumableRefPoint[] gx_00 = new LittleBottleConsumableRefPoint[6]; - - gx_00[0] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP0 && point.index == 0).findFirst().orElse(null); - gx_00[1] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP1 && point.index == 0).findFirst().orElse(null); - gx_00[2] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP2 && point.index == 0).findFirst().orElse(null); - gx_00[3] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP3 && point.index == 0).findFirst().orElse(null); - gx_00[4] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP4 && point.index == 0).findFirst().orElse(null); - gx_00[5] = refPoint.stream().filter(point -> point.group == ConsumableGroup.GROUP5 && point.index == 0).findFirst().orElse(null); - - y[0] = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() < 3 && point.index < 5). - map(point -> point.pos.y).toList() - ); - //计算y1,所有group==3,4,5,同时0<=off<5的点,求平均 - y[1] = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() >= 3 && point.index < 5). - map(point -> point.pos.y).toList() - ); - - //计算x0,所有group==0,3,同时off==0,5,10,15,20的点,求y平均 - x[0] = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() % 3 == 0 && point.index % 5 == 0). - map(point -> point.pos.x).toList() - ); - //计算x1,所有group==1,4,同时off==0,5,10,15,20的点,求y平均 - x[1] = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() % 3 == 1 && point.index % 5 == 0). - map(point -> point.pos.x).toList() - ); - //计算x2 - x[2] = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() % 3 == 2 && point.index % 5 == 0). - map(point -> point.pos.x).toList() - ); - // z = ZSimplAlgo.computeAverage(zpos); - //计算d0x,所有 非0,5,10,15,20的点,到x0的距离/偏移差值,求平均 - for (int i = 0; i < 6; i++) { - int finalI = i; - - if (gx_00[i] == null) { - continue; - } - Double val = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() == finalI && point.getColOff() != 0). - map(point -> (point.pos.x - gx_00[finalI].pos.x) / (point.getColOff())).toList() - ); - dxs[i] = val; - } - dx = ZSimplAlgo.computeAverage(dxs); - //计算dy, - for (int i = 0; i < 6; i++) { - int finalI = i; - if (gx_00[i] == null) - continue; - - dys[i] = ZSimplAlgo.computeAverage( - refPoint.stream().filter(point -> point.group.ordinal() == finalI && point.getRowOff() != 0). - map(point -> (point.pos.y - gx_00[finalI].pos.y) / (point.getRowOff())).toList() - ); - } - dy = ZSimplAlgo.computeAverage(dys); - - var littleBottleConsumablePosInfo = new LittleBottleConsumablePosInfo(); - littleBottleConsumablePosInfo.g0_000 = new Pos3d(x[0].intValue(), y[0].intValue(), 0); - littleBottleConsumablePosInfo.g1_000 = new Pos3d(x[1].intValue(), y[0].intValue(), 0); - littleBottleConsumablePosInfo.g2_000 = new Pos3d(x[2].intValue(), y[0].intValue(), 0); - littleBottleConsumablePosInfo.g3_000 = new Pos3d(x[0].intValue(), y[1].intValue(), 0); - littleBottleConsumablePosInfo.g4_000 = new Pos3d(x[1].intValue(), y[1].intValue(), 0); - littleBottleConsumablePosInfo.g5_000 = new Pos3d(x[2].intValue(), y[1].intValue(), 0); - littleBottleConsumablePosInfo.dx = dx; - littleBottleConsumablePosInfo.dy = dy; - return littleBottleConsumablePosInfo; - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/Hbot2DCodeScanPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/Hbot2DCodeScanPosCalibration.java deleted file mode 100644 index e4e11f5..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/Hbot2DCodeScanPosCalibration.java +++ /dev/null @@ -1,108 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.service.app.devicectrl.exdriver.CodeScanerExDriver; -import a8k.service.app.devicectrl.ctrlservice.ConsumablesScanCtrlService; -import a8k.service.app.devicectrl.pos.param_mgr.Hbot2DCodeScanParamMgr; -import a8k.type.ConsumableGroup; -import a8k.type.ConsumableScanRawResult; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -@ExtApiTab(cfg = ExtApiTabConfig.Hbot2DCodeScanPosCalibration) -@Component -public class Hbot2DCodeScanPosCalibration { - static Logger logger = org.slf4j.LoggerFactory.getLogger(Hbot2DCodeScanPosCalibration.class); - - @Resource - CodeScanerExDriver codeScaner; - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - @Resource - HbotBaseMoveExDriver hbotBaseMoveExDriver; - @Resource - ConsumablesScanCtrlService consumablesScanCtrlService; - - @Resource - Hbot2DCodeScanParamMgr hbot2DCodeScanParamMgr; - - - @ExtApiFn(name = "获取所有坐标", group = "基础", order = 1) - public Object getParams() throws AppException { - return hbot2DCodeScanParamMgr.getParams(); - } - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void deviceReset() throws AppException { - enableModule(); - hbotBaseMoveExDriver.checkBeforeMove(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - hbotDriver.enable(1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(0); - hbotDriver.enable(0); - } - - @ExtApiFn(name = "扫码", group = "测试工具", order = 14) - public String scanCode() throws AppException { - return codeScaner.pipetteModCodeScannerScanCode(); - } - - // - @ExtApiFn(name = "设置当前位置为<板夹>扫码位", group = "标定", order = 21) - public void setPBScanPos(ConsumableGroup group) throws AppException { - hbot2DCodeScanParamMgr.setPBScanPosX(group.off, hbotDriver.readPos()); - } - - @ExtApiFn(name = "设置当前位置为<小缓冲>扫码位", group = "标定", order = 22) - public void setLittBSScanPos(ConsumableGroup group) throws AppException { - hbot2DCodeScanParamMgr.setLittBSX(group.off, hbotDriver.readPos()); - } - - @ExtApiFn(name = "设置当前位置为<大缓冲>扫码位", group = "标定", order = 23) - public void setLarBSScanPos(ConsumableGroup group) throws AppException { - hbot2DCodeScanParamMgr.setLarBSX(group.off, hbotDriver.readPos()); - } - - @ExtApiFn(name = "扫码测试(全部位置)", group = "校验", order = 31) - public ConsumableScanRawResult scanAll() throws AppException { - return consumablesScanCtrlService.doScanConsumablesAction(); - } - - @ExtApiFn(name = "扫描板夹仓X", group = "校验", order = 31) - public String scanPBScanPos(ConsumableGroup group) throws AppException { - return consumablesScanCtrlService.scanPB(group.off); - } - - @ExtApiFn(name = "扫描小缓冲液X", group = "校验", order = 32) - public String scanLittBSScanPos(ConsumableGroup group) throws AppException { - return consumablesScanCtrlService.scanLittBS(group.off); - } - - @ExtApiFn(name = "扫描大瓶缓冲液X)", group = "校验", order = 33) - public String scanLarBSScanPos(ConsumableGroup group) throws AppException { - return consumablesScanCtrlService.scanLarBS(group.off); - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLargeBottleBSPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLargeBottleBSPosCalibration.java deleted file mode 100644 index 0001be1..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLargeBottleBSPosCalibration.java +++ /dev/null @@ -1,200 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.pos.type.HbotLargeBottleBSPos; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.service.app.devicectrl.pos.param_mgr.HbotLargeBottleBSPosMgr; -import a8k.type.*; -import a8k.type.cfg.Pos2d; -import a8k.type.cfg.Pos3d; -import a8k.type.exception.AppException; -import a8k.utils.ZJsonHelper; -import a8k.utils.ZSimplAlgo; -import com.fasterxml.jackson.databind.node.ObjectNode; -import jakarta.annotation.Resource; -import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; - -@ExtApiTab(cfg = ExtApiTabConfig.HbotLargeBottleBSPosCalibration) -@Component -@Aspect -public class HbotLargeBottleBSPosCalibration { - static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotLargeBottleBSPosCalibration.class); - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - - @Resource - HbotCtrlService hbotCtrlService; - @Resource - HbotLargeBottleBSPosMgr posMgr; - - Boolean stopFlag = false; - - Boolean checkStopFlag() { - if (stopFlag) { - stopFlag = false; - return true; - } - return false; - } - - void resetStopFlag() { - stopFlag = false; - } - - void setStopFlag() { - stopFlag = true; - } - - - @ExtApiFn(name = "获取坐标", group = "基础", order = 1) - public Object getPoss() throws AppException { - return posMgr.getParams(); - } - - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void moveToZero() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - hbotDriver.enable(1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(0); - hbotDriver.enable(0); - } - - - List refpoints = new java.util.ArrayList<>(); - - - @ExtApiFn(name = "开始标定大瓶坐标", group = "标定大瓶缓液XY坐标", order = 30) - public void startCalibrate() throws AppException { - refpoints = new java.util.ArrayList<>(); - moveToZero(); - disableModule(); - } - - @ExtApiFn(name = "添加大瓶参考点", group = "标定大瓶缓液XY坐标", order = 31) - public Object addRefPoint(ConsumableGroup group) throws AppException { - enableModule(); - Pos2d xypos = hbotDriver.readPos(); - // pipetteCtrlModule.zMotorMeasureDistance(); - // Integer z = pipetteCtrlModule.zMotorReadMeasureDistanceResult(); - LargeBottleConsumableRefPoint refPoints = new LargeBottleConsumableRefPoint(group, new Pos3d(xypos.x, xypos.y, 0)); - this.refpoints.add(refPoints); - disableModule(); - ObjectNode node = ZJsonHelper.createObjectNode(); - node.put("newPoint", ZJsonHelper.createObjectNode(refPoints)); - node.put("computeResult", ZJsonHelper.createObjectNode(computeLittleBottlePosInfo())); - return node; - } - - @ExtApiFn(name = "移除最后一个参考点", group = "标定大瓶缓液XY坐标", order = 32) - public void removeTheLastRefPoint() { - if (!refpoints.isEmpty()) { - refpoints.remove(refpoints.size() - 1); - } - } - - - @ExtApiFn(name = "读取坐标计算结果", group = "标定大瓶缓液XY坐标", order = 33) - public LargeBottoleConsumablePosInfo computeLittleBottlePosInfo() { - //第一排x求平均 - // x[0] = ZSimplAlgo.computeAverage( - // littleBottleConsumableRefPoint.stream().filter(point -> point.group.ordinal() % 3 == 0 && point.index % 5 == 0). - // map(point -> point.pos.x).toList() - // ); - - var p00 = refpoints.stream().filter(point -> point.group == ConsumableGroup.GROUP0).findFirst().orElse(null); - Double x, y, dx = null, dy = null; - - x = ZSimplAlgo.computeAverage( - refpoints.stream().filter(point -> point.group.ordinal() / 3 == 0). - map(point -> point.pos.x).toList()); - //第一列y求平均 - y = ZSimplAlgo.computeAverage( - refpoints.stream().filter(point -> point.group.ordinal() % 3 == 0). - map(point -> point.pos.y).toList()); - //除了第一列的所有点,减少x,相加,求平均 - if (p00 != null) { - dx = ZSimplAlgo.computeAverage( - refpoints.stream().filter(point -> point.getCol() != 0). - map(point -> (point.pos.x - p00.pos.x) * 1.0 / point.getCol()).toList()); - //除了第一排的所有点,减少y,相加,求平均 - dy = ZSimplAlgo.computeAverage( - refpoints.stream().filter(point -> point.getRow() != 0). - map(point -> (point.pos.y - p00.pos.y) * 1.0 / point.getRow()).toList()); - } - - return new LargeBottoleConsumablePosInfo(new Pos3d(x.intValue(), y.intValue(), 0), dx, dy); - } - - @ExtApiFn(name = "保存计算结果", group = "标定大瓶缓液XY坐标", order = 34) - public void savePosInfo() throws AppException { - posMgr.setLargeBufferGroupPosInfo(computeLittleBottlePosInfo()); - } - - @ExtApiFn(name = "读取所有参考点", group = "标定大瓶缓液XY坐标", order = 35) - public Object readAllRefPoint() throws AppException { - return refpoints; - } - - // - // 标定Z轴 - // - public void setZPos(HbotLargeBottleBSPos posName) throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMeasureDistance(); - posMgr.setParam(posName, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); - disableModule(); - } - - @ExtApiFn(name = "校准.大瓶缓冲液Z轴位置", group = "标定Z轴", order = 104) - public void setLargeBSSSampleZPos() throws AppException {setZPos(HbotLargeBottleBSPos.LargeBSSSampleZPos);} - - @ExtApiFn(name = "校准.大瓶缓冲液Z轴结束位置", group = "标定Z轴", order = 105) - public void setLargeBSSSampleEndZPos() throws AppException {setZPos(HbotLargeBottleBSPos.LargeBSSSampleEndZPos);} - - // - // 校验 - // - - @ExtApiFn(name = "校验大瓶缓冲液坐标", group = "校验", order = 303) - public void testMoveToLargeBufferPos() throws AppException { - resetStopFlag(); - enableModule(); - for (ConsumableGroup group : ConsumableGroup.values()) { - hbotCtrlService.moveToLargeBufferPos(group); - if (checkStopFlag()) - return; - } - } - - @ExtApiFn(name = "停止校验", group = "校验", order = 304) - public void stopTest() throws AppException { - setStopFlag(); - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLittleBSPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLittleBSPosCalibration.java deleted file mode 100644 index 07d54be..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotLittleBSPosCalibration.java +++ /dev/null @@ -1,170 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - - -import a8k.constant.AppConstant; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.pos.algo.HbotLittleBSCalibrationAlgo; -import a8k.service.app.devicectrl.pos.param_mgr.HbotLittleBSPosMgr; -import a8k.service.app.devicectrl.pos.type.HbotLittleBSPos; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.type.*; -import a8k.type.cfg.Pos2d; -import a8k.type.cfg.Pos3d; -import a8k.type.exception.AppException; -import a8k.utils.ZJsonHelper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; - -@ExtApiTab(cfg = ExtApiTabConfig.HbotLittleBSPosCalibration) -@Component -public class HbotLittleBSPosCalibration { - static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotLittleBSPosCalibration.class); - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - - @Resource - HbotCtrlService hbotCtrlService; - @Resource - HbotLittleBSPosMgr hbotLittleBSPosMgr; - - List refPoint = new java.util.ArrayList<>(); - - Boolean stopFlag = false; - - Boolean checkStopFlag() { - if (stopFlag) { - stopFlag = false; - return true; - } - return false; - } - - void resetStopFlag() { - stopFlag = false; - } - - void setStopFlag() { - stopFlag = true; - } - - - @ExtApiFn(name = "获取坐标", group = "基础", order = 1) - public Object getPoss() throws AppException { - return hbotLittleBSPosMgr.getParams(); - } - - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void moveToZero() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - hbotDriver.enable(1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(0); - hbotDriver.enable(0); - } - - - @ExtApiFn(name = "开始标定", group = "标定小瓶XY坐标", order = 30) - public void startCalibrateLittleBottleGroup(LittleBottleConsumableType type) throws AppException { - refPoint = new java.util.ArrayList<>(); - moveToZero(); - disableModule(); - } - - @ExtApiFn(name = "添加参考点", group = "标定小瓶XY坐标", order = 31) - public Object addLittleBottleGroupRefPoint(ConsumableGroup group, Integer off0To24) throws AppException { - enableModule(); - Pos2d xypos = hbotDriver.readPos(); - LittleBottleConsumableRefPoint littleBufferRefPoint = new LittleBottleConsumableRefPoint(group, off0To24, new Pos3d(xypos.x, xypos.y, 0)); - this.refPoint.add(littleBufferRefPoint); - disableModule(); - ObjectNode node = ZJsonHelper.createObjectNode(); - node.put("newPoint", ZJsonHelper.createObjectNode(littleBufferRefPoint)); - node.put("computeResult", ZJsonHelper.createObjectNode(computeLittleBottlePosInfo())); - return node; - } - - @ExtApiFn(name = "移除最后一个参考点", group = "标定小瓶XY坐标", order = 32) - public void removeTheLastLittleBottleGroupRefPoint() { - if (!refPoint.isEmpty()) { - refPoint.remove(refPoint.size() - 1); - } - } - - - @ExtApiFn(name = "读取坐标计算结果", group = "标定小瓶XY坐标", order = 33) - public LittleBottleConsumablePosInfo computeLittleBottlePosInfo() { - return HbotLittleBSCalibrationAlgo.compute(refPoint); - } - - @ExtApiFn(name = "保存计算结果", group = "标定小瓶XY坐标", order = 34) - public void saveLittleBottleConsumablePosInfo() throws AppException { - hbotLittleBSPosMgr.setPosInfo(computeLittleBottlePosInfo()); - } - - @ExtApiFn(name = "读取所有参考点", group = "标定小瓶XY坐标", order = 35) - public Object readAllRefPoint() throws AppException { - return refPoint; - } - - // - // 标定Z轴 - // - - public void setZPos(HbotLittleBSPos posName) throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMeasureDistance(); - hbotLittleBSPosMgr.setParam(posName, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); - disableModule(); - } - - @ExtApiFn(name = "校准.小瓶穿孔Z轴位置", group = "标定Z轴", order = 101) - public void setPierceZPos() throws AppException {setZPos(HbotLittleBSPos.LittleBSPierceZPos);} - - @ExtApiFn(name = "校准.小瓶取样Z轴位置", group = "标定Z轴", order = 102) - public void setSampleZPos() throws AppException {setZPos(HbotLittleBSPos.LittleBSSampleZPos);} - - @ExtApiFn(name = "校准.小瓶缓冲液取样结束Z轴位置", group = "标定Z轴", order = 104) - public void setSampleEndZPos() throws AppException {setZPos(HbotLittleBSPos.LittleBSSampleEndZPos);} - - // - // 校验 - // - @ExtApiFn(name = "校验小瓶缓冲液坐标", group = "校验", order = 301) - public void testMoveToLittleBufferPos(ConsumableGroup group) throws AppException { - resetStopFlag(); - enableModule(); - for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { - hbotCtrlService.moveToLittleBufferPiercePos(group, i); - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - if (checkStopFlag()) - return; - } - } - @ExtApiFn(name = "停止校验", group = "校验", order = 304) - public void stopTest() throws AppException { - setStopFlag(); - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotProbeSubstancePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotProbeSubstancePosCalibration.java deleted file mode 100644 index 4bfa548..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotProbeSubstancePosCalibration.java +++ /dev/null @@ -1,171 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - - -import a8k.constant.AppConstant; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.pos.algo.HbotLittleBSCalibrationAlgo; -import a8k.service.app.devicectrl.pos.param_mgr.HbotProbeSubstancePosMgr; -import a8k.service.app.devicectrl.pos.type.HbotProbeSubstancePos; -import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.type.ConsumableGroup; -import a8k.type.LittleBottleConsumablePosInfo; -import a8k.type.LittleBottleConsumableRefPoint; -import a8k.type.LittleBottleConsumableType; -import a8k.type.cfg.Pos2d; -import a8k.type.cfg.Pos3d; -import a8k.type.exception.AppException; -import a8k.utils.ZJsonHelper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; - -@ExtApiTab(cfg = ExtApiTabConfig.HbotProbeSubstancePosCalibration) -@Component -public class HbotProbeSubstancePosCalibration { - static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotProbeSubstancePosCalibration.class); - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - - @Resource - HbotCtrlService hbotCtrlService; - @Resource - HbotProbeSubstancePosMgr posMgr; - - List refPoint = new java.util.ArrayList<>(); - - Boolean stopFlag = false; - - Boolean checkStopFlag() { - if (stopFlag) { - stopFlag = false; - return true; - } - return false; - } - - void resetStopFlag() { - stopFlag = false; - } - - void setStopFlag() { - stopFlag = true; - } - - - @ExtApiFn(name = "获取坐标", group = "基础", order = 1) - public Object getPoss() throws AppException { - return posMgr.getParams(); - } - - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void moveToZero() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - hbotDriver.enable(1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(0); - hbotDriver.enable(0); - } - - - @ExtApiFn(name = "开始标定", group = "标定小瓶XY坐标", order = 30) - public void startCalibrateLittleBottleGroup(LittleBottleConsumableType type) throws AppException { - refPoint = new java.util.ArrayList<>(); - moveToZero(); - disableModule(); - } - - @ExtApiFn(name = "添加参考点", group = "标定小瓶XY坐标", order = 31) - public Object addLittleBottleGroupRefPoint(ConsumableGroup group, Integer off0To24) throws AppException { - enableModule(); - Pos2d xypos = hbotDriver.readPos(); - LittleBottleConsumableRefPoint littleBufferRefPoint = new LittleBottleConsumableRefPoint(group, off0To24, new Pos3d(xypos.x, xypos.y, 0)); - this.refPoint.add(littleBufferRefPoint); - disableModule(); - ObjectNode node = ZJsonHelper.createObjectNode(); - node.put("newPoint", ZJsonHelper.createObjectNode(littleBufferRefPoint)); - node.put("computeResult", ZJsonHelper.createObjectNode(computeLittleBottlePosInfo())); - return node; - } - - @ExtApiFn(name = "移除最后一个参考点", group = "标定小瓶XY坐标", order = 32) - public void removeTheLastLittleBottleGroupRefPoint() { - if (!refPoint.isEmpty()) { - refPoint.remove(refPoint.size() - 1); - } - } - - - @ExtApiFn(name = "读取坐标计算结果", group = "标定小瓶XY坐标", order = 33) - public LittleBottleConsumablePosInfo computeLittleBottlePosInfo() { - return HbotLittleBSCalibrationAlgo.compute(refPoint); - } - - @ExtApiFn(name = "保存计算结果", group = "标定小瓶XY坐标", order = 34) - public void saveLittleBottleConsumablePosInfo() throws AppException { - posMgr.setPosInfo(computeLittleBottlePosInfo()); - } - - @ExtApiFn(name = "读取所有参考点", group = "标定小瓶XY坐标", order = 35) - public Object readAllRefPoint() throws AppException { - return refPoint; - } - - // - // 标定Z轴 - // - - public void setZPos(HbotProbeSubstancePos posName) throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMeasureDistance(); - posMgr.setParam(posName, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); - disableModule(); - } - - @ExtApiFn(name = "校准.小瓶取样Z轴位置", group = "标定Z轴", order = 102) - public void setSampleZPos() throws AppException {setZPos(HbotProbeSubstancePos.ProbeSubstanceSampleZPos);} - - @ExtApiFn(name = "校准.小瓶缓冲液取样结束Z轴位置", group = "标定Z轴", order = 104) - public void setSampleEndZPos() throws AppException {setZPos(HbotProbeSubstancePos.ProbeSubstanceSampleEndZPos);} - - // - // 校验 - // - @ExtApiFn(name = "校验", group = "校验", order = 301) - public void testMoveToLittleBufferPos(ConsumableGroup group) throws AppException { - resetStopFlag(); - enableModule(); - for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) { - hbotCtrlService.moveToProbeSubstanceSamplePos(group, i); - pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); - if (checkStopFlag()) - return; - } - } - - @ExtApiFn(name = "停止校验", group = "校验", order = 304) - public void stopTest() throws AppException { - setStopFlag(); - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotSamplePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotSamplePosCalibration.java deleted file mode 100644 index 3952231..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotSamplePosCalibration.java +++ /dev/null @@ -1,146 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.pos.type.HbotSamplePos; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; -import a8k.service.app.devicectrl.exdriver.TubePreProcesModuleExDriver; -import a8k.service.app.devicectrl.pos.param_mgr.HbotSamplePosParamMgr; -import a8k.type.cfg.Pos2d; -import a8k.type.cfg.Pos3d; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -@ExtApiTab(cfg = ExtApiTabConfig.HbotSamplePosCalibration) -@Component -@Aspect -public class HbotSamplePosCalibration { - static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotSamplePosCalibration.class); - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - @Resource - MotorEnableExDriver motorEnableExDriver; - @Resource - TubePreProcesModuleExDriver tubePreProcesModuleExDriver; - - - @Resource - HbotCtrlService hbotCtrlService; - @Resource - HbotSamplePosParamMgr hbotSamplePosParamMgr; - - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - - Boolean stopFlag = false; - Boolean checkStopFlag() { - if (stopFlag) { - stopFlag = false; - return true; - } - return false; - } - - void resetStopFlag() { - stopFlag = false; - } - - void setStopFlag() { - stopFlag = true; - } - - - @ExtApiFn(name = "获取坐标", group = "基础", order = 1) - public Object getPoss() throws AppException { - return hbotSamplePosParamMgr.getParams(); - } - - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void moveToZero() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - hbotDriver.enable(1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - motorEnableExDriver.forceDisableAllMotor(); - } - - - @ExtApiFn(name = "试管夹具复位", group = "辅助工具", order = 21) - public void tubeClampMoveZero() throws AppException { - - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModShakeM, 5000); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.ShakeModShakeM, 90, 5000); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModClampingM, 5000); - tubePreProcesModuleExDriver.clampingMReleaseTube(); - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 0); - } - - @ExtApiFn(name = "释放试管", group = "辅助工具", order = 22) - public void releaseTubeClamp() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); - stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, 20, 5000); - // tubePreProcesModuleExDriver.clampingMReleaseTube(); - } - - @ExtApiFn(name = "夹紧试管", group = "辅助工具", order = 23) - public void clampTubeClamp() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); - tubePreProcesModuleExDriver.clampingMclampTube(); - } - - - // - // 标定Z轴 - // - public Pos3d readPos() throws AppException { - enableModule(); - Pos2d xypos = hbotDriver.readPos(); - pipetteCtrlDriver.zMotorMeasureDistance(); - Integer z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); - Pos3d var = new Pos3d(xypos.x, xypos.y, z); - disableModule(); - return var; - } - - @ExtApiFn(name = "校准.采样位置", group = "标定", order = 104) - public void calibrationSamplePos(HbotSamplePos posType) throws AppException { - Pos3d pos3d = readPos(); - hbotSamplePosParamMgr.setSamplePos(posType, pos3d); - } - - - // - // 校验 - // - @ExtApiFn(name = "校验坐标", group = "校验", order = 303) - public void testSamplePos(HbotSamplePos posType) throws AppException { - hbotCtrlService.moveToSamplePos(posType); - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotTipPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotTipPosCalibration.java deleted file mode 100644 index 2d720d8..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/HbotTipPosCalibration.java +++ /dev/null @@ -1,232 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - - -import a8k.constant.AppConstant; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.app.devicectrl.pos.param_mgr.HbotTipPosMgr; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.type.*; -import a8k.type.cfg.Pos2d; -import a8k.type.cfg.Pos3d; -import a8k.type.exception.AppException; -import a8k.type.type.TipGroup; -import a8k.utils.ZJsonHelper; -import a8k.utils.ZSimplAlgo; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import jakarta.annotation.Resource; -import org.aspectj.lang.annotation.Aspect; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -@ExtApiTab(cfg = ExtApiTabConfig.HbotTipPosCalibration) -@Component -@Aspect -public class HbotTipPosCalibration { - static Logger logger = org.slf4j.LoggerFactory.getLogger(HbotTipPosCalibration.class); - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - - @Resource - HbotCtrlService hbotCtrlService; - @Resource - HbotTipPosMgr hbotTipPosMgr; - - Boolean stopFlag = false; - - Boolean checkStopFlag() { - if (stopFlag) { - stopFlag = false; - return true; - } - return false; - } - - void resetStopFlag() { - stopFlag = false; - } - - void setStopFlag() { - stopFlag = true; - } - - - @ExtApiFn(name = "获取所有坐标", group = "基础", order = 1) - public Object getPoss() throws AppException { - return hbotTipPosMgr.getParams(); - } - - - // 测试工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void moveToZero() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(1); - hbotDriver.enable(1); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - pipetteCtrlDriver.zMotorEnable(0); - hbotDriver.enable(0); - } - - // - // 标定 - // - - TipGroup tipGroup; - List tipRefPosList; - Pos3d tip000; - Double tipdx; - Double tipdy; - - - @ExtApiFn(name = "开始标定Tip坐标", group = "标定TIP坐标", order = 20) - public void startCalibrateTipPos(TipGroup tipGroup) throws AppException { - this.tipGroup = tipGroup; - tipRefPosList = new java.util.ArrayList<>(); - moveToZero(); - disableModule(); - tipdx = 0.0; - tipdy = 0.0; - tip000 = new Pos3d(0, 0, 0); - } - - - @ExtApiFn(name = "添加Tip参考点", group = "标定TIP坐标", order = 21) - public Object addTipPosRefPoint(TipRowNum row, TipColumnNum columnNum) throws AppException { - enableModule(); - Pos2d xypos = hbotDriver.readPos(); - pipetteCtrlDriver.zMotorMeasureDistance(); - Integer z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); - pipetteCtrlDriver.putTipBlock(); - TipRefPoint tipRefPoint = new TipRefPoint(row, columnNum, new Pos3d(xypos.x, xypos.y, z)); - tipRefPosList.add(tipRefPoint); - disableModule(); - - Map ret = new java.util.HashMap<>(); - ret.put("newPoint", tipRefPoint); - ret.put("computeResult", computeTipGroupPos()); - return ret; - } - - @ExtApiFn(name = "删除上一个Tip参考点", group = "标定TIP坐标", order = 22) - public Object removeTipPosRefPoint() throws AppException { - if (!tipRefPosList.isEmpty()) { - tipRefPosList.remove(tipRefPosList.size() - 1); - } - Map ret = new java.util.HashMap<>(); - ret.put("computeResult", computeTipGroupPos()); - return ret; - } - - - @ExtApiFn(name = "计算Tip坐标", group = "标定TIP坐标", order = 23) - public ObjectNode computeTipGroupPos() throws AppException { - TipRefPoint tip_ref_01_01 = tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.eq(TipRowNum.ROW00, TipColumnNum.Colu00)).findFirst().orElse(null); - - if (tip_ref_01_01 == null) { - throw new AppException(A8kEcode.CALIBRATION_TIP_REF_POINT_NOT_ENOUGH); - } - - - //计算tip01_01_x,取所有第一列tip坐标x的平局值 - Double tip01_01_x = ZSimplAlgo.computeAverage( - tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.col == TipColumnNum.Colu00). - map(tipRefPoint -> Double.valueOf(tipRefPoint.pos.x)).toList() - ); - - //计算tip01_01_y,取所有第1行tip坐标y的平局值 - Double tip01_01_y = ZSimplAlgo.computeAverage( - tipRefPosList.stream().filter(tipRefPoint -> tipRefPoint.row == TipRowNum.ROW00). - map(tipRefPoint -> Double.valueOf(tipRefPoint.pos.y)).toList() - ); - - //计算z,取所有tip坐标z的平局值 - Double tip01_01_z = ZSimplAlgo.computeAverage( - tipRefPosList.stream().map(tipRefPoint -> Double.valueOf(tipRefPoint.pos.z)).toList() - ); - //计算dx,所有点到tip01_01的距离除以行数 之后的平均值 - Double dx = ZSimplAlgo.computeAverage( - tipRefPosList.stream().filter(point -> !point.col.equals(TipColumnNum.Colu00)). - map(point -> Math.abs(point.pos.x - Double.valueOf(tip_ref_01_01.pos.x)) / point.col.ordinal()).toList() - ); - //计算dy,所有点到tip01_01的距离除以列数 之后的平均值 - Double dy = ZSimplAlgo.computeAverage( - tipRefPosList.stream().filter(point -> !point.row.equals(TipRowNum.ROW00)). - map(point -> Math.abs(point.pos.y - Double.valueOf(tip_ref_01_01.pos.y)) / point.row.ordinal()).toList() - ); - - tip01_01_z += 3; - - tip000 = new Pos3d(tip01_01_x.intValue(), tip01_01_y.intValue(), tip01_01_z.intValue()); - tipdx = dx; - tipdy = dy; - - - ObjectNode node = new ObjectMapper().createObjectNode(); - node.put("tip000", ZJsonHelper.createObjectNode(tip000)); - node.put("tipdx", tipdx); - node.put("tipdy", tipdy); - return node; - } - - - @ExtApiFn(name = "保存计算结果", group = "标定TIP坐标", order = 24) - public void saveTipGroupPos() throws AppException { - hbotTipPosMgr.setTipGroupParam(tipGroup, tip000, tipdx, tipdy); - } - - - @ExtApiFn(name = "标定.丢Tip坐标", group = "标定.丢Tip坐标", order = 30) - public void calibrateDropTipPos() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMeasureDistance(); - hbotTipPosMgr.setDropTipPos(new Pos3d(hbotDriver.readPos().x, hbotDriver.readPos().y, pipetteCtrlDriver.zMotorReadMeasureDistanceResult())); - disableModule(); - } - - // - // 校验 - // - @ExtApiFn(name = "校验取Tip坐标", group = "校验", order = 300) - public void testTakeTip(TipGroup tipGroup) throws AppException { - resetStopFlag(); - enableModule(); - for (int i = 0; i < AppConstant.TIP_NUM; i++) { - hbotCtrlService.testTakeTip(tipGroup, i); - if (checkStopFlag()) - return; - } - } - - @ExtApiFn(name = "校验丢Tip", group = "校验", order = 301) - public void testDropTipPos() throws AppException { - hbotCtrlService.dropTip(); - } - - @ExtApiFn(name = "停止校验", group = "校验", order = 304) - public void stopTest() throws AppException { - setStopFlag(); - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/ReactionPlatesTransmitControlerCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/ReactionPlatesTransmitControlerCalibration.java deleted file mode 100644 index 2ae690c..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/ReactionPlatesTransmitControlerCalibration.java +++ /dev/null @@ -1,269 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.pos.param_mgr.HbotFixedPosParamMgr; -import a8k.service.app.devicectrl.pos.param_mgr.OptModuleParamsMgr; -import a8k.service.app.devicectrl.pos.param_mgr.PlatesBoxPosParamMgr; -import a8k.service.app.devicectrl.pos.param_mgr.TurntablePosParamMgr; -import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; -import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; -import a8k.service.app.devicectrl.driver.HbotDriver; -import a8k.service.app.devicectrl.driver.MiniServoDriver; -import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; -import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; -import a8k.type.ConsumableGroup; -import a8k.type.IncubatorPos; -import a8k.type.cfg.Pos3d; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitControlerCalibration) -public class ReactionPlatesTransmitControlerCalibration { - - final static int overtime = 10000; - - @Resource - MiniServoDriver miniServoDriver; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - @Resource - OptModuleParamsMgr optModuleParamsMgr; - @Resource - TurntablePosParamMgr turntablePosParamMgr; - @Resource - PlatesBoxPosParamMgr platesBoxPosParamMgr; - @Resource - TurnableMoveCtrlService turnableMoveCtrlService; - @Resource - PlateBoxCtrlService plateBoxCtrlService; - @Resource - OptScanModuleCtrlService optScanModuleCtrlService; - - @Resource - PipetteCtrlDriver pipetteCtrlDriver; - @Resource - HbotDriver hbotDriver; - - - @Resource - HbotCtrlService hbotCtrlService; - @Resource - HbotFixedPosParamMgr hbotFixedPosParamMgr; - - @Resource - MotorEnableExDriver motorEnableExDriver; - - //基础工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 1) - public void deviceReset() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMoveZeroBlock(); - hbotDriver.moveToZeroBlock(); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, overtime); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 2) - public void enableModule() throws AppException { - motorEnableExDriver.reactionPlatesRelateModuleEnable(true); - motorEnableExDriver.hbotRelateModuleEnable(true); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 3) - public void disableModule() throws AppException { - motorEnableExDriver.reactionPlatesRelateModuleEnable(false); - motorEnableExDriver.hbotRelateModuleEnable(false); - } - - @ExtApiFn(name = "读取板夹仓坐标", group = "测试工具", order = 5) - public Object getPlatesBoxPos() { - return platesBoxPosParamMgr.getParams(); - } - - @ExtApiFn(name = "读取光学模组坐标", group = "测试工具", order = 6) - public Object getOptModulePos() { - return optModuleParamsMgr.getParams(); - } - - @ExtApiFn(name = "读取孵育盘坐标", group = "测试工具", order = 7) - public Object getTurntablePos() { - return turntablePosParamMgr.getParams(); - } - - - // - // 孵育盘校准 - // - - @ExtApiFn(name = "设置孵育盘间距", group = "孵育盘.校准", order = 100) - public void TurntablePosMgr_setPosSpacing(Integer posSpacing) { - turntablePosParamMgr.setPosSpacing(posSpacing); - } - - - @ExtApiFn(name = "设置孵育盘-仓0-入口位", group = "孵育盘.校准", order = 101) - public Integer TurntablePosMgr_setPushPos0() throws AppException { - Integer pushPos0 = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); - turntablePosParamMgr.setPushPos0(pushPos0); - return pushPos0; - } - - @ExtApiFn(name = "设置孵育盘-仓0-出口位", group = "孵育盘.校准", order = 102) - public Integer TurntablePosMgr_setPullPos0() throws AppException { - Integer pullPos0 = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); - turntablePosParamMgr.setPullPos0(pullPos0); - return pullPos0; - } - - @ExtApiFn(name = "设置孵育盘-仓0-放液位", group = "孵育盘.校准", order = 103) - public Integer TurntablePosMgr_setDropLiquidPos0() throws AppException { - Integer dropLiquidPos0 = stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); - turntablePosParamMgr.setDropLiquidPos0(dropLiquidPos0); - return dropLiquidPos0; - } - - @ExtApiFn(name = "标定", group = "HbotTip滴定位.校准", order = 104) - public Pos3d Hbot_dropLiquidPosCalibration() throws AppException { - enableModule(); - pipetteCtrlDriver.zMotorMeasureDistance(); - var pos = new Pos3d(hbotDriver.readPos().x, hbotDriver.readPos().y, pipetteCtrlDriver.zMotorReadMeasureDistanceResult()); - hbotFixedPosParamMgr.setDropLiquidPos(pos); - disableModule(); - return pos; - } - - - // - // 板夹仓位置 - // - // @ExtApiFn(name = "设置板夹仓-Y轴间距", group = "板夹仓.校准", order = 200) - // public void PlatesBoxPosMgr_setYSpacing(Integer spaceing) throws AppException { - // platesBoxPosMgr.setYSpacing(spaceing); - // } - - @ExtApiFn(name = "设置板夹仓-仓0-Y轴坐标", group = "板夹仓.校准", order = 201) - public Integer PlatesBoxPosMgr_setCh0YPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); - Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); - platesBoxPosParamMgr.setCh0YPos(pos); - return pos; - } - - @ExtApiFn(name = "设置板夹仓-仓5-Y轴坐标", group = "板夹仓.校准", order = 202) - public Integer PlatesBoxPosMgr_setCh5YPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); - Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); - platesBoxPosParamMgr.setCh5YPos(pos); - return pos; - } - - @ExtApiFn(name = "设置板夹仓-仓0-X轴到位坐标", group = "板夹仓.校准", order = 203) - public Integer PlatesBoxPosMgr_setPushEndXPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); - Integer pushEndXPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, overtime); - platesBoxPosParamMgr.setPushEndXPos(pushEndXPos); - return pushEndXPos; - } - - // - // 光学 - // - - // PullerTargetPos("拉板目标位置"), - // OptScanerDropPos("丢板坐标"), - // OptScanerScandbyPos("扫描待机位"), - - @ExtApiFn(name = "设置<拉板>目标位置", group = "光学模组基础坐标.校准", order = 300) - public Integer OptModulePosMgr_setPullerTargetPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); - Integer pullerTargetPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModPullM, overtime); - optModuleParamsMgr.setPullerTargetPos(pullerTargetPos); - return pullerTargetPos; - } - - @ExtApiFn(name = "设置<光学扫描器>丢板坐标", group = "光学模组基础坐标.校准", order = 301) - public Integer OptModulePosMgr_setOptScanerDropPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); - Integer optScanerDropPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); - optModuleParamsMgr.setOptScanerDropPos(optScanerDropPos); - return optScanerDropPos; - } - - @ExtApiFn(name = "设置<光学扫描器>扫描待机位", group = "光学模组基础坐标.校准", order = 302) - public Integer OptModulePosMgr_setOptScanerScandbyPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); - Integer optScanerScandbyPos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); - optModuleParamsMgr.setOptScanerScandbyPos(optScanerScandbyPos); - return optScanerScandbyPos; - } - - - // - // 校验 - // - - @ExtApiFn(name = "滴定", group = "校验", order = 1000) - public void turntableMoveDropPos(IncubatorPos pos) throws AppException { - turnableMoveCtrlService.trunableMoveToDropLiquidPos(pos); - hbotCtrlService.moveToDropLiquidPos(); - } - - @ExtApiFn(name = "孵育盘移动到拉板位", group = "校验", order = 1001) - public void turntableMovePullPos(IncubatorPos pos) throws AppException { - turnableMoveCtrlService.trunableMoveToPullPos(pos); - } - - @ExtApiFn(name = "孵育盘移动到推板位", group = "校验", order = 1002) - public void turntableMovePushPos(IncubatorPos pos) throws AppException { - turnableMoveCtrlService.trunableMoveToPushPos(pos); - } - - @ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003) - public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { - plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); - optScanModuleCtrlService.pullPlate(incubatorPos); - optScanModuleCtrlService.dropPlate(); - } - - @ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004) - public void pushAllAndRemoveAll() throws AppException { - pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE01); - pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE02); - pushOneAndRemove(ConsumableGroup.GROUP2, IncubatorPos.SPACE03); - pushOneAndRemove(ConsumableGroup.GROUP3, IncubatorPos.SPACE04); - pushOneAndRemove(ConsumableGroup.GROUP4, IncubatorPos.SPACE05); - pushOneAndRemove(ConsumableGroup.GROUP5, IncubatorPos.SPACE06); - - pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE07); - pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE08); - pushOneAndRemove(ConsumableGroup.GROUP2, IncubatorPos.SPACE09); - pushOneAndRemove(ConsumableGroup.GROUP3, IncubatorPos.SPACE10); - pushOneAndRemove(ConsumableGroup.GROUP4, IncubatorPos.SPACE11); - pushOneAndRemove(ConsumableGroup.GROUP5, IncubatorPos.SPACE12); - - pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE13); - pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE14); - pushOneAndRemove(ConsumableGroup.GROUP2, IncubatorPos.SPACE15); - pushOneAndRemove(ConsumableGroup.GROUP3, IncubatorPos.SPACE16); - pushOneAndRemove(ConsumableGroup.GROUP4, IncubatorPos.SPACE17); - pushOneAndRemove(ConsumableGroup.GROUP5, IncubatorPos.SPACE18); - - pushOneAndRemove(ConsumableGroup.GROUP0, IncubatorPos.SPACE19); - pushOneAndRemove(ConsumableGroup.GROUP1, IncubatorPos.SPACE20); - - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/TubeFeedingModulePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/TubeFeedingModulePosCalibration.java deleted file mode 100644 index b40fa77..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/TubeFeedingModulePosCalibration.java +++ /dev/null @@ -1,147 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.hardware.A8kCanBusService; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; -import a8k.service.app.devicectrl.exdriver.MotorMoveZeroExDriver; -import a8k.service.app.devicectrl.exdriver.TubeTransportExDriver; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; -import a8k.service.app.devicectrl.pos.param_mgr.TubeFeedingModuleParamMgr; -import a8k.service.db.type.Parameter; -import a8k.type.TubeFeedingModulePos; -import a8k.type.TubeFeedingModuleSetting; -import a8k.type.TubeHolderScanResult; -import a8k.type.ecode.AppCodeError; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.List; - - -@ExtApiTab(cfg = ExtApiTabConfig.TubeFeedingModulePosCalibration) -@Component -public class TubeFeedingModulePosCalibration { - - @Resource - TubeFeedingModuleParamMgr tubeScanPosMgr; - - @Resource - A8kCanBusService canBus; - @Resource - TubeFeedingCtrlService tubeFeedingCtrlService; - @Resource - TubeTransportExDriver tubeTransportExDriver; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - @Resource - MotorEnableExDriver motorEnableExDriver; - @Resource - MotorMoveZeroExDriver motorMoveZeroExDriver; - - - @ExtApiFn(name = "获得参数", group = "基础", order = 1) - public List getParams() throws AppException { - return tubeScanPosMgr.getParams(); - } - - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void deviceReset() throws AppException { - enableModule(); - motorMoveZeroExDriver.tubeFeeddingModuleMoveToZero(); - - //预处理归零 - motorEnableExDriver.preProcessRelatedModuleEnable(true); - motorMoveZeroExDriver.preProcessModuleMoveToZero(); - motorEnableExDriver.preProcessRelatedModuleEnable(false); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 12) - public void enableModule() throws AppException { - motorEnableExDriver.tubeFeedRelatedModuleEnable(true); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 13) - public void disableModule() throws AppException { - motorEnableExDriver.tubeFeedRelatedModuleEnable(false); - motorEnableExDriver.preProcessRelatedModuleEnable(false); - } - - // - // 辅助方法 - // - - private Integer readFeedingModXMPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); - return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.FeedingModXM, 15000); - } - - - // - // 设置 - // - - - @ExtApiFn(name = "设置试管扫描旋转舵机扭矩(0->1000)", group = "设置", order = 200) - public void setTubeScanServoTorque(Integer val) throws AppException { - tubeScanPosMgr.setParam(TubeFeedingModuleSetting.TubeScanServoTorque, val); - } - - - Integer tube01pos; - Integer tube10pos; - - @ExtApiFn(name = "标记当前位置为-试管1号位", group = "辅助设置试管间距", order = 201) - public Integer labelPosAsTube01Pos() throws AppException { - tube01pos = readFeedingModXMPos(); - disableModule(); - return tube01pos; - } - - @ExtApiFn(name = "标记当前位置为-试管10号位", group = "辅助设置试管间距", order = 202) - public Integer labelPosAsTube10Pos() throws AppException { - tube10pos = readFeedingModXMPos(); - disableModule(); - return tube10pos; - } - - @ExtApiFn(name = "计算并设置设置试管间距", group = "辅助设置试管间距", order = 203) - public Double setTubeSpacing() throws AppException { - if (tube01pos == null || tube10pos == null) { - throw new AppException(new AppCodeError("未标记试管1号位和10号位")); - } - Double spacing = (tube10pos - tube01pos) / 9.0; - tubeScanPosMgr.setParam(TubeFeedingModuleSetting.TubeSpacing, spacing); - return spacing; - } - - - // - // 标定坐标 - // - @ExtApiFn(name = "标定位置", group = "标定", order = 300) - public void calibratePos(TubeFeedingModulePos posType) throws AppException { - tubeScanPosMgr.setParam(posType, readFeedingModXMPos()); - disableModule(); - } - - // - // 校验 - // - - @ExtApiFn(name = "扫描试管架", group = "校验", order = 400) - public TubeHolderScanResult calibrateScanTubeHolder() throws AppException { - TubeHolderScanResult result = tubeFeedingCtrlService.scanTubeHodler(); - tubeFeedingCtrlService.ejectTubeHolder(); - return result; - } - - @ExtApiFn(name = "移动试管到预处理位置", group = "校验", order = 401) - public void calibrateMoveTubeToPreProcessPos(Integer tubeIndex0To9) throws AppException { - tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex0To9); - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/calibration/TubePreProcesPosCalibration.java b/src/main/java/a8k/service/app/devicectrl/pos/calibration/TubePreProcesPosCalibration.java deleted file mode 100644 index 6a9b145..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/calibration/TubePreProcesPosCalibration.java +++ /dev/null @@ -1,207 +0,0 @@ -package a8k.service.app.devicectrl.pos.calibration; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.driver.MiniServoDriver; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.driver.type.MiniServoMId; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; -import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; -import a8k.service.app.devicectrl.exdriver.MotorMoveZeroExDriver; -import a8k.service.app.devicectrl.exdriver.TubePreProcesModuleExDriver; -import a8k.service.app.devicectrl.pos.param_mgr.TubePreProcesPosParamMgr; -import a8k.type.TubePreProcessGripperPos; -import a8k.type.TubePreProcessTubeClamp; -import a8k.type.TubePreProcessYPos; -import a8k.type.TubePreProcessZAxisPos; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@ExtApiTab(cfg = ExtApiTabConfig.TubePreProcesPosCalibration) -@Component -public class TubePreProcesPosCalibration { - - final static Integer overtime = 6000; - - @Resource - TubePreProcesPosParamMgr posMgr; - - @Resource - MiniServoDriver miniServoDriver; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - @Resource - TubePreProcesCtrlService controler; - @Resource - MotorEnableExDriver motorEnableExDriver; - @Resource - MotorMoveZeroExDriver motorMoveZeroExDriver; - @Resource - TubePreProcesModuleExDriver tubePreProcesModuleExDriver; - - //基础工具 - @ExtApiFn(name = "归零", group = "测试工具", order = 1) - public void deviceReset() throws AppException { - enableModule(); - motorMoveZeroExDriver.preProcessModuleMoveToZero(); - } - - @ExtApiFn(name = "使能相关模块", group = "测试工具", order = 2) - public void enableModule() throws AppException { - motorEnableExDriver.preProcessRelatedModuleEnable(true); - } - - @ExtApiFn(name = "失能相关模块", group = "测试工具", order = 3) - public void disableModule() throws AppException { - motorEnableExDriver.preProcessRelatedModuleEnable(false); - motorEnableExDriver.tubeFeedRelatedModuleEnable(false); - } - - @ExtApiFn(name = "读取所有设定值", group = "测试工具", order = 5) - public Object getPoss() { - return posMgr.getParams(); - } - - - //TubePreProcessYPos - //TubePreProcessZAxisPos - //TubePreProcessGripperPos - //TubePreProcessTubeClamp - - - // - // 标定坐标 - // - @ExtApiFn(name = "标定前后移动伺服坐标", group = "标定", order = 100) - public Integer calibrateTubePreProcessYPos(TubePreProcessYPos posType) throws AppException { - Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); - posMgr.setPos(posType, pos); - return pos; - } - - @ExtApiFn(name = "标定Z轴坐标", group = "标定", order = 101) - public Integer calibrateTubePreProcessZAxisPos(TubePreProcessZAxisPos posType) throws AppException { - enableModule(); - Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, 10000); - posMgr.setPos(posType, pos); - disableModule(); - return pos; - } - - @ExtApiFn(name = "标定夹爪伺服坐标", group = "标定", order = 102) - public Integer calibrateTubePreProcessGripperPos(TubePreProcessGripperPos posType) throws AppException { - enableModule(); - Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); - posMgr.setPos(posType, pos); - disableModule(); - return pos; - } - - @ExtApiFn(name = "标定试管夹紧伺服坐标", group = "标定", order = 103) - public Integer calibrateTubePreProcessTubeClamp(TubePreProcessTubeClamp posType) throws AppException { - enableModule(); - Integer pos = stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM, 10000); - if (posType.equals(TubePreProcessTubeClamp.ShakeClampMotorClampPos)) { - posMgr.setPos(posType, pos - 2); - } else { - posMgr.setPos(posType, pos); - } - disableModule(); - return pos; - } - - // - // 夹爪标定,校准,校验 - // - @ExtApiFn(name = "<校验>张开", group = "校验.夹爪", order = 206) - public void gripperSVOpen() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - tubePreProcesModuleExDriver.gripperSVOpen(); - } - - @ExtApiFn(name = "<校验>夹紧", group = "校验.夹爪", order = 205) - public void gripperSVCClose() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - tubePreProcesModuleExDriver.gripperSVCClose(); - } - - @ExtApiFn(name = "<校验>夹住试管", group = "校验.夹爪", order = 205) - public void gripperSVClampTube() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - tubePreProcesModuleExDriver.gripperSVClampTube(); - } - - // - //YSV : 设置参考点,标定,验证 - // - @ExtApiFn(name = "<校验>移动到摇匀位", group = "校验.YSV", order = 305) - public void YAxixServoShake() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - tubePreProcesModuleExDriver.YSVMoveToShakePos(); - } - - @ExtApiFn(name = "<校验>移动到取试管位", group = "校验.YSV", order = 306) - public void YAxixServoTakeTube() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); - } - - @ExtApiFn(name = "<校验>移动到待机位", group = "校验.YSV", order = 307) - public void YAxixServoMoveToStandyPos() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - tubePreProcesModuleExDriver.YSVMoveToStandyPos(); - } - // - //ZM : 标定,验证 - // - - @ExtApiFn(name = "<校验>取试管", group = "校验.ZM", order = 405) - public void takeTube(Boolean isHTube) throws AppException { - enableModule(); - tubePreProcesModuleExDriver.takeTubeFromTubeholder(isHTube); - } - - @ExtApiFn(name = "<校验>放试管", group = "校验.ZM", order = 406) - public void putTube(Boolean isHTube) throws AppException { - enableModule(); - tubePreProcesModuleExDriver.putTubeToTubeholder(isHTube); - } - - @ExtApiFn(name = "<校验>Z轴移动到取试管位置", group = "校验.ZM", order = 407) - public void zMotorMoveToTakeHTubePos(Boolean isHTube) throws AppException { - enableModule(); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); - tubePreProcesModuleExDriver.zMotorMoveToTakeHTubePos(isHTube); - } - - @ExtApiFn(name = "<校验>Z轴移动到摇匀位置", group = "校验.ZM", order = 408) - public void zMotorMoveToShakeTubePos() throws AppException { - enableModule(); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); - tubePreProcesModuleExDriver.zMotorMoveToShakeTubePos(); - } - - @ExtApiFn(name = "<校验>夹紧", group = "校验.夹紧", order = 503) - - public void clampTube() throws AppException { - tubePreProcesModuleExDriver.clampingMclampTube(); - } - - @ExtApiFn(name = "<校验>释放", group = "校验.夹紧", order = 504) - public void unclampTube() throws AppException { - tubePreProcesModuleExDriver.clampingMReleaseTube(); - } - - @ExtApiFn(name = "<校验>全部流程", group = "校验.全部", order = 600) - public void testAll(Boolean isHTube) throws AppException { - controler.takeTubeFromTubeholderToShakePos(isHTube); - controler.shakeTube(45, 5); - controler.takeTubeCap(isHTube); - controler.putbakTubeCapAndPutbakTubeToTubeHolder(isHTube); - } -} - - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/ext_param_mgr/HbotConsumableParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/ext_param_mgr/HbotConsumableParamMgr.java deleted file mode 100644 index e71fb85..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/ext_param_mgr/HbotConsumableParamMgr.java +++ /dev/null @@ -1,66 +0,0 @@ -package a8k.service.app.devicectrl.pos.ext_param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.HbotLargeBottleBSPosMgr; -import a8k.service.app.devicectrl.pos.param_mgr.HbotLittleBSPosMgr; -import a8k.service.app.devicectrl.pos.param_mgr.HbotProbeSubstancePosMgr; -import a8k.service.app.devicectrl.pos.param_mgr.HbotTipPosMgr; -import a8k.type.*; -import a8k.type.cfg.Pos3d; -import a8k.type.type.TipGroup; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotConsumableParamMgr { - @Resource - HbotLittleBSPosMgr hbotLittleBSPosMgr; - @Resource - HbotLargeBottleBSPosMgr hbotLargeBottleBSPosMgr; - @Resource - HbotTipPosMgr hbotTipPosMgr; - @Resource - HbotProbeSubstancePosMgr hbotProbeSubstancePosMgr; - - @PostConstruct - void initialize() { - } - - public Pos3d getTipPos(TipGroup tipGroup, Integer tipoff) { - return hbotTipPosMgr.getTipPos(tipGroup, tipoff); - } - - public Pos3d getLittleBufferPiercePos(ConsumableGroup group, Integer off) { - return hbotLittleBSPosMgr.getPiercePos(group, off); - } - - public Pos3d getLittleBufferSamplePos(ConsumableGroup group, Integer off) { - return hbotLittleBSPosMgr.getSamplePos(group, off); - } - - public Pos3d getLittleBufferSamplePosEnd(ConsumableGroup group, Integer off) { - return hbotLittleBSPosMgr.getSampleEndPos(group, off); - } - - public Pos3d getProbeSubstanceSamplePos(ConsumableGroup group, Integer off) { - return hbotProbeSubstancePosMgr.getSamplePos(group, off); - } - - public Pos3d getProbeSubstanceSamplePosEnd(ConsumableGroup group, Integer off) { - return hbotProbeSubstancePosMgr.getSampleEndPos(group, off); - } - - public Pos3d getLargeBufferSamplePos(ConsumableGroup group) { - return hbotLargeBottleBSPosMgr.getSamplePos(group); - } - - public Pos3d getLargeBufferSamplePosEnd(ConsumableGroup group){ - return hbotLargeBottleBSPosMgr.getSamplePosEnd(group); - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/Hbot2DCodeScanParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/Hbot2DCodeScanParamMgr.java deleted file mode 100644 index 6ae0090..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/Hbot2DCodeScanParamMgr.java +++ /dev/null @@ -1,53 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.service.app.devicectrl.pos.type.Hbot2DCodeScanPos; -import a8k.type.cfg.Pos2d; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class Hbot2DCodeScanParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(Hbot2DCodeScanParamMgr.class); - - - @PostConstruct - void initialize() { - for (Hbot2DCodeScanPos pos : Hbot2DCodeScanPos.values()) { - setParamChName(pos, pos.chName); - } - } - - public void setPBScanPosX(Integer X, Pos2d pos) { - logger.info("setPBScanPos{} {}", X, pos); - setParam("PBScanPos" + X, pos); - } - - public void setLittBSX(Integer X, Pos2d pos) { - logger.info("setLittBS{} {}", X, pos); - setParam("LittBS" + X, pos); - } - - public void setLarBSX(Integer X, Pos2d pos) { - logger.info("setLarBS{} {}", X, pos); - setParam("LarBS" + X, pos); - } - - public Pos2d getPBScanPosX(Integer X) {return getPos("PBScanPos" + X, Pos2d.class);} - - public Pos2d getLittBSX(Integer X) { - return getPos("LittBS" + X, Pos2d.class); - } - - public Pos2d getLarBSX(Integer X) { - return getPos("LarBS" + X, Pos2d.class); - } - - -} - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotFixedPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotFixedPosParamMgr.java deleted file mode 100644 index 62f38bd..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotFixedPosParamMgr.java +++ /dev/null @@ -1,42 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.type.cfg.Pos3d; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotFixedPosParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(HbotFixedPosParamMgr.class); - - enum Pos { - DropLiquidPos("滴液位置"), - ; - public final String chName; - - Pos(String chName) { - this.chName = chName; - } - } - - @PostConstruct - void initialize() { - for (Pos pos : Pos.values()) { - setParamChName(pos, pos.chName); - } - } - - public Pos3d getDropLiquidPos() { - return getPos(Pos.DropLiquidPos, Pos3d.class); - } - - public void setDropLiquidPos(Pos3d pos) { - setParam(Pos.DropLiquidPos.name(), pos); - } -} - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLargeBottleBSPosMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLargeBottleBSPosMgr.java deleted file mode 100644 index 070f385..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLargeBottleBSPosMgr.java +++ /dev/null @@ -1,66 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.service.app.devicectrl.pos.type.HbotLargeBottleBSPos; -import a8k.type.*; -import a8k.type.cfg.Pos3d; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotLargeBottleBSPosMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(HbotLargeBottleBSPosMgr.class); - - - @PostConstruct - void initialize() { - for (HbotLargeBottleBSPos param : HbotLargeBottleBSPos.values()) { - setParamChName(param, param.chName); - } - } - public void setParam(HbotLargeBottleBSPos param, Object val) { - setParam(param.name(), val); - } - - public LargeBottoleConsumablePosInfo getLargeBufferGroupPosInfo() { - LargeBottoleConsumablePosInfo info = new LargeBottoleConsumablePosInfo(); - info.pos00 = getPos(HbotLargeBottleBSPos.LargeBuffer_0Pos, Pos3d.class); - info.dx = getPos(HbotLargeBottleBSPos.LargeBuffer_DX, Double.class); - info.dy = getPos(HbotLargeBottleBSPos.LargeBuffer_DY, Double.class); - return info; - } - - - public void setLargeBufferGroupPosInfo(LargeBottoleConsumablePosInfo info) { - setParam(HbotLargeBottleBSPos.LargeBuffer_0Pos, info.pos00); - setParam(HbotLargeBottleBSPos.LargeBuffer_DX, info.dx); - setParam(HbotLargeBottleBSPos.LargeBuffer_DY, info.dy); - } - - public Pos3d getSamplePos(ConsumableGroup group) { - Pos3d pos00 = getPos(HbotLargeBottleBSPos.LargeBuffer_0Pos.name(), Pos3d.class); - Double dx = getPos(HbotLargeBottleBSPos.LargeBuffer_DX, Double.class); - Double dy = getPos(HbotLargeBottleBSPos.LargeBuffer_DY, Double.class); - - - int xoff = group.off % 3; - int yoff = group.off / 3; - - double x = pos00.x + xoff * dx; - double y = pos00.y + yoff * dy; - double z = getPos(HbotLargeBottleBSPos.LargeBSSSampleZPos, Double.class); - return new Pos3d((int) x, (int) y, (int) z); - } - - public Pos3d getSamplePosEnd(ConsumableGroup group) { - Pos3d var = getSamplePos(group); - var.z = getPos(HbotLargeBottleBSPos.LargeBSSSampleEndZPos, Double.class).intValue(); - return var; - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLittleBSPosMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLittleBSPosMgr.java deleted file mode 100644 index 93a8fea..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotLittleBSPosMgr.java +++ /dev/null @@ -1,90 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.service.app.devicectrl.pos.type.HbotLittleBSPos; -import a8k.type.*; -import a8k.type.cfg.Pos3d; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotLittleBSPosMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(HbotLittleBSPosMgr.class); - - - @PostConstruct - void initialize() { - for (HbotLittleBSPos param : HbotLittleBSPos.values()) { - setParamChName(param, param.chName); - } - } - - public void setParam(HbotLittleBSPos param, Object val) { - setParam(param.name(), val); - } - - - public LittleBottleConsumablePosInfo getPosInfo() { - LittleBottleConsumablePosInfo info = new LittleBottleConsumablePosInfo(); - info.g0_000 = getPos(HbotLittleBSPos.LittleBufferGroup0_000Pos, Pos3d.class); - info.g1_000 = getPos(HbotLittleBSPos.LittleBufferGroup1_000Pos, Pos3d.class); - info.g2_000 = getPos(HbotLittleBSPos.LittleBufferGroup2_000Pos, Pos3d.class); - info.g3_000 = getPos(HbotLittleBSPos.LittleBufferGroup3_000Pos, Pos3d.class); - info.g4_000 = getPos(HbotLittleBSPos.LittleBufferGroup4_000Pos, Pos3d.class); - info.g5_000 = getPos(HbotLittleBSPos.LittleBufferGroup5_000Pos, Pos3d.class); - info.dx = getPos(HbotLittleBSPos.LittleBufferGroupDX, Double.class); - info.dy = getPos(HbotLittleBSPos.LittleBufferGroupDY, Double.class); - return info; - } - - - public void setPosInfo(LittleBottleConsumablePosInfo info) { - setParam(HbotLittleBSPos.LittleBufferGroup0_000Pos, info.g0_000); - setParam(HbotLittleBSPos.LittleBufferGroup1_000Pos, info.g1_000); - setParam(HbotLittleBSPos.LittleBufferGroup2_000Pos, info.g2_000); - setParam(HbotLittleBSPos.LittleBufferGroup3_000Pos, info.g3_000); - setParam(HbotLittleBSPos.LittleBufferGroup4_000Pos, info.g4_000); - setParam(HbotLittleBSPos.LittleBufferGroup5_000Pos, info.g5_000); - setParam(HbotLittleBSPos.LittleBufferGroupDX, info.dx); - setParam(HbotLittleBSPos.LittleBufferGroupDY, info.dy); - } - - - - public Pos3d getPiercePos(ConsumableGroup group, Integer off) { - HbotLittleBSPos param = HbotLittleBSPos.valueOf(HbotLittleBSPos.LittleBufferGroup0_000Pos.ordinal() + group.ordinal()); - - Pos3d pos00 = getPos(param, Pos3d.class); - Double dx = getPos(HbotLittleBSPos.LittleBufferGroupDX, Double.class); - Double dy = getPos(HbotLittleBSPos.LittleBufferGroupDY, Double.class); - - Integer xoff = off % 5; - Integer yoff = off / 5; - - double x = pos00.x + xoff * dx; - double y = pos00.y + yoff * dy; - - Double z = getPos(HbotLittleBSPos.LittleBSPierceZPos, Double.class); - - - return new Pos3d((int) x, (int) y, z.intValue()); - } - - public Pos3d getSamplePos(ConsumableGroup group, Integer off) { - Pos3d pos = getPiercePos(group, off); - pos.z = getPos(HbotLittleBSPos.LittleBSSampleZPos, Double.class).intValue(); - return pos; - } - - public Pos3d getSampleEndPos(ConsumableGroup group, Integer off) { - Pos3d pos = getSamplePos(group, off); - pos.z = getPos(HbotLittleBSPos.LittleBSSampleEndZPos, Double.class).intValue(); - return pos; - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotProbeSubstancePosMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotProbeSubstancePosMgr.java deleted file mode 100644 index 99f0aaf..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotProbeSubstancePosMgr.java +++ /dev/null @@ -1,87 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.service.app.devicectrl.pos.type.HbotProbeSubstancePos; -import a8k.type.ConsumableGroup; -import a8k.type.LittleBottleConsumablePosInfo; -import a8k.type.cfg.Pos3d; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotProbeSubstancePosMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(HbotProbeSubstancePosMgr.class); - - - @PostConstruct - void initialize() { - for (HbotProbeSubstancePos param : HbotProbeSubstancePos.values()) { - setParamChName(param, param.chName); - } - } - - public void setParam(HbotProbeSubstancePos param, Object val) { - setParam(param.name(), val); - } - - - public LittleBottleConsumablePosInfo getPosInfo() { - LittleBottleConsumablePosInfo info = new LittleBottleConsumablePosInfo(); - info.g0_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup0_000Pos, Pos3d.class); - info.g1_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup1_000Pos, Pos3d.class); - info.g2_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup2_000Pos, Pos3d.class); - info.g3_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup3_000Pos, Pos3d.class); - info.g4_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup4_000Pos, Pos3d.class); - info.g5_000 = getPos(HbotProbeSubstancePos.ProbeSubstanceGroup5_000Pos, Pos3d.class); - info.dx = getPos(HbotProbeSubstancePos.ProbeSubstanceDX, Double.class); - info.dy = getPos(HbotProbeSubstancePos.ProbeSubstanceDY, Double.class); - return info; - } - - - public void setPosInfo(LittleBottleConsumablePosInfo info) { - setParam(HbotProbeSubstancePos.ProbeSubstanceGroup0_000Pos, info.g0_000); - setParam(HbotProbeSubstancePos.ProbeSubstanceGroup1_000Pos, info.g1_000); - setParam(HbotProbeSubstancePos.ProbeSubstanceGroup2_000Pos, info.g2_000); - setParam(HbotProbeSubstancePos.ProbeSubstanceGroup3_000Pos, info.g3_000); - setParam(HbotProbeSubstancePos.ProbeSubstanceGroup4_000Pos, info.g4_000); - setParam(HbotProbeSubstancePos.ProbeSubstanceGroup5_000Pos, info.g5_000); - setParam(HbotProbeSubstancePos.ProbeSubstanceDX, info.dx); - setParam(HbotProbeSubstancePos.ProbeSubstanceDY, info.dy); - } - - - Pos3d getXYPos(ConsumableGroup group, Integer off) { - HbotProbeSubstancePos param = HbotProbeSubstancePos.valueOf(HbotProbeSubstancePos.ProbeSubstanceGroup0_000Pos.ordinal() + group.ordinal()); - - Pos3d pos00 = getPos(param, Pos3d.class); - Double dx = getPos(HbotProbeSubstancePos.ProbeSubstanceDX, Double.class); - Double dy = getPos(HbotProbeSubstancePos.ProbeSubstanceDY, Double.class); - - Integer xoff = off % 5; - Integer yoff = off / 5; - - double x = pos00.x + xoff * dx; - double y = pos00.y + yoff * dy; - - return new Pos3d((int) x, (int) y, 0); - } - - public Pos3d getSamplePos(ConsumableGroup group, Integer off) { - Pos3d pos = getXYPos(group, off); - pos.z = getPos(HbotProbeSubstancePos.ProbeSubstanceSampleZPos, Double.class).intValue(); - return pos; - } - - public Pos3d getSampleEndPos(ConsumableGroup group, Integer off) { - Pos3d pos = getSamplePos(group, off); - pos.z = getPos(HbotProbeSubstancePos.ProbeSubstanceSampleEndZPos, Double.class).intValue(); - return pos; - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotSamplePosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotSamplePosParamMgr.java deleted file mode 100644 index 1631fa9..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotSamplePosParamMgr.java +++ /dev/null @@ -1,36 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.service.app.devicectrl.pos.type.HbotSamplePos; -import a8k.type.cfg.Pos3d; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotSamplePosParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(HbotSamplePosParamMgr.class); - - - - @PostConstruct - void initialize() { - for (HbotSamplePos pos : HbotSamplePos.values()) { - setParamChName(pos, pos.chName); - } - - } - - public Pos3d getSamplePos(HbotSamplePos pos) { - return getPos(pos, Pos3d.class); - } - - public void setSamplePos(HbotSamplePos pos, Pos3d pos3d) { - setParam(pos, pos3d); - } -} - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotTipPosMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotTipPosMgr.java deleted file mode 100644 index 3abdd82..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/HbotTipPosMgr.java +++ /dev/null @@ -1,101 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.service.app.devicectrl.pos.type.HbotTipPosParam; -import a8k.type.cfg.Pos3d; -import a8k.type.type.TipGroup; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import org.springframework.util.Assert; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class HbotTipPosMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(HbotTipPosMgr.class); - - - - @PostConstruct - void initialize() { - for (HbotTipPosParam param : HbotTipPosParam.values()) { - setParamChName(param, param.chName); - } - - } - - public void setParam(HbotTipPosParam param, Object val) { - setParam(param.name(), val); - } - - public void setTipGroupParam(TipGroup tipGroup, Pos3d tip000, Double dx, Double dy) { - HbotTipPosParam tip000Pos = null; - HbotTipPosParam tipDxPos = null; - HbotTipPosParam tipDyPos = null; - - if (tipGroup == TipGroup.GROUP0) { - tip000Pos = HbotTipPosParam.TipGroup0_000Pos; - tipDxPos = HbotTipPosParam.TipGroup0_SpaceingX; - tipDyPos = HbotTipPosParam.TipGroup0_SpaceingY; - } else if (tipGroup == TipGroup.GROUP1) { - tip000Pos = HbotTipPosParam.TipGroup1_000Pos; - tipDxPos = HbotTipPosParam.TipGroup1_SpaceingX; - tipDyPos = HbotTipPosParam.TipGroup2_SpaceingY; - } else if (tipGroup == TipGroup.GROUP2) { - tip000Pos = HbotTipPosParam.TipGroup2_000Pos; - tipDxPos = HbotTipPosParam.TipGroup2_SpaceingX; - tipDyPos = HbotTipPosParam.TipGroup2_SpaceingY; - } - - Assert.isTrue(tip000Pos != null, "tip000Pos != null"); - - setParam(tip000Pos, tip000); - setParam(tipDxPos, dx); - setParam(tipDyPos, dy); - } - - public Pos3d getTipPos(TipGroup tipGroup, Integer tipoff) { - Pos3d tip000 = null; - Double dx = 0.0; - Double dy = 0.0; - - if (tipGroup == TipGroup.GROUP0) { - tip000 = getPos(HbotTipPosParam.TipGroup0_000Pos, Pos3d.class); - dx = getPos(HbotTipPosParam.TipGroup0_SpaceingX, Double.class); - dy = getPos(HbotTipPosParam.TipGroup0_SpaceingY, Double.class); - - } else if (tipGroup == TipGroup.GROUP1) { - tip000 = getPos(HbotTipPosParam.TipGroup1_000Pos, Pos3d.class); - dx = getPos(HbotTipPosParam.TipGroup1_SpaceingX, Double.class); - dy = getPos(HbotTipPosParam.TipGroup2_SpaceingY, Double.class); - } else if (tipGroup == TipGroup.GROUP2) { - tip000 = getPos(HbotTipPosParam.TipGroup2_000Pos, Pos3d.class); - dx = getPos(HbotTipPosParam.TipGroup2_SpaceingX, Double.class); - dy = getPos(HbotTipPosParam.TipGroup2_SpaceingY, Double.class); - } - Assert.isTrue(tip000 != null, "tip000 != null"); - Assert.isTrue(dx != null, "dx != null"); - Assert.isTrue(dy != null, "dy != null"); - - int xoff = tipoff % 12; - int yoff = tipoff / 12; - - double x = tip000.x + xoff * dx; - double y = tip000.y + yoff * dy; - double z = tip000.z; - - return new Pos3d((int) x, (int) y, (int) z); - } - - - public void setDropTipPos(Pos3d pos){ - setParam(HbotTipPosParam.DropTipPos, pos); - } - - public Pos3d getDropTipPos(){ - return getPos(HbotTipPosParam.DropTipPos, Pos3d.class); - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/OptModuleParamsMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/OptModuleParamsMgr.java deleted file mode 100644 index 0a33617..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/OptModuleParamsMgr.java +++ /dev/null @@ -1,89 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class OptModuleParamsMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(OptModuleParamsMgr.class); - - - enum POS { - PullerTargetPos("拉板目标位置"), - OptScanerDropPos("丢板坐标"), - OptScanerScandbyPos("扫描待机位"), - TOptScanStartPos("T光学扫描起始坐标"), - FOptScanStartPos("F光学扫描起始坐标"), - ; - public final String chName; - - POS(String chName) { - this.chName = chName; - } - } - - - @PostConstruct - void initialize() { - for (POS pos : POS.values()) { - setParamChName(pos, pos.chName); - } - } - - public void paramReset() { - logger.info("init param"); - setParam(POS.PullerTargetPos, 1147); - setParam(POS.OptScanerDropPos, -349); - setParam(POS.OptScanerScandbyPos, 305); - setParam(POS.TOptScanStartPos, 3723); - setParam(POS.FOptScanStartPos, 2559); - } - - public Integer getPullerTargetPos() { - return getPos(POS.PullerTargetPos, Integer.class); - } - - public Integer getOptScanerDropPos() { - return getPos(POS.OptScanerDropPos, Integer.class); - } - - public Integer getOptScanerScandbyPos() { - return getPos(POS.OptScanerScandbyPos, Integer.class); - } - - public Integer getTOptScanStartPos() { - return getPos(POS.TOptScanStartPos, Integer.class); - } - - public Integer getFOptScanStartPos() { - return getPos(POS.FOptScanStartPos, Integer.class); - } - - public void setPullerTargetPos(Integer pos) { - setParam(POS.PullerTargetPos, pos); - } - - public void setOptScanerDropPos(Integer pos) { - setParam(POS.OptScanerDropPos, pos); - } - - public void setOptScanerScandbyPos(Integer pos) { - setParam(POS.OptScanerScandbyPos, pos); - } - - public void setTOptScanStartPos(Integer pos) { - setParam(POS.TOptScanStartPos, pos); - } - - public void setFOptScanStartPos(Integer pos) { - setParam(POS.FOptScanStartPos, pos); - } -} - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/PlatesBoxPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/PlatesBoxPosParamMgr.java deleted file mode 100644 index 0a687a3..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/PlatesBoxPosParamMgr.java +++ /dev/null @@ -1,75 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - - -@Component -public class PlatesBoxPosParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(PlatesBoxPosParamMgr.class); - - enum POS { - Ch0YPos("通道0Y轴位置"), - Ch5YPos("通道5Y轴位置"), - PushEndXPos("推杆到位坐标"), - ; - public final String chName; - - POS(String chName) { - this.chName = chName; - } - } - - - @PostConstruct - void initialize() { - for (POS pos : POS.values()) { - setParamChName(pos, pos.chName); - } - } - - - public void paramReset() { - logger.info("init param"); - setParam(POS.Ch0YPos, -17); - setParam(POS.Ch5YPos, 1308); - setParam(POS.PushEndXPos, 1160); - } - - public Integer getCh0YPos() { - return getPos(POS.Ch0YPos, Integer.class); - } - - public Integer getCh5YPos() { - return getPos(POS.Ch0YPos, Integer.class); - } - - public Double getYSpacing() { - return (getCh5YPos() - getCh0YPos()) / 5.0; - } - - public Integer getChXPos(int ch) { - return (int) (getCh0YPos() + ch * getYSpacing()); - } - - public Integer getPushEndXPos() { - return getPos(POS.PushEndXPos, Integer.class); - } - - public void setCh0YPos(Integer pos) { - setParam(POS.Ch0YPos, pos); - } - - public void setCh5YPos(Integer pos) { - setParam(POS.Ch5YPos, pos); - } - - public void setPushEndXPos(Integer pos) { - setParam(POS.PushEndXPos, pos); - } -} - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubeFeedingModuleParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubeFeedingModuleParamMgr.java deleted file mode 100644 index 5b68369..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubeFeedingModuleParamMgr.java +++ /dev/null @@ -1,101 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.type.TubeFeedingModuleSetting; -import a8k.type.TubeFeedingModulePos; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - - -@Component -public class TubeFeedingModuleParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(TubeFeedingModuleParamMgr.class); - @PostConstruct - void initialize() { - for (TubeFeedingModulePos pos : TubeFeedingModulePos.values()) { - setParamChName(pos, pos.chName); - } - for (TubeFeedingModuleSetting param : TubeFeedingModuleSetting.values()) { - setParamChName(param, param.chName); - } - } - - /** - * 获取管子预处理位置 - * @param tubeIndex 管子序号 - * @return 坐标 - */ - public Integer getTubePreProcessPos(Integer tubeIndex) { - Integer startPos = getPos(TubeFeedingModulePos.Tube0PreProcessPos, Integer.class); - Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); - return (int)(startPos + spacing * tubeIndex); - } - - /** - * 获取试管扫描位置 - * @param tubeIndex 管子序号 - * @return 坐标 - */ - public Integer getTubeScanPos(Integer tubeIndex) { - Integer startPos = getPos(TubeFeedingModulePos.Tube0ScanPos, Integer.class); - Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); - return (int)(startPos + spacing * tubeIndex); - } - - /** - * 获取试管高度判断位置 - * @param tubeIndex 管子序号 - * @return 坐标 - */ - public Integer getTubeAltitJudgPos(Integer tubeIndex) { - Integer startPos = getPos(TubeFeedingModulePos.Tube0AltitJudgPos, Integer.class); - Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); - return (int)(startPos + spacing * tubeIndex); - } - - /** - * 获取试管存在判断位置 - * @param tubeIndex 管子序号 - * @return 坐标 - */ - public Integer getTubeExistJudgPos(Integer tubeIndex) { - Integer startPos = getPos(TubeFeedingModulePos.Tube0ExistJudgPos, Integer.class); - Double spacing = getPos(TubeFeedingModuleSetting.TubeSpacing, Double.class); - return (int)(startPos + spacing * tubeIndex); - } - - - /** - * 获取试管架进入位置 - * @return X轴坐标 - */ - public Integer getTubeHolderEnterXPos() { - return getPos(TubeFeedingModulePos.TubeHolderEnterXPos, Integer.class); - } - - /** - * 获取试管架出口位置 - * @return X轴坐标 - */ - public Integer getTubeHolderExitXPos() { - return getPos(TubeFeedingModulePos.TubeHolderExitXPos, Integer.class); - } - - /** - * 获取试管架扫描位置 - * @return X轴坐标 - */ - public Integer getTubeHolderScanXPos() { - return getPos(TubeFeedingModulePos.TubeHolderScanXPos, Integer.class); - } - - /** - * 获取试管架扫描位置 - * @return X轴坐标 - */ - public Integer getTubeScanServoTorque() { - return getPos(TubeFeedingModuleSetting.TubeScanServoTorque, Integer.class); - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubePreProcesPosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubePreProcesPosParamMgr.java deleted file mode 100644 index 2d55764..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TubePreProcesPosParamMgr.java +++ /dev/null @@ -1,80 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import a8k.type.TubePreProcessGripperPos; -import a8k.type.TubePreProcessTubeClamp; -import a8k.type.TubePreProcessYPos; -import a8k.type.TubePreProcessZAxisPos; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -@Component -public class TubePreProcesPosParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(TubeFeedingModuleParamMgr.class); - @PostConstruct - void initialize() { - for (var pos : TubePreProcessGripperPos.values()) { - setParamChName(pos, pos.chName); - } - for (var pos : TubePreProcessTubeClamp.values()) { - setParamChName(pos, pos.chName); - } - for (var pos : TubePreProcessYPos.values()) { - setParamChName(pos, pos.chName); - } - for (var pos : TubePreProcessZAxisPos.values()) { - setParamChName(pos, pos.chName); - } - } - - public void setPos(TubePreProcessGripperPos pos, Integer value) {setParam(pos, value);} - - public void setPos(TubePreProcessTubeClamp pos, Integer value) {setParam(pos, value);} - - public void setPos(TubePreProcessYPos pos, Integer value) {setParam(pos, value);} - - public void setPos(TubePreProcessZAxisPos pos, Integer value) {setParam(pos, value);} - - private Integer getParam(Enum pos) {return getPos(pos, Integer.class);} - - //Public - - public Integer getPos(TubePreProcessGripperPos pos) {return getParam(pos);} - - public Integer getPos(TubePreProcessTubeClamp pos) {return getParam(pos);} - - public Integer getPos(TubePreProcessYPos pos) {return getParam(pos);} - - public Integer getPos(TubePreProcessZAxisPos pos) {return getParam(pos);} - - - public Integer getGripperServoOpenPos() {return getParam(TubePreProcessGripperPos.GripperServoOpenPos);} - - public Integer getGripperServoClosePos() {return getParam(TubePreProcessGripperPos.GripperServoClosePos);} - - public Integer getGripperServoTakeCapPos() {return getParam(TubePreProcessGripperPos.GripperServoTakeCapPos);} - - public Integer getYServoTakeTubePos() {return getParam(TubePreProcessYPos.YServoTakeTubePos);} - - public Integer getYServoShakePos() {return getParam(TubePreProcessYPos.YServoShakePos);} - - public Integer getZMotorTakeTubePos(Boolean hightTuhe) { - if (hightTuhe) { - return getParam(TubePreProcessZAxisPos.ZMotorTakeHTubePos); - } else { - return getParam(TubePreProcessZAxisPos.ZMotorTakeSTubePos); - } - } - - public Integer getZMotorShakeTubePos() {return getParam(TubePreProcessZAxisPos.ZMotorShakeTubePos);} - - public Integer getZMotorPutCapPos() {return getParam(TubePreProcessZAxisPos.ZMotorPutTubeCapPos);} - - public Integer getShakeClampMotorClampPos() {return getParam(TubePreProcessTubeClamp.ShakeClampMotorClampPos);} - - public Integer getShakeClampMotorReleasePos() {return getParam(TubePreProcessTubeClamp.ShakeClampMotorReleasePos);} - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TurntablePosParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TurntablePosParamMgr.java deleted file mode 100644 index 993b53b..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/TurntablePosParamMgr.java +++ /dev/null @@ -1,75 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr; - -import a8k.service.app.devicectrl.pos.param_mgr.base.ParamMgr; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * HBOT二维码扫描坐标参数 - */ -@Component -public class TurntablePosParamMgr extends ParamMgr { - static final Logger logger = LoggerFactory.getLogger(TurntablePosParamMgr.class); - /* - * 转盘相关位置 - */ - enum POS { - PushPos0("入板位置"), - PullPos0("出板位置"), - DropLiquidPos0("滴液位置"), - PosSpacing("位置间隔"), - ; - final String chName; - POS(String chName) { - this.chName = chName; - } - } - @PostConstruct - void initialize() { - for (POS pos : POS.values()) { - setParamChName(pos, pos.chName); - } - } - - public void paramReset() { - logger.info("init param"); - setParam(POS.PushPos0, 1650); - setParam(POS.PullPos0, 19700); - setParam(POS.DropLiquidPos0, 1650 + 8950); - setParam(POS.PosSpacing, 1800); - } - public Integer getPushPos0() { - return getPos(POS.PushPos0, Integer.class); - } - - public Integer getPullPos0() { - return getPos(POS.PullPos0, Integer.class); - } - - public Integer getDropLiquidPos0() { - return getPos(POS.DropLiquidPos0, Integer.class); - } - - public Integer getPosSpacing() { - return getPos(POS.PosSpacing, Integer.class); - } - - public void setPushPos0(Integer pos) { - setParam(POS.PushPos0, pos); - } - - public void setPullPos0(Integer pos) { - setParam(POS.PullPos0, pos); - } - - public void setDropLiquidPos0(Integer pos) { - setParam(POS.DropLiquidPos0, pos); - } - - public void setPosSpacing(Integer pos) { - setParam(POS.PosSpacing, pos); - } -} - diff --git a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/base/ParamMgr.java b/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/base/ParamMgr.java deleted file mode 100644 index 72f266e..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/param_mgr/base/ParamMgr.java +++ /dev/null @@ -1,49 +0,0 @@ -package a8k.service.app.devicectrl.pos.param_mgr.base; - -import a8k.service.db.LowerDeviceParameterDBService; -import a8k.service.db.type.Parameter; -import jakarta.annotation.Resource; - -import java.util.List; - -public class ParamMgr { - @Resource - LowerDeviceParameterDBService db; - String serviceName = this.getClass().getSimpleName(); - - - public List getParams() { - return db.getParams(serviceName); - } - - public void resetParams() { - db.resetParamByService(serviceName); - } - - public void resetParam(String key) { - db.resetParam(serviceName, key); - } - - - public T getPos(String key, Class tClass) { - return db.getParam(this.serviceName, key, tClass); - } - - public T getPos(Enum key, Class tClass) { - return db.getParam(this.serviceName, key.name(), tClass); - } - - public void setParamChName(Enum key, String chName) { - db.setParamChName(serviceName, key.name(), chName); - } - - - public void setParam(String key, Object pos) { - db.updateParam(serviceName, key, pos); - } - - public void setParam(Enum key, Object pos) { - db.updateParam(serviceName, key.name(), pos); - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/type/Hbot2DCodeScanPos.java b/src/main/java/a8k/service/app/devicectrl/pos/type/Hbot2DCodeScanPos.java deleted file mode 100644 index fa1399a..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/type/Hbot2DCodeScanPos.java +++ /dev/null @@ -1,30 +0,0 @@ -package a8k.service.app.devicectrl.pos.type; - -public enum Hbot2DCodeScanPos { - PBScanPos0("板夹仓扫码位置0"), - PBScanPos1("板夹仓扫码位置1"), - PBScanPos2("板夹仓扫码位置2"), - PBScanPos3("板夹仓扫码位置3"), - PBScanPos4("板夹仓扫码位置4"), - PBScanPos5("板夹仓扫码位置5"), - - LittBS0("小缓冲液扫码位置0"), - LittBS1("小缓冲液扫码位置1"), - LittBS2("小缓冲液扫码位置2"), - LittBS3("小缓冲液扫码位置3"), - LittBS4("小缓冲液扫码位置4"), - LittBS5("小缓冲液扫码位置5"), - - LarBS0("大缓冲液扫码位置0"), - LarBS1("大缓冲液扫码位置1"), - LarBS2("大缓冲液扫码位置2"), - LarBS3("大缓冲液扫码位置3"), - LarBS4("大缓冲液扫码位置4"), - LarBS5("大缓冲液扫码位置5"), - ; - public final String chName; - - Hbot2DCodeScanPos(String chName) { - this.chName = chName; - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotLargeBottleBSPos.java b/src/main/java/a8k/service/app/devicectrl/pos/type/HbotLargeBottleBSPos.java deleted file mode 100644 index cd2475f..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotLargeBottleBSPos.java +++ /dev/null @@ -1,19 +0,0 @@ -package a8k.service.app.devicectrl.pos.type; - -public enum HbotLargeBottleBSPos { - LargeBuffer_0Pos("大瓶缓冲液的第1个位置"), - LargeBuffer_DX("大瓶缓冲液的X间距"), - LargeBuffer_DY("大瓶缓冲液的Y间距"), - LargeBSSSampleZPos("大瓶缓冲液取样Z坐标"), - LargeBSSSampleEndZPos("大瓶缓冲液取样结束Z坐标"), - ; - final public String chName; - - HbotLargeBottleBSPos(String chName) { - this.chName = chName; - } - - public static HbotLargeBottleBSPos valueOf(int off) { - return HbotLargeBottleBSPos.values()[off]; - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotLittleBSPos.java b/src/main/java/a8k/service/app/devicectrl/pos/type/HbotLittleBSPos.java deleted file mode 100644 index 99aedfe..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotLittleBSPos.java +++ /dev/null @@ -1,26 +0,0 @@ -package a8k.service.app.devicectrl.pos.type; - -public enum HbotLittleBSPos { - LittleBufferGroup0_000Pos("第1组小瓶缓冲液的第1个位置"), - LittleBufferGroup1_000Pos("第1组小瓶缓冲液的第2个位置"), - LittleBufferGroup2_000Pos("第1组小瓶缓冲液的第3个位置"), - LittleBufferGroup3_000Pos("第1组小瓶缓冲液的第4个位置"), - LittleBufferGroup4_000Pos("第1组小瓶缓冲液的第5个位置"), - LittleBufferGroup5_000Pos("第1组小瓶缓冲液的第6个位置"), - LittleBufferGroupDX("小瓶缓冲液的X间距"), - LittleBufferGroupDY("小瓶缓冲液的Y间距"), - - LittleBSPierceZPos("小瓶缓冲液刺破Z坐标"), - LittleBSSampleZPos("小瓶缓冲液取样Z坐标"), - LittleBSSampleEndZPos("小瓶缓冲液取样结束Z坐标"), - ; - final public String chName; - - HbotLittleBSPos(String chName) { - this.chName = chName; - } - - public static HbotLittleBSPos valueOf(int off) { - return HbotLittleBSPos.values()[off]; - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotProbeSubstancePos.java b/src/main/java/a8k/service/app/devicectrl/pos/type/HbotProbeSubstancePos.java deleted file mode 100644 index 62d6e10..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotProbeSubstancePos.java +++ /dev/null @@ -1,26 +0,0 @@ -package a8k.service.app.devicectrl.pos.type; - -public enum HbotProbeSubstancePos { - ProbeSubstanceGroup0_000Pos("第1组探测物质的第1个位置"), - ProbeSubstanceGroup1_000Pos("第1组探测物质的第2个位置"), - ProbeSubstanceGroup2_000Pos("第1组探测物质的第3个位置"), - ProbeSubstanceGroup3_000Pos("第1组探测物质的第4个位置"), - ProbeSubstanceGroup4_000Pos("第1组探测物质的第5个位置"), - ProbeSubstanceGroup5_000Pos("第1组探测物质的第6个位置"), - ProbeSubstanceDX("探测物质的X间距"), - ProbeSubstanceDY("探测物质的Y间距"), - - ProbeSubstanceSampleZPos("探测物质取样Z坐标"), - ProbeSubstanceSampleEndZPos("探测物质取样结束Z坐标"), - - ; - final public String chName; - - HbotProbeSubstancePos(String chName) { - this.chName = chName; - } - - public static HbotProbeSubstancePos valueOf(int off) { - return HbotProbeSubstancePos.values()[off]; - } -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotSamplePos.java b/src/main/java/a8k/service/app/devicectrl/pos/type/HbotSamplePos.java deleted file mode 100644 index 3935401..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotSamplePos.java +++ /dev/null @@ -1,35 +0,0 @@ -package a8k.service.app.devicectrl.pos.type; - -public enum HbotSamplePos { - EmergencyTubeSamplePos("<急诊位>取样位置"), - EmergencyTubeSampleEndPos("<急诊位>取样结束位置"), - - BloodHTubeSamplePos("<全血高试管>取样位置"), - BloodHTubeSampleEndPos("<全血高试管>取样结束位置"), - - BloodSTubeSamplePos("<全血低试管>取样位置"), - BloodSTubeSampleEndPos("<全血低试管>取样结束位置"), - - MiniTubeSamplePos("<迷你试管>取样位置"), - MinitubeSampleEndPos("<迷你试管>取样结束位置"), - - MiniBloodSamplePos("<阳普管>取样位置"), - MiniBloodSampleEndPos("<阳普管>取样结束位置"), - - Bulltube1P5SamplePos("<子弹头试管1.5mL>取样位置"), - Bulltube1P5SampleEndPos("<子弹头试管1.5mL>取样结束位置"), - - Bulltube0P5SamplePos("<子弹头试管0.5mL>取样位置"), - Bulltube0P5SampleEndPos("<子弹头试管0.5mL>取样结束位置"), - - StoolTestTubeSamplePos("<粪便试管>取样位置"), - StoolTestTubeSampleEndPos("<粪便试管>取样结束位置"), - ; - public final String chName; - - HbotSamplePos(String chName) { - this.chName = chName; - } - - -} diff --git a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotTipPosParam.java b/src/main/java/a8k/service/app/devicectrl/pos/type/HbotTipPosParam.java deleted file mode 100644 index 30eba82..0000000 --- a/src/main/java/a8k/service/app/devicectrl/pos/type/HbotTipPosParam.java +++ /dev/null @@ -1,27 +0,0 @@ -package a8k.service.app.devicectrl.pos.type; - -public enum HbotTipPosParam { - TipGroup0_000Pos("第1组TIP的第1个位置"), - TipGroup0_SpaceingX("第1组TIP的X间距"), - TipGroup0_SpaceingY("第1组TIP的Y间距"), - - TipGroup1_000Pos("第2组TIP的第1个位置"), - TipGroup1_SpaceingX("第2组TIP的X间距"), - TipGroup1_SpaceingY("第2组TIP的Y间距"), - - TipGroup2_000Pos("第3组TIP的第1个位置"), - TipGroup2_SpaceingX("第3组TIP的X间距"), - TipGroup2_SpaceingY("第3组TIP的Y间距"), - - DropTipPos("丢TIP位置"), - ; - final public String chName; - - HbotTipPosParam(String chName) { - this.chName = chName; - } - - public static HbotTipPosParam valueOf(int off) { - return HbotTipPosParam.values()[off]; - } -}