Browse Source

添加硬件测试页面

master
zhaohe 2 months ago
parent
commit
27951f8ad7
  1. 2
      src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java
  2. 98
      src/main/java/a8k/app/hardware/channel/LisUartChannel.java
  3. 12
      src/main/java/a8k/app/hardware/driver/HbotDriver.java
  4. 29
      src/main/java/a8k/app/hardware/driver/PipetteCtrlDriverV2.java
  5. 44
      src/main/java/a8k/app/hardware/driver/WaterTemperatureControllerDriver.java
  6. 30
      src/main/java/a8k/app/hardware/type/CmdId.java
  7. 7
      src/main/java/a8k/app/hardware/type/pipette_module/PipetteStateIndex.java
  8. 33
      src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java
  9. 12
      src/main/java/a8k/app/service/background/SensorDataUpdateService.java
  10. 8
      src/main/java/a8k/app/service/background/TemperatureCtrlService.java
  11. 22
      src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java
  12. 11
      src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java
  13. 9
      src/main/java/a8k/app/type/VersionInfo.java
  14. 1
      src/main/java/a8k/extui/controler/ExtApiControler.java
  15. 25
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  16. 9
      src/main/java/a8k/extui/page/driver/CodeScannerDriverCtrlPage.java
  17. 16
      src/main/java/a8k/extui/page/extapp/profession_test/P02A8kTemperaturaVerfication.java
  18. 55
      src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleConfigDebugPage.java
  19. 65
      src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleParameterInitDebugPage.java
  20. 70
      src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleRegAndConfigSyncPage.java
  21. 38
      src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java
  22. 100
      src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java
  23. 36
      src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java
  24. 37
      src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java
  25. 164
      src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java
  26. 23
      src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java
  27. 389
      src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java
  28. 89
      src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java
  29. 28
      src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java
  30. 82
      src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java
  31. 131
      src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java
  32. 44
      src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java
  33. 145
      src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java
  34. 12
      src/main/java/a8k/extui/type/ExtUIPageCfg.java

2
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())));

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

12
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 {

29
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
//

44
src/main/java/a8k/app/hardware/driver/TemperatureControlDriver.java → src/main/java/a8k/app/hardware/driver/WaterTemperatureControllerDriver.java

@ -13,7 +13,7 @@ import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TemperatureControlDriver {
public class WaterTemperatureControllerDriver {
@Resource
A8kCanBusService canBus;
@ -23,8 +23,7 @@ public class TemperatureControlDriver {
@Resource
TemperatureCtrlParamMgr temperatureCtrlParamMgr;
public void startCtrlTemperature(Double incubatorTemperature,Double platesBoxTemperature) throws AppException {
public void startCtrlTemperature(Double incubatorTemperature, Double platesBoxTemperature) throws AppException {
incubatorTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.IncubatorTCMTempOffset);
platesBoxTCMTempOffset = temperatureCtrlParamMgr.getParam(TemperatureCtrlParam.PlatesBoxTCMTempOffset);
@ -44,18 +43,6 @@ public class TemperatureControlDriver {
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;
@ -69,6 +56,33 @@ public class TemperatureControlDriver {
}
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);
}

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

7
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() {

33
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<RegIndex> 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();
}
}

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

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

22
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<RegIndex> 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();
}

11
src/main/java/a8k/app/service/mainctrl/AppDeviceInitCtrlService.java

@ -198,7 +198,7 @@ public class AppDeviceInitCtrlService {
* @throws AppException e
*/
synchronized public List<CheckResult> initDevice() throws AppException {
return doDeviceMoveToZero();
return doDeviceInit();
}
@ -225,8 +225,11 @@ public class AppDeviceInitCtrlService {
}
private List<CheckResult> doDeviceMoveToZero() throws AppException {
private List<CheckResult> doDeviceInit() throws AppException {
//
// CHECK BEFORE INIT
//
List<CheckResult> results = checkBeforeInitDevice();
if (virtualDevice.isEnable()) {
virtualDevice.doVirtualThings("初始化设备");
@ -241,6 +244,10 @@ public class AppDeviceInitCtrlService {
return results;
}
}
//
// INIT DEVICE
//
a8kSubModuleRegInitService.initModuleRegVal();
moveAllMotorToZero();

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

1
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

25
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, "条码字符生成工具")
)));

9
src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java → src/main/java/a8k/extui/page/driver/CodeScannerDriverCtrlPage.java

@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class CodeScanerDriverCtrlPage {
public class CodeScannerDriverCtrlPage {
final private ExtApiPageMgr extApiPageMgr;
@ -39,11 +39,7 @@ public class CodeScanerDriverCtrlPage {
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();
@ -61,7 +57,6 @@ public class CodeScanerDriverCtrlPage {
page.addFunction("扫码(阻塞)", this::pipetteModCodeScannerScanCode);
page.addFunction("扫码开始", this::pipetteGunStartScan);
page.addFunction("扫码停止", this::pipetteGunStopScan);
page.addFunction("压力测试", this::codeScannerStressTest);
page.newGroup("进出料扫描");
page.addFunction("扫码(阻塞)", this::feedingModScannerModCodeScannerScanCode);

16
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<Object[]> 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) {

55
src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleConfigDebugPage.java

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

65
src/main/java/a8k/extui/page/extsetting/db/A8kSubModuleParameterInitDebugPage.java

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

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

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

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

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

37
src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java → src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.driver;
package a8k.extui.page.hardwaretest;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.InputDetectDriver;
@ -11,27 +11,12 @@ import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class InputIOStateScannerPage {
public class InputIOStateHardwareTestPage {
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);}
@ -59,24 +44,6 @@ public class InputIOStateScannerPage {
@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);}

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

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

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

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

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

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

131
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<MId, VersionInfo> 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);
}
}

44
src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java → src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.driver;
package a8k.extui.page.hardwaretest;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.channel.A8kCanBusService;
@ -13,7 +13,7 @@ import java.util.HashMap;
import java.util.Map;
@Component
public class LowLevelBoardVersionPreviewPage {
public class SubModuleVersionPreviewPage {
@Resource
@ -31,41 +31,6 @@ public class LowLevelBoardVersionPreviewPage {
}
Map<MId, VersionInfo> 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() {
@ -203,10 +168,7 @@ public class LowLevelBoardVersionPreviewPage {
}
@ExtApiStatu(name = "", group = "移液枪", order = 28)
public VersionInfo getPipetteMod() {
// return versionInfos.get(MId.PipetteMod);
return new VersionInfo();
}
public VersionInfo getPipetteMod() {return versionInfos.get(MId.PipetteMod);}
@ExtApiStatu(name = "", group = "物料扫码器", order = 29)
public VersionInfo getPipetteModCodeScanner() {

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

12
src/main/java/a8k/extui/type/ExtUIPageCfg.java

@ -16,6 +16,8 @@ public class ExtUIPageCfg {
public List<ExUIFunction> 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
//

Loading…
Cancel
Save