Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
744a115ce8
  1. 38
      README.md
  2. 2
      src/main/java/a8k/baseservice/appeventbus/appevent/DoA8kStepActionEvent.java
  3. 2
      src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java
  4. 8
      src/main/java/a8k/service/appdevicectrl/AppDeviceCtrlService.java
  5. 4
      src/main/java/a8k/service/appdevicectrl/MainFlowCtrlService.java
  6. 7
      src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java
  7. 11
      src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java
  8. 6
      src/main/java/a8k/service/appdevicectrl/action/DO_PAUSE.java
  9. 8
      src/main/java/a8k/service/appdevicectrl/action/DO_START.java
  10. 8
      src/main/java/a8k/service/appdevicectrl/action/DO_STOP.java
  11. 11
      src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java
  12. 7
      src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java
  13. 35
      src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  14. 90
      src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java
  15. 6
      src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java
  16. 2
      src/main/java/a8k/service/appdevicectrl/type/A8kEcodeContext.java
  17. 25
      src/main/java/a8k/service/appstate/AppA8kGStateService.java
  18. 26
      src/main/java/a8k/service/appstate/type/TubeHolder.java
  19. 20
      src/main/java/a8k/service/appstate/type/TubeHolderState.java
  20. 2
      src/main/java/a8k/service/appstate/type/state/TubeHolderState.java

38
README.md

@ -142,35 +142,32 @@ TODO:
```
```
DO_ENTER_TUBEHOLDER_AND_SCAN(入料)
-> 修改试管架状态为READY
DO_SWITCH_TO_THE_NEXT_TUBE
->
```
DO_CHECK_TUBE_IS_OK_TO_PROCESS(检查试管是否可以被处理,如果检查不合格,则不切换状态)
-> 修改试管状态为PROCESSING
DO_SAMPLE_PRE_PROCESS_A(摇匀+脱帽)
->set DO_SAMPLE_PRE_PROCESS_A doneFlag
DO_PREPARE_REACTION_PLATE(推入反应板到孵育盘中)
->set DO_PREPARE_REACTION_PLATE doneFlag
DO_PREPARE_PREPARE_PROCESS(HBOT为处理样本做准备)
->set DO_PREPARE_PREPARE_PROCESS doneFlag
```
动作:
入料并扫描
将下一个试管移动到预处理位
DO_TAKE_SAMPLE_AND_PROCESS(处理样本,取样....)
->set DO_TAKE_SAMPLE_AND_PROCESS doneFlag
核对资源是否可以被处理
--> DO_SAMPLE_PRE_PROCESS_B(盖帽,样本复位)
->set DO_SAMPLE_PRE_PROCESS_B doneFlag
BEFORE_PROCESS 预处理A(脱帽,摇匀)
BEFORE_PROCESS 预处理B(hbot取tip头,移动到待机位)
BEFORE_PROCESS 预处理C(推出反应板夹)
PROCESS 处理(取样,处理,滴定)
DO_PUSH_REACTION_PLATE(推出反应板)
DO_OPT_SCAN
AFTER_PROCESS 后处理
出料
将反应板推出到光学扫描位
光学扫描
代码规范
1. 什么样的检查写在动作中?
需要进行报错处理的检查写在步骤中
```
@ -188,5 +185,4 @@ TODO:
5. 支持吸空检测。
6. 支持反应板夹类型检测。
```

2
src/main/java/a8k/baseservice/appeventbus/appevent/DoA8kStepActionEvent.java

