Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
0248ccf44d
  1. 23
      src/main/java/a8k/service/appctrl/CondtionMgrService.java
  2. 7
      src/main/java/a8k/service/appctrl/MainFlowCtrlService.java
  3. 13
      src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java
  4. 2
      src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java
  5. 34
      src/main/java/a8k/service/appctrl/action/errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java
  6. 82
      src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_PLATE.java
  7. 84
      src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_TUBE.java
  8. 82
      src/main/java/a8k/service/appctrl/action/incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java
  9. 6
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  10. 2
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  11. 5
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java
  12. 4
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java
  13. 7
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java
  14. 3
      src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java
  15. 83
      src/main/java/a8k/service/appstate/IncubationPlateMgrService.java
  16. 41
      src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java
  17. 7
      src/main/java/a8k/service/appstate/resource/A8kPublicResourceType.java
  18. 2
      src/main/java/a8k/service/appstate/type/IncubationSubTank.java
  19. 4
      src/main/java/a8k/service/appstate/type/OptScanModule.java
  20. 1
      src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java
  21. 3
      src/main/java/a8k/service/appstate/type/state/OptScanModuleState.java

23
src/main/java/a8k/service/appctrl/CondtionMgrService.java

@ -4,8 +4,10 @@ import a8k.hardware.A8kCanBusService;
import a8k.hardware.type.a8kcanprotocol.IOId;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.OptScanModuleStateMgrService;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.IncubationSubTankState;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.exception.AppException;
@ -28,6 +30,9 @@ public class CondtionMgrService {
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
OptScanModuleStateMgrService optScanModuleStateMgrService;
Boolean getTubeholderEnterPosPPS() { //入料通道是否为空
try {
return canBus.getIOState(IOId.InfeedPPS);
@ -42,7 +47,7 @@ public class CondtionMgrService {
}
public Boolean isCanDoAction() {
return gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING) && !gstate.mainFlowCtrlState.errorFlag && !gstate.mainFlowCtrlState.workStateChangeFlag;
return gstate.mainFlowCtrlState.workState.equals(A8kWorkState.WORKING) && !gstate.mainFlowCtrlState.errorFlag && !gstate.mainFlowCtrlState.workStateChangeFlag;
}
@ -54,6 +59,10 @@ public class CondtionMgrService {
return gstate.getCurProcessingTube() == null || gstate.getCurProcessingTube().state.equals(TubeState.PROCESS_COMPLETE);
}
public Boolean isOptModuleEmpty() {
return optScanModuleStateMgrService.isEmpty();
}
public Boolean isTimeToEnterNewTubeHolder() {
Boolean cond0 = isCanDoAction();
//试管架处于空闲状态
@ -127,4 +136,16 @@ public class CondtionMgrService {
Boolean cond3 = incubationPlateMgrService.isHasEnoughIncubationIDLEPos(tube.projIndex.size());
return cond1 && cond2 && cond3;
}
public Boolean isHasSomeErrorPlatesToBeProcessed() {
return incubationPlateMgrService.isHasSomeErrorPlate();
}
public Boolean isHasSomeErrorTubeToBeProcessed() {
Tube tube = gstate.getCurProcessingTube();
if (tube == null)
return false;
return gstate.getEmergencyTubePos().tube.state.equals(TubeState.ERROR);
}
}

7
src/main/java/a8k/service/appctrl/MainFlowCtrlService.java

@ -47,9 +47,6 @@ public class MainFlowCtrlService {
logger.info("className {}", DO_STOP.class.getName());
for (A8kActionStepType actionType : A8kActionStepType.values()) {
if (actionType.equals(A8kActionStepType.DO_CLEAR_ERROR)) {
continue;
}
A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class);
scheduler.regFn(action);
}
@ -134,25 +131,21 @@ public class MainFlowCtrlService {
public void startWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.startActionPending = true;
}
public void stopWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.stopActionPending = true;
}
public void pauseWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.pauseActionPending = true;
}
public void continueWork() {
MainFlowCtrlState state = gstate.getMainFlowCtrlState();
scheduler.setClearErrorPendingFlag();
state.resumeActionPending = true;
}
}

