Browse Source

update

tags/v0
zhaohe 4 months ago
parent
commit
3264f13705
  1. 32
      src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java
  2. 43
      src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java
  3. 58
      src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java
  4. 3
      src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java
  5. 66
      src/main/java/a8k/app/service/param/hbotpos/Hbot2DCodeScanParamMgr.java
  6. 14
      src/main/java/a8k/app/service/param/hbotpos/HbotLargeBottleBSPosMgr.java
  7. 7
      src/main/java/a8k/app/type/param/hbotpos/Hbot2DCodeScanPos.java
  8. 3
      src/main/java/a8k/app/type/param/hbotpos/HbotLargeBottleBSPos.java
  9. 4
      src/main/java/a8k/app/type/param/hbotpos/HbotLittleBSPos.java
  10. 3
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  11. 66
      src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java
  12. 172
      src/main/java/a8k/extui/page/driver/HbotCtrlPage.java
  13. 2
      src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java
  14. 2
      src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java
  15. 2
      src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java
  16. 2
      src/main/java/a8k/extui/page/driver/MotorCtrlPage.java
  17. 2
      src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java
  18. 2
      src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java
  19. 8
      src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java
  20. 28
      src/main/java/a8k/extui/page/extsetting/pos_calibration/P24Hbot2DCodeScanPosCalibrationPage.java
  21. 23
      src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java
  22. 44
      src/main/java/a8k/extui/page/test/driver/CodeScanerDriverCtrlPage.java
  23. 71
      src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java

32
src/main/java/a8k/app/hardware/driver/CodeScanerDriver.java

