Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
8f7fec96b0
  1. 1
      src/main/java/a8k/app/hardware/type/a8kcanprotocol/A8kEcode.java
  2. 4
      src/main/java/a8k/app/service/background/BackgroudProcessCtrlService.java
  3. 11
      src/main/java/a8k/app/service/background/TemperatureCtrlService.java
  4. 9
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java
  5. 8
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  6. 8
      src/main/java/a8k/app/service/param/PipetteGunExParamMgr.java
  7. 9
      src/main/java/a8k/app/service/statemgr/GStateMgrService.java
  8. 9
      src/main/java/a8k/app/utils/ZAppChecker.java
  9. 27
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  10. 85
      src/main/java/a8k/extui/page/pos_calibration/TemperatureCtrlParamCalibration.java
  11. 41
      src/main/java/a8k/extui/page/verification/P00A8kVerificationMainPage.java
  12. 32
      src/main/java/a8k/extui/page/verification/P01PipetteGunVerification.java
  13. 84
      src/main/java/a8k/extui/page/verification/P02A8kTemperaturaVerfication.java
  14. 3
      src/main/java/a8k/extui/type/ExUIFunction.java

1
src/main/java/a8k/app/hardware/type/a8kcanprotocol/A8kEcode.java

@ -20,6 +20,7 @@ public enum A8kEcode {
// 代码错误代码没有BUG的情况下前端直接打印错误信息和栈信息即可 // 代码错误代码没有BUG的情况下前端直接打印错误信息和栈信息即可
// //
CODEERROR(10), //代码错误 CODEERROR(10), //代码错误
ERROR_WORK_MODE(11), //工作模式错误
// //
// 参数错误 // 参数错误
// //

4
src/main/java/a8k/app/service/background/BackgroudProcessCtrlService.java

@ -1,6 +1,5 @@
package a8k.app.service.background; package a8k.app.service.background;
import a8k.teststate.VirtualDevice;
import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.exception.AppException;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -8,9 +7,6 @@ import org.springframework.stereotype.Component;
@Component @Component
public class BackgroudProcessCtrlService { public class BackgroudProcessCtrlService {
@Resource @Resource
VirtualDevice virtualDevice;
@Resource
TemperatureCtrlService temperatureCtrlService; TemperatureCtrlService temperatureCtrlService;
@Resource @Resource
SensorDataUpdateService sensorDataUpdateService; SensorDataUpdateService sensorDataUpdateService;

11
src/main/java/a8k/app/service/background/TemperatureCtrlService.java

@ -43,6 +43,10 @@ public class TemperatureCtrlService {
return targetTemperature; return targetTemperature;
} }
/**
* 控制温度当APP配置发生变化时自动调整温度
* @throws AppException 温度控制异常
*/
public void startTemperatureControl() throws AppException { public void startTemperatureControl() throws AppException {
stopTemperatureControl(); stopTemperatureControl();
controlMode = TemperaControlMode.kAutoChangeFromAppSetting; controlMode = TemperaControlMode.kAutoChangeFromAppSetting;
@ -50,7 +54,12 @@ public class TemperatureCtrlService {
startTemperatureControlInternal(); startTemperatureControlInternal();
} }
public void startTemperatureControl(Integer tem) throws AppException {
/**
* 控制温度根据设定值控制温度
* @param tem 设定温度
* @throws AppException 温度控制异常
*/
public void startFixTemperatureControl(Integer tem) throws AppException {
stopTemperatureControl(); stopTemperatureControl();
controlMode = TemperaControlMode.kFixTemperature; controlMode = TemperaControlMode.kFixTemperature;
targetTemperature = tem; targetTemperature = tem;

9
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.OS;
import a8k.SpringBootBeanUtil; import a8k.SpringBootBeanUtil;
import a8k.app.a8ktype.DeviceRunMode;
import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; import a8k.app.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.app.service.mainctrl.mainflowctrl.base.*; import a8k.app.service.mainctrl.mainflowctrl.base.*;
import a8k.app.service.statemgr.DeviceWorkStateMgrService; 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.AECodeError;
import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.exception.AppException;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.utils.ZList; import a8k.app.utils.ZList;
import a8k.app.utils.ZStringUtils; import a8k.app.utils.ZStringUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -38,6 +40,8 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
} }
@Resource @Resource
GStateMgrService gstate;
@Resource
DeviceWorkStateMgrService deviceWorkStateMgrService; DeviceWorkStateMgrService deviceWorkStateMgrService;
@Resource @Resource
AppEventBusService ebus; AppEventBusService ebus;
@ -91,6 +95,10 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
void checkBeforeCall() throws AppException { void checkBeforeCall() throws AppException {
if (!gstate.isInMode(DeviceRunMode.RealMode, DeviceRunMode.VirtualMode, DeviceRunMode.RunOnlyMode)) {
throw AppException.of(A8kEcode.ERROR_WORK_MODE);
}
if (deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag) { if (deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag) {
deviceWorkStateMgrService.clearPending(); deviceWorkStateMgrService.clearPending();
throw new AppException(A8kEcode.APPE_DEVICE_IS_IN_FATAL_ERROR); throw new AppException(A8kEcode.APPE_DEVICE_IS_IN_FATAL_ERROR);
@ -103,6 +111,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
} }
synchronized public void stopWork() throws AppException { synchronized public void stopWork() throws AppException {
checkBeforeCall(); checkBeforeCall();
deviceWorkStateMgrService.setStopActionPending(true); deviceWorkStateMgrService.setStopActionPending(true);
} }

8
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java

@ -88,10 +88,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
TubeHolderSetting tubeSetting; TubeHolderSetting tubeSetting;
public Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 public Boolean getTubeholderEnterPosPPS() { //入料通道是否为空
if (gstate.getDeviceRunMode().equals(DeviceRunMode.VirtualMode) || gstate.getDeviceRunMode().equals(DeviceRunMode.RunOnlyMode)) {
return stc.isVirtualTubeHolderReady();
}
if (gstate.getDeviceRunMode().equals(DeviceRunMode.RealMode)) {
try { try {
return canBus.getIOState(IOId.InfeedPPS); return canBus.getIOState(IOId.InfeedPPS);
} catch (Exception e) { } catch (Exception e) {
@ -100,6 +97,9 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
} }
} }
return stc.isVirtualTubeHolderReady();
}
public Boolean isReady() { public Boolean isReady() {
return tubeStateMgrService.isTubeHolderProcessCompleted() && getTubeholderEnterPosPPS(); return tubeStateMgrService.isTubeHolderProcessCompleted() && getTubeholderEnterPosPPS();
} }

8
src/main/java/a8k/app/service/param/PipetteGunExParamMgr.java

@ -40,4 +40,12 @@ public class PipetteGunExParamMgr extends ParamMgr {
Double B = getParam(PipetteGunParam.VOLUME_CALIBRATION_COEFFICIENT_B, Double.class); Double B = getParam(PipetteGunParam.VOLUME_CALIBRATION_COEFFICIENT_B, Double.class);
return A * rawVolume + B; return A * rawVolume + B;
} }
public double getCoefficientA() {
return getParam(PipetteGunParam.VOLUME_CALIBRATION_COEFFICIENT_A, Double.class);
}
public double getCoefficientB() {
return getParam(PipetteGunParam.VOLUME_CALIBRATION_COEFFICIENT_B, Double.class);
}
} }

9
src/main/java/a8k/app/service/statemgr/GStateMgrService.java

@ -38,5 +38,14 @@ public class GStateMgrService {
this.deviceInited = deviceInited; this.deviceInited = deviceInited;
} }
public synchronized Boolean isInMode(DeviceRunMode ...modes) {
for (DeviceRunMode mode : modes) {
if (deviceRunMode.equals(mode)) {
return true;
}
}
return false;
}
} }

