11 changed files with 452 additions and 294 deletions
-
1src/main/java/a8k/app/hardware/driver/MiniServoDriver.java
-
214src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
-
50src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java
-
12src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java
-
96src/main/java/a8k/extui/page/measurement/HbotPosMeasurePageBak.java
-
49src/main/java/a8k/extui/page/measurement/IncubatorMeasurePage.java
-
52src/main/java/a8k/extui/page/measurement/OptModMeasurePage.java
-
86src/main/java/a8k/extui/page/measurement/PlateBoxPosMeasurePage.java
-
53src/main/java/a8k/extui/page/measurement/PlatesBoxMeasurePage.java
-
61src/main/java/a8k/extui/page/measurement/ShakeModStepMotorMeasurePage.java
-
72src/main/java/a8k/extui/page/test/verification/P00PosVerifyUitilsPage.java
@ -0,0 +1,50 @@ |
|||||
|
package a8k.extui.page.measurement; |
||||
|
|
||||
|
import a8k.app.a8ktype.exception.AppException; |
||||
|
import a8k.app.hardware.driver.MiniServoDriver; |
||||
|
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
||||
|
import a8k.app.hardware.driver.type.MiniServoMId; |
||||
|
import a8k.app.hardware.driver.type.StepMotorMId; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class FeedingModMeasurePage { |
||||
|
@Resource |
||||
|
ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
static final Integer overtime = 10000; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
StepMotorCtrlDriver stepMotorCtrlDriver; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
MiniServoDriver miniServoDriver; |
||||
|
|
||||
|
|
||||
|
|
||||
|
public Integer measureFeedingModXMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.FeedingModXM, overtime); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
|
||||
|
page.newGroup("入料模块-测量"); |
||||
|
page.addFunction("平移电机", this::measureFeedingModXMPos); |
||||
|
|
||||
|
|
||||
|
|
||||
|
extApiPageMgr.addPage(page); |
||||
|
} |
||||
|
} |
@ -0,0 +1,96 @@ |
|||||
|
package a8k.extui.page.measurement; |
||||
|
|
||||
|
import a8k.app.a8ktype.device.Pos2d; |
||||
|
import a8k.app.a8ktype.device.Pos3d; |
||||
|
import a8k.app.a8ktype.exception.AppException; |
||||
|
import a8k.app.hardware.driver.HbotDriver; |
||||
|
import a8k.app.hardware.driver.PipetteCtrlDriver; |
||||
|
import a8k.app.service.lowerctrl.HbotMoveCtrlService; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import a8k.extui.type.ExtApiStatu; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class HbotPosMeasurePageBak { |
||||
|
@Resource |
||||
|
ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
@Resource |
||||
|
HbotDriver hbotDriver; |
||||
|
|
||||
|
@Resource |
||||
|
HbotMoveCtrlService hbotMoveCtrlService; |
||||
|
|
||||
|
@Resource |
||||
|
PipetteCtrlDriver pipetteCtrlDriver; |
||||
|
|
||||
|
@ExtApiStatu(name = "Hbot当前坐标") |
||||
|
public Object readPos() throws AppException { |
||||
|
return hbotDriver.readPos(); |
||||
|
} |
||||
|
|
||||
|
public void disableHbot() throws AppException { |
||||
|
hbotDriver.enable(0); |
||||
|
pipetteCtrlDriver.zMotorEnable(0); |
||||
|
} |
||||
|
|
||||
|
public void enableHbot() throws AppException { |
||||
|
hbotDriver.enable(1); |
||||
|
pipetteCtrlDriver.zMotorEnable(1); |
||||
|
} |
||||
|
|
||||
|
public void moveTo(Integer x, Integer y, Integer z) throws AppException { |
||||
|
hbotDriver.enable(1); |
||||
|
pipetteCtrlDriver.zMotorEnable(1); |
||||
|
pipetteCtrlDriver.zMotorMoveZeroBlock(); |
||||
|
hbotMoveCtrlService.hbotMoveTo(x, y, z); |
||||
|
} |
||||
|
|
||||
|
public void moveBy(Integer dx, Integer dy) throws AppException { |
||||
|
hbotDriver.enable(1); |
||||
|
pipetteCtrlDriver.zMotorEnable(1); |
||||
|
Pos2d pos = hbotDriver.readPos(); |
||||
|
pos.x += dx; |
||||
|
pos.y += dy; |
||||
|
hbotDriver.moveToBlock(pos.x, pos.y); |
||||
|
} |
||||
|
|
||||
|
public Pos3d measurementCurrentPos() throws AppException { |
||||
|
pipetteCtrlDriver.zMotorMeasureDistance(); |
||||
|
Pos3d pos = new Pos3d(); |
||||
|
pos.z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); |
||||
|
pos.x = hbotDriver.readPos().x; |
||||
|
pos.y = hbotDriver.readPos().y; |
||||
|
return pos; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
public Integer readXPos() { |
||||
|
try { |
||||
|
return hbotDriver.readPos().x; |
||||
|
} catch (AppException e) { |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public Integer readYPos() { |
||||
|
try { |
||||
|
return hbotDriver.readPos().y; |
||||
|
} catch (AppException e) { |
||||
|
return 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
page.addFunction("使能HBOT", this::enableHbot); |
||||
|
page.addFunction("失能HBOT", this::disableHbot); |
||||
|
page.addFunction("移动到", this::moveTo).setParamVal("x", this::readXPos).setParamVal("y", this::readYPos); |
||||
|
page.addFunction("相对移动", this::moveBy).setParamVal("dx", 0).setParamVal("dy", 0); |
||||
|
page.addFunction("测量当前位置", this::measurementCurrentPos); |
||||
|
extApiPageMgr.addPage(page); |
||||
|
} |
||||
|
} |
@ -0,0 +1,49 @@ |
|||||
|
package a8k.extui.page.measurement; |
||||
|
|
||||
|
import a8k.app.a8ktype.exception.AppException; |
||||
|
import a8k.app.hardware.driver.MiniServoDriver; |
||||
|
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
||||
|
import a8k.app.hardware.driver.type.MiniServoMId; |
||||
|
import a8k.app.hardware.driver.type.StepMotorMId; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class IncubatorMeasurePage { |
||||
|
@Resource |
||||
|
ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
static final Integer overtime = 10000; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
StepMotorCtrlDriver stepMotorCtrlDriver; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
MiniServoDriver miniServoDriver; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
public Integer measureIncubatorRotateCtrlMPos() throws AppException { |
||||
|
// return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.IncubatorRotateCtrlM, overtime); |
||||
|
return stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.IncubatorRotateCtrlM); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
|
||||
|
|
||||
|
page.newGroup("孵化模组-测量"); |
||||
|
page.addFunction("旋转电机", this::measureIncubatorRotateCtrlMPos); |
||||
|
|
||||
|
extApiPageMgr.addPage(page); |
||||
|
} |
||||
|
} |
@ -0,0 +1,52 @@ |
|||||
|
package a8k.extui.page.measurement; |
||||
|
|
||||
|
import a8k.app.a8ktype.exception.AppException; |
||||
|
import a8k.app.hardware.driver.MiniServoDriver; |
||||
|
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
||||
|
import a8k.app.hardware.driver.type.MiniServoMId; |
||||
|
import a8k.app.hardware.driver.type.StepMotorMId; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class OptModMeasurePage { |
||||
|
@Resource |
||||
|
ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
static final Integer overtime = 10000; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
StepMotorCtrlDriver stepMotorCtrlDriver; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
MiniServoDriver miniServoDriver; |
||||
|
|
||||
|
|
||||
|
public Integer measureOptModScannerMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModScannerM, overtime); |
||||
|
} |
||||
|
|
||||
|
public Integer measureOptModPullMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.OptModPullM, overtime); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
|
||||
|
|
||||
|
|
||||
|
page.newGroup("光学模组-测量"); |
||||
|
page.addFunction("扫描电机", this::measureOptModScannerMPos); |
||||
|
page.addFunction("拉板电机", this::measureOptModPullMPos); |
||||
|
|
||||
|
extApiPageMgr.addPage(page); |
||||
|
} |
||||
|
} |
@ -1,86 +0,0 @@ |
|||||
package a8k.extui.page.measurement; |
|
||||
|
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
@Component |
|
||||
public class PlateBoxPosMeasurePage { |
|
||||
// @Resource |
|
||||
// ExtApiPageMgr extApiPageMgr; |
|
||||
// |
|
||||
// @Resource |
|
||||
// HbotDriver hbotDriver; |
|
||||
// |
|
||||
// @Resource |
|
||||
// HbotMoveCtrlService hbotMoveCtrlService; |
|
||||
// |
|
||||
// @Resource |
|
||||
// PipetteCtrlDriver pipetteCtrlDriver; |
|
||||
// |
|
||||
// @ExtApiStatu(name = "Hbot当前坐标") |
|
||||
// public Object readPos() throws AppException { |
|
||||
// return hbotDriver.readPos(); |
|
||||
// } |
|
||||
// |
|
||||
// public void disableHbot() throws AppException { |
|
||||
// hbotDriver.enable(0); |
|
||||
// pipetteCtrlDriver.zMotorEnable(0); |
|
||||
// } |
|
||||
// |
|
||||
// public void enableHbot() throws AppException { |
|
||||
// hbotDriver.enable(1); |
|
||||
// pipetteCtrlDriver.zMotorEnable(1); |
|
||||
// } |
|
||||
// |
|
||||
// public void moveTo(Integer x, Integer y, Integer z) throws AppException { |
|
||||
// hbotDriver.enable(1); |
|
||||
// pipetteCtrlDriver.zMotorEnable(1); |
|
||||
// pipetteCtrlDriver.zMotorMoveZeroBlock(); |
|
||||
// hbotMoveCtrlService.hbotMoveTo(x, y, z); |
|
||||
// } |
|
||||
// |
|
||||
// public void moveBy(Integer dx, Integer dy) throws AppException { |
|
||||
// hbotDriver.enable(1); |
|
||||
// pipetteCtrlDriver.zMotorEnable(1); |
|
||||
// Pos2d pos = hbotDriver.readPos(); |
|
||||
// pos.x += dx; |
|
||||
// pos.y += dy; |
|
||||
// hbotDriver.moveToBlock(pos.x, pos.y); |
|
||||
// } |
|
||||
// |
|
||||
// public Pos3d measurementCurrentPos() throws AppException { |
|
||||
// pipetteCtrlDriver.zMotorMeasureDistance(); |
|
||||
// Pos3d pos = new Pos3d(); |
|
||||
// pos.z = pipetteCtrlDriver.zMotorReadMeasureDistanceResult(); |
|
||||
// pos.x = hbotDriver.readPos().x; |
|
||||
// pos.y = hbotDriver.readPos().y; |
|
||||
// return pos; |
|
||||
// } |
|
||||
// |
|
||||
// |
|
||||
// public Integer readXPos() { |
|
||||
// try { |
|
||||
// return hbotDriver.readPos().x; |
|
||||
// } catch (AppException e) { |
|
||||
// return 0; |
|
||||
// } |
|
||||
// } |
|
||||
// |
|
||||
// public Integer readYPos() { |
|
||||
// try { |
|
||||
// return hbotDriver.readPos().y; |
|
||||
// } catch (AppException e) { |
|
||||
// return 0; |
|
||||
// } |
|
||||
// } |
|
||||
// |
|
||||
// @PostConstruct |
|
||||
// public void init() { |
|
||||
// var page = extApiPageMgr.newPage(this); |
|
||||
// page.addFunction("使能HBOT", this::enableHbot); |
|
||||
// page.addFunction("失能HBOT", this::disableHbot); |
|
||||
// page.addFunction("移动到", this::moveTo).setParamVal("x", this::readXPos).setParamVal("y", this::readYPos); |
|
||||
// page.addFunction("相对移动", this::moveBy).setParamVal("dx", 0).setParamVal("dy", 0); |
|
||||
// page.addFunction("测量当前位置", this::measurementCurrentPos); |
|
||||
// extApiPageMgr.addPage(page); |
|
||||
// } |
|
||||
} |
|
@ -0,0 +1,53 @@ |
|||||
|
package a8k.extui.page.measurement; |
||||
|
|
||||
|
import a8k.app.a8ktype.exception.AppException; |
||||
|
import a8k.app.hardware.driver.MiniServoDriver; |
||||
|
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
||||
|
import a8k.app.hardware.driver.type.MiniServoMId; |
||||
|
import a8k.app.hardware.driver.type.StepMotorMId; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class PlatesBoxMeasurePage { |
||||
|
@Resource |
||||
|
ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
static final Integer overtime = 10000; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
StepMotorCtrlDriver stepMotorCtrlDriver; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
MiniServoDriver miniServoDriver; |
||||
|
|
||||
|
|
||||
|
public Integer measurePlatesBoxYMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxYM, overtime); |
||||
|
} |
||||
|
|
||||
|
public Integer measurePlatesBoxPusherMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.PlatesBoxPusherM, overtime); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
|
||||
|
|
||||
|
page.newGroup("板夹仓模组-测量"); |
||||
|
page.addFunction("仓位置切换电机", this::measurePlatesBoxYMPos); |
||||
|
page.addFunction("推板电机", this::measurePlatesBoxPusherMPos); |
||||
|
|
||||
|
|
||||
|
extApiPageMgr.addPage(page); |
||||
|
} |
||||
|
} |
@ -0,0 +1,61 @@ |
|||||
|
package a8k.extui.page.measurement; |
||||
|
|
||||
|
import a8k.app.a8ktype.exception.AppException; |
||||
|
import a8k.app.hardware.driver.MiniServoDriver; |
||||
|
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
||||
|
import a8k.app.hardware.driver.type.MiniServoMId; |
||||
|
import a8k.app.hardware.driver.type.StepMotorMId; |
||||
|
import a8k.extui.mgr.ExtApiPageMgr; |
||||
|
import jakarta.annotation.PostConstruct; |
||||
|
import jakarta.annotation.Resource; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
@Component |
||||
|
public class ShakeModStepMotorMeasurePage { |
||||
|
@Resource |
||||
|
ExtApiPageMgr extApiPageMgr; |
||||
|
|
||||
|
static final Integer overtime = 10000; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
StepMotorCtrlDriver stepMotorCtrlDriver; |
||||
|
|
||||
|
|
||||
|
@Resource |
||||
|
MiniServoDriver miniServoDriver; |
||||
|
|
||||
|
public Integer measureShakeModClampingMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModClampingM, overtime); |
||||
|
} |
||||
|
|
||||
|
public Integer measureShakeModGripperZMPos() throws AppException { |
||||
|
return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.ShakeModGripperZM, overtime); |
||||
|
} |
||||
|
|
||||
|
public Integer measureShakeModGripperYSVPos() throws AppException { |
||||
|
Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperYSV); |
||||
|
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 0); |
||||
|
return pos; |
||||
|
} |
||||
|
|
||||
|
public Integer measureShakeModGripperSVPos() throws AppException { |
||||
|
Integer pos = miniServoDriver.miniServoReadPos(MiniServoMId.ShakeModGripperSV); |
||||
|
miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 0); |
||||
|
return pos; |
||||
|
} |
||||
|
|
||||
|
@PostConstruct |
||||
|
public void init() { |
||||
|
var page = extApiPageMgr.newPage(this); |
||||
|
|
||||
|
page.newGroup("摇匀模组-测量"); |
||||
|
page.addFunction("升降电机", this::measureShakeModGripperZMPos); |
||||
|
page.addFunction("前后平移伺服", this::measureShakeModGripperYSVPos); |
||||
|
page.addFunction("试管夹紧电机", this::measureShakeModClampingMPos); |
||||
|
page.addFunction("夹爪伺服", this::measureShakeModGripperSVPos); |
||||
|
|
||||
|
|
||||
|
extApiPageMgr.addPage(page); |
||||
|
} |
||||
|
} |
@ -1,72 +0,0 @@ |
|||||
package a8k.extui.page.test.verification; |
|
||||
|
|
||||
import a8k.app.a8ktype.exception.AppException; |
|
||||
import a8k.app.a8ktype.others.checkpoint.CheckResult; |
|
||||
import a8k.app.hardware.driver.StepMotorCtrlDriver; |
|
||||
import a8k.app.hardware.driver.type.StepMotorMId; |
|
||||
import a8k.app.service.lowerctrl.DeviceInitCtrlService; |
|
||||
import a8k.extui.mgr.ExtApiPageMgr; |
|
||||
import a8k.extui.type.ExtUIPageCfg; |
|
||||
import jakarta.annotation.PostConstruct; |
|
||||
import jakarta.annotation.Resource; |
|
||||
import lombok.extern.slf4j.Slf4j; |
|
||||
import org.springframework.stereotype.Component; |
|
||||
|
|
||||
import java.util.List; |
|
||||
|
|
||||
@Component |
|
||||
@Slf4j |
|
||||
public class P00PosVerifyUitilsPage { |
|
||||
@Resource |
|
||||
DeviceInitCtrlService deviceInitCtrlService; |
|
||||
@Resource |
|
||||
StepMotorCtrlDriver stepMotorCtrlDriver; |
|
||||
|
|
||||
|
|
||||
@Resource |
|
||||
ExtApiPageMgr extApiPageMgr; |
|
||||
|
|
||||
// |
|
||||
// 基础操作 |
|
||||
// |
|
||||
|
|
||||
public String initDevice() throws AppException { |
|
||||
List<CheckResult> result = deviceInitCtrlService.initDevice(); |
|
||||
for (CheckResult checkResult : result) { |
|
||||
if (!checkResult.pass) { |
|
||||
return String.format("初始化失败:[%s]不通过", checkResult.info); |
|
||||
} |
|
||||
} |
|
||||
return "初始化成功"; |
|
||||
} |
|
||||
|
|
||||
public Boolean releaseTube() throws AppException { |
|
||||
stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); |
|
||||
stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, 10, 1000); |
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
public Boolean enableAllMotor() throws AppException { |
|
||||
deviceInitCtrlService.enableAllMotor(); |
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
public Boolean disableAllMotor() throws AppException { |
|
||||
deviceInitCtrlService.disableAllMotor(); |
|
||||
return true; |
|
||||
} |
|
||||
|
|
||||
@PostConstruct |
|
||||
void init() { |
|
||||
ExtUIPageCfg cfg = extApiPageMgr.newPage(this); |
|
||||
cfg.newGroup("初始化"); |
|
||||
cfg.addFunction("初始化设备", this::initDevice); |
|
||||
cfg.addFunction("释放试管", this::releaseTube); |
|
||||
cfg.newGroup("电机批量操作"); |
|
||||
cfg.addFunction("使能所有电机", this::enableAllMotor); |
|
||||
cfg.addFunction("失能所有电机", this::disableAllMotor); |
|
||||
extApiPageMgr.addPage(cfg); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
} |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue