From af8b3032d1a7b7544d45faa6b5d8d2a210cd1aae Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 22 Apr 2025 21:09:46 +0800 Subject: [PATCH] =?UTF-8?q?v1.1.4=20|=20=E6=B7=BB=E5=8A=A0=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/a8k/app/constant/AppConstant.java | 2 +- .../api/v1/app/data/ReactionResultControler.java | 8 +- .../app/hardware/channel/A8kCanBusConnection.java | 7 + .../a8k/app/hardware/channel/A8kCanBusService.java | 12 +- .../hardware/channel/LisUartChannelConnection.java | 83 ----------- .../app/hardware/channel/PrinterUartChannel.java | 164 +++++++++++++++++++++ .../appsetup/A8kSubModuleRegInitService.java | 34 +++-- .../app/service/data/ReactionRecordMgrService.java | 15 +- .../a8k/app/service/peripheral/PrinterService.java | 151 +++++++++++++++++++ .../a8k/app/service/statemgr/GStateMgrService.java | 6 +- .../service/utils/ReactionPlate2DCodeHelper.java | 1 + src/main/java/a8k/app/utils/ZStringUtils.java | 1 + .../java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java | 3 +- .../a8k/extui/page/driver/PrinterDebugPage.java | 58 ++++++++ .../extsetting/db/ReactionRecordMgrDebugPage.java | 6 +- src/main/resources/application.yml | 3 +- 16 files changed, 442 insertions(+), 112 deletions(-) delete mode 100644 src/main/java/a8k/app/hardware/channel/LisUartChannelConnection.java create mode 100644 src/main/java/a8k/app/hardware/channel/PrinterUartChannel.java create mode 100644 src/main/java/a8k/app/service/peripheral/PrinterService.java create mode 100644 src/main/java/a8k/extui/page/driver/PrinterDebugPage.java diff --git a/src/main/java/a8k/app/constant/AppConstant.java b/src/main/java/a8k/app/constant/AppConstant.java index 2a215d6..8e06851 100644 --- a/src/main/java/a8k/app/constant/AppConstant.java +++ b/src/main/java/a8k/app/constant/AppConstant.java @@ -5,7 +5,7 @@ public class AppConstant { public static final int CONSUMABLE_COL_NUM = 5; public static final int CONSUMABLE_ROW_NUM = 5; public static final int TIP_NUM = 120; - public static final String APP_VERSION = "1.1.2"; + public static final String APP_VERSION = "1.1.4"; public static final int CONSUMABLE_CHANNEL_NUM = 6; diff --git a/src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java b/src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java index 390d854..0456011 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java +++ b/src/main/java/a8k/app/controler/api/v1/app/data/ReactionResultControler.java @@ -1,6 +1,7 @@ package a8k.app.controler.api.v1.app.data; import a8k.app.service.data.ReactionRecordMgrService; +import a8k.app.service.peripheral.PrinterService; import a8k.app.service.statemgr.GStateMgrService; import a8k.app.dao.type.db.ReactionReport; import a8k.app.type.ui.ApiRet; @@ -29,6 +30,9 @@ public class ReactionResultControler { @Resource ReactionRecordMgrService reactionRecordMgrService; + @Resource + PrinterService printerService; + @PostMapping("/getAllRecords") public ApiRet> getAllRecords() { @@ -43,7 +47,7 @@ public class ReactionResultControler { @PostMapping("/printfRecord") public ApiRet printfRecord(Integer id) { - reactionRecordMgrService.printfRecord(id); + printerService.print(reactionRecordMgrService.getRecordById(id)); return ApiRet.success(); } @@ -54,7 +58,7 @@ public class ReactionResultControler { @PostMapping("/printfRecords") public ApiRet printfRecord(@RequestBody IDList ids) { for (Integer i : ids.ids) { - reactionRecordMgrService.printfRecord(i); + printerService.print(reactionRecordMgrService.getRecordById(i)); } return ApiRet.success(); } diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java index f05379b..81bd8e6 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java +++ b/src/main/java/a8k/app/hardware/channel/A8kCanBusConnection.java @@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j; import org.java_websocket.client.WebSocketClient; import org.java_websocket.enums.ReadyState; import org.java_websocket.handshake.ServerHandshake; +import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import java.net.URI; @@ -38,6 +39,10 @@ public class A8kCanBusConnection extends WebSocketClient { String cmdchurl = null; Boolean firstCall = true; + @Value("${device.enableCanBus}") + Boolean enableCanBus; + + static class ProcessContext { BlockingQueue receiptQueue = new LinkedBlockingQueue<>(); // @@ -160,6 +165,8 @@ public class A8kCanBusConnection extends WebSocketClient { // @Scheduled(fixedRate = 1000) private void autoConnect() { + if(!enableCanBus) return; + if (!isOpen()) { if (getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { try { diff --git a/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java b/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java index 56eaf58..c638376 100644 --- a/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java +++ b/src/main/java/a8k/app/hardware/channel/A8kCanBusService.java @@ -8,6 +8,7 @@ import a8k.app.utils.ByteArray; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.net.URISyntaxException; @@ -18,9 +19,16 @@ public class A8kCanBusService { @Resource A8kCanBusConnection connection; + @Value("${device.enableCanBus}") + Boolean enableCanBus; + @PostConstruct public void init() throws URISyntaxException { - connection.connect(); + if (enableCanBus) { + connection.connect(); + }else{ + log.warn("canBus is disabled"); + } } /** @@ -66,7 +74,7 @@ public class A8kCanBusService { } public void moduleSetReg(MId id, RegIndex regindex, Integer reg) throws AppException { - connection.callcmd2(id, CmdId.module_set_reg, 100,regindex.index, reg); + connection.callcmd2(id, CmdId.module_set_reg, 100, regindex.index, reg); } public Integer moduleGetReg(MId id, RegIndex regindex) throws AppException { diff --git a/src/main/java/a8k/app/hardware/channel/LisUartChannelConnection.java b/src/main/java/a8k/app/hardware/channel/LisUartChannelConnection.java deleted file mode 100644 index a2d2481..0000000 --- a/src/main/java/a8k/app/hardware/channel/LisUartChannelConnection.java +++ /dev/null @@ -1,83 +0,0 @@ -package a8k.app.hardware.channel; - -import a8k.app.config.IflytophaldConnectionConfig; -import jakarta.annotation.PostConstruct; -import lombok.RequiredArgsConstructor; -import lombok.Value; -import lombok.extern.slf4j.Slf4j; -import org.java_websocket.client.WebSocketClient; -import org.java_websocket.enums.ReadyState; -import org.java_websocket.handshake.ServerHandshake; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.net.URI; - -// -//@Slf4j -//@Component -//@RequiredArgsConstructor -//public class LisUartChannelConnection { -// WebSocketClient conn; -// IflytophaldConnectionConfig iflytophaldConnectionConfig; -// -// @PostConstruct -// void init() { -// conn = new WebSocketClient(URI.create(iflytophaldConnectionConfig.getDatachUrl("lis"))) { -// @Override -// public void onOpen(ServerHandshake serverHandshake) { -// LisUartChannelConnection.this.onOpen(serverHandshake); -// } -// -// @Override -// public void onMessage(String s) { -// LisUartChannelConnection.this.onMessage(s); -// } -// -// @Override -// public void onClose(int i, String s, boolean b) { -// LisUartChannelConnection.this.onClose(i, s, b); -// } -// -// @Override -// public void onError(Exception e) { -// LisUartChannelConnection.this.onError(e); -// } -// }; -// } -// -// -// public void onOpen(ServerHandshake serverHandshake) { -// log.info("a8k canbus connect sucess"); -// } -// -// public void onMessage(String s) { -// } -// -// public void onClose(int i, String s, boolean b) { -// log.warn("a8k canbus lost connection..."); -// } -// -// public void onError(Exception e) { -// log.info("a8k can-websocket-channel on error"); -// } -// -// // -// // PRIVATE -// // -// @Scheduled(fixedRate = 1000) -// private void autoConnect() { -// if (!conn.isOpen()) { -// if (conn.getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { -// try { -// conn.connect(); -// } catch (IllegalStateException ignored) { -// } -// } else if (conn.getReadyState().equals(ReadyState.CLOSED)) { -// conn.reconnect(); -// } -// } -// } -//} - -// diff --git a/src/main/java/a8k/app/hardware/channel/PrinterUartChannel.java b/src/main/java/a8k/app/hardware/channel/PrinterUartChannel.java new file mode 100644 index 0000000..c3dc1da --- /dev/null +++ b/src/main/java/a8k/app/hardware/channel/PrinterUartChannel.java @@ -0,0 +1,164 @@ +package a8k.app.hardware.channel; + +import a8k.OS; +import a8k.app.config.IflytophaldConnectionConfig; +import a8k.app.utils.ByteArray; +import a8k.app.utils.ZStringUtils; +import cn.hutool.core.util.ByteUtil; +import cn.hutool.core.util.CharsetUtil; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.enums.ReadyState; +import org.java_websocket.handshake.ServerHandshake; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + + +@Slf4j +@Component +@RequiredArgsConstructor +public class PrinterUartChannel { + WebSocketClient conn; + + private final IflytophaldConnectionConfig config; + private Queue sendQueue = new LinkedList<>(); + + @PostConstruct + void init() { + String url = config.getDatachUrl("printer"); + log.info("PrinterUartChannel url: {}", url); + conn = new WebSocketClient(URI.create(url)) { + @Override + public void onOpen(ServerHandshake serverHandshake) { + PrinterUartChannel.this.onOpen(serverHandshake); + } + + @Override + public void onMessage(String s) { + PrinterUartChannel.this.onMessage(s); + } + + @Override + public void onClose(int i, String s, boolean b) { + PrinterUartChannel.this.onClose(i, s, b); + } + + @Override + public void onError(Exception e) { + PrinterUartChannel.this.onError(e); + } + }; + conn.connect(); + } + + /** + * 打印字符串 + * @param fmt 格式化字符串 + * @param args 参数 + * 1. 打印%时候,需要使用%%,否则会报错 + * + */ + public void printf(String fmt, Object... args) { + if (conn.isOpen()) { + String s = String.format(fmt, args); + try { + byte[] toSend = s.getBytes("GBK"); + pushToSend(toSend); + } catch (UnsupportedEncodingException e) { + log.error("charset error", e); + } + } else { + log.warn("PrinterUartChannel is not open"); + } + } + + public void printfEnd() { + if (conn.isOpen()) { + printf("\r\n"); + printf("\r\n"); + printf("\r\n"); + } + } + + + // + // PRIVATE + // + + + private void onOpen(ServerHandshake serverHandshake) { + log.info("a8k canbus connect sucess"); + } + + private void onMessage(String s) { + } + + private void onClose(int i, String s, boolean b) { + log.warn("a8k canbus lost connection..."); + } + + private void onError(Exception e) { + log.info("a8k can-websocket-channel on error"); + } + + + synchronized private void pushToSend(byte[] toSend) { + sendQueue.add(toSend); + } + + synchronized private byte[] popToSend() { + if (!sendQueue.isEmpty()) { + return sendQueue.poll(); + } + return null; + } + + // conn.send(toSend); + // if (toSend.length > 10) { + // OS.forceSleep(150); + // } + @Scheduled(fixedRate = 400) + private void autoSend() { + while (true) { + var tosend = popToSend(); + if (tosend != null) { + if (conn.isOpen()) { + conn.send(tosend); + } + if (tosend.length > 2) { + break; + } + } else { + break; + } + + } + + } + + + @Scheduled(fixedRate = 1000) + private void autoConnect() { + if (!conn.isOpen()) { + if (conn.getReadyState().equals(ReadyState.NOT_YET_CONNECTED)) { + try { + conn.connect(); + } catch (IllegalStateException ignored) { + } + } else if (conn.getReadyState().equals(ReadyState.CLOSED)) { + conn.reconnect(); + } + } + } +} + + diff --git a/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java b/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java index 691059d..db3974b 100644 --- a/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java +++ b/src/main/java/a8k/app/service/appsetup/A8kSubModuleRegInitService.java @@ -53,15 +53,15 @@ public class A8kSubModuleRegInitService { } private void initModuleRegVal() { -// while(true){ -// try { -// canBus.moduleSetReg(MId.FeedingModInfeedM,RegIndex.kreg_step_motor_max_d,0); -// canBus.moduleSetReg(MId.FeedingModOutfeedM,RegIndex.kreg_step_motor_max_d,0); -// } catch (AppException e) { -// throw new RuntimeException(e); -// } -// } -// + // while(true){ + // try { + // canBus.moduleSetReg(MId.FeedingModInfeedM,RegIndex.kreg_step_motor_max_d,0); + // canBus.moduleSetReg(MId.FeedingModOutfeedM,RegIndex.kreg_step_motor_max_d,0); + // } catch (AppException e) { + // throw new RuntimeException(e); + // } + // } + // while (true) { try { log.info("forceInitA8kModParams"); @@ -86,6 +86,9 @@ public class A8kSubModuleRegInitService { log.info("======================================================="); log.info("= dump all sub board version...... ="); log.info("="); + + boolean hasDiffVersion = false; + Integer maxVersion = null; for (MId mid : MId.values()) { if (mid == MId.NotSet) { continue; @@ -93,12 +96,25 @@ public class A8kSubModuleRegInitService { try { Integer ver = canBus.moduleReadVersion(mid); String moduleType = canBus.moduleReadType(mid).toString(); + if (maxVersion != null && !maxVersion.equals(ver)) { + hasDiffVersion = true; + } + if (maxVersion == null || ver > maxVersion) { + maxVersion = ver; + } log.info(String.format("+ %-40s(%d): type:%-20s version:%s", mid, mid.index, moduleType, ver)); } catch (AppException e) { log.error(String.format("+ %20s(%d): offline", mid, mid.index)); } } + + if (!hasDiffVersion) { + gStateMgrService.setMcuVersion(String.format("V%04d", maxVersion)); + } else { + //版本不一致,标记为(*),表示需要升级 + gStateMgrService.setMcuVersion(String.format("V%04d(*)", maxVersion)); + } } diff --git a/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java b/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java index 4c220cd..1f16aa2 100644 --- a/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java +++ b/src/main/java/a8k/app/service/data/ReactionRecordMgrService.java @@ -96,11 +96,11 @@ public class ReactionRecordMgrService { } } - public void printfRecord(Integer id) { - ReactionReport record = reactionReportDao.findById(id); - logger.info("printfRecord: {}", ZJsonHelper.objToPrettyJson(record)); + public ReactionReport getRecordById(Integer id) { + return reactionReportDao.findById(id); } + public void exportRecordByLIS(Integer id) { ReactionReport record = reactionReportDao.findById(id); logger.info("exportRecord: {}", ZJsonHelper.objToPrettyJson(record)); @@ -110,15 +110,15 @@ public class ReactionRecordMgrService { reactionReportDao.delete(id); } - public void deleteRecordByIds(String ids){ + public void deleteRecordByIds(String ids) { if (StringUtils.isBlank(ids)) { return; } String[] idArray = ids.split(","); - for(String id : idArray){ - try{ + for (String id : idArray) { + try { deleteRecord(Integer.parseInt(id)); - }catch (Exception e){ + } catch (Exception e) { logger.warn("批量删除历史记录,跳过无效ID:{}", id); } } @@ -129,7 +129,6 @@ public class ReactionRecordMgrService { } - public ReactionReport findById(Integer id) { return reactionReportDao.findById(id); } diff --git a/src/main/java/a8k/app/service/peripheral/PrinterService.java b/src/main/java/a8k/app/service/peripheral/PrinterService.java new file mode 100644 index 0000000..de70caf --- /dev/null +++ b/src/main/java/a8k/app/service/peripheral/PrinterService.java @@ -0,0 +1,151 @@ +package a8k.app.service.peripheral; + +import a8k.app.dao.type.db.ProjExtInfoCard; +import a8k.app.dao.type.db.ReactionReport; +import a8k.app.hardware.channel.PrinterUartChannel; +import a8k.app.optalgo.type.ReactionResultStatus; +import a8k.app.service.data.ProjInfoMgrService; +import a8k.app.service.statemgr.GStateMgrService; +import a8k.app.type.a8k.BloodType; +import a8k.app.type.a8k.opt.A8kOptType; +import a8k.app.type.a8k.opt.OptScanResult; +import a8k.app.type.a8k.proj.A8kResultUnit; +import a8k.app.type.a8k.proj.ProjInfo; +import a8k.app.type.a8k.state.SampleInfo; +import a8k.app.type.exception.AppException; +import a8k.extui.factory.FakeOptScanResultFactory; +import a8k.extui.factory.ProjExtInfoCardFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Component +@Slf4j +@RequiredArgsConstructor +public class PrinterService { + private final PrinterUartChannel printer; + private final ProjInfoMgrService projInfoMgrService; + private final GStateMgrService gStateMgrService; + + String bloodTypeToString(BloodType bloodType) { + return switch (bloodType) { + case WHOLE_BLOOD -> "全血"; + case SERUM_OR_PLASMA -> "血清/血浆"; + }; + } + + public void printDemoReactionReport() { + + ProjExtInfoCard.A8kResultUintFn resultBuilder0 = // + new ProjExtInfoCard.A8kResultUintFn(A8kResultUnit.coi, A8kResultUnit.iuPml, A8kResultUnit.uPl, 2.0, 2.0, 3.0, 3.0); + ProjExtInfoCard.A8kResultUintFn resultBuilder1 =// + new ProjExtInfoCard.A8kResultUintFn(A8kResultUnit.coi, A8kResultUnit.iuPml, A8kResultUnit.uPl, 2.0, 2.0, 3.0, 3.0); + ProjExtInfoCard.A8kResultUintFn resultBuilder2 =// + new ProjExtInfoCard.A8kResultUintFn(A8kResultUnit.coi, A8kResultUnit.iuPml, A8kResultUnit.uPl, 2.0, 2.0, 3.0, 3.0); + List reactionResults = new ArrayList<>(); + reactionResults.add(new ReactionReport.ReactionResult("Tn-I", "Tn-I", 1.0, resultBuilder0.toResultUnitConverters())); + reactionResults.add(new ReactionReport.ReactionResult("CK-MB", "CK-MB", 2.0, resultBuilder1.toResultUnitConverters())); + reactionResults.add(new ReactionReport.ReactionResult("Myoglobin", "MG", 3.0, resultBuilder2.toResultUnitConverters())); + + + ReactionReport record = new ReactionReport(); + record.sampleBloodType = BloodType.WHOLE_BLOOD; + record.sampleBarcode = "ASDF123456789"; + record.sampleUserid = "U1023"; + record.sampleId = "1122334456"; + record.projName = "HSCrp"; + record.lotId = "CA2312345"; + record.projId = 1; + record.setExpiryDate(new Date()); + record.operator = "张三"; + record.projShortName = "CA"; + record.appVersion = gStateMgrService.getAppVersion(); + record.mcuVersion = gStateMgrService.getMcuVersion(); + record.sn = gStateMgrService.getSn(); + record.subProjNum = reactionResults.size(); + record.projInfoIdCardVersion = 1; + record.projInfo = null; + record.results = reactionResults; + record.detailOptData = null; + + print(record); + + } + + public void print(ReactionReport report) { + /* + * 日期: 2023-10-01 12:00:00 + * 操作人: 张三 + * 软件版本: 1.0.0 + * MCU版本: 1.0.0 + * 仪器序列号: 123456789 + * + * UID:sampleUserid + * 条码ID: sampleBarcode + * + * 样本类型:全血/血清/血浆 + * 项目名称: + * 批次号: + * + * <子项目名称> + * 结果: + * 结果(单位1): + * 结果(单位2): + * + * <子项目名称> + * 结果: + * 结果(单位1): + * 结果(单位2): + * + */ + // 定义日期格式 + if(report == null) { + return; + } + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + printer.printf("*****************************\r\n"); + printer.printf(" 日期: %s\r\n", dateFormat.format(report.creatDate)); + printer.printf(" 操作人: %s\r\n", report.operator); + printer.printf(" 软件版本: %s\r\n", report.appVersion); + printer.printf(" MCU版本: %s\r\n", report.mcuVersion); + printer.printf(" 仪器序列号: %s\r\n", report.sn); + printer.printf(" \r\n"); + printer.printf(" \r\n"); + printer.printf(" UID: %s\r\n", report.sampleUserid); + printer.printf(" BARCODE: %s\r\n", report.sampleBarcode); + printer.printf(" \r\n"); + printer.printf(" 样本类型: %s\r\n", bloodTypeToString(report.sampleBloodType)); + printer.printf(" 项目名称: %s\r\n", report.projName); + printer.printf(" 批次号: %s\r\n", report.lotId); + printer.printf(" \r\n"); + printer.printf(" \r\n"); + for (var result : report.results) { + if (result == null) + continue; + printer.printf(" 子项目名称: %s\r\n", result.subProjName); + if (result.status.equals(ReactionResultStatus.SUCCESS)) { + printer.printf(" 结果: %s\r\n", result.result); + for (int j = 0; j < result.resultConverters.size(); j++) { + var converter = result.resultConverters.get(j); + if (converter == null) + continue; + printer.printf(" 结果(单位%d): %s\r\n", j + 1, converter.convert(result.result)); + } + printer.printf(" \r\n"); + } else { + printer.printf(" ERROR\r\n"); + printer.printf(" %s\r\n", result.errorInfo); + printer.printf(" \r\n"); + } + } + printer.printf("*****************************\r\n"); + printer.printfEnd(); + } + +} diff --git a/src/main/java/a8k/app/service/statemgr/GStateMgrService.java b/src/main/java/a8k/app/service/statemgr/GStateMgrService.java index 2b71126..94f659b 100644 --- a/src/main/java/a8k/app/service/statemgr/GStateMgrService.java +++ b/src/main/java/a8k/app/service/statemgr/GStateMgrService.java @@ -28,12 +28,10 @@ public class GStateMgrService { //MCU版本 private String mcuVersion = "NOTSET"; //设备SN - private String sn = "NOTSET"; - + private String sn = "SN25010001";//25年第一个月,第一台设备,后续改成通过10板的单片机获取 SensorState sensorState = new SensorState(); - public Boolean isDeviceInited() { return deviceInited; } @@ -51,7 +49,7 @@ public class GStateMgrService { } public synchronized Boolean isInMode(DeviceRunMode... modes) { - for (DeviceRunMode mode : modes) { + for (DeviceRunMode mode : modes) { if (deviceRunMode.equals(mode)) { return true; } diff --git a/src/main/java/a8k/app/service/utils/ReactionPlate2DCodeHelper.java b/src/main/java/a8k/app/service/utils/ReactionPlate2DCodeHelper.java index 302f1ea..e82b609 100644 --- a/src/main/java/a8k/app/service/utils/ReactionPlate2DCodeHelper.java +++ b/src/main/java/a8k/app/service/utils/ReactionPlate2DCodeHelper.java @@ -10,6 +10,7 @@ import java.text.SimpleDateFormat; public class ReactionPlate2DCodeHelper { // 1||CAGGB66U||2024.03.26||1083||06 + // 1||CAHAC66U|2025.4.30||514||04 static public ReactionPlate2DCode parse(String code) { String[] parts = code.split("\\|\\|"); ReactionPlate2DCode ret = new ReactionPlate2DCode(); diff --git a/src/main/java/a8k/app/utils/ZStringUtils.java b/src/main/java/a8k/app/utils/ZStringUtils.java index 26a80fb..50f2390 100644 --- a/src/main/java/a8k/app/utils/ZStringUtils.java +++ b/src/main/java/a8k/app/utils/ZStringUtils.java @@ -47,4 +47,5 @@ public class ZStringUtils { public static Boolean isNullOrEmpty(String str) { return str == null || str.isEmpty(); } + } diff --git a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java index 84387e0..efbe354 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java +++ b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java @@ -126,7 +126,8 @@ public class ExtApiPageGroupCfgMgr { new Menu(MotorCtrlPage.class, "电机驱动"), new Menu(MiniServoCtrlPage.class, "伺服电机驱动"), new Menu(InputIOStateScannerPage.class, "输入IO状态查看"), - new Menu(CodeScanerDriverCtrlPage.class, "条码扫描仪") + new Menu(CodeScanerDriverCtrlPage.class, "条码扫描仪"), + new Menu(PrinterDebugPage.class, "打印机") ))); diff --git a/src/main/java/a8k/extui/page/driver/PrinterDebugPage.java b/src/main/java/a8k/extui/page/driver/PrinterDebugPage.java new file mode 100644 index 0000000..ff1f1cb --- /dev/null +++ b/src/main/java/a8k/extui/page/driver/PrinterDebugPage.java @@ -0,0 +1,58 @@ +package a8k.extui.page.driver; + +import a8k.OS; +import a8k.app.hardware.channel.PrinterUartChannel; +import a8k.app.hardware.driver.PipetteCtrlDriver; +import a8k.app.service.peripheral.PrinterService; +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.extui.type.ExtUIPageCfg; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class PrinterDebugPage { + + private final PrinterUartChannel printerUartChannel; + private final ExtApiPageMgr extApiPageMgr; + private final PrinterService printerService; + + + public void printf(String str) { + printerUartChannel.printf(str + "\r\n"); + } + + public void printerTest() { + printerUartChannel.printf("ABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n"); + OS.forceSleep(100); + printerUartChannel.printf("abcdefghijklmnopqrstuvwxyz\r\n"); + OS.forceSleep(100); + printerUartChannel.printf("0123456789\r\n"); + OS.forceSleep(100); + printerUartChannel.printf("!@#$%%*()^_+\r\n"); + OS.forceSleep(100); + printerUartChannel.printf("~`!@#$%%^&*()_+|\\{}[]:\";'<>?,./\r\n"); + OS.forceSleep(100); + printerUartChannel.printf("中文测试\r\n"); + OS.forceSleep(100); + printerUartChannel.printfEnd(); + + } + + public void printDemoReactionReport() { + printerService.printDemoReactionReport(); + } + + @PostConstruct + void init() { + ExtUIPageCfg page = new ExtUIPageCfg(this); + page.addFunction("printf", this::printf); + page.addFunction("printerTest", this::printerTest); + page.addFunction("打印报告(示例)", this::printDemoReactionReport); + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java b/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java index f5a54fa..63002e5 100644 --- a/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java +++ b/src/main/java/a8k/extui/page/extsetting/db/ReactionRecordMgrDebugPage.java @@ -1,5 +1,6 @@ package a8k.extui.page.extsetting.db; +import a8k.app.service.peripheral.PrinterService; import a8k.app.type.exception.AppException; import a8k.app.optalgo.type.ReactionResultStatus; import a8k.app.controler.filemgr.StorageControler; @@ -39,6 +40,9 @@ public class ReactionRecordMgrDebugPage { ReactionRecordMgrService reactionRecordMgrService; @Resource + PrinterService printerService; + + @Resource FileMgrService fileMgrService; public ExtUiTable getReactionRecordList() { @@ -96,7 +100,7 @@ public class ReactionRecordMgrDebugPage { } public void printfRecord(Integer id) { - reactionRecordMgrService.printfRecord(id); + printerService.print(reactionRecordMgrService.findById(id)); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 028be37..63a5056 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -4,9 +4,10 @@ server: #device.runmode: "RealMode" a8k.enableTemperatureCtrl: false device.runmode: "RealMode" +device.enableCanBus: true iflytophald: -# ip: 192.168.8.10 + # ip: 192.168.8.10 ip: 127.0.0.1 cmdch.port: 19004 datach.port: 19005