9
src/main/java/a8k/app/utils/ZAppChecker.java

@ -23,14 +23,13 @@ public class ZAppChecker {
GStateMgrService gstate; GStateMgrService gstate;
public void checkTakeTip(Boolean takeTipOk) throws AppException { public void checkTakeTip(Boolean takeTipOk) throws AppException {
if (!takeTipOk) {
if (!gstate.getDeviceRunMode().equals(DeviceRunMode.RealMode)) {
log.info("take tip fail, but in no check mode, ignore it");
if (takeTipOk)
return; return;
}
if (gstate.getDeviceRunMode().equals(DeviceRunMode.RealMode)) {
throw ebuilder.buildAppException(A8kEcode.APPE_TAKE_TIP_FAIL); throw ebuilder.buildAppException(A8kEcode.APPE_TAKE_TIP_FAIL);
} }
return;
} }
static public void check(Boolean conditon, A8kEcode ecode, String fmt, Object... args) throws AppException { static public void check(Boolean conditon, A8kEcode ecode, String fmt, Object... args) throws AppException {

27
src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java

@ -11,6 +11,8 @@ import a8k.extui.page.frond_end_test.FakeReactionRecordGeneratorPage;
import a8k.extui.page.frond_end_test.VirtualEventGeneratorPage; import a8k.extui.page.frond_end_test.VirtualEventGeneratorPage;
import a8k.extui.page.opt_calibration.OptModuleParamCalibration; import a8k.extui.page.opt_calibration.OptModuleParamCalibration;
import a8k.extui.page.verification.P01PipetteGunVerification;
import a8k.extui.page.verification.P02A8kTemperaturaVerfication;
import a8k.extui.type.ExtUIPageCfg; import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@ -24,12 +26,13 @@ import java.util.List;
public class ExtApiPageGroupCfgMgr { public class ExtApiPageGroupCfgMgr {
public enum PageGroupType { public enum PageGroupType {
Public, Public,
VirtualModeOperation,
FrontEndDebugUtils,
PosCalibration,//位置标定 PosCalibration,//位置标定
OptCalibrationAndVerify,//光学校准和验证 OptCalibrationAndVerify,//光学校准和验证
actionOperation, actionOperation,
debug,// debug,//
driverDebug, driverDebug,
Verification,
} }
@Data @Data
@ -76,8 +79,8 @@ public class ExtApiPageGroupCfgMgr {
displayRefreshPage(PageGroupType.actionOperation); displayRefreshPage(PageGroupType.actionOperation);
} }
public void virtualModeOperationRefreshPage() {
displayRefreshPage(PageGroupType.VirtualModeOperation);
public void frontEndDebugUtilsRefreshPage() {
displayRefreshPage(PageGroupType.FrontEndDebugUtils);
} }
public void debugRefreshPage() { public void debugRefreshPage() {
@ -88,6 +91,10 @@ public class ExtApiPageGroupCfgMgr {
displayRefreshPage(PageGroupType.driverDebug); displayRefreshPage(PageGroupType.driverDebug);
} }
public void verificationRefreshPage() {
displayRefreshPage(PageGroupType.Verification);
}
@PostConstruct @PostConstruct
void init() { void init() {
@ -136,17 +143,19 @@ public class ExtApiPageGroupCfgMgr {
cfgList.add(new Config(PageGroupType.driverDebug, PipetteCtrlDriverPage.getPageClass(), "移液抢驱动")); cfgList.add(new Config(PageGroupType.driverDebug, PipetteCtrlDriverPage.getPageClass(), "移液抢驱动"));
page.addFunction("前端测试助手", this::frontEndDebugUtilsRefreshPage);
cfgList.add(new Config(PageGroupType.FrontEndDebugUtils, FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"));
cfgList.add(new Config(PageGroupType.FrontEndDebugUtils, VirtualEventGeneratorPage.class, "虚拟事件生成"));
page.addFunction("光学标定与验证", this::optOptCalibrationAndVerifyRefreshPage); page.addFunction("光学标定与验证", this::optOptCalibrationAndVerifyRefreshPage);
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptModuleParamCalibration.class, "光学模块参数校准")); cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptModuleParamCalibration.class, "光学模块参数校准"));
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, A8kOptVerification.class, "光学模组验证")); cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, A8kOptVerification.class, "光学模组验证"));
page.addFunction("前端测试助手", this::virtualModeOperationRefreshPage);
cfgList.add(new Config(PageGroupType.VirtualModeOperation, FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"));
cfgList.add(new Config(PageGroupType.VirtualModeOperation, VirtualEventGeneratorPage.class, "虚拟事件生成"));
//P00A8kVerificationMainPage
page.addFunction("验证(过检专用)", this::verificationRefreshPage);
cfgList.add(new Config(PageGroupType.Verification, P01PipetteGunVerification.class, "移液枪验证"));
cfgList.add(new Config(PageGroupType.Verification, P02A8kTemperaturaVerfication.class, "温度控制验证"));
displayRefreshPage(PageGroupType.Public); displayRefreshPage(PageGroupType.Public);

85
src/main/java/a8k/extui/page/pos_calibration/TemperatureCtrlParamCalibration.java

@ -1,85 +0,0 @@
package a8k.extui.page.pos_calibration;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.app.hardware.driver.TemperatureControlDriver;
import a8k.app.service.param.TemperatureCtrlParamMgr;
import a8k.app.a8ktype.param.TemperatureCtrlParam;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.utils.ZJsonHelper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TemperatureCtrlParamCalibration {
@Resource
TemperatureControlDriver temperatureControlDriver;
@Resource
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
public Object getPoss() throws AppException {
return temperatureCtrlParamMgr.getParams();
}
// 测试工具
public void setIncubatorBoxTemperatureOff(Double offset) throws AppException {
temperatureCtrlParamMgr.setParam(TemperatureCtrlParam.IncubatorTCMTempOffset, offset);
}
public void setPlatesBoxTCMTempOffset(Double offset) throws AppException {
temperatureCtrlParamMgr.setParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset, offset);
}
public void startControlTemperature(Double temperature) throws AppException {
temperatureControlDriver.startCtrlTemperature(temperature);
}
public void stopControlTemperature() throws AppException {
temperatureControlDriver.stopCtrlTemperature();
}
//测量工具
public Object readTemperature() throws AppException {
ObjectNode node = ZJsonHelper.createObjectNode();
node.put("IncubatorBoxTemperature", temperatureControlDriver.readIncubateBoxTemperature());
node.put("PlatesBoxTemperature", temperatureControlDriver.readPlateBoxTemperature());
return node;
}
@Resource
ExtApiPageMgr extApiPageMgr;
@PostConstruct
public void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("基础");
page.addFunction("获取所有参数", this::getPoss);
page.newGroup("温度控制");
page.addFunction("设置孵育盘温度偏差", this::setIncubatorBoxTemperatureOff);
page.addFunction("设置板夹仓温度偏差", this::setPlatesBoxTCMTempOffset);
page.addFunction("开始控制温度", this::startControlTemperature);
page.addFunction("停止控制温度", this::stopControlTemperature);
page.newGroup("传感状态");
page.addFunction("读取温度", this::readTemperature);
extApiPageMgr.addPage(page);
}
}

41
src/main/java/a8k/extui/page/verification/P00A8kVerificationMainPage.java

@ -1,41 +0,0 @@
package a8k.extui.page.verification;
import a8k.app.service.lowerctrl.DeviceInitCtrlService;
import a8k.app.a8ktype.others.checkpoint.CheckResult;
import a8k.app.a8ktype.exception.AppException;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class P00A8kVerificationMainPage {
@Resource
DeviceInitCtrlService deviceInitializationModule;
@Resource
ExtApiPageMgr extApiPageMgr;
@PostConstruct
void init() throws NoSuchMethodException {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.newGroup("测试工具");
page.addFunction("初始化设备", this::initDevice);
extApiPageMgr.addPage(page);
}
public List<CheckResult> initDevice() throws AppException {
List<CheckResult> checkResult = deviceInitializationModule.initDevice();
for (CheckResult result : checkResult) {
if (!result.pass) {
return checkResult;
}
}
return checkResult;
}
}

32
src/main/java/a8k/extui/page/verification/P01PipetteGunVerification.java

@ -41,23 +41,25 @@ public class P01PipetteGunVerification {
Integer tipNum = 0; Integer tipNum = 0;
Integer liquidPos = null; Integer liquidPos = null;
Boolean stopFlag = false;
@PostConstruct @PostConstruct
void init() throws NoSuchMethodException {
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(this); ExtUIPageCfg page = new ExtUIPageCfg(this);
page.newGroup("基础"); page.newGroup("基础");
page.addFunction("初始化设备", this::initDevice);
page.addFunction("测试准备", this::initTestMode);
page.addFunction("停止测试", this::stopTest); 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("取一次10ul", this::aspirate10ul);
page.addFunction("取一次75ul", this::aspirate75ul); page.addFunction("取一次75ul", this::aspirate75ul);
page.newGroup("测试1");
page.addFunction("取一次5ul", this::aspirate5ul); page.addFunction("取一次5ul", this::aspirate5ul);
page.addFunction("取一次30ul", this::aspirate30ul); page.addFunction("取一次30ul", this::aspirate30ul);
page.addFunction("取一次50ul", this::aspirate50ul); page.addFunction("取一次50ul", this::aspirate50ul);
page.addFunction("停止测试", this::stopTest);
extApiPageMgr.addPage(page); extApiPageMgr.addPage(page);
} }
@ -66,7 +68,7 @@ public class P01PipetteGunVerification {
pipetteCtrlDriver.pipetteInitDeviceBlock(); pipetteCtrlDriver.pipetteInitDeviceBlock();
} }
public void initDevice() throws AppException {
public void initTestMode() throws AppException {
pipetteCtrlDriver.zMotorEnable(1); pipetteCtrlDriver.zMotorEnable(1);
hbotMoveCtrlService.enable(1); hbotMoveCtrlService.enable(1);
pipetteCtrlDriver.zMotorMoveZeroBlock(); pipetteCtrlDriver.zMotorMoveZeroBlock();
@ -82,18 +84,20 @@ public class P01PipetteGunVerification {
hbotMoveCtrlService.enable(0); 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 { Boolean takeOneTip() throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbotTipPosMgr.getDropTipPos()); hbotMoveCtrlService.hbotMoveTo(hbotTipPosMgr.getDropTipPos());
pipetteGunInit(); pipetteGunInit();
TipPos tipPos = new TipPos(); TipPos tipPos = new TipPos();
tipPos.group = TipGroup.TipG1; tipPos.group = TipGroup.TipG1;
if (tipNum == 0) { if (tipNum == 0) {
throw AppException.ofAECodeError("Tip已经用完");
tipNum = 120;
} }
tipPos.index = AppConstant.TIP_NUM - tipNum; tipPos.index = AppConstant.TIP_NUM - tipNum;
tipNum--; tipNum--;
log.info(" 取TIP {}", tipPos); log.info(" 取TIP {}", tipPos);
@ -120,12 +124,14 @@ public class P01PipetteGunVerification {
hbotMoveExCtrlService.moveToLargeBSSamplePosXY(ConsumableGroup.CG1); hbotMoveExCtrlService.moveToLargeBSSamplePosXY(ConsumableGroup.CG1);
pipetteCtrlDriver.zMotorMoveToBlock(0); pipetteCtrlDriver.zMotorMoveToBlock(0);
pumpMoveTo(8000, 0.0); pumpMoveTo(8000, 0.0);
pumpMoveTo(8000, 50.0);
pumpMoveTo(300, 100.0);
pumpMoveTo(8000, 0.0);
pumpMoveTo(300, 50.0);
pipetteCtrlDriver.liquidOperationClearParams(); pipetteCtrlDriver.liquidOperationClearParams();
pipetteCtrlDriver.liquidOperationSetGunRunParams(14, 14, 0, 900, 30); pipetteCtrlDriver.liquidOperationSetGunRunParams(14, 14, 0, 900, 30);
pipetteCtrlDriver.liquidOperationSetZMotorRunParams(0, 500, 60); pipetteCtrlDriver.liquidOperationSetZMotorRunParams(0, 500, 60);
pipetteCtrlDriver.liquidOperationFreshParams(); pipetteCtrlDriver.liquidOperationFreshParams();
pipetteCtrlDriver.pipetteLld(LldType.kplld, 0, 25);
pipetteCtrlDriver.pipetteLld(LldType.kplld, 0, 30);
if (pipetteCtrlDriver.lldIsDetectLiquid()) { if (pipetteCtrlDriver.lldIsDetectLiquid()) {
liquidPos = pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos); liquidPos = pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos);
} }

84
src/main/java/a8k/extui/page/verification/P02A8kTemperaturaVerfication.java

@ -1,5 +1,8 @@
package a8k.extui.page.verification; 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.type.ret.ExtApiCurve;
import a8k.extui.factory.CurveBuilder; import a8k.extui.factory.CurveBuilder;
import a8k.extui.type.ExtApiStatu; import a8k.extui.type.ExtApiStatu;
@ -30,6 +33,10 @@ public class P02A8kTemperaturaVerfication {
TemperatureCtrlService temperatureCtrlService; TemperatureCtrlService temperatureCtrlService;
@Resource @Resource
TemperatureControlDriver temperatureControlDriver; TemperatureControlDriver temperatureControlDriver;
@Resource
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
@Resource
BackgroudProcessCtrlService backgroudProcessCtrlService;
List<Object[]> incubateBoxTemperatureCurve = new ArrayList<>(); List<Object[]> incubateBoxTemperatureCurve = new ArrayList<>();
@ -41,10 +48,37 @@ public class P02A8kTemperaturaVerfication {
Double plateBoxTemperatureCache = 0.0; Double plateBoxTemperatureCache = 0.0;
Integer hasStartedTimeMS = 0; Integer hasStartedTimeMS = 0;
Double targetTemp; 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 @PostConstruct
public void init() throws NoSuchMethodException { public void init() throws NoSuchMethodException {
var page = extApiPageMgr.newPage(this); 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::startCtrl);
page.addFunction("停止温度控制", this::stopCtrl); page.addFunction("停止温度控制", this::stopCtrl);
page.addFunction("查看孵育盘温度曲线", this::showIncubateBoxTemperatureCurve); page.addFunction("查看孵育盘温度曲线", this::showIncubateBoxTemperatureCurve);
@ -52,14 +86,31 @@ public class P02A8kTemperaturaVerfication {
extApiPageMgr.addPage(page); 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 { synchronized public void startCtrl(Integer targetTemperature) throws AppException, InterruptedException {
temperatureCtrlService.startTemperatureControl(targetTemperature);
backgroudProcessCtrlService.stopProcess();
temperatureCtrlService.stopTemperatureControl();
temperatureCtrlService.startFixTemperatureControl(targetTemperature);
if (tempSampleThread != null) { if (tempSampleThread != null) {
tempSampleThread.interrupt(); tempSampleThread.interrupt();
tempSampleThread.join(); tempSampleThread.join();
} }
incubateBoxTemperatureCurve.clear();
plateBoxTemperatureCurve.clear();
hasStartedTimeMS = 0; hasStartedTimeMS = 0;
targetTemp = (double) targetTemperature; targetTemp = (double) targetTemperature;
@ -70,8 +121,8 @@ public class P02A8kTemperaturaVerfication {
hasStartedTimeMS += 2000; hasStartedTimeMS += 2000;
incubateBoxTemperatureCache = temperatureControlDriver.readIncubateBoxTemperature(); incubateBoxTemperatureCache = temperatureControlDriver.readIncubateBoxTemperature();
plateBoxTemperatureCache = temperatureControlDriver.readPlateBoxTemperature(); plateBoxTemperatureCache = temperatureControlDriver.readPlateBoxTemperature();
incubateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), incubateBoxTemperatureCache});
plateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), plateBoxTemperatureCache});
addIncubateBoxTemperatureCurve(incubateBoxTemperatureCache);
addPlateBoxTemperatureCurve(plateBoxTemperatureCache);
} catch (InterruptedException ignored) { } catch (InterruptedException ignored) {
break; break;
} catch (Exception e) { } catch (Exception e) {
@ -80,6 +131,7 @@ public class P02A8kTemperaturaVerfication {
} }
}); });
tempSampleThread.start(); tempSampleThread.start();
workingFlag = true;
} }
synchronized public void stopCtrl() throws AppException, InterruptedException { synchronized public void stopCtrl() throws AppException, InterruptedException {
@ -88,6 +140,7 @@ public class P02A8kTemperaturaVerfication {
tempSampleThread.interrupt(); tempSampleThread.interrupt();
tempSampleThread.join(); tempSampleThread.join();
} }
workingFlag = false;
} }
public ExtApiCurve showIncubateBoxTemperatureCurve() { public ExtApiCurve showIncubateBoxTemperatureCurve() {
@ -98,19 +151,18 @@ public class P02A8kTemperaturaVerfication {
return CurveBuilder.buidCurve("板夹仓温度曲线", "time", "value", targetTemp - 10, targetTemp + 10, plateBoxTemperatureCurve); 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);
}
} }
} }

