diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index 5f92152..c7e8092 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -5,9 +5,10 @@ import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; import a8k.service.app.appstate.ConsumablesMgrService; import a8k.service.app.appstate.ProjectProcessContextMgrService; +import a8k.service.app.appstate.SensorState; import a8k.service.app.appstate.type.*; import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; - + import a8k.type.ConsumableGroup; import a8k.type.checkpoint.CheckResult; import a8k.service.app.appstate.GStateService; @@ -25,15 +26,15 @@ import java.util.Map; public class AppDeviceCtrlService { @Resource - GStateService gstate; + GStateService gstate; @Resource - DeviceInitCtrlService deviceInitializationModule; //设备初始化模块 + DeviceInitCtrlService deviceInitializationModule; //设备初始化模块 @Resource - AppMainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 + AppMainFlowCtrlService mainFlowCtrlSampleScanService; //主流程控制模块 @Resource - AppConsumablesScanService appConsumablesScanService; //耗材扫描模块 + AppConsumablesScanService appConsumablesScanService; //耗材扫描模块 @Resource - ConsumablesMgrService consumablesMgrService; //耗材管理模块 + ConsumablesMgrService consumablesMgrService; //耗材管理模块 @Resource ProjectProcessContextMgrService projectProcessContextMgrService; //项目处理上下文管理模块 @@ -55,7 +56,7 @@ public class AppDeviceCtrlService { * 设备控制 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @ExtApiFn(name = "开始工作", group = "设备控制") - public void startWork() { + public void startWork() throws AppException { mainFlowCtrlSampleScanService.startWork(); } @@ -147,6 +148,10 @@ public class AppDeviceCtrlService { return gstate.getConsumableState(); } + @ExtApiFn(name = "获取<传感器>状态", group = "设备状态") + public SensorState getSensorState() { + return gstate.getSensorState(); + } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java index c01adf0..155f7d5 100644 --- a/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppMainFlowCtrlService.java @@ -1,5 +1,6 @@ package a8k.service.app.appctrl; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.service.app.appctrl.mainflowctrl.MainFlowCtrlScheduler; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; @@ -10,6 +11,8 @@ 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 a8k.type.exception.AppException; +import a8k.utils.AppExceptionBuilder; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; @@ -32,6 +35,9 @@ public class AppMainFlowCtrlService { @Resource SpringBootBeanUtil springBoot; + @Resource + AppExceptionBuilder ebuilder; + // // Init // @@ -128,7 +134,15 @@ public class AppMainFlowCtrlService { return scheduler.getA8kStepActionList(); } - public void startWork() { + public void startWork() throws AppException { + if (!gstate.isDeviceInited()) { + throw ebuilder.buildAppException(A8kEcode.APPE_DEVICE_NOT_INITED); + } + + if (gstate.getSensorState().wasteBinFullFlag) { + throw ebuilder.buildAppException(A8kEcode.APPE_RECYCLE_BIN_OVERFLOW); + } + MainFlowCtrlState state = gstate.getMainFlowCtrlState(); state.startActionPending = true; } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java index 59389ca..66b64c3 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_CLEAR_ERROR_BEFORE_WORK.java @@ -17,28 +17,30 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; + import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; + + +/** + * 清空错误,针对部分错误,进行相应的硬件操作 + * + * 可能发生的错误 + * 1. 处理过程取tip头失败 + * + */ @Component public class DO_CLEAR_ERROR_BEFORE_WORK extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_CLEAR_ERROR_BEFORE_WORK.class); DO_CLEAR_ERROR_BEFORE_WORK() { super(A8kActionStepType.DO_CLEAR_ERROR_BEFORE_WORK); } @Resource - GStateService gstate; - @Resource - CondtionMgrService cms; - @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; - @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; + GStateService gstate; MainFlowCtrlState mfcs; - @PostConstruct void init() { mfcs = gstate.mainFlowCtrlState; @@ -46,7 +48,6 @@ public class DO_CLEAR_ERROR_BEFORE_WORK extends A8kStepAction { @Override public void doaction() throws AppException { - //ProcessErrorBeforeContinue mfcs.errorFlag = false; mfcs.ecodeList.clear(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java index 2b5c25e..a9ec059 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java @@ -13,6 +13,8 @@ import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -26,8 +28,17 @@ import java.util.List; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; -/** - * 处理错误的试管 +/* + * 当某试管所有错误处理完成时,触发该逻辑 + * + * 条件: + * 1.试管状态为POST_PROCESSED + * 2.试管状态为ERROR + * + * 动作: + * 1.将试管状态修改成PROCESS_COMPLETED + * 2.如果试管状态为ERROR,则复位hbot和预处理模块 + * */ @Component public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { @@ -44,12 +55,15 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { @Resource VirtualDevice virtualDevice; + @Resource - CondtionMgrService cms; + TubePreProcesCtrlService tubePreProcesCtrlService; @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; + HbotCtrlService hbotCtrlService; + + @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; + CondtionMgrService cms; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; @@ -61,10 +75,25 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { mfcs = gstate.mainFlowCtrlState; } + void resetHbotAndShakeModule() throws AppException { + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings("处理错误试管", 2); + virtualDevice.doVirtualThings("复位摇匀模组", 2); + virtualDevice.doVirtualThings("复位HBOT", 2); + return; + } + + //复位hbot + hbotCtrlService.dropTip(); + hbotCtrlService.moveQuickToZero(); + //复位预处理模块 + tubePreProcesCtrlService.resteModule(); + + } + @Override public void doaction() throws AppException { //ProcessErrorBeforeContinue - Tube tube = gstate.getCurProcessingTube(); Assert.isTrue(tube != null, "tube != null"); if (tube.getState().equals(TubeState.POST_PROCESSED)) { @@ -72,24 +101,20 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { return; } - if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("处理错误试管", 2); - virtualDevice.doVirtualThings("复位摇匀模组", 2); - virtualDevice.doVirtualThings("复位HBOT", 2); - } + resetHbotAndShakeModule(); projectProcessContextMgrService.finishedTubeProcess(); } @Override public Boolean checkCondition() { Boolean cond1 = cms.isCanDoAction(); - Boolean cond2 = cms.isHasSomeErrorTubeToBeProcessed() || cms.isHasPostProcessedTube(); + Boolean cond2 = cms.isHasSomeErrorTubeToBeProcessed() || cms.isHasPostProcessedTube(); // return cond1 && cond2; } @Override public List getResourceList() { return List.of( A8kPublicResourceType.ShakeModule, - A8kPublicResourceType.HBOT + A8kPublicResourceType.TubeFeedModule ); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java index 32289fa..5476a88 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java @@ -1,16 +1,15 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.OS; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.IncubationPlateStateMgrService; -import a8k.service.app.appstate.OptScanModuleStateMgrService; import a8k.service.app.appstate.ProjectProcessContextMgrService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.MainFlowCtrlState; +import a8k.service.app.devicectrl.ctrlservice.OptScanModule; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -40,16 +39,17 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { @Resource VirtualDevice virtualDevice; - @Resource CondtionMgrService cms; @Resource IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; - @Resource ProjectProcessContextMgrService projectProcessContextMgrService; + @Resource + OptScanModule optScanModule; + + MainFlowCtrlState mfcs; @PostConstruct @@ -58,25 +58,28 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { } + void doEjectAllErrorPlate(IncubationSubTank errorTank) throws AppException { + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings("处理错误板夹:" + errorTank.getPos()); + virtualDevice.doVirtualThings("推出板夹到光学模组"); + virtualDevice.doVirtualThings("丢弃板夹"); + return; + } + + logger.info("处理错误板夹:{}", errorTank.getPos()); + optScanModule.pullPlate(errorTank.getPos()); + optScanModule.dropPlate(); + } + @Override public void doaction() throws AppException { //ProcessErrorBeforeContinue - while (true) { IncubationSubTank errorTank = incubationPlateStateMgrService.getErrorPlate(); if (errorTank == null) { break; } - if (testStateMgrService.isVirtualDeviceEnable()) { - logger.info("处理错误板夹:{}", errorTank.getPos()); - //TODO:推出板夹到光学模组,同时丢弃板夹 - logger.info("推出板夹到光学模组"); - logger.info("丢弃板夹"); - OS.forceSleep(3000); - virtualDevice.doVirtualThings("处理错误板夹:" + errorTank.getPos()); - virtualDevice.doVirtualThings("推出板夹到光学模组"); - virtualDevice.doVirtualThings("丢弃板夹"); - } + doEjectAllErrorPlate(errorTank); // projectProcessContextMgrService.newPlateToOptScanPos(errorTank); projectProcessContextMgrService.dropPlate(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java index 6fc83c7..e9cabaf 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java @@ -6,7 +6,7 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.state.A8kWorkState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -34,8 +34,7 @@ public class DO_START extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeTubeFeedingCtrlService tubeTubeFeedingCtrlService; - + DeviceInitCtrlService deviceInitCtrlService; MainFlowCtrlState mfcs; @@ -48,9 +47,11 @@ public class DO_START extends A8kStepAction { mfcs.workStateChangeFlag = false; if (testStateMgrService.isVirtualDeviceEnable()) { virtualDevice.doVirtualThings("弹出试管架"); - } else { - tubeTubeFeedingCtrlService.ejectTubeHolder(); + return; } + + deviceInitCtrlService.clearDevice(); + } @Override public Boolean checkCondition() { @@ -61,6 +62,12 @@ public class DO_START extends A8kStepAction { } @Override public List getResourceList() { - return List.of(A8kPublicResourceType.ShakeModule); + return List.of( + A8kPublicResourceType.ShakeModule, + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.OPTModule, + A8kPublicResourceType.PlatesBoxModule, + A8kPublicResourceType.HBOT + ); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java index 685507d..b6aefdd 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_STOP.java @@ -7,7 +7,8 @@ import a8k.service.app.appstate.ProjectProcessContextMgrService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.state.A8kWorkState; - + +import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -16,8 +17,10 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; + import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; + @Component public class DO_STOP extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(DO_STOP.class); @@ -27,15 +30,16 @@ public class DO_STOP extends A8kStepAction { } @Resource - GStateService gstate; - @Resource + GStateService gstate; + @Resource TestStateMgrService testStateMgrService; @Resource VirtualDevice virtualDevice; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; - + @Resource + DeviceInitCtrlService deviceInitCtrlService; MainFlowCtrlState mfcs; @@ -44,16 +48,20 @@ public class DO_STOP extends A8kStepAction { mfcs = gstate.mainFlowCtrlState; } - @Override public void doaction() throws AppException { - mfcs.workStateChangeFlag = false; - + void doClearDevice() throws AppException { if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("清空设备", 1); + virtualDevice.doVirtualThings("清空设备", 1); + } else { + deviceInitCtrlService.clearDevice(); } + } + @Override public void doaction() throws AppException { + mfcs.workStateChangeFlag = false; + //清空设备 + doClearDevice(); + //清空所有反应状态 projectProcessContextMgrService.finishedAll(); - - //清空所有孵育盘中的孔位 } @Override public Boolean checkCondition() { @@ -64,6 +72,12 @@ public class DO_STOP extends A8kStepAction { } @Override public List getResourceList() { - return List.of(); + return List.of( + A8kPublicResourceType.ShakeModule, + A8kPublicResourceType.IncubationPlateModule, + A8kPublicResourceType.OPTModule, + A8kPublicResourceType.PlatesBoxModule, + A8kPublicResourceType.HBOT + ); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md new file mode 100644 index 0000000..fb19724 --- /dev/null +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/README.md @@ -0,0 +1,25 @@ + +```angular2html + +当某个试管处理过程中触发错误? +耗材不足错误: + 检测点:开始处理试管前 + 错误处理逻辑: 上报错误,设备暂停,试管状态为待处理 + +取Tip头失败: + 检查点:试管处理过程中 + 错误处理:当前样本相关的测试全部失败,设备暂停,试管状态被标记为错误。 + +取样本失败: + 检查点:试管处理过程中 + 错误处理:当前样本相关的测试全部失败,不抛出异常,试管标记为错误,处理下一个试管。 + + + +什么情况下设备不允许暂停? + 1. 当试管正在处理的过程中,不允许暂停,因为此时耗材已经作为资源分配出去了,暂停后如果用户修改耗材状态就会造成资源状态无法同步。 + + + + +``` \ No newline at end of file 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 a119b53..d002114 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 @@ -16,7 +16,7 @@ import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.state.TubeHolderState; import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; @@ -33,9 +33,6 @@ import org.springframework.util.Assert; import java.util.List; -import a8k.service.test.state.TestStateMgrService; -import a8k.service.test.state.VirtualDevice; - /** * * TubeHolderState @@ -60,11 +57,11 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { VirtualDevice virtualDevice; @Resource - CondtionMgrService cmgr; + CondtionMgrService cmgr; @Resource - TubeTubeFeedingCtrlService stc; + TubeFeedingCtrlService stc; @Resource - AppEventBusService ebus; + AppEventBusService ebus; @Resource AppTubeSettingMgrService appTubeSettingMgrService; @Resource diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index 10b1a71..7f7d315 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -9,7 +9,7 @@ import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.TubeHolder; import a8k.service.app.appstate.type.Tube; import a8k.service.app.appstate.type.state.TubeState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -45,9 +45,9 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeTubeFeedingCtrlService sstc; + TubeFeedingCtrlService sstc; @Resource - CondtionMgrService cms; + CondtionMgrService cms; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; 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 b23e63b..feb5381 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 @@ -12,8 +12,8 @@ import a8k.service.app.appstate.*; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.Tube; import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; -import a8k.service.app.devicectrl.ctrlservice.ReactionPlatesTransmitCtrlService; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.app.devicectrl.ctrlservice.TubePreProcesCtrlService; import a8k.type.ecode.AppError; import a8k.type.exception.AppException; @@ -51,19 +51,19 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { VirtualDevice virtualDevice; @Resource - TubeTubeFeedingCtrlService sstc; + TubeFeedingCtrlService sstc; @Resource - ConsumablesMgrService consumablesMgrService; + ConsumablesMgrService consumablesMgrService; @Resource ProjCfgMgrService projCfgMgrService; @Resource AppEventBusService ebus; @Resource - AppExceptionBuilder ebuilder; + AppExceptionBuilder ebuilder; @Resource - ReactionPlatesTransmitCtrlService reactionPlatesTransmitCtrlService; + TurnableMoveCtrlService turnableMoveCtrlService; @Resource - TubePreProcesCtrlService tubePreProcesCtrlService; + TubePreProcesCtrlService tubePreProcesCtrlService; @Resource HbotBaseMoveExDriver hbotBaseMoveExDriver; @Resource diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java index e4c0f0c..cd6c01f 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java @@ -7,7 +7,7 @@ import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.state.TubeHolderState; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; @@ -40,7 +40,7 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { CondtionMgrService cms; @Resource - TubeTubeFeedingCtrlService SST_HControler; + TubeFeedingCtrlService SST_HControler; MainFlowCtrlState state; diff --git a/src/main/java/a8k/service/app/appstate/GStateService.java b/src/main/java/a8k/service/app/appstate/GStateService.java index d091acb..14d05ee 100644 --- a/src/main/java/a8k/service/app/appstate/GStateService.java +++ b/src/main/java/a8k/service/app/appstate/GStateService.java @@ -43,6 +43,8 @@ public class GStateService { String mcuVersion = "NOTSET"; String sn = "NOTSET"; + SensorState sensorState; + A8kIdCardInfo mountedIdCardInfo; //主流程控制状态 @@ -72,4 +74,8 @@ public class GStateService { return mainFlowCtrlState.workState.equals(A8kWorkState.WORKING); } + public synchronized SensorState getSensorState() { + return sensorState; + } + } diff --git a/src/main/java/a8k/service/app/appstate/SensorState.java b/src/main/java/a8k/service/app/appstate/SensorState.java new file mode 100644 index 0000000..f4a3020 --- /dev/null +++ b/src/main/java/a8k/service/app/appstate/SensorState.java @@ -0,0 +1,10 @@ +package a8k.service.app.appstate; + +import lombok.Data; + +@Data +public class SensorState { + public Integer pboxTemperature = 25; + public Integer incubateBoxTemperature = 25; + public Boolean wasteBinFullFlag = false; +} diff --git a/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java b/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java index 9096abb..764770e 100644 --- a/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java +++ b/src/main/java/a8k/service/app/appstate/resource/A8kPublicResourceType.java @@ -1,7 +1,8 @@ package a8k.service.app.appstate.resource; public enum A8kPublicResourceType { - ShakeModule,//样本平移电机 + ShakeModule,//摇匀模组 + TubeFeedModule,//入料模组 IncubationPlateModule,//孵育盘电机 OPTModule, //光学电机 PlatesBoxModule,//板夹仓电机 diff --git a/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java b/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java index 17d01fa..42f1949 100644 --- a/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java @@ -3,13 +3,15 @@ package a8k.service.app.devicectrl.calibration; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.ctrlservice.OptScanModule; +import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.driver.MiniServoDriver; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; -import a8k.service.app.devicectrl.ctrlservice.ReactionPlatesTransmitCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; import a8k.service.app.devicectrl.param.*; import a8k.type.ConsumableGroup; @@ -26,17 +28,21 @@ public class ReactionPlatesTransmitControlerCalibration { final static int overtime = 10000; @Resource - MiniServoDriver miniServoDriver; + MiniServoDriver miniServoDriver; @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; + StepMotorCtrlDriver stepMotorCtrlDriver; @Resource - OptModuleParamsMgr optModuleParamsMgr; + OptModuleParamsMgr optModuleParamsMgr; @Resource - TurntablePosParamMgr turntablePosParamMgr; + TurntablePosParamMgr turntablePosParamMgr; @Resource - PlatesBoxPosParamMgr platesBoxPosParamMgr; + PlatesBoxPosParamMgr platesBoxPosParamMgr; @Resource - ReactionPlatesTransmitCtrlService reactionPlatesTransmitCtrlService; + TurnableMoveCtrlService turnableMoveCtrlService; + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModule optScanModule; @Resource PipetteCtrlDriver pipetteCtrlDriver; @@ -209,25 +215,25 @@ public class ReactionPlatesTransmitControlerCalibration { @ExtApiFn(name = "滴定", group = "校验", order = 1000) public void turntableMoveDropPos(IncubatorPos pos) throws AppException { - reactionPlatesTransmitCtrlService.trunableMoveToDropLiquidPos(pos); + turnableMoveCtrlService.trunableMoveToDropLiquidPos(pos); hbotCtrlService.moveToDropLiquidPos(); } @ExtApiFn(name = "孵育盘移动到拉板位", group = "校验", order = 1001) public void turntableMovePullPos(IncubatorPos pos) throws AppException { - reactionPlatesTransmitCtrlService.trunableMoveToPullPos(pos); + turnableMoveCtrlService.trunableMoveToPullPos(pos); } @ExtApiFn(name = "孵育盘移动到推板位", group = "校验", order = 1002) public void turntableMovePushPos(IncubatorPos pos) throws AppException { - reactionPlatesTransmitCtrlService.trunableMoveToPushPos(pos); + turnableMoveCtrlService.trunableMoveToPushPos(pos); } @ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003) public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { - reactionPlatesTransmitCtrlService.pushPlateQuick(PBCh, incubatorPos); - reactionPlatesTransmitCtrlService.pullPlate(incubatorPos); - reactionPlatesTransmitCtrlService.dropPlate(); + plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); + optScanModule.pullPlate(incubatorPos); + optScanModule.dropPlate(); } @ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004) diff --git a/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java b/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java index 8415adf..b637453 100644 --- a/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/calibration/TubeFeedingModulePosCalibration.java @@ -4,13 +4,12 @@ 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.devicectrl.driver.MiniServoDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; import a8k.service.app.devicectrl.exdriver.MotorMoveZeroExDriver; import a8k.service.app.devicectrl.exdriver.TubeTransportExDriver; import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.ctrlservice.TubeTubeFeedingCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.app.devicectrl.param.TubeFeedingModuleParamMgr; import a8k.service.db.type.Parameter; import a8k.type.TubeFeedingModulePos; @@ -32,11 +31,11 @@ public class TubeFeedingModulePosCalibration { TubeFeedingModuleParamMgr tubeScanPosMgr; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; @Resource - TubeTubeFeedingCtrlService tubeTubeFeedingCtrlService; + TubeFeedingCtrlService tubeFeedingCtrlService; @Resource - TubeTransportExDriver tubeTransportExDriver; + TubeTransportExDriver tubeTransportExDriver; @Resource StepMotorCtrlDriver stepMotorCtrlDriver; @Resource @@ -141,13 +140,13 @@ public class TubeFeedingModulePosCalibration { @ExtApiFn(name = "扫描试管架", group = "校验", order = 400) public TubeHolderScanResult calibrateScanTubeHolder() throws AppException { - TubeHolderScanResult result = tubeTubeFeedingCtrlService.scanTubeHodler(); - tubeTubeFeedingCtrlService.ejectTubeHolder(); + TubeHolderScanResult result = tubeFeedingCtrlService.scanTubeHodler(); + tubeFeedingCtrlService.ejectTubeHolder(); return result; } @ExtApiFn(name = "移动试管到预处理位置", group = "校验", order = 401) public void calibrateMoveTubeToPreProcessPos(Integer tubeIndex0To9) throws AppException { - tubeTubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex0To9); + tubeFeedingCtrlService.moveTubeToPreProcessPos(tubeIndex0To9); } } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java index 7861d35..7e73ba3 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/DeviceInitCtrlService.java @@ -3,9 +3,12 @@ package a8k.service.app.devicectrl.ctrlservice; import a8k.hardware.A8kCanBusService; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.service.app.devicectrl.driver.MiniServoDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.type.MiniServoMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.script.DeviceCtrlScripter; import a8k.service.bases.ActionReactorService; import a8k.service.test.state.TestStateMgrService; @@ -31,18 +34,35 @@ public class DeviceInitCtrlService { @Resource TestStateMgrService testStateMgrService; @Resource - VirtualDevice virtualDevice; + VirtualDevice virtualDevice; @Resource ActionReactorService actionReactor; + + @Resource + A8kCanBusService canBus; + + @Resource + HbotDriver hbotDriver; + @Resource + MiniServoDriver miniServoDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource - A8kCanBusService canBus; + MotorEnableExDriver motorEnableExDriver; + + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; @Resource - HbotDriver hbotDriver; + TubeFeedingCtrlService tubeFeedingCtrlService; @Resource - MiniServoDriver miniServoDriver; + HbotCtrlService hbotCtrlService; @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; + DeviceCtrlScripter deviceCtrlScripter; + Integer actionOvertime = 10000; List checkPoints = new ArrayList<>(); @@ -64,26 +84,10 @@ public class DeviceInitCtrlService { } - 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 (!testStateMgrService.isVirtualDeviceEnable()) { - result.pass = checkPoint.checkfn.check(); - } else { - result.pass = true; - } - results.add(result); - } - return results; - } + List doDeviceMoveToZero() throws AppException { + motorEnableExDriver.enableAllMotor(); - // - public List deviceMoveToZero() throws AppException { List results = checkBeforeInitDevice(); - if (testStateMgrService.isVirtualDeviceEnable()) { virtualDevice.doVirtualThings("初始化设备", 3); gstate.setDeviceInited(true); @@ -95,7 +99,9 @@ public class DeviceInitCtrlService { return results; } } - + //HBot初始化 + actionReactor.dosome("HbotZ轴回零", () -> pipetteCtrlDriver.zMotorMoveZeroBlock()); + actionReactor.dosome("HBot回零", () -> hbotDriver.moveToZeroBlock()); //进出料初始化 actionReactor.dosome("入料平移电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.FeedingModXM, actionOvertime)); actionReactor.dosome("摇匀模组-扫码夹紧舵机回零", () -> miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModTubeScanerClampingSV)); @@ -111,12 +117,56 @@ public class DeviceInitCtrlService { //光学模组初始化 actionReactor.dosome("光学模组-拉杆电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM, actionOvertime)); actionReactor.dosome("光学模组-扫码电机回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM, actionOvertime)); - //HBot初始化 - actionReactor.dosome("HBot回零", () -> hbotDriver.moveToZeroBlock()); //转盘归零 actionReactor.dosome("转盘回零", () -> stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, actionOvertime)); + + gstate.setDeviceInited(true); return results; } + + 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 (testStateMgrService.isVirtualDeviceEnable()) { + result.pass = true; + } else { + result.pass = checkPoint.checkfn.check(); + } + + results.add(result); + } + return results; + } + + // + + + public List deviceMoveToZero() throws AppException { + try { + return doDeviceMoveToZero(); + } catch (AppException e) { + motorEnableExDriver.forceDisableAllMotor(); + throw e; + } + } + + + public void clearDevice() throws AppException { + //弹出无效物料 + deviceCtrlScripter.dropAllPlates(); + //弹出试管架 + tubeFeedingCtrlService.ejectTubeHolder(); + //丢弃tip头 + hbotCtrlService.dropTip(); + //hbot快速归零 + hbotCtrlService.moveQuickToZero(); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java index ba8235d..1f28306 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java @@ -2,6 +2,7 @@ package a8k.service.app.devicectrl.ctrlservice; import a8k.constant.AppConstant; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.param.HbotConsumableParamMgr; @@ -13,18 +14,19 @@ import a8k.type.cfg.Pos3d; import a8k.type.exception.AppException; import a8k.type.type.TipGroup; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +@Slf4j @Component public class HbotCtrlService { - static Logger logger = LoggerFactory.getLogger(HbotCtrlService.class); @Resource - HbotFixedPosParamMgr hbotFixedPosParamMgr; + HbotFixedPosParamMgr hbotFixedPosParamMgr; @Resource - HbotSamplePosParamMgr hbotSamplePosParamMgr; + HbotSamplePosParamMgr hbotSamplePosParamMgr; @Resource HbotConsumableParamMgr hbotConsumableParamMgr; @@ -32,6 +34,8 @@ public class HbotCtrlService { PipetteCtrlDriver pipetteCtrlDriver; @Resource HbotBaseMoveExDriver hbotBaseMoveExDriver; + @Resource + HbotDriver hbotDriver; public void checkTipIndex(TipGroup tipGroup, Integer index) throws AppException { if (index >= AppConstant.TIP_NUM) { @@ -40,7 +44,7 @@ public class HbotCtrlService { } public Boolean takeTip(TipGroup tipGroup, Integer index) throws AppException { - logger.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); + log.info("takeTip groupId:{} index:{}", tipGroup.ordinal(), index); checkTipIndex(tipGroup, index); Pos3d tipPos = hbotConsumableParamMgr.getTipPos(tipGroup, index); @@ -73,6 +77,7 @@ public class HbotCtrlService { } public void dropTip() throws AppException { + log.info("丢弃tip"); hbotBaseMoveExDriver.hbotMoveTo(hbotFixedPosParamMgr.getDropTipPos()); pipetteCtrlDriver.putTipBlock(); } @@ -107,5 +112,11 @@ public class HbotCtrlService { } + public void moveQuickToZero() throws AppException { + log.info("Hbot快速归零"); + hbotBaseMoveExDriver.hbotMoveTo(new Pos3d(0, 0, 0)); + hbotDriver.moveToZeroBlock(); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java new file mode 100644 index 0000000..0bd1641 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java @@ -0,0 +1,49 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.OptModuleParamsMgr; +import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; +import a8k.service.app.devicectrl.param.TurntablePosParamMgr; +import a8k.service.bases.ActionReactorService; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) +public class OptScanModule { + static final Integer overtime = 10000; + + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + ActionReactorService actionReactor; + + @Resource + OptModuleParamsMgr optModuleParamsMgr; + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; + + + public void pullPlate(IncubatorPos turntablePosIndex) throws AppException { + turnableMoveCtrlService.trunableMoveToPullPos(turntablePosIndex); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, optModuleParamsMgr.getPullerTargetPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModPullM, overtime); + } + + public void dropPlate() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerDropPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModScannerM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java index b11c545..d3939b1 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PipetteGunCtrlService.java @@ -1,7 +1,12 @@ package a8k.service.app.devicectrl.ctrlservice; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; +import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.springframework.stereotype.Component; @@ -13,18 +18,23 @@ import org.springframework.stereotype.Component; */ @Component +@Slf4j public class PipetteGunCtrlService { - static Logger logger = org.slf4j.LoggerFactory.getLogger(PipetteGunCtrlService.class); - public Integer a; + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotBaseMoveExDriver hbotBaseMoveExDriver; + @Resource + HbotCtrlService hbotCtrlService; + @PostConstruct void init() throws NoSuchMethodException { System.out.println("PipetteGunCtrlService init"); } + // - //取样 - // } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java new file mode 100644 index 0000000..3de47c1 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/PlateBoxCtrlService.java @@ -0,0 +1,50 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.A8kCanBusService; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.IOId; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.OptModuleParamsMgr; +import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; +import a8k.service.app.devicectrl.param.TurntablePosParamMgr; +import a8k.service.bases.ActionReactorService; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import freemarker.core.TruncateBuiltinAlgorithm; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) +public class PlateBoxCtrlService { + static final Integer overtime = 10000; + + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + ActionReactorService actionReactor; + + + @Resource + PlatesBoxPosParamMgr platesBoxPosParamMgr; + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; + + + public void pushPlateQuick(ConsumableGroup PBCh, IncubatorPos turntablePosIndex) throws AppException { + turnableMoveCtrlService.trunableMoveToPushPos(turntablePosIndex); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxYM, platesBoxPosParamMgr.getChXPos(PBCh.off), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxPusherM, platesBoxPosParamMgr.getPushEndXPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxPusherM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxYM, overtime); + } + + +} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java similarity index 95% rename from src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java rename to src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java index 47ba527..568cfdd 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeTubeFeedingCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubeFeedingCtrlService.java @@ -28,8 +28,8 @@ import org.springframework.stereotype.Component; @Component @ExtApiTab(cfg = ExtApiTabConfig.TubeTubeFeedingModule) -public class TubeTubeFeedingCtrlService { - static Logger logger = LoggerFactory.getLogger(TubeTubeFeedingCtrlService.class); +public class TubeFeedingCtrlService { + static Logger logger = LoggerFactory.getLogger(TubeFeedingCtrlService.class); static Integer infeedOvertime = 10000; static Integer outfeedOvertime = 10000; static Integer scanOvertime = 3000; @@ -48,16 +48,15 @@ public class TubeTubeFeedingCtrlService { @Resource A8kCanBusService canBus; @Resource - TubeFeedingModuleParamMgr stp; + TubeFeedingModuleParamMgr stp; @Resource - CodeScanerExDriver codeScaner; + CodeScanerExDriver codeScaner; @Resource - TubeTransportExDriver tubeTransportExDriver; + TubeTransportExDriver tubeTransportExDriver; @Resource - MiniServoDriver miniServoDriver; + MiniServoDriver miniServoDriver; @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - + StepMotorCtrlDriver stepMotorCtrlDriver; private Boolean isTubeExist() throws AppException { @@ -163,6 +162,7 @@ public class TubeTubeFeedingCtrlService { @ExtApiFn(name = "出料", group = "单步", order = ORDER.moveTubeRackToExitPos) public void ejectTubeHolder() throws AppException { + logger.info("弹出试管架"); moveTubeRackToExitPos(); try { stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); @@ -232,7 +232,7 @@ public class TubeTubeFeedingCtrlService { */ @ExtApiFn(name = "判断<试管N>高低", group = "单步-其他", order = ORDER.moveTubeToAltitJudgXPos) public Boolean moveAndJudgeTubeAltit(Integer tubeIndex) throws AppException { - tubeTransportExDriver.moveTubeRackTo(stp.getTubeAltitJudgPos(tubeIndex) , TargetPosMeasureDirection.NEGATIVE, false); + tubeTransportExDriver.moveTubeRackTo(stp.getTubeAltitJudgPos(tubeIndex), TargetPosMeasureDirection.NEGATIVE, false); return isHighTube(); } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java index 0927fc4..d1d24bd 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TubePreProcesCtrlService.java @@ -13,20 +13,25 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.MId; import a8k.utils.ZEQ; import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component +@Slf4j public class TubePreProcesCtrlService { - static Logger logger = LoggerFactory.getLogger(TubePreProcesCtrlService.class); static Integer actionOvertime = 10000; - @Resource - A8kCanBusService canBus; - @Resource - TubePreProcesPosParamMgr tubePreProcesPosParamMgr; + enum PROGRESS { + IDLE, + TAKE_TUBE, + SHAKE_TUBE, + TAKE_CAP, + PUT_BAK_TUBE, + } + @Resource MiniServoDriver miniServoDriver; @Resource @@ -37,12 +42,15 @@ public class TubePreProcesCtrlService { // PRIVATE // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ + PROGRESS progress = PROGRESS.IDLE; + Boolean isHTube = false; /** * 取试管帽,并放置在摇匀位 */ public void takeTubeFromTubeholderToShakePos(Boolean isHTube) throws AppException { + this.isHTube = isHTube; /* * 校验: * 1.当前摇匀模组设计到的电机是否都处于待机位 @@ -93,10 +101,12 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); //Y轴移动到零位 tubePreProcesModuleExDriver.YSVMoveToStandyPos(); + progress = PROGRESS.TAKE_TUBE; } public void shakeTube(Integer shakeDegree, Integer times) throws AppException { tubePreProcesModuleExDriver.shakeMShake(shakeDegree, times); + progress = PROGRESS.SHAKE_TUBE; } public void takeTubeCap(Boolean isHTube) throws AppException { @@ -110,6 +120,11 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); //Y移动到待机位 tubePreProcesModuleExDriver.YSVMoveToStandyPos(); + progress = PROGRESS.TAKE_CAP; + } + + public void putBakTube() { + } public void putbakTubeCapAndPutbakTubeToTubeHolder(Boolean isHTube) throws AppException { @@ -122,7 +137,7 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.clampingMReleaseTube(); //Z轴上移动到零位 tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); - //Y轴移动到零位 + //Y轴移动到取试管的位置 tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); //移动到放试管的位置 tubePreProcesModuleExDriver.zMotorMoveToTakeHBakTubePos(isHTube); @@ -130,5 +145,40 @@ public class TubePreProcesCtrlService { tubePreProcesModuleExDriver.gripperSVOpen(); //设备快速归零 tubePreProcesModuleExDriver.moveToZeroQuick(); + progress = PROGRESS.PUT_BAK_TUBE; + } + + public void resteModule() throws AppException { + + if (progress.equals(PROGRESS.IDLE)) { + return; + } else if (progress.equals(PROGRESS.TAKE_TUBE) || progress.equals(PROGRESS.SHAKE_TUBE)) { + //Y移动到取试管帽位置 + tubePreProcesModuleExDriver.YSVMoveToShakePos(); + //Z下移动到取试管帽位置 + tubePreProcesModuleExDriver.zMotorMoveToShakeTubePos(); + //闭合夹爪 + tubePreProcesModuleExDriver.gripperSVClampTube(); + //释放试管 + tubePreProcesModuleExDriver.clampingMReleaseTube(); + //Z上移动到零位 + tubePreProcesModuleExDriver.zMotorMoveToZeroQuick(); + //Y轴移动到取试管的位置 + tubePreProcesModuleExDriver.YSVMoveToTakeTubePos(); + //移动到放试管的位置 + tubePreProcesModuleExDriver.zMotorMoveToTakeHBakTubePos(isHTube); + //打开夹爪 + tubePreProcesModuleExDriver.gripperSVOpen(); + //设备快速归零 + tubePreProcesModuleExDriver.moveToZeroQuick(); + progress = PROGRESS.IDLE; + } else if (progress.equals(PROGRESS.TAKE_CAP)) { + putbakTubeCapAndPutbakTubeToTubeHolder(isHTube); + progress = PROGRESS.IDLE; + return; + } else if (progress.equals(PROGRESS.PUT_BAK_TUBE)) { + progress = PROGRESS.IDLE; + return; + } } } diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java similarity index 60% rename from src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java rename to src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java index 5541145..53bccdd 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/ReactionPlatesTransmitCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/TurnableMoveCtrlService.java @@ -7,6 +7,7 @@ import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.param.OptModuleParamsMgr; import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; import a8k.service.app.devicectrl.param.TurntablePosParamMgr; +import a8k.service.bases.ActionReactorService; import a8k.type.ConsumableGroup; import a8k.type.IncubatorPos; import a8k.type.exception.AppException; @@ -15,26 +16,23 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.IOId; import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Component +@Slf4j @ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) -public class ReactionPlatesTransmitCtrlService { - static Logger logger = LoggerFactory.getLogger(ReactionPlatesTransmitCtrlService.class); +public class TurnableMoveCtrlService { static final Integer overtime = 10000; @Resource - A8kCanBusService canBus; + A8kCanBusService canBus; @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - - @Resource - PlatesBoxPosParamMgr platesBoxPosParamMgr; + StepMotorCtrlDriver stepMotorCtrlDriver; @Resource - OptModuleParamsMgr optModuleParamsMgr; + ActionReactorService actionReactor; + @Resource TurntablePosParamMgr turntablePosParamMgr; @@ -42,26 +40,26 @@ public class ReactionPlatesTransmitCtrlService { private void checkBeforeMoveTrunable() throws AppException { //板夹仓卡板检测 if (canBus.getIOState(IOId.PlateBoxPlateStuckPPS)) { - logger.error("PlateBoxPlateStuckPPS is trigger"); + log.error("PlateBoxPlateStuckPPS is trigger"); throw new AppException(A8kEcode.APPE_PLATE_STUCK_DETECTOR_SENSOR_TRIGGER); } //检查钩板电机是否处于终点位置 if (!canBus.getIOState(IOId.PullerMZeroPPS)) { - logger.error("PullerM is not in zero pos"); + log.error("PullerM is not in zero pos"); throw new AppException(A8kEcode.APPE_PULLERM_INIT_POS_ERROR); } //检查板夹仓光电是否处于起点位置 if (!canBus.getIOState(IOId.PusherMZeroPPS)) { - logger.error("PusherM is not in zero pos"); + log.error("PusherM is not in zero pos"); throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR); } } private void checkBeforeMovePlateBox() throws AppException { if (!canBus.getIOState(IOId.PusherMZeroPPS)) { - logger.error("PusherM is not in zero pos "); + log.error("PusherM is not in zero pos "); throw new AppException(A8kEcode.APPE_PUSHERM_INIT_POS_ERROR); } } @@ -105,30 +103,4 @@ public class ReactionPlatesTransmitCtrlService { } - public void pushPlateQuick(ConsumableGroup PBCh, IncubatorPos turntablePosIndex) throws AppException { - trunableMoveToPushPos(turntablePosIndex); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxYM, platesBoxPosParamMgr.getChXPos(PBCh.off), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.PlatesBoxPusherM, platesBoxPosParamMgr.getPushEndXPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxPusherM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.PlatesBoxYM, overtime); - } - - public void pullPlate(IncubatorPos turntablePosIndex) throws AppException { - trunableMoveToPullPos(turntablePosIndex); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, optModuleParamsMgr.getPullerTargetPos(), overtime); - // if (!canBus.getIOState(IOId.PullerMEndPPS)) { - // logger.error("pull plate fail"); - // throw new AppException(A8kEcode.APPE_PULL_PLATE_FAIL); - // } - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModPullM, overtime); - } - - public void dropPlate() throws AppException { - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerDropPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModScannerM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); - } - - } diff --git a/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java b/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java index b2b5bf1..d2863c4 100644 --- a/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/driver/PipetteCtrlDriver.java @@ -130,7 +130,7 @@ public class PipetteCtrlDriver { @ExtApiFn(name = "初始化设备", order = FnOrder.initDeviceBlock) - public void pipetteInitDeviceBlock() throws AppException { + private 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/devicectrl/exdriver/HbotBaseMoveExDriver.java b/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java index f04247b..91a2c1d 100644 --- a/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/exdriver/HbotBaseMoveExDriver.java @@ -81,6 +81,7 @@ public class HbotBaseMoveExDriver { hbotMoveTo(new Pos3d(tpos.x, tpos.y, 0)); } + // public String scan2dCode(Integer waittime) throws AppException { // try { // canBus.codeScanerStartScan(MId.PipetteModCodeScanner); diff --git a/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java b/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java index 8024de7..360bb68 100644 --- a/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java +++ b/src/main/java/a8k/service/app/devicectrl/exdriver/MotorEnableExDriver.java @@ -84,7 +84,7 @@ public class MotorEnableExDriver { try { hbotDriver.enable(0); } catch (AppException e) { - log.info("hbotDriver disable failed, {}", e.getMessage()); + log.info("hbotDriver disable failed, {}", e.getMessage()); } try { @@ -94,5 +94,18 @@ public class MotorEnableExDriver { } } + public void enableAllMotor() throws AppException { + for (StepMotorMId stepMotorMId : StepMotorMId.values()) { + stepMotorCtrlDriver.stepMotorEnable(stepMotorMId, 1); + } + + for (MiniServoMId miniServoMId : MiniServoMId.values()) { + miniServoDriver.miniServoEnable(miniServoMId, 1); + } + + hbotDriver.enable(1); + pipetteCtrlDriver.zMotorEnable(1); + } + } diff --git a/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java b/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java new file mode 100644 index 0000000..e16dfa3 --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java @@ -0,0 +1,30 @@ +package a8k.service.app.devicectrl.script; + +import a8k.service.app.devicectrl.ctrlservice.OptScanModule; +import a8k.service.bases.ActionReactorService; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class DeviceCtrlScripter { + + @Resource + ActionReactorService actionReactor; + + @Resource + OptScanModule optScanModule; + + + public void dropAllPlates() throws AppException { + log.info("清空孵育盘"); + actionReactor.dosome("丢板", () -> optScanModule.dropPlate()); + for (var incubatorPos : IncubatorPos.values()) { + actionReactor.dosome("拉板" + incubatorPos.name(), () -> optScanModule.pullPlate(incubatorPos)); + actionReactor.dosome("丢板", () -> optScanModule.dropPlate()); + } + } +}