From 27951f8ad7e5d0afd089b0e90c3beeb955078a6f Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 17 Jun 2025 23:08:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A1=AC=E4=BB=B6=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/hardware/channel/A8kCanBusConnection.java | 2 +- .../a8k/app/hardware/channel/LisUartChannel.java | 98 ++++++ .../java/a8k/app/hardware/driver/HbotDriver.java | 12 +- .../app/hardware/driver/PipetteCtrlDriverV2.java | 29 +- .../hardware/driver/TemperatureControlDriver.java | 90 ----- .../driver/WaterTemperatureControllerDriver.java | 104 ++++++ src/main/java/a8k/app/hardware/type/CmdId.java | 30 +- .../type/pipette_module/PipetteStateIndex.java | 7 +- .../appsetup/A8kSubModuleRegInitService.java | 33 +- .../background/SensorDataUpdateService.java | 12 +- .../service/background/TemperatureCtrlService.java | 8 +- .../data/SubModuleRegInitialValueMgrService.java | 22 ++ .../service/mainctrl/AppDeviceInitCtrlService.java | 11 +- src/main/java/a8k/app/type/VersionInfo.java | 9 + .../java/a8k/extui/controler/ExtApiControler.java | 1 + .../java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java | 25 +- .../page/driver/CodeScanerDriverCtrlPage.java | 73 ---- .../page/driver/CodeScannerDriverCtrlPage.java | 68 ++++ .../extui/page/driver/InputIOStateScannerPage.java | 88 ----- .../driver/LowLevelBoardVersionPreviewPage.java | 282 --------------- .../P02A8kTemperaturaVerfication.java | 16 +- .../extsetting/db/A8kSubModuleConfigDebugPage.java | 55 --- .../db/A8kSubModuleParameterInitDebugPage.java | 65 ---- .../db/A8kSubModuleRegAndConfigSyncPage.java | 70 ++++ .../A8kSubModuleRegAndConfigInitPage.java | 38 ++ .../page/hardwaretest/HBotHardwareTestPage.java | 100 ++++++ .../page/hardwaretest/ICCardReaderTestPage.java | 36 ++ .../hardwaretest/InputIOStateHardwareTestPage.java | 55 +++ .../hardwaretest/MiniServoHardwareTestPage.java | 164 +++++++++ .../page/hardwaretest/MiscHardwareTestPage.java | 23 ++ .../page/hardwaretest/MotorHardwareTestPage.java | 389 +++++++++++++++++++++ .../hardwaretest/MotorPPSHardwareTestPage.java | 89 +++++ .../page/hardwaretest/OutputIOCtrlTestPage.java | 28 ++ .../hardwaretest/PipetteGunHardwareTestPage.java | 82 +++++ .../page/hardwaretest/SubBoardProberPage.java | 131 +++++++ .../hardwaretest/SubModuleVersionPreviewPage.java | 244 +++++++++++++ .../hardwaretest/WaterTempControllerTestPage.java | 145 ++++++++ src/main/java/a8k/extui/type/ExtUIPageCfg.java | 12 + 38 files changed, 2002 insertions(+), 744 deletions(-) create mode 100644 src/main/java/a8k/app/hardware/channel/LisUartChannel.java delete mode 100644 src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java create mode 100644 src/main/java/a8k/app/hardware/driver/WaterTemperatureControllerDriver.java create mode 100644 src/main/java/a8k/app/type/VersionInfo.java delete mode 100644 src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java create mode 100644 src/main/java/a8k/extui/page/driver/CodeScannerDriverCtrlPage.java delete mode 100644 src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java delete mode 100644 src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java delete mode 100644 src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleConfigDebugPage.java delete mode 100644 src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleParameterInitDebugPage.java create mode 100644 src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleRegAndConfigSyncPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java create mode 100644 src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java index b77ab6f..38df30c 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java +++ b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java @@ -220,7 +220,7 @@ public class A8kCanBusConnection extends WebSocketClient { } log.error("send cmd {} {} fail", pack, pack.toByteString()); restartCanif(); - // OS.hsleep(50); + // OS.hsleep(1000); log.error("retry {}", i); } throw AppException.of(new AEHardwareError(A8kEcode.LOW_ERROR_OVERTIME, MId.valueOf(pack.getModuleId()), CmdId.valueOf(pack.getCmdId()))); diff --git a/src/main/java/a8k/app/hardware/channel/LisUartChannel.java b/src/main/java/a8k/app/hardware/channel/LisUartChannel.java new file mode 100644 index 0000000..866fcdf --- /dev/null +++ b/src/main/java/a8k/app/hardware/channel/LisUartChannel.java @@ -0,0 +1,98 @@ +package a8k.app.hardware.channel; + +import a8k.app.config.IflytophaldConnectionConfig; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.enums.ReadyState; +import org.java_websocket.handshake.ServerHandshake; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.util.LinkedList; +import java.util.Queue; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class LisUartChannel { + WebSocketClient conn; + + private final IflytophaldConnectionConfig config; + + @PostConstruct + void init() { + String url = config.getDatachUrl("lis"); + log.info("LisUartChannel url: {}", url); + conn = new WebSocketClient(URI.create(url)) { + @Override + public void onOpen(ServerHandshake serverHandshake) { + LisUartChannel.this.onOpen(serverHandshake); + } + + @Override + public void onMessage(String s) { + LisUartChannel.this.onMessage(s); + } + + @Override + public void onClose(int i, String s, boolean b) { + LisUartChannel.this.onClose(i, s, b); + } + + @Override + public void onError(Exception e) { + LisUartChannel.this.onError(e); + } + }; + conn.connect(); + } + + public void tx(byte[] toSend) { + if (toSend == null || toSend.length == 0) { + return; + } + conn.send(toSend); + } + + private void onMessage(String s) {} + + + // + // PRIVATE + // + + + private void onOpen(ServerHandshake serverHandshake) { + log.info("a8k canbus connect sucess"); + } + + private void onClose(int i, String s, boolean b) { + log.warn("a8k canbus lost connection..."); + } + + private void onError(Exception e) { + log.info("a8k can-websocket-channel on error"); + } + + + @Scheduled(fixedRate = 1000) + private void autoConnect() { + if (!conn.isOpen()) { + if (conn.getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { + try { + conn.connect(); + } catch (IllegalStateException ignored) { + } + } else if (conn.getReadyState().equals(ReadyState.CLOSED)) { + conn.reconnect(); + } + } + } +} + + diff --git a/src/main/java/a8k/app/hardware/driver/HbotDriver.java b/src/main/java/a8k/app/hardware/driver/HbotDriver.java index 2c12617..d3a9d1a 100644 --- a/src/main/java/a8k/app/hardware/driver/HbotDriver.java +++ b/src/main/java/a8k/app/hardware/driver/HbotDriver.java @@ -66,13 +66,17 @@ public class HbotDriver { canBus.callcmd(MId.HbotM, CmdId.xymotor_set_pos, x, y); } - public void moveByDirect(Integer motor1_dpos, Integer motor2_dpos) throws AppException { + public void moveByDirectBlock(Integer motor1_dpos, Integer motor2_dpos) throws AppException { canBus.callcmd(MId.HbotM, CmdId.xymotor_motor_move_by_direct, motor1_dpos, motor2_dpos); + canBus.waitForMod(MId.HbotM, actionOvertime); } - public Integer readEncDirect() throws AppException { - var packet = canBus.callcmd(MId.HbotM, CmdId.xymotor_read_enc_direct); - return packet.getContentI32(0); + public Integer[] readEncDirect() throws AppException { + var packet = canBus.callcmd(MId.HbotM, CmdId.xymotor_read_enc_direct); + Integer[] enc = new Integer[2]; + enc[0] = packet.getContentI32(0); + enc[1] = packet.getContentI32(1); + return enc; } public Integer hbotReadInioIndexInStm32(Integer ioIndex) throws AppException { diff --git a/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java b/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java index e5ea24a..25e750f 100644 --- a/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java +++ b/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java @@ -431,11 +431,39 @@ public class PipetteCtrlDriverV2 { waitForMod(CmdId.pipette_test_move_to_lld_end_pos); } + /** + * 测试pipette模块的连接性 + * @throws AppException 连接异常 + * + * @Warning: 该指令超时时间过长, 除了在测试pipette模块连接性时, 请不要使用该指令 + */ + public void pipetteTestConnectivity() throws AppException { + canBus.callcmd(MId.PipetteMod, CmdId.pipette_test_connectivity, 2000L); + } public Integer readState(PipetteStateIndex index) throws AppException { return callcmd(MId.PipetteMod, CmdId.pipette_read_state, index.toInteger()).getContentI32(0); } + static public class PipetteGunConnectivityTestReport { + public Boolean io1Connected; + public Boolean uart232Connected; + public Boolean uart485Connected; + } + + public PipetteGunConnectivityTestReport readPipetteConnectedState() throws AppException { + Integer io1_connected = readState(PipetteStateIndex.testPipetteIo1Connected); + Integer uart232_connected = readState(PipetteStateIndex.testPipetteUart232Connected); + Integer uart485_connected = readState(PipetteStateIndex.testPipetteUart485Connected); + + PipetteGunConnectivityTestReport report = new PipetteGunConnectivityTestReport(); + report.io1Connected = io1_connected == 1; + report.uart232Connected = uart232_connected == 1; + report.uart485Connected = uart485_connected == 1; + return report; + } + + public Boolean readTipState() throws AppException { return callcmd(MId.PipetteMod, CmdId.pipette_read_tip_state).getContentI32(0) != 0; } @@ -465,7 +493,6 @@ public class PipetteCtrlDriverV2 { } - // // UTILS // diff --git a/src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java b/src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java deleted file mode 100644 index 9bb8dfb..0000000 --- a/src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java +++ /dev/null @@ -1,90 +0,0 @@ -package a8k.app.hardware.driver; - -import a8k.app.hardware.channel.A8kCanBusService; -import a8k.app.hardware.type.CmdId; -import a8k.app.hardware.type.TemperatureControlerMid; -import a8k.app.hardware.type.TemperatureControlerRegIndex; -import a8k.app.service.param.misc.TemperatureCtrlParamMgr; -import a8k.app.type.exception.AppException; -import a8k.app.type.param.TemperatureCtrlParam; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class TemperatureControlDriver { - @Resource - A8kCanBusService canBus; - - Double incubatorTCMTempOffset = 0.0; - Double platesBoxTCMTempOffset = 0.0; - - @Resource - TemperatureCtrlParamMgr temperatureCtrlParamMgr; - - - public void startCtrlTemperature(Double incubatorTemperature,Double platesBoxTemperature) throws AppException { - - incubatorTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.IncubatorTCMTempOffset); - platesBoxTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset); - - Integer incubatorTCMSetTemp = (int) ((incubatorTemperature + incubatorTCMTempOffset) * 10); - Integer platesBoxTCMSetTemp = (int) ((platesBoxTemperature + platesBoxTCMTempOffset) * 10); - - 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); - } - - public void stopCtrlTemperature() throws AppException { - canBus.callcmd(TemperatureControlerMid.IncubatorTCM.mid, CmdId.temp_controler_stop_hearting); - canBus.callcmd(TemperatureControlerMid.PlatesBoxTCM.mid, CmdId.temp_controler_stop_hearting); - } - - public void testCtrlPeltierPower(TemperatureControlerMid mid, Integer val0To100) throws AppException { - canBus.callcmd(mid.mid, CmdId.temp_controler_set_peltier_power_level, val0To100); - } - - public void testCtrlFanLevel(TemperatureControlerMid mid, Integer val0To100) throws AppException { - canBus.callcmd(mid.mid, CmdId.temp_controler_set_fan_level, val0To100); - } - - public void testWaterPumpSpeed(TemperatureControlerMid mid, Integer val0To100) throws AppException { - canBus.callcmd(mid.mid, CmdId.temp_controler_set_pump_level, val0To100); - } - - public Double readIncubateBoxTemperature() throws AppException { - Integer readval = readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); - Double readvalDouble = readval * 0.1; - return readvalDouble - incubatorTCMTempOffset; - } - - public Double readPlateBoxTemperature() throws AppException { - Integer readval = readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); - Double readvalDouble = readval * 0.1; - return readvalDouble - platesBoxTCMTempOffset; - } - - - public Integer readIncubateBoxPWMOutput() throws AppException { - return readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_nowoutput); - } - - public Integer readPlateBoxPWMOutput() throws AppException { - return readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_nowoutput); - } - - - public Integer readReg(TemperatureControlerMid mid, TemperatureControlerRegIndex regIndex) throws AppException { - return canBus.moduleGetReg(mid.mid, regIndex.regIndex); - } - - public void setReg(TemperatureControlerMid mid, TemperatureControlerRegIndex regIndex, Integer val) throws AppException { - canBus.moduleSetReg(mid.mid, regIndex.regIndex, val); - } - - -} diff --git a/src/main/java/a8k/app/hardware/driver/WaterTemperatureControllerDriver.java b/src/main/java/a8k/app/hardware/driver/WaterTemperatureControllerDriver.java new file mode 100644 index 0000000..6fc7943 --- /dev/null +++ b/src/main/java/a8k/app/hardware/driver/WaterTemperatureControllerDriver.java @@ -0,0 +1,104 @@ +package a8k.app.hardware.driver; + +import a8k.app.hardware.channel.A8kCanBusService; +import a8k.app.hardware.type.CmdId; +import a8k.app.hardware.type.TemperatureControlerMid; +import a8k.app.hardware.type.TemperatureControlerRegIndex; +import a8k.app.service.param.misc.TemperatureCtrlParamMgr; +import a8k.app.type.exception.AppException; +import a8k.app.type.param.TemperatureCtrlParam; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +public class WaterTemperatureControllerDriver { + @Resource + A8kCanBusService canBus; + + Double incubatorTCMTempOffset = 0.0; + Double platesBoxTCMTempOffset = 0.0; + + @Resource + TemperatureCtrlParamMgr temperatureCtrlParamMgr; + + public void startCtrlTemperature(Double incubatorTemperature, Double platesBoxTemperature) throws AppException { + + incubatorTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.IncubatorTCMTempOffset); + platesBoxTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset); + + Integer incubatorTCMSetTemp = (int) ((incubatorTemperature + incubatorTCMTempOffset) * 10); + Integer platesBoxTCMSetTemp = (int) ((platesBoxTemperature + platesBoxTCMTempOffset) * 10); + + 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); + } + + public void stopCtrlTemperature() throws AppException { + canBus.callcmd(TemperatureControlerMid.IncubatorTCM.mid, CmdId.temp_controler_stop_hearting); + canBus.callcmd(TemperatureControlerMid.PlatesBoxTCM.mid, CmdId.temp_controler_stop_hearting); + } + + public Double readIncubateBoxTemperature() throws AppException { + Integer readval = readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); + Double readvalDouble = readval * 0.1; + return readvalDouble - incubatorTCMTempOffset; + } + + public Double readPlateBoxTemperature() throws AppException { + Integer readval = readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); + Double readvalDouble = readval * 0.1; + return readvalDouble - platesBoxTCMTempOffset; + } + + + public void startCtrlTemperature(TemperatureControlerMid mid, Double temperature) throws AppException { + Integer setTemp = (int) ((temperature) * 10); + canBus.callcmd(mid.mid, CmdId.temp_controler_start_hearting, setTemp); + } + + public void stopCtrlTemperature(TemperatureControlerMid mid) throws AppException { + canBus.callcmd(mid.mid, CmdId.temp_controler_stop_hearting); + } + + public void setPeltierPower(TemperatureControlerMid mid, Integer val0To100) throws AppException { + canBus.callcmd(mid.mid, CmdId.temp_controler_set_peltier_power_level, val0To100); + } + + public void setCtrlFanLevel(TemperatureControlerMid mid, Integer val0To100) throws AppException { + canBus.callcmd(mid.mid, CmdId.temp_controler_set_fan_level, val0To100); + } + + public void setWaterPumpSpeed(TemperatureControlerMid mid, Integer val0To100) throws AppException { + canBus.callcmd(mid.mid, CmdId.temp_controler_set_pump_level, val0To100); + } + + public Double readFeedbakTemperature(TemperatureControlerMid mid) throws AppException { + Integer readval = readReg(mid, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); + return readval * 0.1; + } + + + public Integer readIncubateBoxPWMOutput() throws AppException { + return readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_nowoutput); + } + + public Integer readPlateBoxPWMOutput() throws AppException { + return readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_pid_nowoutput); + } + + + public Integer readReg(TemperatureControlerMid mid, TemperatureControlerRegIndex regIndex) throws AppException { + return canBus.moduleGetReg(mid.mid, regIndex.regIndex); + } + + public void setReg(TemperatureControlerMid mid, TemperatureControlerRegIndex regIndex, Integer val) throws AppException { + canBus.moduleSetReg(mid.mid, regIndex.regIndex, val); + } + + +} diff --git a/src/main/java/a8k/app/hardware/type/CmdId.java b/src/main/java/a8k/app/hardware/type/CmdId.java index be877df..7125345 100644 --- a/src/main/java/a8k/app/hardware/type/CmdId.java +++ b/src/main/java/a8k/app/hardware/type/CmdId.java @@ -122,34 +122,6 @@ public enum CmdId { // plate_code_scaner_open_laser(0x7307, "PLATE_CODE_SCANER_OPEN_LASER"),// // plate_code_scaner_close_laser(0x7308, "PLATE_CODE_SCANER_CLOSE_LASER"),// // - // pipette_zmotor_enable(0x7400, "pipette_zmotor_enable"), - // pipette_zmotor_move_zero(0x7401, "pipette_zmotor_move_zero"), - // pipette_zmotor_move_to_zero_point_quick(0x7402, "pipette_zmotor_move_to_zero_point_quick"), - // pipette_zmotor_measure_distance(0x7403, "pipette_zmotor_measure_distance"), - // pipette_zmotor_read_measure_distance_result(0x7404, "pipette_zmotor_read_measure_distance_result"), - // pipette_zmotor_move_by(0x7405, "pipette_zmotor_move_by"), - // pipette_zmotor_move_to(0x7406, "pipette_zmotor_move_to"), - // - // - // liquid_operation_clear_params(0x7450, "liquid_operation_clear_params"), - // liquid_operation_set_gun_runparams(0x7451, "liquid_operation_set_gun_runparams"), - // liquid_operation_set_zmotor_runparams(0x7452, "liquid_operation_set_zmotor_runparams"), - // liquid_operation_enable_lld_record(0x7453, "liquid_operation_enable_lld_record"), - // liquid_operation_fresh_params(0x7454, "liquid_operation_fresh_params"), - // - // pipette_init_device(0x7501, "pipette_init_device"), - // pipette_put_tip(0x7502, "pipette_put_tip"), - // pipette_pump_move_to(0x7503, "pipette_pump_move_to"), - // pipette_lld(0x7504, "pipette_lld"), - // pipette_aspirate(0x7505, "pipette_aspirate"), - // pipette_distribu(0x7506, "pipette_distribu"), - // pipette_shake_up(0x7507, "pipette_shake_up"), - // pipette_clear_hanging_liquid(0x7508, "pipette_clear_hanging_liquid"), - // pipette_lld_is_detect_liquid(0x7509, "pipette_lld_is_detect_liquid"), - // pipette_get_sensor_sample_data(0x7510, "pipette_get_sensor_sample_data"), - // pipette_get_sensor_sample_data_num(0x7511, "pipette_get_sensor_sample_data_num"), - // pipette_zmotor_read_zero_point_state(0x7512, "pipette_zmotor_read_zero_point_state"), - // pipette_zmotor_read_dev_status_cache(0x7513, "pipette_zmotor_read_dev_status_cache"), pipette_set_zmbcfg(0x7401, "pipette_set_zmbcfg"), @@ -217,6 +189,8 @@ public enum CmdId { pipette_test_move_to_fix_water_level_pos(0x7608, "pipette_test_move_to_fix_water_level_pos"), // int32_t container_pos, int32_t container_cpyid, pipette_test_move_to_pierce_pos(0x7609, "pipette_test_move_to_pierce_pos"), // int32_t container_pos, int32_t container_cpyid, pipette_test_move_to_lld_end_pos(0x760A, "pipette_test_move_to_lld_end_pos"), // int32_t container_pos, int32_t container_cpyid, + pipette_test_connectivity(0x760B, "pipette_test_connectivity"), // 测试电缆连接性 {}, ack:{} + ; public final static int ATTACH_IS_BYTES = 1; public final static int ATTACH_IS_INT32 = 2; diff --git a/src/main/java/a8k/app/hardware/type/pipette_module/PipetteStateIndex.java b/src/main/java/a8k/app/hardware/type/pipette_module/PipetteStateIndex.java index ef94c27..5861a89 100644 --- a/src/main/java/a8k/app/hardware/type/pipette_module/PipetteStateIndex.java +++ b/src/main/java/a8k/app/hardware/type/pipette_module/PipetteStateIndex.java @@ -14,13 +14,16 @@ public enum PipetteStateIndex { airsuction, bubble, - zmNowVcfgIndex, - pmNowVcfgIndex, asynchronousResult0, asynchronousResult1, platinfoCpyid,//当前plateinfoCpyId + + testPipetteIo1Connected, + testPipetteIo1Reverse, + testPipetteUart485Connected, + testPipetteUart232Connected, ; public Integer toInteger() { diff --git a/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java b/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java index 2985893..2605503 100644 --- a/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java +++ b/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java @@ -36,7 +36,6 @@ public class A8kSubModuleRegInitService { private final ModuleEnableCtrlDriver moduleEnableCtrlDriver; private final GStateMgrService gStateMgrService; private final AppEventBusService eventBus; - private final A8kSubModuleInitRegConfig a8kSubModuleInitRegConfig; private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; private final SubModuleConfigService subModuleConfigService; @@ -54,8 +53,11 @@ public class A8kSubModuleRegInitService { log.info("forceInitA8kModParams"); moduleEnableCtrlDriver.stopHeating(); moduleEnableCtrlDriver.stopAllMotor(); + //读取所有板子版本 dumpAllSubBoardVersion(); - initA8kModParams(); + //同步板子参数 + subModuleRegInitialValueMgrService.syncToMirco(); + subModuleConfigService.syncToMirco(); log.info("======================================================"); log.info("= init hardware param success...... ="); @@ -97,31 +99,4 @@ public class A8kSubModuleRegInitService { } } - - private void initA8kModParams() throws AppException { - for (MId mid : MId.values()) { - if (mid == MId.NotSet) - continue; - - log.info("============== {}({}) ===============", mid, mid.index); - - ModuleType moduleType = canBus.moduleReadType(mid); - List regIndexes = a8kSubModuleInitRegConfig.findRegIndexByModuleType(moduleType); - - for (RegIndex regIndex : regIndexes) { - SubModuleRegInitialValue val = subModuleRegInitialValueMgrService.findByIDAndRegIndex(mid, regIndex); - if (val == null) - continue; - - log.info(String.format("= init %s(%d) %-45s: %d", mid, mid.index, regIndex, val.regInitVal)); - canBus.moduleSetReg(mid, regIndex, val.regInitVal); - } - log.info("="); - } - - subModuleConfigService.syncToMirco(); - - } - - } diff --git a/src/main/java/a8k/app/service/background/SensorDataUpdateService.java b/src/main/java/a8k/app/service/background/SensorDataUpdateService.java index 59d3f7b..bece5d8 100644 --- a/src/main/java/a8k/app/service/background/SensorDataUpdateService.java +++ b/src/main/java/a8k/app/service/background/SensorDataUpdateService.java @@ -12,7 +12,7 @@ import a8k.app.type.error.AppError; import a8k.app.hardware.channel.A8kCanBusService; import a8k.app.service.statemgr.GStateMgrService; import a8k.app.service.statemgr.OptScanModuleStateMgr; -import a8k.app.hardware.driver.TemperatureControlDriver; +import a8k.app.hardware.driver.WaterTemperatureControllerDriver; import a8k.app.type.exception.AppException; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; @@ -31,9 +31,9 @@ import java.util.List; public class SensorDataUpdateService { - private final GStateMgrService gStateMgrService; - private final TemperatureControlDriver temperatureControlDriver; - private final OptScanModuleStateMgr optScanModuleStateMgr; + private final GStateMgrService gStateMgrService; + private final WaterTemperatureControllerDriver waterTemperatureControllerDriver; + private final OptScanModuleStateMgr optScanModuleStateMgr; private final AppEventBusService appEventBusService; private final A8kCanBusService canBus; private final OutputIOCtrlDriver outputIOCtrlDriver; @@ -187,11 +187,11 @@ public class SensorDataUpdateService { Boolean wasteBinFullFlag = getRecycleBinOverflowState(); gStateMgrService.updateWasteBinFullFlag(wasteBinFullFlag); - Double incubateBoxTemp = temperatureControlDriver.readIncubateBoxTemperature(); + Double incubateBoxTemp = waterTemperatureControllerDriver.readIncubateBoxTemperature(); gStateMgrService.updateIncubateBoxTemperature((int) (incubateBoxTemp + 0.5)); addIncubateBoxTemperatureCurve(incubateBoxTemp); - Double pbtemp = temperatureControlDriver.readPlateBoxTemperature(); + Double pbtemp = waterTemperatureControllerDriver.readPlateBoxTemperature(); gStateMgrService.updatePboxTemperature((int) (pbtemp + 0.5)); addPlateBoxTemperatureCurve(pbtemp); diff --git a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java index d3e6162..e00dc3d 100644 --- a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java +++ b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java @@ -3,7 +3,7 @@ package a8k.app.service.background; import a8k.OS; import a8k.app.hardware.A8kChannelStateMgr; -import a8k.app.hardware.driver.TemperatureControlDriver; +import a8k.app.hardware.driver.WaterTemperatureControllerDriver; import a8k.app.service.setting.AppSettingsMgrService; import a8k.app.service.statemgr.GStateMgrService; import a8k.app.teststate.VirtualDevice; @@ -22,8 +22,8 @@ import org.springframework.stereotype.Component; @RequiredArgsConstructor public class TemperatureCtrlService { - private final TemperatureControlDriver temperatureControlDriver; - private final VirtualDevice virtualDevice; + private final WaterTemperatureControllerDriver waterTemperatureControllerDriver; + private final VirtualDevice virtualDevice; private final AppSettingsMgrService appSettingsMgrService; private final AppEventBusService eventBus; private final A8kChannelStateMgr a8kChannelStateMgr; @@ -129,7 +129,7 @@ public class TemperatureCtrlService { private void startCtrlTemperature(Integer incubatorTemperature, Integer platesBoxTemperature) throws AppException { log.info("start control incubatorTemperature: {},platesBoxTemperature: {}", incubatorTemperature, platesBoxTemperature); - temperatureControlDriver.startCtrlTemperature(incubatorTemperature.doubleValue(), platesBoxTemperature.doubleValue()); + waterTemperatureControllerDriver.startCtrlTemperature(incubatorTemperature.doubleValue(), platesBoxTemperature.doubleValue()); targetIncubatorTemperature = incubatorTemperature; targetPlatesBoxTemperature = platesBoxTemperature; workingFlag = true; diff --git a/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java b/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java index 2f12c28..b8c222e 100644 --- a/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java +++ b/src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java @@ -63,6 +63,28 @@ public class SubModuleRegInitialValueMgrService { } } + public void syncToMirco() throws AppException { + for (MId mid : MId.values()) { + if (mid == MId.NotSet) + continue; + + log.info("============== {}({}) ===============", mid, mid.index); + + ModuleType moduleType = canBus.moduleReadType(mid); + List regIndexes = a8kSubModuleInitRegConfig.findRegIndexByModuleType(moduleType); + + for (RegIndex regIndex : regIndexes) { + SubModuleRegInitialValue val = findByIDAndRegIndex(mid, regIndex); + if (val == null) + continue; + + log.info(String.format("= init %s(%d) %-45s: %d", mid, mid.index, regIndex, val.regInitVal)); + canBus.moduleSetReg(mid, regIndex, val.regInitVal); + } + log.info("="); + } + } + public void export() { subModuleRegInitialValueDao.export(); } diff --git a/src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java b/src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java index e84fc99..0d23617 100644 --- a/src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java +++ b/src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java @@ -198,7 +198,7 @@ public class AppDeviceInitCtrlService { * @throws AppException e */ synchronized public List initDevice() throws AppException { - return doDeviceMoveToZero(); + return doDeviceInit(); } @@ -225,8 +225,11 @@ public class AppDeviceInitCtrlService { } - private List doDeviceMoveToZero() throws AppException { + private List doDeviceInit() throws AppException { + // + // CHECK BEFORE INIT + // List results = checkBeforeInitDevice(); if (virtualDevice.isEnable()) { virtualDevice.doVirtualThings("初始化设备"); @@ -241,6 +244,10 @@ public class AppDeviceInitCtrlService { return results; } } + + // + // INIT DEVICE + // a8kSubModuleRegInitService.initModuleRegVal(); moveAllMotorToZero(); diff --git a/src/main/java/a8k/app/type/VersionInfo.java b/src/main/java/a8k/app/type/VersionInfo.java new file mode 100644 index 0000000..5a86dc7 --- /dev/null +++ b/src/main/java/a8k/app/type/VersionInfo.java @@ -0,0 +1,9 @@ +package a8k.app.type; + +public class VersionInfo { + public Integer moduleId; + public String moduleName; + public Boolean online; + public String moduleType; + public Integer version; +} diff --git a/src/main/java/a8k/extui/controler/ExtApiControler.java b/src/main/java/a8k/extui/controler/ExtApiControler.java index 5be427b..25096f5 100644 --- a/src/main/java/a8k/extui/controler/ExtApiControler.java +++ b/src/main/java/a8k/extui/controler/ExtApiControler.java @@ -172,6 +172,7 @@ public class ExtApiControler { log.warn("serviceActionList: page not found:{}", serviceKey); return AppRetV1.success(new ArrayList<>()); } + exUIpageCfg.callRegInitFn(); //获取OBject diff --git a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java index 170b84f..1b9fc23 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java +++ b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java @@ -11,6 +11,7 @@ import a8k.extui.page.extapp.debug_assistant.VirtualReportModeOperationPage; import a8k.extui.page.extapp.profession_test.ExperimentConsistencyTestingPage; import a8k.extui.page.extapp.profession_test.P01PipetteGunVerification; import a8k.extui.page.extsetting.db.*; +import a8k.extui.page.hardwaretest.*; import a8k.extui.page.init.DeviceInitPage; import a8k.extui.page.measurement.*; @@ -96,8 +97,7 @@ public class ExtApiPageGroupCfgMgr { new Menu(ProjInfoMgrPage.class, "项目信息管理"), new Menu(ReactionRecordMgrDebugPage.class, "反应记录") )), - new Menu(A8kSubModuleParameterInitDebugPage.class, "子模块初始化参数"), - new Menu(A8kSubModuleConfigDebugPage.class, "子模块配置初始化(移液枪专用)"), + new Menu(A8kSubModuleRegAndConfigSyncPage.class, "子模块配置初始化"), new Menu("坐标设置", ZList.of( new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"), new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"), @@ -123,7 +123,6 @@ public class ExtApiPageGroupCfgMgr { ))); pushMenu(new Menu("子模块管理", ZList.of( - new Menu(LowLevelBoardVersionPreviewPage.class, "子模块版本查看"), new Menu(HbotCtrlPage.class, "HBOT控制"), new Menu("移液枪驱动", ZList.of( new Menu(PipetteGunCfgSync.class, "配置同步"), @@ -140,8 +139,7 @@ public class ExtApiPageGroupCfgMgr { new Menu(MotorCtrlPage.class, "电机驱动"), new Menu(MiniServoCtrlPage.class, "伺服电机驱动"), - new Menu(InputIOStateScannerPage.class, "输入IO状态查看"), - new Menu(CodeScanerDriverCtrlPage.class, "条码扫描仪"), + new Menu(CodeScannerDriverCtrlPage.class, "条码扫描仪"), new Menu(PrinterDebugPage.class, "打印机"), new Menu(OptScannerCtrlPage.class, "光学模组") @@ -149,6 +147,21 @@ public class ExtApiPageGroupCfgMgr { pushMenu(new Menu("高级应用", ZList.of( + new Menu("硬件测试", ZList.of( + new Menu(SubBoardProberPage.class, "子板探测"), + new Menu(SubModuleVersionPreviewPage.class, "全部子模块版本预览"), + new Menu(A8kSubModuleRegAndConfigInitPage.class, "子模块初始化"), + new Menu(InputIOStateHardwareTestPage.class, "通用光电状态查看"), + new Menu(MotorPPSHardwareTestPage.class, "步进电机光电校验"), + new Menu(OutputIOCtrlTestPage.class, "输出IO控制"), + new Menu(MotorHardwareTestPage.class, "步进电机测试"), + new Menu(MiniServoHardwareTestPage.class, "舵机测试"), + new Menu(HBotHardwareTestPage.class, "HBOT测试"), + new Menu(WaterTempControllerTestPage.class, "控温系统测试"), + new Menu(PipetteGunHardwareTestPage.class, "移液枪硬件测试"), + new Menu(CodeScannerDriverCtrlPage.class, "扫码枪测试"), + new Menu(ICCardReaderTestPage.class, "ID卡测试") + )), new Menu("光学标定与验证", ZList.of( new Menu(A8kOptVerification.class, "光学模组验证"), @@ -191,7 +204,7 @@ public class ExtApiPageGroupCfgMgr { new Menu(VirtualEventGeneratorPage.class, "虚拟事件生成"), new Menu(IDCardDataGeneratorPage.class, "ID卡数据生成器"), new Menu(VirtualReportModeOperationPage.class, "虚拟报告模式操作") - )), + )), new Menu(UsrOperationSimulationPage.class, "用户行为模拟器"), new Menu(CodeGeneratorPage.class, "条码字符生成工具") ))); diff --git a/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java b/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java deleted file mode 100644 index b12b94c..0000000 --- a/src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java +++ /dev/null @@ -1,73 +0,0 @@ -package a8k.extui.page.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.CodeScanerDriver; -import a8k.extui.mgr.ExtApiPageMgr; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class CodeScanerDriverCtrlPage { - - - final private ExtApiPageMgr extApiPageMgr; - final private CodeScanerDriver codeScanerDriver; - - public String pipetteModCodeScannerScanCode() throws AppException { - var ret = codeScanerDriver.pipetteModCodeScannerScanCode(10 * 1000); - if (ret == null || ret.isEmpty()) { - return "null"; - } - return ret; - } - - public void pipetteGunStartScan() throws AppException { - codeScanerDriver.pipetteModCodeScannerStartScan(); - } - - public void pipetteGunStopScan() throws AppException { - codeScanerDriver.pipetteModCodeScannerStopScan(); - } - - public String feedingModScannerModCodeScannerScanCode() { - var ret = codeScanerDriver.feedingModScannerModCodeScannerScanCode(10 * 1000); - if (ret == null || ret.isEmpty()) { - return "null"; - } - return ret; - } - - public void codeScannerStressTest(Integer repeatCnt, Integer timeout) throws AppException { - for (int i = 0; i < repeatCnt; i++) { - codeScanerDriver.feedingModScannerModCodeScannerScanCode( timeout * 1000); - } - } - - public void feedingModScannerModCodeScannerStartScan() throws AppException { - codeScanerDriver.feedingModScannerModCodeScannerStartScan(); - } - - public void feedingModScannerModCodeScannerStopScan() throws AppException { - codeScanerDriver.feedingModScannerModCodeScannerStopScan(); - } - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("Z轴扫码器"); - page.addFunction("扫码(阻塞)", this::pipetteModCodeScannerScanCode); - page.addFunction("扫码开始", this::pipetteGunStartScan); - page.addFunction("扫码停止", this::pipetteGunStopScan); - page.addFunction("压力测试", this::codeScannerStressTest); - - page.newGroup("进出料扫描"); - page.addFunction("扫码(阻塞)", this::feedingModScannerModCodeScannerScanCode); - page.addFunction("扫码开始", this::feedingModScannerModCodeScannerStartScan); - page.addFunction("扫码停止", this::feedingModScannerModCodeScannerStopScan); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/driver/CodeScannerDriverCtrlPage.java b/src/main/java/a8k/extui/page/driver/CodeScannerDriverCtrlPage.java new file mode 100644 index 0000000..d9d86dc --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/CodeScannerDriverCtrlPage.java @@ -0,0 +1,68 @@ +package a8k.extui.page.driver; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.CodeScanerDriver; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CodeScannerDriverCtrlPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private CodeScanerDriver codeScanerDriver; + + public String pipetteModCodeScannerScanCode() throws AppException { + var ret = codeScanerDriver.pipetteModCodeScannerScanCode(10 * 1000); + if (ret == null || ret.isEmpty()) { + return "null"; + } + return ret; + } + + public void pipetteGunStartScan() throws AppException { + codeScanerDriver.pipetteModCodeScannerStartScan(); + } + + public void pipetteGunStopScan() throws AppException { + codeScanerDriver.pipetteModCodeScannerStopScan(); + } + + public String feedingModScannerModCodeScannerScanCode() { + var ret = codeScanerDriver.feedingModScannerModCodeScannerScanCode(10 * 1000); + if (ret == null || ret.isEmpty()) { + return "null"; + } + return ret; + } + + + + public void feedingModScannerModCodeScannerStartScan() throws AppException { + codeScanerDriver.feedingModScannerModCodeScannerStartScan(); + } + + public void feedingModScannerModCodeScannerStopScan() throws AppException { + codeScanerDriver.feedingModScannerModCodeScannerStopScan(); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("Z轴扫码器"); + page.addFunction("扫码(阻塞)", this::pipetteModCodeScannerScanCode); + page.addFunction("扫码开始", this::pipetteGunStartScan); + page.addFunction("扫码停止", this::pipetteGunStopScan); + + page.newGroup("进出料扫描"); + page.addFunction("扫码(阻塞)", this::feedingModScannerModCodeScannerScanCode); + page.addFunction("扫码开始", this::feedingModScannerModCodeScannerStartScan); + page.addFunction("扫码停止", this::feedingModScannerModCodeScannerStopScan); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java b/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java deleted file mode 100644 index 520fe67..0000000 --- a/src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java +++ /dev/null @@ -1,88 +0,0 @@ -package a8k.extui.page.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.driver.InputDetectDriver; -import a8k.app.hardware.type.InputIOId; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class InputIOStateScannerPage { - - - final private ExtApiPageMgr extApiPageMgr; - final private InputDetectDriver inputDetectDriver; - - // @ExtApiStatu(name = "", group = "输入光电状态", order = 5) - // public Object getIOState() throws AppException { - // a8kCanBusService.getIOState(IOId.PusherMZeroPPS); - // ZJsonNode node = new ZJsonNode(); - // node.get("Input-IO").setAsArray(); - // - // for (IOId ioId : IOId.values()) { - // ZJsonNode iostate = new ZJsonNode(); - // iostate.get("chname").set(ioId.chname); - // iostate.get("value").set(a8kCanBusService.getIOState(ioId)); - // node.get("Input-IO").push(iostate); - // } - // return node.get(); - // } - - @ExtApiStatu(name = "入料平移通道-试管高低检测IO", order = 1) - public Boolean getTubeHeightPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeHeightPPS);} - - @ExtApiStatu(name = "入料平移通道-试管有无光电", order = 2) - public Boolean getTubeExistPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeExistPPS);} - - @ExtApiStatu(name = "入料平移通道-外光电", order = 3) - public Boolean getTHChOuterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChOuterPPS);} - - @ExtApiStatu(name = "入料平移通道-内光电", order = 4) - public Boolean getTHChInterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChInterPPS);} - - @ExtApiStatu(name = "入料区有无光电", order = 5) - public Boolean getInfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.InfeedPPS);} - - @ExtApiStatu(name = "出料位有无检测", order = 6) - public Boolean getOutfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.OutfeedPPS);} - - @ExtApiStatu(name = "废料仓满溢检测", order = 7) - public Boolean getRecycleBinOverflowPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinOverflowPPS);} - - @ExtApiStatu(name = "板夹仓-仓门光电", order = 8) - public Boolean getPlateBoxCoverClosurePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS);} - - @ExtApiStatu(name = "板夹仓-卡板光电", order = 9) - public Boolean getPlateBoxPlateStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateInletStuckPPS);} - - @ExtApiStatu(name = "光学模组-拉杆电机-零点光电", order = 10) - public Boolean getPullerMZeroPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PullerMZeroPPS);} - - @ExtApiStatu(name = "光学模组-拉杆电机-限位光电", order = 11) - public Boolean getPullerMEndPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PullerMEndPPS);} - - @ExtApiStatu(name = "推杆电机-零点光电", order = 12) - public Boolean getPusherMZeroPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PusherMZeroPPS);} - - @ExtApiStatu(name = "推杆电机-终点光电", order = 13) - public Boolean getPusherMEndPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PusherMEndPPS);} - - // RecycleBinInPlacePPS - //OptModulePlateStuckPPS - - @ExtApiStatu(name = "光学模组-板卡光电", order = 14) - public Boolean getOptModulePlateStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateOutletStuckPPS);} - - @ExtApiStatu(name = "废料仓-到位", order = 15) - public Boolean getRecycleBinInPlacePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinInPlacePPS);} - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java b/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java deleted file mode 100644 index 2b5d075..0000000 --- a/src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java +++ /dev/null @@ -1,282 +0,0 @@ -package a8k.extui.page.driver; - -import a8k.app.type.exception.AppException; -import a8k.app.hardware.channel.A8kCanBusService; -import a8k.app.hardware.type.MId; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class LowLevelBoardVersionPreviewPage { - - - @Resource - ExtApiPageMgr extApiPageMgr; - - @Resource - A8kCanBusService canBus; - - public static class VersionInfo { - public Integer moduleId; - public String moduleName; - public Boolean online; - public String moduleType; - public Integer version; - } - - Map versionInfos = new HashMap<>(); - // HbotBoard(10, "机械臂板模块"),// - // HbotM(11, "机械臂XY"),// - // PlatesBoxBoard(20, "板夹仓模块"),// - // PlatesBoxYM(21, "板夹仓移动电机"),// - // PlatesBoxPusherM(22, "板夹仓推杆电机"),// - // PlatesBoxScanner(23, "板夹仓扫码模组"),// - // ShakeModBoard(30, "摇匀模组板"),// - // ShakeModClampingM(31, "试管固定夹爪电机"),// - // ShakeModGripperZM(32, "摇匀升降电机"),// - // ShakeModShakeM(33, "试管摇匀电机"),// - // ShakeModGripperYSV(34, "摇匀前后移动舵机"),// - // ShakeModGripperSV(35, "摇匀试管帽夹爪舵机"),// - // ShakeModTubeScanerClampingSV(36, "试管架扫码夹紧舵机"),// - // ShakeModTubeScanerRotateSV(37, "试管架旋转舵机"),// - // PlatesBoxTCMBoard(40, "反应板夹温度控制板"),// - // PlatesBoxTCM(41, "反应板夹温度控制模块"),// - // WbTubeFanMod(42, "气溶胶风扇"),// - // IncubatorTCMBoard(50, "温度控制"),// - // IncubatorTCM(51, "温度控制"),// - // FeedingModBoard(60, "出入料模块"),// - // FeedingModInfeedM(61, "入料电机"),// - // FeedingModXM(62, "试管架平移电机"),// - // FeedingModOutfeedM(63, "出料电机"),// - // FeedingModScannerMod(64, "试管架扫码器"),// - // IncubatorRotateBoard(70, "孵育盘旋转板"),// - // IncubatorRotateCtrlM(71, "孵育盘旋转"),// - // PipetteModBoard(80, "机械臂Z轴板"),// - // PipetteMod(82, "移液枪"),// - // PipetteModCodeScanner(83, "物料扫码器"),// - // OptModBoard(90, "光学模组板"),// - // OptModScannerM(91, "板卡扫描电机"),// - // OptModPullM(92, "板卡推杆电机"),// - // OptMod(93, "扫描仪"),// - // A8kIdCardReaderBoard(100, "A8K读卡器板"),// - // A8kIdCardReader(101, "A8K读卡器"),// - - @ExtApiStatu(name = "", group = "机械臂板模块", order = 1) - public VersionInfo getHbotBoard() { - return versionInfos.get(MId.HbotBoard); - } - - @ExtApiStatu(name = "", group = "机械臂XY", order = 2) - public VersionInfo getHbotM() { - return versionInfos.get(MId.HbotM); - } - - @ExtApiStatu(name = "", group = "板夹仓模块", order = 3) - public VersionInfo getPlatesBoxBoard() { - return versionInfos.get(MId.PlatesBoxBoard); - } - - @ExtApiStatu(name = "", group = "板夹仓移动电机", order = 4) - public VersionInfo getPlatesBoxYM() { - return versionInfos.get(MId.PlatesBoxYM); - } - - @ExtApiStatu(name = "", group = "板夹仓推杆电机", order = 5) - public VersionInfo getPlatesBoxPusherM() { - return versionInfos.get(MId.PlatesBoxPusherM); - } - - @ExtApiStatu(name = "", group = "板夹仓扫码模组", order = 6) - public VersionInfo getPlatesBoxScanner() { - return versionInfos.get(MId.PlatesBoxScanner); - } - - @ExtApiStatu(name = "", group = "摇匀模组板", order = 7) - public VersionInfo getShakeModBoard() { - return versionInfos.get(MId.ShakeModBoard); - } - - @ExtApiStatu(name = "", group = "试管固定夹爪电机", order = 8) - public VersionInfo getShakeModClampingM() { - return versionInfos.get(MId.ShakeModClampingM); - } - - @ExtApiStatu(name = "", group = "摇匀升降电机", order = 9) - public VersionInfo getShakeModGripperZM() { - return versionInfos.get(MId.ShakeModGripperZM); - } - - @ExtApiStatu(name = "", group = "试管摇匀电机", order = 10) - public VersionInfo getShakeModShakeM() { - return versionInfos.get(MId.ShakeModShakeM); - } - - @ExtApiStatu(name = "", group = "摇匀前后移动舵机", order = 11) - public VersionInfo getShakeModGripperYSV() { - return versionInfos.get(MId.ShakeModGripperYSV); - } - - @ExtApiStatu(name = "", group = "摇匀试管帽夹爪舵机", order = 12) - public VersionInfo getShakeModGripperSV() { - return versionInfos.get(MId.ShakeModGripperSV); - } - - @ExtApiStatu(name = "", group = "试管架扫码夹紧舵机", order = 13) - public VersionInfo getShakeModTubeScanerClampingSV() { - return versionInfos.get(MId.ShakeModTubeScanerClampingSV); - } - - @ExtApiStatu(name = "", group = "试管架旋转舵机", order = 14) - public VersionInfo getShakeModTubeScanerRotateSV() { - return versionInfos.get(MId.ShakeModTubeScanerRotateSV); - } - - @ExtApiStatu(name = "", group = "反应板夹温度控板", order = 15) - public VersionInfo getPlatesBoxTCMBoard() { - return versionInfos.get(MId.PlatesBoxTCMBoard); - } - - @ExtApiStatu(name = "", group = "反应板夹温度控制模块", order = 16) - public VersionInfo getPlatesBoxTCM() { - return versionInfos.get(MId.PlatesBoxTCM); - } - - @ExtApiStatu(name = "", group = "气溶胶风扇", order = 17) - public VersionInfo getWbTubeFanMod() { - return versionInfos.get(MId.WbTubeFanMod); - } - - @ExtApiStatu(name = "", group = "孵育盘温空板", order = 18) - public VersionInfo getIncubatorTCMBoard() { - return versionInfos.get(MId.IncubatorTCMBoard); - } - - @ExtApiStatu(name = "", group = "孵育盘温控模块", order = 19) - public VersionInfo getIncubatorTCM() { - return versionInfos.get(MId.IncubatorTCM); - } - - @ExtApiStatu(name = "", group = "出入料模块", order = 20) - public VersionInfo getFeedingModBoard() { - return versionInfos.get(MId.FeedingModBoard); - } - - @ExtApiStatu(name = "", group = "入料电机", order = 21) - public VersionInfo getFeedingModInfeedM() { - return versionInfos.get(MId.FeedingModInfeedM); - } - - @ExtApiStatu(name = "", group = "试管架平移电机", order = 22) - public VersionInfo getFeedingModXM() { - return versionInfos.get(MId.FeedingModXM); - } - - @ExtApiStatu(name = "", group = "出料电机", order = 23) - public VersionInfo getFeedingModOutfeedM() { - return versionInfos.get(MId.FeedingModOutfeedM); - } - - @ExtApiStatu(name = "", group = "试管架扫码器", order = 24) - public VersionInfo getFeedingModScannerMod() { - return versionInfos.get(MId.FeedingModScannerMod); - } - - @ExtApiStatu(name = "", group = "孵育盘旋转板", order = 25) - public VersionInfo getIncubatorRotateBoard() { - return versionInfos.get(MId.IncubatorRotateBoard); - } - - @ExtApiStatu(name = "", group = "孵育盘旋转", order = 26) - public VersionInfo getIncubatorRotateCtrlM() { - return versionInfos.get(MId.IncubatorRotateCtrlM); - } - - @ExtApiStatu(name = "", group = "机械臂Z轴板", order = 27) - public VersionInfo getPipetteModBoard() { - return versionInfos.get(MId.PipetteModBoard); - } - - @ExtApiStatu(name = "", group = "移液枪", order = 28) - public VersionInfo getPipetteMod() { -// return versionInfos.get(MId.PipetteMod); - return new VersionInfo(); - } - - @ExtApiStatu(name = "", group = "物料扫码器", order = 29) - public VersionInfo getPipetteModCodeScanner() { - return versionInfos.get(MId.PipetteModCodeScanner); - } - - @ExtApiStatu(name = "", group = "光学模组板", order = 30) - public VersionInfo getOptModBoard() { - return versionInfos.get(MId.OptModBoard); - } - - @ExtApiStatu(name = "", group = "板卡扫描电机", order = 31) - public VersionInfo getOptModScannerM() { - return versionInfos.get(MId.OptModScannerM); - } - - @ExtApiStatu(name = "", group = "板卡推杆电机", order = 32) - public VersionInfo getOptModPullM() { - return versionInfos.get(MId.OptModPullM); - } - - @ExtApiStatu(name = "", group = "扫描仪", order = 33) - public VersionInfo getOptMod() { - return versionInfos.get(MId.OptMod); - } - - @ExtApiStatu(name = "", group = "A8K读卡器板", order = 34) - public VersionInfo getA8kIdCardReaderBoard() { - return versionInfos.get(MId.A8kIdCardReaderBoard); - } - - @ExtApiStatu(name = "", group = "A8K读卡器", order = 35) - public VersionInfo getA8kIdCardReader() { - return versionInfos.get(MId.A8kIdCardReader); - } - - public void refreshBoardState() { - var modules = MId.values(); - for (var module : modules) { - if (module == MId.NotSet) { - continue; - } - try { - Integer version = canBus.moduleReadVersion(module); - String modueType = canBus.moduleReadType(module).toString(); - - VersionInfo info = new VersionInfo(); - info.online = true; - info.moduleType = modueType; - info.moduleId = module.index; - info.moduleName = module.chname; - info.version = version; - versionInfos.put(module, info); - - } catch (AppException e) { - VersionInfo info = new VersionInfo(); - info.online = false; - info.moduleId = module.index; - info.moduleName = module.chname; - versionInfos.put(module, info); - } - } - } - - - @PostConstruct - void init() { - var page = extApiPageMgr.newPage(this); - page.addFunction("刷新", this::refreshBoardState); - extApiPageMgr.addPage(page); - } - -} diff --git a/src/main/java/a8k/extui/page/extapp/profession_test/P02A8kTemperaturaVerfication.java b/src/main/java/a8k/extui/page/extapp/profession_test/P02A8kTemperaturaVerfication.java index c3fa717..77fb7b8 100644 --- a/src/main/java/a8k/extui/page/extapp/profession_test/P02A8kTemperaturaVerfication.java +++ b/src/main/java/a8k/extui/page/extapp/profession_test/P02A8kTemperaturaVerfication.java @@ -1,6 +1,6 @@ package a8k.extui.page.extapp; -import a8k.app.hardware.driver.TemperatureControlDriver; +import a8k.app.hardware.driver.WaterTemperatureControllerDriver; import a8k.app.service.background.TemperatureCtrlService; import a8k.app.service.param.misc.TemperatureCtrlParamMgr; import a8k.app.type.exception.AppException; @@ -28,11 +28,11 @@ public class P02A8kTemperaturaVerfication { ExtApiPageMgr extApiPageMgr; @Resource - TemperatureCtrlService temperatureCtrlService; + TemperatureCtrlService temperatureCtrlService; @Resource - TemperatureControlDriver temperatureControlDriver; + WaterTemperatureControllerDriver waterTemperatureControllerDriver; @Resource - TemperatureCtrlParamMgr temperatureCtrlParamMgr; + TemperatureCtrlParamMgr temperatureCtrlParamMgr; List incubateBoxTemperatureCurve = new ArrayList<>(); @@ -118,13 +118,13 @@ public class P02A8kTemperaturaVerfication { try { Thread.sleep(2000); hasStartedTimeMS += 2000; - incubateBoxTemperatureCache = temperatureControlDriver.readIncubateBoxTemperature(); - plateBoxTemperatureCache = temperatureControlDriver.readPlateBoxTemperature(); + incubateBoxTemperatureCache = waterTemperatureControllerDriver.readIncubateBoxTemperature(); + plateBoxTemperatureCache = waterTemperatureControllerDriver.readPlateBoxTemperature(); addIncubateBoxTemperatureCurve(incubateBoxTemperatureCache); addPlateBoxTemperatureCurve(plateBoxTemperatureCache); log.info("孵育盘[ 温度:{} PWM:{} ], 板夹仓[ 温度:{} PWM:{} ]", - incubateBoxTemperatureCache, temperatureControlDriver.readIncubateBoxPWMOutput(), - plateBoxTemperatureCache, temperatureControlDriver.readPlateBoxPWMOutput()); + incubateBoxTemperatureCache, waterTemperatureControllerDriver.readIncubateBoxPWMOutput(), + plateBoxTemperatureCache, waterTemperatureControllerDriver.readPlateBoxPWMOutput()); } catch (InterruptedException ignored) { break; } catch (Exception e) { diff --git a/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleConfigDebugPage.java b/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleConfigDebugPage.java deleted file mode 100644 index 1bfc6d8..0000000 --- a/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleConfigDebugPage.java +++ /dev/null @@ -1,55 +0,0 @@ -package a8k.extui.page.extsetting.db; - -import a8k.app.controler.filemgr.StorageControler; -import a8k.app.hardware.channel.A8kCanBusService; -import a8k.app.service.data.SubModuleConfigService; -import a8k.app.type.exception.AppException; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import a8k.extui.type.param.ExtUIFile; -import a8k.extui.type.ret.FileToBeDownload; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class A8kSubModuleConfigDebugPage { - - private final ExtApiPageMgr extApiPageMgr; - private final A8kCanBusService canBus; - private final SubModuleConfigService subModuleConfigService; - - public FileToBeDownload export() { - subModuleConfigService.export(); - return new FileToBeDownload(StorageControler.getDoloadPath(subModuleConfigService.getExportPath())); - } - - public void syncFromMirco() throws AppException { - subModuleConfigService.syncFromMirco(); - } - - public void syncToMirco() throws AppException { - subModuleConfigService.syncToMirco(); - } - - public void importFromCSV(ExtUIFile file) { - String filecontent = new String(file.bytes); - subModuleConfigService.importFromCSV(filecontent); - } - - @PostConstruct - void init() { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.newGroup("sync"); - page.addFunction("syncFromMirco", this::syncFromMirco); - page.addFunction("syncToMirco", this::syncToMirco); - - page.newGroup("导入/导出"); - page.addFunction("导出", this::export); - page.addFunction("导入", this::importFromCSV); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleParameterInitDebugPage.java b/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleParameterInitDebugPage.java deleted file mode 100644 index 8d571eb..0000000 --- a/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleParameterInitDebugPage.java +++ /dev/null @@ -1,65 +0,0 @@ -package a8k.extui.page.extsetting.db; - -import a8k.app.type.exception.AppException; -import a8k.app.controler.filemgr.StorageControler; -import a8k.app.dao.type.db.SubModuleRegInitialValue; -import a8k.app.hardware.channel.A8kCanBusService; -import a8k.app.hardware.type.MId; -import a8k.app.service.data.SubModuleRegInitialValueMgrService; -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtUIPageCfg; -import a8k.extui.type.ExtUiTable; -import a8k.extui.type.param.ExtUIFile; -import a8k.extui.type.ret.FileToBeDownload; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class A8kSubModuleParameterInitDebugPage { - - private final ExtApiPageMgr extApiPageMgr; - private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; - private final A8kCanBusService canBus; - - public FileToBeDownload export() { - subModuleRegInitialValueMgrService.export(); - return new FileToBeDownload(StorageControler.getDoloadPath(subModuleRegInitialValueMgrService.getExportPath())); - } - - public ExtUiTable getDeviceActionParam() { - return new ExtUiTable(SubModuleRegInitialValue.class, subModuleRegInitialValueMgrService.getAll()); - } - - public ExtUiTable syncFromMirco() throws AppException { - subModuleRegInitialValueMgrService.syncFromMirco(); - return getDeviceActionParam(); - } - - public void importDeviceActionParam(ExtUIFile file) { - String filecontent = new String(file.bytes); - subModuleRegInitialValueMgrService.importFromCSV(filecontent); - } - - public void tmp() throws AppException { - while (true) { - canBus.moduleReadVersion(MId.A8kIdCardReaderBoard); - - } - } - - @PostConstruct - void init() { - ExtUIPageCfg page = new ExtUIPageCfg(this); - page.newGroup("sync"); - page.addFunction("syncFromMirco", this::syncFromMirco); - page.addFunction("tmp", this::tmp); - page.newGroup("导入/导出"); - page.addFunction("导出", this::export); - page.addFunction("导入", this::importDeviceActionParam); - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleRegAndConfigSyncPage.java b/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleRegAndConfigSyncPage.java new file mode 100644 index 0000000..c584a05 --- /dev/null +++ b/src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleRegAndConfigSyncPage.java @@ -0,0 +1,70 @@ +package a8k.extui.page.extsetting.db; + +import a8k.app.controler.filemgr.StorageControler; +import a8k.app.hardware.channel.A8kCanBusService; +import a8k.app.service.data.SubModuleConfigService; +import a8k.app.service.data.SubModuleRegInitialValueMgrService; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import a8k.extui.type.param.ExtUIFile; +import a8k.extui.type.ret.FileToBeDownload; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class A8kSubModuleRegAndConfigSyncPage { + + private final ExtApiPageMgr extApiPageMgr; + private final A8kCanBusService canBus; + private final SubModuleConfigService subModuleConfigService; + private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; + + + public void syncFromMirco() throws AppException { + subModuleConfigService.syncFromMirco(); + subModuleRegInitialValueMgrService.syncFromMirco(); + } + + public void syncToMirco() throws AppException { + subModuleConfigService.syncToMirco(); + subModuleRegInitialValueMgrService.syncToMirco(); + } + + public FileToBeDownload exportConfig() { + subModuleConfigService.export(); + return new FileToBeDownload(StorageControler.getDoloadPath(subModuleConfigService.getExportPath())); + } + + public FileToBeDownload exportRegInitVal() { + subModuleRegInitialValueMgrService.export(); + return new FileToBeDownload(StorageControler.getDoloadPath(subModuleRegInitialValueMgrService.getExportPath())); + } + + public void importConfigValFromCSV(ExtUIFile file) { + subModuleConfigService.importFromCSV(new String(file.bytes)); + } + + public void importRegValFromCSV(ExtUIFile file) { + subModuleConfigService.importFromCSV(new String(file.bytes)); + } + + @PostConstruct + void init() { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.newGroup("同步"); + page.addFunction("SyncFromMircoToDB", this::syncFromMirco); + page.addFunction("syncFromDBToMirco", this::syncToMirco); + + page.newGroup("导入/导出"); + page.addFunction("导出寄存器初始化配置", this::exportRegInitVal); + page.addFunction("导入寄存器初始化配置", this::importRegValFromCSV); + page.addFunction("导出子模块配置", this::exportConfig); + page.addFunction("导入子模块配置", this::importConfigValFromCSV); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java b/src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java new file mode 100644 index 0000000..e8e3782 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java @@ -0,0 +1,38 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.controler.filemgr.StorageControler; +import a8k.app.hardware.channel.A8kCanBusService; +import a8k.app.service.data.SubModuleConfigService; +import a8k.app.service.data.SubModuleRegInitialValueMgrService; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import a8k.extui.type.param.ExtUIFile; +import a8k.extui.type.ret.FileToBeDownload; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class A8kSubModuleRegAndConfigInitPage { + + private final ExtApiPageMgr extApiPageMgr; + private final SubModuleConfigService subModuleConfigService; + private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; + + + public void syncToMirco() throws AppException { + subModuleConfigService.syncToMirco(); + subModuleRegInitialValueMgrService.syncToMirco(); + } + + @PostConstruct + void init() { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.addFunction("initSubBoard", this::syncToMirco); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java new file mode 100644 index 0000000..d8f8ae7 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java @@ -0,0 +1,100 @@ +package a8k.extui.page.hardwaretest; + +import a8k.OS; +import a8k.app.hardware.driver.HbotDriver; +import a8k.app.hardware.driver.PipetteCtrlDriverV2; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import cn.hutool.core.text.StrBuilder; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class HBotHardwareTestPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final HbotDriver hbotDriver; + private final PipetteCtrlDriverV2 pipetteCtrlDriver; + + public void disableHbot() throws AppException { + hbotDriver.enable(0); + } + + public void enableHbot() throws AppException { + hbotDriver.enable(1); + } + + public void leftMotorMoveClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(-step, 0); + } + + public void leftMotorMoveCounterClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(step, 0); + } + + public void rightMotorMoveClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(0, -step); + } + + public void rightMotorMoveCounterClockwise(Integer step) throws AppException { + hbotDriver.enable(1); + hbotDriver.moveByDirectBlock(0, step); + } + + + public String checkMotorEncoder(Integer step) throws AppException { + hbotDriver.enable(1); + Integer[] encPos = hbotDriver.readEncDirect(); + hbotDriver.moveByDirectBlock(step, step); + Integer[] afterRunEncPos = hbotDriver.readEncDirect(); + + StrBuilder report = new StrBuilder(); + report.append(String.format("左电机: 实际运行:%d 编码器:%d", step, afterRunEncPos[0] - encPos[0])); + report.append(String.format("右电机: 实际运行:%d 编码器:%d", step, afterRunEncPos[1] - encPos[1])); + return report.toString(); + } + + @ExtApiStatu(name = "", group = "左光电状态", order = 1) + public Boolean getLeftPpsState() { + try { + return hbotDriver.readInIO(0); + } catch (AppException e) { + return false; + } + } + + @ExtApiStatu(name = "", group = "右光电状态", order = 2) + public Boolean getRightPpsState() { + try { + return hbotDriver.readInIO(1); + } catch (AppException e) { + return false; + } + } + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("基础"); + page.addFunction("使能", this::enableHbot); + page.addFunction("失能", this::disableHbot); + page.newGroup("电机测试"); + page.addFunction("左电机顺时针移动(900约等于1/8圈)", this::leftMotorMoveClockwise).setParamVal("step", () -> 900); + page.addFunction("左电机逆时针移动", this::leftMotorMoveCounterClockwise).setParamVal("step", () -> 900); + page.addFunction("右电机顺时针移动", this::rightMotorMoveClockwise).setParamVal("step", () -> 900); + page.addFunction("右电机逆时针移动", this::rightMotorMoveCounterClockwise).setParamVal("step", () -> 900); + page.newGroup("编码器测试"); + page.addFunction("检查电机编码器", this::checkMotorEncoder).setParamVal("step", () -> 100); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java new file mode 100644 index 0000000..a4da0a2 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java @@ -0,0 +1,36 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.dao.type.db.ProjExtInfoCard; +import a8k.app.service.background.ProjIDCardCtrlAndMonitorService; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class ICCardReaderTestPage { + private final ExtApiPageMgr extApiPageMgr; + private final ProjIDCardCtrlAndMonitorService projIDCardCtrlAndMonitorService; + + public void xxxx() { + + } + + public ProjExtInfoCard readProjExtInfoCard() { + return projIDCardCtrlAndMonitorService.getMountedIdCardInfo(); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("插入卡和拔卡都会正常情况都会弹窗", this::xxxx); + page.addFunction("读取当前挂载卡的内容", this::readProjExtInfoCard); + extApiPageMgr.addPage(page); + + } + + +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java new file mode 100644 index 0000000..5f21520 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java @@ -0,0 +1,55 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.driver.InputDetectDriver; +import a8k.app.hardware.type.InputIOId; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class InputIOStateHardwareTestPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private InputDetectDriver inputDetectDriver; + + @ExtApiStatu(name = "入料平移通道-试管高低检测IO", order = 1) + public Boolean getTubeHeightPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeHeightPPS);} + + @ExtApiStatu(name = "入料平移通道-试管有无光电", order = 2) + public Boolean getTubeExistPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.TubeExistPPS);} + + @ExtApiStatu(name = "入料平移通道-外光电", order = 3) + public Boolean getTHChOuterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChOuterPPS);} + + @ExtApiStatu(name = "入料平移通道-内光电", order = 4) + public Boolean getTHChInterPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.THChInterPPS);} + + @ExtApiStatu(name = "入料区有无光电", order = 5) + public Boolean getInfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.InfeedPPS);} + + @ExtApiStatu(name = "出料位有无检测", order = 6) + public Boolean getOutfeedPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.OutfeedPPS);} + + @ExtApiStatu(name = "废料仓满溢检测", order = 7) + public Boolean getRecycleBinOverflowPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinOverflowPPS);} + + @ExtApiStatu(name = "板夹仓-仓门光电", order = 8) + public Boolean getPlateBoxCoverClosurePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.PlateBoxCoverClosurePPS);} + + @ExtApiStatu(name = "板夹仓-卡板光电", order = 9) + public Boolean getPlateBoxPlateStuckPPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.IncubationPlateInletStuckPPS);} + + @ExtApiStatu(name = "废料仓-到位", order = 15) + public Boolean getRecycleBinInPlacePPS() throws AppException {return inputDetectDriver.getIOState(InputIOId.RecycleBinInPlacePPS);} + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java new file mode 100644 index 0000000..a468bda --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java @@ -0,0 +1,164 @@ +package a8k.extui.page.hardwaretest; + + +import a8k.app.constant.MiniServoConstant; +import a8k.app.hardware.driver.MiniServoDriver; +import a8k.app.hardware.type.MiniServoMId; +import a8k.app.service.mainctrl.AppDeviceInitCtrlService; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MiniServoHardwareTestPage { + + final private MiniServoDriver miniServoDriver; + final private AppDeviceInitCtrlService appDeviceInitCtrlService; + private final ExtApiPageMgr extApiPageMgr; + ExtUIPageCfg pageConfig; + + public void disableAllServos() throws AppException { + appDeviceInitCtrlService.disableAllMiniServo(); + } + + public void enableAllServos() throws AppException { + appDeviceInitCtrlService.enableAllMiniServo(); + } + + public Integer readPos(MiniServoMId id) { + try { + return miniServoDriver.miniServoReadPos(id); + } catch (AppException e) { + log.error("readPos error for {}", id, e); + return 0; + } + } + + public void regBasicFunctions() { + pageConfig.newGroup("基本功能"); + pageConfig.addFunction("使能所有舵机", this::enableAllServos); + pageConfig.addFunction("禁用所有舵机", this::disableAllServos); + } + + // ShakeModTubeScanerRotateSV + public void shakeModTubeScannerRotateSVRotateClockwise() throws AppException { + miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, -300); + } + + public void shakeModTubeScannerRotateSVRotateCounterClockwise() throws AppException { + miniServoDriver.miniServoRotateWithTorque(MiniServoMId.ShakeModTubeScanerRotateSV, 300); + } + + public void shakeModTubeScannerRotateSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerRotateSV); + } + + public void registerShakeModTubeScannerRotateSV() { + pageConfig.newGroup("扫码旋转舵机"); + pageConfig.addFunction("顺时针转动", this::shakeModTubeScannerRotateSVRotateClockwise); + pageConfig.addFunction("逆时针转动", this::shakeModTubeScannerRotateSVRotateCounterClockwise); + pageConfig.addFunction("停止转动", this::shakeModTubeScannerRotateSVStop); + } + + // ShakeModTubeScanerClampingSV + public void shakeModTubeScannerClampingSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModTubeScanerClampingSV, step); + } + + public Integer shakeModTubeScannerClampingSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + public void shakeModTubeScannerClampingSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + public void registerShakeModTubeScannerClampingSV() { + pageConfig.newGroup("扫码夹紧舵机"); + pageConfig.addFunction("移动到", this::shakeModTubeScannerClampingSVMoveTo) + .setParamVal("step", () ->readPos(MiniServoMId.ShakeModTubeScanerClampingSV)); + pageConfig.addFunction("读取位置", this::shakeModTubeScannerClampingSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModTubeScannerClampingSVStop); + } + + // ShakeModGripperYSV(MId.ShakeModGripperYSV),// + public void shakeModGripperYSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperYSV, step); + } + + public Integer shakeModGripperYSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); + } + + public void shakeModGripperYSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModGripperYSV); + } + + public void registerShakeModGripperYSV() { + pageConfig.newGroup("摇匀模组-前后移动舵机"); + pageConfig.addFunction("移动到", this::shakeModGripperYSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModGripperYSV)); + pageConfig.addFunction("读取位置", this::shakeModGripperYSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModGripperYSVStop); + } + + // ShakeModGripperSV(MId.ShakeModGripperSV),// + public void shakeModGripperSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModGripperSV, step); + } + + public Integer shakeModGripperSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); + } + + public void shakeModGripperSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModGripperSV); + } + + public void registerShakeModGripperSV() { + pageConfig.newGroup("摇匀模组-夹爪舵机"); + pageConfig.addFunction("移动到", this::shakeModGripperSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModGripperSV)); + pageConfig.addFunction("读取位置", this::shakeModGripperSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModGripperSVStop); + } + + // ShakeModLiftingSV(MId.ShakeModLiftingSV),// + public void shakeModLiftingSVMoveTo(Integer step) throws AppException { + miniServoDriver.miniServoMoveToBlock(MiniServoMId.ShakeModLiftingSV, step); + } + + public Integer shakeModLiftingSVReadPos() throws AppException { + return miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModLiftingSV); + } + + public void shakeModLiftingSVStop() throws AppException { + miniServoDriver.moduleStop(MiniServoMId.ShakeModLiftingSV); + } + + public void registerShakeModLiftingSV() { + pageConfig.newGroup("摇匀模组-顶升舵机"); + pageConfig.addFunction("移动到", this::shakeModLiftingSVMoveTo) + .setParamVal("step", () -> readPos(MiniServoMId.ShakeModLiftingSV)); + pageConfig.addFunction("读取位置", this::shakeModLiftingSVReadPos); + pageConfig.addFunction("停止转动", this::shakeModLiftingSVStop); + } + + @PostConstruct + void init() { + pageConfig = extApiPageMgr.newPage(this); + regBasicFunctions(); + registerShakeModTubeScannerRotateSV(); + registerShakeModTubeScannerClampingSV(); + registerShakeModGripperYSV(); + registerShakeModGripperSV(); + registerShakeModLiftingSV(); + extApiPageMgr.addPage(pageConfig); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java new file mode 100644 index 0000000..ed0eb05 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java @@ -0,0 +1,23 @@ +package a8k.extui.page.hardwaretest; + + +import a8k.app.hardware.driver.MiniServoDriver; +import a8k.app.service.mainctrl.AppDeviceInitCtrlService; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MiscHardwareTestPage { + final private MiniServoDriver miniServoDriver; + final private AppDeviceInitCtrlService appDeviceInitCtrlService; + final private ExtApiPageMgr extApiPageMgr; + ExtUIPageCfg pageConfig; + + + +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java new file mode 100644 index 0000000..603e28b --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java @@ -0,0 +1,389 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.hardware.driver.StepMotorCtrlDriver; +import a8k.app.hardware.type.StepMotorMId; +import a8k.app.hardware.type.StepMotorRegIndex; +import a8k.app.hardware.type.StepMotorSpeedLevel; +import a8k.app.type.exception.AppException; +import a8k.app.utils.ZJsonNode; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MotorHardwareTestPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final StepMotorCtrlDriver stepMotorCtrlDriver; + + ExtUIPageCfg pageConfig; + + // + // 入料电机 + // + public void infeedMotorIn() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModInfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, -1); + } + + public void infeedMotorOut() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModInfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModInfeedM, 1); + } + + public void infeedMotorStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModInfeedM); + } + + void regFeedingModInfeedM() { + pageConfig.newGroup("入料电机"); + pageConfig.addFunction("向内转动", this::infeedMotorIn); + pageConfig.addFunction("向外转动", this::infeedMotorOut); + pageConfig.addFunction("停止", this::infeedMotorStop); + } + + // + // 出料电机 + // + + public void outfeedMotorIn() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModOutfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, -1); + } + + public void outfeedMotorOut() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModOutfeedM, 1); + stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); + } + + public void outfeedMotorStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModOutfeedM); + } + + void regFeedingModOutfeedM() { + pageConfig.newGroup("出料电机"); + pageConfig.addFunction("向内转动", this::outfeedMotorIn); + pageConfig.addFunction("向外转动", this::outfeedMotorOut); + pageConfig.addFunction("停止", this::outfeedMotorStop); + } + + // + // 入料平移电机 + // + public void feedingModXMFLeft(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, step); + } + + public void feedingModXMRight(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, -step); + } + + public void feedingModXMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.FeedingModXM); + } + + public void feedingModeStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.FeedingModXM); + } + + + void regFeedingModXM() { + pageConfig.newGroup("入料平移电机"); + pageConfig.addFunction("归零", this::feedingModXMZero); + pageConfig.addFunction("向左移动", this::feedingModXMFLeft).setParamVal("step", () -> 30); + pageConfig.addFunction("向右移动", this::feedingModXMRight).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::feedingModeStop); + } + + // + // 摇匀模组 + // + public void shakeModGripperZMUp(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, -step); + } + + public void shakeModGripperZMDown(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModGripperZM, step); + } + + public void shakeModGripperZMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModGripperZM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModGripperZM); + } + + + public void shakeModGripperZMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModGripperZM); + } + + void regShakeModGripperZM() { + pageConfig.newGroup("摇匀模组Z轴"); + pageConfig.addFunction("归零", this::shakeModGripperZMZero); + pageConfig.addFunction("向上移动", this::shakeModGripperZMUp).setParamVal("step", () -> 30); + pageConfig.addFunction("向下移动", this::shakeModGripperZMDown).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::shakeModGripperZMStop); + } + + + public void shakeModClampingMClamping(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, -step); + } + + public void shakeModClampingMRelease(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, step); + } + + public void shakeModClampingMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModClampingM); + } + + + public void shakeModClampingMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModClampingM); + } + + void regShakeModClampingM() { + pageConfig.newGroup("摇匀模组夹紧电机"); + pageConfig.addFunction("归零", this::shakeModClampingMZero); + pageConfig.addFunction("夹紧", this::shakeModClampingMClamping).setParamVal("step", () -> 10); + pageConfig.addFunction("释放", this::shakeModClampingMRelease).setParamVal("step", () -> 10); + pageConfig.addFunction("停止", this::shakeModClampingMStop); + } + + public void shakeModShakeMClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, step); + } + + public void shakeModShakeMAntiClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModShakeM, -step); + } + + public void shakeModShakeMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModShakeM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.ShakeModShakeM); + } + + public void shakeModShakeMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.ShakeModShakeM); + } + + void regShakeModShakeM() { + pageConfig.newGroup("摇匀模组摇匀电机"); + pageConfig.addFunction("归零", this::shakeModShakeMZero); + pageConfig.addFunction("顺时针转动", this::shakeModShakeMClockwise).setParamVal("step", () -> 30); + pageConfig.addFunction("逆时针转动", this::shakeModShakeMAntiClockwise).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::shakeModShakeMStop); + } + + + // + // 板夹仓电机 + // + public void platesBoxYMForward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, step); + } + + public void platesBoxYMBackward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxYM, -step); + } + + public void platesBoxYZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxYM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxYM); + } + + + public void platesBoxYMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.PlatesBoxYM); + } + + void regPlatesBoxYM() { + pageConfig.newGroup("板夹仓Y轴"); + pageConfig.addFunction("归零", this::platesBoxYZero); + pageConfig.addFunction("向内移动", this::platesBoxYMForward).setParamVal("step", () -> 30); + pageConfig.addFunction("向外移动", this::platesBoxYMBackward).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::platesBoxYMStop); + } + + public void platesBoxPusherForward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, step); + } + + public void platesBoxPusherBackward(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.PlatesBoxPusherM, -step); + } + + public void platesBoxPusherZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.PlatesBoxPusherM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM); + } + + + public void platesBoxPusherStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.PlatesBoxPusherM); + } + + void regPlatesBoxPusherM() { + pageConfig.newGroup("板夹仓推料电机"); + pageConfig.addFunction("归零", this::platesBoxPusherZero); + pageConfig.addFunction("推出", this::platesBoxPusherForward).setParamVal("step", () -> 30); + pageConfig.addFunction("返回", this::platesBoxPusherBackward).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::platesBoxPusherStop); + } + + // + // 孵育盘 + // + public String incubatorRotateCtrlMDiagnosticEnc() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + + //失能enc + stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_enable_enc, 0); + Integer beforeRunEncPos = stepMotorCtrlDriver.stepMotorReadEncPos(StepMotorMId.IncubatorRotateCtrlM); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, 200); + Integer afterRunEncPos = stepMotorCtrlDriver.stepMotorReadEncPos(StepMotorMId.IncubatorRotateCtrlM); + stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_enable_enc, 1); + int dpos = afterRunEncPos - beforeRunEncPos; + if (Math.abs(dpos) < 10) { + return String.format("编码器接线异常, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + if (dpos < 0) { + return String.format("编码器方向异常或 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + if (Math.abs(200 - dpos) > 2) { + return String.format("电机导程(减速比)错误, 或者编码器一圈脉冲数错误, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + return String.format("编码器诊断正常, 步进移动距离: %d, 编码器移动距离: %d", 200, dpos); + } + + public void incubatorRotateCtrlMAntiClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, -step); + } + + public void incubatorRotateCtrlMClockwise(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.IncubatorRotateCtrlM, step); + } + + public void incubatorRotateCtrlMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.IncubatorRotateCtrlM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM); + } + + + public void incubatorRotateCtrlMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.IncubatorRotateCtrlM); + } + + void regIncubatorRotateCtrlM() { + pageConfig.newGroup("孵育盘转动电机"); + pageConfig.addFunction("归零", this::incubatorRotateCtrlMZero); + pageConfig.addFunction("逆时针转动", this::incubatorRotateCtrlMAntiClockwise).setParamVal("step", () -> 200); + pageConfig.addFunction("顺时针转动", this::incubatorRotateCtrlMClockwise).setParamVal("step", () -> 200); + pageConfig.addFunction("停止", this::incubatorRotateCtrlMStop); + pageConfig.addFunction("编码器诊断", this::incubatorRotateCtrlMDiagnosticEnc); + } + + + public void optModScannerMLeft(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, step); + } + + public void optModScannerMRight(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModScannerM, -step); + } + + public void optModScannerMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModScannerM, 1); + + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModScannerM); + } + + public void optModScannerMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.OptModScannerM); + } + + void regOptModScannerM() { + pageConfig.newGroup("光学模组扫描电机"); + pageConfig.addFunction("归零", this::optModScannerMZero); + pageConfig.addFunction("向左移动", this::optModScannerMLeft).setParamVal("step", () -> 30); + pageConfig.addFunction("向右移动", this::optModScannerMRight).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::optModScannerMStop); + } + + // + //OptModPullM + // + public void optModPullMLeft(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, -step); + } + + public void optModPullMRight(Integer step) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.OptModPullM, step); + } + + public void optModPullMZero() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.OptModPullM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.OptModPullM); + } + + public void optModPullMStop() throws AppException { + stepMotorCtrlDriver.stepMotorStop(StepMotorMId.OptModPullM); + } + + + void regOptModPullM() { + pageConfig.newGroup("光学模组拉伸电机"); + pageConfig.addFunction("归零", this::optModPullMZero); + pageConfig.addFunction("回零方向移动", this::optModPullMLeft).setParamVal("step", () -> 30); + pageConfig.addFunction("勾取方向移动", this::optModPullMRight).setParamVal("step", () -> 30); + pageConfig.addFunction("停止", this::optModPullMStop); + } + + + @PostConstruct + void init() { + pageConfig = extApiPageMgr.newPage(this); + regFeedingModInfeedM(); + regFeedingModOutfeedM(); + regFeedingModXM(); + regShakeModGripperZM(); + regShakeModClampingM(); + regShakeModShakeM(); + regPlatesBoxYM(); + regPlatesBoxPusherM(); + regIncubatorRotateCtrlM(); + regOptModScannerM(); + regOptModPullM(); + extApiPageMgr.addPage(pageConfig); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java new file mode 100644 index 0000000..c598556 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java @@ -0,0 +1,89 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.hardware.driver.StepMotorCtrlDriver; +import a8k.app.hardware.type.StepMotorMId; +import a8k.app.hardware.type.StepMotorRegIndex; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class MotorPPSHardwareTestPage { + + + private final ExtApiPageMgr extApiPageMgr; + private final StepMotorCtrlDriver stepMotorCtrlDriver; + + ExtUIPageCfg pageConfig; + + // + // 入料平移电机 + // + @ExtApiStatu(name = "", group = "入料平移电机-IO", order = 1, minWidth = "100%") + public String feedingModXMReadIOState() { + return readIOState(StepMotorMId.FeedingModXM); + } + + @ExtApiStatu(name = "", group = "摇匀模组-Z轴-IO", order = 2, minWidth = "100%") + public String shakeModGripperZMReadIOState() { + return readIOState(StepMotorMId.ShakeModGripperZM); + } + + @ExtApiStatu(name = "", group = "摇匀模组-夹紧-IO", order = 3, minWidth = "100%") + public String shakeModClampingMReadIOState() { + return readIOState(StepMotorMId.ShakeModClampingM); + } + + @ExtApiStatu(name = "", group = "摇匀模组-摇匀-IO", order = 4, minWidth = "100%") + public String shakeModShakeMReadIOState() { + return readIOState(StepMotorMId.ShakeModShakeM); + } + + @ExtApiStatu(name = "", group = "板夹仓-前后移动电机-IO", order = 5, minWidth = "100%") + public String platesBoxYMReadIOState() { + return readIOState(StepMotorMId.PlatesBoxYM); + } + + @ExtApiStatu(name = "", group = "板夹仓-推杆电机-IO", order = 6, minWidth = "100%") + public String platesBoxPusherReadIOState() { + return readIOState(StepMotorMId.PlatesBoxPusherM); + } + + @ExtApiStatu(name = "", group = "孵育盘电机-IO", order = 7, minWidth = "100%") + public String incubatorRotateCtrlMReadIOState() { + return readIOState(StepMotorMId.IncubatorRotateCtrlM); + } + + @ExtApiStatu(name = "", group = "光学模组-扫码电机-IO", order = 8, minWidth = "100%") + public String optModScannerMReadIOState() { + return readIOState(StepMotorMId.OptModScannerM); + } + + @ExtApiStatu(name = "", group = "光学模组-拉杆电机-IO", order = 9, minWidth = "100%") + public String optModPullMReadIOState() { + return readIOState(StepMotorMId.OptModPullM); + } + + private String readIOState(StepMotorMId mid) { + try { + Boolean zeroIOState = stepMotorCtrlDriver.stepMotorReadIoState(mid, 0); + Boolean limitIOState = stepMotorCtrlDriver.stepMotorReadIoState(mid, 1); + return String.format("ZERO IO: [%s] LIMIT IO: [%s]", zeroIOState ? 1 : 0, limitIOState ? 1 : 0); + } catch (AppException e) { + return "读取IO异常"; + } + } + + @PostConstruct + void init() { + pageConfig = extApiPageMgr.newPage(this); + extApiPageMgr.addPage(pageConfig); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java new file mode 100644 index 0000000..8f407ed --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java @@ -0,0 +1,28 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.hardware.driver.OutputIOCtrlDriver; +import a8k.app.hardware.type.OutputIOId; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class OutputIOCtrlTestPage { + final private ExtApiPageMgr extApiPageMgr; + final private OutputIOCtrlDriver outputIOCtrlDriver; + + + public void setIOState(Boolean state) throws AppException { + outputIOCtrlDriver.setIOState(OutputIOId.RecycleBinOverflowPPSPowerCtrl, state); + } + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("废料仓光栅控制", this::setIOState).setParamVal("state", ()->true); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java new file mode 100644 index 0000000..77e0077 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java @@ -0,0 +1,82 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.hardware.driver.PipetteCtrlDriverV2; +import a8k.app.hardware.type.ModuleStatus; +import a8k.app.hardware.type.pipette_module.PipetteStateIndex; +import a8k.app.hardware.type.pipette_module.cfg.ZMBasicConfigIndex; +import a8k.app.type.exception.AppException; +import a8k.app.utils.ZJsonNode; +import a8k.extui.mgr.ExtApiPageMgr; +import cn.hutool.core.text.StrBuilder; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class PipetteGunHardwareTestPage { + private final ExtApiPageMgr extApiPageMgr; + private final PipetteCtrlDriverV2 pipetteCtrlDriverV2; + + + public void enableMotor() throws AppException { + pipetteCtrlDriverV2.zMotorEnable(1); + } + + public void disableMotor() throws AppException { + pipetteCtrlDriverV2.zMotorEnable(0); + } + + public void stepMotorEasyMoveToZero() throws AppException { + pipetteCtrlDriverV2.zMotorMoveZeroBlock(); + } + + + public void stepMotorStop() throws AppException { + pipetteCtrlDriverV2.moduleStop(); + } + + public void stepMotorEasyMoveForward(Integer dpos) throws AppException { + pipetteCtrlDriverV2.zMotorMoveByBlock(dpos); + } + + public void stepMotorEasyMoveBackward(Integer dpos) throws AppException { + pipetteCtrlDriverV2.zMotorMoveByBlock(-dpos); + } + + + public Integer readPos() throws AppException { + return pipetteCtrlDriverV2.zMotorReadPos(); + } + + + public PipetteCtrlDriverV2.PipetteGunConnectivityTestReport readPipetteConnectedState() throws AppException { + pipetteCtrlDriverV2.pipetteTestConnectivity(); + return pipetteCtrlDriverV2.readPipetteConnectedState(); + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础操作"); + page.addFunction("使能电机", this::enableMotor); + page.addFunction("失能电机", this::disableMotor); + page.addFunction("归零", this::stepMotorEasyMoveToZero); + page.addFunction("正向移动", this::stepMotorEasyMoveForward).setParamVal("dpos", () -> 50); + page.addFunction("反向移动", this::stepMotorEasyMoveBackward).setParamVal("dpos", () -> 50); + page.addFunction("停止", this::stepMotorStop); + + page.newGroup("状态"); + page.addFunction("读取位置", this::readPos); + page.addFunction("读取连接状态", this::readPipetteConnectedState); + + extApiPageMgr.addPage(page); + + + } + +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java b/src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java new file mode 100644 index 0000000..1d234d7 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java @@ -0,0 +1,131 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.hardware.channel.A8kCanBusService; +import a8k.app.hardware.type.MId; +import a8k.app.type.VersionInfo; +import a8k.app.type.exception.AppException; +import a8k.app.utils.ZList; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class SubBoardProberPage { + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @Resource + A8kCanBusService canBus; + + + Map versionInfos = new HashMap<>(); + + @ExtApiStatu(name = "", group = "机械臂板模块-10", order = 1) + public VersionInfo getHbotBoard() { + return versionInfos.get(MId.HbotBoard); + } + + @ExtApiStatu(name = "", group = "板夹仓模块-20", order = 3) + public VersionInfo getPlatesBoxBoard() { + return versionInfos.get(MId.PlatesBoxBoard); + } + + @ExtApiStatu(name = "", group = "摇匀模组板-30", order = 7) + public VersionInfo getShakeModBoard() { + return versionInfos.get(MId.ShakeModBoard); + } + + @ExtApiStatu(name = "", group = "反应板夹温度控板-40", order = 15) + public VersionInfo getPlatesBoxTCMBoard() { + return versionInfos.get(MId.PlatesBoxTCMBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘温空板-50", order = 18) + public VersionInfo getIncubatorTCMBoard() { + return versionInfos.get(MId.IncubatorTCMBoard); + } + + + @ExtApiStatu(name = "", group = "出入料模块-60", order = 20) + public VersionInfo getFeedingModBoard() { + return versionInfos.get(MId.FeedingModBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘旋转板-70", order = 25) + public VersionInfo getIncubatorRotateBoard() { + return versionInfos.get(MId.IncubatorRotateBoard); + } + + + @ExtApiStatu(name = "", group = "机械臂Z轴板-80", order = 27) + public VersionInfo getPipetteModBoard() { + return versionInfos.get(MId.PipetteModBoard); + } + + @ExtApiStatu(name = "", group = "光学模组板-90", order = 30) + public VersionInfo getOptModBoard() { + return versionInfos.get(MId.OptModBoard); + } + + @ExtApiStatu(name = "", group = "A8K读卡器板-100", order = 34) + public VersionInfo getA8kIdCardReaderBoard() { + return versionInfos.get(MId.A8kIdCardReaderBoard); + } + + + public void refreshBoardState() { + var modules = ZList.of( + MId.HbotBoard, + MId.PlatesBoxBoard, + MId.ShakeModBoard, + MId.PlatesBoxTCMBoard, + MId.IncubatorTCMBoard, + MId.FeedingModBoard, + MId.IncubatorRotateBoard, + MId.PipetteModBoard, + MId.OptModBoard, + MId.A8kIdCardReaderBoard + ); + for (var module : modules) { + if (module == MId.NotSet) { + continue; + } + try { + Integer version = canBus.moduleReadVersion(module); + String modueType = canBus.moduleReadType(module).toString(); + + VersionInfo info = new VersionInfo(); + info.online = true; + info.moduleType = modueType; + info.moduleId = module.index; + info.moduleName = module.chname; + info.version = version; + versionInfos.put(module, info); + + } catch (AppException e) { + VersionInfo info = new VersionInfo(); + info.online = false; + info.moduleId = module.index; + info.moduleName = module.chname; + versionInfos.put(module, info); + } + } + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.regPageInitFn(this::refreshBoardState); + page.addFunction("刷新", this::refreshBoardState); + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java b/src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java new file mode 100644 index 0000000..7a40c46 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java @@ -0,0 +1,244 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.type.exception.AppException; +import a8k.app.hardware.channel.A8kCanBusService; +import a8k.app.hardware.type.MId; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class SubModuleVersionPreviewPage { + + + @Resource + ExtApiPageMgr extApiPageMgr; + + @Resource + A8kCanBusService canBus; + + public static class VersionInfo { + public Integer moduleId; + public String moduleName; + public Boolean online; + public String moduleType; + public Integer version; + } + + Map versionInfos = new HashMap<>(); + + @ExtApiStatu(name = "", group = "机械臂板模块", order = 1) + public VersionInfo getHbotBoard() { + return versionInfos.get(MId.HbotBoard); + } + + @ExtApiStatu(name = "", group = "机械臂XY", order = 2) + public VersionInfo getHbotM() { + return versionInfos.get(MId.HbotM); + } + + @ExtApiStatu(name = "", group = "板夹仓模块", order = 3) + public VersionInfo getPlatesBoxBoard() { + return versionInfos.get(MId.PlatesBoxBoard); + } + + @ExtApiStatu(name = "", group = "板夹仓移动电机", order = 4) + public VersionInfo getPlatesBoxYM() { + return versionInfos.get(MId.PlatesBoxYM); + } + + @ExtApiStatu(name = "", group = "板夹仓推杆电机", order = 5) + public VersionInfo getPlatesBoxPusherM() { + return versionInfos.get(MId.PlatesBoxPusherM); + } + + @ExtApiStatu(name = "", group = "板夹仓扫码模组", order = 6) + public VersionInfo getPlatesBoxScanner() { + return versionInfos.get(MId.PlatesBoxScanner); + } + + @ExtApiStatu(name = "", group = "摇匀模组板", order = 7) + public VersionInfo getShakeModBoard() { + return versionInfos.get(MId.ShakeModBoard); + } + + @ExtApiStatu(name = "", group = "试管固定夹爪电机", order = 8) + public VersionInfo getShakeModClampingM() { + return versionInfos.get(MId.ShakeModClampingM); + } + + @ExtApiStatu(name = "", group = "摇匀升降电机", order = 9) + public VersionInfo getShakeModGripperZM() { + return versionInfos.get(MId.ShakeModGripperZM); + } + + @ExtApiStatu(name = "", group = "试管摇匀电机", order = 10) + public VersionInfo getShakeModShakeM() { + return versionInfos.get(MId.ShakeModShakeM); + } + + @ExtApiStatu(name = "", group = "摇匀前后移动舵机", order = 11) + public VersionInfo getShakeModGripperYSV() { + return versionInfos.get(MId.ShakeModGripperYSV); + } + + @ExtApiStatu(name = "", group = "摇匀试管帽夹爪舵机", order = 12) + public VersionInfo getShakeModGripperSV() { + return versionInfos.get(MId.ShakeModGripperSV); + } + + @ExtApiStatu(name = "", group = "试管架扫码夹紧舵机", order = 13) + public VersionInfo getShakeModTubeScanerClampingSV() { + return versionInfos.get(MId.ShakeModTubeScanerClampingSV); + } + + @ExtApiStatu(name = "", group = "试管架旋转舵机", order = 14) + public VersionInfo getShakeModTubeScanerRotateSV() { + return versionInfos.get(MId.ShakeModTubeScanerRotateSV); + } + + @ExtApiStatu(name = "", group = "反应板夹温度控板", order = 15) + public VersionInfo getPlatesBoxTCMBoard() { + return versionInfos.get(MId.PlatesBoxTCMBoard); + } + + @ExtApiStatu(name = "", group = "反应板夹温度控制模块", order = 16) + public VersionInfo getPlatesBoxTCM() { + return versionInfos.get(MId.PlatesBoxTCM); + } + + @ExtApiStatu(name = "", group = "气溶胶风扇", order = 17) + public VersionInfo getWbTubeFanMod() { + return versionInfos.get(MId.WbTubeFanMod); + } + + @ExtApiStatu(name = "", group = "孵育盘温空板", order = 18) + public VersionInfo getIncubatorTCMBoard() { + return versionInfos.get(MId.IncubatorTCMBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘温控模块", order = 19) + public VersionInfo getIncubatorTCM() { + return versionInfos.get(MId.IncubatorTCM); + } + + @ExtApiStatu(name = "", group = "出入料模块", order = 20) + public VersionInfo getFeedingModBoard() { + return versionInfos.get(MId.FeedingModBoard); + } + + @ExtApiStatu(name = "", group = "入料电机", order = 21) + public VersionInfo getFeedingModInfeedM() { + return versionInfos.get(MId.FeedingModInfeedM); + } + + @ExtApiStatu(name = "", group = "试管架平移电机", order = 22) + public VersionInfo getFeedingModXM() { + return versionInfos.get(MId.FeedingModXM); + } + + @ExtApiStatu(name = "", group = "出料电机", order = 23) + public VersionInfo getFeedingModOutfeedM() { + return versionInfos.get(MId.FeedingModOutfeedM); + } + + @ExtApiStatu(name = "", group = "试管架扫码器", order = 24) + public VersionInfo getFeedingModScannerMod() { + return versionInfos.get(MId.FeedingModScannerMod); + } + + @ExtApiStatu(name = "", group = "孵育盘旋转板", order = 25) + public VersionInfo getIncubatorRotateBoard() { + return versionInfos.get(MId.IncubatorRotateBoard); + } + + @ExtApiStatu(name = "", group = "孵育盘旋转", order = 26) + public VersionInfo getIncubatorRotateCtrlM() { + return versionInfos.get(MId.IncubatorRotateCtrlM); + } + + @ExtApiStatu(name = "", group = "机械臂Z轴板", order = 27) + public VersionInfo getPipetteModBoard() { + return versionInfos.get(MId.PipetteModBoard); + } + + @ExtApiStatu(name = "", group = "移液枪", order = 28) + public VersionInfo getPipetteMod() {return versionInfos.get(MId.PipetteMod);} + + @ExtApiStatu(name = "", group = "物料扫码器", order = 29) + public VersionInfo getPipetteModCodeScanner() { + return versionInfos.get(MId.PipetteModCodeScanner); + } + + @ExtApiStatu(name = "", group = "光学模组板", order = 30) + public VersionInfo getOptModBoard() { + return versionInfos.get(MId.OptModBoard); + } + + @ExtApiStatu(name = "", group = "板卡扫描电机", order = 31) + public VersionInfo getOptModScannerM() { + return versionInfos.get(MId.OptModScannerM); + } + + @ExtApiStatu(name = "", group = "板卡推杆电机", order = 32) + public VersionInfo getOptModPullM() { + return versionInfos.get(MId.OptModPullM); + } + + @ExtApiStatu(name = "", group = "扫描仪", order = 33) + public VersionInfo getOptMod() { + return versionInfos.get(MId.OptMod); + } + + @ExtApiStatu(name = "", group = "A8K读卡器板", order = 34) + public VersionInfo getA8kIdCardReaderBoard() { + return versionInfos.get(MId.A8kIdCardReaderBoard); + } + + @ExtApiStatu(name = "", group = "A8K读卡器", order = 35) + public VersionInfo getA8kIdCardReader() { + return versionInfos.get(MId.A8kIdCardReader); + } + + public void refreshBoardState() { + var modules = MId.values(); + for (var module : modules) { + if (module == MId.NotSet) { + continue; + } + try { + Integer version = canBus.moduleReadVersion(module); + String modueType = canBus.moduleReadType(module).toString(); + + VersionInfo info = new VersionInfo(); + info.online = true; + info.moduleType = modueType; + info.moduleId = module.index; + info.moduleName = module.chname; + info.version = version; + versionInfos.put(module, info); + + } catch (AppException e) { + VersionInfo info = new VersionInfo(); + info.online = false; + info.moduleId = module.index; + info.moduleName = module.chname; + versionInfos.put(module, info); + } + } + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.addFunction("刷新", this::refreshBoardState); + extApiPageMgr.addPage(page); + } + +} diff --git a/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java b/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java new file mode 100644 index 0000000..e8fa370 --- /dev/null +++ b/src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java @@ -0,0 +1,145 @@ +package a8k.extui.page.hardwaretest; + +import a8k.app.hardware.driver.WaterTemperatureControllerDriver; +import a8k.app.hardware.type.TemperatureControlerMid; +import a8k.app.hardware.type.TemperatureControlerRegIndex; +import a8k.app.type.exception.AppException; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtApiStatu; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class WaterTempControllerTestPage { + + + final private ExtApiPageMgr extApiPageMgr; + final private WaterTemperatureControllerDriver waterTemperatureControllerDriver; + + @ExtApiStatu(name = "", group = "孵育盘反馈温度", order = 1, minWidth = "50%") + public Double readIncubateBoxReadFeedbackTemperature() throws AppException { + return waterTemperatureControllerDriver.readFeedbakTemperature(TemperatureControlerMid.IncubatorTCM); + } + + + @ExtApiStatu(name = "", group = "板夹仓反馈温度", order = 2, minWidth = "50%") + public Double readPlatesBoxTCMFeedbackTemperature() throws AppException { + return waterTemperatureControllerDriver.readIncubateBoxTemperature(); + } + + @ExtApiStatu(name = "", group = "孵育盘温度传感器", order = 3, minWidth = "50%") + public String readIncubateBoxReadTemperatures() throws AppException { + Integer temp0 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp0); + Integer temp1 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp1); + Integer temp2 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp2); + Integer temp3 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.IncubatorTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp3); + return String.format("S0: %d, S1: %d, S2: %d, S3: %d", temp0, temp1, temp2, temp3); + } + + @ExtApiStatu(name = "", group = "板夹仓温度传感器", order = 4, minWidth = "50%") + public String readPlatesBoxTCMReadTemperatures() throws AppException { + Integer temp0 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp0); + Integer temp1 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp1); + Integer temp2 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp2); + Integer temp3 = waterTemperatureControllerDriver.readReg(TemperatureControlerMid.PlatesBoxTCM, TemperatureControlerRegIndex.kreg_water_cooling_tmp_controler_temp3); + return String.format("S0: %d, S1: %d, S2: %d, S3: %d", temp0, temp1, temp2, temp3); + } + + + public void incubatorTCMStartCtrlTemperature(Double targetTemp) throws AppException { + waterTemperatureControllerDriver.startCtrlTemperature(TemperatureControlerMid.IncubatorTCM, targetTemp); + } + + public void incubatorTCMStopCtrlTemperature() throws AppException { + waterTemperatureControllerDriver.stopCtrlTemperature(TemperatureControlerMid.IncubatorTCM); + } + + + public void incubatorTCMSetPeltierPower(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.IncubatorTCM, val0To100); + } + public void incubatorTCMSetPeltierClose() throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.IncubatorTCM, 0); + } + + + public void incubatorTCMSetCtrlFanLevel(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.IncubatorTCM, val0To100); + } + public void incubatorTCMSetCtrlFanClose() throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.IncubatorTCM, 0); + } + + public void incubatorTCMSetWaterPumpSpeed(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.IncubatorTCM, val0To100); + } + public void incubatorTCMSetWaterPumpClose() throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.IncubatorTCM, 0); + } + + + public void platesBoxTCMStartCtrlTemperature(Double targetTemp) throws AppException { + waterTemperatureControllerDriver.startCtrlTemperature(TemperatureControlerMid.PlatesBoxTCM, targetTemp); + } + + + public void platesBoxTCMStopCtrlTemperature() throws AppException { + waterTemperatureControllerDriver.stopCtrlTemperature(TemperatureControlerMid.PlatesBoxTCM); + } + + public void platesBoxTCMSetPeltierPower(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.PlatesBoxTCM, val0To100); + } + + public void platesBoxTCMSetPeltierClose() throws AppException { + waterTemperatureControllerDriver.setPeltierPower(TemperatureControlerMid.PlatesBoxTCM, 0); + } + + + public void platesBoxTCMSetCtrlFanLevel(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.PlatesBoxTCM, val0To100); + } + public void platesBoxTCMSetCtrlFanClose() throws AppException { + waterTemperatureControllerDriver.setCtrlFanLevel(TemperatureControlerMid.PlatesBoxTCM, 0); + } + + public void platesBoxTCMSetWaterPumpSpeed(Integer val0To100) throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.PlatesBoxTCM, val0To100); + } + public void platesBoxTCMSetWaterPumpClose() throws AppException { + waterTemperatureControllerDriver.setWaterPumpSpeed(TemperatureControlerMid.PlatesBoxTCM, 0); + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + page.newGroup("孵育盘-温度控制"); + page.addFunction("孵育箱TCM开始控温", this::incubatorTCMStartCtrlTemperature); + page.addFunction("孵育箱TCM停止控温", this::incubatorTCMStopCtrlTemperature); + page.newGroup("孵育盘-温度控制-测试"); + page.addFunction("设置加热片功率(-100...+100)", this::incubatorTCMSetPeltierPower); + page.addFunction("关闭加热片", this::incubatorTCMSetPeltierClose); + page.addFunction("设置风扇转速", this::incubatorTCMSetCtrlFanLevel); + page.addFunction("关闭风扇", this::incubatorTCMSetCtrlFanClose); + page.addFunction("设置水泵转速", this::incubatorTCMSetWaterPumpSpeed); + page.addFunction("关闭水泵", this::incubatorTCMSetWaterPumpClose); + page.newGroup("板夹仓-温度控制"); + page.addFunction("板夹仓TCM开始控温", this::platesBoxTCMStartCtrlTemperature); + page.addFunction("板夹仓TCM停止控温", this::platesBoxTCMStopCtrlTemperature); + page.newGroup("板夹仓-温度控制-测试"); + page.addFunction("设置加热片功率(-100...+100)", this::platesBoxTCMSetPeltierPower); + page.addFunction("关闭加热片", this::platesBoxTCMSetPeltierClose); + page.addFunction("设置风扇转速", this::platesBoxTCMSetCtrlFanLevel); + page.addFunction("关闭风扇", this::platesBoxTCMSetCtrlFanClose); + page.addFunction("设置水泵转速", this::platesBoxTCMSetWaterPumpSpeed); + page.addFunction("关闭水泵", this::platesBoxTCMSetWaterPumpClose); + extApiPageMgr.addPage(page); + } + + +} diff --git a/src/main/java/a8k/extui/type/ExtUIPageCfg.java b/src/main/java/a8k/extui/type/ExtUIPageCfg.java index 4e46c7e..1d4bacd 100644 --- a/src/main/java/a8k/extui/type/ExtUIPageCfg.java +++ b/src/main/java/a8k/extui/type/ExtUIPageCfg.java @@ -16,6 +16,8 @@ public class ExtUIPageCfg { public List functions = new java.util.ArrayList<>(); public String groupContext = ""; + public Runnable pageInitFn; + Method findSimilarMethod(Object obj, String name) { Class classz = obj.getClass(); @@ -88,6 +90,16 @@ public class ExtUIPageCfg { groupContext = groupName; } + public void regPageInitFn(Runnable pageInitFn) { + this.pageInitFn = pageInitFn; + } + + public void callRegInitFn() { + if (pageInitFn != null) { + pageInitFn.run(); + } + } + // // UTILS_IMPL //