diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java index 8364ea0..c663af0 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java @@ -8,8 +8,6 @@ public interface DiTask { String getUUID(); // set device void setDevice(DiDevice device); - // set parameter - void setParameter(Object parameter); // run void run(); } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java index 4aa52a4..fb5ce3f 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java @@ -1,7 +1,4 @@ package com.my.graphiteDigesterBg.diframe; -import com.my.graphiteDigesterBg.MyDevice; -import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; - import java.util.ArrayList; import java.util.List; abstract public class DiTaskBase implements DiTask { @@ -11,8 +8,6 @@ abstract public class DiTaskBase implements DiTask { private final String uuid; // status private TaskStatus status; - // parameter - private Object parameter; // steps private List steps; // step index @@ -51,11 +46,6 @@ abstract public class DiTaskBase implements DiTask { this.device = device; } - @Override - public void setParameter(Object parameter) { - this.parameter = parameter; - } - // run @Override public void run() { diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java index 04ffe58..f11e6c9 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskManager.java @@ -3,6 +3,7 @@ import com.my.graphiteDigesterBg.diframe.util.DiClassHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Constructor; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.List; @@ -75,8 +76,32 @@ public class DiTaskManager { throw new RuntimeException(e); } + // set device task.setDevice(this.device); - task.setParameter(parameter); + + // set parameter to properties + Map parameterMap = (Map)parameter; + for ( Map.Entry entry : parameterMap.entrySet() ) { + String key = entry.getKey(); + Field field = null; + try { + field = task.getClass().getDeclaredField(key); + } catch (NoSuchFieldException e) { + continue ; + } + + Class fieldType = field.getType(); + if ( !fieldType.isAssignableFrom(entry.getValue().getClass()) ) { + throw new RuntimeException("Parameter type mismatch: " + key); + } + + field.setAccessible(true); + try { + field.set(task, entry.getValue()); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } return task; } } 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 2667079..509e640 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java @@ -46,4 +46,9 @@ public class ResHeatingTubeRackSlotManager extends DiResourceManagerBase { } throw new RuntimeException("No free slot"); } + + // get slot by index + public ResHeatingTubeRackSlot getSlotByIndex( Integer index ) { + return this.slots.get(index); + } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java new file mode 100644 index 0000000..43f46db --- /dev/null +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java @@ -0,0 +1,56 @@ +package com.my.graphiteDigesterBg.task; +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.actuator.DiActServo; +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; + + @Override + public void run() { + ResHeatingTubeRackSlotManager heatingSlotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); + ResHeatingTubeRackSlot slot = heatingSlotMan.getSlotByIndex(this.slotIndex); + + DiActMotor heatPlateMotor = this.getActuator(MyDevice.ACT_HEAT_PLATE_MOTOR, DiActMotor.class); + DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); + DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); + DiActServo transferClipServo = this.getActuator(MyDevice.ACT_TRANSFER_CLIP_SERVO, DiActServo.class); + DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); + + // 加热盘转盘移动到取放架位置 + heatPlateMotor.moveTo(8580); // @TODO : 这里要根据位置计算 ~~~ + // 打开试管架盖 + slot.coverOpen(); + // 搬运上升到顶部 + transUdMotor.moveTo(1300); + // 搬运移动到加热取架位置 + transLrMotor.moveTo(1620); + // 搬运下降到取架位置 + transUdMotor.moveTo(130); + // 打开试管架夹爪 + transferClipServo.moveTo(2670); + // 搬运上升到顶部 + transUdMotor.moveTo(1300); + // 搬运移动到加液取放架位置 + transLrMotor.moveTo(365); + // 加液转盘移动到取放位置 + liquidPlateMotor.moveTo(642); + // 搬运下降到放架位置 + transUdMotor.moveTo(540); + // 关闭试管架夹爪 + transferClipServo.moveTo(2073); + // 搬运上升到顶部 + transUdMotor.moveTo(1300); + // 关闭试管架盖 + slot.coverClose(); + // 搬运移动到就绪位置 + transLrMotor.moveTo(1000); + + this.setStatus(TaskStatus.FINISHED); + } +} diff --git a/src/src/main/resources/device.yml b/src/src/main/resources/device.yml index ee7ea05..236ecd7 100644 --- a/src/src/main/resources/device.yml +++ b/src/src/main/resources/device.yml @@ -2,7 +2,7 @@ connection : class : com.my.graphiteDigesterBg.diframe.connection.DiConSerialPort path : COM7 baudRate : 921600 - frameTimeout : 200 + frameTimeout : 100 callTimeout : 5000 mode : binary # text | hex | binary # device registers