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/verification/A8kOptVerification.java similarity index 97% rename from src/main/java/a8k/service/test/A8kOptTest.java rename to src/main/java/a8k/service/verification/A8kOptVerification.java index a6793f2..6e54473 100644 --- a/src/main/java/a8k/service/test/A8kOptTest.java +++ b/src/main/java/a8k/service/verification/A8kOptVerification.java @@ -1,4 +1,4 @@ -package a8k.service.test; +package a8k.service.verification; import a8k.a8kproj.optalgo.type.OptScanResult; import a8k.extapi.utils.ExtApiFn; @@ -31,7 +31,7 @@ import java.util.List; */ @ExtApiTab() @Component -public class A8kOptTest { +public class A8kOptVerification { Integer actionOvertime = 5000; @@ -142,7 +142,7 @@ public class A8kOptTest { @ExtApiFn(name = "获取光学报告", group = "光学测试", order = 202) public String getOptReport(Integer subProjIndex) { - return "http://127.0.0.1/filemgr/index.html"; + return "http://127.0.0.1/optfilemgr/"; } @ExtApiFn(name = "读取项目信息", group = "光学测试", order = 203) 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; + } + +}