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.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.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.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