diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java index 70449f4..69d4346 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java @@ -1,5 +1,12 @@ package com.my.graphiteDigesterBg.diframe; +import java.util.ArrayList; +import java.util.List; abstract public class DiTaskMoveBase { + // finish callback + public interface ExecuteCallback { + void callback(); + } + // device private DiDevice device; // task @@ -28,4 +35,22 @@ abstract public class DiTaskMoveBase { // run abstract public void run(); + + // execute batch actions + public void execute(List actions) { + List threads = new ArrayList<>(); + for (ExecuteCallback action : actions) { + Thread thread = new Thread(action::callback); + threads.add(thread); + thread.start(); + } + + for (Thread thread : threads) { + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java index 1ed6ce5..080a8a0 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java @@ -20,6 +20,8 @@ public class DiActPeristalticPump extends DiActuatorBase { protected Integer stepMotorIRun; // volume per circle protected Double volumePerCircle; + // retraction circle count + protected Integer retractionCircleCount; @Override protected void onEnable() { @@ -61,5 +63,8 @@ public class DiActPeristalticPump extends DiActuatorBase { public void pump(Integer volume) { Integer circleCount = (int) (volume / this.volumePerCircle); this.rotateByCircleCount(circleCount); + if ( null != this.retractionCircleCount && 0 < this.retractionCircleCount ) { + this.rotateByCircleCount(this.retractionCircleCount * -1); + } } } \ No newline at end of file diff --git a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java index f92b991..5fe60d1 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java @@ -4,7 +4,7 @@ import com.my.graphiteDigesterBg.diframe.DiTaskMoveBase; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump; import com.my.graphiteDigesterBg.resource.ResAcidManager; - +import java.util.List; public class MoveLiquidAdd extends DiTaskMoveBase { // shake times public Integer shakeTimes; @@ -24,18 +24,26 @@ public class MoveLiquidAdd extends DiTaskMoveBase { DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); for ( int i=0; i<4; i++ ) { - // 外圈试管加液 - liquidMotor.moveTo("LiquidArmPumpGroupOut"); - liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", i); - groupOutPump.pump(this.liquidVolume); - groupInPump.pump(this.liquidVolume); + int index = i; + this.execute(List.of( // 移动到外圈试管位置 + () -> liquidMotor.moveTo("LiquidArmPumpGroupOut"), + () -> liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", index) + )); + this.execute(List.of( // 加液 + () -> groupOutPump.pump(this.liquidVolume), + () -> groupInPump.pump(this.liquidVolume) + )); bucket.consume(this.liquidVolume * 2); // 内圈试管加液 - liquidMotor.moveTo("LiquidArmPumpGroupIn"); - liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", i); - groupInPump.pump(this.liquidVolume); - groupOutPump.pump(this.liquidVolume); + this.execute(List.of( // 移动到内圈试管位置 + () -> liquidMotor.moveTo("LiquidArmPumpGroupIn"), + () -> liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", index) + )); + this.execute(List.of( // 加液 + () -> groupInPump.pump(this.liquidVolume), + () -> groupOutPump.pump(this.liquidVolume) + )); bucket.consume(this.liquidVolume * 2); } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java index dc4f540..0816b9e 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java @@ -41,11 +41,11 @@ public class ResHeatingTubeRackSlotManager extends DiResourceManagerBase { // refresh slot temperature public void refreshSlotTemperature() { - var registers = this.getDevice().getRegisters(); - for (ResHeatingTubeRackSlot slot : this.slots) { - slot.temperature = registers.getValue("HeatingPlateSlotTemperature" + slot.index); - LOG.info("[Heating Slot {}] temperature: {}", slot.index, slot.temperature); - } +// var registers = this.getDevice().getRegisters(); +// for (ResHeatingTubeRackSlot slot : this.slots) { +// slot.temperature = registers.getValue("HeatingPlateSlotTemperature" + slot.index); +// LOG.info("[Heating Slot {}] temperature: {}", slot.index, slot.temperature); +// } } // get resource data diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java index bbecc9d..9a1efbf 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java @@ -22,10 +22,10 @@ public class TaskLiquidAdd extends DiTaskBase { this.setStatus(TaskStatus.RUNNING); // move tube rack from heat plate to liquid plate - var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); - moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice()); - moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex; - moveTubeRackFromHeatPlateToLiquidPlate.run(); +// var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); +// moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice()); +// moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex; +// moveTubeRackFromHeatPlateToLiquidPlate.run(); MdbOperationLog.log(this.getUser(), "试管架%d : 样本加液 类型=%s, 加液量=%d", this.slotIndex, this.liquidType, this.liquidVolume); @@ -38,10 +38,10 @@ public class TaskLiquidAdd extends DiTaskBase { liquidAdd.run(); // move tube rack from liquid plate to heat plate - var moveTubeRackFromLiquidPlateToHeatPlate = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); - moveTubeRackFromLiquidPlateToHeatPlate.setDevice(this.getDevice()); - moveTubeRackFromLiquidPlateToHeatPlate.slotIndex = this.slotIndex; - moveTubeRackFromLiquidPlateToHeatPlate.run(); +// var moveTubeRackFromLiquidPlateToHeatPlate = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); +// moveTubeRackFromLiquidPlateToHeatPlate.setDevice(this.getDevice()); +// moveTubeRackFromLiquidPlateToHeatPlate.slotIndex = this.slotIndex; +// moveTubeRackFromLiquidPlateToHeatPlate.run(); this.setStatus(TaskStatus.FINISHED); } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java index e537272..ccca1d2 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java @@ -27,11 +27,11 @@ public class TaskStartReset extends DiTaskBase { // transferClipServo.setEnable(true); // transferClipServo.moveTo("TransClipServoClose"); // -// this.setProgressMessage("设备初始化 : 加液臂复位"); -// DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); -// liquidMotor.setEnable(true); -// liquidMotor.reset(); -// liquidMotor.moveTo("LiquidArmStandby"); + this.setProgressMessage("设备初始化 : 加液臂复位"); + DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); + liquidMotor.setEnable(true); + liquidMotor.reset(); + liquidMotor.moveTo("LiquidArmStandby"); // // // @todo http://127.0.0.1:5566/issues/38 // this.setProgressMessage("设备初始化 : 搬运机械臂上下移动复位"); @@ -54,11 +54,11 @@ public class TaskStartReset extends DiTaskBase { // heatSlotCoverServo.setCurrentPosAsMiddle(); // } // -// // @TODO : http://127.0.0.1:5566/issues/39 -// this.setProgressMessage("设备初始化 : 加液转盘复位"); -// DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); -// liquidPlateMotor.setEnable(true); -// liquidPlateMotor.reset(); + // @TODO : http://127.0.0.1:5566/issues/39 + this.setProgressMessage("设备初始化 : 加液转盘复位"); + DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); + liquidPlateMotor.setEnable(true); + liquidPlateMotor.reset(); // // // @TODO : http://127.0.0.1:5566/issues/40 // this.setProgressMessage("设备初始化 : 加热盘转盘复位"); @@ -66,16 +66,16 @@ public class TaskStartReset extends DiTaskBase { // heatPlateMotor.setEnable(true); // heatPlateMotor.reset(); // heatPlateMotor.moveTo("HeatPlateStandby"); -// -// int peristalticPumpCount = 1; -// var actuators = this.getDevice().getActuators().getAll(); -// for ( var actuator : actuators ) { -// if (actuator instanceof DiActPeristalticPump pump) { -// this.setProgressMessage("设备初始化 : 蠕动泵复位 " + peristalticPumpCount + "/16"); -// pump.setEnable(true); -// peristalticPumpCount++; -// } -// } + + int peristalticPumpCount = 1; + var actuators = this.getDevice().getActuators().getAll(); + for ( var actuator : actuators ) { + if (actuator instanceof DiActPeristalticPump pump) { + this.setProgressMessage("设备初始化 : 蠕动泵复位 " + peristalticPumpCount + "/16"); + pump.setEnable(true); + peristalticPumpCount++; + } + } this.setProgressMessage("设备初始化 : 完成"); runtimeVars.setString("IsDeviceReady", "YES"); diff --git a/src/src/main/resources/device.yml b/src/src/main/resources/device.yml index 88b8abe..ad95244 100644 --- a/src/src/main/resources/device.yml +++ b/src/src/main/resources/device.yml @@ -41,8 +41,8 @@ actuators : shaft : 1 oneCirclePulse : 10000 oneCirclePulseDenominator : 18 - defaultVelocity : 40 - defaultAcc : 2 + defaultVelocity : 100 + defaultAcc : 5 defaultDec : 2 runToZeroSpeed : 50 runToZeroDec : 30 @@ -121,7 +121,8 @@ actuators : defaultDec : 300 stepMotorIHold : 0 stepMotorIRun : 25 - volumePerCircle : 0.1 + volumePerCircle : 0.06 + retractionCircleCount : 1 - name: 蠕动泵-0-1 key: LiquidPeristalticPump_0_1 @@ -135,7 +136,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-1-0 key: LiquidPeristalticPump_1_0 @@ -149,7 +151,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-1-1 key: LiquidPeristalticPump_1_1 @@ -163,7 +166,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-2-0 key: LiquidPeristalticPump_2_0 @@ -177,7 +181,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-2-1 key: LiquidPeristalticPump_2_1 @@ -191,7 +196,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-3-0 key: LiquidPeristalticPump_3_0 @@ -205,7 +211,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-3-1 key: LiquidPeristalticPump_3_1 @@ -219,7 +226,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-4-0 key: LiquidPeristalticPump_4_0 @@ -233,7 +241,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-4-1 key: LiquidPeristalticPump_4_1 @@ -247,7 +256,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-5-0 key: LiquidPeristalticPump_5_0 @@ -261,7 +271,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-5-1 key: LiquidPeristalticPump_5_1 @@ -275,7 +286,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-6-0 key: LiquidPeristalticPump_6_0 @@ -289,7 +301,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-6-1 key: LiquidPeristalticPump_6_1 @@ -303,7 +316,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-7-0 key: LiquidPeristalticPump_7_0 @@ -317,7 +331,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name: 蠕动泵-7-1 key: LiquidPeristalticPump_7_1 @@ -331,7 +346,8 @@ actuators : defaultDec: 300 stepMotorIHold: 0 stepMotorIRun: 25 - volumePerCircle: 0.1 + volumePerCircle: 0.06 + retractionCircleCount : 1 - name : 设备门电机 key: DoorMotor diff --git a/src/web/src/pages/main/contents/Operation.vue b/src/web/src/pages/main/contents/Operation.vue index b1e2f71..c25eb99 100644 --- a/src/web/src/pages/main/contents/Operation.vue +++ b/src/web/src/pages/main/contents/Operation.vue @@ -68,29 +68,7 @@ - - - - - - A-1 - A-2 - A-3 - A-4 - A-5 - - - - - - - - - - - - - + \ No newline at end of file diff --git a/src/web/src/pages/main/contents/OperationTubeRackAcidAdd.vue b/src/web/src/pages/main/contents/OperationTubeRackAcidAdd.vue new file mode 100644 index 0000000..61fbd61 --- /dev/null +++ b/src/web/src/pages/main/contents/OperationTubeRackAcidAdd.vue @@ -0,0 +1,78 @@ + + \ No newline at end of file diff --git a/src/web/src/pages/main/contents/OperationTubeRacks.vue b/src/web/src/pages/main/contents/OperationTubeRacks.vue index 55fb4e3..a761955 100644 --- a/src/web/src/pages/main/contents/OperationTubeRacks.vue +++ b/src/web/src/pages/main/contents/OperationTubeRacks.vue @@ -42,7 +42,7 @@ - + @@ -63,6 +63,7 @@ import { ref } from 'vue'; import anime from 'animejs/lib/anime.es.js'; import OperationTubeRackHeating from './OperationTubeRackHeating.vue'; +import OperationTubeRackAcidAdd from './OperationTubeRackAcidAdd.vue'; /** @var {Object} */ const props = defineProps({ tubeRackSlots: Array,