@ -1,6 +1,6 @@
package a8k.baseservice.appeventbus.appevent;
import a8k.service.appdevicectrl.action.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
public class DoA8kStepActionEvent extends AppEvent {
public A8kActionStepType actionStep;

2
src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java

@ -24,7 +24,7 @@ public enum ExtApiTabConfig {
Hbot2DCodeScanPos("参数.Hbot二维码扫描坐标参数", false),
//底层硬件
A8kPipetteCtrlModule("A8kPipetteCtrlModule", false),
A8kPipetteCtrlModule("A8kPipetteCtrlModule", true),
SampleTransportParam("参数.样本出入料&扫描参数", false),
PosParam("PosParam", false),

8
src/main/java/a8k/service/appdevicectrl/AppDeviceCtrlService.java

@ -3,8 +3,8 @@ package a8k.service.appdevicectrl;
import a8k.controler.extapi.pagecontrol.ExtApiTabConfig;
import a8k.controler.extapi.utils.ExtApiFn;
import a8k.controler.extapi.utils.ExtApiTab;
import a8k.service.appdevicectrl.action.A8kStepAction;
import a8k.service.appstate.type.TubeHolderState;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.type.TubeHolder;
import a8k.type.checkpoint.CheckResult;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.type.state.A8kWorkState;
@ -98,8 +98,8 @@ public class AppDeviceCtrlService {
}
@ExtApiFn(name = "获取正在处理的试管架状态", group = "设备状态")
public TubeHolderState getTubeHolderState() {
return gstate.getTubeHolderState();
public TubeHolder getTubeHolderState() {
return gstate.getTubeHolder();
}
@ExtApiFn(name = "获取设备状态(调试使用)", group = "设备状态")

4
src/main/java/a8k/service/appdevicectrl/MainFlowCtrlService.java

@ -1,6 +1,8 @@
package a8k.service.appdevicectrl;
import a8k.service.appdevicectrl.action.*;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appdevicectrl.scheduler.MainFlowCtrlScheduler;
import a8k.service.appdevicectrl.type.A8kEcodeContext;
import a8k.service.appstate.AppA8kGStateService;
@ -48,7 +50,7 @@ public class MainFlowCtrlService {
if (actionType.equals(A8kActionStepType.DO_CLEAR_ERROR)) {
continue;
}
A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class);
A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class);
scheduler.regFn(action);
}

7
src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java

@ -1,9 +1,9 @@
package a8k.service.appdevicectrl.action;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.TubeHolderProcessState;
import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -20,6 +20,9 @@ import java.util.List;
public class DO_CHECK_THE_QUANTITY_OF_CONSUMABLES extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.class);
DO_CHECK_THE_QUANTITY_OF_CONSUMABLES() {
super(A8kActionStepType.DO_CHECK_THE_QUANTITY_OF_CONSUMABLES);
}
@Resource
AppA8kGStateService gstate;

11
src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java

@ -1,10 +1,12 @@
package a8k.service.appdevicectrl.action;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.MainFlowCtrlState;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.TubeHolderProcessState;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct;
@ -19,6 +21,9 @@ import java.util.List;
public class DO_EJECT_TUBEHOLDER extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_EJECT_TUBEHOLDER.class);
DO_EJECT_TUBEHOLDER() {
super(A8kActionStepType.DO_EJECT_TUBEHOLDER);
}
@Resource
AppA8kGStateService gstate;
@ -36,13 +41,13 @@ public class DO_EJECT_TUBEHOLDER extends A8kStepAction {
@Override public void doaction() throws AppException {
stc.ejectTubeHolder();
stc.moveTubeRackMoveToEnterPos();
gstate.getTubeHolderState().processState = TubeHolderProcessState.IDLE;
gstate.getTubeHolder().state = TubeHolderState.IDLE;
}
@Override public Boolean checkCondition() {
//处于工作状态试管架已经处于空闲状态入料光电被触发
Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING);
Boolean cond2 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.PROCESS_FINISHED);
Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.PROCESS_FINISHED);
return cond1 & cond2;
}

6
src/main/java/a8k/service/appdevicectrl/action/DO_PAUSE.java

@ -1,7 +1,8 @@
package a8k.service.appdevicectrl.action;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.MainFlowCtrlState;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.type.exception.AppException;
@ -17,6 +18,9 @@ import java.util.List;
public class DO_PAUSE extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_PAUSE.class);
DO_PAUSE() {
super(A8kActionStepType.DO_PAUSE);
}
@Resource
AppA8kGStateService gstate;

8
src/main/java/a8k/service/appdevicectrl/action/DO_START.java

@ -1,11 +1,10 @@
package a8k.service.appdevicectrl.action;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.AppResourceMgrService;
import a8k.service.appstate.MainFlowCtrlState;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.TubeHolderProcessState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct;
@ -20,6 +19,9 @@ import java.util.List;
public class DO_START extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_START.class);
DO_START() {
super(A8kActionStepType.DO_START);
}
@Resource
AppA8kGStateService gstate;

8
src/main/java/a8k/service/appdevicectrl/action/DO_STOP.java

