Browse Source

update

tags/v0
zhaohe 4 months ago
parent
commit
33af819d18
  1. 2
      src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java
  2. 212
      src/main/java/a8k/app/a8kproj/fakeprojcontext/FakeProjInfoContextFactory.java
  3. 1
      src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java
  4. 3
      src/main/java/a8k/app/config/A8kCanBusConnectionConfig.java
  5. 2
      src/main/java/a8k/app/config/CorsConfig.java
  6. 2
      src/main/java/a8k/app/config/SpringDocConfig.java
  7. 2
      src/main/java/a8k/app/config/WebSocketConfiguration.java
  8. 3
      src/main/java/a8k/app/hardware/basedriver/A8kCanBusService.java
  9. 18
      src/main/java/a8k/app/hardware/driver/MiniServoDriver.java
  10. 6
      src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java
  11. 1
      src/main/java/a8k/app/hardware/driver/type/StepMotorRegIndex.java
  12. 13
      src/main/java/a8k/app/hardware/initializer/A8kModParamInitializer.java
  13. 34
      src/main/java/a8k/app/hardware/type/a8kcanprotocol/IOId.java
  14. 25
      src/main/java/a8k/app/hardware/type/regindex/RegIndex.java
  15. 2
      src/main/java/a8k/app/service/background/TemperatureCtrlService.java
  16. 2
      src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java
  17. 5
      src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java
  18. 4
      src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java
  19. 1
      src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java
  20. 6
      src/main/java/a8k/app/service/lowerctrl/TubeFeedingExCtrlService.java
  21. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC10ErrorReactionPlateProcesser.java
  22. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java
  23. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java
  24. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30EjectTubeHolder.java
  25. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java
  26. 2
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30SwitchToNextTubeTake.java
  27. 4
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java
  28. 3
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java
  29. 2
      src/main/java/a8k/app/service/setting/AppSettingsMgrService.java
  30. 3
      src/main/java/a8k/app/teststate/TestStateMgrService.java
  31. 8
      src/main/java/a8k/app/teststate/VirtualDevice.java
  32. 6
      src/main/java/a8k/app/utils/DoAction.java
  33. 2
      src/main/java/a8k/app/utils/DoubleUtils.java
  34. 2
      src/main/java/a8k/app/utils/IPAddressValidator.java
  35. 2
      src/main/java/a8k/app/utils/ZloggerRecorder.java
  36. 0
      src/main/java/a8k/config/JacksonCustomizerConfig.java
  37. 4
      src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java
  38. 4
      src/main/java/a8k/extui/page/debug/P02TubeSettingDebugPage.java
  39. 13
      src/main/java/a8k/extui/page/extapp/UsrOperationSimulation.java
  40. 48
      src/main/java/a8k/extui/page/extapp/tools/MoterMoveUtilsPage.java
  41. 25
      src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java
  42. 49
      src/main/java/a8k/extui/page/miniservo/MiniServoScanerPage.java
  43. 14
      src/main/java/a8k/extui/page/miniservo/P01MiniServoReferencePointIniter.java
  44. 4
      src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java
  45. 21
      src/main/java/a8k/unittest/TestBeforeRun.java
  46. 55
      src/main/java/a8k/unittest/TestOptAnalyzer.java
  47. 2
      src/main/resources/application.yml

2
src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java

@ -15,7 +15,7 @@ import a8k.app.a8ktype.type.ReactionResult;
import a8k.app.a8ktype.opttype.ReactionResultStatus;
import a8k.app.utils.ProjInfo;
import a8k.app.utils.ProjInfoUtils;
import a8k.utils.ZloggerRecorder;
import a8k.app.utils.ZloggerRecorder;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;

212
src/main/java/a8k/app/a8kproj/fakeprojcontext/FakeProjInfoContextFactory.java

