Browse Source

拆分溫度,可单独配置孵育盘与板夹仓温度

master
白凤吉 3 months ago
parent
commit
a2cb1af6cd
  1. 20
      src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java
  2. 49
      src/main/java/a8k/app/dao/type/db/DeviceSetting.java
  3. 11
      src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java
  4. 224
      src/main/java/a8k/app/service/background/TemperatureCtrlService.java
  5. 9
      src/main/java/a8k/app/service/setting/AppSettingsMgrService.java
  6. 14
      src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java
  7. 11
      src/main/java/a8k/extui/page/debug/P20AppSettingDebugPage.java
  8. 295
      src/main/java/a8k/extui/page/extapp/P02A8kTemperaturaVerfication.java

20
src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java

@ -83,15 +83,21 @@ public class DeviceSettingControler {
return ApiRet.success();
}
@Operation(summary = "设置设备温度")
@PostMapping("/setTemperature")
public ApiRet<Void> setTemperature(Integer val) {
log.info("setTemperature:{}", val);
appSettingsMgrService.setTemperature(val);
@Operation(summary = "设置孵育盘温度")
@PostMapping("/setIncubateBoxTemperature")
public ApiRet<Void> setIncubateBoxTemperature(Integer val) {
log.info("setIncubateBoxTemperature:{}", val);
appSettingsMgrService.setIncubateBoxTemperature(val);
return ApiRet.success();
}
@Operation(summary = "设置板夹仓温度")
@PostMapping("/setPlateBoxTemperature")
public ApiRet<Void> setPlateBoxTemperature(Integer val) {
log.info("setPlateBoxTemperature:{}", val);
appSettingsMgrService.setPlateBoxTemperature(val);
return ApiRet.success();
}
@Operation(summary = "设置DHCP")
@PostMapping("/setDHCCP")
@ -110,7 +116,7 @@ public class DeviceSettingControler {
@Operation(summary = "获取温度范围")
@PostMapping("/getTemperatureAvailableRange")
public ApiRet<List<Integer>> getTemperatureAvailableRange() {
return ApiRet.success(ZList.of(25, 35));
return ApiRet.success(ZList.of(20, 40));
}

49
src/main/java/a8k/app/dao/type/db/DeviceSetting.java

@ -8,37 +8,42 @@ import lombok.Data;
@Data
public class DeviceSetting {
public enum LanguageType {
zh_CN, en_US
}
public enum LanguageType {
zh_CN, en_US
}
public int id = 0;
public int id = 0;
@Schema(description = "语言")
@NotNull
public LanguageType language = LanguageType.zh_CN;
@Schema(description = "语言")
@NotNull
public LanguageType language = LanguageType.zh_CN;
@Schema(description = "自动打印报告")
@NotNull
public Boolean autoPrint = false;
@Schema(description = "自动打印报告")
@NotNull
public Boolean autoPrint = false;
@Schema(description = "自动登出(Min)")
@NotNull
public Integer autoLogoutTimeout = 10;
@Schema(description = "自动登出(Min)")
@NotNull
public Integer autoLogoutTimeout = 10;
@Schema(description = "自动登出")
public Boolean autoLogout = false;
@Schema(description = "自动登出")
public Boolean autoLogout = false;
@Schema(description = "孵育盘温度")
@NotNull
@Min(20)
@Max(40)
public Integer incubateBoxTemperature = 25;
@Schema(description = "设备温度")
@NotNull
@Min(15)
@Max(35)
public Integer temperature = 25;
@Schema(description = "板夹仓温度")
@NotNull
@Min(20)
@Max(40)
public Integer plateBoxTemperature = 25;
public Boolean DHCP = true;
public Boolean DHCP = true;
public String localIp = "";
public String localIp = "";
}

11
src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java

@ -24,17 +24,16 @@ public class TemperatureControlDriver {
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
public void startCtrlTemperature(Double temperature) throws AppException {
public void startCtrlTemperature(Double incubatorTemperature,Double platesBoxTemperature) throws AppException {
incubatorTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.IncubatorTCMTempOffset);
platesBoxTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset);
Integer incubatorTCMSetTemp = (int) ((temperature + incubatorTCMTempOffset) * 10);
Integer platesBoxTCMSetTemp = (int) ((temperature + platesBoxTCMTempOffset) * 10);
Integer incubatorTCMSetTemp = (int) ((incubatorTemperature + incubatorTCMTempOffset) * 10);
Integer platesBoxTCMSetTemp = (int) ((platesBoxTemperature + platesBoxTCMTempOffset) * 10);
log.info("startCtrlTemperature {}", temperature);
log.info(" incubatorTCMSetTemp {}", incubatorTCMSetTemp);
log.info(" platesBoxTCMSetTemp {}", platesBoxTCMSetTemp);
log.info("startCtrlTemperature incubatorTCMSetTemp {}", incubatorTCMSetTemp);
log.info("startCtrlTemperature platesBoxTCMSetTemp {}", platesBoxTCMSetTemp);
canBus.callcmd(TemperatureControlerMid.IncubatorTCM.mid, CmdId.temp_controler_start_hearting, incubatorTCMSetTemp);
canBus.callcmd(TemperatureControlerMid.PlatesBoxTCM.mid, CmdId.temp_controler_start_hearting, platesBoxTCMSetTemp);

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

@ -2,13 +2,15 @@ package a8k.app.service.background;
import a8k.OS;
import a8k.app.type.error.AppError;
import a8k.app.type.exception.AppException;
import a8k.app.service.setting.AppSettingsMgrService;
import a8k.app.hardware.driver.TemperatureControlDriver;
import a8k.app.service.setting.AppSettingsMgrService;
import a8k.app.teststate.VirtualDevice;
import a8k.app.type.error.AppError;
import a8k.app.type.exception.AppException;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@ -17,108 +19,120 @@ import org.springframework.stereotype.Component;
@Slf4j
public class TemperatureCtrlService {
@Resource
TemperatureControlDriver temperatureControlDriver;
@Resource
VirtualDevice virtualDevice;
@Resource
AppSettingsMgrService appSettingsMgrService;
@Resource
AppEventBusService eventBus;
Integer targetTemperatureSetVal = null;
Integer targetTemperature = 0;
Boolean workingFlag = false;
Thread temperatureCtrlThread = null;
AppError error = null;
@Value("${a8k.enableTemperatureCtrl}")
Boolean enableTemperatureCtrl = true;
@PostConstruct
public void init() {
// eventBus.regListener(this::onAppEvent);
if(!enableTemperatureCtrl){
return;
}
temperatureCtrlThread = new Thread(() -> {
OS.forceSleep(3000); //等待webSocket连接
while (true) {
if (virtualDevice.isEnable()) {
OS.forceSleep(1000);
continue;
}
try {
Integer targetSetVal = getTargetTemperatureSetVal();
if (isTargetTemperatureChanged(targetSetVal)) {
startCtrlTemperature(targetSetVal);
}
clearAppError();
} catch (AppException e) {
setAppError(e);
log.error("Temperature control error: {}", e.getMessage());
}
OS.forceSleep(1000);
}
});
temperatureCtrlThread.start();
}
synchronized public AppError getError() {
return error;
}
synchronized public void setTargetTemperature(Integer temperature) {
targetTemperatureSetVal = temperature;
}
synchronized public void clearTargetTemperature() {
targetTemperatureSetVal = null;
}
synchronized public Integer getTargetTemperature() {
return targetTemperature;
}
private Boolean isTargetTemperatureChanged(Integer newTargetTemperature) {
return !newTargetTemperature.equals(targetTemperature);
}
private Integer getTargetTemperatureSetVal() {
if (targetTemperatureSetVal != null) {
return targetTemperatureSetVal;
}
return appSettingsMgrService.getDeviceSetting().getTemperature();
}
private void startCtrlTemperature(Integer temperature) throws AppException {
log.info("start control temperature: {}", temperature);
temperatureControlDriver.startCtrlTemperature(temperature.doubleValue());
targetTemperature = temperature;
workingFlag = true;
}
synchronized private void setAppError(AppException e) {
if (error == null) {
eventBus.pushAppExceptionEvent(e);
}
error = e.getError();
}
synchronized private void clearAppError() {
error = null;
}
@Resource
TemperatureControlDriver temperatureControlDriver;
@Resource
VirtualDevice virtualDevice;
@Resource
AppSettingsMgrService appSettingsMgrService;
@Resource
AppEventBusService eventBus;
Integer targetIncubatorTemperatureSetVal = null;
Integer targetPlatesBoxTemperatureSetVal = null;
@Getter
@Setter
Integer targetIncubatorTemperature = 0;
@Getter
@Setter
Integer targetPlatesBoxTemperature = 0;
Boolean workingFlag = false;
Thread temperatureCtrlThread = null;
AppError error = null;
@Value("${a8k.enableTemperatureCtrl}")
Boolean enableTemperatureCtrl = true;
@PostConstruct
public void init() {
// eventBus.regListener(this::onAppEvent);
if (!enableTemperatureCtrl) {
return;
}
temperatureCtrlThread = new Thread(() -> {
OS.forceSleep(3000); //等待webSocket连接
while (true) {
if (virtualDevice.isEnable()) {
OS.forceSleep(1000);
continue;
}
try {
Integer targetIncubatorSetVal = getTargetIncubatorTemperatureSetVal();
Integer targetPlatesBoxSetVal = getTargetPlatesBoxTemperatureSetVal();
if (isTargetIncubatorTemperatureChanged(targetIncubatorSetVal) || isTargetPlatesBoxTemperatureChanged(targetPlatesBoxSetVal)) {
startCtrlTemperature(targetIncubatorSetVal, targetPlatesBoxSetVal);
}
clearAppError();
} catch (AppException e) {
setAppError(e);
log.error("Temperature control error: {}", e.getMessage());
}
OS.forceSleep(1000);
}
});
temperatureCtrlThread.start();
}
synchronized public AppError getError() {
return error;
}
synchronized public void clearTargetTemperature() {
targetIncubatorTemperatureSetVal = null;
targetPlatesBoxTemperatureSetVal = null;
}
private Boolean isTargetIncubatorTemperatureChanged(Integer newTemperature) {
return !newTemperature.equals(targetIncubatorTemperature);
}
private Boolean isTargetPlatesBoxTemperatureChanged(Integer newTemperature) {
return !newTemperature.equals(targetPlatesBoxTemperature);
}
public Integer getTargetIncubatorTemperatureSetVal() {
if (targetIncubatorTemperatureSetVal != null) {
return targetIncubatorTemperatureSetVal;
}
return appSettingsMgrService.getDeviceSetting().getIncubateBoxTemperature();
}
public Integer getTargetPlatesBoxTemperatureSetVal() {
if (targetPlatesBoxTemperatureSetVal != null) {
return targetPlatesBoxTemperatureSetVal;
}
return appSettingsMgrService.getDeviceSetting().getPlateBoxTemperature();
}
private void startCtrlTemperature(Integer incubatorTemperature, Integer platesBoxTemperature) throws AppException {
log.info("start control incubatorTemperature: {},platesBoxTemperature: {}", incubatorTemperature, platesBoxTemperature);
temperatureControlDriver.startCtrlTemperature(incubatorTemperature.doubleValue(), platesBoxTemperature.doubleValue());
targetIncubatorTemperature = incubatorTemperature;
targetPlatesBoxTemperature = platesBoxTemperature;
workingFlag = true;
}
synchronized private void setAppError(AppException e) {
if (error == null) {
eventBus.pushAppExceptionEvent(e);
}
error = e.getError();
}
synchronized private void clearAppError() {
error = null;
}
}

9
src/main/java/a8k/app/service/setting/AppSettingsMgrService.java

@ -123,10 +123,15 @@ public class AppSettingsMgrService {
lisSettingDao.update(setting);
}
public void setIncubateBoxTemperature(Integer val) {
DeviceSetting setting = deviceSettingDao.get();
setting.setIncubateBoxTemperature(val);
deviceSettingDao.update(setting);
}
public void setTemperature(Integer val) {
public void setPlateBoxTemperature(Integer val) {
DeviceSetting setting = deviceSettingDao.get();
setting.setTemperature(val);
setting.setPlateBoxTemperature(val);
deviceSettingDao.update(setting);
}

14
src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java

@ -1,12 +1,13 @@
package a8k.extui.page.debug;
import a8k.app.type.exception.AppException;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.service.background.SensorDataUpdateService;
import a8k.app.service.background.TemperatureCtrlService;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.statemgr.*;
import a8k.app.service.mainctrl.AppDeviceCtrlService;
import a8k.app.service.statemgr.DeviceWorkStateMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.type.exception.AppException;
import a8k.extui.factory.CurveBuilder;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
@ -51,7 +52,8 @@ public class P00MainflowCtrlServiceDebugPage {
@ExtApiStatu(name = "", group = "其他状态", order = 4)
public Map<String, Object> getBackgroudProcessState() {
return Map.of(
"目标温度", temperatureCtrlService.getTargetTemperature(),
"孵育盘目标温度", temperatureCtrlService.getTargetIncubatorTemperatureSetVal(),
"板夹仓目标温度", temperatureCtrlService.getTargetPlatesBoxTemperatureSetVal(),
"孵育盘实时温度", gStateMgrService.getSensorState().getIncubateBoxTemperature(),
"板夹仓实时温度", gStateMgrService.getSensorState().getPboxTemperature(),
"废量仓光栅状态", gStateMgrService.getSensorState().getWasteBinFullFlag()
@ -78,7 +80,7 @@ public class P00MainflowCtrlServiceDebugPage {
public ExtApiCurve getIncubateBoxTemperatureCurve() {
var datas = sensorDataUpdateService.getIncubateBoxTemperatureCurve();
Integer targetTemp = temperatureCtrlService.getTargetTemperature();
Integer targetTemp = temperatureCtrlService.getTargetIncubatorTemperature();
List<Object[]> points = new ArrayList<>();
for (var data : datas) {
points.add(new Object[]{data.tp, data.val});
@ -88,7 +90,7 @@ public class P00MainflowCtrlServiceDebugPage {
public ExtApiCurve getPlateBoxTemperatureCurve() {
var datas = sensorDataUpdateService.getPlateBoxTemperatureCurve();
Integer targetTemp = temperatureCtrlService.getTargetTemperature();
Integer targetTemp = temperatureCtrlService.getTargetPlatesBoxTemperature();
List<Object[]> points = new ArrayList<>();
for (var data : datas) {
points.add(new Object[]{data.tp, data.val});

11
src/main/java/a8k/extui/page/debug/P20AppSettingDebugPage.java

@ -67,8 +67,12 @@ public class P20AppSettingDebugPage {
appSettingsMgrService.setLISNetPort(val);
}
public void setTemperature(Integer val) {
appSettingsMgrService.setTemperature(val);
public void setIncubateBoxTemperature(Integer val) {
appSettingsMgrService.setIncubateBoxTemperature(val);
}
public void setPlateBoxTemperature(Integer val) {
appSettingsMgrService.setPlateBoxTemperature(val);
}
public void setDHCP(Boolean val) {
@ -95,7 +99,8 @@ public class P20AppSettingDebugPage {
page.addFunction("设置LIS串口波特率", this::setLISSerialBaudrate);
page.addFunction("设置LIS网络IP", this::setLISNetIp);
page.addFunction("设置LIS网络端口", this::setLISNetPort);
page.addFunction("设置温度", this::setTemperature);
page.addFunction("设置孵育盘温度", this::setIncubateBoxTemperature);
page.addFunction("设置板夹仓温度", this::setPlateBoxTemperature);
page.addFunction("设置DHCP", this::setDHCP);
page.addFunction("设置本地IP", this::setLocalIp);
extApiPageMgr.addPage(page);

295
src/main/java/a8k/extui/page/extapp/P02A8kTemperaturaVerfication.java

@ -1,16 +1,16 @@
package a8k.extui.page.extapp;
import a8k.app.type.param.TemperatureCtrlParam;
import a8k.app.service.param.pos.TemperatureCtrlParamMgr;
import a8k.extui.type.ret.ExtApiCurve;
import a8k.extui.factory.CurveBuilder;
import a8k.extui.type.ExtApiStatu;
import a8k.app.service.background.TemperatureCtrlService;
import a8k.app.hardware.driver.TemperatureControlDriver;
import a8k.app.service.background.TemperatureCtrlService;
import a8k.app.service.param.pos.TemperatureCtrlParamMgr;
import a8k.app.type.exception.AppException;
import a8k.app.type.param.TemperatureCtrlParam;
import a8k.extui.factory.CurveBuilder;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.Resource;
import a8k.extui.type.ExtApiStatu;
import a8k.extui.type.ret.ExtApiCurve;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@ -20,146 +20,151 @@ import java.util.List;
/**
*
*
*/
@Component
@Slf4j
public class P02A8kTemperaturaVerfication {
@Resource
ExtApiPageMgr extApiPageMgr;
@Resource
TemperatureCtrlService temperatureCtrlService;
@Resource
TemperatureControlDriver temperatureControlDriver;
@Resource
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
List<Object[]> incubateBoxTemperatureCurve = new ArrayList<>();
List<Object[]> plateBoxTemperatureCurve = new ArrayList<>();
Thread tempSampleThread;
Double incubateBoxTemperatureCache = 0.0;
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);
page.addFunction("查看板夹仓温度曲线", this::showPlateBoxTemperatureCurve);
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.setTargetTemperature(targetTemperature);
if (tempSampleThread != null) {
tempSampleThread.interrupt();
tempSampleThread.join();
}
hasStartedTimeMS = 0;
targetTemp = (double) targetTemperature;
tempSampleThread = new Thread(() -> {
while (true) {
try {
Thread.sleep(2000);
hasStartedTimeMS += 2000;
incubateBoxTemperatureCache = temperatureControlDriver.readIncubateBoxTemperature();
plateBoxTemperatureCache = temperatureControlDriver.readPlateBoxTemperature();
addIncubateBoxTemperatureCurve(incubateBoxTemperatureCache);
addPlateBoxTemperatureCurve(plateBoxTemperatureCache);
log.info("孵育盘[ 温度:{} PWM:{} ], 板夹仓[ 温度:{} PWM:{} ]",
incubateBoxTemperatureCache, temperatureControlDriver.readIncubateBoxPWMOutput(),
plateBoxTemperatureCache, temperatureControlDriver.readPlateBoxPWMOutput());
} catch (InterruptedException ignored) {
break;
} catch (Exception e) {
log.error("温度采样线程异常", e);
}
}
});
tempSampleThread.start();
workingFlag = true;
}
synchronized public void stopCtrl() throws AppException, InterruptedException {
temperatureCtrlService.clearTargetTemperature();
if (tempSampleThread != null) {
tempSampleThread.interrupt();
tempSampleThread.join();
}
workingFlag = false;
}
public ExtApiCurve showIncubateBoxTemperatureCurve() {
return CurveBuilder.buidCurve("孵育盘温度曲线", "time", "value", targetTemp - 10, targetTemp + 10, incubateBoxTemperatureCurve);
}
public ExtApiCurve showPlateBoxTemperatureCurve() {
return CurveBuilder.buidCurve("板夹仓温度曲线", "time", "value", targetTemp - 10, targetTemp + 10, plateBoxTemperatureCurve);
}
private void addIncubateBoxTemperatureCurve(Double temperature) {
incubateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), temperature});
if (incubateBoxTemperatureCurve.size() > 3000) {
incubateBoxTemperatureCurve.remove(0);
}
}
private void addPlateBoxTemperatureCurve(Double temperature) {
plateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), temperature});
if (plateBoxTemperatureCurve.size() > 3000) {
plateBoxTemperatureCurve.remove(0);
}
}
@Resource
ExtApiPageMgr extApiPageMgr;
@Resource
TemperatureCtrlService temperatureCtrlService;
@Resource
TemperatureControlDriver temperatureControlDriver;
@Resource
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
List<Object[]> incubateBoxTemperatureCurve = new ArrayList<>();
List<Object[]> plateBoxTemperatureCurve = new ArrayList<>();
Thread tempSampleThread;
Double incubateBoxTemperatureCache = 0.0;
Double plateBoxTemperatureCache = 0.0;
Integer hasStartedTimeMS = 0;
Double targetIncubateBoxTemp;
Double targetPlateBoxTemp;
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);
page.addFunction("查看板夹仓温度曲线", this::showPlateBoxTemperatureCurve);
extApiPageMgr.addPage(page);
}
public void setIncubatorBoxTemperatureOff(Double offset) throws AppException, InterruptedException {
temperatureCtrlParamMgr.setParam(TemperatureCtrlParam.IncubatorTCMTempOffset, offset);
if (workingFlag) {
startCtrl(targetIncubateBoxTemp.intValue(), null);
}
}
public void setPlatesBoxTCMTempOffset(Double offset) throws AppException, InterruptedException {
temperatureCtrlParamMgr.setParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset, offset);
if (workingFlag) {
startCtrl(null, targetPlateBoxTemp.intValue());
}
}
synchronized public void startCtrl(Integer targetIncubatorBoxTemperature, Integer targetPlatesBoxTemperature) throws AppException, InterruptedException {
if (targetIncubatorBoxTemperature != null) {
temperatureCtrlService.setTargetIncubatorTemperature(targetIncubatorBoxTemperature);
targetIncubateBoxTemp = targetIncubatorBoxTemperature.doubleValue();
}
if (targetPlatesBoxTemperature != null) {
temperatureCtrlService.setTargetPlatesBoxTemperature(targetPlatesBoxTemperature);
targetPlateBoxTemp = targetPlatesBoxTemperature.doubleValue();
}
if (tempSampleThread != null) {
tempSampleThread.interrupt();
tempSampleThread.join();
}
hasStartedTimeMS = 0;
tempSampleThread = new Thread(() -> {
while (true) {
try {
Thread.sleep(2000);
hasStartedTimeMS += 2000;
incubateBoxTemperatureCache = temperatureControlDriver.readIncubateBoxTemperature();
plateBoxTemperatureCache = temperatureControlDriver.readPlateBoxTemperature();
addIncubateBoxTemperatureCurve(incubateBoxTemperatureCache);
addPlateBoxTemperatureCurve(plateBoxTemperatureCache);
log.info("孵育盘[ 温度:{} PWM:{} ], 板夹仓[ 温度:{} PWM:{} ]",
incubateBoxTemperatureCache, temperatureControlDriver.readIncubateBoxPWMOutput(),
plateBoxTemperatureCache, temperatureControlDriver.readPlateBoxPWMOutput());
} catch (InterruptedException ignored) {
break;
} catch (Exception e) {
log.error("温度采样线程异常", e);
}
}
});
tempSampleThread.start();
workingFlag = true;
}
synchronized public void stopCtrl() throws AppException, InterruptedException {
temperatureCtrlService.clearTargetTemperature();
if (tempSampleThread != null) {
tempSampleThread.interrupt();
tempSampleThread.join();
}
workingFlag = false;
}
public ExtApiCurve showIncubateBoxTemperatureCurve() {
return CurveBuilder.buidCurve("孵育盘温度曲线", "time", "value", targetIncubateBoxTemp - 10, targetIncubateBoxTemp + 10, incubateBoxTemperatureCurve);
}
public ExtApiCurve showPlateBoxTemperatureCurve() {
return CurveBuilder.buidCurve("板夹仓温度曲线", "time", "value", targetPlateBoxTemp - 10, targetPlateBoxTemp + 10, plateBoxTemperatureCurve);
}
private void addIncubateBoxTemperatureCurve(Double temperature) {
incubateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), temperature});
if (incubateBoxTemperatureCurve.size() > 3000) {
incubateBoxTemperatureCurve.remove(0);
}
}
private void addPlateBoxTemperatureCurve(Double temperature) {
plateBoxTemperatureCurve.add(new Object[]{System.currentTimeMillis(), temperature});
if (plateBoxTemperatureCurve.size() > 3000) {
plateBoxTemperatureCurve.remove(0);
}
}
}
Loading…
Cancel
Save