@ -1,5 +1,7 @@
package a8k.service.appdevicectrl.action;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.state.A8kWorkState;
@ -16,8 +18,12 @@ import java.util.List;
public class DO_STOP extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_STOP.class);
DO_STOP() {
super(A8kActionStepType.DO_STOP);
}
@Resource
AppA8kGStateService gstate;
AppA8kGStateService gstate;
@PostConstruct
void init() {

11
src/main/java/a8k/service/appdevicectrl/action/A8kActionStepType.java → src/main/java/a8k/service/appdevicectrl/action/base/A8kActionStepType.java

@ -1,17 +1,14 @@
package a8k.service.appdevicectrl.action;
package a8k.service.appdevicectrl.action.base;
public enum A8kActionStepType {
DO_START,//启动
DO_PAUSE,//暂停
DO_STOP, //停止
DO_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描
DO_EJECT_TUBEHOLDER,//弹出试管架
DO_SWITCH_TO_THE_NEXT_TUBE,//切换到下一个试管
SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描
SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管
DO_CHECK_THE_QUANTITY_OF_CONSUMABLES,//Check the quantity of consumables,核对耗材数量
DO_EJECT_TUBEHOLDER, //弹出试管架
//特殊动作无需注册成类型
DO_CLEAR_ERROR,//清除错误

7
src/main/java/a8k/service/appdevicectrl/action/A8kStepAction.java → src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java

@ -1,4 +1,4 @@
package a8k.service.appdevicectrl.action;
package a8k.service.appdevicectrl.action.base;
import a8k.service.appstate.resource.A8kPublicResourceType;
@ -10,11 +10,10 @@ public class A8kStepAction {
public A8kActionStepType step = null;
A8kStepAction() {
this.step = A8kActionStepType.valueOf(this.getClass().getSimpleName());
public A8kStepAction(A8kActionStepType step) {
this.step = step;
}
public Boolean checkCondition() {
return false;
}

35
src/main/java/a8k/service/appdevicectrl/action/DO_ENTER_TUBEHOLDER_AND_SCAN.java → src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java

@ -1,4 +1,4 @@
package a8k.service.appdevicectrl.action;
package a8k.service.appdevicectrl.action.mainflow;
import a8k.baseservice.appeventbus.AppEventBusService;
import a8k.baseservice.appeventbus.appevent.AppWarningNotifyEvent;
@ -7,13 +7,14 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.hardware.type.a8kcanprotocol.IOId;
import a8k.service.appdata.AppSampleMgrService;
import a8k.service.appdevicectrl.AppTubeSettingMgrService;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.MainFlowCtrlState;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.TubeHolderState;
import a8k.service.appstate.type.TubeState;
import a8k.service.appstate.type.TubeHolder;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.TubeHolderProcessState;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.type.exception.AppException;
import a8k.type.tube_setting.TubeHolderSetting;
@ -25,13 +26,15 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_ENTER_TUBEHOLDER_AND_SCAN.class);
public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(SEQ1_ENTER_TUBEHOLDER_AND_SCAN.class);
SEQ1_ENTER_TUBEHOLDER_AND_SCAN() {
super(A8kActionStepType.SEQ1_ENTER_TUBEHOLDER_AND_SCAN);
}
static public class TubesScanResult {
public Boolean isTubeExist = false;
@ -123,8 +126,8 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
return result;
}
TubeHolderState parseScanResult(SampleScanResult scanResult) throws AppException {
TubeHolderState state = new TubeHolderState();
TubeHolder parseScanResult(SampleScanResult scanResult) throws AppException {
TubeHolder state = new TubeHolder();
TubeHolderSetting setting = appTubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock();
try {
//获取试管架类型
@ -181,7 +184,7 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
//设置试管架状态
state.processState = TubeHolderProcessState.PROCESSING;
state.state = TubeHolderState.PROCESSING;
state.processingTubeIndex = -1;
//删除之前的试管架配置
appTubeSettingMgrService.removeTubeHolderSetting(setting);
@ -203,7 +206,7 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
}
logger.info("解析扫描结果");
TubeHolderState state = parseScanResult(scanResult);
TubeHolder state = parseScanResult(scanResult);
if (state == null) {
return;
}
@ -212,13 +215,15 @@ public class DO_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
appSampleMgrService.addSampleRecord(state.tubeStates);
logger.info("更新试管架状态");
gstate.setTubeHolderState(state);
gstate.setTubeHolder(state);
}
@Override public Boolean checkCondition() {
//处于工作状态试管架已经处于空闲状态入料光电被触发
Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING);
Boolean cond2 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.IDLE);
//处于工作状态
Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING) && mfcs.workState.equals(gstate.getWorkState());
//试管架处于空闲状态
Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.IDLE);
//入料通道是否为空
Boolean cond3 = getTubeholderEnterPosPPS();
return cond1 && cond2 && cond3;
}

90
src/main/java/a8k/service/appdevicectrl/action/DO_SWITCH_TO_THE_NEXT_TUBE.java → src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java

@ -1,11 +1,13 @@
package a8k.service.appdevicectrl.action;
package a8k.service.appdevicectrl.action.mainflow;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.resource.A8kPublicResourceType;
import a8k.service.appstate.type.TubeHolderState;
import a8k.service.appstate.type.TubeHolder;
import a8k.service.appstate.type.TubeState;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.TubeHolderProcessState;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.service.appstate.type.state.TubeProcessState;
import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl;
import a8k.type.exception.AppException;
@ -21,9 +23,12 @@ import java.util.List;
* 切换下一个试管
*/
@Component
public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
static Logger logger = LoggerFactory.getLogger(DO_SWITCH_TO_THE_NEXT_TUBE.class);
public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
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);
}
@Resource
AppA8kGStateService gstate;
@ -35,24 +40,13 @@ public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
void init() {
}
@Override public void doaction() throws AppException {
/*
* 1. 将下一个试管移动到预处理位
* 2. 如果当前试管是最后一个试管则设置试管架状态为处理完成
*/
TubeHolderState state = gstate.getTubeHolderState();
int nowTubeIndex = state.processingTubeIndex;
int nextTubeIndex = nowTubeIndex + 1;
if (nextTubeIndex >= 10) {
logger.info("当前试管架处理完成");
state.processState = TubeHolderProcessState.PROCESS_FINISHED;
return;
}
int moveToNextTube() throws AppException {
TubeHolder state = gstate.getTubeHolder();
assert state.tubeStates.length == 10;
nextTubeIndex = -1;
int nowTubeIndex = state.processingTubeIndex;
int nextTubeIndex = -1;
for (int i = nowTubeIndex + 1; i < 10; i++) {
TubeState tubeState = state.tubeStates[i];
@ -63,23 +57,34 @@ public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
break;
}
//没有下一个试管
if (nextTubeIndex == -1) {
return -1;
}
sstc.moveTubeToPreProcessPos(nextTubeIndex);
return nextTubeIndex;
}
@Override public void doaction() throws AppException {
/*
* 1. 将下一个试管移动到预处理位
* 2. 如果当前试管是最后一个试管则设置试管架状态为处理完成
*/
TubeHolder state = gstate.getTubeHolder();
int nextPos = moveToNextTube();
if (nextPos == -1) {
logger.info("当前试管架处理完成");
state.processState = TubeHolderProcessState.PROCESS_FINISHED;
state.state = TubeHolderState.PROCESS_FINISHED;
return;
}
sstc.moveTubeToPreProcessPos(nextTubeIndex);
state.processingTubeIndex = nextTubeIndex;
logger.info("移动到下一个试管:{}", nextPos);
sstc.moveTubeToPreProcessPos(nextPos);
state.processingTubeIndex = nextPos;
}
boolean con1;
boolean con1_11;
boolean con1_12;
boolean con1_21;
@Override public Boolean checkCondition() {
/*
*1. 设备工作中
* 1.1 试管架正在处理中
@ -88,26 +93,15 @@ public class DO_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction {
* 2.1 当前试管处理完成
*
*/
var mainFlowCtrlState = gstate.mainFlowCtrlState;
Integer curTubeIndex = gstate.getTubeHolderState().processingTubeIndex;
con1 = mainFlowCtrlState.workState.equals(A8kWorkState.WORKING);
con1_11 = gstate.getTubeHolderState().processState.equals(TubeHolderProcessState.PROCESSING);
con1_12 = curTubeIndex == -1;
con1_21 = false;
if (curTubeIndex >= 0) {
con1_21 = gstate.getTubeHolderState().tubeStates[curTubeIndex].state.equals(TubeProcessState.PROCESS_COMPLETE);
}
return con1 && (con1_11 && con1_12 || con1_21);
//当前正在工作
Boolean cond1 = gstate.isWorking();
//试管架正在处理中, 且当前试管Index=-1
Boolean cond2 = gstate.getTubeHolderState().equals(TubeHolderState.PROCESSING) && gstate.getTubeHolder().getProcessingTube() == null;
//当前试管处理完成
Boolean cond3 = gstate.getTubeHolder().getProcessingTube().state.equals(TubeProcessState.PROCESS_COMPLETE);
return cond1 && (cond2 || cond3);
}
public List<Boolean> getConectionList() {
return List.of(con1, con1_11, con1_12, con1_21);
}
@Override public List<A8kPublicResourceType> getDeplyResourceList() {
return List.of(A8kPublicResourceType.SampleTransferXMotor);

6
src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java

@ -5,8 +5,8 @@ import a8k.baseservice.appeventbus.AppEventBusService;
import a8k.baseservice.appeventbus.appevent.A8kEcodeContextListPromptEvent;
import a8k.baseservice.appeventbus.appevent.DoA8kStepActionEvent;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.appdevicectrl.action.A8kActionStepType;
import a8k.service.appdevicectrl.action.A8kStepAction;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kStepAction;
import a8k.service.appdevicectrl.type.*;
import a8k.service.appstate.AppA8kGStateService;
import a8k.service.appstate.AppCondtionMgrService;
@ -17,8 +17,6 @@ import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration;
import org.springframework.stereotype.Component;
import java.util.ArrayList;

2
src/main/java/a8k/service/appdevicectrl/type/A8kEcodeContext.java

@ -1,7 +1,7 @@
package a8k.service.appdevicectrl.type;
import a8k.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.service.appdevicectrl.action.A8kActionStepType;
import a8k.service.appdevicectrl.action.base.A8kActionStepType;
public class A8kEcodeContext {
public A8kActionStepType dowhat;

25
src/main/java/a8k/service/appstate/AppA8kGStateService.java

@ -1,9 +1,12 @@
package a8k.service.appstate;
import a8k.service.appdevicectrl.type.app_consumables_mgr_service.ConsumableState;
import a8k.service.appstate.type.*;
import a8k.service.appstate.type.EmergencyPosRunState;
import a8k.service.appstate.type.IncubationPlateStatus;
import a8k.service.appstate.type.OptScanModule;
import a8k.service.appstate.type.TubeHolder;
import a8k.service.appstate.type.state.A8kWorkState;
import a8k.service.appstate.type.state.OptScanModuleState;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.type.tube_setting.TubeHolderSetting;
import lombok.Data;
import org.slf4j.Logger;
@ -26,7 +29,7 @@ public class AppA8kGStateService {
A8kWorkState workState = A8kWorkState.IDLE; //
//当前正在被处理的试管架状态
TubeHolderState tubeHolderState = new TubeHolderState();
TubeHolder tubeHolder = new TubeHolder();
//急诊为状态
EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState();
//孵育盘状态
@ -58,12 +61,20 @@ public class AppA8kGStateService {
return consumableState;
}
public synchronized void setTubeHolderState(TubeHolderState state) {
this.tubeHolderState = state;
public synchronized void setTubeHolder(TubeHolder state) {
this.tubeHolder = state;
}
public synchronized TubeHolderState getTubeHolderState() {
return tubeHolderState;
public synchronized TubeHolder getTubeHolder() {
return tubeHolder;
}
public Boolean isWorking() {
return workState.equals(A8kWorkState.WORKING) && mainFlowCtrlState.workState.equals(A8kWorkState.WORKING);
}
public TubeHolderState getTubeHolderState() {
return tubeHolder.state;
}
}

26
src/main/java/a8k/service/appstate/type/TubeHolder.java

@ -0,0 +1,26 @@
package a8k.service.appstate.type;
import a8k.service.appstate.type.state.TubeHolderState;
import a8k.type.type.A8kTubeHolderType;
public class TubeHolder {
public A8kTubeHolderType tubeHolderType = A8kTubeHolderType.BloodTube; //试管架类型
public TubeState[] tubeStates = new TubeState[10];
public TubeHolderState state = TubeHolderState.IDLE; //处理状态
public Integer processingTubeIndex = -1; //当前正在被处理的试管索引
public TubeHolder() {
for (int i = 0; i < tubeStates.length; i++) {
tubeStates[i] = new TubeState();
}
}
public TubeState getProcessingTube() {
if (processingTubeIndex == -1) {
return null;
}
return tubeStates[processingTubeIndex];
}
}

20
src/main/java/a8k/service/appstate/type/TubeHolderState.java

@ -1,20 +0,0 @@
package a8k.service.appstate.type;
import a8k.service.appstate.type.state.TubeHolderProcessState;
import a8k.type.type.A8kTubeHolderType;
import a8k.type.type.BloodType;
public class TubeHolderState {
public A8kTubeHolderType tubeHolderType = A8kTubeHolderType.BloodTube; //试管架类型
public TubeState[] tubeStates = new TubeState[10];
public TubeHolderProcessState processState = TubeHolderProcessState.IDLE; //处理状态
public Integer processingTubeIndex = -1; //当前正在被处理的试管索引
public TubeHolderState() {
for (int i = 0; i < tubeStates.length; i++) {
tubeStates[i] = new TubeState();
}
}
}

2
src/main/java/a8k/service/appstate/type/state/TubeHolderProcessState.java → src/main/java/a8k/service/appstate/type/state/TubeHolderState.java

@ -1,6 +1,6 @@
package a8k.service.appstate.type.state;
public enum TubeHolderProcessState {
public enum TubeHolderState {
IDLE, //没有试管架
PROCESSING, //正在处理试管架
PROCESS_FINISHED, //试管架处理完成但试管架并没有被取走
Loading…
Cancel
Save