@ -30,6 +30,14 @@ public class CodeScanerDriver {
return pipetteModCodeScannerScanCode(300);
}
public void pipetteModCodeScannerStartScan() throws AppException {
codeScanerStartScan(MId.PipetteModCodeScanner);
}
public void pipetteModCodeScannerStopScan() throws AppException {
codeScanerStopScan(MId.PipetteModCodeScanner);
}
public String feedingModScannerModCodeScannerScanCode(Integer waittime) {
try {
@ -42,27 +50,26 @@ public class CodeScanerDriver {
}
}
public void codeScanerStartScan(MId id) throws AppException {
canBus.callcmd(id, CmdId.code_scaner_start_scan);
public void feedingModScannerModCodeScannerStartScan() throws AppException {
codeScanerStartScan(MId.FeedingModScannerMod);
}
public void codeScanerStopScan(MId id) throws AppException {
canBus.callcmd(id, CmdId.code_scaner_stop_scan);
public void feedingModScannerModCodeScannerStopScan() throws AppException {
codeScanerStopScan(MId.FeedingModScannerMod);
}
public String codeScanerReadScanerResult(MId id) throws AppException {
private String codeScanerReadScanerResult(MId id) throws AppException {
A8kPacket ack = canBus.callcmd(id, CmdId.code_scaner_read_scaner_result);
var contentBytes = ack.getCmdContent();
return new String(contentBytes);
}
public Boolean codeScanerResultIsReady(MId id) throws AppException {
private Boolean codeScanerResultIsReady(MId id) throws AppException {
var packet = canBus.callcmd(id, CmdId.code_scaner_result_is_ready);
return packet.getContentI32(0) != 0;
}
public String codeScanerWaittingForResult(MId mid, Integer acitionOvertime) throws AppException {
private String codeScanerWaittingForResult(MId mid, Integer acitionOvertime) throws AppException {
long startedAt = System.currentTimeMillis();
do {
if (codeScanerResultIsReady(mid))
@ -78,4 +85,13 @@ public class CodeScanerDriver {
return codeScanerReadScanerResult(mid);
}
private void codeScanerStartScan(MId id) throws AppException {
canBus.callcmd(id, CmdId.code_scaner_start_scan);
}
private void codeScanerStopScan(MId id) throws AppException {
canBus.callcmd(id, CmdId.code_scaner_stop_scan);
}
}

43
src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java

@ -8,12 +8,14 @@ import a8k.app.type.exception.AppException;
import a8k.app.utils.DoAction;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@RequiredArgsConstructor
public class ConsumablesScanCtrlService {
public static class ConsumableOneChRawResult {
@ -32,14 +34,10 @@ public class ConsumablesScanCtrlService {
}
}
@Resource
VirtualDevice virtualDevice;
@Resource
Hbot2DCodeScanParamMgr hbotScanPos;
@Resource
CodeScanerDriver codeScaner;
@Resource
HbotMoveCtrlService hbot;
private final VirtualDevice virtualDevice;
private final CodeScanerDriver codeScaner;
private final HbotMoveExCtrlService hbotMoveExCtrlService;
//
// VIRTUAL
@ -82,7 +80,7 @@ public class ConsumablesScanCtrlService {
larBSScanResult[i] = virtualDevice.isEnable() ? virtualLarBSScanResult[i] : scanLarBS(i);
}
DoAction.doIt("扫描耗材", () -> hbotMoveTo(new Pos2d(0, 0)));
DoAction.doIt("扫描耗材", hbotMoveExCtrlService::moveQuickToZero);
for (int i = 0; i < 6; i++) {
@ -101,34 +99,19 @@ public class ConsumablesScanCtrlService {
}
//
// PRIVATE
//
private void hbotMoveTo(Pos2d tpos) throws AppException {
hbot.hbotMoveTo(tpos);
}
private String scan2dCode() throws AppException {
return codeScaner.pipetteModCodeScannerScanCode();
}
public String scanPB(int ch) throws AppException {
Pos2d pos = hbotScanPos.getPBScanPosX(ch);
hbotMoveTo(pos);
return scan2dCode();
hbotMoveExCtrlService.moveToPBCodeScanPos(ch);
return codeScaner.pipetteModCodeScannerScanCode();
}
public String scanLittBS(int ch) throws AppException {
Pos2d pos = hbotScanPos.getLittBSX(ch);
hbotMoveTo(pos);
return scan2dCode();
hbotMoveExCtrlService.moveToLittleBSCodeScanPos(ch);
return codeScaner.pipetteModCodeScannerScanCode();
}
public String scanLarBS(int ch) throws AppException {
Pos2d pos = hbotScanPos.getLarBSX(ch);
hbotMoveTo(pos);
return scan2dCode();
hbotMoveExCtrlService.moveToLargeBSCodeScanPos(ch);
return codeScaner.pipetteModCodeScannerScanCode();
}

58
src/main/java/a8k/app/service/lowerctrl/HbotMoveExCtrlService.java

@ -1,5 +1,6 @@
package a8k.app.service.lowerctrl;
import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.pos.TipGroupPos;
import a8k.app.type.a8k.pos.TipPos;
@ -19,32 +20,28 @@ import a8k.app.type.param.hbotpos.HbotSamplePos;
import a8k.app.type.exception.AppException;
import a8k.app.service.utils.ZAppChecker;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
@Slf4j
@Component
@RequiredArgsConstructor
public class HbotMoveExCtrlService {
@Resource
HbotFixedPosParamMgr hbotFixedPosParamMgr;
@Resource
HbotSamplePosParamMgr hbotSamplePosParamMgr;
@Resource
HbotConsumableExParamMgr hbotConsumableExParamMgr;
@Resource
HbotTipPosMgr hbotTipPosMgr;
@Resource
PipetteCtrlDriver pipetteCtrlDriver;
@Resource
HbotMoveCtrlService hbotMoveCtrlService;
@Resource
HbotDriver hbotDriver;
@Resource
ZAppChecker checker;
private final HbotFixedPosParamMgr hbotFixedPosParamMgr;
private final HbotSamplePosParamMgr hbotSamplePosParamMgr;
private final HbotConsumableExParamMgr hbotConsumableExParamMgr;
private final HbotTipPosMgr hbotTipPosMgr;
private final Hbot2DCodeScanParamMgr hbot2DCodeScanParamMgr;
private final PipetteCtrlDriver pipetteCtrlDriver;
private final HbotMoveCtrlService hbotMoveCtrlService;
private final HbotDriver hbotDriver;
private final ZAppChecker checker;
public void checkTipIndex(TipGroupPos tipGroupPos, Integer index) throws AppException {
if (index >= AppConstant.TIP_NUM) {
@ -91,7 +88,7 @@ public class HbotMoveExCtrlService {
pipetteCtrlDriver.zMotorMoveByBlock(-100);
Boolean isHasTip = pipetteCtrlDriver.isHasTip();
pipetteCtrlDriver.pipetteInitDeviceBlock(); //相当于丢弃tip
pipetteCtrlDriver.pipetteInitDeviceBlock(); //相当于丢弃tip
pipetteCtrlDriver.zMotorMoveToZeroPointQuickBlock();
return isHasTip;
@ -245,6 +242,29 @@ public class HbotMoveExCtrlService {
hbotMoveCtrlService.hbotMoveTo(topos);
}
public void moveToPBCodeScanPos(Integer groupoff) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getPBScanPosX(groupoff));
}
public void moveToLittleBSCodeScanPos(Integer groupoff) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLittBSX(groupoff));
}
public void moveToLargeBSCodeScanPos(Integer groupoff) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLarBSX(groupoff));
}
public void moveToPBCodeScanPos(ConsumableGroup group) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getPBScanPosX(group.off));
}
public void moveToLittleBSCodeScanPos(ConsumableGroup group) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLittBSX(group.off));
}
public void moveToLargeBSCodeScanPos(ConsumableGroup group) throws AppException {
hbotMoveCtrlService.hbotMoveTo(hbot2DCodeScanParamMgr.getLarBSX(group.off));
}
public void moveQuickToZero() throws AppException {
log.info("Hbot快速归零");

3
src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java

@ -191,8 +191,7 @@ public class TubeFeedingCtrlService {
moveTubeRackToScanPos();
tubeFeedingExCtrlService.scanClampModClamp();
codeScaner.codeScanerStartScan(MId.FeedingModScannerMod);
result = codeScaner.codeScanerWaittingForResult(MId.FeedingModScannerMod, 1000);
result = codeScaner.feedingModScannerModCodeScannerScanCode(1000);
tubeFeedingExCtrlService.scanClampModRelease();
if (result == null || result.isEmpty()) {
return "";

66
src/main/java/a8k/app/service/param/hbotpos/Hbot2DCodeScanParamMgr.java

@ -4,23 +4,17 @@ import a8k.app.service.param.base.ParamMgr;
import a8k.app.type.param.hbotpos.Hbot2DCodeScanPos;
import a8k.app.type.a8k.Pos2d;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* HBOT二维码扫描坐标参数
*/
@Component
@RequiredArgsConstructor
@Slf4j
public class Hbot2DCodeScanParamMgr extends ParamMgr {
static final Logger logger = LoggerFactory.getLogger(Hbot2DCodeScanParamMgr.class);
@Resource
HbotLittleBSPosMgr hbotLittleBSPosMgr;
@Resource
HbotLargeBottleBSPosMgr largeBottleBSPosMgr;
@PostConstruct
@ -28,7 +22,11 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr {
for (Hbot2DCodeScanPos pos : Hbot2DCodeScanPos.values()) {
initParam(pos, pos.chName, pos.type);
}
initParam(Hbot2DCodeScanPos.PBDY, Hbot2DCodeScanPos.PBDY.chName, Hbot2DCodeScanPos.PBDY.type, 265.0);
initParam(Hbot2DCodeScanPos.PBQRCodeDY, Hbot2DCodeScanPos.PBQRCodeDY.chName, Hbot2DCodeScanPos.PBQRCodeDY.type, 2650.0);
initParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, Hbot2DCodeScanPos.LargeBSQRCodeDX.chName, Hbot2DCodeScanPos.LargeBSQRCodeDX.type, 2650.0);
initParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, Hbot2DCodeScanPos.LargeBSQRCodeDY.chName, Hbot2DCodeScanPos.LargeBSQRCodeDY.type, 2650.0);
initParam(Hbot2DCodeScanPos.LittleBQRCodeDX, Hbot2DCodeScanPos.LittleBQRCodeDX.chName, Hbot2DCodeScanPos.LittleBQRCodeDX.type, 12300.0);
initParam(Hbot2DCodeScanPos.LittleBQRCodeDY, Hbot2DCodeScanPos.LittleBQRCodeDY.chName, Hbot2DCodeScanPos.LittleBQRCodeDY.type, 12540.0);
for (int i = 0; i < 6; i++) {
getPBScanPosX(i);
getLittBSX(i);
@ -40,10 +38,44 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr {
setParam(Hbot2DCodeScanPos.PBScanPos0, pos);
}
public void setPBDY(Double dy) {
setParam(Hbot2DCodeScanPos.PBQRCodeDY, dy);
}
public Double getPBDY() {
return getParam(Hbot2DCodeScanPos.PBQRCodeDY, Double.class);
}
public void setLittBSX(Pos2d pos) {
setParam(Hbot2DCodeScanPos.LittBS0, pos);
}
public void setLittleBQRCodeDxAndDy(Double dx, Double dy) {
setParam(Hbot2DCodeScanPos.LittleBQRCodeDX, dx);
setParam(Hbot2DCodeScanPos.LittleBQRCodeDY, dy);
}
public Double getLittleBQRCodeDX() {
return getParam(Hbot2DCodeScanPos.LittleBQRCodeDX, Double.class);
}
public Double getLittleBQRCodeDY() {
return getParam(Hbot2DCodeScanPos.LittleBQRCodeDY, Double.class);
}
public void setLargeBSQRCodeDxAndDy(Double dx, Double dy) {
setParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, dx);
setParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, dy);
}
public Double getLargeBSQRCodeDX() {
return getParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, Double.class);
}
public Double getLargeBSQRCodeDY() {
return getParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, Double.class);
}
public void setLarBSX(Pos2d pos) {
setParam(Hbot2DCodeScanPos.LarBS0, pos);
}
@ -53,7 +85,7 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr {
if (pos == null) {
return null;
}
Double dy = getParam(Hbot2DCodeScanPos.PBDY, Double.class);
Double dy = getParam(Hbot2DCodeScanPos.PBQRCodeDY, Double.class);
pos.y = (int) (pos.y + dy * channel);
@ -67,10 +99,12 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr {
if (pos == null) {
return null;
}
pos.x = (int) (pos.x + xoff * hbotLittleBSPosMgr.getGroupDX());
pos.y = (int) (pos.y + yoff * hbotLittleBSPosMgr.getGroupDY());
pos.x = (int) (pos.x + xoff * getParam(Hbot2DCodeScanPos.LittleBQRCodeDX, Double.class));
pos.y = (int) (pos.y + yoff * getParam(Hbot2DCodeScanPos.LittleBQRCodeDY, Double.class));
return pos;
}
// LargeBufferScanPos_DX("大瓶缓冲液的扫码位置dx", Double.class),
// LargeBufferScanPos_DY("大瓶缓冲液的扫码位置dy", Double.class),
public Pos2d getLarBSX(Integer X) {
@ -80,8 +114,8 @@ public class Hbot2DCodeScanParamMgr extends ParamMgr {
if (pos == null) {
return null;
}
pos.x = (int) (pos.x + xoff * largeBottleBSPosMgr.getLargeBufferScanPosDx());
pos.y = (int) (pos.y + yoff * largeBottleBSPosMgr.getLargeBufferScanPosDy());
pos.x = (int) (pos.x + xoff * getParam(Hbot2DCodeScanPos.LargeBSQRCodeDX, Double.class));
pos.y = (int) (pos.y + yoff * getParam(Hbot2DCodeScanPos.LargeBSQRCodeDY, Double.class));
return pos;
}

14
src/main/java/a8k/app/service/param/hbotpos/HbotLargeBottleBSPosMgr.java

@ -68,11 +68,11 @@ public class HbotLargeBottleBSPosMgr extends ParamMgr {
var.z = getParam(HbotLargeBottleBSPos.LargeBottleBufferBottomZAxisPos, Double.class).intValue();
return var;
}
public Double getLargeBufferScanPosDx() {
return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DX, Double.class);
}
public Double getLargeBufferScanPosDy() {
return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DY, Double.class);
}
// public Double getLargeBufferScanPosDx() {
// return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DX, Double.class);
// }
//
// public Double getLargeBufferScanPosDy() {
// return getParam(HbotLargeBottleBSPos.LargeBufferScanPos_DY, Double.class);
// }
}

7
src/main/java/a8k/app/type/param/hbotpos/Hbot2DCodeScanPos.java

@ -7,7 +7,12 @@ public enum Hbot2DCodeScanPos {
LittBS0("小缓冲液扫码位置0", Pos2d.class),
LarBS0("大缓冲液扫码位置0", Pos2d.class),
PBDY("板夹仓扫码位置Y", Double.class),
PBQRCodeDY("板夹仓扫码GROUP间距", Double.class),
LargeBSQRCodeDX("大瓶缓冲液的扫码GROUP间距", Double.class),
LargeBSQRCodeDY("大瓶缓冲液的扫码GROUP间距", Double.class),
LittleBQRCodeDX("小瓶缓冲液的GROUP间距", Double.class),
LittleBQRCodeDY("小瓶缓冲液的GROUP间距", Double.class),
;
public final String chName;

3
src/main/java/a8k/app/type/param/hbotpos/HbotLargeBottleBSPos.java

@ -7,8 +7,7 @@ public enum HbotLargeBottleBSPos {
LargeBuffer_0Pos("大瓶缓冲液的第1个位置", Pos2d.class),
LargeBuffer_DX("大瓶缓冲液的X间距", Double.class),
LargeBuffer_DY("大瓶缓冲液的Y间距", Double.class),
LargeBufferScanPos_DX("大瓶缓冲液的扫码位置dx", Double.class),
LargeBufferScanPos_DY("大瓶缓冲液的扫码位置dy", Double.class),
LargeBottleBufferLLDStartZAxisPos("大瓶缓冲液LLD起始Z轴坐标", Double.class),
LargeBottleBufferBottomZAxisPos("大瓶缓冲液瓶底Z轴坐标", Double.class),

4
src/main/java/a8k/app/type/param/hbotpos/HbotLittleBSPos.java

@ -1,3 +1,7 @@
package a8k.app.type.param.hbotpos;
import a8k.app.type.a8k.Pos2d;

3
src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java

@ -2,6 +2,7 @@ package a8k.extui.mgr;
import a8k.app.utils.ZList;
import a8k.extui.page.debug.*;
import a8k.extui.page.driver.*;
import a8k.extui.page.extapp.*;
import a8k.extui.page.extapp.debug_assistant.IDCardDataGeneratorPage;
import a8k.extui.page.extsetting.db.A8kSubModuleParameterInitDebugPage;
@ -10,7 +11,6 @@ import a8k.extui.page.extsetting.db.ProjInfoMgrPage;
import a8k.extui.page.extsetting.db.ReactionRecordMgrDebugPage;
import a8k.extui.page.init.DeviceInitPage;
import a8k.extui.page.measurement.*;
import a8k.extui.page.test.driver.*;
import a8k.extui.page.test.codetest.OptFormulaTestPage;
import a8k.extui.page.test.codetest.OptFormulaTestPageV2;
@ -156,6 +156,7 @@ public class ExtApiPageGroupCfgMgr {
new Menu(P32HbotPosVerificationPage.class, "单步-HBOT位置"),
new Menu(P33HbotSamplePosVerificationPage.class, "单步-取样品位置"),
new Menu(P34LiquidOperationTestPage.class, "单步-液体操作"),
new Menu(HbotCodeScanPosVerificationPage.class, "单步-HBOT扫码"),
new Menu(P50VerificationScriptPage.class, "脚本-模块验证"),
new Menu(P51FullFlowVerificationPage.class, "脚本-全流程验证")
)),

66
src/main/java/a8k/extui/page/driver/CodeScanerDriverCtrlPage.java

@ -0,0 +1,66 @@
package a8k.extui.page.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.CodeScanerDriver;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class CodeScanerDriverCtrlPage {
final private ExtApiPageMgr extApiPageMgr;
final private CodeScanerDriver codeScanerDriver;
public String pipetteModCodeScannerScanCode() throws AppException {
var ret = codeScanerDriver.pipetteModCodeScannerScanCode(10 * 1000);
if (ret == null || ret.isEmpty()) {
return "null";
}
return ret;
}
public void pipetteGunStartScan() throws AppException {
codeScanerDriver.pipetteModCodeScannerStartScan();
}
public void pipetteGunStopScan() throws AppException {
codeScanerDriver.pipetteModCodeScannerStopScan();
}
public String feedingModScannerModCodeScannerScanCode() {
var ret = codeScanerDriver.feedingModScannerModCodeScannerScanCode(10 * 1000);
if (ret == null || ret.isEmpty()) {
return "null";
}
return ret;
}
public void feedingModScannerModCodeScannerStartScan() throws AppException {
codeScanerDriver.feedingModScannerModCodeScannerStartScan();
}
public void feedingModScannerModCodeScannerStopScan() throws AppException {
codeScanerDriver.feedingModScannerModCodeScannerStopScan();
}
@PostConstruct
void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("Z轴扫码器");
page.addFunction("扫码(阻塞)", this::pipetteModCodeScannerScanCode);
page.addFunction("扫码开始", this::pipetteGunStartScan);
page.addFunction("扫码停止", this::pipetteGunStopScan);
page.newGroup("进出料扫描");
page.addFunction("扫码(阻塞)", this::feedingModScannerModCodeScannerScanCode);
page.addFunction("扫码开始", this::feedingModScannerModCodeScannerStartScan);
page.addFunction("扫码停止", this::feedingModScannerModCodeScannerStopScan);
extApiPageMgr.addPage(page);
}
}

172
src/main/java/a8k/extui/page/driver/HbotCtrlPage.java

@ -0,0 +1,172 @@
package a8k.extui.page.driver;
import a8k.app.constant.GearBacklashConstant;
import a8k.app.hardware.driver.HbotDriver;
import a8k.app.hardware.driver.PipetteCtrlDriver;
import a8k.app.hardware.type.PipetteRegIndex;
import a8k.app.type.a8k.Pos2d;
import a8k.app.type.a8k.Pos3d;
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 HbotCtrlPage {
private final ExtApiPageMgr extApiPageMgr;
private final HbotDriver hbotDriver;
private final PipetteCtrlDriver pipetteCtrlDriver;
@ExtApiStatu(group = "Hbot当前坐标")
public Pos3d readPos() throws AppException {
Pos3d pos = new Pos3d();
pos.x = hbotDriver.readPos().x;
pos.y = hbotDriver.readPos().y;
pos.z = pipetteCtrlDriver.getReg(PipetteRegIndex.kreg_pipette_zm_pos);
return pos;
}
Integer moveByDistance = 100;
Integer zMotorMoveByDistance = 10;
@ExtApiStatu(group = "HBOT相对移动距离")
public Integer getMoveByDistance() {
return moveByDistance;
}
@ExtApiStatu(group = "Z轴相对移动距离")
public Integer getZMotorMoveByDistance() {
return zMotorMoveByDistance;
}
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 - GearBacklashConstant.HBOT_GEAR_BACKLASH, pos.y);
hbotDriver.moveToBlock(pos.x, pos.y);
}
public void moveTo(Integer x, Integer y) throws AppException {
hbotDriver.enable(1);
pipetteCtrlDriver.zMotorEnable(1);
hbotDriver.moveToBlock(x - GearBacklashConstant.HBOT_GEAR_BACKLASH, y);
hbotDriver.moveToBlock(x, y);
}
public void zMotorMoveTo(Integer z) throws AppException {
pipetteCtrlDriver.zMotorMoveToBlock(z);
}
void zMotorMoveBy(Integer dz) throws AppException {
pipetteCtrlDriver.zMotorMoveByBlock(dz);
}
synchronized public void setMoveByDistance(Integer distance) {
moveByDistance = distance;
}
synchronized public void setzMotorMoveByDistance(Integer distance) {
zMotorMoveByDistance = distance;
}
synchronized public void mveoToZero() throws AppException {
hbotDriver.enable(1);
pipetteCtrlDriver.zMotorEnable(1);
pipetteCtrlDriver.zMotorMoveZeroBlock();
hbotDriver.moveToZeroBlock();
}
public void moveBackward() throws AppException {
moveBy(0, -moveByDistance);
}
public void moveForward() throws AppException {
moveBy(0, moveByDistance);
}
public void moveLeft() throws AppException {
moveBy(-moveByDistance, 0);
}
public void moveRight() throws AppException {
moveBy(moveByDistance, 0);
}
public void zmoveUp() throws AppException {
zMotorMoveBy(-zMotorMoveByDistance);
}
public void zmoveDown() throws AppException {
zMotorMoveBy(zMotorMoveByDistance);
}
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 void measurementMoveTo(Integer x, Integer y, Integer z) throws AppException {
hbotDriver.enable(1);
pipetteCtrlDriver.zMotorEnable(1);
pipetteCtrlDriver.zMotorMoveToBlock(0);
hbotDriver.moveToBlock(x - GearBacklashConstant.HBOT_GEAR_BACKLASH, y);
hbotDriver.moveToBlock(x, y);
pipetteCtrlDriver.zMotorMoveToBlock(z);
}
public Pos3d readPosNoEx() {
try {
return readPos();
} catch (AppException e) {
log.error("readPosNoEx error", e);
return new Pos3d();
}
}
@PostConstruct
public void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("基础");
page.addFunction("归零", this::mveoToZero);
page.newGroup("Hbot");
page.addFunction("设置相对移动距离", this::setMoveByDistance).setParamVal("distance", () -> moveByDistance);
page.addFunction("前(向人移动)", this::moveForward);
page.addFunction("后", this::moveBackward);
page.addFunction("左", this::moveLeft);
page.addFunction("右", this::moveRight);
page.addFunction("移动到", this::moveTo).setParamVal("x", 0).setParamVal("y", 0);
page.newGroup("Z轴");
page.addFunction("设置Z轴相对移动距离", this::setzMotorMoveByDistance).setParamVal("distance", () -> zMotorMoveByDistance);
page.addFunction("上", this::zmoveUp);
page.addFunction("下", this::zmoveDown);
page.addFunction("移动到", this::zMotorMoveTo).setParamVal("z", 0);
page.newGroup("移动到");
page.addFunction("移动到", this::measurementMoveTo);
page.addFunction("移动到", this::measurementMoveTo);
page.addFunction("移动到", this::measurementMoveTo).setParamVal("x", readPosNoEx().x).setParamVal("y", readPosNoEx().y).setParamVal("z", readPosNoEx().z);
extApiPageMgr.addPage(page);
}
}

