Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
dd196088d8
  1. 3
      doc/TODO.md
  2. 19
      src/main/java/a8k/app/a8ktype/error/AEHardwareError.java
  3. 3
      src/main/java/a8k/app/a8ktype/param/hbotpos/HbotLittleBSPos.java
  4. 12
      src/main/java/a8k/app/hardware/basedriver/A8kCanBusConnection.java
  5. 2
      src/main/java/a8k/app/hardware/driver/PipetteCtrlDriver.java
  6. 4
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ProcessCompletedPlate.java
  7. 84
      src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java
  8. 3
      src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java

3
doc/TODO.md

@ -32,4 +32,7 @@
8. 设备启动任务之时检查一些光电标志位
9. 解决取样品时,医生忘记打开TIP盖子导致的硬件错误
10. java程序死掉后,后台电机自动停止工作
11. BUG2
下发指令都是正确的,但单片机接收到数据后报错参数数量错误,通过对照单片机代码,和部分日志,初步分析最大的可能性是
linux can 底层发送的包的dlc长度不对,导致单片机接收到的数据长度不对,从而导致参数数量错误。
```

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

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

12
src/main/java/a8k/app/hardware/basedriver/A8kCanBusConnection.java

@ -39,7 +39,7 @@ public class A8kCanBusConnection extends WebSocketClient {
Map<MId, CmdId> 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;

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

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

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

3
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);
}
}
Loading…
Cancel
Save