diff --git a/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java b/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java index c0f1b39..b2af502 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/setting/DeviceSettingControler.java +++ b/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 setTemperature(Integer val) { - log.info("setTemperature:{}", val); - appSettingsMgrService.setTemperature(val); + @Operation(summary = "设置孵育盘温度") + @PostMapping("/setIncubateBoxTemperature") + public ApiRet setIncubateBoxTemperature(Integer val) { + log.info("setIncubateBoxTemperature:{}", val); + appSettingsMgrService.setIncubateBoxTemperature(val); return ApiRet.success(); } + @Operation(summary = "设置板夹仓温度") + @PostMapping("/setPlateBoxTemperature") + public ApiRet 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> getTemperatureAvailableRange() { - return ApiRet.success(ZList.of(25, 35)); + return ApiRet.success(ZList.of(20, 40)); } diff --git a/src/main/java/a8k/app/dao/type/db/DeviceSetting.java b/src/main/java/a8k/app/dao/type/db/DeviceSetting.java index ec4439f..a6a1802 100644 --- a/src/main/java/a8k/app/dao/type/db/DeviceSetting.java +++ b/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 = ""; } diff --git a/src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java b/src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java index 0b6e995..228fe2e 100644 --- a/src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java +++ b/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); diff --git a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java index 9568e4e..8d7ad70 100644 --- a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java +++ b/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; + } } diff --git a/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java b/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java index af64911..f93b438 100644 --- a/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java +++ b/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); } diff --git a/src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java b/src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java index c77511c..c20c401 100644 --- a/src/main/java/a8k/extui/page/debug/P00MainflowCtrlServiceDebugPage.java +++ b/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 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 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 points = new ArrayList<>(); for (var data : datas) { points.add(new Object[]{data.tp, data.val}); diff --git a/src/main/java/a8k/extui/page/debug/P20AppSettingDebugPage.java b/src/main/java/a8k/extui/page/debug/P20AppSettingDebugPage.java index d3ec9e1..2b05725 100644 --- a/src/main/java/a8k/extui/page/debug/P20AppSettingDebugPage.java +++ b/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); diff --git a/src/main/java/a8k/extui/page/extapp/P02A8kTemperaturaVerfication.java b/src/main/java/a8k/extui/page/extapp/P02A8kTemperaturaVerfication.java index f0fedcc..8b882bb 100644 --- a/src/main/java/a8k/extui/page/extapp/P02A8kTemperaturaVerfication.java +++ b/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 incubateBoxTemperatureCurve = new ArrayList<>(); - List 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 incubateBoxTemperatureCurve = new ArrayList<>(); + List 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); + } + } }