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;