diff --git a/README.md b/README.md index e0c5245..bdbdd8b 100644 --- a/README.md +++ b/README.md @@ -142,35 +142,32 @@ TODO: ``` ``` - DO_ENTER_TUBEHOLDER_AND_SCAN(入料) - -> 修改试管架状态为READY - DO_SWITCH_TO_THE_NEXT_TUBE - -> - - - DO_CHECK_TUBE_IS_OK_TO_PROCESS(检查试管是否可以被处理,如果检查不合格,则不切换状态) - -> 修改试管状态为PROCESSING - DO_SAMPLE_PRE_PROCESS_A(摇匀+脱帽) - ->set DO_SAMPLE_PRE_PROCESS_A doneFlag - DO_PREPARE_REACTION_PLATE(推入反应板到孵育盘中) - ->set DO_PREPARE_REACTION_PLATE doneFlag - DO_PREPARE_PREPARE_PROCESS(HBOT为处理样本做准备) - ->set DO_PREPARE_PREPARE_PROCESS doneFlag +``` +``` + 动作: + 入料并扫描 + 将下一个试管移动到预处理位 - DO_TAKE_SAMPLE_AND_PROCESS(处理样本,取样....) - ->set DO_TAKE_SAMPLE_AND_PROCESS doneFlag + 核对资源是否可以被处理 - --> DO_SAMPLE_PRE_PROCESS_B(盖帽,样本复位) - ->set DO_SAMPLE_PRE_PROCESS_B doneFlag + BEFORE_PROCESS 预处理A(脱帽,摇匀) + BEFORE_PROCESS 预处理B(hbot取tip头,移动到待机位) + BEFORE_PROCESS 预处理C(推出反应板夹) + PROCESS 处理(取样,处理,滴定) - DO_PUSH_REACTION_PLATE(推出反应板) - DO_OPT_SCAN + AFTER_PROCESS 后处理 + 出料 + 将反应板推出到光学扫描位 + 光学扫描 + 代码规范 + 1. 什么样的检查写在动作中? + 需要进行报错处理的检查写在步骤中 ``` @@ -188,5 +185,4 @@ TODO: 5. 支持吸空检测。 6. 支持反应板夹类型检测。 - ``` \ No newline at end of file diff --git a/src/main/java/a8k/baseservice/appeventbus/appevent/DoA8kStepActionEvent.java b/src/main/java/a8k/baseservice/appeventbus/appevent/DoA8kStepActionEvent.java index b4191c6..23cf554 100644 --- a/src/main/java/a8k/baseservice/appeventbus/appevent/DoA8kStepActionEvent.java +++ b/src/main/java/a8k/baseservice/appeventbus/appevent/DoA8kStepActionEvent.java @@ -1,6 +1,6 @@ package a8k.baseservice.appeventbus.appevent; -import a8k.service.appdevicectrl.action.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; public class DoA8kStepActionEvent extends AppEvent { public A8kActionStepType actionStep; diff --git a/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java b/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java index 7bee080..c978b85 100644 --- a/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java +++ b/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java @@ -24,7 +24,7 @@ public enum ExtApiTabConfig { Hbot2DCodeScanPos("参数.Hbot二维码扫描坐标参数", false), //底层硬件 - A8kPipetteCtrlModule("A8kPipetteCtrlModule", false), + A8kPipetteCtrlModule("A8kPipetteCtrlModule", true), SampleTransportParam("参数.样本出入料&扫描参数", false), PosParam("PosParam", false), diff --git a/src/main/java/a8k/service/appdevicectrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/appdevicectrl/AppDeviceCtrlService.java index 5a450ae..839555d 100644 --- a/src/main/java/a8k/service/appdevicectrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/appdevicectrl/AppDeviceCtrlService.java @@ -3,8 +3,8 @@ package a8k.service.appdevicectrl; import a8k.controler.extapi.pagecontrol.ExtApiTabConfig; import a8k.controler.extapi.utils.ExtApiFn; import a8k.controler.extapi.utils.ExtApiTab; -import a8k.service.appdevicectrl.action.A8kStepAction; -import a8k.service.appstate.type.TubeHolderState; +import a8k.service.appdevicectrl.action.base.A8kStepAction; +import a8k.service.appstate.type.TubeHolder; import a8k.type.checkpoint.CheckResult; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.type.state.A8kWorkState; @@ -98,8 +98,8 @@ public class AppDeviceCtrlService { } @ExtApiFn(name = "获取正在处理的试管架状态", group = "设备状态") - public TubeHolderState getTubeHolderState() { - return gstate.getTubeHolderState(); + public TubeHolder getTubeHolderState() { + return gstate.getTubeHolder(); } @ExtApiFn(name = "获取设备状态(调试使用)", group = "设备状态") diff --git a/src/main/java/a8k/service/appdevicectrl/MainFlowCtrlService.java b/src/main/java/a8k/service/appdevicectrl/MainFlowCtrlService.java index db3c021..e6fb62f 100644 --- a/src/main/java/a8k/service/appdevicectrl/MainFlowCtrlService.java +++ b/src/main/java/a8k/service/appdevicectrl/MainFlowCtrlService.java @@ -1,6 +1,8 @@ package a8k.service.appdevicectrl; import a8k.service.appdevicectrl.action.*; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appdevicectrl.scheduler.MainFlowCtrlScheduler; import a8k.service.appdevicectrl.type.A8kEcodeContext; import a8k.service.appstate.AppA8kGStateService; @@ -48,7 +50,7 @@ public class MainFlowCtrlService { if (actionType.equals(A8kActionStepType.DO_CLEAR_ERROR)) { continue; } - A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class); + A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class); scheduler.regFn(action); } diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java b/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java index 359fe8c..1829395 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java @@ -1,9 +1,9 @@ package a8k.service.appdevicectrl.action; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.appstate.type.state.TubeHolderProcessState; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -20,6 +20,9 @@ import java.util.List; public class DO_CHECK_THE_QUANTITY_OF_CONSUMABLES extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.class); + DO_CHECK_THE_QUANTITY_OF_CONSUMABLES() { + super(A8kActionStepType.DO_CHECK_THE_QUANTITY_OF_CONSUMABLES); + } @Resource AppA8kGStateService gstate; diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java index c1d2ae7..04ea810 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java @@ -1,10 +1,12 @@ package a8k.service.appdevicectrl.action; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.appstate.type.state.TubeHolderProcessState; +import a8k.service.appstate.type.state.TubeHolderState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -19,6 +21,9 @@ import java.util.List; public class DO_EJECT_TUBEHOLDER extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_EJECT_TUBEHOLDER.class); + DO_EJECT_TUBEHOLDER() { + super(A8kActionStepType.DO_EJECT_TUBEHOLDER); + } @Resource AppA8kGStateService gstate; @@ -36,13 +41,13 @@ public class DO_EJECT_TUBEHOLDER extends A8kStepAction { @Override public void doaction() throws AppException { stc.ejectTubeHolder(); stc.moveTubeRackMoveToEnterPos(); - gstate.getTubeHolderState().processState = TubeHolderProcessState.IDLE; + gstate.getTubeHolder().state = TubeHolderState.IDLE; } @Override public Boolean checkCondition() { //处于工作状态,试管架已经处于空闲状态,入料光电被触发 Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING); - Boolean cond2 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.PROCESS_FINISHED); + Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.PROCESS_FINISHED); return cond1 & cond2; } diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_PAUSE.java b/src/main/java/a8k/service/appdevicectrl/action/DO_PAUSE.java index 0f24d5e..5a96183 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_PAUSE.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_PAUSE.java @@ -1,7 +1,8 @@ package a8k.service.appdevicectrl.action; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; -import a8k.service.appstate.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.state.A8kWorkState; import a8k.type.exception.AppException; @@ -17,6 +18,9 @@ import java.util.List; public class DO_PAUSE extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_PAUSE.class); + DO_PAUSE() { + super(A8kActionStepType.DO_PAUSE); + } @Resource AppA8kGStateService gstate; diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_START.java b/src/main/java/a8k/service/appdevicectrl/action/DO_START.java index 87e4703..2a40a6d 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_START.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_START.java @@ -1,11 +1,10 @@ package a8k.service.appdevicectrl.action; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; -import a8k.service.appstate.AppResourceMgrService; -import a8k.service.appstate.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.appstate.type.state.TubeHolderProcessState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -20,6 +19,9 @@ import java.util.List; public class DO_START extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_START.class); + DO_START() { + super(A8kActionStepType.DO_START); + } @Resource AppA8kGStateService gstate; diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_STOP.java b/src/main/java/a8k/service/appdevicectrl/action/DO_STOP.java index 4a4f70a..cccd052 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_STOP.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_STOP.java @@ -1,5 +1,7 @@ package a8k.service.appdevicectrl.action; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.state.A8kWorkState; @@ -16,8 +18,12 @@ import java.util.List; public class DO_STOP extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_STOP.class); + DO_STOP() { + super(A8kActionStepType.DO_STOP); + } + @Resource - AppA8kGStateService gstate; + AppA8kGStateService gstate; @PostConstruct void init() { diff --git a/src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java b/src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java similarity index 56% rename from src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java rename to src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java index 1e74247..cfa5adf 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java +++ b/src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java @@ -1,17 +1,14 @@ -package a8k.service.appdevicectrl.action; +package a8k.service.appdevicectrl.action.base; public enum A8kActionStepType { DO_START,//启动 DO_PAUSE,//暂停 DO_STOP, //停止 - DO_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 - DO_EJECT_TUBEHOLDER,//弹出试管架 - - DO_SWITCH_TO_THE_NEXT_TUBE,//切换到下一个试管 - + SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 + SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管 DO_CHECK_THE_QUANTITY_OF_CONSUMABLES,//Check the quantity of consumables,核对耗材数量 - + DO_EJECT_TUBEHOLDER, //弹出试管架 //特殊动作,无需注册成类型 DO_CLEAR_ERROR,//清除错误 diff --git a/src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java b/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java similarity index 76% rename from src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java rename to src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java index 5a8d594..c57881f 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java +++ b/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java @@ -1,4 +1,4 @@ -package a8k.service.appdevicectrl.action; +package a8k.service.appdevicectrl.action.base; import a8k.service.appstate.resource.A8kPublicResourceType; @@ -10,11 +10,10 @@ public class A8kStepAction { public A8kActionStepType step = null; - A8kStepAction() { - this.step = A8kActionStepType.valueOf(this.getClass().getSimpleName()); + public A8kStepAction(A8kActionStepType step) { + this.step = step; } - public Boolean checkCondition() { return false; } diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java similarity index 87% rename from src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java rename to src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 5d1f95f..610b96a 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -1,4 +1,4 @@ -package a8k.service.appdevicectrl.action; +package a8k.service.appdevicectrl.action.mainflow; import a8k.baseservice.appeventbus.AppEventBusService; import a8k.baseservice.appeventbus.appevent.AppWarningNotifyEvent; @@ -7,13 +7,14 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.service.appdata.AppSampleMgrService; import a8k.service.appdevicectrl.AppTubeSettingMgrService; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.TubeHolderState; -import a8k.service.appstate.type.TubeState; +import a8k.service.appstate.type.TubeHolder; import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.appstate.type.state.TubeHolderProcessState; +import a8k.service.appstate.type.state.TubeHolderState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; import a8k.type.tube_setting.TubeHolderSetting; @@ -25,13 +26,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import java.util.Date; import java.util.List; @Component -public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_ENTER_TUBEHOLDER_AND_SCAN.class); +public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(SEQ1_ENTER_TUBEHOLDER_AND_SCAN.class); + SEQ1_ENTER_TUBEHOLDER_AND_SCAN() { + super(A8kActionStepType.SEQ1_ENTER_TUBEHOLDER_AND_SCAN); + } static public class TubesScanResult { public Boolean isTubeExist = false; @@ -123,8 +126,8 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { return result; } - TubeHolderState parseScanResult(SampleScanResult scanResult) throws AppException { - TubeHolderState state = new TubeHolderState(); + TubeHolder parseScanResult(SampleScanResult scanResult) throws AppException { + TubeHolder state = new TubeHolder(); TubeHolderSetting setting = appTubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); try { //获取试管架类型 @@ -181,7 +184,7 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { //设置试管架状态 - state.processState = TubeHolderProcessState.PROCESSING; + state.state = TubeHolderState.PROCESSING; state.processingTubeIndex = -1; //删除之前的试管架配置 appTubeSettingMgrService.removeTubeHolderSetting(setting); @@ -203,7 +206,7 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { } logger.info("解析扫描结果"); - TubeHolderState state = parseScanResult(scanResult); + TubeHolder state = parseScanResult(scanResult); if (state == null) { return; } @@ -212,13 +215,15 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { appSampleMgrService.addSampleRecord(state.tubeStates); logger.info("更新试管架状态"); - gstate.setTubeHolderState(state); + gstate.setTubeHolder(state); } @Override public Boolean checkCondition() { - //处于工作状态,试管架已经处于空闲状态,入料光电被触发 - Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING); - Boolean cond2 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.IDLE); + //处于工作状态 + Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING) && mfcs.workState.equals(gstate.getWorkState()); + //试管架处于空闲状态 + Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.IDLE); + //入料通道是否为空 Boolean cond3 = getTubeholderEnterPosPPS(); return cond1 && cond2 && cond3; } diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java similarity index 54% rename from src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java rename to src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index 1272648..04ecc11 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -1,11 +1,13 @@ -package a8k.service.appdevicectrl.action; +package a8k.service.appdevicectrl.action.mainflow; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.TubeHolderState; +import a8k.service.appstate.type.TubeHolder; import a8k.service.appstate.type.TubeState; import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.appstate.type.state.TubeHolderProcessState; +import a8k.service.appstate.type.state.TubeHolderState; import a8k.service.appstate.type.state.TubeProcessState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; @@ -21,9 +23,12 @@ import java.util.List; * 切换下一个试管 */ @Component -public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_SWITCH_TO_THE_NEXT_TUBE.class); +public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(SEQ2_SWITCH_TO_THE_NEXT_TUBE.class); + SEQ2_SWITCH_TO_THE_NEXT_TUBE() { + super(A8kActionStepType.SEQ2_SWITCH_TO_THE_NEXT_TUBE); + } @Resource AppA8kGStateService gstate; @@ -35,24 +40,13 @@ public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { void init() { } - @Override public void doaction() throws AppException { - /* - * 1. 将下一个试管移动到预处理位 - * 2. 如果当前试管是最后一个试管,则设置试管架状态为处理完成。 - */ - TubeHolderState state = gstate.getTubeHolderState(); - - int nowTubeIndex = state.processingTubeIndex; - int nextTubeIndex = nowTubeIndex + 1; - if (nextTubeIndex >= 10) { - logger.info("当前试管架处理完成"); - state.processState = TubeHolderProcessState.PROCESS_FINISHED; - return; - } - + int moveToNextTube() throws AppException { + TubeHolder state = gstate.getTubeHolder(); assert state.tubeStates.length == 10; - nextTubeIndex = -1; + + int nowTubeIndex = state.processingTubeIndex; + int nextTubeIndex = -1; for (int i = nowTubeIndex + 1; i < 10; i++) { TubeState tubeState = state.tubeStates[i]; @@ -63,23 +57,34 @@ public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { break; } + //没有下一个试管 if (nextTubeIndex == -1) { + return -1; + } + sstc.moveTubeToPreProcessPos(nextTubeIndex); + return nextTubeIndex; + } + + @Override public void doaction() throws AppException { + /* + * 1. 将下一个试管移动到预处理位 + * 2. 如果当前试管是最后一个试管,则设置试管架状态为处理完成。 + */ + TubeHolder state = gstate.getTubeHolder(); + + int nextPos = moveToNextTube(); + if (nextPos == -1) { logger.info("当前试管架处理完成"); - state.processState = TubeHolderProcessState.PROCESS_FINISHED; + state.state = TubeHolderState.PROCESS_FINISHED; return; } - - sstc.moveTubeToPreProcessPos(nextTubeIndex); - state.processingTubeIndex = nextTubeIndex; + logger.info("移动到下一个试管:{}", nextPos); + sstc.moveTubeToPreProcessPos(nextPos); + state.processingTubeIndex = nextPos; } - boolean con1; - boolean con1_11; - boolean con1_12; - boolean con1_21; @Override public Boolean checkCondition() { - /* *1. 设备工作中 * 1.1 试管架正在处理中 @@ -88,26 +93,15 @@ public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { * 2.1 当前试管处理完成 * */ - - var mainFlowCtrlState = gstate.mainFlowCtrlState; - Integer curTubeIndex = gstate.getTubeHolderState().processingTubeIndex; - - - con1 = mainFlowCtrlState.workState.equals(A8kWorkState.WORKING); - con1_11 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.PROCESSING); - con1_12 = curTubeIndex == -1; - - con1_21 = false; - if (curTubeIndex >= 0) { - con1_21 = gstate.getTubeHolderState().tubeStates[curTubeIndex].state.equals(TubeProcessState.PROCESS_COMPLETE); - } - - return con1 && (con1_11 && con1_12 || con1_21); + //当前正在工作 + Boolean cond1 = gstate.isWorking(); + //试管架正在处理中, 且当前试管Index=-1 + Boolean cond2 = gstate.getTubeHolderState().equals(TubeHolderState.PROCESSING) && gstate.getTubeHolder().getProcessingTube() == null; + //当前试管处理完成 + Boolean cond3 = gstate.getTubeHolder().getProcessingTube().state.equals(TubeProcessState.PROCESS_COMPLETE); + return cond1 && (cond2 || cond3); } - public List getConectionList() { - return List.of(con1, con1_11, con1_12, con1_21); - } @Override public List getDeplyResourceList() { return List.of(A8kPublicResourceType.SampleTransferXMotor); diff --git a/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java b/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java index 65d42e3..73a959b 100644 --- a/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java @@ -5,8 +5,8 @@ import a8k.baseservice.appeventbus.AppEventBusService; import a8k.baseservice.appeventbus.appevent.A8kEcodeContextListPromptEvent; import a8k.baseservice.appeventbus.appevent.DoA8kStepActionEvent; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.appdevicectrl.action.A8kActionStepType; -import a8k.service.appdevicectrl.action.A8kStepAction; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appdevicectrl.type.*; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.AppCondtionMgrService; @@ -17,8 +17,6 @@ import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/src/main/java/a8k/service/appdevicectrl/type/A8kEcodeContext.java b/src/main/java/a8k/service/appdevicectrl/type/A8kEcodeContext.java index 19ed26d..4c993f4 100644 --- a/src/main/java/a8k/service/appdevicectrl/type/A8kEcodeContext.java +++ b/src/main/java/a8k/service/appdevicectrl/type/A8kEcodeContext.java @@ -1,7 +1,7 @@ package a8k.service.appdevicectrl.type; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.appdevicectrl.action.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kActionStepType; public class A8kEcodeContext { public A8kActionStepType dowhat; diff --git a/src/main/java/a8k/service/appstate/AppA8kGStateService.java b/src/main/java/a8k/service/appstate/AppA8kGStateService.java index 6cfbd1b..274afcf 100644 --- a/src/main/java/a8k/service/appstate/AppA8kGStateService.java +++ b/src/main/java/a8k/service/appstate/AppA8kGStateService.java @@ -1,9 +1,12 @@ package a8k.service.appstate; import a8k.service.appdevicectrl.type.app_consumables_mgr_service.ConsumableState; -import a8k.service.appstate.type.*; +import a8k.service.appstate.type.EmergencyPosRunState; +import a8k.service.appstate.type.IncubationPlateStatus; +import a8k.service.appstate.type.OptScanModule; +import a8k.service.appstate.type.TubeHolder; import a8k.service.appstate.type.state.A8kWorkState; -import a8k.service.appstate.type.state.OptScanModuleState; +import a8k.service.appstate.type.state.TubeHolderState; import a8k.type.tube_setting.TubeHolderSetting; import lombok.Data; import org.slf4j.Logger; @@ -26,7 +29,7 @@ public class AppA8kGStateService { A8kWorkState workState = A8kWorkState.IDLE; // //当前正在被处理的试管架状态 - TubeHolderState tubeHolderState = new TubeHolderState(); + TubeHolder tubeHolder = new TubeHolder(); //急诊为状态 EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); //孵育盘状态 @@ -58,12 +61,20 @@ public class AppA8kGStateService { return consumableState; } - public synchronized void setTubeHolderState(TubeHolderState state) { - this.tubeHolderState = state; + public synchronized void setTubeHolder(TubeHolder state) { + this.tubeHolder = state; } - public synchronized TubeHolderState getTubeHolderState() { - return tubeHolderState; + public synchronized TubeHolder getTubeHolder() { + return tubeHolder; + } + + public Boolean isWorking() { + return workState.equals(A8kWorkState.WORKING) && mainFlowCtrlState.workState.equals(A8kWorkState.WORKING); + } + + public TubeHolderState getTubeHolderState() { + return tubeHolder.state; } } diff --git a/src/main/java/a8k/service/appstate/type/TubeHolder.java b/src/main/java/a8k/service/appstate/type/TubeHolder.java new file mode 100644 index 0000000..52afaf6 --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/TubeHolder.java @@ -0,0 +1,26 @@ +package a8k.service.appstate.type; + +import a8k.service.appstate.type.state.TubeHolderState; +import a8k.type.type.A8kTubeHolderType; + +public class TubeHolder { + public A8kTubeHolderType tubeHolderType = A8kTubeHolderType.BloodTube; //试管架类型 + public TubeState[] tubeStates = new TubeState[10]; + + public TubeHolderState state = TubeHolderState.IDLE; //处理状态 + public Integer processingTubeIndex = -1; //当前正在被处理的试管索引 + + public TubeHolder() { + for (int i = 0; i < tubeStates.length; i++) { + tubeStates[i] = new TubeState(); + } + } + + public TubeState getProcessingTube() { + if (processingTubeIndex == -1) { + return null; + } + return tubeStates[processingTubeIndex]; + } + +} diff --git a/src/main/java/a8k/service/appstate/type/TubeHolderState.java b/src/main/java/a8k/service/appstate/type/TubeHolderState.java deleted file mode 100644 index f3408e7..0000000 --- a/src/main/java/a8k/service/appstate/type/TubeHolderState.java +++ /dev/null @@ -1,20 +0,0 @@ -package a8k.service.appstate.type; - -import a8k.service.appstate.type.state.TubeHolderProcessState; -import a8k.type.type.A8kTubeHolderType; -import a8k.type.type.BloodType; - -public class TubeHolderState { - public A8kTubeHolderType tubeHolderType = A8kTubeHolderType.BloodTube; //试管架类型 - public TubeState[] tubeStates = new TubeState[10]; - - public TubeHolderProcessState processState = TubeHolderProcessState.IDLE; //处理状态 - public Integer processingTubeIndex = -1; //当前正在被处理的试管索引 - - public TubeHolderState() { - for (int i = 0; i < tubeStates.length; i++) { - tubeStates[i] = new TubeState(); - } - } - -} diff --git a/src/main/java/a8k/service/appstate/type/state/TubeHolderProcessState.java b/src/main/java/a8k/service/appstate/type/state/TubeHolderState.java similarity index 83% rename from src/main/java/a8k/service/appstate/type/state/TubeHolderProcessState.java rename to src/main/java/a8k/service/appstate/type/state/TubeHolderState.java index 504e56d..ae70c69 100644 --- a/src/main/java/a8k/service/appstate/type/state/TubeHolderProcessState.java +++ b/src/main/java/a8k/service/appstate/type/state/TubeHolderState.java @@ -1,6 +1,6 @@ package a8k.service.appstate.type.state; -public enum TubeHolderProcessState { +public enum TubeHolderState { IDLE, //没有试管架 PROCESSING, //正在处理试管架 PROCESS_FINISHED, //试管架处理完成,但试管架并没有被取走