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的情况下前端直接打印错误信息和栈信息即可
//
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;
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;

11
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;

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.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<ApplicationSta
}
@Resource
GStateMgrService gstate;
@Resource
DeviceWorkStateMgrService deviceWorkStateMgrService;
@Resource
AppEventBusService ebus;
@ -91,6 +95,10 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
void checkBeforeCall() throws AppException {
if (!gstate.isInMode(DeviceRunMode.RealMode, DeviceRunMode.VirtualMode, DeviceRunMode.RunOnlyMode)) {
throw AppException.of(A8kEcode.ERROR_WORK_MODE);
}
if (deviceWorkStateMgrService.getDeviceWorkState().fatalErrorFlag) {
deviceWorkStateMgrService.clearPending();
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 {
checkBeforeCall();
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;
public Boolean getTubeholderEnterPosPPS() { //入料通道是否为空
if (gstate.getDeviceRunMode().equals(DeviceRunMode.VirtualMode) || gstate.getDeviceRunMode().equals(DeviceRunMode.RunOnlyMode)) {
return stc.isVirtualTubeHolderReady();
}
if (gstate.getDeviceRunMode().equals(DeviceRunMode.RealMode)) {
try {
return canBus.getIOState(IOId.InfeedPPS);
} catch (Exception e) {
@ -100,6 +97,9 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
}
}
return stc.isVirtualTubeHolderReady();
}
public Boolean isReady() {
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);
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;
}
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;
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;
}
if (gstate.getDeviceRunMode().equals(DeviceRunMode.RealMode)) {
throw ebuilder.buildAppException(A8kEcode.APPE_TAKE_TIP_FAIL);
}
return;
}
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.opt_calibration.OptModuleParamCalibration;
import a8k.extui.page.verification.P01PipetteGunVerification;
import a8k.extui.page.verification.P02A8kTemperaturaVerfication;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
@ -24,12 +26,13 @@ import java.util.List;
public class ExtApiPageGroupCfgMgr {
public enum PageGroupType {
Public,
VirtualModeOperation,
FrontEndDebugUtils,
PosCalibration,//位置标定
OptCalibrationAndVerify,//光学校准和验证
actionOperation,
debug,//
driverDebug,
Verification,
}
@Data
@ -76,8 +79,8 @@ public class ExtApiPageGroupCfgMgr {
displayRefreshPage(PageGroupType.actionOperation);
}
public void virtualModeOperationRefreshPage() {
displayRefreshPage(PageGroupType.VirtualModeOperation);
public void frontEndDebugUtilsRefreshPage() {
displayRefreshPage(PageGroupType.FrontEndDebugUtils);
}
public void debugRefreshPage() {
@ -88,6 +91,10 @@ public class ExtApiPageGroupCfgMgr {
displayRefreshPage(PageGroupType.driverDebug);
}
public void verificationRefreshPage() {
displayRefreshPage(PageGroupType.Verification);
}
@PostConstruct
void init() {
@ -136,17 +143,19 @@ public class ExtApiPageGroupCfgMgr {
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);
cfgList.add(new Config(PageGroupType.OptCalibrationAndVerify, OptModuleParamCalibration.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);

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 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);
}

84
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;
@ -30,6 +33,10 @@ public class P02A8kTemperaturaVerfication {
TemperatureCtrlService temperatureCtrlService;
@Resource
TemperatureControlDriver temperatureControlDriver;
@Resource
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
@Resource
BackgroudProcessCtrlService backgroudProcessCtrlService;
List<Object[]> 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);
}
}
}

3
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;
}

Loading…
Cancel
Save