diff --git a/app.db b/app.db index fce7551..5abc800 100644 Binary files a/app.db and b/app.db differ diff --git a/pom.xml b/pom.xml index 1e83266..71aa56c 100644 --- a/pom.xml +++ b/pom.xml @@ -20,7 +20,7 @@ com.iflytop uf - 0.0.20 + 0.0.21 diff --git a/src/main/java/com/iflytop/a800/controller/DemoController.java b/src/main/java/com/iflytop/a800/controller/DemoController.java index 140ffd0..65c9acf 100644 --- a/src/main/java/com/iflytop/a800/controller/DemoController.java +++ b/src/main/java/com/iflytop/a800/controller/DemoController.java @@ -1,6 +1,7 @@ package com.iflytop.a800.controller; import com.iflytop.a800.device.Device; import com.iflytop.a800.resource.BufferTube; +import com.iflytop.uf.UfActuatorCmdExecutor; import com.iflytop.uf.controller.UfApiControllerBase; import com.iflytop.uf.controller.UfApiResponse; import org.springframework.stereotype.Controller; @@ -41,4 +42,37 @@ public class DemoController extends UfApiControllerBase { pipette.aspirateFromLargeBufferTube(tube, 50); return this.success(); } + + @PostMapping("/api/demo/pipette-aspirate-from-emergency-tube") + @ResponseBody + public UfApiResponse pipetteAspirateFromEmergencyTube() { + var pipette = Device.getInstance().pipette; + pipette.aspirateFromEmergencyTube(0, 100); + UfActuatorCmdExecutor.execute("Pipette","pipette_ctrl_move_to_ul", "0"); + pipette.aspirateFromEmergencyTube(1, 100); + UfActuatorCmdExecutor.execute("Pipette","pipette_ctrl_move_to_ul", "0"); + return this.success(); + } + + @PostMapping("/api/demo/pipette-aspirate-from-sample-epp-0.5") + @ResponseBody + public UfApiResponse pipetteAspirateFromSampleEpp05() { + var pipette = Device.getInstance().pipette; + for ( int i=0; i<10; i++) { + pipette.aspirateFromSampleEpp0_5(i, 100); + UfActuatorCmdExecutor.execute("Pipette","pipette_ctrl_move_to_ul", "0"); + } + return this.success(); + } + + @PostMapping("/api/demo/pipette-aspirate-from-sample-epp-1.5") + @ResponseBody + public UfApiResponse pipetteAspirateFromSampleEpp1_5() { + var pipette = Device.getInstance().pipette; + for ( int i=0; i<10; i++) { + pipette.aspirateFromSampleEpp1_5(i, 100); + UfActuatorCmdExecutor.execute("Pipette","pipette_ctrl_move_to_ul", "0"); + } + return this.success(); + } } diff --git a/src/main/java/com/iflytop/a800/device/Pipette.java b/src/main/java/com/iflytop/a800/device/Pipette.java index 5112120..9efc0f0 100644 --- a/src/main/java/com/iflytop/a800/device/Pipette.java +++ b/src/main/java/com/iflytop/a800/device/Pipette.java @@ -163,15 +163,68 @@ public class Pipette { this.aspirateWithLiquidLevelFollow(volume, depth); } + // 从急诊试管吸液 + public void aspirateFromEmergencyTube( Integer index, Integer volume ) { + UfCmdSnippetExecutor.execute(String.format("PipetteAspirateFromEmergencyTubePrepare.%d", index)); + + var maxDepth = UfMdbOption.getInteger("EmergencyTubeLiquidDetectMaxDepth"); + var threshold = UfMdbOption.getInteger("EmergencyTubeLiquidDetectThreshold"); + this.moveToLiquidLevel(maxDepth, threshold); + + Double coefficient = UfMdbOption.getDouble("EmergencyTubeLiquidLevelFollowCoefficient"); + Integer depth = (int)(coefficient * volume); + this.aspirateWithLiquidLevelFollow(volume, depth); + } + + // 从样本Epp0.5吸液 + public void aspirateFromSampleEpp0_5( Integer index, Integer volume ) { + var tubeRackTubeStartPos = UfMdbOption.getInteger("SampleTubeRackTubeStartPos"); + var tubeRackTubeDistance = UfMdbOption.getInteger("SampleTubeRackTubeDistance"); + Map params = Map.of("tubePos", tubeRackTubeStartPos + index * tubeRackTubeDistance); + UfCmdSnippetExecutor.execute("PipetteAspirateFromSampleEpp0.5", params); + + var maxDepth = UfMdbOption.getInteger("SampleTubeRackEpp0.5TubeLiquidDetectMaxDepth"); + var threshold = UfMdbOption.getInteger("SampleTubeRackEpp0.5TubeLiquidDetectThreshold"); + this.moveToLiquidLevel(maxDepth, threshold); + + Double coefficient = UfMdbOption.getDouble("SampleTubeRackEpp0.5TubeLiquidLevelFollowCoefficient"); + Integer depth = (int)(coefficient * volume); + this.aspirateWithLiquidLevelFollow(volume, depth); + } + + // 从样本Epp0.5吸液 + public void aspirateFromSampleEpp1_5( Integer index, Integer volume ) { + var tubeRackTubeStartPos = UfMdbOption.getInteger("SampleTubeRackTubeStartPos"); + var tubeRackTubeDistance = UfMdbOption.getInteger("SampleTubeRackTubeDistance"); + Map params = Map.of("tubePos", tubeRackTubeStartPos + index * tubeRackTubeDistance); + UfCmdSnippetExecutor.execute("PipetteAspirateFromSampleEpp1.5", params); + + var maxDepth = UfMdbOption.getInteger("SampleTubeRackEpp1.5TubeLiquidDetectMaxDepth"); + var threshold = UfMdbOption.getInteger("SampleTubeRackEpp1.5TubeLiquidDetectThreshold"); + this.moveToLiquidLevel(maxDepth, threshold); + + Double coefficient = UfMdbOption.getDouble("SampleTubeRackEpp1.5TubeLiquidLevelFollowCoefficient"); + Integer depth = (int)(coefficient * volume); + this.aspirateWithLiquidLevelFollow(volume, depth); + } + // 移动到液面 private void moveToLiquidLevel( Integer maxDepth, Integer threshold ) { int stepDepth = 10; int depth = 0; do { - String capValStr = UfActuatorCmdExecutor.execute("Pipette", "read_pipette_capacitance_val"); - int capVal = Integer.parseInt(capValStr); - if ( capVal > threshold ) { - break; + int capMatchCount = 0; + for ( int i=0; i<3; i++) { + String capValStr = UfActuatorCmdExecutor.execute("Pipette", "read_pipette_capacitance_val"); + LOG.info("[Pipette] Capacitance value : {}; threshold : {}", capValStr, threshold); + int capVal = Integer.parseInt(capValStr); + if ( capVal > threshold ) { + capMatchCount ++; + } + UfCommon.delay(10); + } + if ( 1 < capMatchCount ) { + break ; } depth += stepDepth;