Browse Source

大缓冲液

tags/v0
sige 1 year ago
parent
commit
67130a5660
  1. 9
      src/main/java/com/iflytop/a800/controller/DemoController.java
  2. 3
      src/main/java/com/iflytop/a800/device/Device.java
  3. 72
      src/main/java/com/iflytop/a800/device/Pipette.java
  4. 6
      src/main/java/com/iflytop/a800/resource/LargeBufferTube.java
  5. 29
      src/main/java/com/iflytop/a800/resource/LargeBufferTubeManager.java

9
src/main/java/com/iflytop/a800/controller/DemoController.java

@ -32,4 +32,13 @@ public class DemoController extends UfApiControllerBase {
pipette.dispense(tube);
return this.success();
}
@PostMapping("/api/demo/pipette-aspirate-from-large-buffer-tube")
@ResponseBody
public UfApiResponse pipetteAspirateFromLargeBufferTube() {
var tube = Device.getInstance().largeBufferTube.getTube();
var pipette = Device.getInstance().pipette;
pipette.aspirateFromLargeBufferTube(tube, 50);
return this.success();
}
}

3
src/main/java/com/iflytop/a800/device/Device.java

@ -1,6 +1,7 @@
package com.iflytop.a800.device;
import com.iflytop.a800.resource.BufferTubeManager;
import com.iflytop.a800.resource.LargeBufferTubeManager;
public class Device {
// singleton instance
@ -11,6 +12,8 @@ public class Device {
public final Pipette pipette = new Pipette();
// buffer tube manager
public final BufferTubeManager bufferTube = new BufferTubeManager();
// large buffer tube manager
public final LargeBufferTubeManager largeBufferTube = new LargeBufferTubeManager();
// get instance
public static Device getInstance() {

72
src/main/java/com/iflytop/a800/device/Pipette.java

@ -1,5 +1,6 @@
package com.iflytop.a800.device;
import com.iflytop.a800.resource.BufferTube;
import com.iflytop.a800.resource.LargeBufferTube;
import com.iflytop.uf.UfActuatorCmdExecutor;
import com.iflytop.uf.UfCmdSnippetExecutor;
import com.iflytop.uf.model.UfMdbOption;
@ -19,9 +20,9 @@ public class Pipette {
//
public Pipette() {
this.tipAmountList.add(0);
this.tipAmountList.add(0);
this.tipAmountList.add(0);
this.tipAmountList.add(120);
this.tipAmountList.add(120);
this.tipAmountList.add(120);
}
// set tip amount
@ -137,4 +138,69 @@ public class Pipette {
}
UfCmdSnippetExecutor.execute(snippetKey, dispenseParams);
}
// 从大缓冲液管吸液
public void aspirateFromLargeBufferTube(LargeBufferTube tube, Integer volume) {
Integer startX = UfMdbOption.getInteger("LargeBufferTubeZoneStartX");
Integer startY = UfMdbOption.getInteger("LargeBufferTubeZoneStartY");
Integer distanceX = UfMdbOption.getInteger("LargeBufferTubeDistanceX");
Integer distanceY = UfMdbOption.getInteger("LargeBufferTubeDistanceY");
Integer indexX = tube.index % 3;
Integer indexY = tube.index / 3;
Integer tubeX = startX + indexX * distanceX;
Integer tubeY = startY + indexY * distanceY;
Map<String,Object> dispenseParams = Map.of("tubeX", tubeX, "tubeY", tubeY);
String snippetKey = "PipetteAspirateFromLargeBufferTubePrepare";
UfCmdSnippetExecutor.execute(snippetKey, dispenseParams);
var maxDepth = UfMdbOption.getInteger("LargeBufferTubeLiquidDetectMaxDepth");
var threshold = UfMdbOption.getInteger("LargeBufferTubeLiquidDetectThreshold");
this.moveToLiquidLevel(maxDepth, threshold);
Double coefficient = UfMdbOption.getDouble("LargeBufferTubeLiquidLevelFollowCoefficient");
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;
}
depth += stepDepth;
if ( depth > maxDepth ) {
UfCmdSnippetExecutor.execute("ArmResetZ");
throw new RuntimeException("未检测到液面");
}
UfActuatorCmdExecutor.execute("ArmZ", "motor_easy_move_by", Integer.toString(stepDepth));
} while (true);
}
// 吸液并跟随液面
private void aspirateWithLiquidLevelFollow( Integer volume, Integer depth ) {
String moveByParams = String.format("%d,%d,%d", depth, 300, 5);
Thread threadArmZMove = new Thread(() -> {
UfActuatorCmdExecutor.execute("ArmZ", "motor_move_by", moveByParams);
});
Thread threadAspirate = new Thread(() -> {
UfActuatorCmdExecutor.execute("Pipette", "pipette_ctrl_move_to_ul", Integer.toString(volume));
});
threadArmZMove.start();
threadAspirate.start();
try {
threadArmZMove.join();
threadAspirate.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
UfCmdSnippetExecutor.execute("ArmResetZ");
}
}

6
src/main/java/com/iflytop/a800/resource/LargeBufferTube.java

@ -0,0 +1,6 @@
package com.iflytop.a800.resource;
public class LargeBufferTube {
public Integer index;
public Integer quantity;
}

29
src/main/java/com/iflytop/a800/resource/LargeBufferTubeManager.java

@ -0,0 +1,29 @@
package com.iflytop.a800.resource;
import java.util.ArrayList;
import java.util.List;
public class LargeBufferTubeManager {
// tubes
public List<LargeBufferTube> tubes;
// Constructor
public LargeBufferTubeManager() {
this.tubes = new ArrayList<>();
for (int i = 0; i < 6; i++) {
var tube = new LargeBufferTube();
tube.index = i;
tube.quantity = 3;
tubes.add(tube);
}
}
// get tube
public LargeBufferTube getTube() {
for (LargeBufferTube tube : tubes) {
if (tube.quantity > 0) {
tube.quantity --;
return tube;
}
}
throw new RuntimeException("No tube available");
}
}
Loading…
Cancel
Save