sige 1 year ago
parent
commit
2012bd0153
  1. 19
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java
  2. 23
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
  3. 27
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java
  4. 27
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java
  5. 26
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java
  6. 52
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java

19
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();
}
}

23
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);
}
}

27
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);
}

27
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;
this.slot = slotMan.getSlotAtLiquidPlate();
if ( this.slot == null ) {
throw new RuntimeException("加热区不存在试管架, 无法执行移动操作");
}
}
if ( slotIndex == null ) {
throw new RuntimeException("liquid plate slot not found");
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);

26
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;

52
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("试管架正在加热中,无法取出样本");
}
if ( slot.rackPosition.equals("LiquidPlate") ) {
throw new RuntimeException("试管架未复位到加热盘,无法取出样本");
MdbOperationLog.log(this.getUser(), "试管架%d : 取出样本", this.slotIndex);
}
@Override
protected void execute() {
this.setStatus(TaskStatus.RUNNING);
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();
}
}
Loading…
Cancel
Save