From 744a115ce8851723fa38f16f5e8f4795b342e9aa Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 5 Oct 2024 16:29:28 +0800 Subject: [PATCH] update --- README.md | 38 ++- .../appeventbus/appevent/DoA8kStepActionEvent.java | 2 +- .../extapi/pagecontrol/ExtApiTabConfig.java | 2 +- .../appdevicectrl/AppDeviceCtrlService.java | 8 +- .../service/appdevicectrl/MainFlowCtrlService.java | 4 +- .../appdevicectrl/action/A8kActionStepType.java | 18 -- .../appdevicectrl/action/A8kStepAction.java | 34 --- .../DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java | 7 +- .../appdevicectrl/action/DO_EJECT_TUBEHOLDER.java | 11 +- .../action/DO_ENTER_TUBEHOLDER_AND_SCAN.java | 267 -------------------- .../a8k/service/appdevicectrl/action/DO_PAUSE.java | 6 +- .../a8k/service/appdevicectrl/action/DO_START.java | 8 +- .../a8k/service/appdevicectrl/action/DO_STOP.java | 8 +- .../action/DO_SWITCH_TO_THE_NEXT_TUBE.java | 115 --------- .../action/base/A8kActionStepType.java | 15 ++ .../appdevicectrl/action/base/A8kStepAction.java | 33 +++ .../mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 272 +++++++++++++++++++++ .../mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 109 +++++++++ .../scheduler/MainFlowCtrlScheduler.java | 6 +- .../appdevicectrl/type/A8kEcodeContext.java | 2 +- .../a8k/service/appstate/AppA8kGStateService.java | 25 +- .../java/a8k/service/appstate/type/TubeHolder.java | 26 ++ .../a8k/service/appstate/type/TubeHolderState.java | 20 -- .../type/state/TubeHolderProcessState.java | 7 - .../appstate/type/state/TubeHolderState.java | 7 + 25 files changed, 539 insertions(+), 511 deletions(-) delete mode 100644 src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java delete mode 100644 src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java delete mode 100644 src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java delete mode 100644 src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java create mode 100644 src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java create mode 100644 src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java create mode 100644 src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java create mode 100644 src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java create mode 100644 src/main/java/a8k/service/appstate/type/TubeHolder.java delete mode 100644 src/main/java/a8k/service/appstate/type/TubeHolderState.java delete mode 100644 src/main/java/a8k/service/appstate/type/state/TubeHolderProcessState.java create mode 100644 src/main/java/a8k/service/appstate/type/state/TubeHolderState.java 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/A8kActionStepType.java b/src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java deleted file mode 100644 index 1e74247..0000000 --- a/src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java +++ /dev/null @@ -1,18 +0,0 @@ -package a8k.service.appdevicectrl.action; - -public enum A8kActionStepType { - DO_START,//启动 - DO_PAUSE,//暂停 - DO_STOP, //停止 - DO_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 - DO_EJECT_TUBEHOLDER,//弹出试管架 - - DO_SWITCH_TO_THE_NEXT_TUBE,//切换到下一个试管 - - - DO_CHECK_THE_QUANTITY_OF_CONSUMABLES,//Check the quantity of consumables,核对耗材数量 - - - //特殊动作,无需注册成类型 - DO_CLEAR_ERROR,//清除错误 -} diff --git a/src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java b/src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java deleted file mode 100644 index 5a8d594..0000000 --- a/src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java +++ /dev/null @@ -1,34 +0,0 @@ -package a8k.service.appdevicectrl.action; - - -import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.type.exception.AppException; - -import java.util.List; - -public class A8kStepAction { - - public A8kActionStepType step = null; - - A8kStepAction() { - this.step = A8kActionStepType.valueOf(this.getClass().getSimpleName()); - } - - - public Boolean checkCondition() { - return false; - } - - public Boolean getCondition() { - return checkCondition(); - } - - public List getDeplyResourceList() { - return null; - } - - public void doaction() throws AppException { - - } - -} 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_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java deleted file mode 100644 index 5d1f95f..0000000 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java +++ /dev/null @@ -1,267 +0,0 @@ -package a8k.service.appdevicectrl.action; - -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.appdata.AppSampleMgrService; -import a8k.service.appdevicectrl.AppTubeSettingMgrService; -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.state.A8kWorkState; -import a8k.service.appstate.type.state.TubeHolderProcessState; -import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; -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; -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); - - - static public class TubesScanResult { - public Boolean isTubeExist = false; - public Boolean isHighTube = false; - public String tubeCode = null; - - public String toString() { - return String.format("isTubeExist:%s,isHighTube:%s,tubeCode:%s", isTubeExist, isHighTube, tubeCode); - } - } - - static public class SampleScanResult { - public TubesScanResult[] tubesScanResults; - public String tubeHolderType; - } - - - @Resource - AppA8kGStateService gstate; - @Resource - SampleScanTransportCtrl stc; - @Resource - AppEventBusService ebus; - @Resource - A8kCanBusService canBus; - @Resource - AppTubeSettingMgrService appTubeSettingMgrService; - @Resource - AppSampleMgrService appSampleMgrService; //样本管理服务 - - MainFlowCtrlState mfcs; - - - @PostConstruct - void init() { - mfcs = gstate.mainFlowCtrlState; - } - - - SampleScanResult scanTubeHodler() throws AppException { - SampleScanResult result = new SampleScanResult(); - - //清空试管架 - if (!stc.tubeXChannelIsEmpty()) { - stc.ejectTubeHolder(); - } - //入料 - logger.info("开始进料"); - Boolean enterSuc = stc.enterTubeHolder(); - if (!enterSuc) { - logger.warn("进料超时,从入料口,弹出试管架"); - stc.ejectTubeHolderInEnterPos(); - throw new AppException(A8kEcode.InfeedOvertimeFail.index); - } - //扫描试管架类型 - String tubeType = stc.moveTubeRackToScanPosAndScan(); - if (tubeType.isEmpty()) { - logger.warn("扫描试管架类型失败,弹出试管架"); - stc.ejectTubeHolder(); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ScanTubeholderTypeTimeout)); - return null; - } - logger.info("扫描试管架类型成功,{}", tubeType); - //逐个扫描试管 - TubesScanResult[] tubesScanResult = new TubesScanResult[10]; - boolean hasTube = false; - for (int i = 0; i < tubesScanResult.length; i++) { - tubesScanResult[i] = new TubesScanResult(); - Boolean isTubeExist = stc.moveAndjudgeTubeExist(i); - if (isTubeExist) { - hasTube = true; - tubesScanResult[i].isTubeExist = true; - tubesScanResult[i].isHighTube = stc.moveAndJudgeTubeAltit(i); - tubesScanResult[i].tubeCode = stc.moveTubeToScanPosAndScan(i); - } else { - tubesScanResult[i].isTubeExist = false; - } - logger.info("扫描试管{}完成,{}", i, tubesScanResult[i]); - } - //处理扫描结果 - if (!hasTube) { - logger.error("试管架中没有试管"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); - stc.ejectTubeHolder(); - return null; - } - result.tubeHolderType = tubeType; - result.tubesScanResults = tubesScanResult; - return result; - } - - TubeHolderState parseScanResult(SampleScanResult scanResult) throws AppException { - TubeHolderState state = new TubeHolderState(); - TubeHolderSetting setting = appTubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); - try { - //获取试管架类型 - A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); - if (tubeHolderType == null) { - logger.error("不支持的试管架类型"); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); - stc.ejectTubeHolder(); - return null; - } - - assert setting == null || setting.tubeSettings.length == state.tubeStates.length; - - //逐个赋值试管配置信息 - updaetGroupId(); - for (int i = 0; i < state.tubeStates.length; i++) { - - if (!scanResult.tubesScanResults[i].isTubeExist) { - state.tubeStates[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; - continue; - } - - state.tubeStates[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; - state.tubeStates[i].isHighTube = scanResult.tubesScanResults[i].isHighTube; - - - //首先赋值默认值 - state.tubeStates[i].bloodType = BloodType.WHOLE_BLOOD; - state.tubeStates[i].sampleBarcode = ""; - state.tubeStates[i].userid = ""; - state.tubeStates[i].projIndex = List.of();//不做任何项目 - - //然后赋值用户配置的数值 - if (setting != null) { - state.tubeStates[i].bloodType = setting.tubeSettings[i].bloodType; - state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; - state.tubeStates[i].userid = setting.tubeSettings[i].userid; - state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; - } - - if (state.tubeStates[i].userid.isEmpty()) { - state.tubeStates[i].userid = genUserId(i); - } - - //最后赋值扫描到的数值 - // - //TODO:添加请求后台的代码 - // - // state.tubeStates[i].bloodType = ; - // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; - // state.tubeStates[i].userid = setting.tubeSettings[i].userid; - // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; - } - - - //设置试管架状态 - state.processState = TubeHolderProcessState.PROCESSING; - state.processingTubeIndex = -1; - //删除之前的试管架配置 - appTubeSettingMgrService.removeTubeHolderSetting(setting); - return state; - - } catch (AppException e) { - //回滚部分状态 - appTubeSettingMgrService.removeTubeHolderSetting(setting); - throw e; - } - } - - - @Override public void doaction() throws AppException { - logger.info("开始扫描试管架"); - var scanResult = scanTubeHodler(); - if (scanResult == null) { - return; - } - - logger.info("解析扫描结果"); - TubeHolderState state = parseScanResult(scanResult); - if (state == null) { - return; - } - - logger.info("将样本信息写入数据库"); - appSampleMgrService.addSampleRecord(state.tubeStates); - - logger.info("更新试管架状态"); - gstate.setTubeHolderState(state); - } - - @Override public Boolean checkCondition() { - //处于工作状态,试管架已经处于空闲状态,入料光电被触发 - Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING); - Boolean cond2 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.IDLE); - Boolean cond3 = getTubeholderEnterPosPPS(); - return cond1 && cond2 && cond3; - } - - @Override public List getDeplyResourceList() { - return List.of(A8kPublicResourceType.SampleTransferXMotor); - } - - - // - // UTILS - // - - static Integer usrgroupidoff = 10; - static Boolean tryUpdateGroupId = false; - - String genUserId(Integer tubeoff) { - if (tryUpdateGroupId) { - usrgroupidoff++; - if (usrgroupidoff >= 100) { - usrgroupidoff = 10; - } - tryUpdateGroupId = false; - } - //构造用户ID, 年月日时分秒_试管偏移量 - int usrReadableOff = tubeoff + 1; - if (usrReadableOff >= 10) { - usrReadableOff = 0; - } - return String.format("%2d%d", usrgroupidoff, usrReadableOff); - } - - void updaetGroupId() { - tryUpdateGroupId = true; - } - - Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 - try { - return canBus.getIOState(IOId.InfeedPPS); - } catch (AppException e) { - logger.error("getTubeholderEnterPosPPS error", e); - return false; - } - } - -} 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/DO_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java deleted file mode 100644 index 1272648..0000000 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java +++ /dev/null @@ -1,115 +0,0 @@ -package a8k.service.appdevicectrl.action; - -import a8k.service.appstate.AppA8kGStateService; -import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.service.appstate.type.TubeHolderState; -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.TubeProcessState; -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_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_SWITCH_TO_THE_NEXT_TUBE.class); - - - @Resource - AppA8kGStateService gstate; - - @Resource - SampleScanTransportCtrl sstc; - - @PostConstruct - 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; - } - - - assert state.tubeStates.length == 10; - nextTubeIndex = -1; - for (int i = nowTubeIndex + 1; i < 10; i++) { - - TubeState tubeState = state.tubeStates[i]; - if (!tubeState.isTubeExist) { - continue; - } - nextTubeIndex = i; - break; - } - - if (nextTubeIndex == -1) { - logger.info("当前试管架处理完成"); - state.processState = TubeHolderProcessState.PROCESS_FINISHED; - return; - } - - sstc.moveTubeToPreProcessPos(nextTubeIndex); - state.processingTubeIndex = nextTubeIndex; - } - - boolean con1; - boolean con1_11; - boolean con1_12; - boolean con1_21; - - @Override public Boolean checkCondition() { - - /* - *1. 设备工作中 - * 1.1 试管架正在处理中 - * 1.2 当前Index=-1 - * - * 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); - } - - 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/action/base/A8kActionStepType.java b/src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java new file mode 100644 index 0000000..cfa5adf --- /dev/null +++ b/src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java @@ -0,0 +1,15 @@ +package a8k.service.appdevicectrl.action.base; + +public enum A8kActionStepType { + DO_START,//启动 + DO_PAUSE,//暂停 + DO_STOP, //停止 + 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/base/A8kStepAction.java b/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java new file mode 100644 index 0000000..c57881f --- /dev/null +++ b/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java @@ -0,0 +1,33 @@ +package a8k.service.appdevicectrl.action.base; + + +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.type.exception.AppException; + +import java.util.List; + +public class A8kStepAction { + + public A8kActionStepType step = null; + + public A8kStepAction(A8kActionStepType step) { + this.step = step; + } + + public Boolean checkCondition() { + return false; + } + + public Boolean getCondition() { + return checkCondition(); + } + + public List getDeplyResourceList() { + return null; + } + + public void doaction() throws AppException { + + } + +} diff --git a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java new file mode 100644 index 0000000..610b96a --- /dev/null +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -0,0 +1,272 @@ +package a8k.service.appdevicectrl.action.mainflow; + +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.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.TubeHolder; +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; +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; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +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; + public Boolean isHighTube = false; + public String tubeCode = null; + + public String toString() { + return String.format("isTubeExist:%s,isHighTube:%s,tubeCode:%s", isTubeExist, isHighTube, tubeCode); + } + } + + static public class SampleScanResult { + public TubesScanResult[] tubesScanResults; + public String tubeHolderType; + } + + + @Resource + AppA8kGStateService gstate; + @Resource + SampleScanTransportCtrl stc; + @Resource + AppEventBusService ebus; + @Resource + A8kCanBusService canBus; + @Resource + AppTubeSettingMgrService appTubeSettingMgrService; + @Resource + AppSampleMgrService appSampleMgrService; //样本管理服务 + + MainFlowCtrlState mfcs; + + + @PostConstruct + void init() { + mfcs = gstate.mainFlowCtrlState; + } + + + SampleScanResult scanTubeHodler() throws AppException { + SampleScanResult result = new SampleScanResult(); + + //清空试管架 + if (!stc.tubeXChannelIsEmpty()) { + stc.ejectTubeHolder(); + } + //入料 + logger.info("开始进料"); + Boolean enterSuc = stc.enterTubeHolder(); + if (!enterSuc) { + logger.warn("进料超时,从入料口,弹出试管架"); + stc.ejectTubeHolderInEnterPos(); + throw new AppException(A8kEcode.InfeedOvertimeFail.index); + } + //扫描试管架类型 + String tubeType = stc.moveTubeRackToScanPosAndScan(); + if (tubeType.isEmpty()) { + logger.warn("扫描试管架类型失败,弹出试管架"); + stc.ejectTubeHolder(); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ScanTubeholderTypeTimeout)); + return null; + } + logger.info("扫描试管架类型成功,{}", tubeType); + //逐个扫描试管 + TubesScanResult[] tubesScanResult = new TubesScanResult[10]; + boolean hasTube = false; + for (int i = 0; i < tubesScanResult.length; i++) { + tubesScanResult[i] = new TubesScanResult(); + Boolean isTubeExist = stc.moveAndjudgeTubeExist(i); + if (isTubeExist) { + hasTube = true; + tubesScanResult[i].isTubeExist = true; + tubesScanResult[i].isHighTube = stc.moveAndJudgeTubeAltit(i); + tubesScanResult[i].tubeCode = stc.moveTubeToScanPosAndScan(i); + } else { + tubesScanResult[i].isTubeExist = false; + } + logger.info("扫描试管{}完成,{}", i, tubesScanResult[i]); + } + //处理扫描结果 + if (!hasTube) { + logger.error("试管架中没有试管"); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); + stc.ejectTubeHolder(); + return null; + } + result.tubeHolderType = tubeType; + result.tubesScanResults = tubesScanResult; + return result; + } + + TubeHolder parseScanResult(SampleScanResult scanResult) throws AppException { + TubeHolder state = new TubeHolder(); + TubeHolderSetting setting = appTubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); + try { + //获取试管架类型 + A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); + if (tubeHolderType == null) { + logger.error("不支持的试管架类型"); + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); + stc.ejectTubeHolder(); + return null; + } + + assert setting == null || setting.tubeSettings.length == state.tubeStates.length; + + //逐个赋值试管配置信息 + updaetGroupId(); + for (int i = 0; i < state.tubeStates.length; i++) { + + if (!scanResult.tubesScanResults[i].isTubeExist) { + state.tubeStates[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; + continue; + } + + state.tubeStates[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; + state.tubeStates[i].isHighTube = scanResult.tubesScanResults[i].isHighTube; + + + //首先赋值默认值 + state.tubeStates[i].bloodType = BloodType.WHOLE_BLOOD; + state.tubeStates[i].sampleBarcode = ""; + state.tubeStates[i].userid = ""; + state.tubeStates[i].projIndex = List.of();//不做任何项目 + + //然后赋值用户配置的数值 + if (setting != null) { + state.tubeStates[i].bloodType = setting.tubeSettings[i].bloodType; + state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; + state.tubeStates[i].userid = setting.tubeSettings[i].userid; + state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; + } + + if (state.tubeStates[i].userid.isEmpty()) { + state.tubeStates[i].userid = genUserId(i); + } + + //最后赋值扫描到的数值 + // + //TODO:添加请求后台的代码 + // + // state.tubeStates[i].bloodType = ; + // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; + // state.tubeStates[i].userid = setting.tubeSettings[i].userid; + // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; + } + + + //设置试管架状态 + state.state = TubeHolderState.PROCESSING; + state.processingTubeIndex = -1; + //删除之前的试管架配置 + appTubeSettingMgrService.removeTubeHolderSetting(setting); + return state; + + } catch (AppException e) { + //回滚部分状态 + appTubeSettingMgrService.removeTubeHolderSetting(setting); + throw e; + } + } + + + @Override public void doaction() throws AppException { + logger.info("开始扫描试管架"); + var scanResult = scanTubeHodler(); + if (scanResult == null) { + return; + } + + logger.info("解析扫描结果"); + TubeHolder state = parseScanResult(scanResult); + if (state == null) { + return; + } + + logger.info("将样本信息写入数据库"); + appSampleMgrService.addSampleRecord(state.tubeStates); + + logger.info("更新试管架状态"); + gstate.setTubeHolder(state); + } + + @Override public Boolean checkCondition() { + //处于工作状态 + 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; + } + + @Override public List getDeplyResourceList() { + return List.of(A8kPublicResourceType.SampleTransferXMotor); + } + + + // + // UTILS + // + + static Integer usrgroupidoff = 10; + static Boolean tryUpdateGroupId = false; + + String genUserId(Integer tubeoff) { + if (tryUpdateGroupId) { + usrgroupidoff++; + if (usrgroupidoff >= 100) { + usrgroupidoff = 10; + } + tryUpdateGroupId = false; + } + //构造用户ID, 年月日时分秒_试管偏移量 + int usrReadableOff = tubeoff + 1; + if (usrReadableOff >= 10) { + usrReadableOff = 0; + } + return String.format("%2d%d", usrgroupidoff, usrReadableOff); + } + + void updaetGroupId() { + tryUpdateGroupId = true; + } + + Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 + try { + return canBus.getIOState(IOId.InfeedPPS); + } catch (AppException e) { + logger.error("getTubeholderEnterPosPPS error", e); + return false; + } + } + +} diff --git a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java new file mode 100644 index 0000000..04ecc11 --- /dev/null +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -0,0 +1,109 @@ +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.TubeHolder; +import a8k.service.appstate.type.TubeState; +import a8k.service.appstate.type.state.A8kWorkState; +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; +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 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; + + @Resource + SampleScanTransportCtrl sstc; + + @PostConstruct + void init() { + } + + int moveToNextTube() throws AppException { + TubeHolder state = gstate.getTubeHolder(); + + assert state.tubeStates.length == 10; + + int nowTubeIndex = state.processingTubeIndex; + int nextTubeIndex = -1; + for (int i = nowTubeIndex + 1; i < 10; i++) { + + TubeState tubeState = state.tubeStates[i]; + if (!tubeState.isTubeExist) { + continue; + } + nextTubeIndex = i; + 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.state = TubeHolderState.PROCESS_FINISHED; + return; + } + logger.info("移动到下一个试管:{}", nextPos); + sstc.moveTubeToPreProcessPos(nextPos); + state.processingTubeIndex = nextPos; + } + + + @Override public Boolean checkCondition() { + /* + *1. 设备工作中 + * 1.1 试管架正在处理中 + * 1.2 当前Index=-1 + * + * 2.1 当前试管处理完成 + * + */ + //当前正在工作 + 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); + } + + + @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/TubeHolderProcessState.java deleted file mode 100644 index 504e56d..0000000 --- a/src/main/java/a8k/service/appstate/type/state/TubeHolderProcessState.java +++ /dev/null @@ -1,7 +0,0 @@ -package a8k.service.appstate.type.state; - -public enum TubeHolderProcessState { - IDLE, //没有试管架 - PROCESSING, //正在处理试管架 - PROCESS_FINISHED, //试管架处理完成,但试管架并没有被取走 -} diff --git a/src/main/java/a8k/service/appstate/type/state/TubeHolderState.java b/src/main/java/a8k/service/appstate/type/state/TubeHolderState.java new file mode 100644 index 0000000..ae70c69 --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/state/TubeHolderState.java @@ -0,0 +1,7 @@ +package a8k.service.appstate.type.state; + +public enum TubeHolderState { + IDLE, //没有试管架 + PROCESSING, //正在处理试管架 + PROCESS_FINISHED, //试管架处理完成,但试管架并没有被取走 +}