Browse Source

调整资源申请接口

tags/v0
zhaohe 9 months ago
parent
commit
fd74acf43d
  1. 161
      src/main/java/a8k/service/app/appctrl/mainflowctrl/A8kPublicAreaResourceMgr.java
  2. 5
      src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java
  3. 64
      src/main/java/a8k/service/app/appctrl/mainflowctrl/PublicAreaResourceMgr.java
  4. 16
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java
  5. 8
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java
  6. 15
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java
  7. 15
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java
  8. 9
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  9. 21
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  10. 97
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java
  11. 9
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java
  12. 9
      src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResource.java
  13. 17
      src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResourcePacket.java
  14. 24
      src/main/java/a8k/service/app/appctrl/mainflowctrl/base/PublicAreaResource.java

161
src/main/java/a8k/service/app/appctrl/mainflowctrl/A8kPublicAreaResourceMgr.java

@ -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<Resource> 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 = "";
}
}
}
}
}

5
src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java

@ -37,9 +37,9 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
@Resource
DeviceWorkStateMgrService deviceWorkStateMgrService;
@Resource
AppEventBusService ebus;
AppEventBusService ebus;
@Resource
A8kPublicAreaResourceMgr a8kPublicAreaResourceMgr;
PublicAreaResourceMgr publicAreaResourceMgr;
List<A8kStepAction> allActions = new ArrayList<>();
List<A8kStepAction> foregroundActions = new ArrayList<>();
@ -187,7 +187,6 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
deviceWorkStateMgrService.addError(AppActionErrorContext.ofList(action.step, errors));
// clear future
action.future = null;
a8kPublicAreaResourceMgr.releaseAllResource(action);
} catch (InterruptedException | ExecutionException e) {
logger.error("error {}", e.getMessage(), e);
}

64
src/main/java/a8k/service/app/appctrl/mainflowctrl/PublicAreaResourceMgr.java

@ -0,0 +1,64 @@
package a8k.service.app.appctrl.mainflowctrl;
import a8k.OS;
import a8k.service.app.appctrl.mainflowctrl.base.PublicAreaResource;
import a8k.service.app.appctrl.mainflowctrl.base.A8kPublicAreaResourcePacket;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Vector;
@Component
@Slf4j
public class PublicAreaResourceMgr {
static Logger logger = LoggerFactory.getLogger(PublicAreaResourceMgr.class);
List<PublicAreaResource> 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));
}
}

16
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<AppError> 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);

8
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<AppError> doAction() {
a8kPublicAreaResourceMgr.applyForResources(A8kPublicAreaResource.IncubationPlateArea, A8kPublicAreaResource.OptScanArea);
publicAreaResourceMgr.apply(PublicAreaResource.IncubationPlateArea, PublicAreaResource.OptScanArea);
if (errorTank == null) {
return List.of();
}

15
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) {

15
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<AppError> 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);

9
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();

21
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<AppError> 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;
}

97
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<ProjProcessContext> 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<ProjProcessContext> 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;
});
}

9
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<AppError> doAction() {
a8kPublicAreaResourceMgr.applyForResources(this, A8kPublicAreaResource.TubeSampleProcessAndTubeChannelArea);
try {
try (var ignored = publicAreaResourceMgr.apply(PublicAreaResource.TubeSampleProcessAndTubeChannelArea)) {
if (!virtualDevice.isEnable()) {
tubeFeedingCtrlService.ejectTubeHolder();
tubeFeedingCtrlService.moveTubeRackMoveToEnterPos();

9
src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kPublicAreaResource.java

@ -1,9 +0,0 @@
package a8k.service.app.appctrl.mainflowctrl.base;
public enum A8kPublicAreaResource {
HbotArea, //HBOT
TubeSampleProcessAndTubeChannelArea, //样本取样位,试管通道
PlateBoxArea, //板夹仓
IncubationPlateArea, //孵育盘
OptScanArea, //光学扫描区
}

17
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<PublicAreaResource> areas;
public A8kPublicAreaResourcePacket(List<PublicAreaResource> areas) {
this.areas = areas;
}
@Override public void close() {
for (PublicAreaResource area : areas) {
area.close();
}
}
}

24
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;
}
}
Loading…
Cancel
Save