13
src/main/java/a8k/service/appctrl/action/base/A8kActionStepType.java

@ -5,7 +5,6 @@ public enum A8kActionStepType {
DO_PAUSE,//暂停
DO_STOP, //停止
DO_RESUME,//恢复
DO_CLEAR_ERROR,//清除错误,特殊动作,无需注册成类型
//mainflow
SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描
@ -16,5 +15,15 @@ public enum A8kActionStepType {
SEQ6_POST_PROCESS,
SEQ7_EJECT_TUBEHOLDER, //弹出试管架
//
//incubate
PROCESS_INCUBATE_COMPLETED_PLATE,//处理孵育完成的板
//OPT
PLATE_OPT_SCAN,
PLATE_OPT_DROP,
//Error
DO_CLEAR_ERROR_BEFORE_WORK,//在启动前清除错误
DO_PROCESS_ERROR_TUBE,
DO_PROCESS_ERROR_PLATE,
}

2
src/main/java/a8k/service/appctrl/action/ctrl/DO_START.java

@ -50,6 +50,6 @@ public class DO_START extends A8kStepAction {
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(A8kPublicResourceType.SampleTransferXMotor);
return List.of(A8kPublicResourceType.ShakeModule);
}
}

34
src/main/java/a8k/service/appctrl/action/ctrl/DO_CLEAR_ERROR.java → src/main/java/a8k/service/appctrl/action/errorhandler/DO_CLEAR_ERROR_BEFORE_WORK.java

@ -1,12 +1,18 @@
package a8k.service.appctrl.action.ctrl;
package a8k.service.appctrl.action.errorhandler;
import a8k.OS;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.OptScanModuleStateMgrService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.IncubationSubTank;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.service.appstate.type.state.IncubationSubTankState;
import a8k.service.appstate.type.state.TubeState;
import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -17,23 +23,31 @@ import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class DO_CLEAR_ERROR extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_CLEAR_ERROR.class);
public class DO_CLEAR_ERROR_BEFORE_WORK extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_CLEAR_ERROR_BEFORE_WORK.class);
DO_CLEAR_ERROR() {
super(A8kActionStepType.DO_PAUSE);
DO_CLEAR_ERROR_BEFORE_WORK() {
super(A8kActionStepType.DO_CLEAR_ERROR_BEFORE_WORK);
}
@Resource
GStateService gstate;
GStateService gstate;
@Resource
CondtionMgrService cms;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
OptScanModuleStateMgrService optScanModuleStateMgrService;
MainFlowCtrlState mfcs;
@PostConstruct
void init() {
mfcs = gstate.mainFlowCtrlState;
}
@Override public void doaction() throws AppException {
//ProcessErrorBeforeContinue
@ -53,6 +67,10 @@ public class DO_CLEAR_ERROR extends A8kStepAction {
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of();
return List.of(
A8kPublicResourceType.IncubationPlateModule,
A8kPublicResourceType.OPTModule,
A8kPublicResourceType.PlatesBoxModule
);
}
}

82
src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_PLATE.java

@ -0,0 +1,82 @@
package a8k.service.appctrl.action.errorhandler;
import a8k.OS;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.OptScanModuleStateMgrService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.IncubationSubTank;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.IncubationSubTankState;
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_PROCESS_ERROR_PLATE extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_PROCESS_ERROR_PLATE.class);
DO_PROCESS_ERROR_PLATE() {
super(A8kActionStepType.DO_PROCESS_ERROR_PLATE);
}
@Resource
GStateService gstate;
@Resource
CondtionMgrService cms;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
OptScanModuleStateMgrService optScanModuleStateMgrService;
MainFlowCtrlState mfcs;
@PostConstruct
void init() {
mfcs = gstate.mainFlowCtrlState;
}
@Override public void doaction() throws AppException {
//ProcessErrorBeforeContinue
while (true) {
IncubationSubTank errorTank = incubationPlateMgrService.getErrorPlate();
if (errorTank == null) {
break;
}
logger.info("处理错误板夹:{}", errorTank.pos);
//TODO:推出板夹到光学模组,同时丢弃板夹
logger.info("推出板夹到光学模组");
logger.info("丢弃板夹");
OS.forceSleep(3000);
//
optScanModuleStateMgrService.newPlateToOptScanPos(errorTank);
optScanModuleStateMgrService.dropPlate();
incubationPlateMgrService.setIncubationPlateState(errorTank.pos, IncubationSubTankState.EMPTY);
}
}
@Override public Boolean checkCondition() {
Boolean cond1 = cms.isCanDoAction();
Boolean cond2 = cms.isHasSomeErrorPlatesToBeProcessed();
Boolean cond3 = cms.isOptModuleEmpty();
return cond1 && cond2 && cond3;
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of();
}
}

84
src/main/java/a8k/service/appctrl/action/errorhandler/DO_PROCESS_ERROR_TUBE.java

@ -0,0 +1,84 @@
package a8k.service.appctrl.action.errorhandler;
import a8k.OS;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.OptScanModuleStateMgrService;
import a8k.service.appstate.TubeProcessStateMgrService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.A8kWorkState;
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;
/**
* 处理错误的试管
*/
@Component
public class DO_PROCESS_ERROR_TUBE extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_PROCESS_ERROR_TUBE.class);
DO_PROCESS_ERROR_TUBE() {
super(A8kActionStepType.DO_PROCESS_ERROR_TUBE);
}
@Resource
GStateService gstate;
@Resource
CondtionMgrService cms;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
OptScanModuleStateMgrService optScanModuleStateMgrService;
@Resource
TubeProcessStateMgrService tubeProcessStateMgrService;
MainFlowCtrlState mfcs;
@PostConstruct
void init() {
mfcs = gstate.mainFlowCtrlState;
}
@Override public void doaction() throws AppException {
//ProcessErrorBeforeContinue
Tube tube = gstate.getCurProcessingTube();
assert tube != null;
logger.info("处理错误试管:{}", tube.sampleid);
logger.info("复位摇匀模组");
OS.forceSleep(4000);
//复位摇匀模组
logger.info("复位HBOT");
//复位HBOT
OS.forceSleep(4000);
tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESS_COMPLETE);
}
@Override public Boolean checkCondition() {
Boolean cond1 = cms.isCanDoAction();
Boolean cond2 = cms.isHasSometubesToBeProcessed();
return cond1 && cond2;
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.ShakeModule,
A8kPublicResourceType.HBOT
);
}
}

82
src/main/java/a8k/service/appctrl/action/incubate/PROCESS_INCUBATE_COMPLETED_PLATE.java

@ -0,0 +1,82 @@
package a8k.service.appctrl.action.incubate;
import a8k.OS;
import a8k.service.appctrl.CondtionMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.IncubationPlateMgrService;
import a8k.service.appstate.OptScanModuleStateMgrService;
import a8k.service.appstate.TubeProcessStateMgrService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.IncubationSubTank;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.type.Tube;
import a8k.service.appstate.type.state.IncubationSubTankState;
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;
/**
* 处理错误的试管
*/
@Component
public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(PROCESS_INCUBATE_COMPLETED_PLATE.class);
PROCESS_INCUBATE_COMPLETED_PLATE() {
super(A8kActionStepType.PROCESS_INCUBATE_COMPLETED_PLATE);
}
@Resource
GStateService gstate;
@Resource
CondtionMgrService cms;
@Resource
IncubationPlateMgrService incubationPlateMgrService;
@Resource
OptScanModuleStateMgrService optScanModuleStateMgrService;
@Resource
TubeProcessStateMgrService tubeProcessStateMgrService;
MainFlowCtrlState mfcs;
@PostConstruct
void init() {
mfcs = gstate.mainFlowCtrlState;
}
@Override public void doaction() throws AppException {
IncubationSubTank tank = incubationPlateMgrService.getOneExpiredPlate();
if (tank == null) {
return;
}
logger.info("推出板夹到光学模组,{}", tank.pos);
OS.forceSleep(3000);
optScanModuleStateMgrService.newPlateToOptScanPos(tank);
incubationPlateMgrService.setIncubationPlateState(tank.pos, IncubationSubTankState.EMPTY);
}
@Override public Boolean checkCondition() {
Boolean cond1 = cms.isCanDoAction();
Boolean cond2 = incubationPlateMgrService.isHasExpiredPlate();
Boolean cond3 = optScanModuleStateMgrService.isEmpty();
return cond1 && cond2 && cond3;
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.OPTModule,
A8kPublicResourceType.IncubationPlateModule
);
}
}

