From a2686b53c07db2ae4e0491c7ef10353a6ad05eea Mon Sep 17 00:00:00 2001 From: sige Date: Sat, 2 Dec 2023 14:19:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=AD=A5=E9=AA=A4=EF=BC=9A?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dreamworks/boditech/driver/Device.java | 14 +++++-- .../driver/actuator/ActAnalysisScanner.java | 8 ++++ .../boditech/driver/actuator/ActIncubator.java | 47 +++++++++++++++++++++ .../boditech/driver/actuator/ActuatorBase.java | 3 ++ .../boditech/driver/actuator/ActuatorModule.java | 4 ++ .../boditech/driver/entity/IncubatorSlot.java | 17 ++++++++ .../dreamworks/boditech/driver/task/TaskTest.java | 15 ++++++- .../boditech/driver/task/step/StepAnalysis.java | 49 ++++++++++++++++++++++ .../boditech/driver/task/step/StepManager.java | 1 + 9 files changed, 153 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/dreamworks/boditech/driver/actuator/ActAnalysisScanner.java create mode 100644 src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java create mode 100644 src/main/java/com/dreamworks/boditech/driver/entity/IncubatorSlot.java create mode 100644 src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java diff --git a/src/main/java/com/dreamworks/boditech/driver/Device.java b/src/main/java/com/dreamworks/boditech/driver/Device.java index b7ce51c..1c6b2c0 100644 --- a/src/main/java/com/dreamworks/boditech/driver/Device.java +++ b/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) { diff --git a/src/main/java/com/dreamworks/boditech/driver/actuator/ActAnalysisScanner.java b/src/main/java/com/dreamworks/boditech/driver/actuator/ActAnalysisScanner.java new file mode 100644 index 0000000..3fb7cd6 --- /dev/null +++ b/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); + } +} diff --git a/src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java b/src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java new file mode 100644 index 0000000..c522378 --- /dev/null +++ b/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()); + } +} diff --git a/src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java b/src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java index 46ab5af..569ec98 100644 --- a/src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java +++ b/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); diff --git a/src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java b/src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java index 63d26ec..6df5548 100644 --- a/src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java +++ b/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; diff --git a/src/main/java/com/dreamworks/boditech/driver/entity/IncubatorSlot.java b/src/main/java/com/dreamworks/boditech/driver/entity/IncubatorSlot.java new file mode 100644 index 0000000..a94e8c7 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java b/src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java index 7a4a893..194b192 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java +++ b/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 steps = StepManager.buildSteps("[{\"action\":\"sampling\",\"sourceTubeType\":\"Sample\",\"amount\":\"100\"}]"); + List steps = StepManager.buildSteps("[{\"action\":\"analysis\"}]"); for ( Step step : steps ) { step.execute(executor, this); } diff --git a/src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java b/src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java new file mode 100644 index 0000000..41d3328 --- /dev/null +++ b/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 + } +} diff --git a/src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java b/src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java index be4a977..8f3292e 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/step/StepManager.java +++ b/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