@ -1,212 +0,0 @@
package a8k.app.a8kproj.fakeprojcontext;
import a8k.app.a8ktype.opttype.A8kOptX;
import a8k.app.service.data.UtilsProjectColorAllocer;
import a8k.app.dao.db.type.ProjExtInfoCard;
import a8k.app.dao.db.type.OptCfg;
import a8k.app.dao.db.type.ProjectBaseInfo;
import a8k.app.dao.db.type.a8kidcard.A8kNormalFn;
import a8k.app.dao.db.type.a8kidcard.A8kOptFnFormula;
import a8k.app.dao.db.type.a8kidcard.A8kPiecewiseFn;
import a8k.app.dao.db.type.a8kidcard.A8kResultBuilderFn;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kFnType;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kResultUnit;
import a8k.app.utils.ProjBuildinInfo;
import a8k.app.utils.ProjInfo;
import a8k.app.utils.ZDateUtils;
import java.util.ArrayList;
import java.util.List;
public class FakeProjInfoContextFactory {
public static class FakeProjInfoContextCfg {
public String projName;
public String lotId;
public Integer projId;
public Integer updateChipVersion;
public Integer subProjNum;
public String projShortName;
public Integer reactionTemperature;
public String color;
public A8kReactionFlowType reactionFlowType;
public Integer wBloodSampleVolUl;
public Integer serumSampleVolUl;
public Integer shakeTimes;
public Integer bigBufferSampleUl;
public Integer mixLiquidAspirMixingCnt;
public Integer reactionPlateIncubationTimeMin;
public Integer reactionPlateDropletVolUl;
public Boolean expired;
public A8kFnType fnType;
public A8kOptType optType;
public Integer optScanPeakNum;
public Integer optPeakNameAssginRefPeakNum;
}
;
public static FakeProjInfoContextCfg createCfg(String projShortName, Integer projId, A8kReactionFlowType reactionType, Integer subProjNum) {
var val = new FakeProjInfoContextCfg();
val.projName = String.format("%s%04d", projShortName, projId);
val.lotId = String.format("%s001234", projShortName, projId);
val.projId = projId;
val.updateChipVersion = 1;
val.subProjNum = subProjNum;
val.projShortName = projShortName;
val.reactionTemperature = 25;
val.color = UtilsProjectColorAllocer.getProjColor(projId);
val.reactionFlowType = reactionType;
val.wBloodSampleVolUl = 100;
val.serumSampleVolUl = 100;
val.shakeTimes = 2;
val.bigBufferSampleUl = 200;
val.mixLiquidAspirMixingCnt = 1;
val.reactionPlateIncubationTimeMin = 1;
val.reactionPlateDropletVolUl = 50;
val.expired = false;
val.fnType = A8kFnType.NormalFn;
val.optType = A8kOptType.FOPT;
if (projId == 1) {
val.optScanPeakNum = 2;
val.optPeakNameAssginRefPeakNum = 2;
} else {
val.optScanPeakNum = 5;
val.optPeakNameAssginRefPeakNum = 5;
}
return val;
}
/**
* !!! WARNING 这个方法中的数值轻易不要修改后续很多测试代码都是基于这个数值的
*/
private static A8kOptFnFormula buildTestFnFormula(A8kFnType fntyp) {
A8kOptFnFormula formula = new A8kOptFnFormula();
A8kNormalFn a8kNormalFn = new A8kNormalFn();
a8kNormalFn.x = A8kOptX.R;
a8kNormalFn.xMin = 1.0;
a8kNormalFn.xMax = 100.0;
a8kNormalFn.A = 1.0;
a8kNormalFn.B = 1.0;
a8kNormalFn.C = 1.0;
a8kNormalFn.D = 1.0;
a8kNormalFn.lowLimit = 1.0;
a8kNormalFn.upLimit = 100.0;
A8kPiecewiseFn a8kPiecewiseFn = new A8kPiecewiseFn();
a8kPiecewiseFn.judeX = A8kOptX.R;
a8kPiecewiseFn.judeThres = 1.0;
a8kPiecewiseFn.lX = A8kOptX.R;
a8kPiecewiseFn.hX = A8kOptX.R;
a8kPiecewiseFn.xMin = 1.0;
a8kPiecewiseFn.xMax = 100.0;
a8kPiecewiseFn.A0 = 1.0;
a8kPiecewiseFn.B0 = 1.0;
a8kPiecewiseFn.C0 = 1.0;
a8kPiecewiseFn.D0 = 1.0;
a8kPiecewiseFn.A1 = 1.0;
a8kPiecewiseFn.B1 = 1.0;
a8kPiecewiseFn.C1 = 1.0;
a8kPiecewiseFn.D1 = 1.0;
a8kPiecewiseFn.lowLimit = 1.0;
a8kPiecewiseFn.upLimit = 100.0;
A8kResultBuilderFn a8kResultBuilderFn = new A8kResultBuilderFn(); //结果生成函数
a8kResultBuilderFn.ret1Unit = A8kResultUnit.pgPml;
a8kResultBuilderFn.ret2Unit = A8kResultUnit.ngPml;
a8kResultBuilderFn.ret3Unit = A8kResultUnit.ugPml;
a8kResultBuilderFn.toUint2FnA = 2.0;
a8kResultBuilderFn.toUint2FnB = 0.1;
a8kResultBuilderFn.toUint3FnA = 3.0;
a8kResultBuilderFn.toUint3FnB = 0.1;
formula.fnType = fntyp;
//普通函数
if (A8kFnType.NormalFn.equals(fntyp)) {
formula.serumNorFn = a8kNormalFn.clone(); // 血清
formula.bloodNorFn = a8kNormalFn.clone(); // 血浆
}
// 分段函数系数
if (A8kFnType.PiecewiseFn.equals(fntyp)) {
formula.serumPiecewiseFn = a8kPiecewiseFn.clone(); // 血清
formula.bloodPiecewiseFn = a8kPiecewiseFn.clone(); // 血浆
}
//结果
formula.resultBuilderFn = a8kResultBuilderFn.clone(); //结果生成函数
return formula;
}
static public ProjInfo build(FakeProjInfoContextCfg cfg) {
//
// ProjectInfo
//
ProjectBaseInfo projInfo = new ProjectBaseInfo();
projInfo.projId = cfg.projId;
projInfo.projName = cfg.projName;
projInfo.projShortName = cfg.projShortName;
projInfo.subProjNum = cfg.subProjNum;
projInfo.reactionTemperature = cfg.reactionTemperature;
projInfo.color = cfg.color;
projInfo.reactionFlowType = cfg.reactionFlowType;
projInfo.wBloodSampleVolUl = cfg.wBloodSampleVolUl;
projInfo.serumSampleVolUl = cfg.serumSampleVolUl;
projInfo.shakeTimes = cfg.shakeTimes;
projInfo.bigBufferSampleUl = cfg.bigBufferSampleUl;
projInfo.reactionPlateIncubationTimeMin = cfg.reactionPlateIncubationTimeMin;
projInfo.reactionPlateDropletVolUl = cfg.reactionPlateDropletVolUl;
//
// ProjInfoCard
//
ProjExtInfoCard projExtInfoCard = new ProjExtInfoCard();
projExtInfoCard.projName = cfg.projName;
projExtInfoCard.lotId = cfg.lotId;
if (!cfg.expired) {
projExtInfoCard.expiryDate = ZDateUtils.nextDay();
} else {
projExtInfoCard.expiryDate = ZDateUtils.theDayBeforeYesterday();
}
projExtInfoCard.projId = cfg.projId;
projExtInfoCard.updateChipVersion = cfg.updateChipVersion;
projExtInfoCard.subProjNum = cfg.subProjNum;
for (int i = 0; i < cfg.subProjNum; i++) {
var fnFormula = buildTestFnFormula(cfg.fnType);
projExtInfoCard.projFnFormuals.add(fnFormula);
}
//
// ProjOptInfo
//
List<OptCfg> optCfgList = new ArrayList<>();
for (int i = 0; i < cfg.subProjNum; i++) {
OptCfg optCfg = new OptCfg();
optCfg.projId = cfg.projId;
optCfg.projName = cfg.projName;
optCfg.subProjIndex = i;
optCfg.subProjName = String.format("SUBPROJ_%d", i);
optCfg.subProjShortName = String.format("SP%d", i);
optCfg.optType = cfg.optType;
optCfg.optScanRange = 250;
optCfg.optScanPeakNum = cfg.optScanPeakNum;
optCfg.peakNameRefNum = cfg.optPeakNameAssginRefPeakNum;
optCfgList.add(optCfg);
}
return new ProjInfo(new ProjBuildinInfo(projInfo, optCfgList), projExtInfoCard);
}
}

