Browse Source

增加任务:复位

master
sige 2 years ago
parent
commit
ebaa57bf31
  1. 5
      src/main/java/com/dreamworks/boditech/controller/TestController.java
  2. 4
      src/main/java/com/dreamworks/boditech/driver/Command.java
  3. 2
      src/main/java/com/dreamworks/boditech/driver/Device.java
  4. 5
      src/main/java/com/dreamworks/boditech/driver/Register.java
  5. 4
      src/main/java/com/dreamworks/boditech/driver/Task.java
  6. 1
      src/main/java/com/dreamworks/boditech/driver/TaskExecutor.java
  7. 8
      src/main/java/com/dreamworks/boditech/driver/actuator/ActArmXY.java
  8. 29
      src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java
  9. 27
      src/main/java/com/dreamworks/boditech/driver/actuator/ActMotor.java
  10. 7
      src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java
  11. 2
      src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java
  12. 7
      src/main/java/com/dreamworks/boditech/driver/task/Task.java
  13. 1
      src/main/java/com/dreamworks/boditech/driver/task/TaskBatchTubeExit.java
  14. 1
      src/main/java/com/dreamworks/boditech/driver/task/TaskBatchTubePrepare.java
  15. 117
      src/main/java/com/dreamworks/boditech/driver/task/TaskReset.java
  16. 1
      src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java
  17. 2
      src/main/java/com/dreamworks/boditech/driver/task/step/Step.java
  18. 2
      src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java
  19. 2
      src/main/java/com/dreamworks/boditech/driver/task/step/StepPuncture.java
  20. 2
      src/main/java/com/dreamworks/boditech/driver/task/step/StepSampling.java
  21. 2
      src/main/java/com/dreamworks/boditech/driver/task/step/StepShake.java
  22. 6
      src/main/java/com/dreamworks/boditech/service/DeviceService.java

5
src/main/java/com/dreamworks/boditech/controller/TestController.java