6
src/main/java/a8k/service/appctrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java

@ -4,15 +4,12 @@ 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.appctrl.CondtionMgrService;
import a8k.service.appdata.AppSampleRecordMgrService;
import a8k.service.appctrl.AppTubeSettingMgrService;
import a8k.service.appctrl.action.base.A8kActionStepType;
import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.TubeProcessContextMgrService;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.TubeHolder;
import a8k.service.appstate.type.state.TubeHolderState;
@ -22,7 +19,6 @@ 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;
@ -224,7 +220,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(A8kPublicResourceType.SampleTransferXMotor);
return List.of(A8kPublicResourceType.ShakeModule);
}
//

2
src/main/java/a8k/service/appctrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java

@ -101,6 +101,6 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(A8kPublicResourceType.SampleTransferXMotor);
return List.of(A8kPublicResourceType.ShakeModule);
}
}

5
src/main/java/a8k/service/appctrl/action/mainflow/SEQ4_PRE_PROCESS.java

@ -9,7 +9,6 @@ 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.service.devicedriver.ctrl.HbotControlService;
@ -211,8 +210,8 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction {
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.IncubationPlateMotor,
A8kPublicResourceType.PlatesBoxMotor,
A8kPublicResourceType.IncubationPlateModule,
A8kPublicResourceType.PlatesBoxModule,
A8kPublicResourceType.HBOT,
A8kPublicResourceType.CurTubeProcessToken
);

4
src/main/java/a8k/service/appctrl/action/mainflow/SEQ5_PROCESS.java

@ -67,7 +67,7 @@ public class SEQ5_PROCESS extends A8kStepAction {
Tube tube = gstate.getCurProcessingTube();
OS.forceSleep(3000);
tubeProcessStateMgrService.setCurTubeState(TubeState.PROCESSED);
incubationPlateMgrService.startIncubating(tube);
incubationPlateMgrService.startIncubating(tube, 60 * 2);
logger.info("pre process success");
}
@ -78,7 +78,7 @@ public class SEQ5_PROCESS extends A8kStepAction {
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.IncubationPlateMotor,
A8kPublicResourceType.IncubationPlateModule,
A8kPublicResourceType.HBOT,
A8kPublicResourceType.CurTubeProcessToken
);

7
src/main/java/a8k/service/appctrl/action/mainflow/SEQ6_POST_PROCESS.java