1
src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java

@ -10,7 +10,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class A8kOptXGetter {
private static final Logger log = LoggerFactory.getLogger(A8kOptXGetter.class);
static class Context {
OptCfg optcfg;

3
src/main/java/a8k/config/A8kCanBusConnectionConfig.java → src/main/java/a8k/app/config/A8kCanBusConnectionConfig.java

@ -1,7 +1,6 @@
package a8k.config;
package a8k.app.config;
import a8k.app.hardware.basedriver.A8kCanBusConnection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

2
src/main/java/a8k/config/CorsConfig.java → src/main/java/a8k/app/config/CorsConfig.java

@ -1,4 +1,4 @@
package a8k.config;
package a8k.app.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;

2
src/main/java/a8k/config/SpringDocConfig.java → src/main/java/a8k/app/config/SpringDocConfig.java

@ -1,4 +1,4 @@
package a8k.config;
package a8k.app.config;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;

2
src/main/java/a8k/config/WebSocketConfiguration.java → src/main/java/a8k/app/config/WebSocketConfiguration.java

@ -1,4 +1,4 @@
package a8k.config;
package a8k.app.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

3
src/main/java/a8k/app/hardware/basedriver/A8kCanBusService.java

@ -121,6 +121,9 @@ public class A8kCanBusService {
Boolean firstReadIO = priGetIOState(ioid);
Boolean secondReadIO = priGetIOState(ioid);
if (firstReadIO == secondReadIO) {
if(ioid.mirror){
return !firstReadIO;
}
return firstReadIO;
} else {
log.warn("getIOState {} not match, retry", ioid);

18
src/main/java/a8k/app/hardware/driver/MiniServoDriver.java

@ -29,6 +29,23 @@ public class MiniServoDriver {
canBus.callcmd(id.mid, CmdId.mini_servo_enable, enable);
}
public void miniServoForceEnable(MiniServoMId id, int enable) {
try {
miniServoEnable(id, enable);
} catch (AppException e) {
logger.error("miniServoForceEnable error", e);
}
}
public Boolean miniServoPing(MiniServoMId id) {
try {
miniServoReadPos(id);
} catch (AppException e) {
return false;
}
return true;
}
public int miniServoReadPos(MiniServoMId id) throws AppException {
var packet = canBus.callcmd(id.mid, CmdId.mini_servo_read_pos);
return packet.getContentI32(0);
@ -98,7 +115,6 @@ public class MiniServoDriver {
}
public void miniServoWaitIsNotMove(MiniServoMId id, int acitionOvertime) throws AppException {
long startedAt = System.currentTimeMillis();
do {

6
src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java

@ -105,7 +105,7 @@ public class StepMotorCtrlDriver {
public Integer stepMotorReadPosByMoveToZeroBlock(StepMotorMId id, Integer actionOvertime) throws AppException {
stepMotorEnable(id, 1);
stepMotorEasyMoveToZeroBlock(id, actionOvertime);
Integer nowpos = stepMotorReadPos(id);
Integer nowpos = stepMotorReadPos(id);
Integer measurepos = -canBus.moduleGetReg(id.mid, RegIndex.kreg_step_motor_dpos) + nowpos;
stepMotorEnable(id, 0);
return measurepos;
@ -143,6 +143,10 @@ public class StepMotorCtrlDriver {
canBus.waitForMod(id.mid, actionOvertime);
}
public Boolean isHasMoveToZero(StepMotorMId id) throws AppException {
return getReg(id, StepMotorRegIndex.kreg_step_motor_has_move_zero) != 0;
}
public void setReg(StepMotorMId id, StepMotorRegIndex regIndex, Integer val) throws AppException {
canBus.moduleSetReg(id.mid, regIndex.regIndex, val);
}

1
src/main/java/a8k/app/hardware/driver/type/StepMotorRegIndex.java

@ -13,6 +13,7 @@ public enum StepMotorRegIndex {
kreg_step_motor_pos(RegIndex.kreg_step_motor_pos), // 机器人x坐标
kreg_step_motor_is_enable(RegIndex.kreg_step_motor_is_enable), // 是否使能
kreg_step_motor_dpos(RegIndex.kreg_step_motor_dpos), // 执行完上一条指令后的相对位移
kreg_step_motor_has_move_zero(RegIndex.kreg_step_motor_has_move_zero), // 是否已经移动到零点
// kreg_step_motor_shift(RegIndex.kreg_step_motor_shift), // x偏移
kreg_step_motor_shaft(RegIndex.kreg_step_motor_shaft), // x轴是否反转
kreg_step_motor_one_circle_pulse(RegIndex.kreg_step_motor_one_circle_pulse), // x轴一圈脉冲数

13
src/main/java/a8k/app/hardware/initializer/A8kModParamInitializer.java

@ -8,6 +8,7 @@ import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.driver.type.MiniServoMId;
import a8k.app.hardware.driver.type.PipetteRegIndex;
import a8k.app.hardware.driver.type.StepMotorMId;
import a8k.app.hardware.driver.type.StepMotorRegIndex;
import a8k.app.service.bases.AppEventBusService;
import a8k.app.a8ktype.appevent.A8kCanBusOnConnectEvent;
import a8k.app.a8ktype.appevent.AppEvent;
@ -58,6 +59,18 @@ public class A8kModParamInitializer {
* 2.如果电机没有配备编码则每次调用moveQuickToZeroPoint都会进行一次位置检查
*/
stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModClampingM, StepMotorRegIndex.kreg_step_motor_look_zero_edge_speed, 50);//
stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModClampingM, StepMotorRegIndex.kreg_step_motor_run_to_zero_speed, 50);//
stepMotorCtrlDriver.setReg(StepMotorMId.PlatesBoxYM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 20);//板夹仓前后移动
stepMotorCtrlDriver.setReg(StepMotorMId.PlatesBoxPusherM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 20);//板夹仓推板
stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModGripperZM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 200);//摇匀模组Z轴
stepMotorCtrlDriver.setReg(StepMotorMId.FeedingModXM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 40);//进料模组X轴
stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 400);//转盘
pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse, 20);
//光学电机步进单位设置,默认是 1574803 调大拉伸波形调小拉伸波形
// canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kreg_step_motor_one_circle_pulse, 1550000);
canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kreg_step_motor_one_circle_pulse, 1590000);

34
src/main/java/a8k/app/hardware/type/a8kcanprotocol/IOId.java

@ -1,26 +1,26 @@
package a8k.app.hardware.type.a8kcanprotocol;
public enum IOId {
TubeHeightPPS(ModuleType.kboard, MId.FeedingModBoard, 0), //高低试管检测IO
THChOuterPPS(ModuleType.kboard, MId.FeedingModBoard, 1),//试管架转移通道有无检测
THChInterPPS(ModuleType.kboard, MId.FeedingModBoard, 2),//试管架转移通道有无检测
OutfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 3),//试管出料位置 试管架有无检测
TubeExistPPS(ModuleType.kboard, MId.FeedingModBoard, 4),//试管有无光电
InfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 5),//试管架入料位置 试管架有无检测
TubeHeightPPS(ModuleType.kboard, MId.FeedingModBoard, 0, false), //高低试管检测IO
THChOuterPPS(ModuleType.kboard, MId.FeedingModBoard, 1, false),//试管架转移通道有无检测
THChInterPPS(ModuleType.kboard, MId.FeedingModBoard, 2, false),//试管架转移通道有无检测
OutfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 3, false),//试管出料位置 试管架有无检测
TubeExistPPS(ModuleType.kboard, MId.FeedingModBoard, 4, false),//试管有无光电
InfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 5, false),//试管架入料位置 试管架有无检测
RecycleBinOverflowPPS(ModuleType.kboard, MId.PlatesBoxTCMBoard, 2),//废料桶满溢检测
RecycleBinOverflowPPSPowerCtrl(ModuleType.kboard, MId.PlatesBoxTCMBoard, 0),//废料桶光栅电源
RecycleBinOverflowPPS(ModuleType.kboard, MId.PlatesBoxTCMBoard, 2, false),//废料桶满溢检测
RecycleBinOverflowPPSPowerCtrl(ModuleType.kboard, MId.PlatesBoxTCMBoard, 0, false),//废料桶光栅电源
PlateBoxCoverClosurePPS(ModuleType.kboard, MId.PlatesBoxBoard, 0),//板夹仓舱盖闭合检测
PlateBoxPlateStuckPPS(ModuleType.kboard, MId.PlatesBoxBoard, 1),//板夹仓卡板检测
PlateBoxCoverClosurePPS(ModuleType.kboard, MId.PlatesBoxBoard, 0, true),//板夹仓舱盖闭合检测
PlateBoxPlateStuckPPS(ModuleType.kboard, MId.PlatesBoxBoard, 1, false),//板夹仓卡板检测
//转盘逻辑相关光电
//钩板电机零点光电终点光电
PullerMZeroPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 0),//
PullerMEndPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 1),//
PullerMZeroPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 0, false),//
PullerMEndPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 1, false),//
//推板电机零点光电终点光电
PusherMZeroPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 0),//
PusherMEndPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 1),//
PusherMZeroPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 0, false),//
PusherMEndPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 1, false),//
;
@ -28,11 +28,15 @@ public enum IOId {
final public ModuleType mtype;
final public MId mid;
final public int ioIndex;
final public boolean mirror;
IOId(ModuleType mtype, MId mid, int ioIndex) {
IOId(ModuleType mtype, MId mid, int ioIndex, boolean mirror) {
this.mtype = mtype;
this.mid = mid;
this.ioIndex = ioIndex;
this.mirror = mirror;
}
}

25
src/main/java/a8k/app/hardware/type/regindex/RegIndex.java

@ -39,18 +39,18 @@ public enum RegIndex {
kreg_pipette_capactitance_val(4001), // 移液枪电容值
kreg_pipette_tip_state(4002, false), // 移动液枪tip状态
// kreg_pipette_limit_ul(4051), //
// kreg_pipette_pump_acc(4052), //
// kreg_pipette_pump_dec(4053), //
// kreg_pipette_pump_vstart(4054), //
// kreg_pipette_pump_vstop(4055), //
// kreg_pipette_pump_vmax(4056), //
// kreg_pipette_aspirate_distribut_pump_vel(4057), //
// kreg_pipette_lld_pump_vel(4058), //
// kreg_pipette_lld_motor_vel_rpm(4059), //
// kreg_pipette_lld_detect_period_ms(4060), //
// kreg_pipette_lld_prepare_pos(4061), //
// kreg_pipette_lld_prepare_distribut_pos(4062), //
// kreg_pipette_limit_ul(4051), //
// kreg_pipette_pump_acc(4052), //
// kreg_pipette_pump_dec(4053), //
// kreg_pipette_pump_vstart(4054), //
// kreg_pipette_pump_vstop(4055), //
// kreg_pipette_pump_vmax(4056), //
// kreg_pipette_aspirate_distribut_pump_vel(4057), //
// kreg_pipette_lld_pump_vel(4058), //
// kreg_pipette_lld_motor_vel_rpm(4059), //
// kreg_pipette_lld_detect_period_ms(4060), //
// kreg_pipette_lld_prepare_pos(4061), //
// kreg_pipette_lld_prepare_distribut_pos(4062), //
kreg_pipette_zm_pos(4101),
kreg_pipette_zm_is_enable(4102),
@ -151,6 +151,7 @@ public enum RegIndex {
kreg_step_motor_pos(10101), // 机器人x坐标
kreg_step_motor_is_enable(10102), // 是否使能
kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移
kreg_step_motor_has_move_zero(10104), // 是否回零
kreg_step_motor_shift(10150), // x偏移
kreg_step_motor_shaft(10151), // x轴是否反转
kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数

2
src/main/java/a8k/app/service/background/TemperatureCtrlService.java

@ -7,7 +7,7 @@ import a8k.app.a8ktype.exception.AppException;
import a8k.app.service.bases.AppEventBusService;
import a8k.app.service.setting.AppSettingsMgrService;
import a8k.app.hardware.driver.TemperatureControlDriver;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;

2
src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java

@ -18,7 +18,7 @@ import a8k.app.dao.db.type.ProjExtInfoCard;
import a8k.app.a8ktype.db.CommonPage;
import a8k.app.utils.ProjBuildinInfo;
import a8k.app.utils.ZAppChecker;
import a8k.utils.DoubleUtils;
import a8k.app.utils.DoubleUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

5
src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java

@ -2,17 +2,16 @@ package a8k.app.service.lowerctrl;
import a8k.app.hardware.driver.CodeScanerDriver;
import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.type.ConsumableOneChRawResult;
import a8k.app.a8ktype.device.Pos2d;
import a8k.app.a8ktype.exception.AppException;
import a8k.utils.DoAction;
import a8k.app.utils.DoAction;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Component
public class ConsumablesScanCtrlService {

4
src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java

@ -16,7 +16,7 @@ import a8k.app.hardware.driver.type.StepMotorMId;
import a8k.app.service.background.BackgroudProcessCtrlService;
import a8k.app.service.bases.AppEventBusService;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.others.CheckPointType;
import a8k.app.a8ktype.others.checkpoint.CheckResult;
import a8k.app.a8ktype.others.checkpoint.Checkpoint;
@ -74,7 +74,7 @@ public class DeviceInitCtrlService {
@Resource
HbotMoveCtrlService hbotMoveCtrlService;
Integer actionOvertime = 10000;
Integer actionOvertime = 20000;
List<Checkpoint> checkPoints = new ArrayList<>();

1
src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java

@ -104,6 +104,7 @@ public class TubeFeedingCtrlService {
logger.info("弹出试管架");
moveTubeRackToExitPos();
try {
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModOutfeedM, 1000, 1000);
stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1);
OS.hsleep(2500);
for (int i = 0; i < outfeedOvertime / 100; i++) {

6
src/main/java/a8k/app/service/lowerctrl/TubeFeedingExCtrlService.java

@ -40,9 +40,9 @@ public class TubeFeedingExCtrlService {
* @throws AppException 硬件异常
*/
public void moveTubeRackTo(Integer pos, TargetPosMeasureDirection moveDiretion, Boolean moveToZero) throws AppException {
if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) {
throw new AppException(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS);
}
// if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) {
// throw new AppException(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS);
// }
//打开扫码夹具
scanClampModRelease();

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC10ErrorReactionPlateProcesser.java

@ -6,7 +6,7 @@ import a8k.app.service.statemgr.IncubationPlateStateMgrService;
import a8k.app.service.statemgr.OptScanModuleStateMgrService;
import a8k.app.a8ktype.state.IncubationSubTank;
import a8k.app.service.lowerctrl.OptScanModuleCtrlService;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ZList;

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java

@ -10,7 +10,7 @@ import a8k.app.a8ktype.state.IncubationSubTank;
import a8k.app.a8ktype.state.ProjectTaskContext;
import a8k.app.service.lowerctrl.OptScanModuleCtrlService;
import a8k.app.utils.ZList;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ProjInfoUtils;

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java

@ -13,7 +13,7 @@ import a8k.app.service.statemgr.ProjectContextMgrService;
import a8k.app.a8ktype.state.ProjectTaskContext;
import a8k.app.service.lowerctrl.OptScanModuleCtrlService;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.factory.FakeReactionResultFactory;
import a8k.app.a8ktype.type.ReactionResult;
import a8k.app.a8ktype.error.AppError;

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30EjectTubeHolder.java

@ -5,7 +5,7 @@ import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.service.statemgr.TubeStateMgrService;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ZList;

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java

@ -17,7 +17,7 @@ import a8k.app.a8ktype.state.enumtype.TubeState;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;
import a8k.app.service.bases.AppEventBusService;
import a8k.app.a8ktype.appevent.AppWarningNotifyEvent;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.type.TubeHolderScanResult;
import a8k.app.a8ktype.error.AETubeError;
import a8k.app.a8ktype.error.AppError;

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30SwitchToNextTubeTake.java

@ -4,7 +4,7 @@ import a8k.app.service.mainctrl.mainflowctrl.base.A8kActionTask;
import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.app.service.statemgr.TubeStateMgrService;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ZList;

4
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java

@ -16,11 +16,11 @@ import a8k.app.service.mainctrl.erroranalyzer.ErrorProcessor;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType;
import a8k.app.utils.ActionTaskPool;
import a8k.app.utils.ZList;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.exception.ZAppInterruptException;
import a8k.utils.DoAction;
import a8k.app.utils.DoAction;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

3
src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java

@ -1,6 +1,5 @@
package a8k.app.service.mainctrl.mainflowctrl.processer;
import a8k.app.service.mainctrl.TubeHolderSettingMgrService;
import a8k.app.service.mainctrl.mainflowctrl.base.IMainFlowStateChangeProcesser;
import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.app.service.statemgr.*;
@ -9,7 +8,7 @@ import a8k.app.a8ktype.state.enumtype.IncubationSubTankState;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.service.lowerctrl.OptScanModuleCtrlService;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;
import a8k.teststate.VirtualDevice;
import a8k.app.teststate.VirtualDevice;
import a8k.app.a8ktype.exception.AppException;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;

2
src/main/java/a8k/app/service/setting/AppSettingsMgrService.java

@ -9,7 +9,7 @@ import a8k.app.dao.db.type.LISSetting;
import a8k.app.dao.db.type.appsetting.AppSettingName;
import a8k.app.dao.db.type.appsetting.settingenum.*;
import a8k.app.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.utils.IPAddressValidator;
import a8k.app.utils.IPAddressValidator;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;

3
src/main/java/a8k/teststate/TestStateMgrService.java → src/main/java/a8k/app/teststate/TestStateMgrService.java

@ -1,7 +1,6 @@
package a8k.teststate;
package a8k.app.teststate;
import a8k.app.a8ktype.type.ConsumableOneChRawResult;
import a8k.app.a8ktype.type.TubeHolderScanResult;
import a8k.app.service.lowerctrl.ConsumablesScanCtrlService;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;

8
src/main/java/a8k/teststate/VirtualDevice.java → src/main/java/a8k/app/teststate/VirtualDevice.java

@ -1,17 +1,11 @@
package a8k.teststate;
package a8k.app.teststate;
import a8k.OS;
import a8k.app.a8ktype.DeviceRunMode;
import a8k.app.dao.db.type.ProjExtInfoCard;
import a8k.app.a8ktype.type.ConsumableOneChRawResult;
import a8k.app.a8ktype.type.TubeHolderScanResult;
import a8k.app.service.bases.UIMessage;
import a8k.app.service.statemgr.GStateMgrService;
import jakarta.annotation.Resource;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Slf4j

6
src/main/java/a8k/utils/DoAction.java → src/main/java/a8k/app/utils/DoAction.java

@ -1,10 +1,8 @@
package a8k.utils;
package a8k.app.utils;
import a8k.SpringBootBeanUtil;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.service.bases.UIMessage;
import a8k.teststate.VirtualDevice;
import jakarta.annotation.Resource;
import a8k.app.teststate.VirtualDevice;
import lombok.extern.slf4j.Slf4j;
@Slf4j

2
src/main/java/a8k/utils/DoubleUtils.java → src/main/java/a8k/app/utils/DoubleUtils.java

@ -1,4 +1,4 @@
package a8k.utils;
package a8k.app.utils;
public class DoubleUtils {
public static boolean equals(double a, double b) {

2
src/main/java/a8k/utils/IPAddressValidator.java → src/main/java/a8k/app/utils/IPAddressValidator.java

@ -1,4 +1,4 @@
package a8k.utils;
package a8k.app.utils;
import java.util.regex.Pattern;

2
src/main/java/a8k/utils/ZloggerRecorder.java → src/main/java/a8k/app/utils/ZloggerRecorder.java

@ -1,4 +1,4 @@
package a8k.utils;
package a8k.app.utils;
import org.slf4j.Logger;

0
src/main/java/a8k/config/JacksonCustomizerConfig.java

4
src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java

@ -1,15 +1,12 @@
package a8k.extui.page.debug;
import a8k.app.a8ktype.DeviceRunMode;
import a8k.app.a8ktype.device.ConsumableGroup;
import a8k.app.a8ktype.device.TipGroup;
import a8k.app.a8ktype.device.consumables.LarBottleGroup;
import a8k.app.a8ktype.device.consumables.LittBottleGroup;
import a8k.app.a8ktype.device.consumables.ReactionPlateGroup;
import a8k.app.a8ktype.device.consumables.Tips;
import a8k.app.a8ktype.error.ConsumablesScanReportErrorType;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.type.ConsumablesOneChannelScanResultPacket;
import a8k.app.a8ktype.type.ConsumablesScanReport;
import a8k.app.a8ktype.type.ConsumablesScanResultPacket;
import a8k.app.dao.db.type.ProjExtInfoCard;
@ -21,7 +18,6 @@ import a8k.app.service.statemgr.ConsumablesMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
import a8k.teststate.TestStateMgrService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

4
src/main/java/a8k/extui/page/debug/P02TubeSettingDebugPage.java

@ -1,17 +1,13 @@
package a8k.extui.page.debug;
import a8k.app.a8ktype.device.A8kTubeHolderType;
import a8k.app.a8ktype.device.BloodType;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.type.TubeHolderScanResult;
import a8k.app.a8ktype.type.TubesScanResult;
import a8k.app.a8ktype.ui.TubeHolderSetting;
import a8k.app.a8ktype.ui.TubeSetting;
import a8k.app.service.mainctrl.TubeHolderSettingMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
import a8k.teststate.TestStateMgrService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;

13
src/main/java/a8k/extui/page/extapp/UsrOperationSimulation.java

@ -1,22 +1,12 @@
package a8k.extui.page.extapp;
import a8k.app.a8ktype.DeviceRunMode;
import a8k.app.a8ktype.device.A8kTubeHolderType;
import a8k.app.a8ktype.device.ConsumableGroup;
import a8k.app.a8ktype.device.TipGroup;
import a8k.app.a8ktype.device.consumables.LarBottleGroup;
import a8k.app.a8ktype.device.consumables.LittBottleGroup;
import a8k.app.a8ktype.device.consumables.ReactionPlateGroup;
import a8k.app.a8ktype.device.consumables.Tips;
import a8k.app.a8ktype.error.ConsumablesScanReportErrorType;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.type.ConsumablesScanReport;
import a8k.app.a8ktype.type.ConsumablesScanResultPacket;
import a8k.app.a8ktype.type.TubeHolderScanResult;
import a8k.app.a8ktype.type.TubesScanResult;
import a8k.app.dao.db.type.ProjExtInfoCard;
import a8k.app.factory.ProjExtInfoCardFactory;
import a8k.app.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.lowerctrl.ProjIDCardCtrlAndMonitorService;
@ -24,8 +14,7 @@ import a8k.app.service.mainctrl.AppConsumablesScanService;
import a8k.app.service.statemgr.ConsumablesMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
import a8k.teststate.TestStateMgrService;
import a8k.app.teststate.TestStateMgrService;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

48
src/main/java/a8k/extui/page/extapp/tools/MoterMoveUtilsPage.java

@ -0,0 +1,48 @@
package a8k.extui.page.extapp.tools;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.hardware.driver.MiniServoDriver;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.driver.type.StepMotorMId;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class MoterMoveUtilsPage {
@Resource
ExtApiPageMgr extApiPageMgr;
static final Integer overtime = 10000;
@Resource
StepMotorCtrlDriver stepMotorCtrlDriver;
@Resource
MiniServoDriver miniServoDriver;
public void clampALittle(Integer dpos) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, dpos, overtime);
}
public void unclampALittle(Integer dpos) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, -dpos, overtime);
}
@PostConstruct
public void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("摇匀模组-试管夹紧电机");
page.addFunction("夹紧一点", this::clampALittle).setParamVal("dpos", () -> 5);
page.addFunction("松开一点", this::unclampALittle).setParamVal("dpos", 5);
extApiPageMgr.addPage(page);
}
}

25
src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java

@ -15,7 +15,7 @@ public class FeedingModMeasurePage {
@Resource
ExtApiPageMgr extApiPageMgr;
static final Integer overtime = 10000;
static final Integer overtime = 20000;
@Resource
@ -29,23 +29,38 @@ public class FeedingModMeasurePage {
Integer moveByDistance = 100;
public Integer measureFeedingModXMPos() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM,1);
if (stepMotorCtrlDriver.isHasMoveToZero(StepMotorMId.FeedingModXM)) {
return stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.FeedingModXM);
}
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1);
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.FeedingModXM, overtime);
}
public void moveRight(Integer moveByDistance) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM,1);
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, -moveByDistance, overtime);
this.moveByDistance = moveByDistance;
}
public void moveLeft(Integer moveByDistance) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM,1);
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, moveByDistance, overtime);
this.moveByDistance = moveByDistance;
}
public void moveTo(Integer pos) throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1);
if (!stepMotorCtrlDriver.isHasMoveToZero(StepMotorMId.FeedingModXM)) {
stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.FeedingModXM, overtime);
}
stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.FeedingModXM, pos, overtime);
}
public void freedomRun() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 0);
}
@PostConstruct
public void init() {
@ -55,6 +70,8 @@ public class FeedingModMeasurePage {
page.addFunction("向右移动", this::moveRight).setParamVal("moveByDistance", () -> moveByDistance);
page.addFunction("向左移动", this::moveLeft).setParamVal("moveByDistance", () -> moveByDistance);
page.addFunction("测量位置", this::measureFeedingModXMPos);
page.addFunction("移动到指定位置", this::moveTo);
page.addFunction("Freedom", this::freedomRun);
extApiPageMgr.addPage(page);
}

49
src/main/java/a8k/extui/page/miniservo/MiniServoScanerPage.java

@ -0,0 +1,49 @@
package a8k.extui.page.miniservo;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.hardware.driver.MiniServoDriver;
import a8k.app.hardware.driver.type.MiniServoMId;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class MiniServoScanerPage {
@Resource
MiniServoDriver miniServoDriver;
public Object scan() throws AppException {
Boolean shakeModGripperSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModGripperSV);
Boolean shakeModGripperYSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModGripperYSV);
Boolean shakeModTubeScanerClampingSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModTubeScanerClampingSV);
Boolean shakeModTubeScanerRotateSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModTubeScanerRotateSV);
Map<String, Boolean> state = new HashMap<>();
state.put("摇匀模组-夹爪", shakeModGripperSVState);
state.put("摇匀模组-Y轴", shakeModGripperYSVState);
state.put("入料模组-扫码夹紧", shakeModTubeScanerClampingSVState);
state.put("入料模组-扫码旋转", shakeModTubeScanerRotateSVState);
return state;
}
@Resource
ExtApiPageMgr extApiPageMgr;
@PostConstruct
public void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("基础");
page.addFunction("扫描", this::scan);
extApiPageMgr.addPage(page);
}
}

