From a1895216c5f27ff944867249c804dac350903a25 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 14 Oct 2024 15:19:00 +0800 Subject: [PATCH] update --- .../service/app/appctrl/DeviceInitCtrlService.java | 2 +- .../mainflowctrl/action/SEQ4_PRE_PROCESS.java | 11 +- .../app/devicedriver/basectrl/CodeScaner.java | 36 +++ .../basectrl/HbotBaseMoveControlService.java | 208 ++++++++++++++ .../app/devicedriver/basectrl/HbotModule.java | 89 ++++++ .../devicedriver/basectrl/PipetteCtrlModule.java | 315 +++++++++++++++++++++ .../devicedriver/basectrl/type/HbotRegIndex.java | 51 ++++ .../basectrl/type/PipetteRegIndex.java | 79 ++++++ .../calibration/Hbot2DCodeScanPosCalibration.java | 4 +- .../commonctrl/HardwareCommonCtrl.java | 2 +- .../service/app/devicedriver/ctrl/CodeScaner.java | 36 --- .../app/devicedriver/ctrl/ConsumablesScanCtrl.java | 19 +- .../app/devicedriver/ctrl/HbotControlService.java | 314 -------------------- .../devicedriver/ctrl/PipetteGunCtrlService.java | 2 - .../app/devicedriver/ctrl/basic/HbotModule.java | 89 ------ .../devicedriver/ctrl/basic/PipetteCtrlModule.java | 315 --------------------- .../app/devicedriver/ctrl/type/HbotRegIndex.java | 51 ---- .../devicedriver/ctrl/type/PipetteRegIndex.java | 79 ------ .../app/devicedriver/testscript/TestScript.java | 6 +- 19 files changed, 799 insertions(+), 909 deletions(-) create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/CodeScaner.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/type/HbotRegIndex.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/type/PipetteRegIndex.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/CodeScaner.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/basic/HbotModule.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/basic/PipetteCtrlModule.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/type/HbotRegIndex.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/type/PipetteRegIndex.java diff --git a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java index a303f9c..897c234 100644 --- a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java @@ -9,7 +9,7 @@ import a8k.service.debug.AppDebugHelperService; import a8k.type.checkpoint.CheckResult; import a8k.type.checkpoint.Checkpoint; import a8k.service.app.appstate.GStateService; -import a8k.service.app.devicedriver.ctrl.basic.HbotModule; +import a8k.service.app.devicedriver.basectrl.HbotModule; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java index 1110b8d..ec9c465 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java @@ -3,8 +3,6 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.OS; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appdata.AppProjInfoMgrService; -import a8k.service.app.appstate.type.state.IncubationSubTankState; -import a8k.service.app.appstate.type.state.ProjProcessState; import a8k.service.debug.AppDebugHelperService; import a8k.utils.AppExceptionBuilder; import a8k.service.bases.AppEventBusService; @@ -13,8 +11,7 @@ import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appstate.*; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.Tube; -import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicedriver.ctrl.HbotControlService; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControlService; import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl; import a8k.service.app.devicedriver.ctrl.SampleScanTransportHardwareControler; import a8k.service.app.devicedriver.ctrl.SamplesPreProcesCtrl; @@ -61,11 +58,11 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { @Resource ReactionPlatesTransmitCtrl reactionPlatesTransmitCtrl; @Resource - SamplesPreProcesCtrl samplesPreProcesCtrl; + SamplesPreProcesCtrl samplesPreProcesCtrl; @Resource - HbotControlService hbotControlService; + HbotBaseMoveControlService hbotBaseMoveControlService; @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; + IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; @Resource diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/CodeScaner.java b/src/main/java/a8k/service/app/devicedriver/basectrl/CodeScaner.java new file mode 100644 index 0000000..e9a2e35 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/CodeScaner.java @@ -0,0 +1,36 @@ +package a8k.service.app.devicedriver.basectrl; + +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class CodeScaner { + + @Resource + A8kCanBusService canBus; + + public String pipetteModCodeScannerScanCode() throws AppException { + try { + canBus.codeScanerStartScan(MId.PipetteModCodeScanner); + String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, 300); + canBus.codeScanerStopScan(MId.PipetteModCodeScanner); + return result; + } catch (AppException e) { + return ""; + } + } + + public String feedingModScannerModCodeScannerScanCode(Integer waittime) { + try { + canBus.codeScanerStartScan(MId.FeedingModScannerMod); + String result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, waittime); + canBus.codeScanerStopScan(MId.FeedingModScannerMod); + return result; + } catch (AppException e) { + return ""; + } + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java new file mode 100644 index 0000000..7eccdd0 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java @@ -0,0 +1,208 @@ +package a8k.service.app.devicedriver.basectrl; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicedriver.basectrl.type.PipetteRegIndex; +import a8k.type.exception.AppException; +import a8k.type.cfg.*; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.hardware.type.regindex.RegIndex; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * Hbot控制服务 + */ +@Component +@ExtApiTab(cfg = ExtApiTabConfig.HbotControlService) +public class HbotBaseMoveControlService { + static Logger logger = LoggerFactory.getLogger(HbotBaseMoveControlService.class); + + @Resource + A8kCanBusService canBus; + @Resource + PipetteCtrlModule pipetteCtrlModule; + @Resource + HbotModule hbotModule; + Integer ao = 20000; + + public void hbotMoveTo(Pos3d targetPos) throws AppException { + logger.info("hbotCheckAndMoveTo:{}", targetPos); + + // 检查盖板是否关闭 + if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); + } + + boolean zEnable = true; + boolean hbotEnable = canBus.moduleGetReg(MId.HbotM, RegIndex.kreg_xyrobot_is_enable) == 1; + + //检查Z轴是否使能,如果没有使能,使能并移动到零点 + if (pipetteCtrlModule.getReg(PipetteRegIndex.kreg_pipette_zm_is_enable) == 0) { + pipetteCtrlModule.zMotorEnable(1); + pipetteCtrlModule.zMotorMoveZeroBlock(); + zEnable = false; + } + + //检查Z轴是否在零点 + if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { + pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + } + if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { + throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); + } + + // HBot移动 + hbotModule.enable(1); + hbotModule.moveToBlock(targetPos.x - 20, targetPos.y - 20, ao); + hbotModule.moveToBlock(targetPos.x, targetPos.y, ao); + hbotModule.moveToBlock(targetPos.x, targetPos.y, ao); + + // Z轴移动 + if (targetPos.z != 0) { + pipetteCtrlModule.zMotorEnable(1); + pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + pipetteCtrlModule.zMotorMoveToBlock(targetPos.z); + } + pipetteCtrlModule.zMotorEnable(zEnable ? 1 : 0); + hbotModule.enable(hbotEnable ? 1 : 0); + } + + public void hbotMoveTo(Pos2d tpos) throws AppException { + hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); + } + +// public String scan2dCode(Integer waittime) throws AppException { +// try { +// canBus.codeScanerStartScan(MId.PipetteModCodeScanner); +// String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, waittime); +// canBus.codeScanerStopScan(MId.PipetteModCodeScanner); +// return result; +// } catch (AppException e) { +// return ""; +// } +// } +// +// +// public void zMoveTo(Integer z) throws AppException { +// if (z == 0) { +// pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); +// } else { +// pipetteCtrlModule.zMotorMoveToBlock(z); +// } +// } +// +// private void hbotCheckAndMoveTo(Pos2d targetPos) throws AppException { +// hbotMoveTo(new Pos3d(targetPos.x, targetPos.y, 0)); +// } + +// private void modGroupMoveToZero() throws AppException { +// if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { +// throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); +// } +// +// pipetteCtrlModule.zMotorEnable(1); +// hbotModule.enable(1); +// +// hbotModule.moveToZeroBlock(timep.getHbotRuntoZeroActionOvertime()); +// +// // 丢弃tip +// Pos3d dropPos = pp.getTipDropPos(); +// hbotMoveTo(dropPos); +// // TODO: canBus.pipetteCtrlInitDeviceBlock(MId.PipetteMod, timep.getActionOvertime()); +// +// // 快速归零 +// modGroupMoveToZeroQuick(); +// } + +// private void modGroupMoveToZeroQuick() throws AppException { + // hbotCheckAndMoveTo(new Pos2d(0, 0)); + // } + + + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // 单步测试 + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + // @ExtApiFn(name = "丢Tip", group = "单步测试") + // public void dropTip() throws AppException { + // Pos3d pos = pp.getTipDropPos(); + // hbotMoveTo(pos.x, pos.y); + // zMoveTo(pos.z); + // pipetteCtrlModule.putTipBlock(); + // zMoveTo(0); + // } + // + // @ExtApiFn(name = "取Tip", group = "单步测试") + // public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { + // logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); + // + // if (index > TipPickUpPosInfo.cgetTipNum() || index < 0) { + // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); + // } + // + // TipPickUpPosInfo tipPos = pp.getTipPickUpPosInfo(); + // Pos2d pos = tipPos.getTipPos(tipGroup.ordinal(), index); + // hbotMoveTo(pos.x, pos.y); + // + // //TODO: 补偿,group大于1时,z轴需要补偿0.2mm + // Integer zCompensate = 0; + // if (tipGroup.ordinal() > 1) { + // zCompensate = 2; + // } + // + // pipetteCtrlModule.zMotorMoveToBlock(tipPos.getPickUpZPos(tipGroup.ordinal()) + zCompensate); + // pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + // + // Boolean isGetTip = canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; + // if (!isGetTip) { + // logger.error("takeTip fail"); + // } + // return isGetTip; + // } + + // @ExtApiFn(name = "HBot移动到", group = "单步测试") + // public void hbotMoveTo(Integer x, Integer y) throws AppException { + // hbotCheckAndMoveTo(new Pos2d(x, y)); + // } + + // @ExtApiFn(name = "HBot移动到小瓶缓冲液X孔", group = "单步测试") + // public void hbotMoveToSmallBottleGroup(ConsumableGroup group, Integer Xhole) + // throws AppException { + // BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); + // if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { + // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); + // } + // Pos2d pos = posInfo.cgetSmallBottleBufferPos(group.off, Xhole); + // hbotCheckAndMoveTo(pos); + // } + // + // @ExtApiFn(name = "HBot移动到探测物质X孔", group = "单步测试") + // public void hbotMoveToDetectMaterialPos(ConsumableGroup group, Integer Xhole) + // throws AppException { + // BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); + // if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { + // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); + // } + // Pos2d pos = posInfo.cgetDetectMaterialPos(group.off, Xhole); + // hbotCheckAndMoveTo(pos); + // } + // + // @ExtApiFn(name = "HBot移动到大瓶缓冲液X孔", group = "单步测试") + // public void hbotMoveToLargeBottleGroup(ConsumableGroup ch) throws AppException { + // LargeBottleBufferPos posInfo = pp.getLargeBottleBufferPosInfo(); + // Pos2d pos = posInfo.cgetBottlePos(ch.off); + // hbotCheckAndMoveTo(pos); + // } + // + // @ExtApiFn(name = "HBot移动到急诊位", group = "单步测试") + // public void hbotMoveToEmergencyPos() throws AppException { + // hbotMoveTo(pp.getEmergencyPos()); + // } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java new file mode 100644 index 0000000..aa359ae --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java @@ -0,0 +1,89 @@ +package a8k.service.app.devicedriver.basectrl; + +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.CmdId; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.devicedriver.basectrl.type.HbotRegIndex; +import a8k.type.cfg.Pos2d; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class HbotModule { + + @Resource + A8kCanBusService canBus; + + public void enable(Integer enable) throws AppException { + canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_enable.toInt(), enable); + } + + public void moveBy(Integer x, Integer y) throws AppException { + canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_by.toInt(), x, y); + } + + public void moveByBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { + moveBy(x, y); + canBus.waitForMod(MId.HbotM, actionOvertime); + } + + public void moveTo(Integer x, Integer y) throws AppException { + canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to.toInt(), x, y); + } + + public void moveToBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { + moveTo(x, y); + canBus.waitForMod(MId.HbotM, actionOvertime); + } + + public void moveToZero() throws AppException { + canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to_zero.toInt()); + } + + public void moveToZeroBlock(Integer actionOvertime) throws AppException { + moveToZero(); + canBus.waitForMod(MId.HbotM, actionOvertime); + } + + public Pos2d readPos() throws AppException { + Pos2d pos = new Pos2d(0, 0); + var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_pos.toInt()); + pos.x = packet.getContentI32(0); + pos.y = packet.getContentI32(1); + return pos; + } + + public Boolean readInIO(Integer ioIndex) throws AppException { + var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_inio.toInt(), ioIndex); + return packet.getContentI32(0) != 0; + } + + public void setPos(Integer x, Integer y) throws AppException { + canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_set_pos.toInt(), x, y); + } + + public void moveByDirect(Integer motor1_dpos, Integer motor2_dpos) throws AppException { + canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_motor_move_by_direct.toInt(), motor1_dpos, motor2_dpos); + } + + public Integer readEncDirect() throws AppException { + var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_enc_direct.toInt()); + return packet.getContentI32(0); + } + + public Integer hbotReadInioIndexInStm32(Integer ioIndex) throws AppException { + var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_inio_index_in_stm32.toInt(), ioIndex); + return packet.getContentI32(0); + } + + public void setReg(HbotRegIndex regIndex, Integer value) throws AppException { + canBus.moduleSetReg(MId.HbotM, regIndex.regIndex, value); + } + + public Integer getReg(HbotRegIndex regIndex) throws AppException { + return canBus.moduleGetReg(MId.HbotM, regIndex.regIndex); + } + + +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java b/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java new file mode 100644 index 0000000..0e1755d --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java @@ -0,0 +1,315 @@ +package a8k.service.app.devicedriver.basectrl; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.LldType; +import a8k.hardware.type.a8kcanprotocol.CmdId; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.devicedriver.basectrl.type.PipetteRegIndex; +import a8k.hardware.type.regindex.RegIndex; +import a8k.type.exception.AppException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 液面探测参数标定 + * 电容值标定: + * 1.失能z轴电机 + * 2.移动tip头分别处于液体中和液体外 + * 3.读取两次电容值 + * 4.取电容值差值的3/4作为阈值 + * 5.lld采用clld测试阈值是否工作正常 + * + * + */ + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.A8kPipetteCtrlModule) +public class PipetteCtrlModule { + + @Resource + A8kCanBusService canBusService; + + final Integer overtime = 10000; + + static class FnOrder { + public static final int zMotorEnable = 1; + public static final int moduleStop = 2; + public static final int zMotorMoveZeroBlock = 3; + public static final int zMotorMoveToZeroPointQuickBlock = 4; + public static final int zMotorMoveByBlock = 5; + public static final int zMotorMoveToBlock = 6; + public static final int zMotorMeasureDistance = 7; + public static final int zMotorReadMeasureDistanceResult = 8; + public static final int initDeviceBlock = 9; + public static final int putTipBlock = 10; + public static final int lldPrepareBlock = 11; + public static final int lldBlock = 12; + public static final int lldCalibrationBlock = 12; + public static final int lldIsDetectLiquid = 13; + public static final int getSensorSampleData = 14; + public static final int readCapacitance = 15; + public static final int aspiratePrepareBlock = 16; + public static final int aspirateSetLlfVelocity = 17; + public static final int aspirateSetOperationVerifPThre = 18; + public static final int aspirateSetOperationVerifEigenTime = 19; + public static final int aspirateSetOperationVerifTolerance = 20; + public static final int aspirateBlock = 21; + public static final int aspirateAndVerifyBlock = 22; + public static final int shakeUpBlock = 23; + public static final int aspirateInferPressureBlock = 24; + public static final int aspirateInferEigenTimeBlock = 25; + public static final int getAspirateInferPressureResult = 26; + public static final int getAspirateInferEigenTimeResultBlock = 27; + public static final int zAixsZeroPointIsTrigger = 27; + public static final int setReg = 28; + public static final int getReg = 29; + public static final int getAllRegs = 30; + } + + @PostConstruct + public void init() { + + } + + @ExtApiFn(name = "z轴电机使能", order = FnOrder.zMotorEnable) + public void zMotorEnable(Integer enable) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_enable.toInt(), enable); + } + + //stop + @ExtApiFn(name = "模块停止", order = FnOrder.moduleStop) + public void moduleStop() throws AppException { + canBusService.moduleStop(MId.PipetteMod); + } + + @ExtApiFn(name = "z轴电机归零", order = FnOrder.zMotorMoveZeroBlock) + public void zMotorMoveZeroBlock() throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_zero.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "z轴电机快速归零", order = FnOrder.zMotorMoveToZeroPointQuickBlock) + public void zMotorMoveToZeroPointQuickBlock() throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_to_zero_point_quick.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "z轴电机相对移动", order = FnOrder.zMotorMoveByBlock) + public void zMotorMoveByBlock(Integer distance) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_by.toInt(), distance); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "z轴电机绝对移动", order = FnOrder.zMotorMoveToBlock) + public void zMotorMoveToBlock(Integer position) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_to.toInt(), position); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + //kpipette_zmotor_measure_distance + //kpipette_zmotor_read_measure_distance_result + + @ExtApiFn(name = "z轴电机测量距离", order = FnOrder.zMotorMeasureDistance) + public void zMotorMeasureDistance() throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_measure_distance.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "z轴电机读取测量距离结果", order = FnOrder.zMotorReadMeasureDistanceResult) + public Integer zMotorReadMeasureDistanceResult() throws AppException { + var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_read_measure_distance_result.toInt()); + return receipt.getContentI32(0); + } + + + @ExtApiFn(name = "初始化设备", order = FnOrder.initDeviceBlock) + public void initDeviceBlock() throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_init_device.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "放置吸头", order = FnOrder.putTipBlock) + public void putTipBlock() throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_put_tip.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "LLD.准备", order = FnOrder.lldPrepareBlock) + public void lldPrepareBlock(Integer startPos) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld_prepare.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + + zMotorMoveToBlock(startPos); + } + + @ExtApiFn(name = "LLD.Do", order = FnOrder.lldBlock) + public void lldBlock(LldType lldtype, Integer startPos, Integer zdpos, Integer c_threshold, Integer p_threshold) + throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld.toInt(), lldtype.getIndex(), startPos, zdpos, c_threshold, + p_threshold); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "LLD.参数标定", order = FnOrder.lldCalibrationBlock) + public void lldCalibrationBlock(Integer startPos, Integer zdpos) + throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld_test.toInt(), startPos, zdpos); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + // kpipette_lld_is_detect_liquid + @ExtApiFn(name = "LLD.读取是否检测到液体", order = FnOrder.lldIsDetectLiquid) + public Boolean lldIsDetectLiquid() throws AppException { + var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld_is_detect_liquid.toInt()); + return receipt.getContentI32(0) == 1; + } + + + public static class SensorSampleData { + public Integer motorPos; + public Integer cval; + public Integer pval; + } + + @ExtApiFn(name = "LLD.获取传感器采样数据", order = FnOrder.getSensorSampleData) + public List getSensorSampleData() throws AppException { + + List dataList = new java.util.ArrayList<>(); + int dataNUm = // + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_sensor_sample_data_num.toInt()).getContentI32(0); + + for (int i = 0; i < dataNUm; i++) { + var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_sensor_sample_data.toInt(), i); + var data = new SensorSampleData(); + data.motorPos = receipt.getContentI32(0); + data.cval = receipt.getContentI32(1); + data.pval = receipt.getContentI32(2); + dataList.add(data); + } + return dataList; + } + + @ExtApiFn(name = "LLD.读取电容值", order = FnOrder.readCapacitance) + public Integer readCapacitance() throws AppException { + return getReg(PipetteRegIndex.kreg_pipette_capactitance_val); + } + + + @ExtApiFn(name = "吸液准备", order = FnOrder.aspiratePrepareBlock) + public void aspiratePrepareBlock() throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_prepare.toInt()); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "设置LLF速度", order = FnOrder.aspirateSetLlfVelocity) + public void aspirateSetLlfVelocity(Integer llf_zm_rpm) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_llf_velocity.toInt(), llf_zm_rpm); + } + + @ExtApiFn(name = "设置操作验证压力阈值", order = FnOrder.aspirateSetOperationVerifPThre) + public void aspirateSetOperationVerifPThre(Integer p_thre) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_operation_verifi_p_thre.toInt(), + p_thre); + } + + @ExtApiFn(name = "设置操作验证时间", order = FnOrder.aspirateSetOperationVerifEigenTime) + public void aspirateSetOperationVerifEigenTime(Integer eigen_time) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_operation_verifi_eigen_time.toInt(), + eigen_time); + } + + @ExtApiFn(name = "设置操作验证容忍度", order = FnOrder.aspirateSetOperationVerifTolerance) + public void aspirateSetOperationVerifTolerance(Integer tolerance) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_operation_verifi_tolerance.toInt(), + tolerance); + } + + @ExtApiFn(name = "吸液", order = FnOrder.aspirateBlock) + public void aspirateBlock(Integer ul) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate.toInt(), ul); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "吸液并验证", order = FnOrder.aspirateAndVerifyBlock) + public void aspirateAndVerifyBlock(Integer ul) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_and_verify.toInt(), ul); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "振荡", order = FnOrder.shakeUpBlock) + public void shakeUpBlock(Integer ul, Integer times) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_shake_up.toInt(), ul, times); + canBusService.waitForMod(MId.PipetteMod, overtime + times * 3000); + } + + @ExtApiFn(name = "吸液推算压力", order = FnOrder.aspirateInferPressureBlock) + public void aspirateInferPressureBlock(Integer ul) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_infer_pressure.toInt(), ul); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "吸液推算时间", order = FnOrder.aspirateInferEigenTimeBlock) + public void aspirateInferEigenTimeBlock(Integer ul) throws AppException { + canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_infer_eigen_time.toInt(), ul); + canBusService.waitForMod(MId.PipetteMod, overtime); + } + + @ExtApiFn(name = "获取吸液推算压力结果", order = FnOrder.getAspirateInferPressureResult) + public Integer getAspirateInferPressureResult() throws AppException { + var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_aspirate_infer_pressure_result.toInt()); + return receipt.getContentI32(0); + } + + @ExtApiFn(name = "获取吸液推算时间结果", order = FnOrder.getAspirateInferEigenTimeResultBlock) + public Integer getAspirateInferEigenTimeResultBlock() throws AppException { + var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_aspirate_infer_eigen_time_result.toInt()); + return receipt.getContentI32(0); + } + + @ExtApiFn(name = "z轴零点是否触发", order = FnOrder.zAixsZeroPointIsTrigger) + public Boolean zAixsZeroPointIsTrigger() throws AppException { + return canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_read_zero_point_state.toInt()).getContentI32(0) == 1; + } + + + // @EnginnerPageAction(name = "获取传感器采样数据数量", order = FnOrder.getSensorSampleDataNum) + // public Integer getSensorSampleDataNum() throws HardwareException { + // return canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_sensor_sample_data_num.toInt()).getContentI32(0); + // } + + @ExtApiFn(name = "设置寄存器", order = FnOrder.setReg) + public void setReg(PipetteRegIndex regIndex, Integer val) throws AppException { + RegIndex regindex = RegIndex.valueOf(regIndex.index); + assert regindex != null; + canBusService.moduleSetReg(MId.PipetteMod, regindex, val); + } + + @ExtApiFn(name = "获取寄存器", order = FnOrder.getReg) + public Integer getReg(PipetteRegIndex regIndex) throws AppException { + RegIndex regindex = RegIndex.valueOf(regIndex.index); + assert regindex != null; + return canBusService.moduleGetReg(MId.PipetteMod, regindex); + } + + @ExtApiFn(name = "获取所有寄存器", order = FnOrder.getAllRegs) + public ObjectNode getAllRegs() throws AppException { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode json = mapper.createObjectNode(); + + // 遍历所有 PipetteRegIndex + for (PipetteRegIndex regIndex : PipetteRegIndex.values()) { + RegIndex regindex = RegIndex.valueOf(regIndex.index); + assert regindex != null; + Integer val = canBusService.moduleGetReg(MId.PipetteMod, regindex); + json.put(regIndex.name(), val); + } + return json; + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/type/HbotRegIndex.java b/src/main/java/a8k/service/app/devicedriver/basectrl/type/HbotRegIndex.java new file mode 100644 index 0000000..18bea00 --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/type/HbotRegIndex.java @@ -0,0 +1,51 @@ +package a8k.service.app.devicedriver.basectrl.type; + +import a8k.hardware.type.regindex.RegIndex; + +public enum HbotRegIndex { + kreg_module_version(RegIndex.kreg_module_version), // 模块版本 + kreg_module_type(RegIndex.kreg_module_type), // 模块类型 + kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error + kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag + kreg_extboard_resetflag(RegIndex.kreg_extboard_resetflag), + + kreg_xyrobot_io_state(RegIndex.kreg_xyrobot_io_state), // + kreg_xyrobot_is_enable(RegIndex.kreg_xyrobot_is_enable), // + kreg_xyrobot_robot_type(RegIndex.kreg_xyrobot_robot_type), // + kreg_xyrobot_one_circle_pulse(RegIndex.kreg_xyrobot_one_circle_pulse), // + kreg_xyrobot_one_circle_pulse_denominator(RegIndex.kreg_xyrobot_one_circle_pulse_denominator), // + kreg_xyrobot_ihold(RegIndex.kreg_xyrobot_ihold), // + kreg_xyrobot_irun(RegIndex.kreg_xyrobot_irun), // + kreg_xyrobot_iholddelay(RegIndex.kreg_xyrobot_iholddelay), // + kreg_xyrobot_iglobalscaler(RegIndex.kreg_xyrobot_iglobalscaler), // + kreg_xyrobot_vstart(RegIndex.kreg_xyrobot_vstart), // + kreg_xyrobot_a1(RegIndex.kreg_xyrobot_a1), // + kreg_xyrobot_amax(RegIndex.kreg_xyrobot_amax), // + kreg_xyrobot_v1(RegIndex.kreg_xyrobot_v1), // + kreg_xyrobot_dmax(RegIndex.kreg_xyrobot_dmax), // + kreg_xyrobot_d1(RegIndex.kreg_xyrobot_d1), // + kreg_xyrobot_vstop(RegIndex.kreg_xyrobot_vstop), // + kreg_xyrobot_tzerowait(RegIndex.kreg_xyrobot_tzerowait), // + kreg_xyrobot_enc_resolution(RegIndex.kreg_xyrobot_enc_resolution), // + kreg_xyrobot_enable_enc(RegIndex.kreg_xyrobot_enable_enc), // + kreg_xyrobot_x_shaft(RegIndex.kreg_xyrobot_x_shaft), // + kreg_xyrobot_y_shaft(RegIndex.kreg_xyrobot_y_shaft), // + kreg_xyrobot_min_x(RegIndex.kreg_xyrobot_min_x), // + kreg_xyrobot_min_y(RegIndex.kreg_xyrobot_min_y), // + kreg_xyrobot_max_x(RegIndex.kreg_xyrobot_max_x), // + kreg_xyrobot_max_y(RegIndex.kreg_xyrobot_max_y), // + kreg_xyrobot_run_to_zero_speed(RegIndex.kreg_xyrobot_run_to_zero_speed), // + kreg_xyrobot_look_zero_edge_speed(RegIndex.kreg_xyrobot_look_zero_edge_speed), // + kreg_xyrobot_shift_x(RegIndex.kreg_xyrobot_shift_x), // + kreg_xyrobot_shift_y(RegIndex.kreg_xyrobot_shift_y), // + kreg_xyrobot_pos_devi_tolerance(RegIndex.kreg_xyrobot_pos_devi_tolerance), // + kreg_xyrobot_io_trigger_append_distance(RegIndex.kreg_xyrobot_io_trigger_append_distance), // + kreg_xyrobot_default_velocity(RegIndex.kreg_xyrobot_default_velocity), // + ; + + public final RegIndex regIndex; + HbotRegIndex(RegIndex regIndex) { + this.regIndex = regIndex; + } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/type/PipetteRegIndex.java b/src/main/java/a8k/service/app/devicedriver/basectrl/type/PipetteRegIndex.java new file mode 100644 index 0000000..4e88fba --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/type/PipetteRegIndex.java @@ -0,0 +1,79 @@ +package a8k.service.app.devicedriver.basectrl.type; + +public enum PipetteRegIndex { + kreg_module_version(0), // 模块版本 + kreg_module_type(1), // 模块类型 + kreg_module_status(2), // 0idle,1busy,2error + kreg_module_errorcode(3), // inited_flag + + kreg_pipette_pos_ul(4000), // 移液枪位置 + kreg_pipette_capactitance_val(4001), // 移液枪电容值 + kreg_pipette_tip_state(4002, false), // 移动液枪tip状态 + + kreg_pipette_limit_ul(4051), // + kreg_pipette_pump_acc(4052), // + kreg_pipette_pump_dec(4053), // + kreg_pipette_pump_vstart(4054), // + kreg_pipette_pump_vstop(4055), // + kreg_pipette_pump_vmax(4056), // + kreg_pipette_aspirate_distribut_pump_vel(4057), // + kreg_pipette_lld_pump_vel(4058), // + kreg_pipette_lld_motor_vel_rpm(4059), // + kreg_pipette_lld_detect_period_ms(4060), // + kreg_pipette_lld_prepare_pos(4061), // + kreg_pipette_lld_prepare_distribut_pos(4062), // + + kreg_pipette_zm_pos(4101), + kreg_pipette_zm_is_enable(4102), + kreg_pipette_zm_dpos(4103), + //kreg_pipette_zm_shift(4105), + kreg_pipette_zm_shaft(4106), + kreg_pipette_zm_one_circle_pulse(4107), + kreg_pipette_zm_one_circle_pulse_denominator(4108), + kreg_pipette_zm_default_velocity(4109), + kreg_pipette_zm_ihold(4110), + kreg_pipette_zm_irun(4111), + kreg_pipette_zm_iholddelay(4112), + kreg_pipette_zm_iglobalscaler(4113), + kreg_pipette_zm_run_to_zero_speed(4114), + kreg_pipette_zm_look_zero_edge_speed(4115), + kreg_pipette_zm_max_d(4116), + kreg_pipette_zm_min_d(4117), +// kreg_pipette_zm_in_debug_mode(4118), + kreg_pipette_zm_vstart(4119), + kreg_pipette_zm_a1(4120), + kreg_pipette_zm_amax(4121), + kreg_pipette_zm_v1(4122), + kreg_pipette_zm_dmax(4123), + kreg_pipette_zm_d1(4124), + kreg_pipette_zm_vstop(4125), + kreg_pipette_zm_tzerowait(4126), + kreg_pipette_zm_enc_resolution(4127), + kreg_pipette_zm_enable_enc(4128), + kreg_pipette_zm_dzero(4129), + kreg_pipette_zm_pos_devi_tolerance(4130), + kreg_pipette_zm_io_trigger_append_distance(4131); + + public final int index; + public final Boolean trace; + + PipetteRegIndex(int regIndex) { + this.index = regIndex; + this.trace = true; + } + + PipetteRegIndex(int regIndex, Boolean trace) { + this.index = regIndex; + this.trace = trace; + } + + public static PipetteRegIndex valueOf(int val) { + PipetteRegIndex[] values = PipetteRegIndex.values(); + for (PipetteRegIndex regindex : values) { + if (regindex.index == val) { + return regindex; + } + } + return null; + } +} diff --git a/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java b/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java index de8c496..2ce4219 100644 --- a/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java +++ b/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java @@ -5,8 +5,8 @@ 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.devicedriver.ctrl.basic.PipetteCtrlModule; -import a8k.service.app.devicedriver.ctrl.CodeScaner; +import a8k.service.app.devicedriver.basectrl.PipetteCtrlModule; +import a8k.service.app.devicedriver.basectrl.CodeScaner; import a8k.service.app.devicedriver.param.Hbot2DCodeScanPos; import a8k.type.exception.AppException; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java index f285fd1..779a38b 100644 --- a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java @@ -1,7 +1,7 @@ package a8k.service.app.devicedriver.commonctrl; -import a8k.service.app.devicedriver.ctrl.basic.HbotModule; +import a8k.service.app.devicedriver.basectrl.HbotModule; import a8k.type.exception.AppException; import a8k.type.appret.AppRet; import a8k.extapi_controler.utils.ExtApiTab; diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/CodeScaner.java b/src/main/java/a8k/service/app/devicedriver/ctrl/CodeScaner.java deleted file mode 100644 index f16a597..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/CodeScaner.java +++ /dev/null @@ -1,36 +0,0 @@ -package a8k.service.app.devicedriver.ctrl; - -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class CodeScaner { - - @Resource - A8kCanBusService canBus; - - public String pipetteModCodeScannerScanCode() throws AppException { - try { - canBus.codeScanerStartScan(MId.PipetteModCodeScanner); - String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, 300); - canBus.codeScanerStopScan(MId.PipetteModCodeScanner); - return result; - } catch (AppException e) { - return ""; - } - } - - public String feedingModScannerModCodeScannerScanCode(Integer waittime) { - try { - canBus.codeScanerStartScan(MId.FeedingModScannerMod); - String result = canBus.codeScanerWaittingForResult(MId.FeedingModScannerMod, waittime); - canBus.codeScanerStopScan(MId.FeedingModScannerMod); - return result; - } catch (AppException e) { - return ""; - } - } -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java b/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java index 2ff0e50..0d5047a 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java @@ -1,5 +1,7 @@ package a8k.service.app.devicedriver.ctrl; +import a8k.service.app.devicedriver.basectrl.CodeScaner; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControlService; import a8k.service.bases.ActionReactorService; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; @@ -21,43 +23,42 @@ public class ConsumablesScanCtrl { @Resource ActionReactorService ar; - @Resource GStateService stateMgrService; - @Resource Hbot2DCodeScanPos hbotScanPos; - @Resource - HbotControlService hbot; + CodeScaner codeScaner; + @Resource + HbotBaseMoveControlService hbot; private void hbotMoveTo(Pos2d tpos) throws AppException { hbot.hbotMoveTo(tpos); } - private String scan2dCode(Integer waittime) throws AppException { - return hbot.scan2dCode(waittime); + private String scan2dCode() throws AppException { + return codeScaner.pipetteModCodeScannerScanCode(); } private String scanPB(int ch) throws AppException { Pos2d pos = hbotScanPos.getPBScanPosX(ch); hbotMoveTo(pos); - return scan2dCode(100); + return scan2dCode(); } private String scanLittBS(int ch) throws AppException { Pos2d pos = hbotScanPos.getLittBSX(ch); hbotMoveTo(pos); - return scan2dCode(100); + return scan2dCode(); } private String scanLarBS(int ch) throws AppException { Pos2d pos = hbotScanPos.getLarBSX(ch); hbotMoveTo(pos); - return scan2dCode(100); + return scan2dCode(); } diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java b/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java deleted file mode 100644 index 8967690..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/HbotControlService.java +++ /dev/null @@ -1,314 +0,0 @@ -package a8k.service.app.devicedriver.ctrl; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicedriver.ctrl.basic.PipetteCtrlModule; -import a8k.service.app.devicedriver.ctrl.basic.HbotModule; -import a8k.service.app.devicedriver.ctrl.type.PipetteRegIndex; -import a8k.service.app.devicedriver.param.PosParam; -import a8k.service.app.devicedriver.param.TimeParam; -import a8k.type.ConsumableGroup; -import a8k.type.exception.AppException; -import a8k.type.cfg.*; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.hardware.type.regindex.RegIndex; -import a8k.type.type.TipGroup; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * Hbot控制服务 - */ -@Component -@ExtApiTab(cfg = ExtApiTabConfig.HbotControlService) -public class HbotControlService { - static Logger logger = LoggerFactory.getLogger(HbotControlService.class); - - @Resource - A8kCanBusService canBus; - - @Resource - PipetteCtrlModule pipetteCtrlModule; - - @Resource - HbotModule hbotModule; - - @Resource - PosParam pp; - - @Resource - TimeParam timep; - - Integer ao = 20000; - - - public void hbotMoveTo(Pos3d targetPos) throws AppException { - logger.info("hbotCheckAndMoveTo:{}", targetPos); - - // 检查盖板是否关闭 - if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); - } - - boolean zEnable = true; - boolean hbotEnable = canBus.moduleGetReg(MId.HbotM, RegIndex.kreg_xyrobot_is_enable) == 1; - - //检查Z轴是否使能,如果没有使能,使能并移动到零点 - if (pipetteCtrlModule.getReg(PipetteRegIndex.kreg_pipette_zm_is_enable) == 0) { - pipetteCtrlModule.zMotorEnable(1); - pipetteCtrlModule.zMotorMoveZeroBlock(); - zEnable = false; - } - - //检查Z轴是否在零点 - if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { - pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - } - if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { - throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); - } - - // HBot移动 - hbotModule.enable( 1); - hbotModule.moveToBlock( targetPos.x - 20, targetPos.y - 20, ao); - hbotModule.moveToBlock( targetPos.x, targetPos.y, ao); - hbotModule.moveToBlock( targetPos.x, targetPos.y, ao); - - // Z轴移动 - if (targetPos.z != 0) { - pipetteCtrlModule.zMotorEnable(1); - pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - pipetteCtrlModule.zMotorMoveToBlock(targetPos.z); - } - pipetteCtrlModule.zMotorEnable(zEnable ? 1 : 0); - hbotModule.enable( hbotEnable ? 1 : 0); - } - - public void hbotMoveTo(Pos2d tpos) throws AppException { - hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); - } - - public String scan2dCode(Integer waittime) throws AppException { - try { - canBus.codeScanerStartScan(MId.PipetteModCodeScanner); - String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, waittime); - canBus.codeScanerStopScan(MId.PipetteModCodeScanner); - return result; - } catch (AppException e) { - return ""; - } - } - - // - // public Integer getGripperZeroYPos() { - // 之所以这样写,是因为是为了放置两个类之间的循环依赖 - // assert appCxt != null; - // TODO - // return - // appCxt.getBean(SamplesPreProcessModuleCtrlService.class).getGripperZeroYPos(); - // return 0; - // } - - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // 基础控制 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - - public void zMoveTo(Integer z) throws AppException { - if (z == 0) { - pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - } else { - pipetteCtrlModule.zMotorMoveToBlock(z); - } - } - - private void hbotCheckAndMoveTo(Pos2d targetPos) throws AppException { - hbotMoveTo(new Pos3d(targetPos.x, targetPos.y, 0)); - } - - private void modGroupMoveToZero() throws AppException { - if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); - } - - pipetteCtrlModule.zMotorEnable(1); - hbotModule.enable( 1); - - hbotModule.moveToZeroBlock( timep.getHbotRuntoZeroActionOvertime()); - - // 丢弃tip - Pos3d dropPos = pp.getTipDropPos(); - hbotMoveTo(dropPos); - // TODO: canBus.pipetteCtrlInitDeviceBlock(MId.PipetteMod, timep.getActionOvertime()); - - // 快速归零 - modGroupMoveToZeroQuick(); - } - - private void modGroupMoveToZeroQuick() throws AppException { - hbotCheckAndMoveTo(new Pos2d(0, 0)); - } - - - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // 单步测试 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @ExtApiFn(name = "丢Tip", group = "单步测试") - public void dropTip() throws AppException { - Pos3d pos = pp.getTipDropPos(); - hbotMoveTo(pos.x, pos.y); - zMoveTo(pos.z); - pipetteCtrlModule.putTipBlock(); - zMoveTo(0); - } - - @ExtApiFn(name = "取Tip", group = "单步测试") - public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { - logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); - - if (index > TipPickUpPosInfo.cgetTipNum() || index < 0) { - throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); - } - - TipPickUpPosInfo tipPos = pp.getTipPickUpPosInfo(); - Pos2d pos = tipPos.getTipPos(tipGroup.ordinal(), index); - hbotMoveTo(pos.x, pos.y); - - //TODO: 补偿,group大于1时,z轴需要补偿0.2mm - Integer zCompensate = 0; - if (tipGroup.ordinal() > 1) { - zCompensate = 2; - } - - pipetteCtrlModule.zMotorMoveToBlock(tipPos.getPickUpZPos(tipGroup.ordinal()) + zCompensate); - pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - - Boolean isGetTip = canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; - if (!isGetTip) { - logger.error("takeTip fail"); - } - return isGetTip; - } - - @ExtApiFn(name = "HBot移动到", group = "单步测试") - public void hbotMoveTo(Integer x, Integer y) throws AppException { - hbotCheckAndMoveTo(new Pos2d(x, y)); - } - - @ExtApiFn(name = "HBot移动到小瓶缓冲液X孔", group = "单步测试") - public void hbotMoveToSmallBottleGroup(ConsumableGroup group, Integer Xhole) - throws AppException { - BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); - if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { - throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); - } - Pos2d pos = posInfo.cgetSmallBottleBufferPos(group.off, Xhole); - hbotCheckAndMoveTo(pos); - } - - @ExtApiFn(name = "HBot移动到探测物质X孔", group = "单步测试") - public void hbotMoveToDetectMaterialPos(ConsumableGroup group, Integer Xhole) - throws AppException { - BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); - if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { - throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); - } - Pos2d pos = posInfo.cgetDetectMaterialPos(group.off, Xhole); - hbotCheckAndMoveTo(pos); - } - - @ExtApiFn(name = "HBot移动到大瓶缓冲液X孔", group = "单步测试") - public void hbotMoveToLargeBottleGroup(ConsumableGroup ch) throws AppException { - LargeBottleBufferPos posInfo = pp.getLargeBottleBufferPosInfo(); - Pos2d pos = posInfo.cgetBottlePos(ch.off); - hbotCheckAndMoveTo(pos); - } - - @ExtApiFn(name = "HBot移动到急诊位", group = "单步测试") - public void hbotMoveToEmergencyPos() throws AppException { - hbotMoveTo(pp.getEmergencyPos()); - } - - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // 坐标获取工具 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @ExtApiFn(name = "Hbot使能", group = "坐标获取工具") - public void hBotEnable() throws AppException { - hbotModule.enable( 1); - } - - @ExtApiFn(name = "Hbot失能", group = "坐标获取工具") - public void hBotDisable() throws AppException { - hbotModule.enable(0); - } - - @ExtApiFn(name = "Z轴使能", group = "坐标获取工具") - public void zAxisEnable() throws AppException { - pipetteCtrlModule.zMotorEnable(1); - } - - @ExtApiFn(name = "Z轴失能", group = "坐标获取工具") - public void zAxisDisable() throws AppException { - pipetteCtrlModule.zMotorEnable(0); - } - - @ExtApiFn(name = "归零读取Z轴坐标", group = "坐标获取工具") - public Integer readZAxisPosByMoveToZero() throws AppException { - pipetteCtrlModule.zMotorMeasureDistance(); - return pipetteCtrlModule.zMotorReadMeasureDistanceResult(); - } - - @ExtApiFn(name = "打开扫码器", group = "坐标获取工具") - public void openCodeScaner(Boolean power) throws AppException { - if (power) { - canBus.codeScanerStartScan(MId.PipetteModCodeScanner); - } else { - canBus.codeScanerStopScan(MId.PipetteModCodeScanner); - } - } - - Pos2d hbotRefPos = new Pos2d(0, 0); - - @ExtApiFn(name = "设置HBOT参考坐标", group = "坐标获取工具") - public void setHbotRefPos(Integer x, Integer y) throws AppException { - hbotRefPos.x = x; - hbotRefPos.y = y; - } - - - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // hbot取样品 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - public Boolean getXPPS() throws AppException { - return hbotModule.readInIO(0); - } - - public Boolean getYPPS() throws AppException { - return hbotModule.readInIO(1); - } - - public Boolean getTipPPS() throws AppException { - return canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; - } - - public String getPos() throws AppException { - Pos2d pos = hbotModule.readPos(); - return pos.toString(); - } - - // public String getHbotRelaPos() throws AppException { - // Pos2d pos = hbotModule.hbotReadPos(MId.HbotM); - // pos.x -= hbotRefPos.x; - // pos.y -= hbotRefPos.y; - // return pos.toString(); - // } -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/PipetteGunCtrlService.java b/src/main/java/a8k/service/app/devicedriver/ctrl/PipetteGunCtrlService.java index ed0f68b..d04bc70 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/PipetteGunCtrlService.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/PipetteGunCtrlService.java @@ -10,8 +10,6 @@ import org.springframework.stereotype.Component; * 移液枪功能 * 1. * - * - * */ @Component diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/basic/HbotModule.java b/src/main/java/a8k/service/app/devicedriver/ctrl/basic/HbotModule.java deleted file mode 100644 index a2f6871..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/basic/HbotModule.java +++ /dev/null @@ -1,89 +0,0 @@ -package a8k.service.app.devicedriver.ctrl.basic; - -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.CmdId; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.service.app.devicedriver.ctrl.type.HbotRegIndex; -import a8k.type.cfg.Pos2d; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class HbotModule { - - @Resource - A8kCanBusService canBus; - - public void enable(Integer enable) throws AppException { - canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_enable.toInt(), enable); - } - - public void moveBy(Integer x, Integer y) throws AppException { - canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_by.toInt(), x, y); - } - - public void moveByBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { - moveBy(x, y); - canBus.waitForMod(MId.HbotM, actionOvertime); - } - - public void moveTo(Integer x, Integer y) throws AppException { - canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to.toInt(), x, y); - } - - public void moveToBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { - moveTo(x, y); - canBus.waitForMod(MId.HbotM, actionOvertime); - } - - public void moveToZero() throws AppException { - canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to_zero.toInt()); - } - - public void moveToZeroBlock(Integer actionOvertime) throws AppException { - moveToZero(); - canBus.waitForMod(MId.HbotM, actionOvertime); - } - - public Pos2d readPos() throws AppException { - Pos2d pos = new Pos2d(0, 0); - var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_pos.toInt()); - pos.x = packet.getContentI32(0); - pos.y = packet.getContentI32(1); - return pos; - } - - public Boolean readInIO(Integer ioIndex) throws AppException { - var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_inio.toInt(), ioIndex); - return packet.getContentI32(0) != 0; - } - - public void setPos(Integer x, Integer y) throws AppException { - canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_set_pos.toInt(), x, y); - } - - public void moveByDirect(Integer motor1_dpos, Integer motor2_dpos) throws AppException { - canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_motor_move_by_direct.toInt(), motor1_dpos, motor2_dpos); - } - - public Integer readEncDirect() throws AppException { - var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_enc_direct.toInt()); - return packet.getContentI32(0); - } - - public Integer hbotReadInioIndexInStm32(Integer ioIndex) throws AppException { - var packet = canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_read_inio_index_in_stm32.toInt(), ioIndex); - return packet.getContentI32(0); - } - - public void setReg(HbotRegIndex regIndex, Integer value) throws AppException { - canBus.moduleSetReg(MId.HbotM, regIndex.regIndex, value); - } - - public Integer getReg(HbotRegIndex regIndex) throws AppException { - return canBus.moduleGetReg(MId.HbotM, regIndex.regIndex); - } - - -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/basic/PipetteCtrlModule.java b/src/main/java/a8k/service/app/devicedriver/ctrl/basic/PipetteCtrlModule.java deleted file mode 100644 index 68c2d6e..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/basic/PipetteCtrlModule.java +++ /dev/null @@ -1,315 +0,0 @@ -package a8k.service.app.devicedriver.ctrl.basic; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.LldType; -import a8k.hardware.type.a8kcanprotocol.CmdId; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.service.app.devicedriver.ctrl.type.PipetteRegIndex; -import a8k.hardware.type.regindex.RegIndex; -import a8k.type.exception.AppException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 液面探测参数标定 - * 电容值标定: - * 1.失能z轴电机 - * 2.移动tip头分别处于液体中和液体外 - * 3.读取两次电容值 - * 4.取电容值差值的3/4作为阈值 - * 5.lld采用clld测试阈值是否工作正常 - * - * - */ - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.A8kPipetteCtrlModule) -public class PipetteCtrlModule { - - @Resource - A8kCanBusService canBusService; - - final Integer overtime = 10000; - - static class FnOrder { - public static final int zMotorEnable = 1; - public static final int moduleStop = 2; - public static final int zMotorMoveZeroBlock = 3; - public static final int zMotorMoveToZeroPointQuickBlock = 4; - public static final int zMotorMoveByBlock = 5; - public static final int zMotorMoveToBlock = 6; - public static final int zMotorMeasureDistance = 7; - public static final int zMotorReadMeasureDistanceResult = 8; - public static final int initDeviceBlock = 9; - public static final int putTipBlock = 10; - public static final int lldPrepareBlock = 11; - public static final int lldBlock = 12; - public static final int lldCalibrationBlock = 12; - public static final int lldIsDetectLiquid = 13; - public static final int getSensorSampleData = 14; - public static final int readCapacitance = 15; - public static final int aspiratePrepareBlock = 16; - public static final int aspirateSetLlfVelocity = 17; - public static final int aspirateSetOperationVerifPThre = 18; - public static final int aspirateSetOperationVerifEigenTime = 19; - public static final int aspirateSetOperationVerifTolerance = 20; - public static final int aspirateBlock = 21; - public static final int aspirateAndVerifyBlock = 22; - public static final int shakeUpBlock = 23; - public static final int aspirateInferPressureBlock = 24; - public static final int aspirateInferEigenTimeBlock = 25; - public static final int getAspirateInferPressureResult = 26; - public static final int getAspirateInferEigenTimeResultBlock = 27; - public static final int zAixsZeroPointIsTrigger = 27; - public static final int setReg = 28; - public static final int getReg = 29; - public static final int getAllRegs = 30; - } - - @PostConstruct - public void init() { - - } - - @ExtApiFn(name = "z轴电机使能", order = FnOrder.zMotorEnable) - public void zMotorEnable(Integer enable) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_enable.toInt(), enable); - } - - //stop - @ExtApiFn(name = "模块停止", order = FnOrder.moduleStop) - public void moduleStop() throws AppException { - canBusService.moduleStop(MId.PipetteMod); - } - - @ExtApiFn(name = "z轴电机归零", order = FnOrder.zMotorMoveZeroBlock) - public void zMotorMoveZeroBlock() throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_zero.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "z轴电机快速归零", order = FnOrder.zMotorMoveToZeroPointQuickBlock) - public void zMotorMoveToZeroPointQuickBlock() throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_to_zero_point_quick.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "z轴电机相对移动", order = FnOrder.zMotorMoveByBlock) - public void zMotorMoveByBlock(Integer distance) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_by.toInt(), distance); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "z轴电机绝对移动", order = FnOrder.zMotorMoveToBlock) - public void zMotorMoveToBlock(Integer position) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_move_to.toInt(), position); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - //kpipette_zmotor_measure_distance - //kpipette_zmotor_read_measure_distance_result - - @ExtApiFn(name = "z轴电机测量距离", order = FnOrder.zMotorMeasureDistance) - public void zMotorMeasureDistance() throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_measure_distance.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "z轴电机读取测量距离结果", order = FnOrder.zMotorReadMeasureDistanceResult) - public Integer zMotorReadMeasureDistanceResult() throws AppException { - var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_read_measure_distance_result.toInt()); - return receipt.getContentI32(0); - } - - - @ExtApiFn(name = "初始化设备", order = FnOrder.initDeviceBlock) - public void initDeviceBlock() throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_init_device.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "放置吸头", order = FnOrder.putTipBlock) - public void putTipBlock() throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_put_tip.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "LLD.准备", order = FnOrder.lldPrepareBlock) - public void lldPrepareBlock(Integer startPos) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld_prepare.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - - zMotorMoveToBlock(startPos); - } - - @ExtApiFn(name = "LLD.Do", order = FnOrder.lldBlock) - public void lldBlock(LldType lldtype, Integer startPos, Integer zdpos, Integer c_threshold, Integer p_threshold) - throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld.toInt(), lldtype.getIndex(), startPos, zdpos, c_threshold, - p_threshold); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "LLD.参数标定", order = FnOrder.lldCalibrationBlock) - public void lldCalibrationBlock(Integer startPos, Integer zdpos) - throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld_test.toInt(), startPos, zdpos); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - // kpipette_lld_is_detect_liquid - @ExtApiFn(name = "LLD.读取是否检测到液体", order = FnOrder.lldIsDetectLiquid) - public Boolean lldIsDetectLiquid() throws AppException { - var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_lld_is_detect_liquid.toInt()); - return receipt.getContentI32(0) == 1; - } - - - public static class SensorSampleData { - public Integer motorPos; - public Integer cval; - public Integer pval; - } - - @ExtApiFn(name = "LLD.获取传感器采样数据", order = FnOrder.getSensorSampleData) - public List getSensorSampleData() throws AppException { - - List dataList = new java.util.ArrayList<>(); - int dataNUm = // - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_sensor_sample_data_num.toInt()).getContentI32(0); - - for (int i = 0; i < dataNUm; i++) { - var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_sensor_sample_data.toInt(), i); - var data = new SensorSampleData(); - data.motorPos = receipt.getContentI32(0); - data.cval = receipt.getContentI32(1); - data.pval = receipt.getContentI32(2); - dataList.add(data); - } - return dataList; - } - - @ExtApiFn(name = "LLD.读取电容值", order = FnOrder.readCapacitance) - public Integer readCapacitance() throws AppException { - return getReg(PipetteRegIndex.kreg_pipette_capactitance_val); - } - - - @ExtApiFn(name = "吸液准备", order = FnOrder.aspiratePrepareBlock) - public void aspiratePrepareBlock() throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_prepare.toInt()); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "设置LLF速度", order = FnOrder.aspirateSetLlfVelocity) - public void aspirateSetLlfVelocity(Integer llf_zm_rpm) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_llf_velocity.toInt(), llf_zm_rpm); - } - - @ExtApiFn(name = "设置操作验证压力阈值", order = FnOrder.aspirateSetOperationVerifPThre) - public void aspirateSetOperationVerifPThre(Integer p_thre) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_operation_verifi_p_thre.toInt(), - p_thre); - } - - @ExtApiFn(name = "设置操作验证时间", order = FnOrder.aspirateSetOperationVerifEigenTime) - public void aspirateSetOperationVerifEigenTime(Integer eigen_time) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_operation_verifi_eigen_time.toInt(), - eigen_time); - } - - @ExtApiFn(name = "设置操作验证容忍度", order = FnOrder.aspirateSetOperationVerifTolerance) - public void aspirateSetOperationVerifTolerance(Integer tolerance) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_set_operation_verifi_tolerance.toInt(), - tolerance); - } - - @ExtApiFn(name = "吸液", order = FnOrder.aspirateBlock) - public void aspirateBlock(Integer ul) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate.toInt(), ul); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "吸液并验证", order = FnOrder.aspirateAndVerifyBlock) - public void aspirateAndVerifyBlock(Integer ul) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_and_verify.toInt(), ul); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "振荡", order = FnOrder.shakeUpBlock) - public void shakeUpBlock(Integer ul, Integer times) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_shake_up.toInt(), ul, times); - canBusService.waitForMod(MId.PipetteMod, overtime + times * 3000); - } - - @ExtApiFn(name = "吸液推算压力", order = FnOrder.aspirateInferPressureBlock) - public void aspirateInferPressureBlock(Integer ul) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_infer_pressure.toInt(), ul); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "吸液推算时间", order = FnOrder.aspirateInferEigenTimeBlock) - public void aspirateInferEigenTimeBlock(Integer ul) throws AppException { - canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_aspirate_infer_eigen_time.toInt(), ul); - canBusService.waitForMod(MId.PipetteMod, overtime); - } - - @ExtApiFn(name = "获取吸液推算压力结果", order = FnOrder.getAspirateInferPressureResult) - public Integer getAspirateInferPressureResult() throws AppException { - var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_aspirate_infer_pressure_result.toInt()); - return receipt.getContentI32(0); - } - - @ExtApiFn(name = "获取吸液推算时间结果", order = FnOrder.getAspirateInferEigenTimeResultBlock) - public Integer getAspirateInferEigenTimeResultBlock() throws AppException { - var receipt = canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_aspirate_infer_eigen_time_result.toInt()); - return receipt.getContentI32(0); - } - - @ExtApiFn(name = "z轴零点是否触发", order = FnOrder.zAixsZeroPointIsTrigger) - public Boolean zAixsZeroPointIsTrigger() throws AppException { - return canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_zmotor_read_zero_point_state.toInt()).getContentI32(0) == 1; - } - - - // @EnginnerPageAction(name = "获取传感器采样数据数量", order = FnOrder.getSensorSampleDataNum) - // public Integer getSensorSampleDataNum() throws HardwareException { - // return canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_get_sensor_sample_data_num.toInt()).getContentI32(0); - // } - - @ExtApiFn(name = "设置寄存器", order = FnOrder.setReg) - public void setReg(PipetteRegIndex regIndex, Integer val) throws AppException { - RegIndex regindex = RegIndex.valueOf(regIndex.index); - assert regindex != null; - canBusService.moduleSetReg(MId.PipetteMod, regindex, val); - } - - @ExtApiFn(name = "获取寄存器", order = FnOrder.getReg) - public Integer getReg(PipetteRegIndex regIndex) throws AppException { - RegIndex regindex = RegIndex.valueOf(regIndex.index); - assert regindex != null; - return canBusService.moduleGetReg(MId.PipetteMod, regindex); - } - - @ExtApiFn(name = "获取所有寄存器", order = FnOrder.getAllRegs) - public ObjectNode getAllRegs() throws AppException { - ObjectMapper mapper = new ObjectMapper(); - ObjectNode json = mapper.createObjectNode(); - - // 遍历所有 PipetteRegIndex - for (PipetteRegIndex regIndex : PipetteRegIndex.values()) { - RegIndex regindex = RegIndex.valueOf(regIndex.index); - assert regindex != null; - Integer val = canBusService.moduleGetReg(MId.PipetteMod, regindex); - json.put(regIndex.name(), val); - } - return json; - } -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/type/HbotRegIndex.java b/src/main/java/a8k/service/app/devicedriver/ctrl/type/HbotRegIndex.java deleted file mode 100644 index 4ce2c1f..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/type/HbotRegIndex.java +++ /dev/null @@ -1,51 +0,0 @@ -package a8k.service.app.devicedriver.ctrl.type; - -import a8k.hardware.type.regindex.RegIndex; - -public enum HbotRegIndex { - kreg_module_version(RegIndex.kreg_module_version), // 模块版本 - kreg_module_type(RegIndex.kreg_module_type), // 模块类型 - kreg_module_status(RegIndex.kreg_module_status), // 0idle,1busy,2error - kreg_module_errorcode(RegIndex.kreg_module_errorcode), // inited_flag - kreg_extboard_resetflag(RegIndex.kreg_extboard_resetflag), - - kreg_xyrobot_io_state(RegIndex.kreg_xyrobot_io_state), // - kreg_xyrobot_is_enable(RegIndex.kreg_xyrobot_is_enable), // - kreg_xyrobot_robot_type(RegIndex.kreg_xyrobot_robot_type), // - kreg_xyrobot_one_circle_pulse(RegIndex.kreg_xyrobot_one_circle_pulse), // - kreg_xyrobot_one_circle_pulse_denominator(RegIndex.kreg_xyrobot_one_circle_pulse_denominator), // - kreg_xyrobot_ihold(RegIndex.kreg_xyrobot_ihold), // - kreg_xyrobot_irun(RegIndex.kreg_xyrobot_irun), // - kreg_xyrobot_iholddelay(RegIndex.kreg_xyrobot_iholddelay), // - kreg_xyrobot_iglobalscaler(RegIndex.kreg_xyrobot_iglobalscaler), // - kreg_xyrobot_vstart(RegIndex.kreg_xyrobot_vstart), // - kreg_xyrobot_a1(RegIndex.kreg_xyrobot_a1), // - kreg_xyrobot_amax(RegIndex.kreg_xyrobot_amax), // - kreg_xyrobot_v1(RegIndex.kreg_xyrobot_v1), // - kreg_xyrobot_dmax(RegIndex.kreg_xyrobot_dmax), // - kreg_xyrobot_d1(RegIndex.kreg_xyrobot_d1), // - kreg_xyrobot_vstop(RegIndex.kreg_xyrobot_vstop), // - kreg_xyrobot_tzerowait(RegIndex.kreg_xyrobot_tzerowait), // - kreg_xyrobot_enc_resolution(RegIndex.kreg_xyrobot_enc_resolution), // - kreg_xyrobot_enable_enc(RegIndex.kreg_xyrobot_enable_enc), // - kreg_xyrobot_x_shaft(RegIndex.kreg_xyrobot_x_shaft), // - kreg_xyrobot_y_shaft(RegIndex.kreg_xyrobot_y_shaft), // - kreg_xyrobot_min_x(RegIndex.kreg_xyrobot_min_x), // - kreg_xyrobot_min_y(RegIndex.kreg_xyrobot_min_y), // - kreg_xyrobot_max_x(RegIndex.kreg_xyrobot_max_x), // - kreg_xyrobot_max_y(RegIndex.kreg_xyrobot_max_y), // - kreg_xyrobot_run_to_zero_speed(RegIndex.kreg_xyrobot_run_to_zero_speed), // - kreg_xyrobot_look_zero_edge_speed(RegIndex.kreg_xyrobot_look_zero_edge_speed), // - kreg_xyrobot_shift_x(RegIndex.kreg_xyrobot_shift_x), // - kreg_xyrobot_shift_y(RegIndex.kreg_xyrobot_shift_y), // - kreg_xyrobot_pos_devi_tolerance(RegIndex.kreg_xyrobot_pos_devi_tolerance), // - kreg_xyrobot_io_trigger_append_distance(RegIndex.kreg_xyrobot_io_trigger_append_distance), // - kreg_xyrobot_default_velocity(RegIndex.kreg_xyrobot_default_velocity), // - ; - - public final RegIndex regIndex; - HbotRegIndex(RegIndex regIndex) { - this.regIndex = regIndex; - } - -} diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/type/PipetteRegIndex.java b/src/main/java/a8k/service/app/devicedriver/ctrl/type/PipetteRegIndex.java deleted file mode 100644 index ac3547d..0000000 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/type/PipetteRegIndex.java +++ /dev/null @@ -1,79 +0,0 @@ -package a8k.service.app.devicedriver.ctrl.type; - -public enum PipetteRegIndex { - kreg_module_version(0), // 模块版本 - kreg_module_type(1), // 模块类型 - kreg_module_status(2), // 0idle,1busy,2error - kreg_module_errorcode(3), // inited_flag - - kreg_pipette_pos_ul(4000), // 移液枪位置 - kreg_pipette_capactitance_val(4001), // 移液枪电容值 - kreg_pipette_tip_state(4002, false), // 移动液枪tip状态 - - kreg_pipette_limit_ul(4051), // - kreg_pipette_pump_acc(4052), // - kreg_pipette_pump_dec(4053), // - kreg_pipette_pump_vstart(4054), // - kreg_pipette_pump_vstop(4055), // - kreg_pipette_pump_vmax(4056), // - kreg_pipette_aspirate_distribut_pump_vel(4057), // - kreg_pipette_lld_pump_vel(4058), // - kreg_pipette_lld_motor_vel_rpm(4059), // - kreg_pipette_lld_detect_period_ms(4060), // - kreg_pipette_lld_prepare_pos(4061), // - kreg_pipette_lld_prepare_distribut_pos(4062), // - - kreg_pipette_zm_pos(4101), - kreg_pipette_zm_is_enable(4102), - kreg_pipette_zm_dpos(4103), - //kreg_pipette_zm_shift(4105), - kreg_pipette_zm_shaft(4106), - kreg_pipette_zm_one_circle_pulse(4107), - kreg_pipette_zm_one_circle_pulse_denominator(4108), - kreg_pipette_zm_default_velocity(4109), - kreg_pipette_zm_ihold(4110), - kreg_pipette_zm_irun(4111), - kreg_pipette_zm_iholddelay(4112), - kreg_pipette_zm_iglobalscaler(4113), - kreg_pipette_zm_run_to_zero_speed(4114), - kreg_pipette_zm_look_zero_edge_speed(4115), - kreg_pipette_zm_max_d(4116), - kreg_pipette_zm_min_d(4117), -// kreg_pipette_zm_in_debug_mode(4118), - kreg_pipette_zm_vstart(4119), - kreg_pipette_zm_a1(4120), - kreg_pipette_zm_amax(4121), - kreg_pipette_zm_v1(4122), - kreg_pipette_zm_dmax(4123), - kreg_pipette_zm_d1(4124), - kreg_pipette_zm_vstop(4125), - kreg_pipette_zm_tzerowait(4126), - kreg_pipette_zm_enc_resolution(4127), - kreg_pipette_zm_enable_enc(4128), - kreg_pipette_zm_dzero(4129), - kreg_pipette_zm_pos_devi_tolerance(4130), - kreg_pipette_zm_io_trigger_append_distance(4131); - - public final int index; - public final Boolean trace; - - PipetteRegIndex(int regIndex) { - this.index = regIndex; - this.trace = true; - } - - PipetteRegIndex(int regIndex, Boolean trace) { - this.index = regIndex; - this.trace = trace; - } - - public static PipetteRegIndex valueOf(int val) { - PipetteRegIndex[] values = PipetteRegIndex.values(); - for (PipetteRegIndex regindex : values) { - if (regindex.index == val) { - return regindex; - } - } - return null; - } -} diff --git a/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java b/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java index 0d02384..530dd7e 100644 --- a/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java +++ b/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java @@ -11,7 +11,7 @@ import a8k.service.app.devicedriver.ctrl.SamplesPreProcesCtrl; import a8k.service.app.devicedriver.ctrl.SampleScanTransportHardwareControler; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.app.devicedriver.ctrl.HbotControlService; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControlService; import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl; import a8k.service.app.devicedriver.param.DebugParam; import a8k.service.app.devicedriver.param.PosParam; @@ -45,7 +45,7 @@ public class TestScript { ApplicationContext appCxt; @Resource - HbotControlService hbotcs; + HbotBaseMoveControlService hbotcs; @Resource TimeParam timep; @@ -63,7 +63,7 @@ public class TestScript { @Resource SampleScanTransportHardwareControler sampleScanTransportHardwareControler; - EnginnerParamReader settingReader = new EnginnerParamReader(HbotControlService.class); + EnginnerParamReader settingReader = new EnginnerParamReader(HbotBaseMoveControlService.class); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 测试