Browse Source

添加样本

master
sige 2 years ago
parent
commit
6bef7957b0
  1. 10
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskExecutor.java
  2. 7
      src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActMotor.java
  3. 55
      src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java
  4. 81
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java
  5. 34
      src/web/src/pages/main/contents/Operation.vue
  6. 7
      src/web/src/utils/ApiClient.js

10
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() {}
}

7
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() {}

55
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<String,Object> params) {
public DiApiResponse append(@RequestBody Map<String,Object> 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<String,Object> 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);
}
}

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

34
src/web/src/pages/main/contents/Operation.vue

@ -54,8 +54,9 @@
<a-button>加热</a-button> -->
</a-col>
<a-col :span="12" class="text-right">
<a-button @click="actionSampleAdd">添加样品</a-button>
<a-button class="ml-1" @click="actionSampleAddOrTakeOut">取出样品</a-button>
<a-button @click="actionStartReset">初始化</a-button>
<a-button class="ml-1" @click="actionSampleAdd">添加样本</a-button>
<a-button class="ml-1" @click="actionSampleAddOrTakeOut">取出样本</a-button>
</a-col>
</a-row>
</div>
@ -102,14 +103,41 @@
</div>
</div>
</div>
<!-- 添加样品弹框 -->
<a-modal v-model:visible="sampleAdd.enable" title="添加样本" @ok="actionSampleAddOk" @cancel="actionSampleAddCancel">
<p>放入样本后点击确认完成添加</p>
</a-modal>
</div>
</template>
<script setup>
import { ref } from 'vue';
import ApiClient from '@/utils/ApiClient.js';
/** @var {Object} */
const sampleAdd = ref({enable:false});
async function actionStartReset() {
let client = ApiClient.getClient();
await client.taskAppend('StartReset');
}
//
async function actionSampleAdd() {
sampleAdd.value.enable = true;
let client = ApiClient.getClient();
await client.taskAppend('sampleAdd');
await client.taskAppend('SampleAdd');
}
//
async function actionSampleAddOk() {
sampleAdd.value.enable = false;
let client = ApiClient.getClient();
await client.taskAppend('SampleAdd');
}
//
async function actionSampleAddCancel() {
sampleAdd.value.enable = false;
}
</script>
<style scoped>

7
src/web/src/utils/ApiClient.js

@ -21,16 +21,19 @@ export default class ApiClient {
// call api
async call( name, params ) {
debugger;
const response = await axios.post(`/api/${name}`, params);
return response.data;
}
// append task
async taskAppend( name, params={} ) {
return await this.call('task.append', {
return await this.call('task/append', {
name: name,
params: params,
});
}
async taskActionExecute() {
return await this.call('task/task-action-execute');
}
}
Loading…
Cancel
Save