Browse Source

添加部分日志

master
zhaohe 3 months ago
parent
commit
98c389f76c
  1. 12
      src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java
  2. 2
      src/main/java/a8k/app/hardware/channel/A8kCanBusService.java
  3. 54
      src/main/java/a8k/app/service/analyzer/A8kIdCardDataParseService.java
  4. 55
      src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java
  5. 17
      src/main/java/a8k/extui/page/extapp/A8kOptVerification.java
  6. 60
      src/main/resources/logback.xml

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

@ -43,7 +43,6 @@ public class A8kCanBusConnection extends WebSocketClient {
Boolean enableCanBus;
static class ProcessContext {
BlockingQueue<A8kPacket> 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);
}

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

54
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++) {

55
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() {

17
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();
}
}

60
src/main/resources/logback.xml

@ -1,60 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<property name="LOG_PATH" value="./logs"/>
<property name="LOG_PATTERN" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 系统日志(INFO 及以上),按日期+大小滚动,归档后压缩 -->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/sys-info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 在文件名后加 .gz,启用压缩 -->
<fileNamePattern>${LOG_PATH}/history/info/sys-info.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>200MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 系统错误日志(ERROR 及以上),按日期+大小滚动,归档后压缩 -->
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/sys-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/history/error/sys-error.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>
<maxFileSize>20MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>200MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- 包级别日志 -->
<logger name="a8k" level="INFO"/>
<logger name="org.springframework" level="WARN"/>
<!-- 唯一 root -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="FILE_ERROR"/>
</root>
</configuration>
Loading…
Cancel
Save