2
src/main/java/a8k/extui/page/test/driver/InputIOStateScannerPage.java → src/main/java/a8k/extui/page/driver/InputIOStateScannerPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.InputDetectDriver;

2
src/main/java/a8k/extui/page/test/driver/LowLevelBoardVersionPreviewPage.java → src/main/java/a8k/extui/page/driver/LowLevelBoardVersionPreviewPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.channel.A8kCanBusService;

2
src/main/java/a8k/extui/page/test/driver/MiniServoCtrlPage.java → src/main/java/a8k/extui/page/driver/MiniServoCtrlPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.MiniServoDriver;

2
src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java → src/main/java/a8k/extui/page/driver/MotorCtrlPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.StepMotorCtrlDriver;

2
src/main/java/a8k/extui/page/test/driver/OutputIOCtrlDebugPage.java → src/main/java/a8k/extui/page/driver/OutputIOCtrlDebugPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.OutputIOCtrlDriver;

2
src/main/java/a8k/extui/page/test/driver/PipetteCtrlDriverPage.java → src/main/java/a8k/extui/page/driver/PipetteCtrlDriverPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.hardware.driver.PipetteCtrlDriver;
import a8k.extui.mgr.ExtApiPageMgr;

8
src/main/java/a8k/extui/page/test/driver/PipetteMotorCtrlPage.java → src/main/java/a8k/extui/page/driver/PipetteMotorCtrlPage.java

