diff --git a/doc/TODO.md b/doc/TODO.md index 2337cbe..5b1f6be 100644 --- a/doc/TODO.md +++ b/doc/TODO.md @@ -32,4 +32,7 @@ 8. 设备启动任务之时检查一些光电标志位 9. 解决取样品时,医生忘记打开TIP盖子导致的硬件错误 10. java程序死掉后,后台电机自动停止工作 +11. BUG2 + 下发指令都是正确的,但单片机接收到数据后报错参数数量错误,通过对照单片机代码,和部分日志,初步分析最大的可能性是 +linux can 底层发送的包的dlc长度不对,导致单片机接收到的数据长度不对,从而导致参数数量错误。 ``` \ No newline at end of file diff --git a/src/main/java/a8k/app/a8ktype/error/AEHardwareError.java b/src/main/java/a8k/app/a8ktype/error/AEHardwareError.java index 3a0623d..102999b 100644 --- a/src/main/java/a8k/app/a8ktype/error/AEHardwareError.java +++ b/src/main/java/a8k/app/a8ktype/error/AEHardwareError.java @@ -7,13 +7,24 @@ import io.swagger.v3.oas.annotations.media.Schema; public class AEHardwareError extends AppError { @Schema(description = "模块id(辅助调试,直接原始显示就行)") - public MId mid; + public MId mid; @Schema(description = "命令id(辅助调试,直接原始显示就行)") - public CmdId cmdId; + public CmdId cmdId; + + public String rawtxcmd; + public String rawrxcmd; + + public AEHardwareError(A8kEcode errorCode, MId mid, CmdId cmdId, String rawtxcmd, String rawrxcmd) { + super(errorCode); + this.mid = mid; + this.cmdId = cmdId; + this.rawtxcmd = rawtxcmd; + this.rawrxcmd = rawrxcmd; + } public AEHardwareError(A8kEcode errorCode, MId mid, CmdId cmdId) { super(errorCode); - this.mid = mid; - this.cmdId = cmdId; + this.mid = mid; + this.cmdId = cmdId; } } diff --git a/src/main/java/a8k/app/a8ktype/param/hbotpos/HbotLittleBSPos.java b/src/main/java/a8k/app/a8ktype/param/hbotpos/HbotLittleBSPos.java index 3cc4ed6..2eccf82 100644 --- a/src/main/java/a8k/app/a8ktype/param/hbotpos/HbotLittleBSPos.java +++ b/src/main/java/a8k/app/a8ktype/param/hbotpos/HbotLittleBSPos.java @@ -23,6 +23,9 @@ public enum HbotLittleBSPos { ProbeSubstancePierceZPos("探测物质液刺破Z坐标", Integer.class), ProbeSubstanceSampleZPos("探测物质取样Z坐标", Integer.class), + + + ; final public String chName; final public Class type; diff --git a/src/main/java/a8k/app/hardware/basedriver/A8kCanBusConnection.java b/src/main/java/a8k/app/hardware/basedriver/A8kCanBusConnection.java index 4370133..299c7e6 100644 --- a/src/main/java/a8k/app/hardware/basedriver/A8kCanBusConnection.java +++ b/src/main/java/a8k/app/hardware/basedriver/A8kCanBusConnection.java @@ -39,7 +39,7 @@ public class A8kCanBusConnection extends WebSocketClient { Map txcmdcache = new HashMap<>(); - public A8kPacket getReceipt(int overtime) { + public A8kPacket getReceipt(int overtime) { long end = System.currentTimeMillis() + overtime; while (System.currentTimeMillis() < end) { int left = (int) (end - System.currentTimeMillis()); @@ -215,15 +215,19 @@ public class A8kCanBusConnection extends WebSocketClient { A8kPacket receipt; - receipt = context.getReceipt(overtime); + receipt = context.getReceipt(overtime); if (receipt == null) { throw buildOvertimeError(pack); } if (receipt.getPacketType() == A8kPacket.PACKET_TYPE_ERROR_ACK) { throw AppException.of(new AEHardwareError(A8kEcode.fromInt(receipt.getContentI32(0)), - MId.valueOf(pack.getModuleId()), - CmdId.valueOf(pack.getCmdId()))); + MId.valueOf(pack.getModuleId()), + CmdId.valueOf(pack.getCmdId()), + txpacket, + receipt.toByteString() + ) + ); } OS.forceSleep(10); return receipt; diff --git a/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java b/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java index 28bc6a0..47b26fe 100644 --- a/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java +++ b/src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java @@ -166,12 +166,14 @@ public class PipetteCtrlDriver { public void pipetteAspirate(Double ul) throws AppException { double nl = ul * 1000; + log.info("pipetteAspirate: {}", nl); canBusService.callcmd(MId.PipetteMod, CmdId.pipette_aspirate, (int) nl); canBusService.waitForMod(MId.PipetteMod, overtime); } public void pipetteDistribu(Double ul) throws AppException { double nl = ul * 1000; + log.info("pipetteDistribu: {}", nl); canBusService.callcmd(MId.PipetteMod, CmdId.pipette_distribu, (int) nl); canBusService.waitForMod(MId.PipetteMod, overtime); } diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java index 6316f21..ab12e3a 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java @@ -9,6 +9,7 @@ import a8k.app.service.statemgr.ProjectContextMgrService; import a8k.app.a8ktype.state.IncubationSubTank; import a8k.app.a8ktype.state.ProjectTaskContext; import a8k.app.service.lowerctrl.OptScanModuleCtrlService; +import a8k.app.utils.ZList; import a8k.teststate.VirtualDevice; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; @@ -67,7 +68,8 @@ public class AC20ProcessCompletedPlate extends A8kActionTask { try { doEjectPlate(tank); } catch (AppException e) { - logger.error("catch e,{}", e.getMessage(), e); + logger.error("处理已孵育完的反应板失败", e); + return ZList.of(e.getError()); } toBeProcesstank = tank; diff --git a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java new file mode 100644 index 0000000..7614960 --- /dev/null +++ b/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java @@ -0,0 +1,84 @@ +package a8k.extui.page.test.driver; + +import a8k.app.a8ktype.exception.AppException; +import a8k.app.hardware.driver.StepMotorCtrlDriver; +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 MotorCtrlPage { + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + + @Resource + ExtApiPageMgr extApiPageMgr; + + StepMotorMId id = StepMotorMId.FeedingModXM; + Integer dpos = 10; + + + public void setStepMotorId(StepMotorMId id) { + this.id = id; + } + + public void setStepMotorDpos(Integer dpos) { + this.dpos = dpos; + } + + // + + public void enableMotor() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(id, 1); + } + + public void disableMotor() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(id, 0); + } + + + public void stepMotorEasyMoveToZero() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(id, 10000); + } + + public void stepMotorEasyMoveForward() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, dpos, 10000); + } + + public void stepMotorEasyMoveBackward() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(id, -dpos, 10000); + } + + public void stepMotorEasyMoveTo(Integer pos) throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(id, pos, 10000); + } + + + @PostConstruct + void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("上下文"); + page.addFunction("设置电机ID", this::setStepMotorId).setParamVal("id", () -> id); + + + page.newGroup("基础操作"); + page.addFunction("使能电机", this::enableMotor); + page.addFunction("失能电机", this::disableMotor); + page.addFunction("快速归零", this::stepMotorEasyMoveToZero); + + page.newGroup("相对移动"); + page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos); + page.addFunction("正向移动", this::stepMotorEasyMoveForward); + page.addFunction("反向移动", this::stepMotorEasyMoveBackward); + + page.newGroup("绝对移动"); + page.addFunction("绝对移动", this::stepMotorEasyMoveTo); + + extApiPageMgr.addPage(page); + + + } +} diff --git a/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java b/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java index e4ed88e..c0b9238 100644 --- a/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java +++ b/src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java @@ -39,6 +39,7 @@ public class P31ReactionPlatesTransmitPosVerificationPage { public void trunableMoveToPushPos(IncubatorPos index) throws AppException { turnableMoveCtrlService.trunableMoveToPushPos(index); + plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, index); } public void trunableMoveToPullPos(IncubatorPos index) throws AppException { @@ -89,11 +90,11 @@ public class P31ReactionPlatesTransmitPosVerificationPage { page.addFunction("移动到滴液位置", this::trunableMoveToDropLiquidPos); page.newGroup("反应板夹仓-脚本测试"); + page.addFunction("推入&&推出(One)", this::pushOneAndRemove); page.addFunction("推入&&推出(测试板夹仓位置)", this::pushAllAndRemoveAll); page.addFunction("推入&&推出(测试孵育盘位置)", this::pushAllAndRemoveAll2); extApiPageMgr.addPage(page); } - }