From 2012bd0153040516c7cc74dca6d765ca50dadf85 Mon Sep 17 00:00:00 2001 From: sige Date: Thu, 21 Mar 2024 21:58:45 +0800 Subject: [PATCH] ~ --- .../my/graphiteDigesterBg/task/TaskHeating.java | 19 ++++++- .../my/graphiteDigesterBg/task/TaskLiquidAdd.java | 23 ++++---- .../my/graphiteDigesterBg/task/TaskSampleAdd.java | 27 +++++----- .../task/TaskSampleMoveToHeatPlate.java | 29 +++++----- .../task/TaskSampleMoveToLiquidPlate.java | 26 ++++++--- .../graphiteDigesterBg/task/TaskSampleTakeOut.java | 62 +++++++++------------- 6 files changed, 106 insertions(+), 80 deletions(-) diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java index 9856bde..59fafdd 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java @@ -4,6 +4,10 @@ import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveHeatPlateSlotHeating; +import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; +import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; +import jdk.jfr.Percentage; + import java.util.Timer; @Task(name="Heating") public class TaskHeating extends DiTaskBase { @@ -17,9 +21,20 @@ public class TaskHeating extends DiTaskBase { private MoveHeatPlateSlotHeating heating; @Override - protected void execute() { + public void prepare() { + var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); + var slot = slotMan.getSlotByIndex(this.slotIndex); + if ( !slot.getIsLocked() ) { + throw new RuntimeException("试管架位为空,无法执行加热操作"); + } + if ( slot.isHeating ) { + throw new RuntimeException("试管架正在加热中,无法执行加热操作"); + } MdbOperationLog.log(this.getUser(), "试管架%d : 样本加热 温度=%d, 时间=%d", this.slotIndex, this.temperature, this.duration); + } + @Override + protected void execute() { this.heating = new MoveHeatPlateSlotHeating(); this.heating.taskUuid = this.getUUID(); this.heating.slotIndex = this.slotIndex; @@ -34,7 +49,7 @@ public class TaskHeating extends DiTaskBase { } // cancel - public void cancel() { + public void actionCancel() { this.heating.cancel(); } } 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 01f90f0..63af2c3 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java @@ -5,6 +5,7 @@ import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveLiquidAdd; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; +import com.my.graphiteDigesterBg.resource.ResAcidManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import java.util.Objects; @Task(name="LiquidAdd") @@ -19,11 +20,16 @@ public class TaskLiquidAdd extends DiTaskBase { public Integer shakeTimes; @Override - protected void execute() { - this.setStatus(TaskStatus.RUNNING); + public void prepare() { + var liquidBucketMan = this.getResourceManager(ResAcidManager.class); + var bucket = liquidBucketMan.getBucketByAcidType(this.liquidType); + var totalVolume = this.liquidVolume * 16; + if ( bucket.volume < totalVolume ) { + throw new RuntimeException("酸液不足, 无法执行加液操作"); + } + var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); var slot = slotMan.getSlotAtLiquidPlate(); - if ( slot == null ) { // move tube rack from heat plate to liquid plate var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); @@ -35,6 +41,11 @@ public class TaskLiquidAdd extends DiTaskBase { } MdbOperationLog.log(this.getUser(), "试管架%d : 样本加液 类型=%s, 加液量=%d", this.slotIndex, this.liquidType, this.liquidVolume); + } + + @Override + protected void execute() { + this.setStatus(TaskStatus.RUNNING); // add liquid var liquidAdd = new MoveLiquidAdd(); @@ -45,12 +56,6 @@ public class TaskLiquidAdd extends DiTaskBase { liquidAdd.slotIndex = this.slotIndex; 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(); - this.setStatus(TaskStatus.FINISHED); } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java index d0b2966..2559896 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java @@ -4,29 +4,33 @@ import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.model.DiMdbNotification; -import com.my.graphiteDigesterBg.model.MdbDigestion; import com.my.graphiteDigesterBg.model.MdbOperationLog; -import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; import java.util.List; import java.util.Map; @Task(name="SampleAdd") public class TaskSampleAdd extends DiTaskBase { - // param : eid - public String eid; + // slot + private ResHeatingTubeRackSlot slot; @Override - protected void execute() { - this.setStatus(TaskStatus.RUNNING); + public void prepare() { + super.prepare(); - var digestion = new MdbDigestion(); - digestion.eid = this.eid; - digestion.save(); + var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); + if ( null != slotMan.getSlotAtLiquidPlate() ) { + throw new RuntimeException("加液位置存在试管架, 无法添加样本"); + } - ResHeatingTubeRackSlotManager slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); - ResHeatingTubeRackSlot slot = slotMan.allocFreeSlot(); + this.slot = slotMan.allocFreeSlot(); + this.slot.rackPosition = ResHeatingTubeRackSlot.LOCATION_LIQUID_PLATE; MdbOperationLog.log(this.getUser(), "试管架%d : 放入样本", slot.index); + } + + @Override + protected void execute() { + this.setStatus(TaskStatus.RUNNING); DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); @@ -69,7 +73,6 @@ public class TaskSampleAdd extends DiTaskBase { slot.setTubeStatus(index, ResHeatingTubeRackSlot.TUBE_STATUS_EMPTY); } - slot.rackPosition = ResHeatingTubeRackSlot.LOCATION_LIQUID_PLATE; this.setStatus(TaskStatus.FINISHED); } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java index 383e365..ed3c0da 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java @@ -3,31 +3,32 @@ import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromLiquidPlateToHeatPlate; +import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; - @Task(name="SampleMoveToHeatPlate") public class TaskSampleMoveToHeatPlate extends DiTaskBase { + // slot + private ResHeatingTubeRackSlot slot; + @Override - protected void execute() { - this.setStatus(TaskStatus.RUNNING); + public void prepare() { + super.prepare(); - Integer slotIndex = null; var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); - for ( var slot : slotMan.getSlots() ) { - if ( slot.rackPosition.equals("LIQUID_PLATE") ) { - slotIndex = slot.index; - break; - } - } - if ( slotIndex == null ) { - throw new RuntimeException("liquid plate slot not found"); + this.slot = slotMan.getSlotAtLiquidPlate(); + if ( this.slot == null ) { + throw new RuntimeException("加热区不存在试管架, 无法执行移动操作"); } + MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加热区", this.slot.index); + } - MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加热区", slotIndex); + @Override + protected void execute() { + this.setStatus(TaskStatus.RUNNING); var move = new MoveMoveTubeRackFromLiquidPlateToHeatPlate(); move.setDevice(this.getDevice()); - move.slotIndex = slotIndex; + move.slotIndex = this.slot.index; move.run(); this.setStatus(TaskStatus.FINISHED); diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java index 9d71d7b..1d254a4 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java @@ -5,6 +5,7 @@ import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; +import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @Task(name="SampleMoveToLiquidPlate") public class TaskSampleMoveToLiquidPlate extends DiTaskBase { @@ -12,22 +13,35 @@ public class TaskSampleMoveToLiquidPlate extends DiTaskBase { public Integer slotIndex; @Override - protected void execute() { - this.setStatus(TaskStatus.RUNNING); - MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加液区", this.slotIndex); + public void prepare() { + super.prepare(); var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); - var slot = slotMan.getSlotByIndex(this.slotIndex); + var slot = slotMan.getSlotAtLiquidPlate(); + if ( slot != null ) { + throw new RuntimeException("加液区已存在试管架, 无法执行移动操作"); + } + MdbOperationLog.log(this.getUser(), "试管架%d : 样本移至加液区", this.slotIndex); + + // 检查当前试管架是否可以移动 + slot = slotMan.getSlotByIndex(this.slotIndex); if ( !slot.getIsLocked() ) { throw new RuntimeException("试管架位为空,无法取出样本"); } if ( slot.isHeating ) { throw new RuntimeException("试管架正在加热中,无法取出样本"); } - if ( slot.rackPosition.equals("LiquidPlate") ) { - throw new RuntimeException("试管架未复位到加热盘,无法取出样本"); + if ( slot.rackPosition.equals(ResHeatingTubeRackSlot.LOCATION_LIQUID_PLATE) ) { + throw new RuntimeException("试管架已经在加液区,无需移动"); } + slot.rackPosition = ResHeatingTubeRackSlot.LOCATION_LIQUID_PLATE; + } + + @Override + protected void execute() { + this.setStatus(TaskStatus.RUNNING); + var move = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); move.setDevice(this.getDevice()); move.slotIndex = this.slotIndex; diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java index 39cde3b..2d692c2 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java @@ -3,48 +3,50 @@ import com.my.graphiteDigesterBg.MyDevice; import com.my.graphiteDigesterBg.diframe.DiTaskBase; import com.my.graphiteDigesterBg.diframe.Task; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; +import com.my.graphiteDigesterBg.diframe.model.DiMdbNotification; import com.my.graphiteDigesterBg.model.MdbOperationLog; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; +import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @Task(name="SampleTakeOut") public class TaskSampleTakeOut extends DiTaskBase { // slot index public Integer slotIndex; - // done lock - private final Object confirmLock = new Object(); + // slot + private ResHeatingTubeRackSlot slot; @Override - protected void execute() { - this.setStatus(TaskStatus.RUNNING); - MdbOperationLog.log(this.getUser(), "试管架%d : 取出样本", this.slotIndex); - + public void prepare() { var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); - var slot = slotMan.getSlotByIndex(this.slotIndex); - - if ( !slot.getIsLocked() ) { + this.slot = slotMan.getSlotByIndex(this.slotIndex); + if ( !this.slot.getIsLocked() ) { throw new RuntimeException("试管架位为空,无法取出样本"); } - - if ( slot.isHeating ) { + if ( this.slot.isHeating ) { throw new RuntimeException("试管架正在加热中,无法取出样本"); } + MdbOperationLog.log(this.getUser(), "试管架%d : 取出样本", this.slotIndex); + } - if ( slot.rackPosition.equals("LiquidPlate") ) { - throw new RuntimeException("试管架未复位到加热盘,无法取出样本"); - } + @Override + protected void execute() { + this.setStatus(TaskStatus.RUNNING); - // 从加热盘移动到液体盘 - var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); - moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex; - moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice()); - moveTubeRackFromHeatPlateToLiquidPlate.run(); + if ( this.slot.rackPosition.equals(ResHeatingTubeRackSlot.LOCATION_HEAT_PLATE) ) { + // 从加热盘移动到液体盘 + var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate(); + moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex; + moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice()); + moveTubeRackFromHeatPlateToLiquidPlate.run(); + } // 打开设备门 DiActMotor doorMotor = this.getActuator(MyDevice.ACT_DOOR_MOTOR, DiActMotor.class); doorMotor.reset(); // 等待用户取出确认 - this.waitForUserTakeOutConfirm(); + DiMdbNotification.taskAction(this, "TaskSampleTakeOutTubeRack"); + this.waitAction("TaskSampleTakeOutTubeRack"); // 关闭设备门 doorMotor.moveToIO(1, 1); @@ -53,23 +55,9 @@ public class TaskSampleTakeOut extends DiTaskBase { this.setStatus(TaskStatus.FINISHED); } - // wait for user action - private void waitForUserTakeOutConfirm() { - this.setRuntimeStatus("WAIT_FOR_TAKING_CONFIRM"); - synchronized (this.confirmLock) { - try { - this.confirmLock.wait(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } - this.clearRuntimeStatus(); - } - // tube rack take out confirm - public void done() { - synchronized (this.confirmLock) { - this.confirmLock.notifyAll(); - } + public void actionDone() { + var action = this.getAction("TaskSampleTakeOutTubeRack"); + action.finish(); } }