3
src/main/java/a8k/extui/type/ExUIFunction.java

@ -67,18 +67,21 @@ public class ExUIFunction {
public ExUIFunction setParamVal(String paraName, Object defaultVal) { public ExUIFunction setParamVal(String paraName, Object defaultVal) {
ExUIParam param = getParam(paraName); ExUIParam param = getParam(paraName);
Assert.notNull(param, String.format("Can't find param %s in function %s", paraName, keyName));
param.initValue = defaultVal; param.initValue = defaultVal;
return this; return this;
} }
public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType1 getInitValFn) { public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType1 getInitValFn) {
ExUIParam param = getParam(paraName); ExUIParam param = getParam(paraName);
Assert.notNull(param, String.format("Can't find param %s in function %s", paraName, keyName));
param.getInitValFn1 = getInitValFn; param.getInitValFn1 = getInitValFn;
return this; return this;
} }
public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType2 getInitValFn) { public ExUIFunction setParamVal(String paraName, ExUIParamGetInitValFnType2 getInitValFn) {
ExUIParam param = getParam(paraName); ExUIParam param = getParam(paraName);
Assert.notNull(param, String.format("Can't find param %s in function %s", paraName, keyName));
param.getInitValFn2 = getInitValFn; param.getInitValFn2 = getInitValFn;
return this; return this;
} }

Loading…
Cancel
Save