From 6bef7957b0dab8a1d89c7b03b0ecf2dbe7c355f9 Mon Sep 17 00:00:00 2001 From: sige Date: Wed, 24 Jan 2024 14:18:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A0=B7=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graphiteDigesterBg/diframe/DiTaskExecutor.java | 10 +++ .../diframe/actuator/DiActMotor.java | 7 +- .../graphiteDigesterBg/diframe/api/DiApiTask.java | 55 ++++++++++++++- .../my/graphiteDigesterBg/task/TaskSampleAdd.java | 81 ++++++++++++++++++++-- src/web/src/pages/main/contents/Operation.vue | 34 ++++++++- src/web/src/utils/ApiClient.js | 7 +- 6 files changed, 181 insertions(+), 13 deletions(-) diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java index 016e19d..839d3c5 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java @@ -109,6 +109,16 @@ public class DiTaskExecutor implements Runnable { } } + // get task by UUID + public DiTask getTaskByUUID(String uuid) { + for ( DiTask task : this.taskList ) { + if ( task.getUUID().equals(uuid) ) { + return task; + } + } + return null; + } + public void pause() {} public void resume() {} } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActMotor.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActMotor.java index ca654bc..7b01bd0 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActMotor.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActMotor.java @@ -8,7 +8,12 @@ public class DiActMotor extends DiActuatorBase { this.waitForFinish(); } - public void moveTo( Integer pos ) {} + // move to position + public void moveTo( Integer pos ) { + this.call(DiCommand.MOTO_EASY_MOVE_TO, pos); + this.waitForFinish(); + } + public void moveBy( Integer delta ) {} public void rotate( Integer direction ) {} public void stop() {} diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java index b47f267..5d2f3da 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java @@ -5,6 +5,9 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Map; @Controller public class DiApiTask extends DiApiControllerBase { @@ -20,7 +23,7 @@ public class DiApiTask extends DiApiControllerBase { */ @ResponseBody @PostMapping("/api/task/append") - public DiApiResponse append(@RequestBody Map params) { + public DiApiResponse append(@RequestBody Map params) { DiTaskExecutor executor = this.device.getTaskManager().getExecutor(); if ( null == executor ) { return this.error("task executor is not running"); @@ -31,6 +34,54 @@ public class DiApiTask extends DiApiControllerBase { DiTaskManager taskManager = this.device.getTaskManager(); DiTask task = taskManager.generateTask(name, taskParams); executor.appendTask(task); - return this.success(); + return this.success(Map.of("id", task.getUUID())); + } + + @ResponseBody + @PostMapping("/api/task/task-action-execute") + public DiApiResponse taskActionExecute(@RequestBody Map params) { + String id = (String)params.get("id"); + String action = (String)params.get("action"); + Object actionParams = params.get("params"); + + DiTaskExecutor executor = this.device.getTaskManager().getExecutor(); + DiTask task = executor.getTaskByUUID(id); + if ( null == task ) { + return this.error("task not found"); + } + + boolean hasParams = false; + Method actionMethod = null; + try { + actionMethod = task.getClass().getMethod(action); + } catch (NoSuchMethodException e) { + try { + hasParams = true; + actionMethod = task.getClass().getMethod(action, Map.class); + } catch (NoSuchMethodException ep) { + throw new RuntimeException(ep); + } + } + + Object actionResult = null; + try { + if ( hasParams ) { + if ( actionMethod.getReturnType().equals(Void.TYPE) ) { + actionMethod.invoke(task, params); + } else { + actionResult = actionMethod.invoke(task, params); + } + } else { + if ( actionMethod.getReturnType().equals(Void.TYPE) ) { + actionMethod.invoke(task); + } else { + actionResult = actionMethod.invoke(task); + } + } + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + + return this.success(actionResult); } } 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 eb1c629..30d3f15 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java @@ -8,17 +8,88 @@ import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @Task(name="SampleAdd") public class TaskSampleAdd extends DiTaskBase { + // done lock + private final Object doneLock = new Object(); + // add status + private String addStatus = "waiting"; + @Override public void run() { + DiActMotor transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); + DiActMotor transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); + DiActServo transferClipServo = (DiActServo)this.getActuator(MyDevice.ACT_TRANSFER_CLIP_SERVO); + DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); + DiActMotor heatPlateMotor = (DiActMotor)this.getActuator(MyDevice.ACT_HEAT_PLATE_MOTOR); + ResHeatingTubeRackSlotManager slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); ResHeatingTubeRackSlot slot = slotMan.allocFreeSlot(); - DiActMotor heatPlateMotor = (DiActMotor)this.getActuator(MyDevice.ACT_HEAT_PLATE_MOTOR); - heatPlateMotor.moveTo(slot.getOperationWindowLocation()); - - DiActServo coverServo = (DiActServo)this.getActuator(MyDevice.ACT_HEAT_SLOT_01_COVER_SERVO); - coverServo.moveTo(1000); + // 搬运上升到顶部 + transUdMotor.moveTo(1300); + // 搬运机械臂移动到就绪位置 + transLrMotor.moveTo(1000); + // 加液转盘移动到就添加位置 + liquidPlateMotor.moveTo(200); + // 等待用户添加完成 + this.waitForUserAction(); + if ( "canceled".equals(this.addStatus) ) { + slot.unlock(); + this.setStatus(TaskStatus.FINISHED); + } + // 加液转盘移动到取架位置 + liquidPlateMotor.moveTo(642); + // 搬运移动到加液取放架位置 + transLrMotor.moveTo(365); + // 搬运下降到取架位置 + transUdMotor.moveTo(540); + // 张开试管架夹爪 + transferClipServo.moveTo(2670); + // 搬运上升到顶部 + transUdMotor.moveTo(1300); + // 加热转盘移动到取放架位置 + heatPlateMotor.moveTo(8580); + // 打开试管架盖 + slot.coverOpen(); + // 搬运移动到加热盘取放位置 + transLrMotor.moveTo(1650); + // 搬运下降到放架位置 + transUdMotor.moveTo(150); + // 关闭试管架夹爪 + transferClipServo.moveTo(2073); + // 搬运上升到顶部 + transUdMotor.moveTo(1300); + // 搬运移动到绪位置 + transLrMotor.moveTo(1000); + // 试管架盖关闭 + slot.coverClose(); this.setStatus(TaskStatus.FINISHED); } + + // wait for user action + private void waitForUserAction() { + synchronized (this.doneLock) { + try { + this.doneLock.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + + // close cover + public void done() { + this.addStatus = "done"; + synchronized (this.doneLock) { + this.doneLock.notifyAll(); + } + } + + // cancel + public void cancel() { + this.addStatus = "canceled"; + synchronized (this.doneLock) { + this.doneLock.notifyAll(); + } + } } diff --git a/src/web/src/pages/main/contents/Operation.vue b/src/web/src/pages/main/contents/Operation.vue index 28b830d..7fedc43 100644 --- a/src/web/src/pages/main/contents/Operation.vue +++ b/src/web/src/pages/main/contents/Operation.vue @@ -54,8 +54,9 @@ 加热 --> - 添加样品 - 取出样品 + 初始化 + 添加样本 + 取出样本 @@ -102,14 +103,41 @@ + + + +

放入样本后点击确认完成添加

+