@ -1,19 +1,13 @@
package a8k.extui.page.test.driver;
package a8k.extui.page.driver;
import a8k.app.hardware.driver.PipetteCtrlDriver;
import a8k.app.hardware.driver.StepMotorCtrlDriver;
import a8k.app.hardware.type.PipetteRegIndex;
import a8k.app.hardware.type.StepMotorMId;
import a8k.app.hardware.type.PipetteRegIndex;
import a8k.app.type.exception.AppException;
import a8k.app.utils.ZJsonNode;
import a8k.extui.mgr.ExtApiPageMgr;
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

28
src/main/java/a8k/extui/page/extsetting/pos_calibration/P24Hbot2DCodeScanPosCalibrationPage.java

@ -19,14 +19,27 @@ public class P24Hbot2DCodeScanPosCalibrationPage {
hbot2DCodeScanParamMgr.setPBScanPosX(new Pos2d(x, y));
}
public void setPBDY(Double dy) {
hbot2DCodeScanParamMgr.setPBDY(dy);
}
public void setLittBSX(Integer x, Integer y) {
hbot2DCodeScanParamMgr.setLittBSX(new Pos2d(x, y));
}
public void setLittleBQRCodeDxAndDy(Double dx, Double dy) {
hbot2DCodeScanParamMgr.setLittleBQRCodeDxAndDy(dx, dy);
}
public void setLargeBSQRCodeDxAndDy(Double dx, Double dy) {
hbot2DCodeScanParamMgr.setLargeBSQRCodeDxAndDy(dx, dy);
}
public void setLarBSX(Integer x, Integer y) {
hbot2DCodeScanParamMgr.setLarBSX(new Pos2d(x, y));
}
@Resource
ExtApiPageMgr extApiPageMgr;
@ -34,16 +47,29 @@ public class P24Hbot2DCodeScanPosCalibrationPage {
public void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("");
page.newGroup("板夹仓");
page.addFunction("设置PB扫描位置", this::setPBScanPosX)
.setParamVal("x", () -> hbot2DCodeScanParamMgr.getPBScanPosX(0).x)
.setParamVal("y", () -> hbot2DCodeScanParamMgr.getPBScanPosX(0).y);
page.addFunction("设置PB扫描Y轴位置", this::setPBDY)
.setParamVal("dy", () -> hbot2DCodeScanParamMgr.getPBDY());
page.newGroup("小瓶缓冲液");
page.addFunction("设置小瓶缓冲液0位置", this::setLittBSX)
.setParamVal("x", () -> hbot2DCodeScanParamMgr.getLittBSX(0).x)
.setParamVal("y", () -> hbot2DCodeScanParamMgr.getLittBSX(0).y);
page.addFunction("设置小瓶缓冲液间距", this::setLittleBQRCodeDxAndDy)
.setParamVal("dx", () -> hbot2DCodeScanParamMgr.getLittleBQRCodeDX())
.setParamVal("dy", () -> hbot2DCodeScanParamMgr.getLittleBQRCodeDY());
page.newGroup("大瓶缓冲液");
page.addFunction("设大瓶缓冲液0位置", this::setLarBSX)
.setParamVal("x", () -> hbot2DCodeScanParamMgr.getLarBSX(0).x)
.setParamVal("y", () -> hbot2DCodeScanParamMgr.getLarBSX(0).y);
page.addFunction("设置大瓶缓冲液间距", this::setLargeBSQRCodeDxAndDy)
.setParamVal("dx", () -> hbot2DCodeScanParamMgr.getLargeBSQRCodeDX())
.setParamVal("dy", () -> hbot2DCodeScanParamMgr.getLargeBSQRCodeDY());
extApiPageMgr.addPage(page);

23
src/main/java/a8k/extui/page/measurement/HbotPosMeasurePage.java

@ -1,6 +1,8 @@
package a8k.extui.page.measurement;
import a8k.app.constant.GearBacklashConstant;
import a8k.app.hardware.driver.CodeScanerDriver;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.type.a8k.Pos2d;
import a8k.app.type.a8k.Pos3d;
import a8k.app.type.exception.AppException;
@ -25,6 +27,7 @@ public class HbotPosMeasurePage {
private final ExtApiPageMgr extApiPageMgr;
private final HbotDriver hbotDriver;
private final PipetteCtrlDriver pipetteCtrlDriver;
private final CodeScanerDriver codeScanerDriver;
@ExtApiStatu(group = "Hbot当前坐标")
public Pos3d readPos() throws AppException {
@ -48,6 +51,18 @@ public class HbotPosMeasurePage {
return zMotorMoveByDistance;
}
public void openCodeScanner() throws AppException {
codeScanerDriver.pipetteModCodeScannerStartScan();
}
public void closeCodeScanner() throws AppException {
codeScanerDriver.pipetteModCodeScannerStopScan();
}
public String scanCode() throws AppException {
return codeScanerDriver.pipetteModCodeScannerScanCode();
}
public void moveBy(Integer dx, Integer dy) throws AppException {
hbotDriver.enable(1);
pipetteCtrlDriver.zMotorEnable(1);
@ -139,7 +154,8 @@ public class HbotPosMeasurePage {
var page = extApiPageMgr.newPage(this);
page.newGroup("基础");
page.addFunction("开始测量", this::enableMeasurment);
page.addFunction("HBOT归零", this::enableMeasurment);
page.addFunction("测量当前位置",this::measurementCurrentPos);
page.newGroup("Hbot");
page.addFunction("设置相对移动距离", this::setMoveByDistance).setParamVal("distance", () -> moveByDistance);
@ -155,6 +171,11 @@ public class HbotPosMeasurePage {
page.addFunction("下", this::zmoveDown);
page.addFunction("移动到", this::zMotorMoveTo).setParamVal("z", 0);
page.newGroup("扫码");
page.addFunction("打开扫码灯", this::openCodeScanner);
page.addFunction("关闭扫码灯", this::closeCodeScanner);
page.addFunction("扫码(阻塞)", this::scanCode);
page.newGroup("移动到");
page.addFunction("移动到", this::measurementMoveTo);
page.addFunction("移动到", this::measurementMoveTo);

44
src/main/java/a8k/extui/page/test/driver/CodeScanerDriverCtrlPage.java

@ -1,44 +0,0 @@
package a8k.extui.page.test.driver;
import a8k.app.type.exception.AppException;
import a8k.app.hardware.driver.CodeScanerDriver;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class CodeScanerDriverCtrlPage {
final private ExtApiPageMgr extApiPageMgr;
final private CodeScanerDriver codeScanerDriver;
public String pipetteModCodeScannerScanCode() throws AppException {
var ret = codeScanerDriver.pipetteModCodeScannerScanCode(10 * 1000);
if (ret == null || ret.isEmpty()) {
return "null";
}
return ret;
}
public String feedingModScannerModCodeScannerScanCode() {
var ret = codeScanerDriver.feedingModScannerModCodeScannerScanCode(10 * 1000);
if (ret == null || ret.isEmpty()) {
return "null";
}
return ret;
}
@PostConstruct
void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("扫码");
page.addFunction("机械臂Z轴板扫码", this::pipetteModCodeScannerScanCode);
page.addFunction("出入料模块扫码", this::feedingModScannerModCodeScannerScanCode);
extApiPageMgr.addPage(page);
}
}

71
src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java

@ -0,0 +1,71 @@
package a8k.extui.page.test.verification;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.hardware.driver.CodeScanerDriver;
import a8k.app.hardware.type.A8kEcode;
import a8k.app.i18n.Internationalization;
import a8k.app.service.background.ProjIDCardCtrlAndMonitorService;
import a8k.app.service.data.ProjIdCardInfoMgrService;
import a8k.app.service.lowerctrl.DeviceMoveToZeroCtrlService;
import a8k.app.service.lowerctrl.HbotMoveCtrlService;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;
import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.exception.AppException;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import com.fasterxml.jackson.annotation.JsonInclude;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
@Slf4j
@RequiredArgsConstructor
public class HbotCodeScanPosVerificationPage {
private final ExtApiPageMgr extApiPageMgr;
private final HbotMoveExCtrlService hbotMoveExCtrlService;
private final CodeScanerDriver codeScanerDriver;
//
// 基础操作
//
public void moveToPBScanPos(ConsumableGroup group) throws AppException {
hbotMoveExCtrlService.moveToPBCodeScanPos(group);
}
public void moveToLittleBSCodeScanPos(ConsumableGroup group) throws AppException {
hbotMoveExCtrlService.moveToLittleBSCodeScanPos(group);
}
public void moveToLargeBSCodeScanPos(ConsumableGroup group) throws AppException {
hbotMoveExCtrlService.moveToLargeBSCodeScanPos(group);
}
public void startCodeScan() throws AppException {
codeScanerDriver.pipetteModCodeScannerStartScan();
}
public void stopCodeScan() throws AppException {
codeScanerDriver.pipetteModCodeScannerStopScan();
}
@PostConstruct
void init() {
ExtUIPageCfg cfg = extApiPageMgr.newPage(this);
cfg.newGroup("位置移动");
cfg.addFunction("移动到PB扫码位置", this::moveToPBScanPos);
cfg.addFunction("移动到小瓶扫码位置", this::moveToLittleBSCodeScanPos);
cfg.addFunction("移动到大瓶扫码位置", this::moveToLargeBSCodeScanPos);
cfg.addFunction("扫码", this::startCodeScan);
cfg.addFunction("停止扫码", this::stopCodeScan);
extApiPageMgr.addPage(cfg);
}
}
Loading…
Cancel
Save