Browse Source

增加步骤:结果分析

master
sige 2 years ago
parent
commit
a2686b53c0
  1. 14
      src/main/java/com/dreamworks/boditech/driver/Device.java
  2. 8
      src/main/java/com/dreamworks/boditech/driver/actuator/ActAnalysisScanner.java
  3. 47
      src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java
  4. 3
      src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java
  5. 4
      src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java
  6. 17
      src/main/java/com/dreamworks/boditech/driver/entity/IncubatorSlot.java
  7. 15
      src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java
  8. 49
      src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java
  9. 1
      src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java

14
src/main/java/com/dreamworks/boditech/driver/Device.java

@ -60,6 +60,10 @@ public class Device {
this.appendActuator(new ActArmXY(ActuatorModule.ARM_XY, this));
this.appendActuator(new ActMotor(ActuatorModule.ARM_Z_MOTOR, this));
this.appendActuator(new ActPipette(ActuatorModule.ARM_Z_PIPETTE, this));
this.appendActuator(new ActIncubator(ActuatorModule.INCUBATOR_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.ANALYSIS_PUSH_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.ANALYSIS_SCAN_MOTOR, this));
this.appendActuator(new ActAnalysisScanner(ActuatorModule.ANALYSIS_SCAN_SCANNER, this));
}
// append actuator
@ -171,8 +175,6 @@ public class Device {
// call device command and wait for response
public ByteBuffer call( Integer cmd, Integer mid, Object ... params ) {
int length = 2 + 2 + 1 + 1 + 2;
for ( Object param : params ) {
if ( param instanceof Integer ) {
@ -212,7 +214,11 @@ public class Device {
this.serialPort.write(request);
ByteBuffer response = ByteBuffer.allocate(0);
while ( 0 == response.capacity() ) {
for ( int i=0; i<10; i++ ) {
if ( 0 != response.capacity() ) {
break;
}
LOG.info("wait for response ...");
try {
Thread.sleep(300);
} catch (InterruptedException e) {
@ -222,7 +228,7 @@ public class Device {
}
LOG.info("Device serial port <= {}", MyByteBuffer.toHex(response));
return response;
return 0 == response.capacity() ? null : response;
}
private ByteBuffer prodCall(Integer cmd, Integer mid, Object[] params) {

8
src/main/java/com/dreamworks/boditech/driver/actuator/ActAnalysisScanner.java

@ -0,0 +1,8 @@
package com.dreamworks.boditech.driver.actuator;
import com.dreamworks.boditech.driver.Device;
public class ActAnalysisScanner extends ActuatorBase {
// constructor
public ActAnalysisScanner(Integer mid, Device device) {
super(mid, device);
}
}

47
src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java

@ -0,0 +1,47 @@
package com.dreamworks.boditech.driver.actuator;
import com.dreamworks.boditech.driver.Command;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.entity.IncubatorSlot;
public class ActIncubator extends ActMotor {
// slots
private IncubatorSlot[] slots;
// constructor
public ActIncubator(Integer mid, Device device) {
super(mid, device);
this.slots = new IncubatorSlot[20];
for ( int i = 0; i < 20; i++ ) {
IncubatorSlot slot = new IncubatorSlot();
slot.index = i;
slot.isFree = true;
this.slots[i] = slot;
}
}
// get slot
public boolean hasFreeSlot() {
for ( int i = 0; i < 20; i++ ) {
if ( this.slots[i].isFree ) {
return true;
}
}
return false;
}
// move to free position
public void moveToFreePosition() {
IncubatorSlot slot = null;
for ( int i = 0; i < 20; i++ ) {
if ( this.slots[i].isFree ) {
slot = this.slots[i];
break;
}
}
if ( slot == null ) {
throw new RuntimeException("no free slot");
}
this.moveTo(slot.getLocation());
}
}

3
src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java

@ -36,6 +36,9 @@ public class ActuatorBase implements Actuator {
Integer status = ActuatorModule.MODULE_STATUS_BUSY;
do {
ByteBuffer response = this.call(Command.CMD_MODULE_GET_STATUS);
if ( null == response ) {
continue ;
}
status = this.getIntegerFromResponse(response, 0);
try {
Thread.sleep(100);

4
src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java

@ -13,6 +13,10 @@ public class ActuatorModule {
public static Integer TEST_TUBE_RACK_MOVE_MOTOR = 62;
public static Integer TEST_TUBE_RACK_EXIT_MOTOR = 63;
public static Integer TEST_TUBE_RACK_SCANNER = 64;
public static Integer INCUBATOR_MOTOR = 71;
public static Integer ANALYSIS_PUSH_MOTOR = 92;
public static Integer ANALYSIS_SCAN_MOTOR = 91;
public static Integer ANALYSIS_SCAN_SCANNER = 93;
public static Integer MODULE_STATUS_IDLE = 0;
public static Integer MODULE_STATUS_BUSY = 1;

17
src/main/java/com/dreamworks/boditech/driver/entity/IncubatorSlot.java

@ -0,0 +1,17 @@
package com.dreamworks.boditech.driver.entity;
public class IncubatorSlot {
public Integer index;
public Boolean isFree;
// get position
// @TODO : use real position
public Integer getLocation() {
return 800;
}
// get exit position
// @TODO : use real exit position
public Integer getExitLocation() {
return 18900;
}
}

15
src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java

@ -5,6 +5,7 @@ import com.dreamworks.boditech.driver.TestStep;
import com.dreamworks.boditech.driver.consumable.CsmBufferTubeA;
import com.dreamworks.boditech.driver.consumable.CsmSampleTube;
import com.dreamworks.boditech.driver.consumable.ReactionTube;
import com.dreamworks.boditech.driver.entity.IncubatorSlot;
import com.dreamworks.boditech.driver.task.step.Step;
import com.dreamworks.boditech.driver.task.step.StepManager;
@ -34,6 +35,8 @@ public class TaskTest implements Task {
private ReactionTube reactionTube;
// sample tube
private CsmSampleTube sampleTube;
// incubator slot
private IncubatorSlot incubatorSlot;
// set reaction tube
public void setReactionTube(ReactionTube reactionTube) {
@ -55,14 +58,24 @@ public class TaskTest implements Task {
return this.sampleTube;
}
// set incubator slot
public void setIncubatorSlot(IncubatorSlot incubatorSlot) {
this.incubatorSlot = incubatorSlot;
}
// get incubator slot
public IncubatorSlot getIncubatorSlot() {
return this.incubatorSlot;
}
@Override
public void execute(TaskExecutor executor) {
// @TODO : use real sample tube
this.sampleTube = new CsmSampleTube();
this.reactionTube = new CsmBufferTubeA();
this.incubatorSlot = new IncubatorSlot();
List<Step> steps = StepManager.buildSteps("[{\"action\":\"sampling\",\"sourceTubeType\":\"Sample\",\"amount\":\"100\"}]");
List<Step> steps = StepManager.buildSteps("[{\"action\":\"analysis\"}]");
for ( Step step : steps ) {
step.execute(executor, this);
}

49
src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java

@ -0,0 +1,49 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActAnalysisScanner;
import com.dreamworks.boditech.driver.actuator.ActIncubator;
import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
import com.dreamworks.boditech.driver.entity.IncubatorSlot;
import com.dreamworks.boditech.driver.task.TaskTest;
import com.fasterxml.jackson.annotation.JsonProperty;
public class StepAnalysis extends StepBase {
@JsonProperty("action")
public String action;
@Override
public void execute(TaskExecutor executor, Task task) {
TaskTest taskTest = (TaskTest)task;
Device device = executor.getDevice();
ActIncubator incubator = (ActIncubator)device.getActuator(ActuatorModule.INCUBATOR_MOTOR);
ActMotor pushMotor = (ActMotor)device.getActuator(ActuatorModule.ANALYSIS_PUSH_MOTOR);
ActMotor scanMotor = (ActMotor)device.getActuator(ActuatorModule.ANALYSIS_SCAN_MOTOR);
ActAnalysisScanner scanner = (ActAnalysisScanner)device.getActuator(ActuatorModule.ANALYSIS_SCAN_SCANNER);
// 01. 获取卡位
IncubatorSlot slot = taskTest.getIncubatorSlot();
incubator.moveTo(slot.getExitLocation());
// 02. 推出测试卡
pushMotor.moveTo("analysisPushMotorScanStart");
pushMotor.moveTo("analysisPushMotorStandby");
// 03. 扫描测试卡
scanner.start();
// @TODO : wait for scan finish
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
scanner.stop();
// @TODO : read raw from scanner and parse it later
// 04. 丢弃测试卡
scanMotor.moveTo("analysisScanMotorDropCard");
// @TODO : process raw data from scanner
}
}

1
src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java

@ -18,6 +18,7 @@ public class StepManager {
StepManager.stepMap.put("shake", StepShake.class);
StepManager.stepMap.put("puncture", StepPuncture.class);
StepManager.stepMap.put("sampling", StepSampling.class);
StepManager.stepMap.put("analysis", StepAnalysis.class);
}
// build step by given name

Loading…
Cancel
Save