Browse Source

重构部分代码

master
zhaohe 2 months ago
parent
commit
207a8c9147
  1. 19
      errorlog/error1.log
  2. 20
      errorlog/error2.log
  3. 12
      src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceCtrlControler.java
  4. 39
      src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceInitControler.java
  5. 2
      src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java
  6. 8
      src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java
  7. 2
      src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java
  8. 7
      src/main/java/a8k/app/service/background/FrontEndMessageBoxAndEventMgr.java
  9. 284
      src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java
  10. 3
      src/main/java/a8k/app/service/mainctrl/AppDeviceMainFlowCtrlService.java
  11. 23
      src/main/java/a8k/app/service/mainctrl/DeviceInitService.java
  12. 12
      src/main/java/a8k/app/service/mainctrl/MainFlowCtrlScheduler.java
  13. 33
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/A8kActionTask.java
  14. 31
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/AppActionErrorContext.java
  15. 14
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/IMainFlowStateChangeProcesser.java
  16. 13
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/MainFlowProcesser.java
  17. 99
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java
  18. 2
      src/main/java/a8k/app/service/module/SamplePreProcessModule.java
  19. 9
      src/main/java/a8k/app/service/peripheral_ctrl/PrinterService.java
  20. 12
      src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java
  21. 10
      src/main/java/a8k/app/service/statemgr/consumables_mgr/TipStateMgr.java
  22. 2
      src/main/java/a8k/app/type/BoolCondition.java
  23. 15
      src/main/java/a8k/app/type/a8k/state/DeviceWorkState.java
  24. 18
      src/main/java/a8k/app/type/appevent/DoA8kStepActionEvent.java
  25. 2
      src/main/java/a8k/app/utils/ActionTaskPool.java
  26. 2
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  27. 20
      src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java
  28. 3
      src/main/java/a8k/extui/page/driver/PrinterDebugPage.java
  29. 11
      src/main/java/a8k/extui/page/extapp/A8kOptVerification.java
  30. 7
      src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java
  31. 2
      src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java
  32. 26
      src/main/java/a8k/extui/page/init/DeviceInitPage.java
  33. 13
      src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java
  34. 6
      src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java

19
errorlog/error1.log

@ -1,19 +0,0 @@
13:33:54.560 [http-nio-80-exec-8] INFO a.a.s.m.AppDeviceCtrlService - [startWork,24] - 开始工作
13:33:54.562 [http-nio-80-exec-8] INFO a.a.s.m.m.MainFlowCtrlScheduler - [txInfo,12] - 核对TIP1头数量
13:33:54.563 [http-nio-80-exec-8] INFO a.a.s.l.HbotMoveExCtrlService - [checkIfTipExist,99] - checkIfTipExist groupId:0 index:0
13:33:54.570 [http-nio-80-exec-8] INFO a.a.s.l.HbotMoveCtrlService - [hbotMoveTo,67] - hbot move to:(11680, 1138, 805)
13:33:58.565 [http-nio-80-exec-8] ERROR a.a.h.c.A8kCanBusConnection - [autoReSend,208] - send cmd [CMD ] index:[999] (liquid_operation_set_gun_runparams PipetteMod(82) :param:[14,14,0,1000,8000]) A0517452E703140E0000000E00000000000000E8030000401F00001B fail, retry 0
13:34:03.038 [MainFlowCtrlScheduler] INFO a.a.s.m.m.MainFlowCtrlScheduler - [tryDoAction,174] - ================== AC20ScanReactionPlate ===================
13:34:03.039 [MainFlowCtrlScheduler] INFO a.a.s.m.m.MainFlowCtrlScheduler - [tryDoAction,175] - = AC20ScanReactionPlate -> DO ACTION:
13:34:03.040 [MainFlowCtrlScheduler] INFO a.a.s.s.OptScanModuleStateMgrService - [changeOptScanModuleStateToScanning,76] - 光学模块: 状态->开始扫描
13:34:03.043 [MainFlowCtrlScheduler] INFO a.a.s.m.m.a.AC20ScanReactionPlate - [doAction,121] - 扫描板夹
13:34:03.044 [MainFlowCtrlScheduler] ERROR a.a.s.m.m.MainFlowCtrlScheduler - [onWorking,193] - error Cannot invoke "a8k.app.type.a8k.state.ProjectTaskContext.getProjBuildinInfo()" because "cxt" is null
java.lang.NullPointerException: Cannot invoke "a8k.app.type.a8k.state.ProjectTaskContext.getProjBuildinInfo()" because "cxt" is null
at a8k.app.service.mainctrl.mainflowctrl.action.AC20ScanReactionPlate.doOptScanXX(AC20ScanReactionPlate.java:88)
at a8k.app.service.mainctrl.mainflowctrl.action.AC20ScanReactionPlate.doAction(AC20ScanReactionPlate.java:122)
at a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler.tryDoAction(MainFlowCtrlScheduler.java:176)
at a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler.onWorking(MainFlowCtrlScheduler.java:190)
at a8k.app.service.mainctrl.mainflowctrl.MaConnection to 192.168.8.10 closed by remote host.java:294)
Connection to 192.168.8.10 closed.ead.run(Thread.java:1583)
PS D:\java_workspace\a8000> ^Cduler] INFO a.a.s.b.AppEventBusService - [pushEvent,46] - pushEvent: AppPromptEvent a8k.app.type.appevent.AppPromptEvent@3b24ca29
PS D:\java_workspace\a8000> heduler] INFO a.a.s.s.TubeStateMgrService - [resetAll,384] - 重置所有试管状态

20
errorlog/error2.log

