diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/A8kPublicAreaResourceMgr.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/A8kPublicAreaResourceMgr.java deleted file mode 100644 index e9a498e..0000000 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/A8kPublicAreaResourceMgr.java +++ /dev/null @@ -1,161 +0,0 @@ -package a8k.service.app.appctrl.mainflowctrl; - - -import a8k.OS; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; -import jakarta.annotation.PostConstruct; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; -import org.springframework.util.Assert; - -import java.util.List; -import java.util.Vector; - -@Component -public class A8kPublicAreaResourceMgr { - static Logger logger = LoggerFactory.getLogger(A8kPublicAreaResourceMgr.class); - - static public class Resource { - public A8kPublicAreaResource type; - public Boolean rented = false;//是否被租用 - public Object ownerNow = null; - public String subOwnerName = ""; - - public Resource(A8kPublicAreaResource type) { - this.type = type; - } - } - - List resources = new Vector<>(); - - @PostConstruct - public void init() { - for (A8kPublicAreaResource type : A8kPublicAreaResource.values()) { - resources.add(new Resource(type)); - } - } - - - Boolean checkResourceRentable(A8kPublicAreaResource type) { - for (Resource r : resources) { - if (r.type == type) { - return !r.rented; - } - } - return false; - } - - - /** - * 申请资源 - * @param applyer 申请者 - * @param type 资源类型 - * @return 是否申请成功 - */ - Boolean applyForOneResourceInternal(Object applyer, String subOwnerName, A8kPublicAreaResource type) { - for (Resource r : resources) { - if (r.type == type) { - if (r.rented) { - return false; - } - r.rented = true; - r.ownerNow = applyer; - r.subOwnerName = subOwnerName; - return true; - } - } - return false; - } - - /** - * 申请多个资源 - * @param applyer 申请者 - * @param resources 资源类型列表 - * @return 是否申请成功 - */ - synchronized Boolean applyForResourceInternal(Object applyer, String subOwnerName, A8kPublicAreaResource... resources) { - // logger.info("{} applyForResources: {}", applyer.getClass().getSimpleName(), types); - - if (resources == null || resources.length == 0) { - return false; - } - - //检查是否所有资源都可租用 - for (A8kPublicAreaResource type : resources) { - if (!checkResourceRentable(type)) { - return false; - } - } - - //租用所有资源 - for (A8kPublicAreaResource type : resources) { - Boolean suc = applyForOneResourceInternal(applyer, subOwnerName, type); - Assert.isTrue(suc, "applyForResource(applyer, type) fail"); - } - return true; - } - - public void applyForResources(Object applyer, A8kPublicAreaResource... resources) { - while (true) { - Boolean suc = applyForResourceInternal(applyer, "", resources); - if (suc) - break; - - OS.forceSleep(300); - } - } - - public void applyForResources(Object applyer, String subOwnerName, A8kPublicAreaResource... resources) { - while (true) { - Boolean suc = applyForResourceInternal(applyer, subOwnerName, resources); - if (suc) - break; - - OS.forceSleep(300); - } - } - - - /** - * 释放资源 - * @param type 资源类型 - */ - synchronized public void releaseResource(A8kPublicAreaResource... type) { - for (A8kPublicAreaResource t : type) { - for (Resource r : resources) { - if (r.type == t) { - r.rented = false; - r.ownerNow = null; - } - } - } - } - - /** - * 释放所有资源 - * @param applyer 申请者 - */ - synchronized public void releaseAllResource(Object applyer) { - for (Resource r : resources) { - if (r.ownerNow == applyer) { - r.rented = false; - r.ownerNow = null; - } - } - } - - synchronized public void releaseAllResource(Object applyer, String subOwnerName) { - for (Resource r : resources) { - if (r.ownerNow == applyer) { - if (r.subOwnerName.equals(subOwnerName)) { - r.rented = false; - r.ownerNow = null; - r.subOwnerName = ""; - } - } - } - } - - -} diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java index 86cf852..bc8e93e 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -37,9 +37,9 @@ public class MainFlowCtrlScheduler implements ApplicationListener allActions = new ArrayList<>(); List foregroundActions = new ArrayList<>(); @@ -187,7 +187,6 @@ public class MainFlowCtrlScheduler implements ApplicationListener resources = new Vector<>(); + + @PostConstruct + public void init() { + resources.addAll(Arrays.asList(PublicAreaResource.values())); + } + + + /** + * 申请多个资源 + * @param resources 资源类型列表 + * @return 是否申请成功 + */ + synchronized Boolean applyForResourceInternal(PublicAreaResource... resources) { + if (resources == null || resources.length == 0) { + return false; + } + + //检查是否所有资源都可租用 + for (PublicAreaResource type : resources) { + if (type.isRent()) { + return false; + } + } + + //租用所有资源 + for (PublicAreaResource type : resources) { + type.setRent(); + } + return true; + } + + public A8kPublicAreaResourcePacket apply(PublicAreaResource... resources) { + while (true) { + Boolean suc = applyForResourceInternal(resources); + if (suc) + break; + + OS.forceSleep(300); + } + return new A8kPublicAreaResourcePacket(Arrays.asList(resources)); + } + +} diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java index 58adce0..00895c4 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java @@ -1,9 +1,9 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.constant.LogTopic; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; +import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appstate.statemgr.TubeStateMgrService; @@ -44,9 +44,9 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; @Resource - TubeStateMgrService tubeStateMgrService; + TubeStateMgrService tubeStateMgrService; public Boolean isReady() { @@ -77,17 +77,15 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { } @Override public List doAction() { - //ProcessErrorBeforeContinue - a8kPublicAreaResourceMgr.applyForResources(this, - A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea, A8kPublicAreaResource.HbotArea); - Tube tube = tubeStateMgrService.getCurProcessingTube(); Assert.isTrue(tube != null, "tube != null"); if (tube.getState().equals(TubeState.PROCESSED)) { return List.of(); } - try { + try (var ignored = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea); + var ignored1 = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea); + ) { resetHbotAndShakeModule(); } catch (AppException e) { logger.error("catch error {}", e.getMessage(), e); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java index fa2e402..d92c0b4 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java @@ -1,8 +1,8 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; +import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appstate.GStateService; @@ -52,7 +52,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { OptScanModuleCtrlService optScanModuleCtrlService; @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; IncubationSubTank errorTank; @@ -85,7 +85,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { } @Override public List doAction() { - a8kPublicAreaResourceMgr.applyForResources(A8kPublicAreaResource.IncubationPlateArea, A8kPublicAreaResource.OptScanArea); + publicAreaResourceMgr.apply(PublicAreaResource.IncubationPlateArea, PublicAreaResource.OptScanArea); if (errorTank == null) { return List.of(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java index 7d7c31f..c4a2ebf 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java @@ -2,9 +2,9 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.a8kproj.A8kReactionResultComputer; import a8k.a8kproj.optalgo.type.OptScanResult; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; +import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appdata.ReactionRecordMgrService; @@ -49,9 +49,9 @@ public class PLATE_OPT_SCAN extends A8kStepAction { VirtualDevice virtualDevice; @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; + OptScanModuleStateMgrService optScanModuleStateMgrService; @Resource - ReactionRecordMgrService reactionRecordMgrService; + ReactionRecordMgrService reactionRecordMgrService; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; @@ -61,7 +61,7 @@ public class PLATE_OPT_SCAN extends A8kStepAction { @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; public Boolean isReady() { @@ -116,8 +116,9 @@ public class PLATE_OPT_SCAN extends A8kStepAction { var ctx = projectProcessContextMgrService.getProjProcessContext(optScanModule.getSampleId(), optScanModule.getProjId()); - a8kPublicAreaResourceMgr.applyForResources(this, A8kPublicAreaResource.OptScanArea); - try { + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.OptScanArea); + ) { log.info("扫描板夹"); scanResults = doOptScanXX(ctx); } catch (AppException e) { diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java index 020ea91..3b46321 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java @@ -1,8 +1,8 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; +import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appstate.statemgr.IncubationPlateStateMgrService; @@ -28,6 +28,7 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { PROCESS_INCUBATE_COMPLETED_PLATE() { super(A8kActionStepType.PROCESS_INCUBATE_COMPLETED_PLATE); } + @Resource VirtualDevice virtualDevice; @@ -37,12 +38,11 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { OptScanModuleStateMgrService optScanModuleStateMgrService; - @Resource OptScanModuleCtrlService optScanModuleCtrlService; @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; public Boolean isReady() { @@ -66,12 +66,15 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { IncubationSubTank toBeProcesstank; @Override public List doAction() { - a8kPublicAreaResourceMgr.applyForResources(this, A8kPublicAreaResource.OptScanArea, A8kPublicAreaResource.IncubationPlateArea); IncubationSubTank tank = getToBeProcessedTank(); if (tank == null) { return List.of(); } - try { + + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.OptScanArea); + var ignored1 = publicAreaResourceMgr.apply(PublicAreaResource.IncubationPlateArea); + ) { doEjectPlate(tank); } catch (AppException e) { logger.error("catch e,{}", e.getMessage(), e); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 9b5ef46..3a5539c 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -4,7 +4,7 @@ import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.service.app.appctrl.AppTubeSettingMgrService; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.*; import a8k.service.app.appdata.ProjInfoMgrService; import a8k.service.app.appstate.GStateService; @@ -86,9 +86,9 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { //StateMgr // @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; @Resource - TubeStateMgrService tubeStateMgrService; + TubeStateMgrService tubeStateMgrService; // @@ -234,9 +234,8 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { TubeHolderScanResult scanResult; //申请硬件资源 - a8kPublicAreaResourceMgr.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); - try { + try(var rseult = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea)) { scanResult = doScanHolder(); if (scanResult == null) { doEjectHodler(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index 337f579..4ae487f 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -1,8 +1,8 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; +import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appstate.statemgr.TubeStateMgrService; @@ -33,7 +33,8 @@ import java.util.List; @Component @MainFlowProcesser public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(SEQ2_SWITCH_TO_THE_NEXT_TUBE.class); + 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); } @@ -42,9 +43,9 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeFeedingCtrlService tubeFeedingCtrlService; + TubeFeedingCtrlService tubeFeedingCtrlService; @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; // @@ -82,8 +83,6 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { @Override public List doAction() { //申请资源 - a8kPublicAreaResourceMgr.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); - if (tubeStateMgrService.isHasEmergencyTubeToBeProcessed()) { //处理急诊试管 nextTubeIsEmergency = true; @@ -92,12 +91,18 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { //处理正常试管 int nextTubeIndexVar = tubeStateMgrService.getNextTubeIndex(); Assert.isTrue(nextTubeIndexVar != -1, "nextTubeIndexVar != -1"); - try { + + + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea); + ) { moveToNextTube(nextTubeIndexVar); } catch (AppException e) { logger.error("moveToNextTube error {}", e.getMessage(), e); return List.of(e.getError()); } + + nextTubeIsEmergency = false; nextTubeIndex = nextTubeIndexVar; } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java index d946217..82b91c9 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java @@ -2,17 +2,15 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.OS; import a8k.constant.LogTopic; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.*; import a8k.service.app.appstate.statemgr.IncubationPlateStateMgrService; import a8k.service.app.appstate.statemgr.ProjectProcessContextMgrService; import a8k.service.app.appstate.statemgr.TubeStateMgrService; -import a8k.service.app.appstate.type.IncubationPlate; import a8k.service.app.appstate.type.ProjProcessContext; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicectrl.ctrlservice.PipetteGunCtrlService; import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; import a8k.service.app.devicectrl.script.DeviceCtrlScripter; @@ -23,12 +21,9 @@ import a8k.type.ecode.AppError; import a8k.type.exception.AppException; import a8k.type.exception.ZAppInterruptException; import a8k.type.type.A8kTubeHolderType; -import a8k.utils.AppExceptionBuilder; import a8k.utils.ProjProcessContextUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.Assert; @@ -49,7 +44,7 @@ public class SEQ5_PROCESS extends A8kStepAction { // Struct // public interface ActionTask { - void call(String actionTaskMarker) throws AppException, ZAppInterruptException; + void call() throws AppException, ZAppInterruptException; } public class IncubationStateCache { @@ -79,7 +74,7 @@ public class SEQ5_PROCESS extends A8kStepAction { @Resource ProjectProcessContextMgrService projectProcessContextMgrService; @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; @Resource TubeStateMgrService tubeStateMgrService; // @@ -185,7 +180,7 @@ public class SEQ5_PROCESS extends A8kStepAction { // - void samplePrepare(String actionTaskMarker) throws AppException, ZAppInterruptException { + void samplePrepare() throws AppException, ZAppInterruptException { Tube tube = tubeStateMgrService.getCurProcessingTube(); TubeHolder tubeHolder = tubeStateMgrService.getTubeHolder(); Boolean isHighTube = tube.getIsHighTube(); @@ -198,11 +193,15 @@ public class SEQ5_PROCESS extends A8kStepAction { log.info("摇匀次数 :{}", shakeTimes); log.info("试管架类型 :{}", tubeHolder.getTubeHolderType()); log.info("是否高位试管:{}", isHighTube); - a8kPublicAreaResourceMgr.applyForResources(this, actionTaskMarker, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); - tubePreProcesCtrlService.takeTubeFromTubeholderToShakePos(isHighTube); - tubePreProcesCtrlService.shakeTube(45, shakeTimes); - tubePreProcesCtrlService.takeTubeCap(); - a8kPublicAreaResourceMgr.releaseAllResource(this, actionTaskMarker); + + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea); + ) { + tubePreProcesCtrlService.takeTubeFromTubeholderToShakePos(isHighTube); + tubePreProcesCtrlService.shakeTube(45, shakeTimes); + tubePreProcesCtrlService.takeTubeCap(); + } + } else { log.info("不是全血试管,不需要摇匀"); } @@ -211,13 +210,15 @@ public class SEQ5_PROCESS extends A8kStepAction { sampleProcessFinished.waitTrue(); //样本后处理 - a8kPublicAreaResourceMgr.applyForResources(this, actionTaskMarker, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); - tubePreProcesCtrlService.resteModule(); - a8kPublicAreaResourceMgr.releaseAllResource(this, actionTaskMarker); + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea); + ) { + tubePreProcesCtrlService.resteModule(); + } } - void paltePrepare(String actionTaskMarker) throws AppException, ZAppInterruptException { + void paltePrepare() throws AppException, ZAppInterruptException { Tube tube = tubeStateMgrService.getCurProcessingTube(); // // REAL @@ -226,16 +227,23 @@ public class SEQ5_PROCESS extends A8kStepAction { List cxts = projectProcessContextMgrService.getTubeAssociatedProjContext(tube.getSampleId()); for (ProjProcessContext cxt : cxts) { - IncubatorPos incubatorPos = cxt.recourcePacket.incubatorPos; ; - a8kPublicAreaResourceMgr.applyForResources(this, actionTaskMarker, A8kPublicAreaResource.PlateBoxArea, A8kPublicAreaResource.IncubationPlateArea); - plateBoxCtrlService.pushPlateQuick(cxt.recourcePacket.consumable.getGroup(), incubatorPos); - a8kPublicAreaResourceMgr.releaseAllResource(this, actionTaskMarker); + IncubatorPos incubatorPos = cxt.recourcePacket.incubatorPos; + ; + + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.PlateBoxArea); + var ignored1 = publicAreaResourceMgr.apply(PublicAreaResource.IncubationPlateArea); + ) { + plateBoxCtrlService.pushPlateQuick(cxt.recourcePacket.consumable.getGroup(), incubatorPos); + } + + + reactionPlateReady.set(); } - reactionPlateReady.set(); } - void sampleProcess(String actionTaskMarker) throws AppException, ZAppInterruptException { + void sampleProcess() throws AppException, ZAppInterruptException { Tube tube = tubeStateMgrService.getCurProcessingTube(); @@ -243,26 +251,34 @@ public class SEQ5_PROCESS extends A8kStepAction { List cxts = projectProcessContextMgrService.getTubeAssociatedProjContext(tube.getSampleId()); Assert.isTrue(!cxts.isEmpty(), "项目上下文不能为空"); - a8kPublicAreaResourceMgr.applyForResources(this, actionTaskMarker, A8kPublicAreaResource.HbotArea); - for (ProjProcessContext cxt : cxts) { - deviceCtrlScripter.doSampleProcessPrepare(cxt); - sampleIsReady.waitTrue(); - deviceCtrlScripter.doSampleProcess(cxt); - reactionPlateReady.waitTrue(); + try ( + var ignored = publicAreaResourceMgr.apply(PublicAreaResource.HbotArea); + ) { + for (ProjProcessContext cxt : cxts) { + deviceCtrlScripter.doSampleProcessPrepare(cxt); + sampleIsReady.waitTrue(); + deviceCtrlScripter.doSampleProcess(cxt); + reactionPlateReady.waitTrue(); + - a8kPublicAreaResourceMgr.applyForResources(this, actionTaskMarker, A8kPublicAreaResource.IncubationPlateArea); - deviceCtrlScripter.doSampleProcessPostProcess(cxt); - a8kPublicAreaResourceMgr.releaseResource(A8kPublicAreaResource.IncubationPlateArea); + try ( + var ignored1 = publicAreaResourceMgr.apply(PublicAreaResource.IncubationPlateArea); + ) { + deviceCtrlScripter.doSampleProcessPostProcess(cxt); + } - incubationStateCache.add( - new IncubationStateCache( - cxt.recourcePacket.incubatorPos, - System.currentTimeMillis(), - cxt.projInfoContext.getReactionPlateIncubationTimeMin() * 60)); + incubationStateCache.add( + new IncubationStateCache( + cxt.recourcePacket.incubatorPos, + System.currentTimeMillis(), + cxt.projInfoContext.getReactionPlateIncubationTimeMin() * 60)); + } } + + sampleProcessFinished.set(); } @@ -294,18 +310,17 @@ public class SEQ5_PROCESS extends A8kStepAction { return executor.submit(() -> { AppError error = null; try { - actionTask.call(actionTaskMarker); + actionTask.call(); reactionPlateReady.interrupt(); sampleIsReady.interrupt(); sampleProcessFinished.interrupt(); } catch (AppException e) { - log.error("异常", e); + log.error("{} catch 异常", actionTaskMarker, e); error = e.error; } catch (ZAppInterruptException ignored) { } - a8kPublicAreaResourceMgr.releaseAllResource(this, actionTaskMarker); return error; }); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java index 4f9b19a..e392b13 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java @@ -1,8 +1,8 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.service.app.appctrl.mainflowctrl.A8kPublicAreaResourceMgr; +import a8k.service.app.appctrl.mainflowctrl.PublicAreaResourceMgr; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResource; +import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appctrl.mainflowctrl.base.MainFlowProcesser; import a8k.service.app.appstate.GStateService; @@ -57,7 +57,7 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { TubeStateMgrService tubeStateMgrService; @Resource - A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr; + PublicAreaResourceMgr publicAreaResourceMgr; public Boolean isReady() { @@ -71,8 +71,7 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { @Override public List doAction() { - a8kPublicAreaResourceMgr.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea); - try { + try (var ignored = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea)) { if (!virtualDevice.isEnable()) { tubeFeedingCtrlService.ejectTubeHolder(); tubeFeedingCtrlService.moveTubeRackMoveToEnterPos(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResource.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResource.java deleted file mode 100644 index fc1c96f..0000000 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResource.java +++ /dev/null @@ -1,9 +0,0 @@ -package a8k.service.app.appctrl.mainflowctrl.base; - -public enum A8kPublicAreaResource { - HbotArea, //HBOT - TubeSampleProcessAndTubeChannelArea, //样本取样位,试管通道 - PlateBoxArea, //板夹仓 - IncubationPlateArea, //孵育盘 - OptScanArea, //光学扫描区 -} diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResourcePacket.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResourcePacket.java new file mode 100644 index 0000000..afd9f16 --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResourcePacket.java @@ -0,0 +1,17 @@ +package a8k.service.app.appctrl.mainflowctrl.base; + +import java.util.List; + +public class A8kPublicAreaResourcePacket implements AutoCloseable { + List areas; + + public A8kPublicAreaResourcePacket(List areas) { + this.areas = areas; + } + + @Override public void close() { + for (PublicAreaResource area : areas) { + area.close(); + } + } +} diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/PublicAreaResource.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/PublicAreaResource.java new file mode 100644 index 0000000..25ca9aa --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/PublicAreaResource.java @@ -0,0 +1,24 @@ +package a8k.service.app.appctrl.mainflowctrl.base; + +public enum PublicAreaResource implements AutoCloseable { + HbotArea, //HBOT + TubeSampleProcessAndTubeChannelArea, //样本取样位,试管通道 + PlateBoxArea, //板夹仓 + IncubationPlateArea, //孵育盘 + OptScanArea, + ; //光学扫描区 + + Boolean rent = false; + + synchronized @Override public void close() { + rent = false; + } + + synchronized public void setRent() { + rent = true; + } + + synchronized public Boolean isRent() { + return rent; + } +}