@ -1,6 +1,7 @@
package com.dreamworks.boditech.controller;
import com.dreamworks.boditech.controller.entity.ApiResponse;
import com.dreamworks.boditech.driver.task.TaskBatchTubePrepare;
import com.dreamworks.boditech.driver.task.TaskReset;
import com.dreamworks.boditech.driver.task.TaskTest;
import com.dreamworks.boditech.entity.request.test.AppendParam;
import com.dreamworks.boditech.service.DeviceService;
@ -19,8 +20,8 @@ public class TestController extends BaseController {
public ApiResponse append( @RequestBody AppendParam appendParam) {
// TaskBatchTubePrepare task = new TaskBatchTubePrepare();
// task.setTests(appendParam.tests);
TaskTest task = new TaskTest();
// TaskTest task = new TaskTest();
TaskReset task = new TaskReset();
this.deviceService.taskAppend(task);
return this.success();
}

4
src/main/java/com/dreamworks/boditech/driver/Command.java

@ -6,13 +6,17 @@ public class Command {
// command constants
public static final Integer CMD_MODULE_STOP = 0x0101;
public static final Integer CMD_MODULE_GET_STATUS = 0x0104;
public static final Integer CMD_MODULE_GET_REG = 0x0106;
public static final Integer CMD_MODULE_READ_IO = 0x0107;
public static final Integer CMD_MODULE_READ_RAW = 0x0113;
public static final Integer CMD_MODULE_START = 0x0115;
public static final Integer CMD_MOTOR_CALCULATED_POS_BY_MOVE_TO_ZERO = 0x0210;
public static final Integer CMD_MOTOR_EASY_ROTATE = 0x0211;
public static final Integer CMD_MOTOR_EASY_MOVE_BY = 0x0212;
public static final Integer CMD_MOTOR_EASY_MOVE_TO = 0x0213;
public static final Integer CMD_MOTOR_EASY_MOVE_TO_ZERO = 0x0214;
public static final Integer CMD_XYMOTOR_MOVE_TO = 0x0303;
public static final Integer CMD_XYMOTOR_MOVE_TO_ZERO = 0x0304;
public static final Integer CMD_PIPETTE_CTRL_INIT_DEVICE = 0x0501;
public static final Integer CMD_PIPETTE_CTRL_MOVE_TO_UL = 0x0503;

2
src/main/java/com/dreamworks/boditech/driver/Device.java

@ -64,6 +64,8 @@ public class Device {
this.appendActuator(new ActMotor(ActuatorModule.ANALYSIS_PUSH_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.ANALYSIS_SCAN_MOTOR, this));
this.appendActuator(new ActAnalysisScanner(ActuatorModule.ANALYSIS_SCAN_SCANNER, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_CARD_FEED_MOTOR, this));
this.appendActuator(new ActMotor(ActuatorModule.TEST_CARD_BOX_MOTOR, this));
}
// append actuator

5
src/main/java/com/dreamworks/boditech/driver/Register.java

@ -0,0 +1,5 @@
package com.dreamworks.boditech.driver;
public class Register {
public static final Integer MODULE_INPUT_STATE = 8;
public static final Integer MODULE_LAST_CMD_EXEC_VAL0 = 21;
}

4
src/main/java/com/dreamworks/boditech/driver/Task.java

@ -1,4 +0,0 @@
package com.dreamworks.boditech.driver;
public interface Task {
public void execute(TaskExecutor executor);
}

1
src/main/java/com/dreamworks/boditech/driver/TaskExecutor.java

@ -1,4 +1,5 @@
package com.dreamworks.boditech.driver;
import com.dreamworks.boditech.driver.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;

8
src/main/java/com/dreamworks/boditech/driver/actuator/ActArmXY.java

@ -36,4 +36,12 @@ public class ActArmXY extends ActuatorBase {
Integer y = this.getDevice().getLocationByName(name + ".y");
this.moveTo(x, y);
}
/**
* reset arm xy
*/
public void reset() {
this.call(Command.CMD_XYMOTOR_MOVE_TO_ZERO);
this.waitForFinish();
}
}

29
src/main/java/com/dreamworks/boditech/driver/actuator/ActIncubator.java

@ -19,29 +19,30 @@ public class ActIncubator extends ActMotor {
}
}
// get slot
public boolean hasFreeSlot() {
public IncubatorSlot getFreeSlot() {
for ( int i = 0; i < 20; i++ ) {
if ( this.slots[i].isFree ) {
return true;
return this.slots[i];
}
}
return false;
return null;
}
public void lockSlot( int index ) {
this.slots[index].isFree = false;
}
public void unlockSlot( int index ) {
this.slots[index].isFree = true;
}
// move to free position
public void moveToFreePosition() {
IncubatorSlot slot = null;
// get slot
public boolean hasFreeSlot() {
for ( int i = 0; i < 20; i++ ) {
if ( this.slots[i].isFree ) {
slot = this.slots[i];
break;
return true;
}
}
if ( slot == null ) {
throw new RuntimeException("no free slot");
}
this.moveTo(slot.getLocation());
return false;
}
}

27
src/main/java/com/dreamworks/boditech/driver/actuator/ActMotor.java

@ -1,17 +1,39 @@
package com.dreamworks.boditech.driver.actuator;
import com.dreamworks.boditech.driver.Command;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Register;
import java.nio.ByteBuffer;
public class ActMotor extends ActuatorBase {
// rotate direction
public static final int ROTATE_DIRECTION_CLOCKWISE = 1;
// rotate direction
public static final int ROTATE_DIRECTION_COUNTER_CLOCKWISE = -1;
// point type : start
public static final int POINT_START = 0;
// point type : end
public static final int POINT_END = 1;
// constructor
public ActMotor(Integer mid, Device device) {
super(mid, device);
}
// reset
public void reset() {
this.call(Command.CMD_MOTOR_EASY_MOVE_TO_ZERO, -1);
this.waitForFinish();
}
// reset and get source location
public Integer resetAndGetSourceLocation() {
this.call(Command.CMD_MOTOR_CALCULATED_POS_BY_MOVE_TO_ZERO);
this.waitForFinish();
Integer location = this.getRegister(Register.MODULE_LAST_CMD_EXEC_VAL0);
return location;
}
// move to given position
public void moveTo(int position) {
this.call(Command.CMD_MOTOR_EASY_MOVE_TO, position);
@ -35,4 +57,9 @@ public class ActMotor extends ActuatorBase {
this.call(Command.CMD_MOTOR_EASY_ROTATE, direction);
this.waitForFinish();
}
// move to point
public void moveToPoint( int pointType ) {
// @TODO : 硬件暂时未更新
}
}

7
src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorBase.java

@ -74,6 +74,13 @@ public class ActuatorBase implements Actuator {
return rawText.trim();
}
// get register
public Integer getRegister( Integer index ) {
ByteBuffer response = this.call(Command.CMD_MODULE_GET_REG, index);
Integer value = this.getIntegerFromResponse(response, 0);
return value;
}
// get integer from response
protected Integer getIntegerFromResponse(ByteBuffer response, Integer index ) {
response.order(ByteOrder.LITTLE_ENDIAN);

2
src/main/java/com/dreamworks/boditech/driver/actuator/ActuatorModule.java

@ -3,6 +3,8 @@ public class ActuatorModule {
public static Integer ARM_XY = 11;
public static Integer ARM_Z_MOTOR = 81;
public static Integer ARM_Z_PIPETTE = 82;
public static Integer TEST_CARD_BOX_MOTOR = 21;
public static Integer TEST_CARD_FEED_MOTOR = 22;
public static Integer TEST_TUBE_SHAKING_MOVE_MOTOR = 31;
public static Integer TEST_TUBE_SHAKING_ROTATE_MOTOR = 32;
public static Integer TEST_TUBE_SHAKING_CLIP_MOTOR = 33;

7
src/main/java/com/dreamworks/boditech/driver/task/Task.java

@ -0,0 +1,7 @@
package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.TaskExecutor;
public interface Task {
public void execute(TaskExecutor executor);
}

1
src/main/java/com/dreamworks/boditech/driver/task/TaskBatchTubeExit.java

@ -1,6 +1,5 @@
package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;

1
src/main/java/com/dreamworks/boditech/driver/task/TaskBatchTubePrepare.java

@ -1,6 +1,5 @@
package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActCodeScanner;
import com.dreamworks.boditech.driver.actuator.ActModuleTestTubeRackMovement;

117
src/main/java/com/dreamworks/boditech/driver/task/TaskReset.java

@ -0,0 +1,117 @@
package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Register;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActArmXY;
import com.dreamworks.boditech.driver.actuator.ActIncubator;
import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
import com.dreamworks.boditech.driver.entity.IncubatorSlot;
import java.util.Objects;
public class TaskReset implements Task {
// mode : normal
public static final Integer MODE_NORMAL = 0;
// mode : error
public static final Integer MODE_ERROR = 1;
// reset mode
public Integer mode = MODE_NORMAL;
@Override
public void execute(TaskExecutor executor) {
Device device = executor.getDevice();
//01. 试管夹复位
ActMotor testTubeShakingClipMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_CLIP_MOTOR);
testTubeShakingClipMotor.reset();
// 02. 试管夹旋转复位
ActMotor testTubeShakingClipRotateMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_ROTATE_MOTOR);
testTubeShakingClipRotateMotor.reset();
// 03. 机械臂Z轴复位
ActMotor armZMotor = (ActMotor)device.getActuator(ActuatorModule.ARM_Z_MOTOR);
armZMotor.reset();
// 04. 机械臂XY轴复位
ActArmXY armXY = (ActArmXY)device.getActuator(ActuatorModule.ARM_XY);
armXY.reset();
// 错误模式下可能还有TIP未丢弃
if (Objects.equals(this.mode, TaskReset.MODE_ERROR)) {
armXY.moveTo("tipDiscardPrepareHole");
armZMotor.moveTo("tipDiscardDepth");
armXY.moveTo("tipDiscardDrop");
armZMotor.reset();
}
// 05. 摇匀电机复位
// @TODO : 摇匀电机没有零点暂时没法复位
// 06. 试管帽夹复位
ActMotor testTubeShakingCapClipMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_CAP_CLIP_MOTOR);
testTubeShakingCapClipMotor.moveTo("testTubeShakingCapClipClose");
// 07. 摇匀升降电机复位
// @TODO : 升降电机需要向上复位但是目前没有更新所以暂时不复位
ActMotor testTubeShakingMoveMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_SHAKING_MOVE_MOTOR);
// testTubeShakingMoveMotor.reset();
if ( Objects.equals(this.mode, TaskReset.MODE_ERROR) ) {
// 出错的情况下这个时候可能还存在试管需要把试管放回到试管架上
testTubeShakingMoveMotor.moveTo("testTubeShakingCapPickUp");
testTubeShakingCapClipMotor.moveTo("testTubeShakingCapClipOpen");
testTubeShakingMoveMotor.moveTo("testTubeShakingUpDownStandBy");
testTubeShakingCapClipMotor.moveTo("testTubeShakingCapClipClose");
}
// 08. 试管架电机复位
ActMotor testTubeRackMoveMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_RACK_MOVE_MOTOR);
testTubeRackMoveMotor.reset();
testTubeRackMoveMotor.moveTo("testTubeRackExitPrepare");
testTubeRackMoveMotor.moveTo("testTubeRackExit");
ActMotor testTubeRackExitMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_RACK_EXIT_MOTOR);
testTubeRackExitMotor.moveBy(500);
testTubeRackMoveMotor.reset();
// 09. 板夹仓推杆电机复位
ActMotor testCardFeedMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_CARD_FEED_MOTOR);
// @TODO : 检查是否存在试管正在被从板夹仓推出
// @TODO : 读取试管夹二次验证相机数据判断是否存在上述情况
boolean hasTestCardInFeedRack = true;
if ( hasTestCardInFeedRack ) {
testCardFeedMotor.moveToPoint(ActMotor.POINT_END);
}
testCardFeedMotor.reset();
testCardFeedMotor.moveTo("testCardFeedStandBy");
// 10. 板夹仓复位
ActMotor testCardBoxMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_CARD_BOX_MOTOR);
testCardBoxMotor.reset();
// 11. 光学扫描电机复位
ActMotor analysisScanMotor = (ActMotor)device.getActuator(ActuatorModule.ANALYSIS_SCAN_MOTOR);
analysisScanMotor.reset();
analysisScanMotor.moveTo("analysisScanMotorStandBy");
// 11. 光学推杆电机复位
ActMotor analysisPushMotor = (ActMotor)device.getActuator(ActuatorModule.ANALYSIS_PUSH_MOTOR);
Integer analysisPushMotorInputState = analysisPushMotor.getRegister(Register.MODULE_INPUT_STATE);
boolean isAnalysisPushMotorPushing = ((analysisPushMotorInputState >> 1) & 0x01) == 0x00;
if ( isAnalysisPushMotorPushing ) {
analysisPushMotor.reset();
analysisScanMotor.moveTo("analysisScanMotorDropCard");
analysisScanMotor.moveTo("analysisScanMotorStandBy");
analysisPushMotor.moveTo("analysisPushMotorStandby");
}
// 12. 孵育盘电机复位
ActIncubator incubatorMotor = (ActIncubator)device.getActuator(ActuatorModule.INCUBATOR_MOTOR);
incubatorMotor.reset();
IncubatorSlot incubatorSlot = incubatorMotor.getFreeSlot();
incubatorMotor.moveTo(incubatorSlot.getExitLocation());
analysisPushMotor.moveTo("analysisPushMotorStandby");
}
}