@ -1,20 +0,0 @@
13:40:10.205 [MainFlowCtrlScheduler] WARN a.a.s.l.TubeFeedingExCtrlService - [scanClampModRelease,84] - DISABLE SCAN CLAMPING SERVO
13:40:10.340 [MainFlowCtrlScheduler] ERROR a.a.h.c.A8kCanBusService - [waitForMod,124] - ShakeModLiftingSV waitting for action mini_servo_move_to , catch error LOW_ERROR_SUBDEVICE_OVERTIME, defail ecode 0
13:40:10.353 [MainFlowCtrlScheduler] ERROR a.a.s.m.m.a.AC30ScanTubeHolderTask - [doAction,243] - error {"code":"LOW_ERROR_SUBDEVICE_OVERTIME","type":"AEHardwareError","exmsg":null,"mid":"ShakeModLiftingSV","cmdId":"mini_servo_move_to","rawtxcmd":null,"rawrxcmd":null}
a8k.app.type.exception.AppException: {"code":"LOW_ERROR_SUBDEVICE_OVERTIME","type":"AEHardwareError","exmsg":null,"mid":"ShakeModLiftingSV","cmdId":"mini_servo_move_to","rawtxcmd":null,"rawrxcmd":null}
at a8k.app.type.exception.AppException.of(AppException.java:49)
at a8k.app.hardware.channel.A8kCanBusService.waitForMod(A8kCanBusService.java:125)
at a8k.app.hardware.driver.MiniServoDriver.miniServoMoveToBlock(MiniServoDriver.java:90)
at a8k.app.hardware.driver.MiniServoDriver.miniServoMoveToZeroBlock(MiniServoDriver.java:57)
at a8k.app.service.lowerctrl.TubeFeedingExCtrlService.moveTubeRackTo(TubeFeedingExCtrlService.java:53)
at a8k.app.service.lowerctrl.TubeFeedingCtrlService.moveAndjudgeTubeExist(TubeFeedingCtrlService.java:227)
at a8k.app.service.lowerctrl.TubeFeedingCtrlService.scanTubeHodler(TubeFeedingCtrlService.java:254)
at a8k.app.service.lowerctrl.TubeFeedingCtrlService.enterAndScanTubeHodler(TubeFeedingCtrlService.java:296)
at a8k.app.service.mainctrl.mainflowctrl.action.AC30ScanTubeHolderTask.doScanHolder(AC30ScanTubeHolderTask.java:184)
at a8k.app.service.mainctrl.mainflowctrl.action.AC30ScanTubeHolderTask.priDoAction(AC30ScanTubeHolderTask.java:206)
at a8k.app.service.mainctrl.mainflowctrl.action.AC30ScanTubeHolderTask.doAction(AC30ScanTubeHolderTask.java:241)
at a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler.tryDoAction(MainFlowCtrlScheduler.java:176)
at a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler.onWorking(MainFlowCtrlScheduler.java:190)
at a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler.workFn(MainFlowCtrlScheduler.java:294)
at java.base/java.lang.Thread.run(Thread.java:1583)
13:40:10.359 [MainFlowCtrlScheduler] INFO a.a.s.b.AppEventBusService

12
src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceCtrlControler.java

