diff --git a/src/pom.xml b/src/pom.xml
index a7335ef..93797ca 100644
--- a/src/pom.xml
+++ b/src/pom.xml
@@ -38,6 +38,21 @@
snakeyaml
1.33
+
+ org.xerial
+ sqlite-jdbc
+ 3.43.2.0
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 3.0.2
+
+
+ org.flywaydb
+ flyway-core
+ 9.21.0
+
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java
new file mode 100644
index 0000000..2f0c1e4
--- /dev/null
+++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java
@@ -0,0 +1,4 @@
+package com.my.graphiteDigesterBg.diframe;
+abstract public class DiActiveRecord {
+
+}
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java
new file mode 100644
index 0000000..9c8826a
--- /dev/null
+++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java
@@ -0,0 +1,18 @@
+package com.my.graphiteDigesterBg.diframe;
+abstract public class DiTaskMoveBase {
+ // device
+ private DiDevice device;
+
+ // set device
+ public void setDevice(DiDevice device) {
+ this.device = device;
+ }
+
+ // get device
+ public DiDevice getDevice() {
+ return this.device;
+ }
+
+ // run
+ abstract public void run();
+}
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java
index 2175a5d..fbfad09 100644
--- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java
+++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java
@@ -2,6 +2,13 @@ package com.my.graphiteDigesterBg.diframe.actuator;
import com.my.graphiteDigesterBg.diframe.DiActuatorBase;
import com.my.graphiteDigesterBg.diframe.DiCommand;
public class DiActPeristalticPump extends DiActuatorBase {
+ // volume
+ public void pump(Integer volume) {
+ // @TODO : 这里要根据配置参数计算 ~~~
+ this.call(DiCommand.MOTOR_EASY_MOVE_BY, 100 * volume);
+ this.waitForFinish();
+ }
+
public void rotate() {
this.call(DiCommand.MOTOR_EASY_MOVE_BY, 100 * 30);
}
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java
new file mode 100644
index 0000000..3b2d4e6
--- /dev/null
+++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java
@@ -0,0 +1,9 @@
+package com.my.graphiteDigesterBg.diframe.mapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+import java.util.Map;
+@Mapper
+public interface DiActiveRecordMapper {
+ @Select("SELECT * FROM ${tableName} WHERE id = #{id}")
+ Map findById(String tableName, Integer id);
+}
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/model/MdbUser.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/model/MdbUser.java
new file mode 100644
index 0000000..f8a551b
--- /dev/null
+++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/model/MdbUser.java
@@ -0,0 +1,5 @@
+package com.my.graphiteDigesterBg.diframe.model;
+import com.my.graphiteDigesterBg.diframe.DiActiveRecord;
+public class MdbUser extends DiActiveRecord {
+
+}
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java
new file mode 100644
index 0000000..4858bfd
--- /dev/null
+++ b/src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java
@@ -0,0 +1,13 @@
+package com.my.graphiteDigesterBg.move;
+import com.my.graphiteDigesterBg.diframe.DiDevice;
+import com.my.graphiteDigesterBg.diframe.DiTaskMoveBase;
+public class MoveMoveTubeRackFromHeatPlateToLiquidPlate extends DiTaskMoveBase {
+ // slot index
+ public Integer slotIndex;
+
+ // execute
+ @Override
+ public void run() {
+
+ }
+}
diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
new file mode 100644
index 0000000..7630882
--- /dev/null
+++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
@@ -0,0 +1,103 @@
+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.DiActPeristalticPump;
+import com.my.graphiteDigesterBg.diframe.actuator.DiActServo;
+import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate;
+import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot;
+import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
+@Task(name="LiquidAdd")
+public class TaskLiquidAdd extends DiTaskBase {
+ // slot index
+ public Integer slotIndex;
+ // liquid index
+ public Integer liquidIndex;
+ // liquid volume
+ public Integer liquidVolume;
+ // shake times
+ public Integer shakeTimes;
+
+ @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);
+ DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class);
+
+ // move tube rack from heat plate to liquid plate
+ var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate();
+ moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice());
+ moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex;
+ moveTubeRackFromHeatPlateToLiquidPlate.run();
+
+// // 加热盘转盘移动到取放架位置
+// 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);
+
+ String liquidPeristalticPumpKey = "liquidPeristalticPump_" + this.liquidIndex;
+ DiActPeristalticPump liquidPump = this.getActuator(liquidPeristalticPumpKey, DiActPeristalticPump.class);
+
+ // 外圈试管加液
+ // 加液机械臂移动到加液位置
+// liquidMotor.moveTo(1100);
+// for ( int i=0; i<4; i++ ) {
+// // 加液转盘移动到加液位置
+// liquidPlateMotor.moveTo(800 + 2500 * i);
+// // 加液指定数量
+// liquidPump.pump(this.liquidVolume);
+// }
+ // 内圈试管加液
+ // 加液转盘移动到加液位置
+ liquidPlateMotor.moveTo(800);
+ for ( int i=0; i<4; i++ ) {
+ // 加液转盘移动到加液位置
+ liquidPlateMotor.moveTo(800 + 2500 * i);
+ // 加液指定数量
+ liquidPump.pump(this.liquidVolume);
+ }
+ liquidMotor.moveTo(0);
+
+ // 加液盘摇匀
+ for ( int i=0; i