From 1505e00ae3cd15311d65d817ef9d07762de2a63f Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 9 Dec 2024 19:10:30 +0800 Subject: [PATCH] update --- src/main/java/a8k/config/CorsConfig.java | 18 ++ .../a8k/extapi/service/ExtApiTabCfgService.java | 10 +- .../java/a8k/hardware/A8kModParamInitializer.java | 4 +- .../service/app/appctrl/AppDeviceCtrlService.java | 1 + .../app/background/TemperatureCtrlService.java | 44 ++++- .../devicectrl/ctrlservice/HbotCtrlService.java | 10 + src/main/java/a8k/service/test/A8kOptTest.java | 154 ---------------- .../service/verification/A8kOptVerification.java | 154 ++++++++++++++++ .../verification/A8kTemperaturaVerfication.java | 70 +++++++ .../service/verification/A8kVerificationUtils.java | 52 ++++++ .../verification/PipetteGunVerificationV2.java | 202 +++++++++++++++++++++ 11 files changed, 550 insertions(+), 169 deletions(-) create mode 100644 src/main/java/a8k/config/CorsConfig.java delete mode 100644 src/main/java/a8k/service/test/A8kOptTest.java create mode 100644 src/main/java/a8k/service/verification/A8kOptVerification.java create mode 100644 src/main/java/a8k/service/verification/A8kTemperaturaVerfication.java create mode 100644 src/main/java/a8k/service/verification/A8kVerificationUtils.java create mode 100644 src/main/java/a8k/service/verification/PipetteGunVerificationV2.java diff --git a/src/main/java/a8k/config/CorsConfig.java b/src/main/java/a8k/config/CorsConfig.java new file mode 100644 index 0000000..ee618e2 --- /dev/null +++ b/src/main/java/a8k/config/CorsConfig.java @@ -0,0 +1,18 @@ +package a8k.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + // 允许所有域名进行跨域访问,实际使用时应根据需要进行配置 + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "POST", "PUT", "DELETE") + .allowedHeaders("*"); + } +} \ No newline at end of file diff --git a/src/main/java/a8k/extapi/service/ExtApiTabCfgService.java b/src/main/java/a8k/extapi/service/ExtApiTabCfgService.java index c54726a..5eff674 100644 --- a/src/main/java/a8k/extapi/service/ExtApiTabCfgService.java +++ b/src/main/java/a8k/extapi/service/ExtApiTabCfgService.java @@ -7,12 +7,11 @@ import a8k.service.app.background.BackgroudProcessCtrlService; import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; import a8k.service.app.devicectrl.init.MiniServoReferencePointIniter; import a8k.service.app.devicectrl.param.LowerDeviceParamMgr; import a8k.service.app.devicectrl.param.calibration.*; import a8k.service.test.*; -import a8k.service.verification.PipetteGunVerification; +import a8k.service.verification.*; import jakarta.annotation.PostConstruct; import lombok.Data; import org.springframework.stereotype.Component; @@ -85,13 +84,16 @@ public class ExtApiTabCfgService { cfgList.add(new Config(PipetteGunTest.class, "测试.PipetteGun", TabType.LowLevelApiTest)); cfgList.add(new Config(PosMeasureUtils.class, "测试.坐标测量", TabType.LowLevelApiTest)); - cfgList.add(new Config(A8kOptTest.class, "测试.光学测试", TabType.LowLevelApiTest)); cfgList.add(new Config(PipetteCtrlDriver.class, "硬件驱动.移液枪测试", TabType.LowLevelApiTest)); cfgList.add(new Config(StepMotorCtrlDriver.class, "硬件驱动.步进电机测试", TabType.LowLevelApiTest)); cfgList.add(new Config(TubeFeedingCtrlService.class, "硬件控制.入料模块", TabType.LowLevelApiTest)); - cfgList.add(new Config(PipetteGunVerification.class, "验证.移液枪验证", TabType.Verify)); + + cfgList.add(new Config(A8kVerificationUtils.class, "验证.工具", TabType.Verify)); + cfgList.add(new Config(PipetteGunVerificationV2.class, "验证.移液枪验证", TabType.Verify)); + cfgList.add(new Config(A8kTemperaturaVerfication.class, "验证.温度控制验证", TabType.Verify)); + cfgList.add(new Config(A8kOptVerification.class, "验证.光学模组", TabType.Verify)); for (Config cfg : cfgList) { diff --git a/src/main/java/a8k/hardware/A8kModParamInitializer.java b/src/main/java/a8k/hardware/A8kModParamInitializer.java index 1f7240f..2363441 100644 --- a/src/main/java/a8k/hardware/A8kModParamInitializer.java +++ b/src/main/java/a8k/hardware/A8kModParamInitializer.java @@ -118,10 +118,10 @@ public class A8kModParamInitializer { canBus.moduleSetReg(MId.HbotM, RegIndex.kreg_xyrobot_look_zero_edge_speed, 10); - canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 3000); + canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 6000); canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_ki, 100); canBus.moduleSetReg(MId.IncubatorTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_compute_interval, 9000); - canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 3000); + canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_kp, 6000); canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_ki, 100); canBus.moduleSetReg(MId.PlatesBoxTCM, RegIndex.kreg_water_cooling_tmp_controler_pid_compute_interval, 9000); diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index 76ddee9..e86eada 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -82,4 +82,5 @@ public class AppDeviceCtrlService { } + } diff --git a/src/main/java/a8k/service/app/background/TemperatureCtrlService.java b/src/main/java/a8k/service/app/background/TemperatureCtrlService.java index 834a32e..77c21de 100644 --- a/src/main/java/a8k/service/app/background/TemperatureCtrlService.java +++ b/src/main/java/a8k/service/app/background/TemperatureCtrlService.java @@ -15,6 +15,11 @@ import org.springframework.stereotype.Component; @Slf4j public class TemperatureCtrlService { + enum TemperaControlMode { + kFixTemperature, + kAutoChangeFromAppSetting + } + @Resource TemperatureControlDriver temperatureControlDriver; @@ -24,8 +29,9 @@ public class TemperatureCtrlService { @Resource AppSettingsMgrService appSettingsMgrService; - Integer temperature = 0; - Thread temperatureCtrlThread = null; + Integer targetTemperature = 0; + TemperaControlMode controlMode = TemperaControlMode.kFixTemperature; + Thread temperatureCtrlThread = null; @PostConstruct public void init() { @@ -33,6 +39,21 @@ public class TemperatureCtrlService { } public void startTemperatureControl() throws AppException { + stopTemperatureControl(); + controlMode = TemperaControlMode.kAutoChangeFromAppSetting; + targetTemperature = 0; + startTemperatureControlInternal(); + } + + public void startTemperatureControl(Integer tem) throws AppException { + stopTemperatureControl(); + controlMode = TemperaControlMode.kFixTemperature; + targetTemperature = tem; + startTemperatureControlInternal(); + } + + + public void startTemperatureControlInternal() throws AppException { if (virtualDevice.isEnable()) { return; } @@ -41,9 +62,12 @@ public class TemperatureCtrlService { return; } - AppSetting setting = appSettingsMgrService.getAppSettings(); - temperature = setting.getTemperature(); - temperatureControlDriver.startCtrlTemperature(temperature.doubleValue()); + if (controlMode.equals(TemperaControlMode.kAutoChangeFromAppSetting)) { + AppSetting setting = appSettingsMgrService.getAppSettings(); + targetTemperature = setting.getTemperature(); + } + temperatureControlDriver.startCtrlTemperature(targetTemperature.doubleValue()); + /* * 启动线程,定时检查温度设定值,如果发生变化则调用温度控制器 @@ -53,10 +77,12 @@ public class TemperatureCtrlService { try { Thread.sleep(1000); - Integer targetTemperature = appSettingsMgrService.getAppSettings().getTemperature(); - if (!targetTemperature.equals(temperature)) { - temperature = targetTemperature; - temperatureControlDriver.startCtrlTemperature(temperature.doubleValue()); + if (controlMode.equals(TemperaControlMode.kAutoChangeFromAppSetting)) { + Integer settingTem = appSettingsMgrService.getAppSettings().getTemperature(); + if (!targetTemperature.equals(settingTem)) { + targetTemperature = settingTem; + temperatureControlDriver.startCtrlTemperature(targetTemperature.doubleValue()); + } } } catch (InterruptedException e) { 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 3d614cf..32aee5b 100644 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/HbotCtrlService.java @@ -62,6 +62,16 @@ public class HbotCtrlService { checker.checkTakeTip((pipetteCtrlDriver.isHasTip())); } + public Boolean takeTipNoCheck(TipGroup tipGroup, Integer index) throws AppException { + log.info("takeTipNoCheck groupId:{} index:{}", tipGroup.ordinal(), index); + checkTipIndex(tipGroup, index); + + Pos3d tipPos = hbotConsumableParamMgr.getTipPos(tipGroup, index); + hbotBaseMoveExDriver.hbotMoveTo(tipPos); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + return pipetteCtrlDriver.isHasTip(); + } + public void takeTip(TipPos pos) throws AppException { Assert.isTrue(pos != null, "TipPos is null"); takeTip(pos.group, pos.index); diff --git a/src/main/java/a8k/service/test/A8kOptTest.java b/src/main/java/a8k/service/test/A8kOptTest.java deleted file mode 100644 index a6793f2..0000000 --- a/src/main/java/a8k/service/test/A8kOptTest.java +++ /dev/null @@ -1,154 +0,0 @@ -package a8k.service.test; - -import a8k.a8kproj.optalgo.type.OptScanResult; -import a8k.extapi.utils.ExtApiFn; -import a8k.extapi.utils.ExtApiTab; -import a8k.service.app.appdata.FileMgrService; -import a8k.service.app.appdata.ProjInfoMgrService; -import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; -import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; -import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; -import a8k.type.A8kScanCurve; -import a8k.type.ConsumableGroup; -import a8k.type.IncubatorPos; -import a8k.type.exception.AppException; -import a8k.utils.ProjBuildinInfo; -import a8k.utils.ZList; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - - -/** - * - * - */ -@ExtApiTab() -@Component -public class A8kOptTest { - - Integer actionOvertime = 5000; - - @Resource - OptModuleExtParamsMgr optModuleExtParamsMgr; - - @Resource - MotorEnableExDriver motorEnableExDriver; - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - @Resource - PlateBoxCtrlService plateBoxCtrlService; - @Resource - OptScanModuleCtrlService optScanModuleCtrlService; - - - @Resource - ProjInfoMgrService projInfoMgrService; - @Resource - FileMgrService fileMgrService; - - @ExtApiFn(name = "归零", group = "测试工具", order = 11) - public void deviceReset() throws AppException { - motorEnableExDriver.enableAllMotor(); - - //板夹仓初始化 - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM, actionOvertime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, actionOvertime); - //光学模组初始化 - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM, actionOvertime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM, actionOvertime); - //转盘归零 - stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, actionOvertime); - } - - /** - * From: 0号仓 - * TrunablePos:0号仓到 - */ - @ExtApiFn(name = "推板到光学模组", group = "测试工具", order = 100) - public void pushOnePlateToOptModule() throws AppException { - //先清空当前通道 - optScanModuleCtrlService.dropPlate(); - optScanModuleCtrlService.pullPlate(IncubatorPos.SPACE01); - optScanModuleCtrlService.dropPlate(); - - //推板到光学模组 - plateBoxCtrlService.pushPlateQuick(ConsumableGroup.GROUP0, IncubatorPos.SPACE01); - optScanModuleCtrlService.pullPlate(IncubatorPos.SPACE01); - } - - @ExtApiFn(name = "丢板", group = "测试工具", order = 101) - public void dropPlate() throws AppException { - optScanModuleCtrlService.dropPlate(); - } - - - A8kScanCurve createScanCurve1200Point(Integer[] optScanResult) { - List refCurve = new ArrayList<>(); - for (int i = 1; i < 6; i++) { - refCurve.add((int) (40 * 4.8 * i)); - } - - var result = new A8kScanCurve(); - result.refCurve = refCurve; - result.scanDataCurve = ZList.of(optScanResult); - return result; - } - - // - // 生成报告 - // - - static class OptScanReport { - public A8kScanCurve optScanCurve; - public String optReportFileName; - } - - List optScanReports = new ArrayList<>(); - - public void generateOptReport(ProjBuildinInfo info, Integer subProjIndex, OptScanResult optScanResult) throws IOException { - OptScanReport report = new OptScanReport(); - report.optScanCurve = createScanCurve1200Point(optScanResult.rawData.rawData); - report.optReportFileName = fileMgrService.storageOptReport(info.projBaseInfo.projName, info.projBaseInfo.projId, subProjIndex, optScanResult); - optScanReports.add(report); - } - - @ExtApiFn(name = "光学扫描", group = "光学测试", order = 200) - public String doOptScan(Integer projId) throws AppException, IOException { - fileMgrService.clearOptReport(); - optScanReports.clear(); - - ProjBuildinInfo info = projInfoMgrService.getProjBuildInInfo(projId); - for (int i = 0; i < info.projOptInfos.size(); i++) { - OptScanResult scanResult = optScanModuleCtrlService.optScan(info.projBaseInfo, info.projOptInfos.get(i), i); - generateOptReport(info, i, scanResult); - } - return "扫描完成"; - } - - @ExtApiFn(name = "获取光学扫描曲线", group = "光学测试", order = 201) - public A8kScanCurve getScanCurve(Integer subProjIndex) { - if (subProjIndex < optScanReports.size()) { - return optScanReports.get(subProjIndex).optScanCurve; - } - return null; - } - - @ExtApiFn(name = "获取光学报告", group = "光学测试", order = 202) - public String getOptReport(Integer subProjIndex) { - return "http://127.0.0.1/filemgr/index.html"; - } - - @ExtApiFn(name = "读取项目信息", group = "光学测试", order = 203) - public ProjBuildinInfo getProjInfo(Integer projId) throws AppException { - return projInfoMgrService.getProjBuildInInfo(projId); - } - - -} diff --git a/src/main/java/a8k/service/verification/A8kOptVerification.java b/src/main/java/a8k/service/verification/A8kOptVerification.java new file mode 100644 index 0000000..6e54473 --- /dev/null +++ b/src/main/java/a8k/service/verification/A8kOptVerification.java @@ -0,0 +1,154 @@ +package a8k.service.verification; + +import a8k.a8kproj.optalgo.type.OptScanResult; +import a8k.extapi.utils.ExtApiFn; +import a8k.extapi.utils.ExtApiTab; +import a8k.service.app.appdata.FileMgrService; +import a8k.service.app.appdata.ProjInfoMgrService; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; +import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; +import a8k.type.A8kScanCurve; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import a8k.utils.ProjBuildinInfo; +import a8k.utils.ZList; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +/** + * + * + */ +@ExtApiTab() +@Component +public class A8kOptVerification { + + Integer actionOvertime = 5000; + + @Resource + OptModuleExtParamsMgr optModuleExtParamsMgr; + + @Resource + MotorEnableExDriver motorEnableExDriver; + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + PlateBoxCtrlService plateBoxCtrlService; + @Resource + OptScanModuleCtrlService optScanModuleCtrlService; + + + @Resource + ProjInfoMgrService projInfoMgrService; + @Resource + FileMgrService fileMgrService; + + @ExtApiFn(name = "归零", group = "测试工具", order = 11) + public void deviceReset() throws AppException { + motorEnableExDriver.enableAllMotor(); + + //板夹仓初始化 + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM, actionOvertime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, actionOvertime); + //光学模组初始化 + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM, actionOvertime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM, actionOvertime); + //转盘归零 + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, actionOvertime); + } + + /** + * From: 0号仓 + * TrunablePos:0号仓到 + */ + @ExtApiFn(name = "推板到光学模组", group = "测试工具", order = 100) + public void pushOnePlateToOptModule() throws AppException { + //先清空当前通道 + optScanModuleCtrlService.dropPlate(); + optScanModuleCtrlService.pullPlate(IncubatorPos.SPACE01); + optScanModuleCtrlService.dropPlate(); + + //推板到光学模组 + plateBoxCtrlService.pushPlateQuick(ConsumableGroup.GROUP0, IncubatorPos.SPACE01); + optScanModuleCtrlService.pullPlate(IncubatorPos.SPACE01); + } + + @ExtApiFn(name = "丢板", group = "测试工具", order = 101) + public void dropPlate() throws AppException { + optScanModuleCtrlService.dropPlate(); + } + + + A8kScanCurve createScanCurve1200Point(Integer[] optScanResult) { + List refCurve = new ArrayList<>(); + for (int i = 1; i < 6; i++) { + refCurve.add((int) (40 * 4.8 * i)); + } + + var result = new A8kScanCurve(); + result.refCurve = refCurve; + result.scanDataCurve = ZList.of(optScanResult); + return result; + } + + // + // 生成报告 + // + + static class OptScanReport { + public A8kScanCurve optScanCurve; + public String optReportFileName; + } + + List optScanReports = new ArrayList<>(); + + public void generateOptReport(ProjBuildinInfo info, Integer subProjIndex, OptScanResult optScanResult) throws IOException { + OptScanReport report = new OptScanReport(); + report.optScanCurve = createScanCurve1200Point(optScanResult.rawData.rawData); + report.optReportFileName = fileMgrService.storageOptReport(info.projBaseInfo.projName, info.projBaseInfo.projId, subProjIndex, optScanResult); + optScanReports.add(report); + } + + @ExtApiFn(name = "光学扫描", group = "光学测试", order = 200) + public String doOptScan(Integer projId) throws AppException, IOException { + fileMgrService.clearOptReport(); + optScanReports.clear(); + + ProjBuildinInfo info = projInfoMgrService.getProjBuildInInfo(projId); + for (int i = 0; i < info.projOptInfos.size(); i++) { + OptScanResult scanResult = optScanModuleCtrlService.optScan(info.projBaseInfo, info.projOptInfos.get(i), i); + generateOptReport(info, i, scanResult); + } + return "扫描完成"; + } + + @ExtApiFn(name = "获取光学扫描曲线", group = "光学测试", order = 201) + public A8kScanCurve getScanCurve(Integer subProjIndex) { + if (subProjIndex < optScanReports.size()) { + return optScanReports.get(subProjIndex).optScanCurve; + } + return null; + } + + @ExtApiFn(name = "获取光学报告", group = "光学测试", order = 202) + public String getOptReport(Integer subProjIndex) { + return "http://127.0.0.1/optfilemgr/"; + } + + @ExtApiFn(name = "读取项目信息", group = "光学测试", order = 203) + public ProjBuildinInfo getProjInfo(Integer projId) throws AppException { + return projInfoMgrService.getProjBuildInInfo(projId); + } + + +} diff --git a/src/main/java/a8k/service/verification/A8kTemperaturaVerfication.java b/src/main/java/a8k/service/verification/A8kTemperaturaVerfication.java new file mode 100644 index 0000000..f3ebcbe --- /dev/null +++ b/src/main/java/a8k/service/verification/A8kTemperaturaVerfication.java @@ -0,0 +1,70 @@ +package a8k.service.verification; + +import a8k.a8kproj.optalgo.type.OptScanResult; +import a8k.extapi.utils.ExtApiFn; +import a8k.extapi.utils.ExtApiStatu; +import a8k.extapi.utils.ExtApiTab; +import a8k.service.app.appdata.FileMgrService; +import a8k.service.app.appdata.ProjIdCardInfoMgrService; +import a8k.service.app.appdata.ProjInfoMgrService; +import a8k.service.app.background.SensorDataUpdateService; +import a8k.service.app.background.TemperatureCtrlService; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; +import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.TemperatureControlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; +import a8k.type.A8kScanCurve; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import a8k.utils.ProjBuildinInfo; +import a8k.utils.ZList; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +/** + * + * + */ +@ExtApiTab() +@Component +public class A8kTemperaturaVerfication { + + @Resource + TemperatureCtrlService temperatureCtrlService; + + @Resource + TemperatureControlDriver temperatureControlDriver; + + + @ExtApiFn(name = "启动温度控制", group = "温度控制", order = 1) + synchronized public void startCtrl(Integer targetTemperature) throws AppException { + temperatureCtrlService.startTemperatureControl(targetTemperature); + } + + @ExtApiFn(name = "停止温度控制", group = "温度控制", order = 2) + synchronized public void stopCtrl() throws AppException { + temperatureCtrlService.stopTemperatureControl(); + } + + @ExtApiStatu(name = "孵育盘温度", group = "", order = 3) + public Double readIncubateBoxTemperature() throws AppException { + Double incubateBoxTemp = temperatureControlDriver.readIncubateBoxTemperature(); + return (incubateBoxTemp); + } + + @ExtApiStatu(name = "板夹仓温度", group = "", order = 4) + public Double readPlateBoxTemperature() throws AppException { + Double pbtemp = temperatureControlDriver.readPlateBoxTemperature(); + return pbtemp ; + } + +} diff --git a/src/main/java/a8k/service/verification/A8kVerificationUtils.java b/src/main/java/a8k/service/verification/A8kVerificationUtils.java new file mode 100644 index 0000000..63994d8 --- /dev/null +++ b/src/main/java/a8k/service/verification/A8kVerificationUtils.java @@ -0,0 +1,52 @@ +package a8k.service.verification; + +import a8k.a8kproj.optalgo.type.OptScanResult; +import a8k.controler.api.v1.app.ctrl.DeviceInit; +import a8k.extapi.utils.ExtApiFn; +import a8k.extapi.utils.ExtApiTab; +import a8k.service.app.appdata.FileMgrService; +import a8k.service.app.appdata.ProjInfoMgrService; +import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; +import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.param.param_mgr.OptModuleExtParamsMgr; +import a8k.type.A8kScanCurve; +import a8k.type.ConsumableGroup; +import a8k.type.IncubatorPos; +import a8k.type.checkpoint.CheckResult; +import a8k.type.exception.AppException; +import a8k.utils.ProjBuildinInfo; +import a8k.utils.ZList; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +/** + * + * + */ +@ExtApiTab() +@Component +public class A8kVerificationUtils { + + @Resource + DeviceInitCtrlService deviceInitializationModule; + + @ExtApiFn(name = "初始化设备", group = "测试工具", order = 11) + public List initDevice() throws AppException { + List checkResult = deviceInitializationModule.deviceMoveToZero(); + for (CheckResult result : checkResult) { + if (!result.pass) { + return checkResult; + } + } + return checkResult; + } +} diff --git a/src/main/java/a8k/service/verification/PipetteGunVerificationV2.java b/src/main/java/a8k/service/verification/PipetteGunVerificationV2.java new file mode 100644 index 0000000..d70a917 --- /dev/null +++ b/src/main/java/a8k/service/verification/PipetteGunVerificationV2.java @@ -0,0 +1,202 @@ +package a8k.service.verification; + +import a8k.constant.AppConstant; +import a8k.extapi.utils.ExtApiFn; +import a8k.extapi.utils.ExtApiStatu; +import a8k.extapi.utils.ExtApiTab; +import a8k.hardware.type.LldType; +import a8k.service.app.devicectrl.ctrlservice.DeviceInitCtrlService; +import a8k.service.app.devicectrl.ctrlservice.HbotCtrlService; +import a8k.service.app.devicectrl.driver.HbotDriver; +import a8k.service.app.devicectrl.driver.PipetteCtrlDriver; +import a8k.service.app.devicectrl.driver.type.PipetteRegIndex; +import a8k.service.app.devicectrl.exdriver.HbotBaseMoveExDriver; +import a8k.service.app.devicectrl.exdriver.MotorEnableExDriver; +import a8k.service.app.devicectrl.param.ext_param_mgr.HbotConsumableParamMgr; +import a8k.service.app.devicectrl.param.ext_param_mgr.PipetteGunParamExMgr; +import a8k.service.app.devicectrl.param.param_mgr.*; +import a8k.service.app.devicectrl.param.param_mgr.base.ParamMgr; +import a8k.service.dao.type.Parameter; +import a8k.type.ConsumableGroup; +import a8k.type.cfg.Pos3d; +import a8k.type.checkpoint.CheckResult; +import a8k.type.exception.AppException; +import a8k.type.pos.TipPos; +import a8k.type.type.TipGroup; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +@ExtApiTab() +@Component +@Slf4j +public class PipetteGunVerificationV2 { + @Resource + HbotFixedPosParamMgr hbotFixedPosParamMgr; + @Resource + HbotSamplePosParamMgr hbotSamplePosParamMgr; + @Resource + HbotConsumableParamMgr hbotConsumableParamMgr; + @Resource + HbotTipPosMgr hbotTipPosMgr; + @Resource + PipetteGunLLDParamMgr pipetteGunLLDParamMgr; + @Resource + PipetteGunLLFParamMgr pipetteGunLLFParamMgr; + @Resource + HbotLargeBottleBSPosMgr hbotLargeBottleBSPosMgr; + + @Resource + PipetteCtrlDriver pipetteCtrlDriver; + @Resource + HbotBaseMoveExDriver hbotBaseMoveExDriver; + @Resource + HbotDriver hbotDriver; + @Resource + HbotCtrlService hbotCtrlService; + @Resource + PipetteGunParamExMgr pipetteGunParamExMgr; + + + @Resource + DeviceInitCtrlService deviceInitializationModule; + + Integer tipNum = 0; + Integer loadUl = 0; + Integer lldpThreshold = 20; + + @PostConstruct + void initialize() { + + } + + + @ExtApiFn(name = "初始化设备", group = "测试准备工作", order = 11) + public List initDevice() throws AppException { + List checkResult = deviceInitializationModule.deviceMoveToZero(); + for (CheckResult result : checkResult) { + if (!result.pass) { + return checkResult; + } + } + return checkResult; + } + + @ExtApiFn(name = "加载tip头", group = "测试准备工作", order = 12) + public void loadTip() throws AppException { + tipNum = AppConstant.TIP_NUM; + } + + + @ExtApiFn(name = "设置吸液量", group = "测试准备工作", order = 13) + public void setLoadUl(Integer loadUl) { + this.loadUl = loadUl; + } + + @ExtApiFn(name = "设置LLD P阈值(建议20)", group = "测试准备工作", order = 14) + public void setLldpThreshold(Integer lldpThreshold) { + this.lldpThreshold = lldpThreshold; + } + + Boolean takeOneTip() throws AppException { + hbotBaseMoveExDriver.hbotMoveTo(hbotTipPosMgr.getDropTipPos()); + pipetteCtrlDriver.pipetteInitDeviceBlock(); + pipetteCtrlDriver.lldPrepareBlock(); + TipPos tipPos = new TipPos(); + tipPos.group = TipGroup.GROUP0; + if (tipNum == 0) { + throw AppException.ofAECodeError("Tip已经用完"); + } + tipPos.index = AppConstant.TIP_NUM - tipNum; + tipNum--; + log.info(" 取TIP {}", tipPos); + return hbotCtrlService.takeTipNoCheck(tipPos.group, tipPos.index);//取tip + } + + + @ExtApiFn(name = "吸取并释放一次", group = "测试", order = 21) + public void aspirateAndDistruptOnce() throws AppException { + if (loadUl == 0) { + throw AppException.ofAECodeError("吸液量为0"); + } + + // + // param + // + + Integer startZPos = hbotConsumableParamMgr.getLargeBufferSamplePos(ConsumableGroup.GROUP0).z; + Integer endZPos = hbotConsumableParamMgr.getLargeBufferSamplePosEnd(ConsumableGroup.GROUP0).z; + Integer llfv = pipetteGunLLFParamMgr.getLargeBSBottleLlfVel(); + + // + //1. Init pipette gun and take tip + //2. lld prepare + // + + if (!pipetteCtrlDriver.isHasTip()) { + while (true) { + if (takeOneTip()) { + break; + } + } + } else { + pipetteCtrlDriver.lldPrepareBlock(); + } + + + // + // lld + // + hbotCtrlService.moveToLargeBSSamplePos(ConsumableGroup.GROUP0); + pipetteCtrlDriver.setStartZ(startZPos); + pipetteCtrlDriver.setEndZ(endZPos); + pipetteCtrlDriver.setLldType(LldType.kplld); + pipetteCtrlDriver.setLldCThreshold(15); + pipetteCtrlDriver.setLldPThreshold(lldpThreshold); + pipetteCtrlDriver.lldBlock(); + + if (!pipetteCtrlDriver.lldIsDetectLiquid()) { + throw AppException.ofAECodeError("没有液体"); + } + + + // + // aspirate + // + pipetteCtrlDriver.setLlfStartZ(pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos)); + pipetteCtrlDriver.setLlfStartZ(endZPos); + pipetteCtrlDriver.aspirateSetLlfVelocity(llfv); + pipetteCtrlDriver.aspiratePrepareBlock(); + pipetteCtrlDriver.aspirateBlock(loadUl); + pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock(); + + // + // move to distrube pos + // + hbotCtrlService.moveToLargeBSSamplePos(ConsumableGroup.GROUP1); + pipetteCtrlDriver.aspirateBlock(-loadUl); + pipetteCtrlDriver.clearHangingLiquid(3); + + hbotCtrlService.moveQuickToZero(); + } + + + @ExtApiStatu(name = "val", group = "tipNum", order = 100) + public Integer readTipNum() throws AppException { + return tipNum; + } + + @ExtApiStatu(name = "val", group = "loadUl", order = 101) + public Integer readLoadUl() throws AppException { + return loadUl; + } + + @ExtApiStatu(name = "val", group = "lldpThreshold", order = 102) + public Integer readLldpThreshold() throws AppException { + return lldpThreshold; + } + +}