From 0248ccf44de80d1a3e3e6af6fdd72bf81627a9a7 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 8 Oct 2024 16:22:50 +0800 Subject: [PATCH] update --- .../a8k/service/appctrl/CondtionMgrService.java | 23 +++++- .../a8k/service/appctrl/MainFlowCtrlService.java | 7 -- .../appctrl/action/base/A8kActionStepType.java | 13 +++- .../appctrl/action/ctrl/DO_CLEAR_ERROR.java | 58 --------------- .../a8k/service/appctrl/action/ctrl/DO_START.java | 2 +- .../errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java | 76 ++++++++++++++++++++ .../errorhandler/DO_PROCESS_ERROR_PLATE.java | 82 +++++++++++++++++++++ .../action/errorhandler/DO_PROCESS_ERROR_TUBE.java | 84 ++++++++++++++++++++++ .../incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java | 82 +++++++++++++++++++++ .../mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 6 +- .../mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 2 +- .../appctrl/action/mainflow/SEQ4_PRE_PROCESS.java | 5 +- .../appctrl/action/mainflow/SEQ5_PROCESS.java | 4 +- .../appctrl/action/mainflow/SEQ6_POST_PROCESS.java | 7 +- .../action/mainflow/SEQ7_EJECT_TUBEHOLDER.java | 3 +- .../appstate/IncubationPlateMgrService.java | 83 +++++++++++++++++++-- .../appstate/OptScanModuleStateMgrService.java | 41 +++++++++++ .../appstate/resource/A8kPublicResourceType.java | 7 +- .../service/appstate/type/IncubationSubTank.java | 2 +- .../a8k/service/appstate/type/OptScanModule.java | 4 +- .../type/state/IncubationSubTankState.java | 1 - .../appstate/type/state/OptScanModuleState.java | 3 +- 22 files changed, 494 insertions(+), 101 deletions(-) delete mode 100644 src/main/java/a8k/service/appctrl/action/ctrl/DO_CLEAR_ERROR.java create mode 100644 src/main/java/a8k/service/appctrl/action/errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java create mode 100644 src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_PLATE.java create mode 100644 src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_TUBE.java create mode 100644 src/main/java/a8k/service/appctrl/action/incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java create mode 100644 src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java diff --git a/src/main/java/a8k/service/appctrl/CondtionMgrService.java b/src/main/java/a8k/service/appctrl/CondtionMgrService.java index 19001bf..5e589ee 100644 --- a/src/main/java/a8k/service/appctrl/CondtionMgrService.java +++ b/src/main/java/a8k/service/appctrl/CondtionMgrService.java @@ -4,8 +4,10 @@ import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.service.appstate.GStateService; import a8k.service.appstate.IncubationPlateMgrService; +import a8k.service.appstate.OptScanModuleStateMgrService; import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.state.A8kWorkState; +import a8k.service.appstate.type.state.IncubationSubTankState; import a8k.service.appstate.type.state.TubeHolderState; import a8k.service.appstate.type.state.TubeState; import a8k.type.exception.AppException; @@ -28,6 +30,9 @@ public class CondtionMgrService { @Resource IncubationPlateMgrService incubationPlateMgrService; + @Resource + OptScanModuleStateMgrService optScanModuleStateMgrService; + Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 try { return canBus.getIOState(IOId.InfeedPPS); @@ -42,7 +47,7 @@ public class CondtionMgrService { } public Boolean isCanDoAction() { - return gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING) && !gstate.mainFlowCtrlState.errorFlag && !gstate.mainFlowCtrlState.workStateChangeFlag; + return gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING) && !gstate.mainFlowCtrlState.errorFlag && !gstate.mainFlowCtrlState.workStateChangeFlag; } @@ -54,6 +59,10 @@ public class CondtionMgrService { return gstate.getCurProcessingTube() == null || gstate.getCurProcessingTube().state.equals(TubeState.PROCESS_COMPLETE); } + public Boolean isOptModuleEmpty() { + return optScanModuleStateMgrService.isEmpty(); + } + public Boolean isTimeToEnterNewTubeHolder() { Boolean cond0 = isCanDoAction(); //试管架处于空闲状态 @@ -127,4 +136,16 @@ public class CondtionMgrService { Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); return cond1 && cond2 && cond3; } + + public Boolean isHasSomeErrorPlatesToBeProcessed() { + return incubationPlateMgrService.isHasSomeErrorPlate(); + } + + public Boolean isHasSomeErrorTubeToBeProcessed() { + Tube tube = gstate.getCurProcessingTube(); + if (tube == null) + return false; + return gstate.getEmergencyTubePos().tube.state.equals(TubeState.ERROR); + } + } diff --git a/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java b/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java index 4c03283..30d08cd 100644 --- a/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java +++ b/src/main/java/a8k/service/appctrl/MainFlowCtrlService.java @@ -47,9 +47,6 @@ public class MainFlowCtrlService { logger.info("className {}", DO_STOP.class.getName()); for (A8kActionStepType actionType : A8kActionStepType.values()) { - if (actionType.equals(A8kActionStepType.DO_CLEAR_ERROR)) { - continue; - } A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class); scheduler.regFn(action); } @@ -134,25 +131,21 @@ public class MainFlowCtrlService { public void startWork() { MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - scheduler.setClearErrorPendingFlag(); state.startActionPending = true; } public void stopWork() { MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - scheduler.setClearErrorPendingFlag(); state.stopActionPending = true; } public void pauseWork() { MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - scheduler.setClearErrorPendingFlag(); state.pauseActionPending = true; } public void continueWork() { MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - scheduler.setClearErrorPendingFlag(); state.resumeActionPending = true; } } diff --git a/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java b/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java index 51142b6..7a023e4 100644 --- a/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java +++ b/src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java @@ -5,7 +5,6 @@ public enum A8kActionStepType { DO_PAUSE,//暂停 DO_STOP, //停止 DO_RESUME,//恢复 - DO_CLEAR_ERROR,//清除错误,特殊动作,无需注册成类型 //mainflow SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 @@ -16,5 +15,15 @@ public enum A8kActionStepType { SEQ6_POST_PROCESS, SEQ7_EJECT_TUBEHOLDER, //弹出试管架 - // + //incubate + PROCESS_INCUBATE_COMPLETED_PLATE,//处理孵育完成的板 + + //OPT + PLATE_OPT_SCAN, + PLATE_OPT_DROP, + + //Error + DO_CLEAR_ERROR_BEFORE_WORK,//在启动前,清除错误 + DO_PROCESS_ERROR_TUBE, + DO_PROCESS_ERROR_PLATE, } diff --git a/src/main/java/a8k/service/appctrl/action/ctrl/DO_CLEAR_ERROR.java b/src/main/java/a8k/service/appctrl/action/ctrl/DO_CLEAR_ERROR.java deleted file mode 100644 index 412c5ea..0000000 --- a/src/main/java/a8k/service/appctrl/action/ctrl/DO_CLEAR_ERROR.java +++ /dev/null @@ -1,58 +0,0 @@ -package a8k.service.appctrl.action.ctrl; - -import a8k.service.appctrl.action.base.A8kActionStepType; -import a8k.service.appctrl.action.base.A8kStepAction; -import a8k.service.appstate.GStateService; -import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.MainFlowCtrlState; -import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; -import a8k.type.exception.AppException; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class DO_CLEAR_ERROR extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_CLEAR_ERROR.class); - - DO_CLEAR_ERROR() { - super(A8kActionStepType.DO_PAUSE); - } - - @Resource - GStateService gstate; - - MainFlowCtrlState mfcs; - - @PostConstruct - void init() { - mfcs = gstate.mainFlowCtrlState; - } - - @Override public void doaction() throws AppException { - - //ProcessErrorBeforeContinue - - - mfcs.errorFlag = false; - mfcs.ecodeList.clear(); - - } - - @Override public Boolean checkCondition() { - Boolean cond1 = mfcs.workStateChangeFlag; - Boolean cond2 = mfcs.errorFlag; - Boolean cond3 = mfcs.workState.equals(A8kWorkState.WORKING); - Boolean cond4 = mfcs.lastWorkState.equals(A8kWorkState.PAUSE) || mfcs.lastWorkState.equals(A8kWorkState.IDLE); - return cond1 && cond2 && cond3 && cond4; - } - - @Override public List getResourceList() { - return List.of(); - } -} diff --git a/src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java b/src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java index fd3bde8..25d1fad 100644 --- a/src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java +++ b/src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java @@ -50,6 +50,6 @@ public class DO_START extends A8kStepAction { } @Override public List getResourceList() { - return List.of(A8kPublicResourceType.SampleTransferXMotor); + return List.of(A8kPublicResourceType.ShakeModule); } } diff --git a/src/main/java/a8k/service/appctrl/action/errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java b/src/main/java/a8k/service/appctrl/action/errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java new file mode 100644 index 0000000..e1a5495 --- /dev/null +++ b/src/main/java/a8k/service/appctrl/action/errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java @@ -0,0 +1,76 @@ +package a8k.service.appctrl.action.errorhandler; + +import a8k.OS; +import a8k.service.appctrl.CondtionMgrService; +import a8k.service.appctrl.action.base.A8kActionStepType; +import a8k.service.appctrl.action.base.A8kStepAction; +import a8k.service.appstate.GStateService; +import a8k.service.appstate.IncubationPlateMgrService; +import a8k.service.appstate.OptScanModuleStateMgrService; +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.service.appstate.type.IncubationSubTank; +import a8k.service.appstate.type.MainFlowCtrlState; +import a8k.service.appstate.type.state.A8kWorkState; +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.service.appstate.type.state.TubeState; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class DO_CLEAR_ERROR_BEFORE_WORK extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(DO_CLEAR_ERROR_BEFORE_WORK.class); + + DO_CLEAR_ERROR_BEFORE_WORK() { + super(A8kActionStepType.DO_CLEAR_ERROR_BEFORE_WORK); + } + + @Resource + GStateService gstate; + @Resource + CondtionMgrService cms; + @Resource + IncubationPlateMgrService incubationPlateMgrService; + @Resource + OptScanModuleStateMgrService optScanModuleStateMgrService; + + MainFlowCtrlState mfcs; + + + @PostConstruct + void init() { + mfcs = gstate.mainFlowCtrlState; + } + + + @Override public void doaction() throws AppException { + + //ProcessErrorBeforeContinue + + + mfcs.errorFlag = false; + mfcs.ecodeList.clear(); + + } + + @Override public Boolean checkCondition() { + Boolean cond1 = mfcs.workStateChangeFlag; + Boolean cond2 = mfcs.errorFlag; + Boolean cond3 = mfcs.workState.equals(A8kWorkState.WORKING); + Boolean cond4 = mfcs.lastWorkState.equals(A8kWorkState.PAUSE) || mfcs.lastWorkState.equals(A8kWorkState.IDLE); + return cond1 && cond2 && cond3 && cond4; + } + + @Override public List getResourceList() { + return List.of( + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.OPTModule, + A8kPublicResourceType.PlatesBoxModule + ); + } +} diff --git a/src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_PLATE.java b/src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_PLATE.java new file mode 100644 index 0000000..d8b635f --- /dev/null +++ b/src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_PLATE.java @@ -0,0 +1,82 @@ +package a8k.service.appctrl.action.errorhandler; + +import a8k.OS; +import a8k.service.appctrl.CondtionMgrService; +import a8k.service.appctrl.action.base.A8kActionStepType; +import a8k.service.appctrl.action.base.A8kStepAction; +import a8k.service.appstate.GStateService; +import a8k.service.appstate.IncubationPlateMgrService; +import a8k.service.appstate.OptScanModuleStateMgrService; +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.service.appstate.type.IncubationSubTank; +import a8k.service.appstate.type.MainFlowCtrlState; +import a8k.service.appstate.type.state.A8kWorkState; +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 处理错误的孵育盘 + */ +@Component +public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(DO_PROCESS_ERROR_PLATE.class); + + DO_PROCESS_ERROR_PLATE() { + super(A8kActionStepType.DO_PROCESS_ERROR_PLATE); + } + + @Resource + GStateService gstate; + @Resource + CondtionMgrService cms; + @Resource + IncubationPlateMgrService incubationPlateMgrService; + @Resource + OptScanModuleStateMgrService optScanModuleStateMgrService; + + MainFlowCtrlState mfcs; + @PostConstruct + void init() { + mfcs = gstate.mainFlowCtrlState; + } + + + + @Override public void doaction() throws AppException { + //ProcessErrorBeforeContinue + + while (true) { + IncubationSubTank errorTank = incubationPlateMgrService.getErrorPlate(); + if (errorTank == null) { + break; + } + logger.info("处理错误板夹:{}", errorTank.pos); + //TODO:推出板夹到光学模组,同时丢弃板夹 + logger.info("推出板夹到光学模组"); + logger.info("丢弃板夹"); + OS.forceSleep(3000); + // + optScanModuleStateMgrService.newPlateToOptScanPos(errorTank); + optScanModuleStateMgrService.dropPlate(); + incubationPlateMgrService.setIncubationPlateState(errorTank.pos, IncubationSubTankState.EMPTY); + } + } + + @Override public Boolean checkCondition() { + Boolean cond1 = cms.isCanDoAction(); + Boolean cond2 = cms.isHasSomeErrorPlatesToBeProcessed(); + Boolean cond3 = cms.isOptModuleEmpty(); + return cond1 && cond2 && cond3; + } + + @Override public List getResourceList() { + return List.of(); + } +} diff --git a/src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_TUBE.java b/src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_TUBE.java new file mode 100644 index 0000000..90baf71 --- /dev/null +++ b/src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_TUBE.java @@ -0,0 +1,84 @@ +package a8k.service.appctrl.action.errorhandler; + +import a8k.OS; +import a8k.service.appctrl.CondtionMgrService; +import a8k.service.appctrl.action.base.A8kActionStepType; +import a8k.service.appctrl.action.base.A8kStepAction; +import a8k.service.appstate.GStateService; +import a8k.service.appstate.IncubationPlateMgrService; +import a8k.service.appstate.OptScanModuleStateMgrService; +import a8k.service.appstate.TubeProcessStateMgrService; +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.service.appstate.type.MainFlowCtrlState; +import a8k.service.appstate.type.Tube; +import a8k.service.appstate.type.state.A8kWorkState; +import a8k.service.appstate.type.state.TubeState; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 处理错误的试管 + */ +@Component +public class DO_PROCESS_ERROR_TUBE extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(DO_PROCESS_ERROR_TUBE.class); + + DO_PROCESS_ERROR_TUBE() { + super(A8kActionStepType.DO_PROCESS_ERROR_TUBE); + } + + @Resource + GStateService gstate; + @Resource + CondtionMgrService cms; + @Resource + IncubationPlateMgrService incubationPlateMgrService; + @Resource + OptScanModuleStateMgrService optScanModuleStateMgrService; + @Resource + TubeProcessStateMgrService tubeProcessStateMgrService; + + + MainFlowCtrlState mfcs; + + @PostConstruct + void init() { + mfcs = gstate.mainFlowCtrlState; + } + + + @Override public void doaction() throws AppException { + //ProcessErrorBeforeContinue + + Tube tube = gstate.getCurProcessingTube(); + assert tube != null; + + logger.info("处理错误试管:{}", tube.sampleid); + logger.info("复位摇匀模组"); + OS.forceSleep(4000); + //复位摇匀模组 + logger.info("复位HBOT"); + //复位HBOT + OS.forceSleep(4000); + tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESS_COMPLETE); + } + + @Override public Boolean checkCondition() { + Boolean cond1 = cms.isCanDoAction(); + Boolean cond2 = cms.isHasSometubesToBeProcessed(); + return cond1 && cond2; + } + + @Override public List getResourceList() { + return List.of( + A8kPublicResourceType.ShakeModule, + A8kPublicResourceType.HBOT + ); + } +} diff --git a/src/main/java/a8k/service/appctrl/action/incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java b/src/main/java/a8k/service/appctrl/action/incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java new file mode 100644 index 0000000..7f070d5 --- /dev/null +++ b/src/main/java/a8k/service/appctrl/action/incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java @@ -0,0 +1,82 @@ +package a8k.service.appctrl.action.incubate; + +import a8k.OS; +import a8k.service.appctrl.CondtionMgrService; +import a8k.service.appctrl.action.base.A8kActionStepType; +import a8k.service.appctrl.action.base.A8kStepAction; +import a8k.service.appstate.GStateService; +import a8k.service.appstate.IncubationPlateMgrService; +import a8k.service.appstate.OptScanModuleStateMgrService; +import a8k.service.appstate.TubeProcessStateMgrService; +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.service.appstate.type.IncubationSubTank; +import a8k.service.appstate.type.MainFlowCtrlState; +import a8k.service.appstate.type.Tube; +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.service.appstate.type.state.TubeState; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 处理错误的试管 + */ +@Component +public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(PROCESS_INCUBATE_COMPLETED_PLATE.class); + + PROCESS_INCUBATE_COMPLETED_PLATE() { + super(A8kActionStepType.PROCESS_INCUBATE_COMPLETED_PLATE); + } + + @Resource + GStateService gstate; + @Resource + CondtionMgrService cms; + @Resource + IncubationPlateMgrService incubationPlateMgrService; + @Resource + OptScanModuleStateMgrService optScanModuleStateMgrService; + @Resource + TubeProcessStateMgrService tubeProcessStateMgrService; + + + MainFlowCtrlState mfcs; + + @PostConstruct + void init() { + mfcs = gstate.mainFlowCtrlState; + } + + + @Override public void doaction() throws AppException { + IncubationSubTank tank = incubationPlateMgrService.getOneExpiredPlate(); + if (tank == null) { + return; + } + logger.info("推出板夹到光学模组,{}", tank.pos); + OS.forceSleep(3000); + + optScanModuleStateMgrService.newPlateToOptScanPos(tank); + incubationPlateMgrService.setIncubationPlateState(tank.pos, IncubationSubTankState.EMPTY); + } + + @Override public Boolean checkCondition() { + Boolean cond1 = cms.isCanDoAction(); + Boolean cond2 = incubationPlateMgrService.isHasExpiredPlate(); + Boolean cond3 = optScanModuleStateMgrService.isEmpty(); + return cond1 && cond2 && cond3; + } + + @Override public List getResourceList() { + return List.of( + A8kPublicResourceType.OPTModule, + A8kPublicResourceType.IncubationPlateModule + ); + } +} diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index dc51979..eee8b55 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -4,15 +4,12 @@ import a8k.baseservice.appeventbus.AppEventBusService; import a8k.baseservice.appeventbus.appevent.AppWarningNotifyEvent; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.service.appctrl.CondtionMgrService; -import a8k.service.appdata.AppSampleRecordMgrService; import a8k.service.appctrl.AppTubeSettingMgrService; import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appstate.GStateService; import a8k.service.appstate.TubeProcessContextMgrService; -import a8k.service.appstate.type.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.TubeHolder; import a8k.service.appstate.type.state.TubeHolderState; @@ -22,7 +19,6 @@ import a8k.type.exception.AppException; import a8k.type.tube_setting.TubeHolderSetting; import a8k.type.type.A8kTubeHolderType; import a8k.type.type.BloodType; -import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -224,7 +220,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { } @Override public List getResourceList() { - return List.of(A8kPublicResourceType.SampleTransferXMotor); + return List.of(A8kPublicResourceType.ShakeModule); } // diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index fc1043c..48bfebf 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -101,6 +101,6 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { } @Override public List getResourceList() { - return List.of(A8kPublicResourceType.SampleTransferXMotor); + return List.of(A8kPublicResourceType.ShakeModule); } } diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java index 90606a4..a9986fc 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java @@ -9,7 +9,6 @@ import a8k.service.appctrl.action.base.A8kActionStepType; import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appstate.*; import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.MainFlowCtrlState; import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.state.TubeState; import a8k.service.devicedriver.ctrl.HbotControlService; @@ -211,8 +210,8 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { @Override public List getResourceList() { return List.of( - A8kPublicResourceType.IncubationPlateMotor, - A8kPublicResourceType.PlatesBoxMotor, + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.PlatesBoxModule, A8kPublicResourceType.HBOT, A8kPublicResourceType.CurTubeProcessToken ); diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java index 584d72b..aa7b41b 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java +++ b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java @@ -67,7 +67,7 @@ public class SEQ5_PROCESS extends A8kStepAction { Tube tube = gstate.getCurProcessingTube(); OS.forceSleep(3000); tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESSED); - incubationPlateMgrService.startIncubating(tube); + incubationPlateMgrService.startIncubating(tube, 60 * 2); logger.info("pre process success"); } @@ -78,7 +78,7 @@ public class SEQ5_PROCESS extends A8kStepAction { @Override public List getResourceList() { return List.of( - A8kPublicResourceType.IncubationPlateMotor, + A8kPublicResourceType.IncubationPlateModule, A8kPublicResourceType.HBOT, A8kPublicResourceType.CurTubeProcessToken ); diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java index eab4b97..74b8733 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java +++ b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java @@ -10,9 +10,7 @@ import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.MainFlowCtrlState; import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.state.TubeState; -import a8k.type.ecode.AppError; import a8k.type.exception.AppException; -import a8k.utils.ZFnCall; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -20,7 +18,6 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; -import java.util.Objects; import java.util.concurrent.*; /** @@ -76,8 +73,8 @@ public class SEQ6_POST_PROCESS extends A8kStepAction { @Override public List getResourceList() { return List.of( - A8kPublicResourceType.IncubationPlateMotor, - A8kPublicResourceType.PlatesBoxMotor, + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.PlatesBoxModule, A8kPublicResourceType.HBOT, A8kPublicResourceType.CurTubeProcessToken ); diff --git a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java index 2ea9e84..22ea511 100644 --- a/src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java @@ -6,7 +6,6 @@ import a8k.service.appctrl.action.base.A8kStepAction; import a8k.service.appstate.GStateService; import a8k.service.appstate.type.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.state.A8kWorkState; import a8k.service.appstate.type.state.TubeHolderState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; @@ -56,6 +55,6 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { } @Override public List getResourceList() { - return List.of(A8kPublicResourceType.SampleTransferXMotor); + return List.of(A8kPublicResourceType.ShakeModule); } } diff --git a/src/main/java/a8k/service/appstate/IncubationPlateMgrService.java b/src/main/java/a8k/service/appstate/IncubationPlateMgrService.java index bfdc762..56fa2fc 100644 --- a/src/main/java/a8k/service/appstate/IncubationPlateMgrService.java +++ b/src/main/java/a8k/service/appstate/IncubationPlateMgrService.java @@ -11,6 +11,7 @@ import a8k.type.IncubatorPos; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; +import java.util.Date; import java.util.List; @Component @@ -33,6 +34,55 @@ public class IncubationPlateMgrService { return count >= num; } + /** + * 是否有错误的板夹 + * @return true 有错误的板夹 + */ + synchronized public Boolean isHasSomeErrorPlate() { + var incubationState = gstate.getIncubationPlate(); + var subtanks = incubationState.subtanks; + + for (IncubationSubTank subtank : subtanks) { + if (subtank.state.equals(IncubationSubTankState.ERROR)) { + return true; + } + } + return false; + } + + synchronized public Boolean isHasExpiredPlate() { + var incubationState = gstate.getIncubationPlate(); + var subtanks = incubationState.subtanks; + + for (IncubationSubTank subtank : subtanks) { + if (subtank.state.equals(IncubationSubTankState.INCUBATING)) { + var now = new Date(); + var diff = now.getTime() - subtank.startIncubatedTime.getTime(); + if (diff > subtank.incubatedTimeSec * 1000) { + return true; + } + } + } + return false; + } + + + synchronized public IncubationSubTank getOneExpiredPlate() { + var incubationState = gstate.getIncubationPlate(); + var subtanks = incubationState.subtanks; + + for (IncubationSubTank subtank : subtanks) { + if (subtank.state.equals(IncubationSubTankState.INCUBATING)) { + var now = new Date(); + var diff = now.getTime() - subtank.startIncubatedTime.getTime(); + if (diff > subtank.incubatedTimeSec * 1000) { + return subtank; + } + } + } + return null; + } + synchronized public List takeIncubationIDLEPos(Integer num) { var incubationState = gstate.getIncubationPlate(); @@ -57,6 +107,11 @@ public class IncubationPlateMgrService { return ret; } + /** + * 设置孵育板夹状态 + * @param pos 位置 + * @param state 状态 + */ synchronized public void setIncubationPlateState(IncubatorPos pos, IncubationSubTankState state) { var incubationState = gstate.getIncubationPlate(); @@ -84,20 +139,22 @@ public class IncubationPlateMgrService { for (ProjProcessContext context : tube.projProcessContexts) { subtanks[context.incubatorPos.off].state = IncubationSubTankState.WAITING_FOR_DROP; subtanks[context.incubatorPos.off].projProcessContxt = context; - subtanks[context.incubatorPos.off].bloodType = tube.bloodType; - subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode; - subtanks[context.incubatorPos.off].userid = tube.userid; - subtanks[context.incubatorPos.off].projIndex = context.projIndex; - subtanks[context.incubatorPos.off].projName = context.projName; + subtanks[context.incubatorPos.off].bloodType = tube.bloodType; + subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode; + subtanks[context.incubatorPos.off].userid = tube.userid; + subtanks[context.incubatorPos.off].projIndex = context.projIndex; + subtanks[context.incubatorPos.off].projName = context.projName; } } - synchronized public void startIncubating(Tube tube){ + synchronized public void startIncubating(Tube tube, Integer incubatedTimeSec) { var incubationState = gstate.getIncubationPlate(); var subtanks = incubationState.subtanks; for (ProjProcessContext context : tube.projProcessContexts) { - subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING; + subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING; + subtanks[context.incubatorPos.off].startIncubatedTime = new Date(); + subtanks[context.incubatorPos.off].incubatedTimeSec = incubatedTimeSec; } } @@ -115,4 +172,16 @@ public class IncubationPlateMgrService { } } + synchronized public IncubationSubTank getErrorPlate() { + var incubationState = gstate.getIncubationPlate(); + var subtanks = incubationState.subtanks; + + for (IncubationSubTank subtank : subtanks) { + if (subtank.state.equals(IncubationSubTankState.ERROR)) { + return subtank; + } + } + return null; + } + } diff --git a/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java b/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java new file mode 100644 index 0000000..a088454 --- /dev/null +++ b/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java @@ -0,0 +1,41 @@ +package a8k.service.appstate; + +import a8k.service.appstate.type.IncubationSubTank; +import a8k.service.appstate.type.OptScanModule; +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.service.appstate.type.state.OptScanModuleState; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class OptScanModuleStateMgrService { + @Resource + GStateService gstate; + + synchronized public void newPlateToOptScanPos(IncubationSubTank tank) { + OptScanModule optScanModule = gstate.getOptScanModule(); + optScanModule.state = OptScanModuleState.PLATE_IS_READY; + optScanModule.isErrorPlate = tank.state.equals(IncubationSubTankState.ERROR); + optScanModule.bloodType = tank.bloodType; + optScanModule.sampleBarcode = tank.sampleBarcode; + optScanModule.userid = tank.userid; + optScanModule.projIndex = tank.projIndex; + optScanModule.projProcessContxt = tank.projProcessContxt; + } + + synchronized public void dropPlate() { + OptScanModule optScanModule = gstate.getOptScanModule(); + optScanModule.state = OptScanModuleState.EMPTY; + } + + synchronized public void startScanPlate() { + OptScanModule optScanModule = gstate.getOptScanModule(); + optScanModule.state = OptScanModuleState.SCANNING; + } + + synchronized public Boolean isEmpty() { + OptScanModule optScanModule = gstate.getOptScanModule(); + return optScanModule.state.equals(OptScanModuleState.EMPTY); + } + +} diff --git a/src/main/java/a8k/service/appstate/resource/A8kPublicResourceType.java b/src/main/java/a8k/service/appstate/resource/A8kPublicResourceType.java index d80caa1..cdc38e5 100644 --- a/src/main/java/a8k/service/appstate/resource/A8kPublicResourceType.java +++ b/src/main/java/a8k/service/appstate/resource/A8kPublicResourceType.java @@ -1,9 +1,10 @@ package a8k.service.appstate.resource; public enum A8kPublicResourceType { - SampleTransferXMotor,//样本平移电机 - IncubationPlateMotor,//孵育盘电机 - PlatesBoxMotor,//板夹仓电机 + ShakeModule,//样本平移电机 + IncubationPlateModule,//孵育盘电机 + OPTModule, //光学电机 + PlatesBoxModule,//板夹仓电机 HBOT,//HBOT CurTubeProcessToken,//当前管子处理令牌 } diff --git a/src/main/java/a8k/service/appstate/type/IncubationSubTank.java b/src/main/java/a8k/service/appstate/type/IncubationSubTank.java index b5a6cbd..e72d7e2 100644 --- a/src/main/java/a8k/service/appstate/type/IncubationSubTank.java +++ b/src/main/java/a8k/service/appstate/type/IncubationSubTank.java @@ -26,7 +26,7 @@ public class IncubationSubTank { //孵育时间 public Date startIncubatedTime; //开始孵育时间 - public Integer targetIncubatedTimeS; //目标孵育时间 + public Integer incubatedTimeSec; //目标孵育时间 public A8kEcode error = A8kEcode.NoError; diff --git a/src/main/java/a8k/service/appstate/type/OptScanModule.java b/src/main/java/a8k/service/appstate/type/OptScanModule.java index 81800cc..b5895b0 100644 --- a/src/main/java/a8k/service/appstate/type/OptScanModule.java +++ b/src/main/java/a8k/service/appstate/type/OptScanModule.java @@ -4,10 +4,12 @@ import a8k.service.appstate.type.state.OptScanModuleState; import a8k.type.type.BloodType; public class OptScanModule { - public OptScanModuleState state = OptScanModuleState.IDLE; //模块状态 + public OptScanModuleState state = OptScanModuleState.EMPTY; //模块状态 + public Boolean isErrorPlate = false; //是否是错误板 public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 public String sampleBarcode = ""; //用于请求用户信息的条码ID public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 public Integer projIndex = 0; //项目代码 + public ProjProcessContext projProcessContxt; } diff --git a/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java b/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java index b14db38..fea6742 100644 --- a/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java +++ b/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java @@ -6,6 +6,5 @@ public enum IncubationSubTankState { RESERVED,//预定 WAITING_FOR_DROP,//等待滴液 INCUBATING, //孵育中 - INCUBATED, //孵育完成 ERROR,//错误 } diff --git a/src/main/java/a8k/service/appstate/type/state/OptScanModuleState.java b/src/main/java/a8k/service/appstate/type/state/OptScanModuleState.java index bb297c4..10a0c6a 100644 --- a/src/main/java/a8k/service/appstate/type/state/OptScanModuleState.java +++ b/src/main/java/a8k/service/appstate/type/state/OptScanModuleState.java @@ -1,6 +1,7 @@ package a8k.service.appstate.type.state; public enum OptScanModuleState { - IDLE, + EMPTY, + PLATE_IS_READY, SCANNING, }