14
src/main/java/a8k/extui/page/extsetting/pos_calibration/P01MiniServoReferencePointIniter.java → src/main/java/a8k/extui/page/miniservo/P01MiniServoReferencePointIniter.java

@ -1,4 +1,4 @@
package a8k.extui.page.extsetting.pos_calibration;
package a8k.extui.page.miniservo;
import a8k.extui.mgr.ExtApiPageMgr;
@ -17,16 +17,16 @@ public class P01MiniServoReferencePointIniter {
public void disableMotor() throws AppException {
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 0);
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 0);
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 0);
miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 0);
miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 0);
miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 0);
}
public void enableMotor() throws AppException {
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1);
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1);
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 1);
miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 1);
miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 1);
miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 1);
}

4
src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java

@ -40,7 +40,7 @@ public class MotorCtrlPage {
public void stepMotorEasyMoveToZero() throws AppException {
stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(id, 10000);
stepMotorCtrlDriver.stepMotorEasyMoveToZero(id);
}
public void stepMotorEasyMoveForward() throws AppException {
@ -67,7 +67,7 @@ public class MotorCtrlPage {
page.newGroup("基础操作");
page.addFunction("使能电机", this::enableMotor);
page.addFunction("失能电机", this::disableMotor);
page.addFunction("快速归零", this::stepMotorEasyMoveToZero);
page.addFunction("归零", this::stepMotorEasyMoveToZero);
page.newGroup("相对移动");
page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos);

21
src/main/java/a8k/unittest/TestBeforeRun.java

@ -1,21 +0,0 @@
package a8k.unittest;
import a8k.app.service.param.pipetteparam.PipetteGunLLDParamMgr;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class TestBeforeRun {
@Resource
PipetteGunLLDParamMgr pipetteGunLLDParamMgr;
@PostConstruct
void init() {
// LldType lddType = pipetteGunLLDParamMgr.getLLDType(PipetteGunLLDTypeParam.DEFAULT_LLD_TYPE);
// Assert.isTrue(lddType != null, "LldType is null");
}
}

55
src/main/java/a8k/unittest/TestOptAnalyzer.java

@ -1,55 +0,0 @@
package a8k.unittest;
import a8k.app.a8kproj.A8kReactionResultComputer;
import a8k.app.a8kproj.fakeprojcontext.FakeProjInfoContextFactory;
import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult;
import a8k.app.a8ktype.state.SampleInfo;
import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType;
import a8k.app.a8ktype.type.ReactionResult;
import a8k.app.utils.ProjInfo;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TestOptAnalyzer {
@FunctionalInterface
public interface TEST {
Boolean test();
}
public Boolean TEST_OPT_RESULT_PARSE_01() {
var cfg = FakeProjInfoContextFactory.createCfg("TEST_PROJ", 2, A8kReactionFlowType.SampleAndBS, 3);
ProjInfo projInfoContext = FakeProjInfoContextFactory.build(cfg);
SampleInfo sampleInfo = new SampleInfo();
OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult();
optAlgoAnalysResult.pdR = 1.0;
optAlgoAnalysResult.pdAR = 1.0;
optAlgoAnalysResult.pdATR = 1.0;
optAlgoAnalysResult.pdRFR = 1.0;
optAlgoAnalysResult.pdT4R = 1.0;
optAlgoAnalysResult.pdT4T3R = 1.0;
ReactionResult result = A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, 0, optAlgoAnalysResult);
log.info("result: {}", result);
return true;
}
void test(String mark, TEST test) {
Boolean suc = test.test();
if (suc) {
log.info("TEST: {} -> SUCCESS", mark);
} else {
log.error("TEST: {} -> FAILED", mark);
}
}
@PostConstruct
void init() {
test("TEST_OPT_RESULT_PARSE_01", this::TEST_OPT_RESULT_PARSE_01);
}
}

2
src/main/resources/application.yml

@ -2,7 +2,7 @@ server:
port: 80
#device.runmode: "RealMode"
a8k.enableTemperatureCtrl: true
a8k.enableTemperatureCtrl: false
device.runmode: "RealMode"

Loading…
Cancel
Save