diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java index 0986867..cfbf530 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java +++ b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java @@ -43,7 +43,6 @@ public class A8kCanBusConnection extends WebSocketClient { Boolean enableCanBus; - static class ProcessContext { BlockingQueue receiptQueue = new LinkedBlockingQueue<>(); // A8kPacket cmdPacket; @@ -53,10 +52,9 @@ public class A8kCanBusConnection extends WebSocketClient { public A8kPacket getReceipt(int overtime) { long end = System.currentTimeMillis() + overtime; while (System.currentTimeMillis() < end) { - int left = (int) (end - System.currentTimeMillis()); A8kPacket packet = null; try { - packet = receiptQueue.poll(left, TimeUnit.MILLISECONDS); + packet = receiptQueue.poll(10, TimeUnit.MILLISECONDS); } catch (InterruptedException ignored) { } if (packet != null) { @@ -77,6 +75,9 @@ public class A8kCanBusConnection extends WebSocketClient { } else { log.warn("RX index equal, but cmdId not equal, {} {}", this.cmdPacket, receipt); } + } else { + log.warn("RX unmatched index receipt, {} {}", this.cmdPacket, receipt); + log.warn("."); } } @@ -119,6 +120,7 @@ public class A8kCanBusConnection extends WebSocketClient { } @Override public void onMessage(String s) { + log.debug("RX-RAW: {}", s); processCanRxMessage(s); } @@ -165,7 +167,8 @@ public class A8kCanBusConnection extends WebSocketClient { // @Scheduled(fixedRate = 10000) private void autoConnect() { - if(!enableCanBus) return; + if (!enableCanBus) + return; if (!isOpen()) { if (getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { @@ -248,6 +251,7 @@ public class A8kCanBusConnection extends WebSocketClient { A8kPacket receipt; receipt = context.getReceipt(overtime); if (receipt == null) { + log.debug("RX-NULL: |RAW:{}| {}", txpacket, pack); throw buildOvertimeError(pack); } diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java index c638376..7e803d7 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java +++ b/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java @@ -78,7 +78,7 @@ public class A8kCanBusService { } public Integer moduleGetReg(MId id, RegIndex regindex) throws AppException { - var packet = connection.callcmd2(id, CmdId.module_get_reg, 50, regindex.index); + var packet = connection.callcmd2(id, CmdId.module_get_reg, 100, regindex.index); return packet.getContentI32(0); } diff --git a/src/main/java/a8k/app/service/analyzer/A8kIdCardDataParseService.java b/src/main/java/a8k/app/service/analyzer/A8kIdCardDataParseService.java index 5d8c2de..7e0c8ed 100644 --- a/src/main/java/a8k/app/service/analyzer/A8kIdCardDataParseService.java +++ b/src/main/java/a8k/app/service/analyzer/A8kIdCardDataParseService.java @@ -1,6 +1,8 @@ package a8k.app.service.analyzer; import a8k.app.dao.ProjectBaseInfoDao; +import a8k.app.dao.type.combination.ProjBuildinInfo; +import a8k.app.service.data.ProjInfoMgrService; import a8k.app.type.a8k.optfn.A8kNormalFn; import a8k.app.hardware.type.A8kEcode; import a8k.app.type.a8k.optfn.A8kOptX; @@ -13,6 +15,7 @@ import a8k.app.type.error.AppError; import a8k.app.type.exception.AppException; import a8k.app.utils.ZDateUtils; import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.util.Assert; @@ -21,10 +24,10 @@ import java.util.Date; @Component @Slf4j +@RequiredArgsConstructor public class A8kIdCardDataParseService { - @Resource - ProjectBaseInfoDao projInfoDao; + private final ProjInfoMgrService projInfoMgrService; byte[] rawdata; @@ -45,13 +48,30 @@ public class A8kIdCardDataParseService { final Integer PROJ3_PIECEWISE_FN_OFF = 0x05B0; final Integer PROJ3_RESULT_BUILDER_FN_OFF = 0x06A0; - public void ASSERT_IS_TRUE(boolean condition, String format, Object... args) throws AppException { + // + // PUBLIC + // + + public ProjExtInfoCard parseAndCheck(byte[] data) throws AppException { + rawdata = data; + ProjExtInfoCard idCardInfo = new ProjExtInfoCard(); + parseAndCheckMainBody(idCardInfo); + parseAndCheckFn(idCardInfo); + return idCardInfo; + } + + + // + // PRIVATE + // + + private void ASSERT_IS_TRUE(boolean condition, String format, Object... args) throws AppException { if (!condition) { throw new AppException(new AppError(A8kEcode.APPE_A8K_PROJ_CARD_PARSE_ERROR, String.format(format, args))); } } - public void ASSERT_IS_TRUE(boolean condition, A8kEcode ecode, String format, Object... args) throws AppException { + private void ASSERT_IS_TRUE(boolean condition, A8kEcode ecode, String format, Object... args) throws AppException { if (!condition) { throw new AppException(new AppError(ecode, String.format(format, args))); } @@ -224,6 +244,11 @@ public class A8kIdCardDataParseService { ASSERT_IS_TRUE(idcard.lotId.length() == 8, "PARSE LOTID IS ERROR"); ASSERT_IS_TRUE(!idcard.projName.isEmpty(), "PARSE PROJNAME IS ERROR"); + ProjBuildinInfo projBuildinInfo = projInfoMgrService.getProjBuildInInfo(idcard.projId); + ASSERT_IS_TRUE(projBuildinInfo != null, A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, "PROJECT ID %d NOT SUPPORTED", idcard.projId); + if (idcard.projShortName == null || idcard.projShortName.isEmpty()) { + idcard.projShortName = projBuildinInfo.getProjShortName(); + } } private ProjExtInfoCard.A8kOptFnGroup parseA8kProjFn(Integer fnTypeOff, Integer norFnOff, Integer piecewiseFnOff, Integer resultBuilderFnOff) throws AppException { @@ -342,22 +367,22 @@ public class A8kIdCardDataParseService { private void parseAndCheckFn(ProjExtInfoCard idcard) throws AppException { - ProjectBaseInfo a8kProjInfo = projInfoDao.findByProjId(idcard.projId); - ASSERT_IS_TRUE(a8kProjInfo != null, A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, "PROJECT ID %d NOT FOUND", idcard.projId); + ProjBuildinInfo projBuildinInfo = projInfoMgrService.getProjBuildInInfo(idcard.projId); + + ASSERT_IS_TRUE(projBuildinInfo != null, A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, "PROJECT ID %d NOT FOUND", idcard.projId); - assert a8kProjInfo != null; - if (a8kProjInfo.subProjNum >= 1) { + if (projBuildinInfo.subProjNum >= 1) { var formula = parseA8kProjFn( PROJ1_FN_TYPE_OFF, PROJ1_NOR_FN_OFF, PROJ1_PIECEWISE_FN_OFF, PROJ1_RESULT_BUILDER_FN_OFF); idcard.projFnFormuals.add(formula); } - if (a8kProjInfo.subProjNum >= 2) { + if (projBuildinInfo.subProjNum >= 2) { var formula = parseA8kProjFn( PROJ2_FN_TYPE_OFF, PROJ2_NOR_FN_OFF, PROJ2_PIECEWISE_FN_OFF, PROJ2_RESULT_BUILDER_FN_OFF); idcard.projFnFormuals.add(formula); } - if (a8kProjInfo.subProjNum >= 3) { + if (projBuildinInfo.subProjNum >= 3) { var formula = parseA8kProjFn( PROJ3_FN_TYPE_OFF, PROJ3_NOR_FN_OFF, PROJ3_PIECEWISE_FN_OFF, PROJ3_RESULT_BUILDER_FN_OFF); idcard.projFnFormuals.add(formula); @@ -367,15 +392,6 @@ public class A8kIdCardDataParseService { } - public ProjExtInfoCard parseAndCheck(byte[] data) throws AppException { - rawdata = data; - ProjExtInfoCard idCardInfo = new ProjExtInfoCard(); - parseAndCheckMainBody(idCardInfo); - parseAndCheckFn(idCardInfo); - return idCardInfo; - } - - private static String byteArrayToHex(byte[] bytes, int startoff, int num) { StringBuilder sb = new StringBuilder(); for (int i = startoff; i < startoff + num; i++) { diff --git a/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java b/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java index 998bf4a..4ba1326 100644 --- a/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java +++ b/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java @@ -1,6 +1,7 @@ package a8k.app.service.appsetup; import a8k.OS; +import a8k.app.hardware.driver.PipetteCtrlDriver; import a8k.app.type.appevent.A8kCanBusOnConnectEvent; import a8k.app.type.appevent.AppEvent; import a8k.app.type.exception.AppException; @@ -37,6 +38,7 @@ public class A8kSubModuleRegInitService { private final AppEventBusService eventBus; private final A8kSubModuleInitRegConfig a8kSubModuleInitRegConfig; private final SubModuleRegInitialValueMgrService subModuleRegInitialValueMgrService; + private final PipetteCtrlDriver pipetteCtrlDriver; @PostConstruct void init() { @@ -53,33 +55,34 @@ public class A8kSubModuleRegInitService { } private void initModuleRegVal() { -// while(true){ -// try { -// canBus.moduleGetReg(MId.IncubatorTCM,RegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); -// canBus.moduleSetReg(MId.FeedingModOutfeedM,RegIndex.kreg_step_motor_max_d,0); -// } catch (AppException e) { -// throw new RuntimeException(e); -// } -// } +// while (true) { +// try { +// // canBus.moduleGetReg(MId.IncubatorTCM,RegIndex.kreg_water_cooling_tmp_controler_pid_feedbackval); +// // canBus.moduleSetReg(MId.FeedingModOutfeedM,RegIndex.kreg_step_motor_max_d,0); +// pipetteCtrlDriver.liquidOperationSetGunRunParams(14, 14, 900, 0, 1000); +// OS.hsleep(10); +// } catch (AppException e) { +// } +// } // - while (true) { - try { - log.info("forceInitA8kModParams"); - moduleEnableCtrlDriver.stopHeating(); - moduleEnableCtrlDriver.stopAllMotor(); - dumpAllSubBoardVersion(); - initA8kModParams(); - gStateMgrService.setBoardParamInited(true); - - log.info("======================================================"); - log.info("= init hardware param success...... ="); - log.info("======================================================"); - break; - } catch (AppException e) { - log.error("init hardware param fail......, try init it after 5s", e); - OS.forceSleep(5000); - } - } + while (true) { + try { + log.info("forceInitA8kModParams"); + moduleEnableCtrlDriver.stopHeating(); + moduleEnableCtrlDriver.stopAllMotor(); + dumpAllSubBoardVersion(); + initA8kModParams(); + gStateMgrService.setBoardParamInited(true); + + log.info("======================================================"); + log.info("= init hardware param success...... ="); + log.info("======================================================"); + break; + } catch (AppException e) { + log.error("init hardware param fail......, try init it after 5s", e); + OS.forceSleep(5000); + } + } } private void dumpAllSubBoardVersion() { diff --git a/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java b/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java index f0565be..5183209 100644 --- a/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java +++ b/src/main/java/a8k/extui/page/extapp/A8kOptVerification.java @@ -100,7 +100,8 @@ public class A8kOptVerification { page.addFunction("预览F光学扫描曲线", this::getScanCurveF); page.addFunction("下载T光学报告", this::getTOptReport); page.addFunction("下载F光学报告", this::getFOptReport); - + page.newGroup("系统板检查"); + page.addFunction("进行一次光学扫描(自动推板,丢板)", this::autoScanAndDownloadScanResult); extApiPageMgr.addPage(page); } @@ -257,4 +258,18 @@ public class A8kOptVerification { } throw AppException.ofSimplePrompt("当前项目没有F光学报告"); } + + public void autoScanAndDownloadScanResult(Boolean autoAmpl) throws AppException, IOException { + var projInfo = projInfoMgrService.getProjBuildInInfoByMountedCard(); + if (projInfo == null) { + throw AppException.ofSimplePrompt("请插入项目ID卡"); + } + + optScanModuleCtrlService.forceDropPlate(IncubatorPos.SPACE01); + plateBoxCtrlService.pushPlateQuick(ConsumableGroup.CG1, IncubatorPos.SPACE01); + optScanModuleCtrlService.pullPlate(IncubatorPos.SPACE01); + doOptScan(autoAmpl); + computeResult(); + optScanModuleCtrlService.dropPlate(); + } } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml deleted file mode 100644 index 91bae64..0000000 --- a/src/main/resources/logback.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - ${LOG_PATTERN} - - - - - - ${LOG_PATH}/sys-info.log - - - ${LOG_PATH}/history/info/sys-info.%d{yyyy-MM-dd}.%i.log.zip - 20MB - 7 - 200MB - - - ${LOG_PATTERN} - - - INFO - - - - - - ${LOG_PATH}/sys-error.log - - ${LOG_PATH}/history/error/sys-error.%d{yyyy-MM-dd}.%i.log.zip - 20MB - 7 - 200MB - - - ${LOG_PATTERN} - - - ERROR - - - - - - - - - - - - - - -