@ -10,9 +10,7 @@ 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;
@ -20,7 +18,6 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.*;
/**
@ -76,8 +73,8 @@ public class SEQ6_POST_PROCESS extends A8kStepAction {
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(
A8kPublicResourceType.IncubationPlateMotor,
A8kPublicResourceType.PlatesBoxMotor,
A8kPublicResourceType.IncubationPlateModule,
A8kPublicResourceType.PlatesBoxModule,
A8kPublicResourceType.HBOT,
A8kPublicResourceType.CurTubeProcessToken
);

3
src/main/java/a8k/service/appctrl/action/mainflow/SEQ7_EJECT_TUBEHOLDER.java

@ -6,7 +6,6 @@ import a8k.service.appctrl.action.base.A8kStepAction;
import a8k.service.appstate.GStateService;
import a8k.service.appstate.type.MainFlowCtrlState;
import a8k.service.appstate.resource.A8kPublicResourceType;
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;
@ -56,6 +55,6 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction {
}
@Override public List<A8kPublicResourceType> getResourceList() {
return List.of(A8kPublicResourceType.SampleTransferXMotor);
return List.of(A8kPublicResourceType.ShakeModule);
}
}

83
src/main/java/a8k/service/appstate/IncubationPlateMgrService.java

@ -11,6 +11,7 @@ import a8k.type.IncubatorPos;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
@ -33,6 +34,55 @@ public class IncubationPlateMgrService {
return count >= num;
}
/**
* 是否有错误的板夹
* @return true 有错误的板夹
*/
synchronized public Boolean isHasSomeErrorPlate() {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (IncubationSubTank subtank : subtanks) {
if (subtank.state.equals(IncubationSubTankState.ERROR)) {
return true;
}
}
return false;
}
synchronized public Boolean isHasExpiredPlate() {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (IncubationSubTank subtank : subtanks) {
if (subtank.state.equals(IncubationSubTankState.INCUBATING)) {
var now = new Date();
var diff = now.getTime() - subtank.startIncubatedTime.getTime();
if (diff > subtank.incubatedTimeSec * 1000) {
return true;
}
}
}
return false;
}
synchronized public IncubationSubTank getOneExpiredPlate() {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (IncubationSubTank subtank : subtanks) {
if (subtank.state.equals(IncubationSubTankState.INCUBATING)) {
var now = new Date();
var diff = now.getTime() - subtank.startIncubatedTime.getTime();
if (diff > subtank.incubatedTimeSec * 1000) {
return subtank;
}
}
}
return null;
}
synchronized public List<IncubatorPos> takeIncubationIDLEPos(Integer num) {
var incubationState = gstate.getIncubationPlate();
@ -57,6 +107,11 @@ public class IncubationPlateMgrService {
return ret;
}
/**
* 设置孵育板夹状态
* @param pos 位置
* @param state 状态
*/
synchronized public void setIncubationPlateState(IncubatorPos pos, IncubationSubTankState state) {
var incubationState = gstate.getIncubationPlate();
@ -84,20 +139,22 @@ public class IncubationPlateMgrService {
for (ProjProcessContext context : tube.projProcessContexts) {
subtanks[context.incubatorPos.off].state = IncubationSubTankState.WAITING_FOR_DROP;
subtanks[context.incubatorPos.off].projProcessContxt = context;
subtanks[context.incubatorPos.off].bloodType = tube.bloodType;
subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode;
subtanks[context.incubatorPos.off].userid = tube.userid;
subtanks[context.incubatorPos.off].projIndex = context.projIndex;
subtanks[context.incubatorPos.off].projName = context.projName;
subtanks[context.incubatorPos.off].bloodType = tube.bloodType;
subtanks[context.incubatorPos.off].sampleBarcode = tube.sampleBarcode;
subtanks[context.incubatorPos.off].userid = tube.userid;
subtanks[context.incubatorPos.off].projIndex = context.projIndex;
subtanks[context.incubatorPos.off].projName = context.projName;
}
}
synchronized public void startIncubating(Tube tube){
synchronized public void startIncubating(Tube tube, Integer incubatedTimeSec) {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (ProjProcessContext context : tube.projProcessContexts) {
subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING;
subtanks[context.incubatorPos.off].state = IncubationSubTankState.INCUBATING;
subtanks[context.incubatorPos.off].startIncubatedTime = new Date();
subtanks[context.incubatorPos.off].incubatedTimeSec = incubatedTimeSec;
}
}
@ -115,4 +172,16 @@ public class IncubationPlateMgrService {
}
}
synchronized public IncubationSubTank getErrorPlate() {
var incubationState = gstate.getIncubationPlate();
var subtanks = incubationState.subtanks;
for (IncubationSubTank subtank : subtanks) {
if (subtank.state.equals(IncubationSubTankState.ERROR)) {
return subtank;
}
}
return null;
}
}

41
src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java

@ -0,0 +1,41 @@
package a8k.service.appstate;
import a8k.service.appstate.type.IncubationSubTank;
import a8k.service.appstate.type.OptScanModule;
import a8k.service.appstate.type.state.IncubationSubTankState;
import a8k.service.appstate.type.state.OptScanModuleState;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class OptScanModuleStateMgrService {
@Resource
GStateService gstate;
synchronized public void newPlateToOptScanPos(IncubationSubTank tank) {
OptScanModule optScanModule = gstate.getOptScanModule();
optScanModule.state = OptScanModuleState.PLATE_IS_READY;
optScanModule.isErrorPlate = tank.state.equals(IncubationSubTankState.ERROR);
optScanModule.bloodType = tank.bloodType;
optScanModule.sampleBarcode = tank.sampleBarcode;
optScanModule.userid = tank.userid;
optScanModule.projIndex = tank.projIndex;
optScanModule.projProcessContxt = tank.projProcessContxt;
}
synchronized public void dropPlate() {
OptScanModule optScanModule = gstate.getOptScanModule();
optScanModule.state = OptScanModuleState.EMPTY;
}
synchronized public void startScanPlate() {
OptScanModule optScanModule = gstate.getOptScanModule();
optScanModule.state = OptScanModuleState.SCANNING;
}
synchronized public Boolean isEmpty() {
OptScanModule optScanModule = gstate.getOptScanModule();
return optScanModule.state.equals(OptScanModuleState.EMPTY);
}
}

7
src/main/java/a8k/service/appstate/resource/A8kPublicResourceType.java

@ -1,9 +1,10 @@
package a8k.service.appstate.resource;
public enum A8kPublicResourceType {
SampleTransferXMotor,//样本平移电机
IncubationPlateMotor,//孵育盘电机
PlatesBoxMotor,//板夹仓电机
ShakeModule,//样本平移电机
IncubationPlateModule,//孵育盘电机
OPTModule, //光学电机
PlatesBoxModule,//板夹仓电机
HBOT,//HBOT
CurTubeProcessToken,//当前管子处理令牌
}

2
src/main/java/a8k/service/appstate/type/IncubationSubTank.java

@ -26,7 +26,7 @@ public class IncubationSubTank {
//孵育时间
public Date startIncubatedTime; //开始孵育时间
public Integer targetIncubatedTimeS; //目标孵育时间
public Integer incubatedTimeSec; //目标孵育时间
public A8kEcode error = A8kEcode.NoError;

4
src/main/java/a8k/service/appstate/type/OptScanModule.java

@ -4,10 +4,12 @@ import a8k.service.appstate.type.state.OptScanModuleState;
import a8k.type.type.BloodType;
public class OptScanModule {
public OptScanModuleState state = OptScanModuleState.IDLE; //模块状态
public OptScanModuleState state = OptScanModuleState.EMPTY; //模块状态
public Boolean isErrorPlate = false; //是否是错误板
public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型
public String sampleBarcode = ""; //用于请求用户信息的条码ID
public String userid = ""; //用户输入的样本ID不做逻辑只做展示
public Integer projIndex = 0; //项目代码
public ProjProcessContext projProcessContxt;
}

1
src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java

@ -6,6 +6,5 @@ public enum IncubationSubTankState {
RESERVED,//预定
WAITING_FOR_DROP,//等待滴液
INCUBATING, //孵育中
INCUBATED, //孵育完成
ERROR,//错误
}

3
src/main/java/a8k/service/appstate/type/state/OptScanModuleState.java

@ -1,6 +1,7 @@
package a8k.service.appstate.type.state;
public enum OptScanModuleState {
IDLE,
EMPTY,
PLATE_IS_READY,
SCANNING,
}
Loading…
Cancel
Save