28 changed files with 720 additions and 411 deletions
-
130src/main/java/a8k/service/appctrl/CondtionMgrService.java
-
3src/main/java/a8k/service/appctrl/MainFlowCtrlService.java
-
14src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java
-
2src/main/java/a8k/service/appctrl/action/ctrl/DO_PAUSE.java
-
4src/main/java/a8k/service/appctrl/action/ctrl/DO_RESUME.java
-
2src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java
-
2src/main/java/a8k/service/appctrl/action/ctrl/DO_STOP.java
-
27src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
-
16src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
-
22src/main/java/a8k/service/appctrl/action/mainflow/SEQ3_APPLAY_RESOURCE.java
-
156src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java
-
96src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java
-
95src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java
-
19src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java
-
7src/main/java/a8k/service/appctrl/scheduler/MainFlowCtrlScheduler.java
-
2src/main/java/a8k/service/appstate/GStateService.java
-
29src/main/java/a8k/service/appstate/IncubationPlateMgrService.java
-
6src/main/java/a8k/service/appstate/TubeProcessContextMgrService.java
-
7src/main/java/a8k/service/appstate/TubeProcessStateMgrService.java
-
3src/main/java/a8k/service/appstate/type/IncubationSubTank.java
-
1src/main/java/a8k/service/appstate/type/ProjProcessContext.java
-
3src/main/java/a8k/service/appstate/type/Tube.java
-
1src/main/java/a8k/service/appstate/type/state/TubeState.java
@ -0,0 +1,130 @@ |
|||||
|
package a8k.service.appctrl; |
||||
|
|
||||
|
import a8k.hardware.A8kCanBusService; |
||||
|
import a8k.hardware.type.a8kcanprotocol.IOId; |
||||
|
import a8k.service.appstate.GStateService; |
||||
|
import a8k.service.appstate.IncubationPlateMgrService; |
||||
|
import a8k.service.appstate.type.Tube; |
||||
|
import a8k.service.appstate.type.state.A8kWorkState; |
||||
|
import a8k.service.appstate.type.state.TubeHolderState; |
||||
|
import a8k.service.appstate.type.state.TubeState; |
||||
|
import a8k.type.exception.AppException; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.slf4j.Logger; |
||||
|
import org.slf4j.LoggerFactory; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
|
||||
|
@Component |
||||
|
public class CondtionMgrService { |
||||
|
static Logger logger = LoggerFactory.getLogger(CondtionMgrService.class); |
||||
|
|
||||
|
@Resource |
||||
|
GStateService gstate; |
||||
|
|
||||
|
@Resource |
||||
|
A8kCanBusService canBus; |
||||
|
|
||||
|
@Resource |
||||
|
IncubationPlateMgrService incubationPlateMgrService; |
||||
|
|
||||
|
Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 |
||||
|
try { |
||||
|
return canBus.getIOState(IOId.InfeedPPS); |
||||
|
} catch (Exception e) { |
||||
|
logger.error("getTubeholderEnterPosPPS error", e); |
||||
|
return false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public Boolean isNoMoreTubeToBeProcessed() { |
||||
|
return !gstate.getTubeHolder().isHasTubeToBeProcessed(); |
||||
|
} |
||||
|
|
||||
|
public Boolean isCanDoAction() { |
||||
|
return gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING) && !gstate.mainFlowCtrlState.errorFlag; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public Boolean isHasSometubesToBeProcessed() { |
||||
|
return gstate.getTubeHolder().isHasTubeToBeProcessed() || gstate.getEmergencyTubePos().tube.state.equals(TubeState.TO_BE_PROCESSED); |
||||
|
} |
||||
|
|
||||
|
public Boolean isCurTubeProcessCompleted() { |
||||
|
return gstate.getCurProcessingTube() == null || gstate.getCurProcessingTube().state.equals(TubeState.PROCESS_COMPLETE); |
||||
|
} |
||||
|
|
||||
|
public Boolean isTimeToEnterNewTubeHolder() { |
||||
|
Boolean cond0 = isCanDoAction(); |
||||
|
//试管架处于空闲状态 |
||||
|
Boolean cond1 = gstate.getTubeHolder().state.equals(TubeHolderState.IDLE); |
||||
|
//入料通道是否为空 |
||||
|
Boolean cond2 = getTubeholderEnterPosPPS(); |
||||
|
return cond0 && cond1 && cond2; |
||||
|
} |
||||
|
|
||||
|
public Boolean isTimeToSwitchNextTube() { |
||||
|
Boolean cond0 = isCanDoAction(); |
||||
|
//当前试管处理完成 |
||||
|
Boolean cond1 = isCurTubeProcessCompleted(); |
||||
|
//有待处理的试管 |
||||
|
Boolean cond2 = isHasSometubesToBeProcessed(); |
||||
|
return cond0 && cond1 && cond2; |
||||
|
} |
||||
|
|
||||
|
public Boolean isTimeToProcessPendingTube() { |
||||
|
Tube tube = gstate.getCurProcessingTube(); |
||||
|
if (tube == null) |
||||
|
return false; |
||||
|
|
||||
|
//当前正在工作 |
||||
|
Boolean cond1 = isCanDoAction(); |
||||
|
//没有试管在处理 或者 当前试管处理完成 |
||||
|
Boolean cond2 = tube.state.equals(TubeState.PENDING); |
||||
|
//急诊有待处理的试管,或者试管架正在处理 |
||||
|
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); |
||||
|
return cond1 && cond2 && cond3; |
||||
|
} |
||||
|
|
||||
|
public Boolean isTimeToPreProcessTube() { |
||||
|
Tube tube = gstate.getCurProcessingTube(); |
||||
|
if (tube == null) |
||||
|
return false; |
||||
|
|
||||
|
//当前正在工作 |
||||
|
Boolean cond1 = isCanDoAction(); |
||||
|
//没有试管在处理 或者 当前试管处理完成 |
||||
|
Boolean cond2 = tube.state.equals(TubeState.RESOURCE_IS_READY); |
||||
|
//急诊有待处理的试管,或者试管架正在处理 |
||||
|
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); |
||||
|
return cond1 && cond2 && cond3; |
||||
|
} |
||||
|
|
||||
|
public Boolean isTimeToProcessTube() { |
||||
|
Tube tube = gstate.getCurProcessingTube(); |
||||
|
if (tube == null) |
||||
|
return false; |
||||
|
|
||||
|
//当前正在工作 |
||||
|
Boolean cond1 = isCanDoAction(); |
||||
|
//没有试管在处理 或者 当前试管处理完成 |
||||
|
Boolean cond2 = tube.state.equals(TubeState.PRE_PROCESSED); |
||||
|
//急诊有待处理的试管,或者试管架正在处理 |
||||
|
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); |
||||
|
return cond1 && cond2 && cond3; |
||||
|
} |
||||
|
|
||||
|
public Boolean isTimeToPostProcessTube() { |
||||
|
Tube tube = gstate.getCurProcessingTube(); |
||||
|
if (tube == null) |
||||
|
return false; |
||||
|
|
||||
|
//当前正在工作 |
||||
|
Boolean cond1 = isCanDoAction(); |
||||
|
//没有试管在处理 或者 当前试管处理完成 |
||||
|
Boolean cond2 = tube.state.equals(TubeState.PROCESSED); |
||||
|
//急诊有待处理的试管,或者试管架正在处理 |
||||
|
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size()); |
||||
|
return cond1 && cond2 && cond3; |
||||
|
} |
||||
|
} |
@ -1,4 +1,4 @@ |
|||||
package a8k.service.appctrl.action; |
|
||||
|
package a8k.service.appctrl.action.ctrl; |
||||
|
|
||||
import a8k.service.appctrl.action.base.A8kActionStepType; |
import a8k.service.appctrl.action.base.A8kActionStepType; |
||||
import a8k.service.appctrl.action.base.A8kStepAction; |
import a8k.service.appctrl.action.base.A8kStepAction; |
@ -1,4 +1,4 @@ |
|||||
package a8k.service.appctrl.action; |
|
||||
|
package a8k.service.appctrl.action.ctrl; |
||||
|
|
||||
import a8k.service.appctrl.action.base.A8kActionStepType; |
import a8k.service.appctrl.action.base.A8kActionStepType; |
||||
import a8k.service.appctrl.action.base.A8kStepAction; |
import a8k.service.appctrl.action.base.A8kStepAction; |
@ -1,4 +1,4 @@ |
|||||
package a8k.service.appctrl.action; |
|
||||
|
package a8k.service.appctrl.action.ctrl; |
||||
|
|
||||
import a8k.service.appctrl.action.base.A8kActionStepType; |
import a8k.service.appctrl.action.base.A8kActionStepType; |
||||
import a8k.service.appctrl.action.base.A8kStepAction; |
import a8k.service.appctrl.action.base.A8kStepAction; |
@ -0,0 +1,96 @@ |
|||||
|
package a8k.service.appctrl.action.mainflow; |
||||
|
|
||||
|
import a8k.OS; |
||||
|
import a8k.baseservice.AppExceptionBuilder; |
||||
|
import a8k.service.appctrl.CondtionMgrService; |
||||
|
import a8k.service.appctrl.action.base.A8kActionStepType; |
||||
|
import a8k.service.appctrl.action.base.A8kStepAction; |
||||
|
import a8k.service.appstate.*; |
||||
|
import a8k.service.appstate.resource.A8kPublicResourceType; |
||||
|
import a8k.service.appstate.type.MainFlowCtrlState; |
||||
|
import a8k.service.appstate.type.Tube; |
||||
|
import a8k.service.appstate.type.state.TubeState; |
||||
|
import a8k.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; |
||||
|
import java.util.concurrent.*; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* 核对物料资源是否足够 |
||||
|
* TUBE |
||||
|
* TO_BE_PROCESSED --> PRE_PROCESSING |
||||
|
*/ |
||||
|
@Component |
||||
|
public class SEQ5_PROCESS extends A8kStepAction { |
||||
|
static Logger logger = LoggerFactory.getLogger(SEQ5_PROCESS.class); |
||||
|
|
||||
|
SEQ5_PROCESS() { |
||||
|
super(A8kActionStepType.SEQ5_PROCESS); |
||||
|
} |
||||
|
|
||||
|
@Resource |
||||
|
GStateService gstate; |
||||
|
|
||||
|
@Resource |
||||
|
AppExceptionBuilder ebuilder; |
||||
|
|
||||
|
@Resource |
||||
|
TubeProcessStateMgrService tubeProcessStateMgrService; |
||||
|
|
||||
|
@Resource |
||||
|
IncubationPlateMgrService incubationPlateMgrService; |
||||
|
|
||||
|
@Resource |
||||
|
CondtionMgrService cms; |
||||
|
|
||||
|
|
||||
|
MainFlowCtrlState state; |
||||
|
|
||||
|
@PostConstruct |
||||
|
void init() { |
||||
|
state = gstate.mainFlowCtrlState; |
||||
|
} |
||||
|
|
||||
|
@Override public void doaction() throws AppException { |
||||
|
// |
||||
|
// 1.准备3份反应板夹 |
||||
|
// 2.取tip头 |
||||
|
// 3.摇匀,脱帽 |
||||
|
// |
||||
|
tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESSING); |
||||
|
Tube tube = gstate.getCurProcessingTube(); |
||||
|
OS.forceSleep(3000); |
||||
|
tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESSED); |
||||
|
incubationPlateMgrService.startIncubating(tube); |
||||
|
logger.info("pre process success"); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
@Override public Boolean checkCondition() { |
||||
|
return cms.isTimeToProcessTube(); |
||||
|
} |
||||
|
|
||||
|
@Override public List<A8kPublicResourceType> getResourceList() { |
||||
|
return List.of( |
||||
|
A8kPublicResourceType.IncubationPlateMotor, |
||||
|
A8kPublicResourceType.HBOT, |
||||
|
A8kPublicResourceType.CurTubeProcessToken |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
// |
||||
|
// UTILS |
||||
|
// |
||||
|
|
||||
|
void wait(Future<?> future) { |
||||
|
while (!future.isDone()) { |
||||
|
OS.forceSleep(100); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,95 @@ |
|||||
|
package a8k.service.appctrl.action.mainflow; |
||||
|
|
||||
|
import a8k.OS; |
||||
|
import a8k.baseservice.AppExceptionBuilder; |
||||
|
import a8k.service.appctrl.CondtionMgrService; |
||||
|
import a8k.service.appctrl.action.base.A8kActionStepType; |
||||
|
import a8k.service.appctrl.action.base.A8kStepAction; |
||||
|
import a8k.service.appstate.*; |
||||
|
import a8k.service.appstate.resource.A8kPublicResourceType; |
||||
|
import a8k.service.appstate.type.MainFlowCtrlState; |
||||
|
import a8k.service.appstate.type.Tube; |
||||
|
import a8k.service.appstate.type.state.TubeState; |
||||
|
import a8k.type.ecode.AppError; |
||||
|
import a8k.type.exception.AppException; |
||||
|
import a8k.utils.ZFnCall; |
||||
|
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; |
||||
|
import java.util.Objects; |
||||
|
import java.util.concurrent.*; |
||||
|
|
||||
|
/** |
||||
|
* |
||||
|
* 核对物料资源是否足够 |
||||
|
* TUBE |
||||
|
* TO_BE_PROCESSED --> PRE_PROCESSING |
||||
|
*/ |
||||
|
@Component |
||||
|
public class SEQ6_POST_PROCESS extends A8kStepAction { |
||||
|
static Logger logger = LoggerFactory.getLogger(SEQ6_POST_PROCESS.class); |
||||
|
|
||||
|
SEQ6_POST_PROCESS() { |
||||
|
super(A8kActionStepType.SEQ6_POST_PROCESS); |
||||
|
} |
||||
|
|
||||
|
@Resource |
||||
|
GStateService gstate; |
||||
|
|
||||
|
@Resource |
||||
|
AppExceptionBuilder ebuilder; |
||||
|
|
||||
|
@Resource |
||||
|
TubeProcessStateMgrService tubeProcessStateMgrService; |
||||
|
|
||||
|
@Resource |
||||
|
IncubationPlateMgrService incubationPlateMgrService; |
||||
|
|
||||
|
@Resource |
||||
|
CondtionMgrService cms; |
||||
|
|
||||
|
|
||||
|
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10)); |
||||
|
|
||||
|
|
||||
|
MainFlowCtrlState state; |
||||
|
|
||||
|
@PostConstruct |
||||
|
void init() { |
||||
|
state = gstate.mainFlowCtrlState; |
||||
|
} |
||||
|
|
||||
|
@Override public void doaction() throws AppException { |
||||
|
tubeProcessStateMgrService.setCurTubeState(TubeState.POST_PROCESSING); |
||||
|
Tube tube = gstate.getCurProcessingTube(); |
||||
|
OS.forceSleep(3000); |
||||
|
tubeProcessStateMgrService.setCurTubeState(TubeState.POST_PROCESSED); |
||||
|
} |
||||
|
|
||||
|
@Override public Boolean checkCondition() { |
||||
|
return cms.isTimeToPostProcessTube(); |
||||
|
} |
||||
|
|
||||
|
@Override public List<A8kPublicResourceType> getResourceList() { |
||||
|
return List.of( |
||||
|
A8kPublicResourceType.IncubationPlateMotor, |
||||
|
A8kPublicResourceType.PlatesBoxMotor, |
||||
|
A8kPublicResourceType.HBOT, |
||||
|
A8kPublicResourceType.CurTubeProcessToken |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
// |
||||
|
// UTILS |
||||
|
// |
||||
|
|
||||
|
void wait(Future<?> future) { |
||||
|
while (!future.isDone()) { |
||||
|
OS.forceSleep(100); |
||||
|
} |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue