diff --git a/src/main/java/a8k/app/hardware/type/a8kcanprotocol/A8kEcode.java b/src/main/java/a8k/app/hardware/type/a8kcanprotocol/A8kEcode.java index fb156f9..b0996d8 100644 --- a/src/main/java/a8k/app/hardware/type/a8kcanprotocol/A8kEcode.java +++ b/src/main/java/a8k/app/hardware/type/a8kcanprotocol/A8kEcode.java @@ -20,6 +20,7 @@ public enum A8kEcode { // 代码错误,代码没有BUG的情况下,前端直接打印错误信息和栈信息即可 // CODEERROR(10), //代码错误 + ERROR_WORK_MODE(11), //工作模式错误 // // 参数错误 // diff --git a/src/main/java/a8k/app/service/background/BackgroudProcessCtrlService.java b/src/main/java/a8k/app/service/background/BackgroudProcessCtrlService.java index 1f6c9a8..e785cd0 100644 --- a/src/main/java/a8k/app/service/background/BackgroudProcessCtrlService.java +++ b/src/main/java/a8k/app/service/background/BackgroudProcessCtrlService.java @@ -1,6 +1,5 @@ package a8k.app.service.background; -import a8k.teststate.VirtualDevice; import a8k.app.a8ktype.exception.AppException; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; @@ -8,9 +7,6 @@ import org.springframework.stereotype.Component; @Component public class BackgroudProcessCtrlService { @Resource - VirtualDevice virtualDevice; - - @Resource TemperatureCtrlService temperatureCtrlService; @Resource SensorDataUpdateService sensorDataUpdateService; diff --git a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java index a12d7c2..c93b1d9 100644 --- a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java +++ b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java @@ -43,6 +43,10 @@ public class TemperatureCtrlService { return targetTemperature; } + /** + * 控制温度,当APP配置发生变化时,自动调整温度 + * @throws AppException 温度控制异常 + */ public void startTemperatureControl() throws AppException { stopTemperatureControl(); controlMode = TemperaControlMode.kAutoChangeFromAppSetting; @@ -50,7 +54,12 @@ public class TemperatureCtrlService { startTemperatureControlInternal(); } - public void startTemperatureControl(Integer tem) throws AppException { + /** + * 控制温度,根据设定值控制温度 + * @param tem 设定温度 + * @throws AppException 温度控制异常 + */ + public void startFixTemperatureControl(Integer tem) throws AppException { stopTemperatureControl(); controlMode = TemperaControlMode.kFixTemperature; targetTemperature = tem; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java index f357c31..029c91f 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -2,6 +2,7 @@ package a8k.app.service.mainctrl.mainflowctrl; import a8k.OS; import a8k.SpringBootBeanUtil; +import a8k.app.a8ktype.DeviceRunMode; import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; import a8k.app.service.mainctrl.mainflowctrl.base.*; import a8k.app.service.statemgr.DeviceWorkStateMgrService; @@ -12,6 +13,7 @@ import a8k.app.a8ktype.appevent.A8kEcodeContextListPromptEvent; import a8k.app.a8ktype.error.AECodeError; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; +import a8k.app.service.statemgr.GStateMgrService; import a8k.app.utils.ZList; import a8k.app.utils.ZStringUtils; import jakarta.annotation.Resource; @@ -38,6 +40,8 @@ public class MainFlowCtrlScheduler implements ApplicationListener initDevice() throws AppException { - List checkResult = deviceInitializationModule.initDevice(); - for (CheckResult result : checkResult) { - if (!result.pass) { - return checkResult; - } - } - return checkResult; - } -} diff --git a/src/main/java/a8k/extui/page/verification/P01PipetteGunVerification.java b/src/main/java/a8k/extui/page/verification/P01PipetteGunVerification.java index d12189f..4804854 100644 --- a/src/main/java/a8k/extui/page/verification/P01PipetteGunVerification.java +++ b/src/main/java/a8k/extui/page/verification/P01PipetteGunVerification.java @@ -41,23 +41,25 @@ public class P01PipetteGunVerification { Integer tipNum = 0; Integer liquidPos = null; + Boolean stopFlag = false; @PostConstruct - void init() throws NoSuchMethodException { + void init() { ExtUIPageCfg page = new ExtUIPageCfg(this); page.newGroup("基础"); - page.addFunction("初始化设备", this::initDevice); + page.addFunction("测试准备", this::initTestMode); page.addFunction("停止测试", this::stopTest); - - page.newGroup("测试准备工作"); - page.addFunction("校准系数(realul:实际体积)", this::calibration); - - page.newGroup("测试"); + page.addFunction("设置校准系数", this::calibration) + .setParamVal("coefficientA", () -> pipetteGunExParamMgr.getCoefficientA()) + .setParamVal("coefficientB", () -> pipetteGunExParamMgr.getCoefficientB()); + page.newGroup("测试0"); page.addFunction("取一次10ul", this::aspirate10ul); page.addFunction("取一次75ul", this::aspirate75ul); + page.newGroup("测试1"); page.addFunction("取一次5ul", this::aspirate5ul); page.addFunction("取一次30ul", this::aspirate30ul); page.addFunction("取一次50ul", this::aspirate50ul); + page.addFunction("停止测试", this::stopTest); extApiPageMgr.addPage(page); } @@ -66,7 +68,7 @@ public class P01PipetteGunVerification { pipetteCtrlDriver.pipetteInitDeviceBlock(); } - public void initDevice() throws AppException { + public void initTestMode() throws AppException { pipetteCtrlDriver.zMotorEnable(1); hbotMoveCtrlService.enable(1); pipetteCtrlDriver.zMotorMoveZeroBlock(); @@ -82,18 +84,20 @@ public class P01PipetteGunVerification { hbotMoveCtrlService.enable(0); } - public void calibration(Double coefficientK, Double coefficientB) { - pipetteGunExParamMgr.setVolumeCalibrationCoefficient(coefficientK, coefficientB); + public void calibration(Double coefficientA, Double coefficientB) { + pipetteGunExParamMgr.setVolumeCalibrationCoefficient(coefficientA, coefficientB); } + Boolean takeOneTip() throws AppException { hbotMoveCtrlService.hbotMoveTo(hbotTipPosMgr.getDropTipPos()); pipetteGunInit(); TipPos tipPos = new TipPos(); tipPos.group = TipGroup.TipG1; if (tipNum == 0) { - throw AppException.ofAECodeError("Tip已经用完"); + tipNum = 120; } + tipPos.index = AppConstant.TIP_NUM - tipNum; tipNum--; log.info(" 取TIP {}", tipPos); @@ -120,12 +124,14 @@ public class P01PipetteGunVerification { hbotMoveExCtrlService.moveToLargeBSSamplePosXY(ConsumableGroup.CG1); pipetteCtrlDriver.zMotorMoveToBlock(0); pumpMoveTo(8000, 0.0); - pumpMoveTo(8000, 50.0); + pumpMoveTo(300, 100.0); + pumpMoveTo(8000, 0.0); + pumpMoveTo(300, 50.0); pipetteCtrlDriver.liquidOperationClearParams(); pipetteCtrlDriver.liquidOperationSetGunRunParams(14, 14, 0, 900, 30); pipetteCtrlDriver.liquidOperationSetZMotorRunParams(0, 500, 60); pipetteCtrlDriver.liquidOperationFreshParams(); - pipetteCtrlDriver.pipetteLld(LldType.kplld, 0, 25); + pipetteCtrlDriver.pipetteLld(LldType.kplld, 0, 30); if (pipetteCtrlDriver.lldIsDetectLiquid()) { liquidPos = pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos); } diff --git a/src/main/java/a8k/extui/page/verification/P02A8kTemperaturaVerfication.java b/src/main/java/a8k/extui/page/verification/P02A8kTemperaturaVerfication.java index d398f81..f79a671 100644 --- a/src/main/java/a8k/extui/page/verification/P02A8kTemperaturaVerfication.java +++ b/src/main/java/a8k/extui/page/verification/P02A8kTemperaturaVerfication.java @@ -1,5 +1,8 @@ package a8k.extui.page.verification; +import a8k.app.a8ktype.param.TemperatureCtrlParam; +import a8k.app.service.background.BackgroudProcessCtrlService; +import a8k.app.service.param.TemperatureCtrlParamMgr; import a8k.extui.type.ret.ExtApiCurve; import a8k.extui.factory.CurveBuilder; import a8k.extui.type.ExtApiStatu; @@ -27,9 +30,13 @@ public class P02A8kTemperaturaVerfication { ExtApiPageMgr extApiPageMgr; @Resource - TemperatureCtrlService temperatureCtrlService; + TemperatureCtrlService temperatureCtrlService; @Resource - TemperatureControlDriver temperatureControlDriver; + TemperatureControlDriver temperatureControlDriver; + @Resource + TemperatureCtrlParamMgr temperatureCtrlParamMgr; + @Resource + BackgroudProcessCtrlService backgroudProcessCtrlService; List incubateBoxTemperatureCurve = new ArrayList<>(); @@ -41,10 +48,37 @@ public class P02A8kTemperaturaVerfication { Double plateBoxTemperatureCache = 0.0; Integer hasStartedTimeMS = 0; Double targetTemp; + Boolean workingFlag = false; + + + @ExtApiStatu(name = "", group = "孵育盘温度", order = 3) + public Double readIncubateBoxTemperature() throws AppException { + return (incubateBoxTemperatureCache); + } + + @ExtApiStatu(name = "", group = "板夹仓温度", order = 4) + public Double readPlateBoxTemperature() throws AppException { + return (plateBoxTemperatureCache); + } + + @ExtApiStatu(name = "", group = "状态", order = 5) + public String hasStartedTime() { + int S = hasStartedTimeMS / 1000; + return String.format("%s:%s:%s", (int) Math.floor((double) S / 3600), (int) Math.floor((double) (S % 3600) / 60), S % 60); + } + @PostConstruct public void init() throws NoSuchMethodException { var page = extApiPageMgr.newPage(this); + + page.newGroup("基础"); + page.addFunction("设置孵育盘温度偏移", this::setIncubatorBoxTemperatureOff) + .setParamVal("offset", temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.IncubatorTCMTempOffset)); + page.addFunction("设置板夹仓温度偏移", this::setPlatesBoxTCMTempOffset) + .setParamVal("offset", temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset)); + + page.newGroup("操作"); page.addFunction("启动温度控制", this::startCtrl); page.addFunction("停止温度控制", this::stopCtrl); page.addFunction("查看孵育盘温度曲线", this::showIncubateBoxTemperatureCurve); @@ -52,14 +86,31 @@ public class P02A8kTemperaturaVerfication { extApiPageMgr.addPage(page); } + public void setIncubatorBoxTemperatureOff(Double offset) throws AppException, InterruptedException { + temperatureCtrlParamMgr.setParam(TemperatureCtrlParam.IncubatorTCMTempOffset, offset); + if (workingFlag) { + startCtrl(targetTemp.intValue()); + } + } + + + public void setPlatesBoxTCMTempOffset(Double offset) throws AppException, InterruptedException { + temperatureCtrlParamMgr.setParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset, offset); + if (workingFlag) { + startCtrl(targetTemp.intValue()); + } + } + + synchronized public void startCtrl(Integer targetTemperature) throws AppException, InterruptedException { - temperatureCtrlService.startTemperatureControl(targetTemperature); + backgroudProcessCtrlService.stopProcess(); + + temperatureCtrlService.stopTemperatureControl(); + temperatureCtrlService.startFixTemperatureControl(targetTemperature); if (tempSampleThread != null) { tempSampleThread.interrupt(); tempSampleThread.join(); } - incubateBoxTemperatureCurve.clear(); - plateBoxTemperatureCurve.clear(); hasStartedTimeMS = 0; targetTemp = (double) targetTemperature; @@ -70,8 +121,8 @@ public class P02A8kTemperaturaVerfication { hasStartedTimeMS += 2000; incubateBoxTemperatureCache = temperatureControlDriver.readIncubateBoxTemperature(); plateBoxTemperatureCache = temperatureControlDriver.readPlateBoxTemperature(); - incubateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), incubateBoxTemperatureCache}); - plateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), plateBoxTemperatureCache}); + addIncubateBoxTemperatureCurve(incubateBoxTemperatureCache); + addPlateBoxTemperatureCurve(plateBoxTemperatureCache); } catch (InterruptedException ignored) { break; } catch (Exception e) { @@ -80,6 +131,7 @@ public class P02A8kTemperaturaVerfication { } }); tempSampleThread.start(); + workingFlag = true; } synchronized public void stopCtrl() throws AppException, InterruptedException { @@ -88,6 +140,7 @@ public class P02A8kTemperaturaVerfication { tempSampleThread.interrupt(); tempSampleThread.join(); } + workingFlag = false; } public ExtApiCurve showIncubateBoxTemperatureCurve() { @@ -98,19 +151,18 @@ public class P02A8kTemperaturaVerfication { return CurveBuilder.buidCurve("板夹仓温度曲线", "time", "value", targetTemp - 10, targetTemp + 10, plateBoxTemperatureCurve); } - @ExtApiStatu(name = "", group = "孵育盘温度", order = 3) - public Double readIncubateBoxTemperature() throws AppException { - return (incubateBoxTemperatureCache); - } - @ExtApiStatu(name = "", group = "板夹仓温度", order = 4) - public Double readPlateBoxTemperature() throws AppException { - return (plateBoxTemperatureCache); + private void addIncubateBoxTemperatureCurve(Double temperature) { + incubateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), temperature}); + if (incubateBoxTemperatureCurve.size() > 3000) { + incubateBoxTemperatureCurve.remove(0); + } } - @ExtApiStatu(name = "", group = "状态", order = 5) - public String hasStartedTime() { - int S = hasStartedTimeMS / 1000; - return String.format("%s:%s:%s", (int) Math.floor((double) S / 3600), (int) Math.floor((double) (S % 3600) / 60), S % 60); + private void addPlateBoxTemperatureCurve(Double temperature) { + plateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), temperature}); + if (plateBoxTemperatureCurve.size() > 3000) { + plateBoxTemperatureCurve.remove(0); + } } } diff --git a/src/main/java/a8k/extui/type/ExUIFunction.java b/src/main/java/a8k/extui/type/ExUIFunction.java index 0ec58db..00c0833 100644 --- a/src/main/java/a8k/extui/type/ExUIFunction.java +++ b/src/main/java/a8k/extui/type/ExUIFunction.java @@ -67,18 +67,21 @@ public class ExUIFunction { public ExUIFunction setParamVal(String paraName, Object defaultVal) { ExUIParam param = getParam(paraName); + Assert.notNull(param, String.format("Can't find param %s in function %s", paraName, keyName)); param.initValue = defaultVal; return this; } public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType1 getInitValFn) { ExUIParam param = getParam(paraName); + Assert.notNull(param, String.format("Can't find param %s in function %s", paraName, keyName)); param.getInitValFn1 = getInitValFn; return this; } public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType2 getInitValFn) { ExUIParam param = getParam(paraName); + Assert.notNull(param, String.format("Can't find param %s in function %s", paraName, keyName)); param.getInitValFn2 = getInitValFn; return this; }