1
src/main/java/com/dreamworks/boditech/driver/task/TaskTest.java

@ -1,5 +1,4 @@
package com.dreamworks.boditech.driver.task;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.TestStep;
import com.dreamworks.boditech.driver.consumable.CsmBufferTubeA;

2
src/main/java/com/dreamworks/boditech/driver/task/step/Step.java

@ -1,5 +1,5 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.task.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
public interface Step {
// execute step

2
src/main/java/com/dreamworks/boditech/driver/task/step/StepAnalysis.java

@ -1,6 +1,6 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.task.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActAnalysisScanner;
import com.dreamworks.boditech.driver.actuator.ActIncubator;

2
src/main/java/com/dreamworks/boditech/driver/task/step/StepPuncture.java

@ -1,6 +1,6 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.task.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActArmXY;
import com.dreamworks.boditech.driver.actuator.ActMotor;

2
src/main/java/com/dreamworks/boditech/driver/task/step/StepSampling.java

@ -1,6 +1,6 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.task.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActArmXY;
import com.dreamworks.boditech.driver.actuator.ActMotor;

2
src/main/java/com/dreamworks/boditech/driver/task/step/StepShake.java

@ -1,6 +1,6 @@
package com.dreamworks.boditech.driver.task.step;
import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.Task;
import com.dreamworks.boditech.driver.task.Task;
import com.dreamworks.boditech.driver.TaskExecutor;
import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;

6
src/main/java/com/dreamworks/boditech/service/DeviceService.java

@ -2,6 +2,7 @@ package com.dreamworks.boditech.service;
import com.dreamworks.boditech.driver.*;
import com.dreamworks.boditech.driver.consumable.CsmLargeBufferTube;
import com.dreamworks.boditech.driver.consumable.CsmPipetteTip;
import com.dreamworks.boditech.driver.task.Task;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
@ -26,6 +27,11 @@ public class DeviceService {
// task executor thread
private Thread taskExecutorThread;
// reset to initial state
public void reset() {
}
// start
public void start() {
this.device.appendPipetteTip(0, 10);

Loading…
Cancel
Save