@ -1,6 +1,6 @@
package a8k.app.controler.api.v1.app.ctrl;
import a8k.app.service.mainctrl.AppDeviceCtrlService;
import a8k.app.service.mainctrl.AppDeviceMainFlowCtrlService;
import a8k.app.type.ui.ApiRet;
import a8k.app.type.exception.AppException;
import io.swagger.v3.oas.annotations.Operation;
@ -20,7 +20,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
public class DeviceCtrlControler {
@Resource
AppDeviceCtrlService appDeviceCtrlService;
AppDeviceMainFlowCtrlService appDeviceMainFlowCtrlService;
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// EXT FUNC
@ -32,28 +32,28 @@ public class DeviceCtrlControler {
@Operation(description = "开始工作")
@PostMapping("/startWork")
public ApiRet<Void> startWork() throws AppException {
appDeviceCtrlService.startWork();
appDeviceMainFlowCtrlService.startWork();
return ApiRet.success();
}
@Operation(description = "停止工作")
@PostMapping("/stopWork")
public ApiRet<Void> stopWork() throws AppException {
appDeviceCtrlService.stopWork();
appDeviceMainFlowCtrlService.stopWork();
return ApiRet.success();
}
@Operation(description = "暂停工作")
@PostMapping("/pauseWork")
public ApiRet<Void> pauseWork() throws AppException {
appDeviceCtrlService.pauseWork();
appDeviceMainFlowCtrlService.pauseWork();
return ApiRet.success();
}
@Operation(description = "继续工作")
@PostMapping("/continueWork")
public ApiRet<Void> continueWork() throws AppException {
appDeviceCtrlService.continueWork();
appDeviceMainFlowCtrlService.continueWork();
return ApiRet.success();
}

39
src/main/java/a8k/app/controler/api/v1/app/ctrl/DeviceInitControler.java

@ -1,7 +1,6 @@
package a8k.app.controler.api.v1.app.ctrl;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.mainctrl.DeviceInitService;
import a8k.app.service.mainctrl.AppDeviceInitCtrlService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.exception.AppException;
import a8k.app.type.ui.ApiRet;
@ -21,27 +20,27 @@ import org.springframework.web.bind.annotation.ResponseBody;
@ResponseBody
@RequiredArgsConstructor
public class DeviceInitControler {
private final DeviceInitService deviceInitService;
private final GStateMgrService gStateMgrService;
private final AppDeviceInitCtrlService deviceInitService;
private final GStateMgrService gStateMgrService;
@Operation(description = "初始化设备")
@PostMapping("/initDevice")
public ApiRet<?> initDevice() throws AppException {
deviceInitService.initDeviceAsync();
return ApiRet.success();
}
@Operation(description = "初始化设备")
@PostMapping("/initDevice")
public ApiRet<?> initDevice() throws AppException {
deviceInitService.initDeviceAsync();
return ApiRet.success();
}
@Operation(description = "获取设备初始化状态")
@PostMapping("/getDeviceInitedTaskState")
public ApiRet<DeviceMoveToZeroCtrlService.State> getDeviceInitedTaskState() {
return ApiRet.success(deviceInitService.getDeviceInitedTaskState());
}
@Operation(description = "获取设备初始化状态")
@PostMapping("/getDeviceInitedTaskState")
public ApiRet<AppDeviceInitCtrlService.State> getDeviceInitedTaskState() {
return ApiRet.success(deviceInitService.getState());
}
@Operation(description = "获取设备是否完成启动")
@PostMapping("/isBoardParamInited")
public ApiRet<Boolean> isBoardParamInited() {
return ApiRet.success(gStateMgrService.getBoardParamInited());
}
@Operation(description = "获取设备是否完成启动")
@PostMapping("/isBoardParamInited")
public ApiRet<Boolean> isBoardParamInited() {
return ApiRet.success(gStateMgrService.getBoardParamInited());
}
}

2
src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java

@ -1,7 +1,7 @@
package a8k.app.controler.api.v1.app.data;
import a8k.app.service.data.ReactionRecordMgrService;
import a8k.app.service.peripheral.PrinterService;
import a8k.app.service.peripheral_ctrl.PrinterService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.dao.type.db.ReactionReport;
import a8k.app.type.ui.ApiRet;

8
src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java

@ -7,7 +7,7 @@ import a8k.app.type.appevent.AppTubeholderSettingUpdateEvent;
import a8k.app.dao.type.db.AppUser;
import a8k.app.service.background.AppEventBusService;
import a8k.app.service.data.AppUserMgrService;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.mainctrl.AppDeviceInitCtrlService;
import a8k.app.service.mainctrl.TubeHolderSettingMgrService;
import a8k.app.service.statemgr.*;
import a8k.app.service.background.FrontEndMessageBoxAndEventMgr;
@ -30,9 +30,9 @@ import java.util.Objects;
@Slf4j
public class AppWebSocketEndpointMgr {
@Resource
private AppUserMgrService appUserMgrService;
private AppUserMgrService appUserMgrService;
@Resource
private DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
private AppDeviceInitCtrlService appDeviceInitCtrlService;
public static class Report {
@ -187,7 +187,7 @@ public class AppWebSocketEndpointMgr {
deviceContext.runMode = gstate.getDeviceRunMode();
deviceContext.loginFlag = appUserMgrService.getLoginUsr() != null;
deviceContext.loginUser = appUserMgrService.getLoginUsr();
deviceContext.deviceInitedFlag = deviceMoveToZeroCtrlService.getState().deviceInited;
deviceContext.deviceInitedFlag = appDeviceInitCtrlService.getState().deviceInited;
deviceContext.fatalErrorFlag = deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag;
reportState("DeviceContext", deviceContext);
}

2
src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java

@ -27,7 +27,7 @@ public class CodeScanerDriver {
}
public String pipetteModCodeScannerScanCode() throws AppException {
return pipetteModCodeScannerScanCode(300);
return pipetteModCodeScannerScanCode(1000);
}
public void pipetteModCodeScannerStartScan() throws AppException {

7
src/main/java/a8k/app/service/background/FrontEndMessageBoxAndEventMgr.java

@ -52,9 +52,6 @@ public class FrontEndMessageBoxAndEventMgr {
return event; //前端需要更新IDcard的状态
} else if (event instanceof AppTubeholderSettingUpdateEvent) {
return null;//不再上报直接从websocket上报消息
} else if (event instanceof DoA8kStepActionEvent) {
// return new MessageBoxUpdateEvent(((DoA8kStepActionEvent) event).actionStepName);
return null;
}
/*
@ -101,10 +98,6 @@ public class FrontEndMessageBoxAndEventMgr {
}
synchronized void processEventInternal(AppEvent event) {
if (event instanceof DoA8kStepActionEvent e) {
pushMessageBox(new MessageBox(MessageLevel.Info, e.actionStepName));
}
}
synchronized public void onAppEvent(AppEvent event) {

284
src/main/java/a8k/app/service/lowerctrl/DeviceMoveToZeroCtrlService.java → src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java

@ -1,19 +1,20 @@
package a8k.app.service.lowerctrl;
package a8k.app.service.mainctrl;
import a8k.app.hardware.driver.*;
import a8k.app.hardware.type.*;
import a8k.app.service.lowerctrl.HbotMoveCtrlService;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;
import a8k.app.service.lowerctrl.TubePreProcesModuleCtrlService;
import a8k.app.type.ui.ZAppPromopt;
import a8k.app.type.ui.ZAppPromoptFormsItem;
import a8k.app.type.ui.MessageLevel;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.hardware.channel.A8kCanBusService;
import a8k.app.service.background.AppEventBusService;
import a8k.app.teststate.VirtualDevice;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -24,20 +25,15 @@ import java.util.List;
@Component
@Slf4j
@RequiredArgsConstructor
public class DeviceMoveToZeroCtrlService {
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2;
public class AppDeviceInitCtrlService {
public static class Checkpoint {
public enum Type {
CHECK_TUBE_XCHANNEL_IS_EMPTY,//入料通道是否为空
CHECK_TUBE_X_CHANNEL_IS_EMPTY,//入料通道是否为空
CHECK_PLATE_BOX_IS_COVER,//板夹仓盖子是否盖着
CHECK_PLATE_STUCK_DETECTOR_SENSOR1_IS_TRIGGER,//板夹仓卡板检测
CHECK_PLATE_STUCK_DETECTOR_SENSOR2_IS_TRIGGER,//板夹仓卡板检测
CHECK_PULLERM_IS_IN_ZEROPOS,//检查拉杆电机是否在零点位置
CHECK_PUSHERM_IN_IN_ZEROPOS,//检查推杆电机是否在零点位置
CHECK_PULLER_MOTOR_IS_IN_ZERO_POS,//检查拉杆电机是否在零点位置
CHECK_PUSHER_MOTOR_IN_IN_ZERO_POS,//检查推杆电机是否在零点位置
CHECK_RECYCLE_BIN_IS_OVERFLOW,//检查垃圾箱是否满
}
@ -65,99 +61,170 @@ public class DeviceMoveToZeroCtrlService {
}
public static class State {
public Boolean deviceInited = false;
public Boolean isBusy = false;
public Boolean passed = false;
public ZAppPromopt promopt;
public Boolean deviceInited = false; //设备是否已经被初始化
public Boolean isBusy = false; //是否正在初始化
public Boolean passed = false; //设备自检是否通过
public ZAppPromopt promopt; //设备初始化报告
}
private final GStateMgrService gstate;
private final VirtualDevice virtualDevice;
private final AppEventBusService appEventBusService;
private final GStateMgrService gstate;
private final VirtualDevice virtualDevice;
//
// Driver
//
private final A8kCanBusService canBus;
private final InputDetectDriver inputDetectDriver;
private final MiniServoDriver miniServoDriver;
private final StepMotorCtrlDriver stepMotorCtrlDriver;
private final PipetteCtrlDriverV2 pipetteCtrlDriver;
//
// ExDriver
//
private final ModuleEnableCtrlDriver moduleEnableCtrlDriver;
private final InputDetectDriver inputDetectDriver;
private final MiniServoDriver miniServoDriver;
private final StepMotorCtrlDriver stepMotorCtrlDriver;
private final PipetteCtrlDriverV2 pipetteCtrlDriverV2;
private final ModuleEnableCtrlDriver moduleEnableCtrlDriver;
//
// Service
//
private final TubeFeedingCtrlService tubeFeedingCtrlService;
private final TubePreProcesModuleCtrlService tubePreProcesModuleCtrlService;
private final HbotMoveExCtrlService hbotMoveExCtrlService;
private final HbotMoveCtrlService hbotMoveCtrlService;
private final HbotMoveCtrlService hbotMoveCtrlService;
List<Checkpoint> checkPoints = new ArrayList<>();
private final List<Checkpoint> checkPoints = new ArrayList<>();
private final State state = new State();
private Thread workThread;
public List<CheckResult> checkResults;
Thread workThread;
@Getter
State state = new State();
public List<CheckResult> checkResults;
@PostConstruct
void init() {
// checkPoints.add(new Checkpoint("检查入料通道是否为空",//
// CheckPointType.CHECK_TUBE_XCHANNEL_IS_EMPTY, () -> !inputDetectDriver.getIOState(InputIOId.THChInterPPS) && !inputDetectDriver.getIOState(InputIOId.THChOuterPPS)));
checkPoints.add(new Checkpoint("检查板夹仓盖子是否盖上",//
Checkpoint.Type.CHECK_PLATE_BOX_IS_COVER, () -> inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS)));
checkPoints.add(new Checkpoint("检测孵育盘入口是否卡板",//
Checkpoint.Type.CHECK_PLATE_STUCK_DETECTOR_SENSOR1_IS_TRIGGER, () -> !inputDetectDriver.getIOState(InputIOId.IncubationPlateInletStuckPPS)));
checkPoints.add(new Checkpoint("检测孵育盘出口是否卡板",//
Checkpoint.Type.CHECK_PLATE_STUCK_DETECTOR_SENSOR2_IS_TRIGGER, () -> !inputDetectDriver.getIOState(InputIOId.IncubationPlateOutletStuckPPS)));
// checkPoints.add(new Checkpoint("检查拉杆电机是否在零点位置",//
// CheckPointType.CHECK_PULLERM_IS_IN_ZEROPOS, () -> inputDetectDriver.getIOState(InputIOId.PullerMZeroPPS)));
// checkPoints.add(new Checkpoint("检查推杆电机是否在零点位置",//
// CheckPointType.CHECK_PUSHERM_IN_IN_ZEROPOS, () -> inputDetectDriver.getIOState(InputIOId.PusherMZeroPPS)));
synchronized public State getState() {
return state;
}
/**
* 使能所有电机
* @throws AppException e
*/
public void enableAllMotor() throws AppException {
moduleEnableCtrlDriver.enableAllMotor();
}
/**
* 失能所有电机
* @throws AppException e
*/
public void disableAllMotor() throws AppException {
moduleEnableCtrlDriver.forceDisableAllMotor();
}
// disableAllMiniServo
//enableAllMiniServo
/**
* 失能所有舵机
* @throws AppException e
*/
public void disableAllMiniServo() throws AppException {
for (MiniServoMId miniServoMId : MiniServoMId.values()) {
miniServoDriver.miniServoEnable(miniServoMId, 0);
}
}
/**
* 使能所有舵机
* @throws AppException e
*/
public void enableAllMiniServo() throws AppException {
for (MiniServoMId miniServoMId : MiniServoMId.values()) {
miniServoDriver.miniServoEnable(miniServoMId, 1);
}
}
public void moveAllMotorToZero() throws AppException {
/**
* 设备初始化(同步操作)
* @return 设备自检结果
* @throws AppException e
*/
synchronized public List<CheckResult> initDevice() throws AppException {
try {
return doDeviceMoveToZero();
} catch (AppException e) {
throw e;
}
}
/**
* 设备初始化(异步操作)
* @throws AppException e
*/
synchronized public void initDeviceAsync() throws AppException {
if (workThread != null && workThread.isAlive()) {
throw AppException.ofAECodeError("设备正在初始化中");
}
if (!gstate.getBoardParamInited()) {
throw AppException.of(A8kEcode.DEVICE_STARTUP_IN_PROGRESS);
}
if (workThread != null) {
try {
workThread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
workThread = new Thread(() -> {
log.info("设备初始化开始");
state.isBusy = true;
state.passed = false;
state.deviceInited = false;
try {
checkResults = initDevice();
for (CheckResult checkResult : checkResults) {
if (!checkResult.pass) {
throw AppException.of(A8kEcode.APPE_DEVICE_INIT_CHECK_FAIL);
}
}
state.passed = true;
state.deviceInited = true;
state.promopt = ZAppPromoptFactory.buildNotifyPromopt("设备初始化成功");
} catch (AppException e) {
state.passed = false;
state.deviceInited = false;
if (e.getError().code.equals(A8kEcode.APPE_DEVICE_INIT_CHECK_FAIL)) {
state.promopt = buildAppPromopt(checkResults);
} else {
state.promopt = ZAppPromoptFactory.buildAppPromopt(e);
}
}
state.isBusy = false;
log.info("设备初始化结束");
});
workThread.start();
}
//******************************************************************************************
// PRIVATE
//******************************************************************************************
@PostConstruct
private void init() {
// checkPoints.add(new Checkpoint("检查入料通道是否为空",//
// CheckPointType.CHECK_TUBE_XCHANNEL_IS_EMPTY, () -> !inputDetectDriver.getIOState(InputIOId.THChInterPPS) && !inputDetectDriver.getIOState(InputIOId.THChOuterPPS)));
checkPoints.add(new Checkpoint("检查板夹仓盖子是否盖上",//
Checkpoint.Type.CHECK_PLATE_BOX_IS_COVER, () -> inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS)));
checkPoints.add(new Checkpoint("检测孵育盘入口是否卡板",//
Checkpoint.Type.CHECK_PLATE_STUCK_DETECTOR_SENSOR1_IS_TRIGGER, () -> !inputDetectDriver.getIOState(InputIOId.IncubationPlateInletStuckPPS)));
checkPoints.add(new Checkpoint("检测孵育盘出口是否卡板",//
Checkpoint.Type.CHECK_PLATE_STUCK_DETECTOR_SENSOR2_IS_TRIGGER, () -> !inputDetectDriver.getIOState(InputIOId.IncubationPlateOutletStuckPPS)));
// checkPoints.add(new Checkpoint("检查拉杆电机是否在零点位置",//
// CheckPointType.CHECK_PULLERM_IS_IN_ZEROPOS, () -> inputDetectDriver.getIOState(InputIOId.PullerMZeroPPS)));
// checkPoints.add(new Checkpoint("检查推杆电机是否在零点位置",//
// CheckPointType.CHECK_PUSHERM_IN_IN_ZEROPOS, () -> inputDetectDriver.getIOState(InputIOId.PusherMZeroPPS)));
}
private void moveAllMotorToZero() throws AppException {
moduleEnableCtrlDriver.enableAllMotor();
try {
log.info("HbotZ轴回零");
pipetteCtrlDriver.zMotorMoveZeroBlock();
pipetteCtrlDriverV2.zMotorMoveZeroBlock();
log.info("HBot回零");
hbotMoveCtrlService.moveToZero();
//进出料初始化
@ -206,16 +273,8 @@ public class DeviceMoveToZeroCtrlService {
}//HBot初始化
}
Boolean firstInit = true;
void doSomeThingWhenError() throws AppException {
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1);
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, 5);
moduleEnableCtrlDriver.forceDisableAllMotor();
}
List<CheckResult> doDeviceMoveToZero() throws AppException {
private List<CheckResult> doDeviceMoveToZero() throws AppException {
List<CheckResult> results = checkBeforeInitDevice();
if (virtualDevice.isEnable()) {
@ -234,11 +293,6 @@ public class DeviceMoveToZeroCtrlService {
moveAllMotorToZero();
//弹出无效物料
if (firstInit) {
firstInit = false;
}
//弹出试管架
tubeFeedingCtrlService.ejectTubeHolder();
tubeFeedingCtrlService.moveTubeRackMoveToEnterPos();
@ -256,78 +310,6 @@ public class DeviceMoveToZeroCtrlService {
}
//
synchronized public List<CheckResult> initDevice() throws AppException {
try {
return doDeviceMoveToZero();
} catch (AppException e) {
//释放试管夹爪
// doSomeThingWhenError();
throw e;
}
}
synchronized public void initDeviceWithException() throws AppException {
List<CheckResult> results = initDevice();
for (CheckResult result : results) {
if (!result.pass) {
throw AppException.ofAECodeError("设备初始化失败: check " + result.info + " fail");
}
}
}
synchronized public State getState() {
return state;
}
synchronized public void initDeviceAsync() throws AppException {
if (workThread != null && workThread.isAlive()) {
throw AppException.ofAECodeError("设备正在初始化中");
}
if (!gstate.getBoardParamInited()) {
throw AppException.of(A8kEcode.DEVICE_STARTUP_IN_PROGRESS);
}
if (workThread != null) {
try {
workThread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
workThread = new Thread(() -> {
log.info("设备初始化开始");
state.isBusy = true;
state.passed = false;
state.deviceInited = false;
try {
checkResults = initDevice();
for (CheckResult checkResult : checkResults) {
if (!checkResult.pass) {
throw AppException.of(A8kEcode.APPE_DEVICE_INIT_CHECK_FAIL);
}
}
state.passed = true;
state.deviceInited = true;
state.promopt = ZAppPromoptFactory.buildNotifyPromopt("设备初始化成功");
} catch (AppException e) {
state.passed = false;
state.deviceInited = false;
if (e.getError().code.equals(A8kEcode.APPE_DEVICE_INIT_CHECK_FAIL)) {
state.promopt = buildAppPromopt(checkResults);
} else {
state.promopt = ZAppPromoptFactory.buildAppPromopt(e);
}
}
state.isBusy = false;
log.info("设备初始化结束");
});
workThread.start();
}
private static ZAppPromopt buildAppPromopt(List<CheckResult> checkResults) {
List<ZAppPromoptFormsItem> detailInfos = new ArrayList<>();

3
src/main/java/a8k/app/service/mainctrl/AppDeviceCtrlService.java → src/main/java/a8k/app/service/mainctrl/AppDeviceMainFlowCtrlService.java

@ -2,7 +2,6 @@ package a8k.app.service.mainctrl;
import a8k.app.engineer.service.qatest.EngineerModeActionCtrlService;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.service.mainctrl.mainflowctrl.MainFlowCtrlScheduler;
import a8k.app.service.statemgr.DeviceWorkStateMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.exception.AppException;
@ -12,7 +11,7 @@ import org.springframework.stereotype.Component;
@Component
@Slf4j
public class AppDeviceCtrlService {
public class AppDeviceMainFlowCtrlService {
@Resource
GStateMgrService gstate;

23
src/main/java/a8k/app/service/mainctrl/DeviceInitService.java

@ -1,23 +0,0 @@
package a8k.app.service.mainctrl;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.type.exception.AppException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
@Slf4j
public class DeviceInitService {
private final DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
public void initDeviceAsync() throws AppException {
log.info("开始初始化设备");
deviceMoveToZeroCtrlService.initDeviceAsync();
}
public DeviceMoveToZeroCtrlService.State getDeviceInitedTaskState() {
return deviceMoveToZeroCtrlService.getState();
}
}

12
src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java → src/main/java/a8k/app/service/mainctrl/MainFlowCtrlScheduler.java

@ -1,7 +1,6 @@
package a8k.app.service.mainctrl.mainflowctrl;
package a8k.app.service.mainctrl;
import a8k.OS;
import a8k.SpringBootBeanUtil;
import a8k.app.engineer.service.state.EngineerModeStateMgrService;
import a8k.app.engineer.service.type.EngineerWorkState;
import a8k.app.service.module.*;
@ -9,30 +8,21 @@ import a8k.app.service.statemgr.*;
import a8k.app.type.DeviceRunMode;
//import a8k.app.a8ktype.appevent.A8kErrorsPromptEvent;
import a8k.app.type.a8k.state.enumtype.A8kWorkTaskType;
import a8k.app.type.error.AECodeError;
import a8k.app.type.error.AppError;
import a8k.app.type.exception.AppException;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.hardware.driver.ModuleEnableCtrlDriver;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.service.background.AppEventBusService;
import a8k.app.service.utils.UISender;
import a8k.app.service.mainctrl.TubeHolderSettingMgrService;
import a8k.app.service.mainctrl.mainflowctrl.base.*;
import a8k.app.utils.ZStringUtils;
import a8k.app.utils.ZWorkThread;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Component
@Slf4j

33
src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/A8kActionTask.java

@ -1,33 +0,0 @@
package a8k.app.service.mainctrl.mainflowctrl.base;
import a8k.app.type.error.AppError;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class A8kActionTask {
public A8kActionTask() {
;
}
public Boolean isReady() {
return false;
}
// 串行
public List<AppError> doAction() {
return new ArrayList<>();
}
public String toString() {
return this.getClass().getSimpleName();
}
public String toDisplayString() {
return this.getClass().getSimpleName();
}
}

31
src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/AppActionErrorContext.java

@ -1,31 +0,0 @@
package a8k.app.service.mainctrl.mainflowctrl.base;
import a8k.app.type.error.AppError;
import java.util.List;
public class AppActionErrorContext {
public A8kActionTask dowhat;
public AppError ecode;
public AppActionErrorContext(A8kActionTask dowhat, AppError ecode) {
this.dowhat = dowhat;
this.ecode = ecode;
}
public Boolean equals(AppActionErrorContext other) {
return this.dowhat.equals(other.dowhat) && this.ecode.code.equals(other.ecode.code);
}
public String toString() {
return String.format("[%s:%s]", dowhat, ecode);
}
static public AppActionErrorContext of(A8kActionTask type, AppError error) {
return new AppActionErrorContext(type, error);
}
static public List<AppActionErrorContext> ofList(A8kActionTask type, List<AppError> errors) {
return errors.stream().map(error -> new AppActionErrorContext(type, error)).toList();
}
}

14
src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/IMainFlowStateChangeProcesser.java

@ -1,14 +0,0 @@
package a8k.app.service.mainctrl.mainflowctrl.base;
import a8k.app.type.exception.AppException;
public interface IMainFlowStateChangeProcesser {
void onStop() throws AppException;
void onPause() throws AppException;
void onResume() throws AppException;
void onStart() throws AppException;
}

13
src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/MainFlowProcesser.java

@ -1,13 +0,0 @@
package a8k.app.service.mainctrl.mainflowctrl.base;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface MainFlowProcesser {
}

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

@ -1,99 +0,0 @@
package a8k.app.service.mainctrl.mainflowctrl.processer;
import a8k.app.service.mainctrl.mainflowctrl.base.IMainFlowStateChangeProcesser;
import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser;
import a8k.app.service.module.TipOperationCtrlModule;
import a8k.app.service.statemgr.*;
import a8k.app.type.a8k.state.IncubationSubTank;
import a8k.app.type.a8k.state.enumtype.IncubationSubTankState;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.service.lowerctrl.OptScanModuleCtrlService;
import a8k.app.service.lowerctrl.TubeFeedingCtrlService;
import a8k.app.teststate.VirtualDevice;
import a8k.app.type.exception.AppException;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@MainFlowProcesser
public class MainFlowStateChangeProcesser implements IMainFlowStateChangeProcesser {
@Resource
VirtualDevice virtualDevice;
@Resource
TubeFeedingCtrlService tubeFeedingCtrlService;
@Resource
HbotMoveExCtrlService hbotMoveExCtrlService;
@Resource
OptScanModuleCtrlService optScanModuleCtrlService;
@Resource
IncubationPlateStateMgr incubationPlateStateMgr;
@Resource
TubeStateMgr tubeStateMgrService;
@Resource
ConsumablesMgrService consumablesMgrService;
@Resource
TipOperationCtrlModule tipOperationCtrlModule;
@Autowired
private DeviceWorkStateMgrService deviceWorkStateMgrService;
void ejectAllPlates() throws AppException {
var tanks = incubationPlateStateMgr.get().subtanks;
for (IncubationSubTank tank : tanks) {
if (!tank.state.equals(IncubationSubTankState.EMPTY)) {
optScanModuleCtrlService.pullPlate(tank.getPos());
optScanModuleCtrlService.dropPlate();
}
}
}
void doClearDevice() throws AppException {
if (virtualDevice.isEnable()) {
virtualDevice.doVirtualThings("清空设备");
return;
}
//光学模组清空
optScanModuleCtrlService.dropPlate();
//弹出所有孵育盘
ejectAllPlates();
//弹出试管架
tubeFeedingCtrlService.ejectTubeHolder();
//丢弃tip头
tipOperationCtrlModule.dropTip();
//hbot快速归零
hbotMoveExCtrlService.moveQuickToZero();
}
@Override
public void onStop() throws AppException {
//物理清空设备
if (!deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag) {
//如果发生了致命错误不执行物理操作
doClearDevice();
}
//清空孵育盘状态
incubationPlateStateMgr.resetAll();
//清空试管状态
tubeStateMgrService.resetAll();
//恢复耗材预定状态
consumablesMgrService.bakAllReserveConsumable();
}
@Override
public void onPause() throws AppException {
}
@Override
public void onResume() throws AppException {
}
@Override
public void onStart() throws AppException {
}
}

2
src/main/java/a8k/app/service/module/SamplePreProcessModule.java

@ -6,7 +6,7 @@ import a8k.app.engineer.service.type.A8kCmdRunnable;
import a8k.app.factory.AppErrorFactory;
import a8k.app.service.lowerctrl.*;
import a8k.app.service.mainctrl.erroranalyzer.ErrorProcessor;
import a8k.app.service.mainctrl.mainflowctrl.base.BoolCondition;
import a8k.app.type.BoolCondition;
import a8k.app.service.module.bean.SamplePreProcessModuleState;
import a8k.app.service.statemgr.*;
import a8k.app.service.utils.UISender;

9
src/main/java/a8k/app/service/peripheral/PrinterService.java → src/main/java/a8k/app/service/peripheral_ctrl/PrinterService.java

@ -1,4 +1,4 @@
package a8k.app.service.peripheral;
package a8k.app.service.peripheral_ctrl;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.dao.type.db.ReactionReport;
@ -7,14 +7,7 @@ import a8k.app.optalgo.type.ReactionResultStatus;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.opt.A8kOptType;
import a8k.app.type.a8k.opt.OptScanResult;
import a8k.app.type.a8k.proj.A8kResultUnit;
import a8k.app.type.a8k.proj.ProjInfo;
import a8k.app.type.a8k.state.SampleInfo;
import a8k.app.type.exception.AppException;
import a8k.extui.factory.FakeOptScanResultFactory;
import a8k.extui.factory.ProjExtInfoCardFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

12
src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java

@ -1,6 +1,5 @@
package a8k.app.service.statemgr;
import a8k.app.service.mainctrl.mainflowctrl.base.AppActionErrorContext;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkTaskType;
@ -23,15 +22,6 @@ public class DeviceWorkStateMgrService {
return deviceWorkState;
}
synchronized public void addError(List<AppActionErrorContext> errorList) {
deviceWorkState.ecodeList.addAll(errorList);
}
synchronized public void addError(AppActionErrorContext error) {
deviceWorkState.ecodeList.add(error);
}
synchronized public Boolean isMayHaveNewTubeHolder() {
return deviceWorkState.mayHaveNewTubeHolder;
}
@ -73,7 +63,7 @@ public class DeviceWorkStateMgrService {
synchronized public void clearFatalErrorFlag() {
gstate.clearFatalError();
deviceWorkState.ecodeList.clear();
deviceWorkState.fatalErrorFlag = false;
}
synchronized public void setConsumeNotEnoughErrorFlag() {

10
src/main/java/a8k/app/service/statemgr/consumables_mgr/TipStateMgr.java

@ -7,6 +7,7 @@ import a8k.app.type.a8k.container.TipContainer;
import a8k.app.type.a8k.pos.TipGroupPos;
import a8k.app.type.a8k.pos.TipPos;
import a8k.app.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -19,6 +20,14 @@ public class TipStateMgr {
public TipContainer[] tips = new TipContainer[3];
@PostConstruct
void init() {
for (int i = 0; i < tips.length; i++) {
tips[i] = new TipContainer();
tips[i].tipNum = 0;
}
}
/**
* 申请Tip
* @return Tip坐标
@ -55,6 +64,7 @@ public class TipStateMgr {
if (num > AppConstant.TIP_NUM) {
throw AppException.of(A8kEcode.CODEERROR, "设置Tip数量超出范围");
}
log.info("setTipNum: group={}, num={}", group, num);
tips[group.ordinal()].tipNum = num;
}

2
src/main/java/a8k/app/service/mainctrl/mainflowctrl/base/BoolCondition.java → src/main/java/a8k/app/type/BoolCondition.java

@ -1,4 +1,4 @@
package a8k.app.service.mainctrl.mainflowctrl.base;
package a8k.app.type;
import a8k.OS;
import a8k.app.type.exception.ZAppInterruptException;

15
src/main/java/a8k/app/type/a8k/state/DeviceWorkState.java

@ -1,6 +1,5 @@
package a8k.app.type.a8k.state;
import a8k.app.service.mainctrl.mainflowctrl.base.AppActionErrorContext;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkTaskType;
import a8k.app.utils.ZJsonHelper;
@ -15,23 +14,19 @@ import java.util.List;
public class DeviceWorkState implements Serializable {
@Schema(description = "设备工作状态")
public A8kWorkState workState = A8kWorkState.IDLE; //
public A8kWorkState workState = A8kWorkState.IDLE; //
@Schema(description = "设备运行任务类型")
public A8kWorkTaskType workTaskType = A8kWorkTaskType.None; //当前工作任务类型
public A8kWorkTaskType workTaskType = A8kWorkTaskType.None; //当前工作任务类型
@Schema(description = "设备错误标志")
public Boolean fatalErrorFlag = false; //错误标志
@Schema(description = "错误列表")
public List<AppActionErrorContext> ecodeList = new ArrayList<>();
public Boolean fatalErrorFlag = false; //错误标志
@Schema(description = "当前状态是否切换完成")
public Boolean isPending() {
return stopActionPending || pauseActionPending || resumeActionPending || startActionPending;
}
public Boolean consumeNotEnoughErrorFlag = false;
public Boolean tipNotEnoughErrorFlag = false;
public Boolean consumeNotEnoughErrorFlag = false; //耗材不足标识位
public Boolean tipNotEnoughErrorFlag = false; //tip不足标识位
/**
*

18
src/main/java/a8k/app/type/appevent/DoA8kStepActionEvent.java

@ -1,18 +0,0 @@
package a8k.app.type.appevent;
import a8k.app.service.mainctrl.mainflowctrl.base.A8kActionTask;
public class DoA8kStepActionEvent extends AppEvent {
public A8kActionTask actionStep;
public String actionStepName;
public DoA8kStepActionEvent(A8kActionTask actionStep) {
super(DoA8kStepActionEvent.class.getSimpleName());
this.actionStep = actionStep;
this.actionStepName = actionStep.toDisplayString();
}
public String toString() {
return actionStep.toString();
}
}

2
src/main/java/a8k/app/utils/ActionTaskPool.java

@ -5,7 +5,7 @@ import a8k.app.type.error.AECodeError;
import a8k.app.type.error.AppError;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.service.mainctrl.mainflowctrl.base.BoolCondition;
import a8k.app.type.BoolCondition;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;

2
src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java

@ -94,7 +94,7 @@ public class ExtApiPageGroupCfgMgr {
new Menu(ReactionRecordMgrDebugPage.class, "反应记录")
)),
new Menu(A8kSubModuleParameterInitDebugPage.class, "子模块初始化参数"),
new Menu(A8kSubModuleConfigDebugPage.class, "子模块配置初始化"),
new Menu(A8kSubModuleConfigDebugPage.class, "子模块配置初始化(移液枪专用)"),
new Menu("坐标设置", ZList.of(
new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"),
new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"),

20
src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java

@ -2,8 +2,8 @@ package a8k.extui.page.debug;
import a8k.app.service.background.SensorDataUpdateService;
import a8k.app.service.background.TemperatureCtrlService;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.mainctrl.AppDeviceCtrlService;
import a8k.app.service.mainctrl.AppDeviceInitCtrlService;
import a8k.app.service.mainctrl.AppDeviceMainFlowCtrlService;
import a8k.app.service.statemgr.DeviceWorkStateMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.a8k.state.DeviceWorkState;
@ -30,16 +30,16 @@ public class P00MainflowCtrlServiceDebugPage {
@Resource
DeviceWorkStateMgrService deviceWorkStateMgrService;
@Resource
GStateMgrService gStateMgrService;
GStateMgrService gStateMgrService;
//
// Ctrl
//
@Resource
AppDeviceCtrlService appDeviceCtrlService;
AppDeviceMainFlowCtrlService appDeviceMainFlowCtrlService;
@Resource
DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
AppDeviceInitCtrlService appDeviceInitCtrlService;
@Resource
TemperatureCtrlService temperatureCtrlService;
TemperatureCtrlService temperatureCtrlService;
@Resource
SensorDataUpdateService sensorDataUpdateService;
@ -63,19 +63,19 @@ public class P00MainflowCtrlServiceDebugPage {
public void start() throws AppException {
appDeviceCtrlService.startWork();
appDeviceMainFlowCtrlService.startWork();
}
public void stop() throws AppException {
appDeviceCtrlService.stopWork();
appDeviceMainFlowCtrlService.stopWork();
}
public void pause() throws AppException {
appDeviceCtrlService.pauseWork();
appDeviceMainFlowCtrlService.pauseWork();
}
public void continueWork() throws AppException {
appDeviceCtrlService.continueWork();
appDeviceMainFlowCtrlService.continueWork();
}
public ExtApiCurve getIncubateBoxTemperatureCurve() {

3
src/main/java/a8k/extui/page/driver/PrinterDebugPage.java

@ -2,11 +2,10 @@ package a8k.extui.page.driver;
import a8k.OS;
import a8k.app.hardware.channel.PrinterUartChannel;
import a8k.app.service.peripheral.PrinterService;
import a8k.app.service.peripheral_ctrl.PrinterService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

11
src/main/java/a8k/extui/page/extapp/A8kOptVerification.java

@ -6,7 +6,7 @@ import a8k.app.type.a8k.opt.OptScanResult;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.state.SampleInfo;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.mainctrl.AppDeviceInitCtrlService;
import a8k.extui.factory.A8kScanCurveFactory;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.type.a8k.proj.ProjInfo;
@ -38,7 +38,7 @@ import java.util.Map;
public class A8kOptVerification {
@Resource
DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
AppDeviceInitCtrlService appDeviceInitCtrlService;
@Resource
PlateBoxCtrlService plateBoxCtrlService;
@ -82,8 +82,6 @@ public class A8kOptVerification {
@PostConstruct
void init() throws NoSuchMethodException {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.newGroup("测试工具");
page.addFunction("测试初始化", this::testInit);
page.newGroup("环境配置");
page.addFunction("设置血液类型", this::setBloodType);
@ -104,11 +102,6 @@ public class A8kOptVerification {
page.addFunction("进行一次光学扫描(自动推板,丢板)", this::autoScanAndDownloadScanResult);
extApiPageMgr.addPage(page);
}
public void testInit() throws AppException {
deviceMoveToZeroCtrlService.initDeviceWithException();
}
public Map<String, String> getProjInfoBreifList() throws AppException {
var allproj = projInfoMgrService.getAllProjBuildInInfo();
Map<String, String> result = new java.util.HashMap<>();

7
src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java

@ -5,7 +5,6 @@ import a8k.app.optalgo.type.A8kOptPeakInfo;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.pos.IncubatorPos;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.extui.factory.A8kScanCurveFactory;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ret.A8kScanCurve;
@ -46,7 +45,6 @@ public class OptModuleParamCalibration {
private final OptModuleExtParamsMgr optModuleExtParamsMgr;
private final PlateBoxCtrlService plateBoxCtrlService;
private final OptScanModuleCtrlService optScanModuleCtrlService;
private final DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
private final ProjInfoMgrService projInfoMgrService;
@ -68,10 +66,6 @@ public class OptModuleParamCalibration {
return desc;
}
public void deviceReset() throws AppException {
deviceMoveToZeroCtrlService.initDeviceWithException();
}
//
// 辅助方法
@ -205,7 +199,6 @@ public class OptModuleParamCalibration {
var page = extApiPageMgr.newPage(this);
page.newGroup("基础");
page.addFunction("设备初始化", this::deviceReset);
page.addFunction("推板到光学模组", this::pushOnePlateToOptModule);
page.addFunction("丢板", this::dropPlate);

2
src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java

@ -1,6 +1,6 @@
package a8k.extui.page.extsetting.db;
import a8k.app.service.peripheral.PrinterService;
import a8k.app.service.peripheral_ctrl.PrinterService;
import a8k.app.type.exception.AppException;
import a8k.app.optalgo.type.ReactionResultStatus;
import a8k.app.controler.filemgr.StorageControler;

26
src/main/java/a8k/extui/page/init/DeviceInitPage.java

@ -3,7 +3,7 @@ package a8k.extui.page.init;
import a8k.app.service.statemgr.DeviceWorkStateMgrService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.exception.AppException;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.mainctrl.AppDeviceInitCtrlService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
@ -23,11 +23,9 @@ public class DeviceInitPage {
@Resource
DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
AppDeviceInitCtrlService appDeviceInitCtrlService;
private final DeviceWorkStateMgrService deviceWorkStateMgrService;
@ExtApiStatu(name = "", group = "设备工作模式", order = 1)
public String getDeviceRunMode() {
if (gstate.getDeviceRunMode() == DeviceRunMode.RealMode) {
@ -76,36 +74,31 @@ public class DeviceInitPage {
}
public String moveAllStepMotorToZero() throws AppException {
deviceMoveToZeroCtrlService.moveAllMotorToZero();
return "SUCCESS";
}
public String disableAll() throws AppException {
deviceMoveToZeroCtrlService.disableAllMotor();
appDeviceInitCtrlService.disableAllMotor();
return "已失能所有电机";
}
public String enableAll() throws AppException {
deviceMoveToZeroCtrlService.enableAllMotor();
appDeviceInitCtrlService.enableAllMotor();
return "已使能所有电机";
}
public String disableAllMiniServo() throws AppException {
deviceMoveToZeroCtrlService.disableAllMiniServo();
appDeviceInitCtrlService.disableAllMiniServo();
return "已失能所有舵机";
}
public String enableAllMiniServo() throws AppException {
deviceMoveToZeroCtrlService.enableAllMiniServo();
appDeviceInitCtrlService.enableAllMiniServo();
return "已使能所有舵机";
}
public List<DeviceMoveToZeroCtrlService.CheckResult> initializeDevice() throws AppException {
var ret = deviceMoveToZeroCtrlService.initDevice();
List<DeviceMoveToZeroCtrlService.CheckResult> errorList = new java.util.ArrayList<>();
public List<AppDeviceInitCtrlService.CheckResult> initializeDevice() throws AppException {
var ret = appDeviceInitCtrlService.initDevice();
List<AppDeviceInitCtrlService.CheckResult> errorList = new java.util.ArrayList<>();
for (var checkResult : ret) {
if (!checkResult.pass) {
errorList.add(checkResult);
@ -135,7 +128,6 @@ public class DeviceInitPage {
page.addFunction("清空设备严重错误状态", this::clearFatalError);
page.newGroup("电机使能");
page.addFunction("电机归零", this::moveAllStepMotorToZero);
page.addFunction("使能所有电机", this::enableAll);
page.addFunction("失能所有电机", this::disableAll);

13
src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java

@ -1,29 +1,16 @@
package a8k.extui.page.test.verification;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.hardware.driver.CodeScanerDriver;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.i18n.Internationalization;
import a8k.app.service.background.ProjIDCardCtrlAndMonitorService;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.lowerctrl.HbotMoveCtrlService;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.exception.AppException;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import static a8k.OS.threadSleep;
@Component

6
src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java

@ -5,7 +5,7 @@ import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.i18n.Internationalization;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.mainctrl.AppDeviceInitCtrlService;
import a8k.app.service.background.ProjIDCardCtrlAndMonitorService;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
@ -22,9 +22,9 @@ import java.util.List;
@Slf4j
public class P10ProjejIDCardTestPage {
@Resource
ExtApiPageMgr extApiPageMgr;
ExtApiPageMgr extApiPageMgr;
@Resource
DeviceMoveToZeroCtrlService deviceMoveToZeroCtrlService;
AppDeviceInitCtrlService appDeviceInitCtrlService;
@Resource
ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService;

Loading…
Cancel
Save