17 changed files with 256 additions and 34 deletions
-
1src/src/main/java/com/my/graphiteDigesterBg/diframe/DiApplicationRunner.java
-
1src/src/main/java/com/my/graphiteDigesterBg/diframe/DiCommand.java
-
8src/src/main/java/com/my/graphiteDigesterBg/diframe/DiDevice.java
-
2src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTestcase.java
-
16src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTestcaseBase.java
-
11src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTestcaseInfo.java
-
72src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTestcaseManager.java
-
7src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActServo.java
-
27src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTest.java
-
4src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromHeatPlateToLiquidPlate.java
-
4src/src/main/java/com/my/graphiteDigesterBg/move/MoveMoveTubeRackFromLiquidPlateToHeatPlate.java
-
15src/src/main/java/com/my/graphiteDigesterBg/move/MoveTubeToErrorRackSlot.java
-
33src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
-
72src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcaseLocateEachTubeSlot.java
-
2src/src/main/java/com/my/graphiteDigesterBg/testcase/TestcasePeristalticPumpTest.java
-
2src/src/main/resources/application.yml
-
7src/src/main/resources/device.yml
@ -0,0 +1,11 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
public class DiTestcaseInfo { |
|||
// name |
|||
public String name; |
|||
// title |
|||
public String title; |
|||
// description |
|||
public String description; |
|||
// class |
|||
public Class<?> clazz; |
|||
} |
@ -0,0 +1,72 @@ |
|||
package com.my.graphiteDigesterBg.diframe; |
|||
import com.my.graphiteDigesterBg.diframe.util.DiClassHelper; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.lang.reflect.Constructor; |
|||
import java.lang.reflect.InvocationTargetException; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
public class DiTestcaseManager { |
|||
// logger |
|||
public static final Logger LOG = LoggerFactory.getLogger(DiTestcaseManager.class); |
|||
// device |
|||
private final DiDevice device; |
|||
// testcase classes |
|||
private final Map<String, DiTestcaseInfo> testcasees; |
|||
|
|||
// constructor |
|||
public DiTestcaseManager(DiDevice device) { |
|||
this.device = device; |
|||
this.testcasees = new HashMap<>(); |
|||
} |
|||
|
|||
// setup |
|||
public void setup() { |
|||
var options = (Map<String,Object>)this.device.getConfig().get("testcase"); |
|||
var packageNames = (List<String>)options.get("packages"); |
|||
for ( String packageName : packageNames ) { |
|||
List<Class<?>> testClasses = DiClassHelper.getAllClassesInPackage(packageName); |
|||
for ( Class<?> testClass : testClasses ) { |
|||
if ( DiTestcaseBase.class.isAssignableFrom(testClass) ) { |
|||
Testcase testcaseAnnotation = testClass.getAnnotation(Testcase.class); |
|||
if ( testcaseAnnotation != null ) { |
|||
var info = new DiTestcaseInfo(); |
|||
info.name = testcaseAnnotation.name(); |
|||
info.title = testcaseAnnotation.title(); |
|||
info.description = testcaseAnnotation.description(); |
|||
info.clazz = testClass; |
|||
this.testcasees.put(testcaseAnnotation.name(), info); |
|||
LOG.info("(Testcase) {} => {}", testcaseAnnotation.name(), testClass.getName()); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
// execute testcase by name |
|||
public void execute( String name ) { |
|||
var info = this.testcasees.get(name); |
|||
if ( info == null ) { |
|||
throw new RuntimeException("Testcase not found: " + name); |
|||
} |
|||
|
|||
Constructor<?> constructor = null; |
|||
try { |
|||
constructor = info.clazz.getDeclaredConstructor(); |
|||
} catch (NoSuchMethodException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
|
|||
DiTestcase testcase = null; |
|||
try { |
|||
testcase = (DiTestcase)constructor.newInstance(); |
|||
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { |
|||
throw new RuntimeException(e); |
|||
} |
|||
|
|||
testcase.setDevice(this.device); |
|||
testcase.run(); |
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.my.graphiteDigesterBg.diframe.api; |
|||
import com.my.graphiteDigesterBg.diframe.DiApiControllerBase; |
|||
import com.my.graphiteDigesterBg.diframe.DiApiResponse; |
|||
import com.my.graphiteDigesterBg.diframe.DiDevice; |
|||
import jakarta.annotation.Resource; |
|||
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.util.Map; |
|||
@Controller |
|||
public class DiApiTest extends DiApiControllerBase { |
|||
@Resource |
|||
private DiDevice device; |
|||
|
|||
@ResponseBody |
|||
@PostMapping("/api/test/execute") |
|||
public DiApiResponse execute(@RequestBody Map<String,Object> params ) { |
|||
String name = (String)params.get("name"); |
|||
try { |
|||
this.device.getTestcases().execute(name); |
|||
} catch (Exception e) { |
|||
return this.error(e.getMessage()); |
|||
} |
|||
return this.success(); |
|||
} |
|||
} |
@ -0,0 +1,72 @@ |
|||
package com.my.graphiteDigesterBg.testcase; |
|||
import com.my.graphiteDigesterBg.MyDevice; |
|||
import com.my.graphiteDigesterBg.diframe.DiTestcaseBase; |
|||
import com.my.graphiteDigesterBg.diframe.Testcase; |
|||
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; |
|||
import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; |
|||
@Testcase( |
|||
name="LocateEachTubeSlot", |
|||
title="测试每个试管孔定位情况", |
|||
description="测试时,需要将第一个试管孔位放置一个试管,用于观察定位情况" |
|||
) |
|||
public class TestcaseLocateEachTubeSlot extends DiTestcaseBase { |
|||
@Override |
|||
public void run() { |
|||
var heatPlateMotor = this.getActuator(MyDevice.ACT_HEAT_PLATE_MOTOR, DiActMotor.class); |
|||
heatPlateMotor.setEnable(true); |
|||
heatPlateMotor.reset(); |
|||
|
|||
var transUdMotor = this.getActuator(MyDevice.ACT_TRANSFER_UD_MOTOR, DiActMotor.class); |
|||
transUdMotor.setEnable(true); |
|||
transUdMotor.reset(); |
|||
transUdMotor.moveTo("TransUdMotorStandby"); |
|||
|
|||
var transLrMotor = this.getActuator(MyDevice.ACT_TRANSFER_LR_MOTOR, DiActMotor.class); |
|||
transLrMotor.setEnable(true); |
|||
transLrMotor.reset(); |
|||
transLrMotor.moveTo("TransLrMotorStandby"); |
|||
|
|||
for ( int i=0; i<5; i++ ) { |
|||
String key = "HeatingPlateMotorSlotCover_" + i; |
|||
DiActServo heatSlotCoverServo = this.getActuator(key, DiActServo.class); |
|||
heatSlotCoverServo.setEnable(true); |
|||
heatSlotCoverServo.setCurrentPosAsMiddle(); |
|||
} |
|||
|
|||
// 从第一个试管孔位取试管 |
|||
for ( int tubeSlotIndex=0; tubeSlotIndex<16;tubeSlotIndex++ ) { |
|||
for ( int rackSlotIndex=0; rackSlotIndex<5; rackSlotIndex++ ) { |
|||
var coverKey = "HeatingPlateMotorSlotCover_" + rackSlotIndex; |
|||
var heatSlotCoverServo = this.getActuator(coverKey, DiActServo.class); |
|||
heatSlotCoverServo.moveTo("HeatPlateSlotCoverOpen"); |
|||
|
|||
// 计算孔位 |
|||
var rackPickUpLocation = heatPlateMotor.getLocationValue("HeatPlateSlot", rackSlotIndex); |
|||
var tubePickUpOffset = heatPlateMotor.getLocationValue("HeatPlateSlotTubeOffset", tubeSlotIndex); |
|||
heatPlateMotor.moveTo(rackPickUpLocation + tubePickUpOffset); |
|||
|
|||
// 左右移动到试管孔位 |
|||
var transLrRackPickUpLocation = transLrMotor.getLocationValue("TransLrMotorHeatPlateSlot"); |
|||
var transLrTubePickUpOffset = transLrMotor.getLocationValue("TransLrMotorTubeOffset", tubeSlotIndex); |
|||
transLrMotor.moveTo(transLrRackPickUpLocation + transLrTubePickUpOffset); |
|||
|
|||
// 上下移动到试管预备位 |
|||
transUdMotor.moveTo(300); |
|||
transUdMotor.moveTo("TransUdMotorTubeClip"); |
|||
|
|||
// 完成单次 |
|||
// 上下移动到顶部 |
|||
transUdMotor.moveTo("TransUdMotorTop"); |
|||
// 左右移动到就绪位 |
|||
transLrMotor.moveTo("TransLrMotorStandby"); |
|||
// 关闭试管孔位盖 |
|||
heatSlotCoverServo.moveTo("HeatPlateSlotCoverClose"); |
|||
} |
|||
} |
|||
|
|||
transUdMotor.moveTo("TransUdMotorStandby"); |
|||
transLrMotor.moveTo("TransLrMotorStandby"); |
|||
heatPlateMotor.moveTo("HeatPlateStandby"); |
|||
heatPlateMotor.setEnable(false); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue