From f250e35dea1062447e41862e52679cea7ce412ec Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 14 Oct 2024 15:31:16 +0800 Subject: [PATCH] update --- app.db | Bin 225280 -> 225280 bytes .../app/appctrl/AppConsumablesScanService.java | 251 +++++++++++++++++++++ .../service/app/appctrl/AppDeviceCtrlService.java | 20 +- .../app/appctrl/AppMainFlowCtrlService.java | 150 ++++++++++++ .../app/appctrl/AppTubeSettingMgrService.java | 190 ++++++++++++++++ .../a8k/service/app/appctrl/CheckPointType.java | 10 - .../app/appctrl/ConsumablesScanService.java | 251 --------------------- .../service/app/appctrl/DeviceInitCtrlService.java | 131 ----------- .../service/app/appctrl/MainFlowCtrlService.java | 150 ------------ .../service/app/appctrl/TubeSettingMgrService.java | 190 ---------------- .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 14 +- .../mainflowctrl/action/SEQ4_PRE_PROCESS.java | 4 +- .../basectrl/HbotBaseMoveControlService.java | 208 ----------------- .../basectrl/HbotBaseMoveControler.java | 208 +++++++++++++++++ .../app/devicedriver/basectrl/HbotModule.java | 17 +- .../devicedriver/basectrl/PipetteCtrlModule.java | 2 +- .../calibration/Hbot2DCodeScanPosCalibration.java | 22 +- .../commonctrl/HardwareCommonCtrl.java | 2 +- .../app/devicedriver/ctrl/ConsumablesScanCtrl.java | 6 +- .../devicedriver/ctrl/DeviceInitCtrlService.java | 117 ++++++++++ .../app/devicedriver/testscript/TestScript.java | 6 +- .../a8k/service/debug/AppDebugHelperService.java | 44 +--- src/main/java/a8k/type/CheckPointType.java | 10 + 23 files changed, 988 insertions(+), 1015 deletions(-) create mode 100644 src/main/java/a8k/service/app/appctrl/AppConsumablesScanService.java create mode 100644 src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java create mode 100644 src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java delete mode 100644 src/main/java/a8k/service/app/appctrl/CheckPointType.java delete mode 100644 src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java delete mode 100644 src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java delete mode 100644 src/main/java/a8k/service/app/appctrl/MainFlowCtrlService.java delete mode 100644 src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java delete mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java create mode 100644 src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControler.java create mode 100644 src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java create mode 100644 src/main/java/a8k/type/CheckPointType.java diff --git a/app.db b/app.db index d20effbc257d07a4c30192c5d804ec3daf4a945f..44f513f546109639c7d8ed90540db42ee4748fe0 100644 GIT binary patch delta 109 zcmZp8z}xVEcY?Iw3kC)Tb09VYVs-`wmgI>##*8l-6Iv4(wxN delta 109 zcmZp8z}xVEcY?IwMFs{2b09VYVs-`wmdJ@Z#*7ym6Iv4(wG^s+FfgN$y|KZG(hZ{Hmbl5^cI70D#d!r{&?Zf?%l&OhBgoJp+RKbC2` Je=PGxApl*e9ryqM diff --git a/src/main/java/a8k/service/app/appctrl/AppConsumablesScanService.java b/src/main/java/a8k/service/app/appctrl/AppConsumablesScanService.java new file mode 100644 index 0000000..3346f24 --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/AppConsumablesScanService.java @@ -0,0 +1,251 @@ +package a8k.service.app.appctrl; + +import a8k.constant.AppConstant; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.appdata.AppProjInfoMgrService; +import a8k.service.app.appstate.GStateService; +import a8k.service.app.devicedriver.ctrl.ConsumablesScanCtrl; +import a8k.service.db.type.A8kProjOptConfig; +import a8k.service.db.type.A8kProjectInfo; +import a8k.service.debug.AppDebugHelperService; +import a8k.type.ConsumableGroup; +import a8k.type.ConsumableOneChResult; +import a8k.type.ConsumableScanRawResult; +import a8k.type.consumables.LarBSGroup; +import a8k.type.consumables.LittBSGroup; +import a8k.type.consumables.ReactionPlateGroup; +import a8k.type.consumables.ConsumablesErrorType; +import a8k.type.exception.AppException; +import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType; +import a8k.service.db.type.A8kIdCardInfo; +import a8k.utils.ReactionPlate2DCode; +import a8k.utils.ReactionPlate2DCodeHelper; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Component +public class AppConsumablesScanService { + static Logger logger = org.slf4j.LoggerFactory.getLogger(AppConsumablesScanService.class); + @Autowired + private AppDebugHelperService appDebugHelperService; + + public static class ConsumablesScanResult { + public Integer chNum; + public ConsumablesErrorType state; + public Integer projIndex; + public String lotId; + } + + + @Resource + GStateService gstate; + @Resource + AppProjInfoMgrService appProjMgr; + @Resource + ConsumablesScanCtrl scanCtrlService; + @Resource + AppDebugHelperService appDebugHelper; + + /** + * 解析扫描结果,返回耗材扫描结果 + * + * @param ch 通道号(0...5) + * @param rawResult 原始扫描结果 + * @return 耗材扫描结果 + */ + ConsumablesScanResult parseScanResult(Integer ch, ConsumableOneChResult rawResult) throws AppException { + ConsumablesScanResult ret = new ConsumablesScanResult(); + ret.chNum = ch; + + if (rawResult.larBSScanResult == null && rawResult.littBSScanResult == null && rawResult.PBScanResult == null) { + ret.state = ConsumablesErrorType.EMPTY; + return ret; + } + + if (rawResult.PBScanResult == null) { + ret.state = ConsumablesErrorType.MISS_REACTION_PLATE; + return ret; + } + + //解析板夹二维码 + ReactionPlate2DCode rp2dcode = ReactionPlate2DCodeHelper.parse(rawResult.PBScanResult); + + // //检查耗材是否过期 + // if (rp2dcode.expDate.before(new Date())) { + // ret.state = ScanResultState.EXPIRED; + // return ret; + // } + + //检查项目ID卡是否存在 + A8kIdCardInfo a8kIdCardInfo = appProjMgr.getA8kIdCardInfoByLotId(rp2dcode.lotId); + if (a8kIdCardInfo == null) { + logger.warn("未找到匹配的项目ID卡,LotID:{}", rp2dcode.lotId); + ret.state = ConsumablesErrorType.MISS_IDCARD; + return ret; + } + + if (a8kIdCardInfo.expiryDate.before(new Date())) { + logger.warn("耗材过期,LotID:{}", rp2dcode.lotId); + ret.state = ConsumablesErrorType.EXPIRED; + return ret; + } + //检查项目信息是否存在 + A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(a8kIdCardInfo.projIndex); + if (projInfo == null) { + logger.error("当前项目不支持,项目ID:{}", a8kIdCardInfo.projIndex); + ret.state = ConsumablesErrorType.UN_SUPPORT_PROJ; + return ret; + } + + Integer subProjNum = projInfo.subProjNum; + if (subProjNum == null || subProjNum <= 0) { + logger.error("项目信息不完整,项目ID:{},子项目数量为零", a8kIdCardInfo.projIndex); + ret.state = ConsumablesErrorType.CODE_ERROR_PROJINFO_IS_ERROR; + return ret; + } + + List projOptConfigList = appProjMgr.getProjOptConfigListByProjIndex(a8kIdCardInfo.projIndex); + if (projOptConfigList == null || projOptConfigList.size() != subProjNum) { + logger.error("项目操作配置信息不完整,项目ID:{},缺少光学配置", a8kIdCardInfo.projIndex); + ret.state = ConsumablesErrorType.CODE_ERROR_PROJINFO_IS_ERROR; + return ret; + } + + + //通过项目ID卡获取项目需要的耗材 + A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(a8kIdCardInfo.projIndex); + if (reactionType == null) { + ret.state = ConsumablesErrorType.CODE_ERROR_PROJINFO_IS_ERROR; + return ret; + } + + if (reactionType.equals(A8kReactionFlowType.FlowType1)) { + //校验小瓶缓冲液,小瓶缓冲液+样本 + if (rawResult.littBSScanResult == null) { + ret.state = ConsumablesErrorType.MISS_LITTSB; + return ret; + } + + if (!rawResult.littBSScanResult.equals(rp2dcode.lotId)) { + ret.state = ConsumablesErrorType.LITTSB_LOTID_MISMATCH; + return ret; + } + + } else if (reactionType.equals(A8kReactionFlowType.FlowType2)) { + // 校验大瓶缓冲液,大瓶缓冲液+小瓶缓冲液+样本 + if (rawResult.larBSScanResult == null) { + ret.state = ConsumablesErrorType.MISS_LARBS; + return ret; + } + + if (!rawResult.larBSScanResult.equals(rp2dcode.lotId)) { + ret.state = ConsumablesErrorType.LARBS_LOTID_MISMATCH; + return ret; + } + + + } else { + throw new RuntimeException("未知的反应流程类型"); + } + + ret.lotId = rp2dcode.lotId; + ret.projIndex = a8kIdCardInfo.projIndex; + ret.state = ConsumablesErrorType.PASS; + return ret; + } + + void LoadingConsumables(Integer ch, ConsumablesScanResult result) { + var cState = gstate.getConsumableState(); + assert ch.equals(result.chNum); + if (result.state != ConsumablesErrorType.PASS) { + return; + } + + A8kIdCardInfo a8kIdCardInfo = appProjMgr.getA8kIdCardInfoByLotId(result.lotId); + A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(result.projIndex); + A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(result.projIndex); + + assert a8kIdCardInfo != null; + assert reactionType != null; + assert projInfo != null; + + cState.reactionPlateGroup[ch] = new ReactionPlateGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + if (reactionType.equals(A8kReactionFlowType.FlowType1)) { + cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + cState.larBSGroup[ch] = new LarBSGroup(); + } else if (reactionType.equals(A8kReactionFlowType.FlowType2)) { + cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + cState.larBSGroup[ch] = new LarBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); + } else { + throw new RuntimeException("未知的反应流程类型"); + } + } + + /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * EXT + +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + public Map scanConsumables() throws AppException { + if (!gstate.isDeviceInited()) { + throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); + } + List scanResult = new java.util.ArrayList<>(); + //执行扫描耗材动作 + ConsumableScanRawResult scanRawResult; + if (appDebugHelper.isDebug()) { + scanRawResult = appDebugHelper.scanConsumable(); + } else { + scanRawResult = scanCtrlService.doScanConsumablesAction(); + } + + + //解析扫描结果 + for (int i = 0; i < 6; i++) { + var result = parseScanResult(i, scanRawResult.ch[i]); + scanResult.add(result); + } + + var cState = gstate.getConsumableState(); + //加载耗材 + for (int i = 0; i < cState.reactionPlateGroup.length; i++) { + if (scanResult.get(i).state == ConsumablesErrorType.PASS) { + LoadingConsumables(i, scanResult.get(i)); + } + } + + Map ret = new java.util.HashMap<>(); + ret.put("scanResult", scanResult); + ret.put("scanRawResult", scanRawResult); + ret.put("consumableState", cState); + return ret; + } + + public Map scanOneGroupConsumables(ConsumableGroup group) throws AppException { + if (!gstate.isDeviceInited()) { + throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); + } + + Integer chNum = group.off; + ConsumableOneChResult scanResult; + if (appDebugHelper.isDebug()) { + scanResult = appDebugHelper.scanOneCH(chNum); + } else { + scanResult = scanCtrlService.doScanOneCh(chNum); + } + var result = parseScanResult(chNum, scanResult); + if (result.state != ConsumablesErrorType.PASS) { + LoadingConsumables(chNum, result); + } + Map ret = new java.util.HashMap<>(); + ret.put("scanResult", result); + ret.put("scanRawResult", scanResult); + ret.put("consumableState", gstate.getConsumableState()); + return ret; + } + +} diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index 29116b1..137a120 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -1,22 +1,18 @@ package a8k.service.app.appctrl; -import a8k.OS; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appstate.ConsumablesMgrService; import a8k.service.app.appstate.ProjectProcessContextMgrService; import a8k.service.app.appstate.type.*; -import a8k.service.app.appstate.type.state.OptScanModuleState; +import a8k.service.app.devicedriver.ctrl.DeviceInitCtrlService; import a8k.service.debug.AppDebugHelperService; -import a8k.type.Consumable; import a8k.type.ConsumableGroup; import a8k.type.checkpoint.CheckResult; import a8k.service.app.appstate.GStateService; import a8k.type.consumables.ConsumableState; import a8k.type.exception.AppException; -import freemarker.debug.impl.DebuggerService; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; @@ -28,15 +24,15 @@ import java.util.Map; public class AppDeviceCtrlService { @Resource - GStateService gstate; + GStateService gstate; @Resource - DeviceInitCtrlService deviceInitializationModule; //设备初始化模块 + DeviceInitCtrlService deviceInitializationModule; //设备初始化模块 @Resource - MainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 + AppMainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 @Resource - ConsumablesScanService consumablesScanService; //耗材扫描模块 + AppConsumablesScanService appConsumablesScanService; //耗材扫描模块 @Resource - ConsumablesMgrService consumablesMgrService; //耗材管理模块 + ConsumablesMgrService consumablesMgrService; //耗材管理模块 @Resource ProjectProcessContextMgrService projectProcessContextMgrService; //项目处理上下文管理模块 @@ -87,12 +83,12 @@ public class AppDeviceCtrlService { +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @ExtApiFn(name = "扫描耗材", group = "耗材扫描") public Map scanConsumables() throws AppException { - return consumablesScanService.scanConsumables(); + return appConsumablesScanService.scanConsumables(); } @ExtApiFn(name = "扫描某一组耗材", group = "耗材扫描") public Map scanOneGroupConsumables(ConsumableGroup group) throws AppException { - return consumablesScanService.scanOneGroupConsumables(group); + return appConsumablesScanService.scanOneGroupConsumables(group); } diff --git a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java new file mode 100644 index 0000000..c01adf0 --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java @@ -0,0 +1,150 @@ +package a8k.service.app.appctrl; + +import a8k.service.app.appctrl.mainflowctrl.MainFlowCtrlScheduler; +import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; +import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; +import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; +import a8k.service.app.appctrl.mainflowctrl.action.DO_STOP; +import a8k.service.app.appstate.GStateService; +import a8k.service.app.appstate.type.MainFlowCtrlState; +import a8k.service.app.appstate.type.state.A8kWorkState; +import a8k.service.app.appstate.type.state.TubeState; +import a8k.SpringBootBeanUtil; +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 AppMainFlowCtrlService { + static Logger logger = LoggerFactory.getLogger(AppMainFlowCtrlService.class); + + + @Resource + GStateService gstate; + + @Resource + MainFlowCtrlScheduler scheduler; + + @Resource + SpringBootBeanUtil springBoot; + + // + // Init + // + + + @PostConstruct + void init() { + + scheduler.regEcodePostProcesser(this::postPorcessA8kEcode); + scheduler.regCheckBeforeGuess(this::checkBeforeGuess); + + + logger.info("className {}", DO_STOP.class.getName()); + for (A8kActionStepType actionType : A8kActionStepType.values()) { + A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class); + scheduler.regFn(action); + } + + //启动调度 + scheduler.startScheduler(); + } + + void changeWorkState(A8kWorkState workState) { + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); + state.workStateChangeFlag = true; + state.lastWorkState = state.workState; + state.workState = workState; + } + + Boolean isAllowPause() { + if (gstate.getCurProcessingTube() != null) { + return !gstate.getCurProcessingTube().getState().isEq(List.of( + TubeState.PRE_PROCESSING, + TubeState.PRE_PROCESSED, + TubeState.PROCESSING, + TubeState.PROCESSED, + TubeState.POST_PROCESSING, + TubeState.POST_PROCESSED + )); + } + return true; + } + + void checkBeforeGuess() { + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); + if (state.startActionPending) { + if (state.workState != A8kWorkState.IDLE) { + state.startActionPending = false; + return; + } + changeWorkState(A8kWorkState.WORKING); + } else if (state.pauseActionPending) { + if (!isAllowPause()) { + return; + } + if (state.workState != A8kWorkState.WORKING) { + state.pauseActionPending = false; + return; + } + changeWorkState(A8kWorkState.PAUSE); + } else if (state.resumeActionPending) { + if (state.workState != A8kWorkState.PAUSE) { + state.resumeActionPending = false; + return; + } + changeWorkState(A8kWorkState.WORKING); + } else if (state.stopActionPending) { + if (state.workState == A8kWorkState.IDLE) { + state.stopActionPending = false; + return; + } + + changeWorkState(A8kWorkState.IDLE); + } + } + + void postPorcessA8kEcode(List ecodeList) { + } + + /** + * 继续运行前,清除错误码,并执行一定的动作 + * @param ecodeList + * @return + */ + Boolean clearErrorcodeBeforeContinueDo(List ecodeList) { + return true; + } + + + // + // EXT + // + public List getA8kStepActionList() { + return scheduler.getA8kStepActionList(); + } + + public void startWork() { + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); + state.startActionPending = true; + } + + public void stopWork() { + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); + state.stopActionPending = true; + } + + public void pauseWork() { + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); + state.pauseActionPending = true; + } + + public void continueWork() { + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); + state.resumeActionPending = true; + } +} diff --git a/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java b/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java new file mode 100644 index 0000000..350a8f4 --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java @@ -0,0 +1,190 @@ +package a8k.service.app.appctrl; + +import a8k.service.bases.AppEventBusService; +import a8k.service.bases.appevent.AppTubeholderSettingUpdateEvent; +import a8k.service.app.appstate.GStateService; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.extapi_controler.utils.ExtApiFn; +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.type.exception.AppException; +import a8k.type.type.A8kTubeHolderType; +import a8k.type.type.BloodType; +import a8k.type.tube_setting.TubeSetting; +import a8k.type.tube_setting.TubeHolderSetting; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +@ExtApiTab(cfg = ExtApiTabConfig.AppTubeSettingMgrService) +public class AppTubeSettingMgrService { + static Logger logger = LoggerFactory.getLogger(AppTubeSettingMgrService.class); + + static class ORDER { + static final int getA8kDeviceCfg = 1; + static final int addCfg = 2; + static final int removeCfg = 3; + static final int activeCfg = 4; + static final int setTubeSettingU = 5; + static final int clearTubeProjectCfg = 6; + static final int setTubeSetting = 7; + } + + @Resource + GStateService gState; + + @Resource + AppEventBusService ebus; + + + TubeHolderSetting getTubeHolderSetting(String uuid) { + for (TubeHolderSetting setting : gState.getTubeHolderSettings()) { + if (setting.uuid.equals(uuid)) { + return setting; + } + } + return null; + } + + + TubeHolderSetting getTubeHolderSettingAndCheckIsEditable(String uuid) throws AppException { + TubeHolderSetting setting = getTubeHolderSetting(uuid); + if (setting == null) { + throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_NOT_FOUND); + } + if (setting.lock) { + throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_IS_LOCKED); + } + return setting; + } + + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // EXTERNAL API + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + @ExtApiFn(name = "获取试管架配置", group = "配置读取", order = ORDER.getA8kDeviceCfg) + synchronized public List getTubeHolderSettings() { + return gState.getTubeHolderSettings(); + } + + //添加试管架,返回整个列表 + @ExtApiFn(name = "添加<试管架>配置", group = "试管架", order = ORDER.addCfg) + synchronized public List newTubeHolderSetting() { + var newSetting = new TubeHolderSetting(); + logger.info("newTubeHolderSetting {}", newSetting.uuid); + + gState.getTubeHolderSettings().add(newSetting); + return getTubeHolderSettings(); + } + + + //添加试管架,返回被添加的试管架 + synchronized public TubeHolderSetting newTubeHolderSettingV2() { + var newSetting = new TubeHolderSetting(); + gState.getTubeHolderSettings().add(newSetting); + return newSetting; + } + + @ExtApiFn(name = "删除<试管架>配置", group = "试管架", order = ORDER.removeCfg) + synchronized public List removeTubeHolderSetting(String uuid) throws AppException { + logger.info("removeTubeHolderSetting {}", uuid); + getTubeHolderSettingAndCheckIsEditable(uuid); + gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(uuid)); + return getTubeHolderSettings(); + } + + + @ExtApiFn(name = "设置<试管架>激活状态", group = "试管架", order = ORDER.activeCfg) + synchronized public List tubeHodlerSettingSetActiveState(String uuid, Boolean active) throws AppException { + logger.info("tubeHodlerSettingSetActiveState {} {}", uuid, active); + TubeHolderSetting setting = getTubeHolderSettingAndCheckIsEditable(uuid); + + setting.active = active; + return getTubeHolderSettings(); + } + + @ExtApiFn(name = "设置<试管架>类型", group = "试管架", order = ORDER.activeCfg) + synchronized public List tubeHodlerSettingSetTubeHolderType(String uuid, A8kTubeHolderType type) throws AppException { + logger.info("tubeHodlerSettingSetTubeHolderType {} {}", uuid, type); + TubeHolderSetting setting = getTubeHolderSettingAndCheckIsEditable(uuid); + setting.tubeHolderType = type; + return getTubeHolderSettings(); + } + + @ExtApiFn(name = "复位<试管>配置", group = "试管", order = ORDER.clearTubeProjectCfg) + synchronized public List resetTubeSetting(String uuid, Integer tubeIndex) throws AppException { + logger.info("resetTubeSetting {} {}", uuid, tubeIndex); + TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); + thSetting.tubeSettings[tubeIndex].reset(); + return getTubeHolderSettings(); + + } + + @ExtApiFn(name = "修改<试管>用户信息配置", group = "试管", order = ORDER.setTubeSettingU) + synchronized public List setTubeSettingUserIdAndSampleBarcode(String uuid, Integer tubeIndex, String userid, String sampleBarcode) throws AppException { + logger.info("setTubeSettingUserIdAndSampleBarcode {} {} {} {}", uuid, tubeIndex, userid, sampleBarcode); + TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); + TubeSetting tSetting = thSetting.tubeSettings[tubeIndex]; + tSetting.userid = userid; + tSetting.sampleBarcode = sampleBarcode; + return getTubeHolderSettings(); + } + + @ExtApiFn(name = "修改<试管>配置(ps:projIndex格式为逗号分割的数字)", group = "试管", order = ORDER.setTubeSetting) + synchronized public List setTubeSetting(String uuid, Integer tubeIndex, BloodType bloodType, String projIndex) throws AppException { + logger.info("setTubeSetting {} {} {} {}", uuid, tubeIndex, bloodType, projIndex); + TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); + + List projIndexList = new ArrayList<>(); + String[] projIndexArr = projIndex.split(","); + for (String s : projIndexArr) { + projIndexList.add(Integer.parseInt(s)); + } + var tubeSetting = thSetting.tubeSettings[tubeIndex]; + tubeSetting.bloodType = bloodType; + tubeSetting.projIndex = projIndexList; + return getTubeHolderSettings(); + } + + /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * internal use + *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + + synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) throws AppException { + if (removeSetting == null) { + return; + } + gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(removeSetting.uuid)); + } + + //锁定第一个激活的试管架配置 + synchronized public TubeHolderSetting interUseGetThelastActiveTubeHolderSettingAndLock() { + for (int i = gState.getTubeHolderSettings().size() - 1; i >= 0; i--) { + TubeHolderSetting setting = gState.getTubeHolderSettings().get(i); + if (setting.active) { + setting.lock = true; + ebus.pushEvent(new AppTubeholderSettingUpdateEvent()); + return setting; + } + } + return null; + } + + synchronized public void interUseUnlockTubeHolderSetting(String uuid) { + for (TubeHolderSetting setting : gState.getTubeHolderSettings()) { + if (setting.uuid.equals(uuid)) { + setting.lock = false; + ebus.pushEvent(new AppTubeholderSettingUpdateEvent()); + return; + } + } + } + + +} diff --git a/src/main/java/a8k/service/app/appctrl/CheckPointType.java b/src/main/java/a8k/service/app/appctrl/CheckPointType.java deleted file mode 100644 index 1595b5b..0000000 --- a/src/main/java/a8k/service/app/appctrl/CheckPointType.java +++ /dev/null @@ -1,10 +0,0 @@ -package a8k.service.app.appctrl; - -public enum CheckPointType { - CHECK_TUBE_XCHANNEL_IS_EMPTY,//入料通道是否为空 - CHECK_PLATE_BOX_IS_COVER,//板夹仓盖子是否盖着 - CHECK_PLATE_STUCK_DETECTOR_SENSOR_IS_TRIGGER,//板夹仓卡板检测 - CHECK_PULLERM_IS_IN_ZEROPOS,//检查拉杆电机是否在零点位置 - CHECK_PUSHERM_IN_IN_ZEROPOS,//检查推杆电机是否在零点位置 - CHECK_RECYCLE_BIN_IS_OVERFLOW,//检查垃圾箱是否满 -} diff --git a/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java b/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java deleted file mode 100644 index 448be15..0000000 --- a/src/main/java/a8k/service/app/appctrl/ConsumablesScanService.java +++ /dev/null @@ -1,251 +0,0 @@ -package a8k.service.app.appctrl; - -import a8k.constant.AppConstant; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.app.appdata.AppProjInfoMgrService; -import a8k.service.app.appstate.GStateService; -import a8k.service.app.devicedriver.ctrl.ConsumablesScanCtrl; -import a8k.service.db.type.A8kProjOptConfig; -import a8k.service.db.type.A8kProjectInfo; -import a8k.service.debug.AppDebugHelperService; -import a8k.type.ConsumableGroup; -import a8k.type.ConsumableOneChResult; -import a8k.type.ConsumableScanRawResult; -import a8k.type.consumables.LarBSGroup; -import a8k.type.consumables.LittBSGroup; -import a8k.type.consumables.ReactionPlateGroup; -import a8k.type.consumables.ConsumablesErrorType; -import a8k.type.exception.AppException; -import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType; -import a8k.service.db.type.A8kIdCardInfo; -import a8k.utils.ReactionPlate2DCode; -import a8k.utils.ReactionPlate2DCodeHelper; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -@Component -public class ConsumablesScanService { - static Logger logger = org.slf4j.LoggerFactory.getLogger(ConsumablesScanService.class); - @Autowired - private AppDebugHelperService appDebugHelperService; - - public static class ConsumablesScanResult { - public Integer chNum; - public ConsumablesErrorType state; - public Integer projIndex; - public String lotId; - } - - - @Resource - GStateService gstate; - @Resource - AppProjInfoMgrService appProjMgr; - @Resource - ConsumablesScanCtrl scanCtrlService; - @Resource - AppDebugHelperService appDebugHelper; - - /** - * 解析扫描结果,返回耗材扫描结果 - * - * @param ch 通道号(0...5) - * @param rawResult 原始扫描结果 - * @return 耗材扫描结果 - */ - ConsumablesScanResult parseScanResult(Integer ch, ConsumableOneChResult rawResult) throws AppException { - ConsumablesScanResult ret = new ConsumablesScanResult(); - ret.chNum = ch; - - if (rawResult.larBSScanResult == null && rawResult.littBSScanResult == null && rawResult.PBScanResult == null) { - ret.state = ConsumablesErrorType.EMPTY; - return ret; - } - - if (rawResult.PBScanResult == null) { - ret.state = ConsumablesErrorType.MISS_REACTION_PLATE; - return ret; - } - - //解析板夹二维码 - ReactionPlate2DCode rp2dcode = ReactionPlate2DCodeHelper.parse(rawResult.PBScanResult); - - // //检查耗材是否过期 - // if (rp2dcode.expDate.before(new Date())) { - // ret.state = ScanResultState.EXPIRED; - // return ret; - // } - - //检查项目ID卡是否存在 - A8kIdCardInfo a8kIdCardInfo = appProjMgr.getA8kIdCardInfoByLotId(rp2dcode.lotId); - if (a8kIdCardInfo == null) { - logger.warn("未找到匹配的项目ID卡,LotID:{}", rp2dcode.lotId); - ret.state = ConsumablesErrorType.MISS_IDCARD; - return ret; - } - - if (a8kIdCardInfo.expiryDate.before(new Date())) { - logger.warn("耗材过期,LotID:{}", rp2dcode.lotId); - ret.state = ConsumablesErrorType.EXPIRED; - return ret; - } - //检查项目信息是否存在 - A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(a8kIdCardInfo.projIndex); - if (projInfo == null) { - logger.error("当前项目不支持,项目ID:{}", a8kIdCardInfo.projIndex); - ret.state = ConsumablesErrorType.UN_SUPPORT_PROJ; - return ret; - } - - Integer subProjNum = projInfo.subProjNum; - if (subProjNum == null || subProjNum <= 0) { - logger.error("项目信息不完整,项目ID:{},子项目数量为零", a8kIdCardInfo.projIndex); - ret.state = ConsumablesErrorType.CODE_ERROR_PROJINFO_IS_ERROR; - return ret; - } - - List projOptConfigList = appProjMgr.getProjOptConfigListByProjIndex(a8kIdCardInfo.projIndex); - if (projOptConfigList == null || projOptConfigList.size() != subProjNum) { - logger.error("项目操作配置信息不完整,项目ID:{},缺少光学配置", a8kIdCardInfo.projIndex); - ret.state = ConsumablesErrorType.CODE_ERROR_PROJINFO_IS_ERROR; - return ret; - } - - - //通过项目ID卡获取项目需要的耗材 - A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(a8kIdCardInfo.projIndex); - if (reactionType == null) { - ret.state = ConsumablesErrorType.CODE_ERROR_PROJINFO_IS_ERROR; - return ret; - } - - if (reactionType.equals(A8kReactionFlowType.FlowType1)) { - //校验小瓶缓冲液,小瓶缓冲液+样本 - if (rawResult.littBSScanResult == null) { - ret.state = ConsumablesErrorType.MISS_LITTSB; - return ret; - } - - if (!rawResult.littBSScanResult.equals(rp2dcode.lotId)) { - ret.state = ConsumablesErrorType.LITTSB_LOTID_MISMATCH; - return ret; - } - - } else if (reactionType.equals(A8kReactionFlowType.FlowType2)) { - // 校验大瓶缓冲液,大瓶缓冲液+小瓶缓冲液+样本 - if (rawResult.larBSScanResult == null) { - ret.state = ConsumablesErrorType.MISS_LARBS; - return ret; - } - - if (!rawResult.larBSScanResult.equals(rp2dcode.lotId)) { - ret.state = ConsumablesErrorType.LARBS_LOTID_MISMATCH; - return ret; - } - - - } else { - throw new RuntimeException("未知的反应流程类型"); - } - - ret.lotId = rp2dcode.lotId; - ret.projIndex = a8kIdCardInfo.projIndex; - ret.state = ConsumablesErrorType.PASS; - return ret; - } - - void LoadingConsumables(Integer ch, ConsumablesScanResult result) { - var cState = gstate.getConsumableState(); - assert ch.equals(result.chNum); - if (result.state != ConsumablesErrorType.PASS) { - return; - } - - A8kIdCardInfo a8kIdCardInfo = appProjMgr.getA8kIdCardInfoByLotId(result.lotId); - A8kReactionFlowType reactionType = appProjMgr.getA8kReactionFlowTypeByProjIndex(result.projIndex); - A8kProjectInfo projInfo = appProjMgr.getProjInfoByProjIndex(result.projIndex); - - assert a8kIdCardInfo != null; - assert reactionType != null; - assert projInfo != null; - - cState.reactionPlateGroup[ch] = new ReactionPlateGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); - if (reactionType.equals(A8kReactionFlowType.FlowType1)) { - cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); - cState.larBSGroup[ch] = new LarBSGroup(); - } else if (reactionType.equals(A8kReactionFlowType.FlowType2)) { - cState.littBSGroup[ch] = new LittBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); - cState.larBSGroup[ch] = new LarBSGroup(result.projIndex, a8kIdCardInfo.projName, projInfo.projShortName, result.lotId, a8kIdCardInfo.color, AppConstant.CONSUMABLE_NUM); - } else { - throw new RuntimeException("未知的反应流程类型"); - } - } - - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * EXT - +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - public Map scanConsumables() throws AppException { - if (!gstate.isDeviceInited()) { - throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); - } - List scanResult = new java.util.ArrayList<>(); - //执行扫描耗材动作 - ConsumableScanRawResult scanRawResult; - if (appDebugHelper.isDebug()) { - scanRawResult = appDebugHelper.scanConsumable(); - } else { - scanRawResult = scanCtrlService.doScanConsumablesAction(); - } - - - //解析扫描结果 - for (int i = 0; i < 6; i++) { - var result = parseScanResult(i, scanRawResult.ch[i]); - scanResult.add(result); - } - - var cState = gstate.getConsumableState(); - //加载耗材 - for (int i = 0; i < cState.reactionPlateGroup.length; i++) { - if (scanResult.get(i).state == ConsumablesErrorType.PASS) { - LoadingConsumables(i, scanResult.get(i)); - } - } - - Map ret = new java.util.HashMap<>(); - ret.put("scanResult", scanResult); - ret.put("scanRawResult", scanRawResult); - ret.put("consumableState", cState); - return ret; - } - - public Map scanOneGroupConsumables(ConsumableGroup group) throws AppException { - if (!gstate.isDeviceInited()) { - throw new AppException(A8kEcode.APPE_DEVICE_NOT_INITED); - } - - Integer chNum = group.off; - ConsumableOneChResult scanResult; - if (appDebugHelper.isDebug()) { - scanResult = appDebugHelper.scanOneCH(chNum); - } else { - scanResult = scanCtrlService.doScanOneCh(chNum); - } - var result = parseScanResult(chNum, scanResult); - if (result.state != ConsumablesErrorType.PASS) { - LoadingConsumables(chNum, result); - } - Map ret = new java.util.HashMap<>(); - ret.put("scanResult", result); - ret.put("scanRawResult", scanResult); - ret.put("consumableState", gstate.getConsumableState()); - return ret; - } - -} diff --git a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java deleted file mode 100644 index 897c234..0000000 --- a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java +++ /dev/null @@ -1,131 +0,0 @@ -package a8k.service.app.appctrl; - -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.service.bases.ActionReactorService; -import a8k.service.debug.AppDebugHelperService; -import a8k.type.checkpoint.CheckResult; -import a8k.type.checkpoint.Checkpoint; -import a8k.service.app.appstate.GStateService; -import a8k.service.app.devicedriver.basectrl.HbotModule; -import a8k.type.exception.AppException; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - -@Component -public class DeviceInitCtrlService { - - - @Resource - ActionReactorService ar; - - List checkPoints = new ArrayList<>(); - - @Resource - A8kCanBusService canBus; - - @Resource - HbotModule hbotModule; - - @Resource - GStateService gstate; - - @Resource - AppDebugHelperService appDebugHelper; - - Integer actionOvertime = 10000; - - @PostConstruct - void init() { - checkPoints.add(new Checkpoint("入料通道是否为空",// - CheckPointType.CHECK_PLATE_BOX_IS_COVER, () -> !canBus.getIOState(IOId.THChInterPPS) && !canBus.getIOState(IOId.THChOuterPPS))); - checkPoints.add(new Checkpoint("板夹仓盖子是否盖着",// - CheckPointType.CHECK_PLATE_BOX_IS_COVER, () -> canBus.getIOState(IOId.PlateBoxCoverClosurePPS))); - checkPoints.add(new Checkpoint("板夹仓卡板检测",// - CheckPointType.CHECK_PLATE_STUCK_DETECTOR_SENSOR_IS_TRIGGER, () -> !canBus.getIOState(IOId.PlateBoxPlateStuckPPS))); - checkPoints.add(new Checkpoint("检查拉杆电机是否在零点位置",// - CheckPointType.CHECK_PULLERM_IS_IN_ZEROPOS, () -> canBus.getIOState(IOId.PullerMZeroPPS))); - checkPoints.add(new Checkpoint("检查推杆电机是否在零点位置",// - CheckPointType.CHECK_PUSHERM_IN_IN_ZEROPOS, () -> canBus.getIOState(IOId.PusherMZeroPPS))); - checkPoints.add(new Checkpoint("检查垃圾箱是否满",// - CheckPointType.CHECK_RECYCLE_BIN_IS_OVERFLOW, () -> !canBus.getIOState(IOId.RecycleBinOverflowPPS))); - - } - - - public List checkBeforeInitDevice() throws AppException { - if (appDebugHelper.isDebug()) { - return appDebugHelper.checkBeforeInitDevice(); - } - List results = new java.util.ArrayList<>(); - for (Checkpoint checkPoint : checkPoints) { - CheckResult result = new CheckResult(); - result.type = checkPoint.type; - result.typechinfo = checkPoint.typechinfo; - result.pass = checkPoint.checkfn.check(); - results.add(result); - } - return results; - } - - public Boolean checkBeforeInitDevicePass() throws AppException { - List results = checkBeforeInitDevice(); - for (CheckResult result : results) { - if (!result.pass) { - return false; - } - } - return true; - } - - // - public void deviceMoveToZero() throws AppException { - - if (appDebugHelper.isDebug()) { - appDebugHelper.doVirtualThings("初始化设备", 3); - gstate.setDeviceInited(true); - return; - } - - Boolean suc = checkBeforeInitDevicePass(); - if (!suc) { - throw new AppException(A8kEcode.APPE_CHECK_POINT_CHECK_FAIL); - } - - //进出料初始化 - ar.dosome("入料平移电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, actionOvertime)); - ar.dosome("摇匀模组-扫码夹紧舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 20, actionOvertime)); - ar.dosome("摇匀模组-夹爪舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, 300, actionOvertime)); - ar.dosome("摇匀模组-夹爪Y轴舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, 300, actionOvertime)); - ar.dosome("摇匀模组-夹紧电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, actionOvertime)); - ar.dosome("摇匀模组-夹爪Z轴电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, actionOvertime)); - ar.dosome("摇匀模组-摇匀电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModShakeM, actionOvertime)); - ar.dosome("摇匀模组-摇匀电机摆动90度", () -> canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM, 90)); - - //板夹仓初始化 - ar.dosome("板夹仓Y轴电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxYM, actionOvertime)); - ar.dosome("板夹仓推板电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxPusherM, actionOvertime)); - - //光学模组初始化 - ar.dosome("光学模组-拉杆电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.OptModPullM, actionOvertime)); - ar.dosome("光学模组-扫码电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.OptModScannerM, actionOvertime)); - - //HBot初始化 - ar.dosome("HBot回零", () -> hbotModule.moveToZero()); - - //转盘归零 - ar.dosome("转盘回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.IncubatorRotateCtrlM, actionOvertime)); - - gstate.setDeviceInited(true); - } - - - // setDeviceInited - -} diff --git a/src/main/java/a8k/service/app/appctrl/MainFlowCtrlService.java b/src/main/java/a8k/service/app/appctrl/MainFlowCtrlService.java deleted file mode 100644 index b775409..0000000 --- a/src/main/java/a8k/service/app/appctrl/MainFlowCtrlService.java +++ /dev/null @@ -1,150 +0,0 @@ -package a8k.service.app.appctrl; - -import a8k.service.app.appctrl.mainflowctrl.MainFlowCtrlScheduler; -import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; -import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; -import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; -import a8k.service.app.appctrl.mainflowctrl.action.DO_STOP; -import a8k.service.app.appstate.GStateService; -import a8k.service.app.appstate.type.MainFlowCtrlState; -import a8k.service.app.appstate.type.state.A8kWorkState; -import a8k.service.app.appstate.type.state.TubeState; -import a8k.SpringBootBeanUtil; -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 MainFlowCtrlService { - static Logger logger = LoggerFactory.getLogger(MainFlowCtrlService.class); - - - @Resource - GStateService gstate; - - @Resource - MainFlowCtrlScheduler scheduler; - - @Resource - SpringBootBeanUtil springBoot; - - // - // Init - // - - - @PostConstruct - void init() { - - scheduler.regEcodePostProcesser(this::postPorcessA8kEcode); - scheduler.regCheckBeforeGuess(this::checkBeforeGuess); - - - logger.info("className {}", DO_STOP.class.getName()); - for (A8kActionStepType actionType : A8kActionStepType.values()) { - A8kStepAction action = SpringBootBeanUtil.getBean(actionType.name(), A8kStepAction.class); - scheduler.regFn(action); - } - - //启动调度 - scheduler.startScheduler(); - } - - void changeWorkState(A8kWorkState workState) { - MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - state.workStateChangeFlag = true; - state.lastWorkState = state.workState; - state.workState = workState; - } - - Boolean isAllowPause() { - if (gstate.getCurProcessingTube() != null) { - return !gstate.getCurProcessingTube().getState().isEq(List.of( - TubeState.PRE_PROCESSING, - TubeState.PRE_PROCESSED, - TubeState.PROCESSING, - TubeState.PROCESSED, - TubeState.POST_PROCESSING, - TubeState.POST_PROCESSED - )); - } - return true; - } - - void checkBeforeGuess() { - MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - if (state.startActionPending) { - if (state.workState != A8kWorkState.IDLE) { - state.startActionPending = false; - return; - } - changeWorkState(A8kWorkState.WORKING); - } else if (state.pauseActionPending) { - if (!isAllowPause()) { - return; - } - if (state.workState != A8kWorkState.WORKING) { - state.pauseActionPending = false; - return; - } - changeWorkState(A8kWorkState.PAUSE); - } else if (state.resumeActionPending) { - if (state.workState != A8kWorkState.PAUSE) { - state.resumeActionPending = false; - return; - } - changeWorkState(A8kWorkState.WORKING); - } else if (state.stopActionPending) { - if (state.workState == A8kWorkState.IDLE) { - state.stopActionPending = false; - return; - } - - changeWorkState(A8kWorkState.IDLE); - } - } - - void postPorcessA8kEcode(List ecodeList) { - } - - /** - * 继续运行前,清除错误码,并执行一定的动作 - * @param ecodeList - * @return - */ - Boolean clearErrorcodeBeforeContinueDo(List ecodeList) { - return true; - } - - - // - // EXT - // - public List getA8kStepActionList() { - return scheduler.getA8kStepActionList(); - } - - public void startWork() { - MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - state.startActionPending = true; - } - - public void stopWork() { - MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - state.stopActionPending = true; - } - - public void pauseWork() { - MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - state.pauseActionPending = true; - } - - public void continueWork() { - MainFlowCtrlState state = gstate.getMainFlowCtrlState(); - state.resumeActionPending = true; - } -} diff --git a/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java b/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java deleted file mode 100644 index b94793b..0000000 --- a/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java +++ /dev/null @@ -1,190 +0,0 @@ -package a8k.service.app.appctrl; - -import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.AppTubeholderSettingUpdateEvent; -import a8k.service.app.appstate.GStateService; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.extapi_controler.utils.ExtApiFn; -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.type.exception.AppException; -import a8k.type.type.A8kTubeHolderType; -import a8k.type.type.BloodType; -import a8k.type.tube_setting.TubeSetting; -import a8k.type.tube_setting.TubeHolderSetting; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - -@Component -@ExtApiTab(cfg = ExtApiTabConfig.AppTubeSettingMgrService) -public class TubeSettingMgrService { - static Logger logger = LoggerFactory.getLogger(TubeSettingMgrService.class); - - static class ORDER { - static final int getA8kDeviceCfg = 1; - static final int addCfg = 2; - static final int removeCfg = 3; - static final int activeCfg = 4; - static final int setTubeSettingU = 5; - static final int clearTubeProjectCfg = 6; - static final int setTubeSetting = 7; - } - - @Resource - GStateService gState; - - @Resource - AppEventBusService ebus; - - - TubeHolderSetting getTubeHolderSetting(String uuid) { - for (TubeHolderSetting setting : gState.getTubeHolderSettings()) { - if (setting.uuid.equals(uuid)) { - return setting; - } - } - return null; - } - - - TubeHolderSetting getTubeHolderSettingAndCheckIsEditable(String uuid) throws AppException { - TubeHolderSetting setting = getTubeHolderSetting(uuid); - if (setting == null) { - throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_NOT_FOUND); - } - if (setting.lock) { - throw new AppException(A8kEcode.APPE_TUBE_HOLDER_SETTING_IS_LOCKED); - } - return setting; - } - - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // EXTERNAL API - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @ExtApiFn(name = "获取试管架配置", group = "配置读取", order = ORDER.getA8kDeviceCfg) - synchronized public List getTubeHolderSettings() { - return gState.getTubeHolderSettings(); - } - - //添加试管架,返回整个列表 - @ExtApiFn(name = "添加<试管架>配置", group = "试管架", order = ORDER.addCfg) - synchronized public List newTubeHolderSetting() { - var newSetting = new TubeHolderSetting(); - logger.info("newTubeHolderSetting {}", newSetting.uuid); - - gState.getTubeHolderSettings().add(newSetting); - return getTubeHolderSettings(); - } - - - //添加试管架,返回被添加的试管架 - synchronized public TubeHolderSetting newTubeHolderSettingV2() { - var newSetting = new TubeHolderSetting(); - gState.getTubeHolderSettings().add(newSetting); - return newSetting; - } - - @ExtApiFn(name = "删除<试管架>配置", group = "试管架", order = ORDER.removeCfg) - synchronized public List removeTubeHolderSetting(String uuid) throws AppException { - logger.info("removeTubeHolderSetting {}", uuid); - getTubeHolderSettingAndCheckIsEditable(uuid); - gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(uuid)); - return getTubeHolderSettings(); - } - - - @ExtApiFn(name = "设置<试管架>激活状态", group = "试管架", order = ORDER.activeCfg) - synchronized public List tubeHodlerSettingSetActiveState(String uuid, Boolean active) throws AppException { - logger.info("tubeHodlerSettingSetActiveState {} {}", uuid, active); - TubeHolderSetting setting = getTubeHolderSettingAndCheckIsEditable(uuid); - - setting.active = active; - return getTubeHolderSettings(); - } - - @ExtApiFn(name = "设置<试管架>类型", group = "试管架", order = ORDER.activeCfg) - synchronized public List tubeHodlerSettingSetTubeHolderType(String uuid, A8kTubeHolderType type) throws AppException { - logger.info("tubeHodlerSettingSetTubeHolderType {} {}", uuid, type); - TubeHolderSetting setting = getTubeHolderSettingAndCheckIsEditable(uuid); - setting.tubeHolderType = type; - return getTubeHolderSettings(); - } - - @ExtApiFn(name = "复位<试管>配置", group = "试管", order = ORDER.clearTubeProjectCfg) - synchronized public List resetTubeSetting(String uuid, Integer tubeIndex) throws AppException { - logger.info("resetTubeSetting {} {}", uuid, tubeIndex); - TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); - thSetting.tubeSettings[tubeIndex].reset(); - return getTubeHolderSettings(); - - } - - @ExtApiFn(name = "修改<试管>用户信息配置", group = "试管", order = ORDER.setTubeSettingU) - synchronized public List setTubeSettingUserIdAndSampleBarcode(String uuid, Integer tubeIndex, String userid, String sampleBarcode) throws AppException { - logger.info("setTubeSettingUserIdAndSampleBarcode {} {} {} {}", uuid, tubeIndex, userid, sampleBarcode); - TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); - TubeSetting tSetting = thSetting.tubeSettings[tubeIndex]; - tSetting.userid = userid; - tSetting.sampleBarcode = sampleBarcode; - return getTubeHolderSettings(); - } - - @ExtApiFn(name = "修改<试管>配置(ps:projIndex格式为逗号分割的数字)", group = "试管", order = ORDER.setTubeSetting) - synchronized public List setTubeSetting(String uuid, Integer tubeIndex, BloodType bloodType, String projIndex) throws AppException { - logger.info("setTubeSetting {} {} {} {}", uuid, tubeIndex, bloodType, projIndex); - TubeHolderSetting thSetting = getTubeHolderSettingAndCheckIsEditable(uuid); - - List projIndexList = new ArrayList<>(); - String[] projIndexArr = projIndex.split(","); - for (String s : projIndexArr) { - projIndexList.add(Integer.parseInt(s)); - } - var tubeSetting = thSetting.tubeSettings[tubeIndex]; - tubeSetting.bloodType = bloodType; - tubeSetting.projIndex = projIndexList; - return getTubeHolderSettings(); - } - - /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - * internal use - *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - - synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) throws AppException { - if (removeSetting == null) { - return; - } - gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(removeSetting.uuid)); - } - - //锁定第一个激活的试管架配置 - synchronized public TubeHolderSetting interUseGetThelastActiveTubeHolderSettingAndLock() { - for (int i = gState.getTubeHolderSettings().size() - 1; i >= 0; i--) { - TubeHolderSetting setting = gState.getTubeHolderSettings().get(i); - if (setting.active) { - setting.lock = true; - ebus.pushEvent(new AppTubeholderSettingUpdateEvent()); - return setting; - } - } - return null; - } - - synchronized public void interUseUnlockTubeHolderSetting(String uuid) { - for (TubeHolderSetting setting : gState.getTubeHolderSettings()) { - if (setting.uuid.equals(uuid)) { - setting.lock = false; - ebus.pushEvent(new AppTubeholderSettingUpdateEvent()); - return; - } - } - } - - -} diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 9d3d9ad..20c7748 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -7,7 +7,7 @@ import a8k.service.bases.AppEventBusService; import a8k.service.bases.appevent.AppWarningNotifyEvent; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; -import a8k.service.app.appctrl.TubeSettingMgrService; +import a8k.service.app.appctrl.AppTubeSettingMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; @@ -52,11 +52,11 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { @Resource SampleScanTransportHardwareControler stc; @Resource - AppEventBusService ebus; + AppEventBusService ebus; @Resource - TubeSettingMgrService tubeSettingMgrService; + AppTubeSettingMgrService appTubeSettingMgrService; @Resource - AppProjInfoMgrService appProjInfoMgr; + AppProjInfoMgrService appProjInfoMgr; @Resource AppDebugHelperService appDebugHelper; @Resource @@ -164,7 +164,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { TubeHolder parseScanResult(TubeHolderScanResult scanResult) throws AppException { TubeHolder tubeholder = new TubeHolder(); - TubeHolderSetting setting = tubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock(); + TubeHolderSetting setting = appTubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock(); try { //获取试管架类型 A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); @@ -188,13 +188,13 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { //设置试管架状态 tubeholder.setState(TubeHolderState.PROCESSING); //删除之前的试管架配置 - tubeSettingMgrService.interUseRemoveTubeHolderSetting(setting); + appTubeSettingMgrService.interUseRemoveTubeHolderSetting(setting); return tubeholder; } catch (AppException e) { //回滚部分状态 if (setting != null) - tubeSettingMgrService.interUseUnlockTubeHolderSetting(setting.uuid); + appTubeSettingMgrService.interUseUnlockTubeHolderSetting(setting.uuid); throw e; } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java index ec9c465..d492b9f 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java @@ -11,7 +11,7 @@ import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appstate.*; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.Tube; -import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControlService; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler; import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl; import a8k.service.app.devicedriver.ctrl.SampleScanTransportHardwareControler; import a8k.service.app.devicedriver.ctrl.SamplesPreProcesCtrl; @@ -60,7 +60,7 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { @Resource SamplesPreProcesCtrl samplesPreProcesCtrl; @Resource - HbotBaseMoveControlService hbotBaseMoveControlService; + HbotBaseMoveControler hbotBaseMoveControler; @Resource IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java deleted file mode 100644 index 7eccdd0..0000000 --- a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControlService.java +++ /dev/null @@ -1,208 +0,0 @@ -package a8k.service.app.devicedriver.basectrl; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicedriver.basectrl.type.PipetteRegIndex; -import a8k.type.exception.AppException; -import a8k.type.cfg.*; -import a8k.hardware.A8kCanBusService; -import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.hardware.type.a8kcanprotocol.IOId; -import a8k.hardware.type.a8kcanprotocol.MId; -import a8k.hardware.type.regindex.RegIndex; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -/** - * Hbot控制服务 - */ -@Component -@ExtApiTab(cfg = ExtApiTabConfig.HbotControlService) -public class HbotBaseMoveControlService { - static Logger logger = LoggerFactory.getLogger(HbotBaseMoveControlService.class); - - @Resource - A8kCanBusService canBus; - @Resource - PipetteCtrlModule pipetteCtrlModule; - @Resource - HbotModule hbotModule; - Integer ao = 20000; - - public void hbotMoveTo(Pos3d targetPos) throws AppException { - logger.info("hbotCheckAndMoveTo:{}", targetPos); - - // 检查盖板是否关闭 - if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { - throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); - } - - boolean zEnable = true; - boolean hbotEnable = canBus.moduleGetReg(MId.HbotM, RegIndex.kreg_xyrobot_is_enable) == 1; - - //检查Z轴是否使能,如果没有使能,使能并移动到零点 - if (pipetteCtrlModule.getReg(PipetteRegIndex.kreg_pipette_zm_is_enable) == 0) { - pipetteCtrlModule.zMotorEnable(1); - pipetteCtrlModule.zMotorMoveZeroBlock(); - zEnable = false; - } - - //检查Z轴是否在零点 - if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { - pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - } - if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { - throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); - } - - // HBot移动 - hbotModule.enable(1); - hbotModule.moveToBlock(targetPos.x - 20, targetPos.y - 20, ao); - hbotModule.moveToBlock(targetPos.x, targetPos.y, ao); - hbotModule.moveToBlock(targetPos.x, targetPos.y, ao); - - // Z轴移动 - if (targetPos.z != 0) { - pipetteCtrlModule.zMotorEnable(1); - pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - pipetteCtrlModule.zMotorMoveToBlock(targetPos.z); - } - pipetteCtrlModule.zMotorEnable(zEnable ? 1 : 0); - hbotModule.enable(hbotEnable ? 1 : 0); - } - - public void hbotMoveTo(Pos2d tpos) throws AppException { - hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); - } - -// public String scan2dCode(Integer waittime) throws AppException { -// try { -// canBus.codeScanerStartScan(MId.PipetteModCodeScanner); -// String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, waittime); -// canBus.codeScanerStopScan(MId.PipetteModCodeScanner); -// return result; -// } catch (AppException e) { -// return ""; -// } -// } -// -// -// public void zMoveTo(Integer z) throws AppException { -// if (z == 0) { -// pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); -// } else { -// pipetteCtrlModule.zMotorMoveToBlock(z); -// } -// } -// -// private void hbotCheckAndMoveTo(Pos2d targetPos) throws AppException { -// hbotMoveTo(new Pos3d(targetPos.x, targetPos.y, 0)); -// } - -// private void modGroupMoveToZero() throws AppException { -// if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { -// throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); -// } -// -// pipetteCtrlModule.zMotorEnable(1); -// hbotModule.enable(1); -// -// hbotModule.moveToZeroBlock(timep.getHbotRuntoZeroActionOvertime()); -// -// // 丢弃tip -// Pos3d dropPos = pp.getTipDropPos(); -// hbotMoveTo(dropPos); -// // TODO: canBus.pipetteCtrlInitDeviceBlock(MId.PipetteMod, timep.getActionOvertime()); -// -// // 快速归零 -// modGroupMoveToZeroQuick(); -// } - -// private void modGroupMoveToZeroQuick() throws AppException { - // hbotCheckAndMoveTo(new Pos2d(0, 0)); - // } - - - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // 单步测试 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - // @ExtApiFn(name = "丢Tip", group = "单步测试") - // public void dropTip() throws AppException { - // Pos3d pos = pp.getTipDropPos(); - // hbotMoveTo(pos.x, pos.y); - // zMoveTo(pos.z); - // pipetteCtrlModule.putTipBlock(); - // zMoveTo(0); - // } - // - // @ExtApiFn(name = "取Tip", group = "单步测试") - // public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { - // logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); - // - // if (index > TipPickUpPosInfo.cgetTipNum() || index < 0) { - // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); - // } - // - // TipPickUpPosInfo tipPos = pp.getTipPickUpPosInfo(); - // Pos2d pos = tipPos.getTipPos(tipGroup.ordinal(), index); - // hbotMoveTo(pos.x, pos.y); - // - // //TODO: 补偿,group大于1时,z轴需要补偿0.2mm - // Integer zCompensate = 0; - // if (tipGroup.ordinal() > 1) { - // zCompensate = 2; - // } - // - // pipetteCtrlModule.zMotorMoveToBlock(tipPos.getPickUpZPos(tipGroup.ordinal()) + zCompensate); - // pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); - // - // Boolean isGetTip = canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; - // if (!isGetTip) { - // logger.error("takeTip fail"); - // } - // return isGetTip; - // } - - // @ExtApiFn(name = "HBot移动到", group = "单步测试") - // public void hbotMoveTo(Integer x, Integer y) throws AppException { - // hbotCheckAndMoveTo(new Pos2d(x, y)); - // } - - // @ExtApiFn(name = "HBot移动到小瓶缓冲液X孔", group = "单步测试") - // public void hbotMoveToSmallBottleGroup(ConsumableGroup group, Integer Xhole) - // throws AppException { - // BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); - // if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { - // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); - // } - // Pos2d pos = posInfo.cgetSmallBottleBufferPos(group.off, Xhole); - // hbotCheckAndMoveTo(pos); - // } - // - // @ExtApiFn(name = "HBot移动到探测物质X孔", group = "单步测试") - // public void hbotMoveToDetectMaterialPos(ConsumableGroup group, Integer Xhole) - // throws AppException { - // BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); - // if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { - // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); - // } - // Pos2d pos = posInfo.cgetDetectMaterialPos(group.off, Xhole); - // hbotCheckAndMoveTo(pos); - // } - // - // @ExtApiFn(name = "HBot移动到大瓶缓冲液X孔", group = "单步测试") - // public void hbotMoveToLargeBottleGroup(ConsumableGroup ch) throws AppException { - // LargeBottleBufferPos posInfo = pp.getLargeBottleBufferPosInfo(); - // Pos2d pos = posInfo.cgetBottlePos(ch.off); - // hbotCheckAndMoveTo(pos); - // } - // - // @ExtApiFn(name = "HBot移动到急诊位", group = "单步测试") - // public void hbotMoveToEmergencyPos() throws AppException { - // hbotMoveTo(pp.getEmergencyPos()); - // } - -} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControler.java b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControler.java new file mode 100644 index 0000000..ce482ab --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotBaseMoveControler.java @@ -0,0 +1,208 @@ +package a8k.service.app.devicedriver.basectrl; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicedriver.basectrl.type.PipetteRegIndex; +import a8k.type.exception.AppException; +import a8k.type.cfg.*; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.hardware.type.regindex.RegIndex; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * Hbot控制服务 + */ +@Component +@ExtApiTab(cfg = ExtApiTabConfig.HbotControlService) +public class HbotBaseMoveControler { + static Logger logger = LoggerFactory.getLogger(HbotBaseMoveControler.class); + + @Resource + A8kCanBusService canBus; + @Resource + PipetteCtrlModule pipetteCtrlModule; + @Resource + HbotModule hbotModule; + Integer ao = 20000; + + public void hbotMoveTo(Pos3d targetPos) throws AppException { + logger.info("hbotCheckAndMoveTo:{}", targetPos); + + // 检查盖板是否关闭 + if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { + throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); + } + + boolean zEnable = true; + boolean hbotEnable = canBus.moduleGetReg(MId.HbotM, RegIndex.kreg_xyrobot_is_enable) == 1; + + //检查Z轴是否使能,如果没有使能,使能并移动到零点 + if (pipetteCtrlModule.getReg(PipetteRegIndex.kreg_pipette_zm_is_enable) == 0) { + pipetteCtrlModule.zMotorEnable(1); + pipetteCtrlModule.zMotorMoveZeroBlock(); + zEnable = false; + } + + //检查Z轴是否在零点 + if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { + pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + } + if (!pipetteCtrlModule.zAixsZeroPointIsTrigger()) { + throw new AppException(A8kEcode.CODEERROR_ZM_NOT_AT_ZERO_POS_WHEN_HBOT_TRY_MOVE); + } + + // HBot移动 + hbotModule.enable(1); + hbotModule.moveToBlock(targetPos.x - 20, targetPos.y - 20); + hbotModule.moveToBlock(targetPos.x, targetPos.y); + hbotModule.moveToBlock(targetPos.x, targetPos.y); + + // Z轴移动 + if (targetPos.z != 0) { + pipetteCtrlModule.zMotorEnable(1); + pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + pipetteCtrlModule.zMotorMoveToBlock(targetPos.z); + } + pipetteCtrlModule.zMotorEnable(zEnable ? 1 : 0); + hbotModule.enable(hbotEnable ? 1 : 0); + } + + public void hbotMoveTo(Pos2d tpos) throws AppException { + hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); + } + + // public String scan2dCode(Integer waittime) throws AppException { + // try { + // canBus.codeScanerStartScan(MId.PipetteModCodeScanner); + // String result = canBus.codeScanerWaittingForResult(MId.PipetteModCodeScanner, waittime); + // canBus.codeScanerStopScan(MId.PipetteModCodeScanner); + // return result; + // } catch (AppException e) { + // return ""; + // } + // } + // + // + // public void zMoveTo(Integer z) throws AppException { + // if (z == 0) { + // pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + // } else { + // pipetteCtrlModule.zMotorMoveToBlock(z); + // } + // } + // + // private void hbotCheckAndMoveTo(Pos2d targetPos) throws AppException { + // hbotMoveTo(new Pos3d(targetPos.x, targetPos.y, 0)); + // } + + // private void modGroupMoveToZero() throws AppException { + // if (!canBus.getIOState(IOId.PlateBoxCoverClosurePPS)) { + // throw new AppException(A8kEcode.APPE_PLATE_BOX_NOT_COVER); + // } + // + // pipetteCtrlModule.zMotorEnable(1); + // hbotModule.enable(1); + // + // hbotModule.moveToZeroBlock(timep.getHbotRuntoZeroActionOvertime()); + // + // // 丢弃tip + // Pos3d dropPos = pp.getTipDropPos(); + // hbotMoveTo(dropPos); + // // TODO: canBus.pipetteCtrlInitDeviceBlock(MId.PipetteMod, timep.getActionOvertime()); + // + // // 快速归零 + // modGroupMoveToZeroQuick(); + // } + + // private void modGroupMoveToZeroQuick() throws AppException { + // hbotCheckAndMoveTo(new Pos2d(0, 0)); + // } + + + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // 单步测试 + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + // @ExtApiFn(name = "丢Tip", group = "单步测试") + // public void dropTip() throws AppException { + // Pos3d pos = pp.getTipDropPos(); + // hbotMoveTo(pos.x, pos.y); + // zMoveTo(pos.z); + // pipetteCtrlModule.putTipBlock(); + // zMoveTo(0); + // } + // + // @ExtApiFn(name = "取Tip", group = "单步测试") + // public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { + // logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); + // + // if (index > TipPickUpPosInfo.cgetTipNum() || index < 0) { + // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); + // } + // + // TipPickUpPosInfo tipPos = pp.getTipPickUpPosInfo(); + // Pos2d pos = tipPos.getTipPos(tipGroup.ordinal(), index); + // hbotMoveTo(pos.x, pos.y); + // + // //TODO: 补偿,group大于1时,z轴需要补偿0.2mm + // Integer zCompensate = 0; + // if (tipGroup.ordinal() > 1) { + // zCompensate = 2; + // } + // + // pipetteCtrlModule.zMotorMoveToBlock(tipPos.getPickUpZPos(tipGroup.ordinal()) + zCompensate); + // pipetteCtrlModule.zMotorMoveToZeroPointQuickBlock(); + // + // Boolean isGetTip = canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1; + // if (!isGetTip) { + // logger.error("takeTip fail"); + // } + // return isGetTip; + // } + + // @ExtApiFn(name = "HBot移动到", group = "单步测试") + // public void hbotMoveTo(Integer x, Integer y) throws AppException { + // hbotCheckAndMoveTo(new Pos2d(x, y)); + // } + + // @ExtApiFn(name = "HBot移动到小瓶缓冲液X孔", group = "单步测试") + // public void hbotMoveToSmallBottleGroup(ConsumableGroup group, Integer Xhole) + // throws AppException { + // BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); + // if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { + // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); + // } + // Pos2d pos = posInfo.cgetSmallBottleBufferPos(group.off, Xhole); + // hbotCheckAndMoveTo(pos); + // } + // + // @ExtApiFn(name = "HBot移动到探测物质X孔", group = "单步测试") + // public void hbotMoveToDetectMaterialPos(ConsumableGroup group, Integer Xhole) + // throws AppException { + // BottleGroupsPosInfo posInfo = pp.getBottleBufferPosInfo(); + // if (Xhole < 0 || Xhole > BottlesPosInfo.cgetMAX()) { + // throw new AppException(A8kEcode.CODEERROR_PARAM_OUT_OF_RANGE); + // } + // Pos2d pos = posInfo.cgetDetectMaterialPos(group.off, Xhole); + // hbotCheckAndMoveTo(pos); + // } + // + // @ExtApiFn(name = "HBot移动到大瓶缓冲液X孔", group = "单步测试") + // public void hbotMoveToLargeBottleGroup(ConsumableGroup ch) throws AppException { + // LargeBottleBufferPos posInfo = pp.getLargeBottleBufferPosInfo(); + // Pos2d pos = posInfo.cgetBottlePos(ch.off); + // hbotCheckAndMoveTo(pos); + // } + // + // @ExtApiFn(name = "HBot移动到急诊位", group = "单步测试") + // public void hbotMoveToEmergencyPos() throws AppException { + // hbotMoveTo(pp.getEmergencyPos()); + // } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java index aa359ae..88538fb 100644 --- a/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/HbotModule.java @@ -15,35 +15,38 @@ public class HbotModule { @Resource A8kCanBusService canBus; + Integer actionOvertime = 10000; + Integer moveToZeroActionOvertime = 20000; + public void enable(Integer enable) throws AppException { canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_enable.toInt(), enable); } - public void moveBy(Integer x, Integer y) throws AppException { + private void moveBy(Integer x, Integer y) throws AppException { canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_by.toInt(), x, y); } - public void moveByBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { + public void moveByBlock(Integer x, Integer y) throws AppException { moveBy(x, y); canBus.waitForMod(MId.HbotM, actionOvertime); } - public void moveTo(Integer x, Integer y) throws AppException { + private void moveTo(Integer x, Integer y) throws AppException { canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to.toInt(), x, y); } - public void moveToBlock(Integer x, Integer y, Integer actionOvertime) throws AppException { + public void moveToBlock(Integer x, Integer y) throws AppException { moveTo(x, y); canBus.waitForMod(MId.HbotM, actionOvertime); } - public void moveToZero() throws AppException { + private void moveToZero() throws AppException { canBus.callcmd(MId.HbotM.toInt(), CmdId.xymotor_move_to_zero.toInt()); } - public void moveToZeroBlock(Integer actionOvertime) throws AppException { + public void moveToZeroBlock() throws AppException { moveToZero(); - canBus.waitForMod(MId.HbotM, actionOvertime); + canBus.waitForMod(MId.HbotM, moveToZeroActionOvertime); } public Pos2d readPos() throws AppException { diff --git a/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java b/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java index 0e1755d..918d516 100644 --- a/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java +++ b/src/main/java/a8k/service/app/devicedriver/basectrl/PipetteCtrlModule.java @@ -130,7 +130,7 @@ public class PipetteCtrlModule { @ExtApiFn(name = "初始化设备", order = FnOrder.initDeviceBlock) - public void initDeviceBlock() throws AppException { + public void pipetteInitDeviceBlock() throws AppException { canBusService.callcmd(MId.PipetteMod.toInt(), CmdId.pipette_init_device.toInt()); canBusService.waitForMod(MId.PipetteMod, overtime); } diff --git a/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java b/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java index 2ce4219..29a8e2d 100644 --- a/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java +++ b/src/main/java/a8k/service/app/devicedriver/calibration/Hbot2DCodeScanPosCalibration.java @@ -5,6 +5,8 @@ import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.A8kCanBusService; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler; +import a8k.service.app.devicedriver.basectrl.HbotModule; import a8k.service.app.devicedriver.basectrl.PipetteCtrlModule; import a8k.service.app.devicedriver.basectrl.CodeScaner; import a8k.service.app.devicedriver.param.Hbot2DCodeScanPos; @@ -17,20 +19,28 @@ import jakarta.annotation.Resource; @ExtApiTab(cfg = ExtApiTabConfig.Hbot2DCodeScanPosCalibration) public class Hbot2DCodeScanPosCalibration { - @Resource - Hbot2DCodeScanPos hbot2DCodeScanPos; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; + @Resource + CodeScaner codeScaner; + @Resource + PipetteCtrlModule pipetteCtrlModule; @Resource - CodeScaner codeScaner; + HbotModule hbotModule; @Resource - PipetteCtrlModule pipetteCtrlModule; + HbotBaseMoveControler hbotBaseMoveControler; + @Resource + Hbot2DCodeScanPos hbot2DCodeScanPos; - @ExtApiFn(name = "扫码测试(全部位置)", group = "测试工具", order = 0) + + @ExtApiFn(name = "归零", group = "测试工具", order = 0) public void deviceReset() throws AppException { pipetteCtrlModule.zMotorEnable(1); + hbotModule.enable(1); + pipetteCtrlModule.zMotorMoveZeroBlock(); + hbotModule.moveToZeroBlock(); } public void disableMotor() throws AppException { diff --git a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java index 779a38b..34bf430 100644 --- a/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/commonctrl/HardwareCommonCtrl.java @@ -107,7 +107,7 @@ public class HardwareCommonCtrl { canBus.stepMotorEasyMoveToZeroBlock(MId.OptModPullM, timep.getRuntoZeroActionOvertime()); canBus.stepMotorEasyMoveToZeroBlock(MId.OptModScannerM, timep.getRuntoZeroActionOvertime()); //HBot初始化 - hbotModule.moveToZero(); + hbotModule.moveToZeroBlock(); // TODO canBus.stepMotorEasyMoveToZeroBlock(MId.PipetteModZM, timep.getRuntoZeroActionOvertime()); //转盘归零 diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java b/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java index 0d5047a..6291fe4 100644 --- a/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/ConsumablesScanCtrl.java @@ -1,7 +1,7 @@ package a8k.service.app.devicedriver.ctrl; import a8k.service.app.devicedriver.basectrl.CodeScaner; -import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControlService; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler; import a8k.service.bases.ActionReactorService; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; @@ -28,9 +28,9 @@ public class ConsumablesScanCtrl { @Resource Hbot2DCodeScanPos hbotScanPos; @Resource - CodeScaner codeScaner; + CodeScaner codeScaner; @Resource - HbotBaseMoveControlService hbot; + HbotBaseMoveControler hbot; private void hbotMoveTo(Pos2d tpos) throws AppException { diff --git a/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java new file mode 100644 index 0000000..238fecc --- /dev/null +++ b/src/main/java/a8k/service/app/devicedriver/ctrl/DeviceInitCtrlService.java @@ -0,0 +1,117 @@ +package a8k.service.app.devicedriver.ctrl; + +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.bases.ActionReactorService; +import a8k.service.debug.AppDebugHelperService; +import a8k.type.CheckPointType; +import a8k.type.checkpoint.CheckResult; +import a8k.type.checkpoint.Checkpoint; +import a8k.service.app.appstate.GStateService; +import a8k.service.app.devicedriver.basectrl.HbotModule; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class DeviceInitCtrlService { + + @Resource + GStateService gstate; + @Resource + ActionReactorService actionReactor; + @Resource + A8kCanBusService canBus; + @Resource + HbotModule hbotModule; + @Resource + AppDebugHelperService appDebugHelper; + + Integer actionOvertime = 10000; + List checkPoints = new ArrayList<>(); + + @PostConstruct + void init() { + checkPoints.add(new Checkpoint("入料通道是否为空",// + CheckPointType.CHECK_PLATE_BOX_IS_COVER, () -> !canBus.getIOState(IOId.THChInterPPS) && !canBus.getIOState(IOId.THChOuterPPS))); + checkPoints.add(new Checkpoint("板夹仓盖子是否盖着",// + CheckPointType.CHECK_PLATE_BOX_IS_COVER, () -> canBus.getIOState(IOId.PlateBoxCoverClosurePPS))); + checkPoints.add(new Checkpoint("板夹仓卡板检测",// + CheckPointType.CHECK_PLATE_STUCK_DETECTOR_SENSOR_IS_TRIGGER, () -> !canBus.getIOState(IOId.PlateBoxPlateStuckPPS))); + checkPoints.add(new Checkpoint("检查拉杆电机是否在零点位置",// + CheckPointType.CHECK_PULLERM_IS_IN_ZEROPOS, () -> canBus.getIOState(IOId.PullerMZeroPPS))); + checkPoints.add(new Checkpoint("检查推杆电机是否在零点位置",// + CheckPointType.CHECK_PUSHERM_IN_IN_ZEROPOS, () -> canBus.getIOState(IOId.PusherMZeroPPS))); + checkPoints.add(new Checkpoint("检查垃圾箱是否满",// + CheckPointType.CHECK_RECYCLE_BIN_IS_OVERFLOW, () -> !canBus.getIOState(IOId.RecycleBinOverflowPPS))); + } + + + public List checkBeforeInitDevice() throws AppException { + List results = new java.util.ArrayList<>(); + for (Checkpoint checkPoint : checkPoints) { + CheckResult result = new CheckResult(); + result.type = checkPoint.type; + result.typechinfo = checkPoint.typechinfo; + if (!appDebugHelper.isDebug()) { + result.pass = checkPoint.checkfn.check(); + } else { + result.pass = true; + } + results.add(result); + } + return results; + } + + public Boolean checkBeforeInitDevicePass() throws AppException { + List results = checkBeforeInitDevice(); + for (CheckResult result : results) { + if (!result.pass) { + return false; + } + } + return true; + } + + // + public void deviceMoveToZero() throws AppException { + + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("初始化设备", 3); + gstate.setDeviceInited(true); + return; + } + + Boolean suc = checkBeforeInitDevicePass(); + if (!suc) { + throw new AppException(A8kEcode.APPE_CHECK_POINT_CHECK_FAIL); + } + //进出料初始化 + actionReactor.dosome("入料平移电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.FeedingModXM, actionOvertime)); + actionReactor.dosome("摇匀模组-扫码夹紧舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModTubeScanerClampingSV, 20, actionOvertime)); + actionReactor.dosome("摇匀模组-夹爪舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModGripperSV, 300, actionOvertime)); + actionReactor.dosome("摇匀模组-夹爪Y轴舵机回零", () -> canBus.miniServoMoveToBlock(MId.ShakeModGripperYSV, 300, actionOvertime)); + actionReactor.dosome("摇匀模组-夹紧电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModClampingM, actionOvertime)); + actionReactor.dosome("摇匀模组-夹爪Z轴电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModGripperZM, actionOvertime)); + actionReactor.dosome("摇匀模组-摇匀电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.ShakeModShakeM, actionOvertime)); + actionReactor.dosome("摇匀模组-摇匀电机摆动90度", () -> canBus.stepMotorEasyMoveTo(MId.ShakeModShakeM, 90)); + //板夹仓初始化 + actionReactor.dosome("板夹仓Y轴电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxYM, actionOvertime)); + actionReactor.dosome("板夹仓推板电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.PlatesBoxPusherM, actionOvertime)); + //光学模组初始化 + actionReactor.dosome("光学模组-拉杆电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.OptModPullM, actionOvertime)); + actionReactor.dosome("光学模组-扫码电机回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.OptModScannerM, actionOvertime)); + //HBot初始化 + actionReactor.dosome("HBot回零", () -> hbotModule.moveToZeroBlock()); + //转盘归零 + actionReactor.dosome("转盘回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.IncubatorRotateCtrlM, actionOvertime)); + gstate.setDeviceInited(true); + } + +} diff --git a/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java b/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java index 530dd7e..7e1b63c 100644 --- a/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java +++ b/src/main/java/a8k/service/app/devicedriver/testscript/TestScript.java @@ -11,7 +11,7 @@ import a8k.service.app.devicedriver.ctrl.SamplesPreProcesCtrl; import a8k.service.app.devicedriver.ctrl.SampleScanTransportHardwareControler; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControlService; +import a8k.service.app.devicedriver.basectrl.HbotBaseMoveControler; import a8k.service.app.devicedriver.ctrl.ReactionPlatesTransmitCtrl; import a8k.service.app.devicedriver.param.DebugParam; import a8k.service.app.devicedriver.param.PosParam; @@ -45,7 +45,7 @@ public class TestScript { ApplicationContext appCxt; @Resource - HbotBaseMoveControlService hbotcs; + HbotBaseMoveControler hbotcs; @Resource TimeParam timep; @@ -63,7 +63,7 @@ public class TestScript { @Resource SampleScanTransportHardwareControler sampleScanTransportHardwareControler; - EnginnerParamReader settingReader = new EnginnerParamReader(HbotBaseMoveControlService.class); + EnginnerParamReader settingReader = new EnginnerParamReader(HbotBaseMoveControler.class); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // 测试 diff --git a/src/main/java/a8k/service/debug/AppDebugHelperService.java b/src/main/java/a8k/service/debug/AppDebugHelperService.java index b546502..b074d71 100644 --- a/src/main/java/a8k/service/debug/AppDebugHelperService.java +++ b/src/main/java/a8k/service/debug/AppDebugHelperService.java @@ -9,9 +9,9 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.CmdId; import a8k.hardware.type.a8kcanprotocol.MId; import a8k.service.app.appctrl.AppDeviceCtrlService; -import a8k.service.app.appctrl.CheckPointType; -import a8k.service.app.appctrl.MainFlowCtrlService; -import a8k.service.app.appctrl.TubeSettingMgrService; +import a8k.type.CheckPointType; +import a8k.service.app.appctrl.AppMainFlowCtrlService; +import a8k.service.app.appctrl.AppTubeSettingMgrService; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; @@ -259,8 +259,8 @@ public class AppDebugHelperService { @ExtApiFn(name = "获取运行步骤状态", group = "调试") public List getA8kStepActionList() { - MainFlowCtrlService mainFlowCtrlService = SpringBootBeanUtil.getBean(MainFlowCtrlService.class); - return mainFlowCtrlService.getA8kStepActionList(); + AppMainFlowCtrlService appMainFlowCtrlService = SpringBootBeanUtil.getBean(AppMainFlowCtrlService.class); + return appMainFlowCtrlService.getA8kStepActionList(); } @ExtApiFn(name = "获取设备状态()", group = "调试") @@ -300,15 +300,15 @@ public class AppDebugHelperService { //添加试管配置 logger.info("添加试管配置"); - TubeSettingMgrService tubeSettingMgrService = SpringBootBeanUtil.getBean(TubeSettingMgrService.class); - tubeSettingMgrService.newTubeHolderSetting(); - TubeHolderSetting setting = tubeSettingMgrService.newTubeHolderSettingV2(); + AppTubeSettingMgrService appTubeSettingMgrService = SpringBootBeanUtil.getBean(AppTubeSettingMgrService.class); + appTubeSettingMgrService.newTubeHolderSetting(); + TubeHolderSetting setting = appTubeSettingMgrService.newTubeHolderSettingV2(); for (int i = 0; i < 10; i++) { - tubeSettingMgrService.setTubeSettingUserIdAndSampleBarcode(setting.uuid, i, String.format("USR%d", i), ""); - tubeSettingMgrService.setTubeSetting(setting.uuid, i, BloodType.WHOLE_BLOOD,// + appTubeSettingMgrService.setTubeSettingUserIdAndSampleBarcode(setting.uuid, i, String.format("USR%d", i), ""); + appTubeSettingMgrService.setTubeSetting(setting.uuid, i, BloodType.WHOLE_BLOOD,// String.format("%d,%d,%d,%d,%d,%d", p01_hscrr.projIndex, p02_pct.projIndex, p03_tsh.projIndex, p05_t3.projIndex, p06_t4.projIndex, p22_pctAndHsCRP.projIndex)); } - tubeSettingMgrService.tubeHodlerSettingSetActiveState(setting.uuid, true); + appTubeSettingMgrService.tubeHodlerSettingSetActiveState(setting.uuid, true); //初始化设备 logger.info("初始化设备"); @@ -422,28 +422,6 @@ public class AppDebugHelperService { } - public List checkBeforeInitDevice() throws AppException { - List checkPoints = new ArrayList<>(); - List resultss = new java.util.ArrayList<>(); - - checkPoints.add(new Checkpoint("入料通道是否为空", CheckPointType.CHECK_PLATE_BOX_IS_COVER, () -> true)); - checkPoints.add(new Checkpoint("板夹仓盖子是否盖着", CheckPointType.CHECK_PLATE_BOX_IS_COVER, () -> true)); - checkPoints.add(new Checkpoint("板夹仓卡板检测", CheckPointType.CHECK_PLATE_STUCK_DETECTOR_SENSOR_IS_TRIGGER, () -> true)); - checkPoints.add(new Checkpoint("检查拉杆电机是否在零点位置", CheckPointType.CHECK_PULLERM_IS_IN_ZEROPOS, () -> true)); - checkPoints.add(new Checkpoint("检查推杆电机是否在零点位置", CheckPointType.CHECK_PUSHERM_IN_IN_ZEROPOS, () -> true)); - checkPoints.add(new Checkpoint("检查垃圾箱是否满", CheckPointType.CHECK_RECYCLE_BIN_IS_OVERFLOW, () -> true)); - - - for (Checkpoint checkPoint : checkPoints) { - CheckResult result = new CheckResult(); - result.type = checkPoint.type; - result.typechinfo = checkPoint.typechinfo; - result.pass = checkPoint.checkfn.check(); - resultss.add(result); - } - return resultss; - } - synchronized public Boolean getTubeholderEnterPosPPS() { return tubeHolderScanResult != null; } diff --git a/src/main/java/a8k/type/CheckPointType.java b/src/main/java/a8k/type/CheckPointType.java new file mode 100644 index 0000000..48f693f --- /dev/null +++ b/src/main/java/a8k/type/CheckPointType.java @@ -0,0 +1,10 @@ +package a8k.type; + +public enum CheckPointType { + CHECK_TUBE_XCHANNEL_IS_EMPTY,//入料通道是否为空 + CHECK_PLATE_BOX_IS_COVER,//板夹仓盖子是否盖着 + CHECK_PLATE_STUCK_DETECTOR_SENSOR_IS_TRIGGER,//板夹仓卡板检测 + CHECK_PULLERM_IS_IN_ZEROPOS,//检查拉杆电机是否在零点位置 + CHECK_PUSHERM_IN_IN_ZEROPOS,//检查推杆电机是否在零点位置 + CHECK_RECYCLE_BIN_IS_OVERFLOW,//检查垃圾箱是否满 +}