From 33af819d18c18645e301ccbc397669adc6f22920 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 26 Mar 2025 09:41:24 +0800 Subject: [PATCH] update --- .../a8k/app/a8kproj/A8kReactionResultComputer.java | 2 +- .../FakeProjInfoContextFactory.java | 212 --------------------- .../a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java | 1 - .../a8k/app/config/A8kCanBusConnectionConfig.java | 20 ++ src/main/java/a8k/app/config/CorsConfig.java | 18 ++ src/main/java/a8k/app/config/SpringDocConfig.java | 78 ++++++++ .../a8k/app/config/WebSocketConfiguration.java | 13 ++ .../app/hardware/basedriver/A8kCanBusService.java | 3 + .../a8k/app/hardware/driver/MiniServoDriver.java | 18 +- .../app/hardware/driver/StepMotorCtrlDriver.java | 6 +- .../hardware/driver/type/StepMotorRegIndex.java | 1 + .../initializer/A8kModParamInitializer.java | 13 ++ .../a8k/app/hardware/type/a8kcanprotocol/IOId.java | 34 ++-- .../a8k/app/hardware/type/regindex/RegIndex.java | 25 +-- .../service/background/TemperatureCtrlService.java | 2 +- .../app/service/data/ProjIdCardInfoMgrService.java | 2 +- .../lowerctrl/ConsumablesScanCtrlService.java | 5 +- .../service/lowerctrl/DeviceInitCtrlService.java | 4 +- .../service/lowerctrl/TubeFeedingCtrlService.java | 1 + .../lowerctrl/TubeFeedingExCtrlService.java | 6 +- .../action/AC10ErrorReactionPlateProcesser.java | 2 +- .../action/AC20ProcessCompletedPlate.java | 2 +- .../mainflowctrl/action/AC20ScanReactionPlate.java | 2 +- .../mainflowctrl/action/AC30EjectTubeHolder.java | 2 +- .../action/AC30ScanTubeHolderTask.java | 2 +- .../action/AC30SwitchToNextTubeTake.java | 2 +- .../mainflowctrl/action/AC41ProcessSample.java | 4 +- .../processer/MainFlowStateChangeProcesser.java | 3 +- .../app/service/setting/AppSettingsMgrService.java | 2 +- .../a8k/app/teststate/TestStateMgrService.java | 44 +++++ src/main/java/a8k/app/teststate/VirtualDevice.java | 37 ++++ src/main/java/a8k/app/utils/DoAction.java | 32 ++++ src/main/java/a8k/app/utils/DoubleUtils.java | 21 ++ .../java/a8k/app/utils/IPAddressValidator.java | 22 +++ src/main/java/a8k/app/utils/ZloggerRecorder.java | 33 ++++ .../java/a8k/config/A8kCanBusConnectionConfig.java | 21 -- src/main/java/a8k/config/CorsConfig.java | 18 -- .../java/a8k/config/JacksonCustomizerConfig.java | 0 src/main/java/a8k/config/SpringDocConfig.java | 78 -------- .../java/a8k/config/WebSocketConfiguration.java | 13 -- .../page/debug/P02ConsumablesMgrDebugPage.java | 4 - .../extui/page/debug/P02TubeSettingDebugPage.java | 4 - .../extui/page/extapp/UsrOperationSimulation.java | 13 +- .../page/extapp/tools/MoterMoveUtilsPage.java | 48 +++++ .../P01MiniServoReferencePointIniter.java | 86 --------- .../page/measurement/FeedingModMeasurePage.java | 25 ++- .../extui/page/miniservo/MiniServoScanerPage.java | 49 +++++ .../P01MiniServoReferencePointIniter.java | 86 +++++++++ .../a8k/extui/page/test/driver/MotorCtrlPage.java | 4 +- .../java/a8k/teststate/TestStateMgrService.java | 45 ----- src/main/java/a8k/teststate/VirtualDevice.java | 43 ----- src/main/java/a8k/unittest/TestBeforeRun.java | 21 -- src/main/java/a8k/unittest/TestOptAnalyzer.java | 55 ------ src/main/java/a8k/utils/DoAction.java | 34 ---- src/main/java/a8k/utils/DoubleUtils.java | 21 -- src/main/java/a8k/utils/IPAddressValidator.java | 22 --- src/main/java/a8k/utils/ZloggerRecorder.java | 33 ---- src/main/resources/application.yml | 2 +- 58 files changed, 618 insertions(+), 781 deletions(-) delete mode 100644 src/main/java/a8k/app/a8kproj/fakeprojcontext/FakeProjInfoContextFactory.java create mode 100644 src/main/java/a8k/app/config/A8kCanBusConnectionConfig.java create mode 100644 src/main/java/a8k/app/config/CorsConfig.java create mode 100644 src/main/java/a8k/app/config/SpringDocConfig.java create mode 100644 src/main/java/a8k/app/config/WebSocketConfiguration.java create mode 100644 src/main/java/a8k/app/teststate/TestStateMgrService.java create mode 100644 src/main/java/a8k/app/teststate/VirtualDevice.java create mode 100644 src/main/java/a8k/app/utils/DoAction.java create mode 100644 src/main/java/a8k/app/utils/DoubleUtils.java create mode 100644 src/main/java/a8k/app/utils/IPAddressValidator.java create mode 100644 src/main/java/a8k/app/utils/ZloggerRecorder.java delete mode 100644 src/main/java/a8k/config/A8kCanBusConnectionConfig.java delete mode 100644 src/main/java/a8k/config/CorsConfig.java delete mode 100644 src/main/java/a8k/config/JacksonCustomizerConfig.java delete mode 100644 src/main/java/a8k/config/SpringDocConfig.java delete mode 100644 src/main/java/a8k/config/WebSocketConfiguration.java create mode 100644 src/main/java/a8k/extui/page/extapp/tools/MoterMoveUtilsPage.java delete mode 100644 src/main/java/a8k/extui/page/extsetting/pos_calibration/P01MiniServoReferencePointIniter.java create mode 100644 src/main/java/a8k/extui/page/miniservo/MiniServoScanerPage.java create mode 100644 src/main/java/a8k/extui/page/miniservo/P01MiniServoReferencePointIniter.java delete mode 100644 src/main/java/a8k/teststate/TestStateMgrService.java delete mode 100644 src/main/java/a8k/teststate/VirtualDevice.java delete mode 100644 src/main/java/a8k/unittest/TestBeforeRun.java delete mode 100644 src/main/java/a8k/unittest/TestOptAnalyzer.java delete mode 100644 src/main/java/a8k/utils/DoAction.java delete mode 100644 src/main/java/a8k/utils/DoubleUtils.java delete mode 100644 src/main/java/a8k/utils/IPAddressValidator.java delete mode 100644 src/main/java/a8k/utils/ZloggerRecorder.java diff --git a/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java b/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java index d580498..3b9c139 100644 --- a/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java +++ b/src/main/java/a8k/app/a8kproj/A8kReactionResultComputer.java @@ -15,7 +15,7 @@ import a8k.app.a8ktype.type.ReactionResult; import a8k.app.a8ktype.opttype.ReactionResultStatus; import a8k.app.utils.ProjInfo; import a8k.app.utils.ProjInfoUtils; -import a8k.utils.ZloggerRecorder; +import a8k.app.utils.ZloggerRecorder; import lombok.extern.slf4j.Slf4j; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; diff --git a/src/main/java/a8k/app/a8kproj/fakeprojcontext/FakeProjInfoContextFactory.java b/src/main/java/a8k/app/a8kproj/fakeprojcontext/FakeProjInfoContextFactory.java deleted file mode 100644 index 783f2ab..0000000 --- a/src/main/java/a8k/app/a8kproj/fakeprojcontext/FakeProjInfoContextFactory.java +++ /dev/null @@ -1,212 +0,0 @@ -package a8k.app.a8kproj.fakeprojcontext; - -import a8k.app.a8ktype.opttype.A8kOptX; -import a8k.app.service.data.UtilsProjectColorAllocer; -import a8k.app.dao.db.type.ProjExtInfoCard; -import a8k.app.dao.db.type.OptCfg; -import a8k.app.dao.db.type.ProjectBaseInfo; -import a8k.app.dao.db.type.a8kidcard.A8kNormalFn; -import a8k.app.dao.db.type.a8kidcard.A8kOptFnFormula; -import a8k.app.dao.db.type.a8kidcard.A8kPiecewiseFn; -import a8k.app.dao.db.type.a8kidcard.A8kResultBuilderFn; -import a8k.app.dao.db.type.a8kidcard.zenum.A8kFnType; -import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType; -import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType; -import a8k.app.dao.db.type.a8kidcard.zenum.A8kResultUnit; -import a8k.app.utils.ProjBuildinInfo; -import a8k.app.utils.ProjInfo; -import a8k.app.utils.ZDateUtils; - -import java.util.ArrayList; -import java.util.List; - -public class FakeProjInfoContextFactory { - - public static class FakeProjInfoContextCfg { - public String projName; - public String lotId; - public Integer projId; - public Integer updateChipVersion; - public Integer subProjNum; - public String projShortName; - public Integer reactionTemperature; - public String color; - public A8kReactionFlowType reactionFlowType; - public Integer wBloodSampleVolUl; - public Integer serumSampleVolUl; - public Integer shakeTimes; - public Integer bigBufferSampleUl; - public Integer mixLiquidAspirMixingCnt; - public Integer reactionPlateIncubationTimeMin; - public Integer reactionPlateDropletVolUl; - public Boolean expired; - - public A8kFnType fnType; - public A8kOptType optType; - - public Integer optScanPeakNum; - public Integer optPeakNameAssginRefPeakNum; - - } - - ; - - - public static FakeProjInfoContextCfg createCfg(String projShortName, Integer projId, A8kReactionFlowType reactionType, Integer subProjNum) { - var val = new FakeProjInfoContextCfg(); - val.projName = String.format("%s%04d", projShortName, projId); - val.lotId = String.format("%s001234", projShortName, projId); - val.projId = projId; - val.updateChipVersion = 1; - val.subProjNum = subProjNum; - val.projShortName = projShortName; - val.reactionTemperature = 25; - val.color = UtilsProjectColorAllocer.getProjColor(projId); - val.reactionFlowType = reactionType; - val.wBloodSampleVolUl = 100; - val.serumSampleVolUl = 100; - val.shakeTimes = 2; - val.bigBufferSampleUl = 200; - val.mixLiquidAspirMixingCnt = 1; - val.reactionPlateIncubationTimeMin = 1; - val.reactionPlateDropletVolUl = 50; - val.expired = false; - val.fnType = A8kFnType.NormalFn; - val.optType = A8kOptType.FOPT; - if (projId == 1) { - val.optScanPeakNum = 2; - val.optPeakNameAssginRefPeakNum = 2; - } else { - val.optScanPeakNum = 5; - val.optPeakNameAssginRefPeakNum = 5; - } - - return val; - } - - - /** - * !!! WARNING 这个方法中的数值轻易不要修改,后续很多测试代码都是基于这个数值的 - */ - private static A8kOptFnFormula buildTestFnFormula(A8kFnType fntyp) { - A8kOptFnFormula formula = new A8kOptFnFormula(); - - A8kNormalFn a8kNormalFn = new A8kNormalFn(); - a8kNormalFn.x = A8kOptX.R; - a8kNormalFn.xMin = 1.0; - a8kNormalFn.xMax = 100.0; - a8kNormalFn.A = 1.0; - a8kNormalFn.B = 1.0; - a8kNormalFn.C = 1.0; - a8kNormalFn.D = 1.0; - a8kNormalFn.lowLimit = 1.0; - a8kNormalFn.upLimit = 100.0; - - A8kPiecewiseFn a8kPiecewiseFn = new A8kPiecewiseFn(); - a8kPiecewiseFn.judeX = A8kOptX.R; - a8kPiecewiseFn.judeThres = 1.0; - a8kPiecewiseFn.lX = A8kOptX.R; - a8kPiecewiseFn.hX = A8kOptX.R; - a8kPiecewiseFn.xMin = 1.0; - a8kPiecewiseFn.xMax = 100.0; - a8kPiecewiseFn.A0 = 1.0; - a8kPiecewiseFn.B0 = 1.0; - a8kPiecewiseFn.C0 = 1.0; - a8kPiecewiseFn.D0 = 1.0; - a8kPiecewiseFn.A1 = 1.0; - a8kPiecewiseFn.B1 = 1.0; - a8kPiecewiseFn.C1 = 1.0; - a8kPiecewiseFn.D1 = 1.0; - a8kPiecewiseFn.lowLimit = 1.0; - a8kPiecewiseFn.upLimit = 100.0; - - A8kResultBuilderFn a8kResultBuilderFn = new A8kResultBuilderFn(); //结果生成函数 - - a8kResultBuilderFn.ret1Unit = A8kResultUnit.pgPml; - a8kResultBuilderFn.ret2Unit = A8kResultUnit.ngPml; - a8kResultBuilderFn.ret3Unit = A8kResultUnit.ugPml; - a8kResultBuilderFn.toUint2FnA = 2.0; - a8kResultBuilderFn.toUint2FnB = 0.1; - a8kResultBuilderFn.toUint3FnA = 3.0; - a8kResultBuilderFn.toUint3FnB = 0.1; - - - formula.fnType = fntyp; - //普通函数 - if (A8kFnType.NormalFn.equals(fntyp)) { - formula.serumNorFn = a8kNormalFn.clone(); // 血清 - formula.bloodNorFn = a8kNormalFn.clone(); // 血浆 - } - // 分段函数系数 - if (A8kFnType.PiecewiseFn.equals(fntyp)) { - formula.serumPiecewiseFn = a8kPiecewiseFn.clone(); // 血清 - formula.bloodPiecewiseFn = a8kPiecewiseFn.clone(); // 血浆 - } - //结果 - formula.resultBuilderFn = a8kResultBuilderFn.clone(); //结果生成函数 - return formula; - } - - - static public ProjInfo build(FakeProjInfoContextCfg cfg) { - - // - // ProjectInfo - // - ProjectBaseInfo projInfo = new ProjectBaseInfo(); - projInfo.projId = cfg.projId; - projInfo.projName = cfg.projName; - projInfo.projShortName = cfg.projShortName; - projInfo.subProjNum = cfg.subProjNum; - projInfo.reactionTemperature = cfg.reactionTemperature; - projInfo.color = cfg.color; - projInfo.reactionFlowType = cfg.reactionFlowType; - projInfo.wBloodSampleVolUl = cfg.wBloodSampleVolUl; - projInfo.serumSampleVolUl = cfg.serumSampleVolUl; - projInfo.shakeTimes = cfg.shakeTimes; - projInfo.bigBufferSampleUl = cfg.bigBufferSampleUl; - projInfo.reactionPlateIncubationTimeMin = cfg.reactionPlateIncubationTimeMin; - projInfo.reactionPlateDropletVolUl = cfg.reactionPlateDropletVolUl; - - // - // ProjInfoCard - // - ProjExtInfoCard projExtInfoCard = new ProjExtInfoCard(); - projExtInfoCard.projName = cfg.projName; - projExtInfoCard.lotId = cfg.lotId; - if (!cfg.expired) { - projExtInfoCard.expiryDate = ZDateUtils.nextDay(); - } else { - projExtInfoCard.expiryDate = ZDateUtils.theDayBeforeYesterday(); - } - projExtInfoCard.projId = cfg.projId; - projExtInfoCard.updateChipVersion = cfg.updateChipVersion; - projExtInfoCard.subProjNum = cfg.subProjNum; - - for (int i = 0; i < cfg.subProjNum; i++) { - var fnFormula = buildTestFnFormula(cfg.fnType); - projExtInfoCard.projFnFormuals.add(fnFormula); - } - - // - // ProjOptInfo - // - List optCfgList = new ArrayList<>(); - for (int i = 0; i < cfg.subProjNum; i++) { - OptCfg optCfg = new OptCfg(); - optCfg.projId = cfg.projId; - optCfg.projName = cfg.projName; - optCfg.subProjIndex = i; - optCfg.subProjName = String.format("SUBPROJ_%d", i); - optCfg.subProjShortName = String.format("SP%d", i); - optCfg.optType = cfg.optType; - optCfg.optScanRange = 250; - optCfg.optScanPeakNum = cfg.optScanPeakNum; - optCfg.peakNameRefNum = cfg.optPeakNameAssginRefPeakNum; - optCfgList.add(optCfg); - } - - return new ProjInfo(new ProjBuildinInfo(projInfo, optCfgList), projExtInfoCard); - } - -} diff --git a/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java b/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java index 7ae41a1..23fc81d 100644 --- a/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java +++ b/src/main/java/a8k/app/a8kproj/optanalyzer/A8kOptXGetter.java @@ -10,7 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class A8kOptXGetter { - private static final Logger log = LoggerFactory.getLogger(A8kOptXGetter.class); static class Context { OptCfg optcfg; diff --git a/src/main/java/a8k/app/config/A8kCanBusConnectionConfig.java b/src/main/java/a8k/app/config/A8kCanBusConnectionConfig.java new file mode 100644 index 0000000..a91296d --- /dev/null +++ b/src/main/java/a8k/app/config/A8kCanBusConnectionConfig.java @@ -0,0 +1,20 @@ +package a8k.app.config; + +import a8k.app.hardware.basedriver.A8kCanBusConnection; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class A8kCanBusConnectionConfig { + @Value("${hardware.canbus.cmdch.url}") + String cmdchurl; + + @Value("${hardware.canbus.datach.url}") + String datachurl; + + @Bean + A8kCanBusConnection a8kCanBusBaseService() { + return new A8kCanBusConnection(cmdchurl, datachurl); + } +} diff --git a/src/main/java/a8k/app/config/CorsConfig.java b/src/main/java/a8k/app/config/CorsConfig.java new file mode 100644 index 0000000..514106e --- /dev/null +++ b/src/main/java/a8k/app/config/CorsConfig.java @@ -0,0 +1,18 @@ +package a8k.app.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class CorsConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + // 允许所有域名进行跨域访问,实际使用时应根据需要进行配置 + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "POST", "PUT", "DELETE") + .allowedHeaders("*"); + } +} \ No newline at end of file diff --git a/src/main/java/a8k/app/config/SpringDocConfig.java b/src/main/java/a8k/app/config/SpringDocConfig.java new file mode 100644 index 0000000..779c583 --- /dev/null +++ b/src/main/java/a8k/app/config/SpringDocConfig.java @@ -0,0 +1,78 @@ +package a8k.app.config; + +import io.swagger.v3.oas.models.OpenAPI; +import io.swagger.v3.oas.models.info.Info; +import org.springdoc.core.models.GroupedOpenApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SpringDocConfig { + @Bean + public OpenAPI myOpenAPI() { + return new OpenAPI() + .info(new Info() + .title("A8000接口说明")); + } + + + @Bean + public GroupedOpenApi basicApi() { + return GroupedOpenApi.builder() + .group("v1.app.basic") + .packagesToScan("a8k.app.controler.api.v1.app.basic") + .build(); + } + + @Bean + public GroupedOpenApi ctrlApi() { + return GroupedOpenApi.builder() + .group("v1.app.ctrl") + .packagesToScan("a8k.app.controler.api.v1.app.ctrl") + .build(); + } + + @Bean + public GroupedOpenApi dataApi() { + return GroupedOpenApi.builder() + .group("v1.app.data") + .packagesToScan("a8k.app.controler.api.v1.app.data") + .build(); + } + + @Bean + public GroupedOpenApi settingApi() { + return GroupedOpenApi.builder() + .group("v1.app.setting") + .packagesToScan("a8k.app.controler.api.v1.app.setting") + .build(); + } + + @Bean + public GroupedOpenApi stateApi() { + return GroupedOpenApi.builder() + .group("v1.app.state") + .packagesToScan("a8k.app.controler.api.v1.app.state") + .build(); + } + + @Bean + public GroupedOpenApi allApi() { + return GroupedOpenApi.builder() + .group("v1.app.all") + .packagesToScan("a8k.app.controler.api.v1.app") + .build(); + } + + + // assistant + + @Bean + public GroupedOpenApi assistantApi() { + return GroupedOpenApi.builder() + .group("v1.app.assistant") + .packagesToScan("a8k.app.controler.api.v1.app.assistant") + .build(); + } + +} \ No newline at end of file diff --git a/src/main/java/a8k/app/config/WebSocketConfiguration.java b/src/main/java/a8k/app/config/WebSocketConfiguration.java new file mode 100644 index 0000000..6bb99e8 --- /dev/null +++ b/src/main/java/a8k/app/config/WebSocketConfiguration.java @@ -0,0 +1,13 @@ +package a8k.app.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class WebSocketConfiguration { + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/src/main/java/a8k/app/hardware/basedriver/A8kCanBusService.java b/src/main/java/a8k/app/hardware/basedriver/A8kCanBusService.java index 17f0fc3..06bd069 100644 --- a/src/main/java/a8k/app/hardware/basedriver/A8kCanBusService.java +++ b/src/main/java/a8k/app/hardware/basedriver/A8kCanBusService.java @@ -121,6 +121,9 @@ public class A8kCanBusService { Boolean firstReadIO = priGetIOState(ioid); Boolean secondReadIO = priGetIOState(ioid); if (firstReadIO == secondReadIO) { + if(ioid.mirror){ + return !firstReadIO; + } return firstReadIO; } else { log.warn("getIOState {} not match, retry", ioid); diff --git a/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java b/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java index d5518e3..016a9c6 100644 --- a/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java +++ b/src/main/java/a8k/app/hardware/driver/MiniServoDriver.java @@ -29,6 +29,23 @@ public class MiniServoDriver { canBus.callcmd(id.mid, CmdId.mini_servo_enable, enable); } + public void miniServoForceEnable(MiniServoMId id, int enable) { + try { + miniServoEnable(id, enable); + } catch (AppException e) { + logger.error("miniServoForceEnable error", e); + } + } + + public Boolean miniServoPing(MiniServoMId id) { + try { + miniServoReadPos(id); + } catch (AppException e) { + return false; + } + return true; + } + public int miniServoReadPos(MiniServoMId id) throws AppException { var packet = canBus.callcmd(id.mid, CmdId.mini_servo_read_pos); return packet.getContentI32(0); @@ -98,7 +115,6 @@ public class MiniServoDriver { } - public void miniServoWaitIsNotMove(MiniServoMId id, int acitionOvertime) throws AppException { long startedAt = System.currentTimeMillis(); do { diff --git a/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java b/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java index 2d5d03f..83ca02e 100644 --- a/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java +++ b/src/main/java/a8k/app/hardware/driver/StepMotorCtrlDriver.java @@ -105,7 +105,7 @@ public class StepMotorCtrlDriver { public Integer stepMotorReadPosByMoveToZeroBlock(StepMotorMId id, Integer actionOvertime) throws AppException { stepMotorEnable(id, 1); stepMotorEasyMoveToZeroBlock(id, actionOvertime); - Integer nowpos = stepMotorReadPos(id); + Integer nowpos = stepMotorReadPos(id); Integer measurepos = -canBus.moduleGetReg(id.mid, RegIndex.kreg_step_motor_dpos) + nowpos; stepMotorEnable(id, 0); return measurepos; @@ -143,6 +143,10 @@ public class StepMotorCtrlDriver { canBus.waitForMod(id.mid, actionOvertime); } + public Boolean isHasMoveToZero(StepMotorMId id) throws AppException { + return getReg(id, StepMotorRegIndex.kreg_step_motor_has_move_zero) != 0; + } + public void setReg(StepMotorMId id, StepMotorRegIndex regIndex, Integer val) throws AppException { canBus.moduleSetReg(id.mid, regIndex.regIndex, val); } diff --git a/src/main/java/a8k/app/hardware/driver/type/StepMotorRegIndex.java b/src/main/java/a8k/app/hardware/driver/type/StepMotorRegIndex.java index fd0c7bf..9a503ed 100644 --- a/src/main/java/a8k/app/hardware/driver/type/StepMotorRegIndex.java +++ b/src/main/java/a8k/app/hardware/driver/type/StepMotorRegIndex.java @@ -13,6 +13,7 @@ public enum StepMotorRegIndex { kreg_step_motor_pos(RegIndex.kreg_step_motor_pos), // 机器人x坐标 kreg_step_motor_is_enable(RegIndex.kreg_step_motor_is_enable), // 是否使能 kreg_step_motor_dpos(RegIndex.kreg_step_motor_dpos), // 执行完上一条指令后的相对位移 + kreg_step_motor_has_move_zero(RegIndex.kreg_step_motor_has_move_zero), // 是否已经移动到零点 // kreg_step_motor_shift(RegIndex.kreg_step_motor_shift), // x偏移 kreg_step_motor_shaft(RegIndex.kreg_step_motor_shaft), // x轴是否反转 kreg_step_motor_one_circle_pulse(RegIndex.kreg_step_motor_one_circle_pulse), // x轴一圈脉冲数 diff --git a/src/main/java/a8k/app/hardware/initializer/A8kModParamInitializer.java b/src/main/java/a8k/app/hardware/initializer/A8kModParamInitializer.java index 6ad9cac..c27222c 100644 --- a/src/main/java/a8k/app/hardware/initializer/A8kModParamInitializer.java +++ b/src/main/java/a8k/app/hardware/initializer/A8kModParamInitializer.java @@ -8,6 +8,7 @@ import a8k.app.hardware.driver.StepMotorCtrlDriver; import a8k.app.hardware.driver.type.MiniServoMId; import a8k.app.hardware.driver.type.PipetteRegIndex; import a8k.app.hardware.driver.type.StepMotorMId; +import a8k.app.hardware.driver.type.StepMotorRegIndex; import a8k.app.service.bases.AppEventBusService; import a8k.app.a8ktype.appevent.A8kCanBusOnConnectEvent; import a8k.app.a8ktype.appevent.AppEvent; @@ -58,6 +59,18 @@ public class A8kModParamInitializer { * 2.如果电机没有配备编码,则每次调用moveQuickToZeroPoint,都会进行一次位置检查 */ + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModClampingM, StepMotorRegIndex.kreg_step_motor_look_zero_edge_speed, 50);// + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModClampingM, StepMotorRegIndex.kreg_step_motor_run_to_zero_speed, 50);// + + + stepMotorCtrlDriver.setReg(StepMotorMId.PlatesBoxYM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 20);//板夹仓前后移动 + stepMotorCtrlDriver.setReg(StepMotorMId.PlatesBoxPusherM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 20);//板夹仓推板 + stepMotorCtrlDriver.setReg(StepMotorMId.ShakeModGripperZM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 200);//摇匀模组Z轴 + stepMotorCtrlDriver.setReg(StepMotorMId.FeedingModXM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 40);//进料模组X轴 + stepMotorCtrlDriver.setReg(StepMotorMId.IncubatorRotateCtrlM, StepMotorRegIndex.kreg_step_motor_one_circle_pulse, 400);//转盘 + pipetteCtrlDriver.setReg(PipetteRegIndex.kreg_pipette_zm_one_circle_pulse, 20); + + //光学电机步进单位设置,默认是 1574803 ,调大拉伸波形,调小拉伸波形 // canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kreg_step_motor_one_circle_pulse, 1550000); canBus.moduleSetReg(MId.OptModScannerM, RegIndex.kreg_step_motor_one_circle_pulse, 1590000); diff --git a/src/main/java/a8k/app/hardware/type/a8kcanprotocol/IOId.java b/src/main/java/a8k/app/hardware/type/a8kcanprotocol/IOId.java index f20bd02..4588174 100644 --- a/src/main/java/a8k/app/hardware/type/a8kcanprotocol/IOId.java +++ b/src/main/java/a8k/app/hardware/type/a8kcanprotocol/IOId.java @@ -1,26 +1,26 @@ package a8k.app.hardware.type.a8kcanprotocol; public enum IOId { - TubeHeightPPS(ModuleType.kboard, MId.FeedingModBoard, 0), //高低试管检测IO - THChOuterPPS(ModuleType.kboard, MId.FeedingModBoard, 1),//试管架转移通道有无检测 外 - THChInterPPS(ModuleType.kboard, MId.FeedingModBoard, 2),//试管架转移通道有无检测 内 - OutfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 3),//试管出料位置 试管架有无检测 - TubeExistPPS(ModuleType.kboard, MId.FeedingModBoard, 4),//试管有无光电 - InfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 5),//试管架入料位置 试管架有无检测 + TubeHeightPPS(ModuleType.kboard, MId.FeedingModBoard, 0, false), //高低试管检测IO + THChOuterPPS(ModuleType.kboard, MId.FeedingModBoard, 1, false),//试管架转移通道有无检测 外 + THChInterPPS(ModuleType.kboard, MId.FeedingModBoard, 2, false),//试管架转移通道有无检测 内 + OutfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 3, false),//试管出料位置 试管架有无检测 + TubeExistPPS(ModuleType.kboard, MId.FeedingModBoard, 4, false),//试管有无光电 + InfeedPPS(ModuleType.kboard, MId.FeedingModBoard, 5, false),//试管架入料位置 试管架有无检测 - RecycleBinOverflowPPS(ModuleType.kboard, MId.PlatesBoxTCMBoard, 2),//废料桶满溢检测 - RecycleBinOverflowPPSPowerCtrl(ModuleType.kboard, MId.PlatesBoxTCMBoard, 0),//废料桶光栅电源 + RecycleBinOverflowPPS(ModuleType.kboard, MId.PlatesBoxTCMBoard, 2, false),//废料桶满溢检测 + RecycleBinOverflowPPSPowerCtrl(ModuleType.kboard, MId.PlatesBoxTCMBoard, 0, false),//废料桶光栅电源 - PlateBoxCoverClosurePPS(ModuleType.kboard, MId.PlatesBoxBoard, 0),//板夹仓舱盖闭合检测 - PlateBoxPlateStuckPPS(ModuleType.kboard, MId.PlatesBoxBoard, 1),//板夹仓卡板检测 + PlateBoxCoverClosurePPS(ModuleType.kboard, MId.PlatesBoxBoard, 0, true),//板夹仓舱盖闭合检测 + PlateBoxPlateStuckPPS(ModuleType.kboard, MId.PlatesBoxBoard, 1, false),//板夹仓卡板检测 //转盘逻辑相关光电 //钩板电机,零点光电,终点光电 - PullerMZeroPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 0),// - PullerMEndPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 1),// + PullerMZeroPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 0, false),// + PullerMEndPPS(ModuleType.ktmc_step_motor, MId.OptModPullM, 1, false),// //推板电机,零点光电,终点光电 - PusherMZeroPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 0),// - PusherMEndPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 1),// + PusherMZeroPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 0, false),// + PusherMEndPPS(ModuleType.ktmc_step_motor, MId.PlatesBoxPusherM, 1, false),// ; @@ -28,11 +28,15 @@ public enum IOId { final public ModuleType mtype; final public MId mid; final public int ioIndex; + final public boolean mirror; - IOId(ModuleType mtype, MId mid, int ioIndex) { + IOId(ModuleType mtype, MId mid, int ioIndex, boolean mirror) { this.mtype = mtype; this.mid = mid; this.ioIndex = ioIndex; + this.mirror = mirror; + } + } diff --git a/src/main/java/a8k/app/hardware/type/regindex/RegIndex.java b/src/main/java/a8k/app/hardware/type/regindex/RegIndex.java index 4479a75..c02d485 100644 --- a/src/main/java/a8k/app/hardware/type/regindex/RegIndex.java +++ b/src/main/java/a8k/app/hardware/type/regindex/RegIndex.java @@ -39,18 +39,18 @@ public enum RegIndex { kreg_pipette_capactitance_val(4001), // 移液枪电容值 kreg_pipette_tip_state(4002, false), // 移动液枪tip状态 -// kreg_pipette_limit_ul(4051), // -// kreg_pipette_pump_acc(4052), // -// kreg_pipette_pump_dec(4053), // -// kreg_pipette_pump_vstart(4054), // -// kreg_pipette_pump_vstop(4055), // -// kreg_pipette_pump_vmax(4056), // -// kreg_pipette_aspirate_distribut_pump_vel(4057), // -// kreg_pipette_lld_pump_vel(4058), // -// kreg_pipette_lld_motor_vel_rpm(4059), // -// kreg_pipette_lld_detect_period_ms(4060), // -// kreg_pipette_lld_prepare_pos(4061), // -// kreg_pipette_lld_prepare_distribut_pos(4062), // + // kreg_pipette_limit_ul(4051), // + // kreg_pipette_pump_acc(4052), // + // kreg_pipette_pump_dec(4053), // + // kreg_pipette_pump_vstart(4054), // + // kreg_pipette_pump_vstop(4055), // + // kreg_pipette_pump_vmax(4056), // + // kreg_pipette_aspirate_distribut_pump_vel(4057), // + // kreg_pipette_lld_pump_vel(4058), // + // kreg_pipette_lld_motor_vel_rpm(4059), // + // kreg_pipette_lld_detect_period_ms(4060), // + // kreg_pipette_lld_prepare_pos(4061), // + // kreg_pipette_lld_prepare_distribut_pos(4062), // kreg_pipette_zm_pos(4101), kreg_pipette_zm_is_enable(4102), @@ -151,6 +151,7 @@ public enum RegIndex { kreg_step_motor_pos(10101), // 机器人x坐标 kreg_step_motor_is_enable(10102), // 是否使能 kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移 + kreg_step_motor_has_move_zero(10104), // 是否回零 kreg_step_motor_shift(10150), // x偏移 kreg_step_motor_shaft(10151), // x轴是否反转 kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数 diff --git a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java index fc828e7..58b6b29 100644 --- a/src/main/java/a8k/app/service/background/TemperatureCtrlService.java +++ b/src/main/java/a8k/app/service/background/TemperatureCtrlService.java @@ -7,7 +7,7 @@ import a8k.app.a8ktype.exception.AppException; import a8k.app.service.bases.AppEventBusService; import a8k.app.service.setting.AppSettingsMgrService; import a8k.app.hardware.driver.TemperatureControlDriver; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java b/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java index 67bb624..c2def37 100644 --- a/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java +++ b/src/main/java/a8k/app/service/data/ProjIdCardInfoMgrService.java @@ -18,7 +18,7 @@ import a8k.app.dao.db.type.ProjExtInfoCard; import a8k.app.a8ktype.db.CommonPage; import a8k.app.utils.ProjBuildinInfo; import a8k.app.utils.ZAppChecker; -import a8k.utils.DoubleUtils; +import a8k.app.utils.DoubleUtils; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java index 4c38067..5570d57 100644 --- a/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/ConsumablesScanCtrlService.java @@ -2,17 +2,16 @@ package a8k.app.service.lowerctrl; import a8k.app.hardware.driver.CodeScanerDriver; import a8k.app.service.param.hbotpos.Hbot2DCodeScanParamMgr; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.type.ConsumableOneChRawResult; import a8k.app.a8ktype.device.Pos2d; import a8k.app.a8ktype.exception.AppException; -import a8k.utils.DoAction; +import a8k.app.utils.DoAction; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; -import java.util.Objects; @Component public class ConsumablesScanCtrlService { diff --git a/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java index 9acb7bb..ad3d6d1 100644 --- a/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java @@ -16,7 +16,7 @@ import a8k.app.hardware.driver.type.StepMotorMId; import a8k.app.service.background.BackgroudProcessCtrlService; import a8k.app.service.bases.AppEventBusService; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.others.CheckPointType; import a8k.app.a8ktype.others.checkpoint.CheckResult; import a8k.app.a8ktype.others.checkpoint.Checkpoint; @@ -74,7 +74,7 @@ public class DeviceInitCtrlService { @Resource HbotMoveCtrlService hbotMoveCtrlService; - Integer actionOvertime = 10000; + Integer actionOvertime = 20000; List checkPoints = new ArrayList<>(); diff --git a/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java index 92be613..996ca87 100644 --- a/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/TubeFeedingCtrlService.java @@ -104,6 +104,7 @@ public class TubeFeedingCtrlService { logger.info("弹出试管架"); moveTubeRackToExitPos(); try { + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModOutfeedM, 1000, 1000); stepMotorCtrlDriver.stepMotorEasyRotate(StepMotorMId.FeedingModOutfeedM, 1); OS.hsleep(2500); for (int i = 0; i < outfeedOvertime / 100; i++) { diff --git a/src/main/java/a8k/app/service/lowerctrl/TubeFeedingExCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/TubeFeedingExCtrlService.java index aea638c..6e56477 100644 --- a/src/main/java/a8k/app/service/lowerctrl/TubeFeedingExCtrlService.java +++ b/src/main/java/a8k/app/service/lowerctrl/TubeFeedingExCtrlService.java @@ -40,9 +40,9 @@ public class TubeFeedingExCtrlService { * @throws AppException 硬件异常 */ public void moveTubeRackTo(Integer pos, TargetPosMeasureDirection moveDiretion, Boolean moveToZero) throws AppException { - if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) { - throw new AppException(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS); - } +// if (!stepMotorCtrlDriver.stepMotorReadIoState(StepMotorMId.ShakeModGripperZM, 0)) { +// throw new AppException(A8kEcode.LOW_EXT_ERROR_MOTOR_AT_WRONG_POS); +// } //打开扫码夹具 scanClampModRelease(); diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC10ErrorReactionPlateProcesser.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC10ErrorReactionPlateProcesser.java index dd8da50..e9fec9e 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC10ErrorReactionPlateProcesser.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC10ErrorReactionPlateProcesser.java @@ -6,7 +6,7 @@ import a8k.app.service.statemgr.IncubationPlateStateMgrService; import a8k.app.service.statemgr.OptScanModuleStateMgrService; import a8k.app.a8ktype.state.IncubationSubTank; import a8k.app.service.lowerctrl.OptScanModuleCtrlService; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; import a8k.app.utils.ZList; 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 ab12e3a..aac00e5 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 @@ -10,7 +10,7 @@ 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.teststate.VirtualDevice; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; import a8k.app.utils.ProjInfoUtils; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java index 9038d2e..3152f5b 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC20ScanReactionPlate.java @@ -13,7 +13,7 @@ import a8k.app.service.statemgr.ProjectContextMgrService; import a8k.app.a8ktype.state.ProjectTaskContext; import a8k.app.service.lowerctrl.OptScanModuleCtrlService; import a8k.app.dao.db.type.a8kidcard.zenum.A8kOptType; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.factory.FakeReactionResultFactory; import a8k.app.a8ktype.type.ReactionResult; import a8k.app.a8ktype.error.AppError; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30EjectTubeHolder.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30EjectTubeHolder.java index 9f5e197..2d723b4 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30EjectTubeHolder.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30EjectTubeHolder.java @@ -5,7 +5,7 @@ import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser; import a8k.app.service.statemgr.GStateMgrService; import a8k.app.service.statemgr.TubeStateMgrService; import a8k.app.service.lowerctrl.TubeFeedingCtrlService; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; import a8k.app.utils.ZList; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java index b203853..7717fbd 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30ScanTubeHolderTask.java @@ -17,7 +17,7 @@ import a8k.app.a8ktype.state.enumtype.TubeState; import a8k.app.service.lowerctrl.TubeFeedingCtrlService; import a8k.app.service.bases.AppEventBusService; import a8k.app.a8ktype.appevent.AppWarningNotifyEvent; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.type.TubeHolderScanResult; import a8k.app.a8ktype.error.AETubeError; import a8k.app.a8ktype.error.AppError; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30SwitchToNextTubeTake.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30SwitchToNextTubeTake.java index 7917f9e..f6d04dc 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30SwitchToNextTubeTake.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC30SwitchToNextTubeTake.java @@ -4,7 +4,7 @@ import a8k.app.service.mainctrl.mainflowctrl.base.A8kActionTask; import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser; import a8k.app.service.statemgr.TubeStateMgrService; import a8k.app.service.lowerctrl.TubeFeedingCtrlService; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; import a8k.app.utils.ZList; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java index e72ff82..9172da3 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/AC41ProcessSample.java @@ -16,11 +16,11 @@ import a8k.app.service.mainctrl.erroranalyzer.ErrorProcessor; import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.app.utils.ActionTaskPool; import a8k.app.utils.ZList; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.error.AppError; import a8k.app.a8ktype.exception.AppException; import a8k.app.a8ktype.exception.ZAppInterruptException; -import a8k.utils.DoAction; +import a8k.app.utils.DoAction; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java index f45fbaf..96e1b1b 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java +++ b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/processer/MainFlowStateChangeProcesser.java @@ -1,6 +1,5 @@ package a8k.app.service.mainctrl.mainflowctrl.processer; -import a8k.app.service.mainctrl.TubeHolderSettingMgrService; import a8k.app.service.mainctrl.mainflowctrl.base.IMainFlowStateChangeProcesser; import a8k.app.service.mainctrl.mainflowctrl.base.MainFlowProcesser; import a8k.app.service.statemgr.*; @@ -9,7 +8,7 @@ import a8k.app.a8ktype.state.enumtype.IncubationSubTankState; import a8k.app.service.lowerctrl.HbotMoveExCtrlService; import a8k.app.service.lowerctrl.OptScanModuleCtrlService; import a8k.app.service.lowerctrl.TubeFeedingCtrlService; -import a8k.teststate.VirtualDevice; +import a8k.app.teststate.VirtualDevice; import a8k.app.a8ktype.exception.AppException; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java b/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java index 97e76b5..be90b75 100644 --- a/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java +++ b/src/main/java/a8k/app/service/setting/AppSettingsMgrService.java @@ -9,7 +9,7 @@ import a8k.app.dao.db.type.LISSetting; import a8k.app.dao.db.type.appsetting.AppSettingName; import a8k.app.dao.db.type.appsetting.settingenum.*; import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; -import a8k.utils.IPAddressValidator; +import a8k.app.utils.IPAddressValidator; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.slf4j.Logger; diff --git a/src/main/java/a8k/app/teststate/TestStateMgrService.java b/src/main/java/a8k/app/teststate/TestStateMgrService.java new file mode 100644 index 0000000..07e3762 --- /dev/null +++ b/src/main/java/a8k/app/teststate/TestStateMgrService.java @@ -0,0 +1,44 @@ +package a8k.app.teststate; + + +import a8k.app.a8ktype.type.TubeHolderScanResult; +import a8k.app.service.lowerctrl.ConsumablesScanCtrlService; +import a8k.app.service.lowerctrl.TubeFeedingCtrlService; +import a8k.app.utils.ReactionPlate2DCodeHelper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class TestStateMgrService { + @Resource + TubeFeedingCtrlService tubeFeedingCtrlService; + @Resource + ConsumablesScanCtrlService consumablesScanCtrlService; + + /** + * 插入虚拟的试管架扫描结果 + * @param scanResult 试管架扫描结果 + */ + public void insertVirtualBloodTubeHolder(TubeHolderScanResult scanResult) { + tubeFeedingCtrlService.setVirtualTubeScanResult(scanResult); + } + + + /** + * 插入虚拟的耗材扫描结果 + * @param ch 通道号 + * @param lotId 批号 + */ + public void putVirtualConsumable(int ch, String lotId) { + consumablesScanCtrlService.setVirtualConsumablesScanResult(ch,ReactionPlate2DCodeHelper.build2DCode(lotId), lotId, lotId); + } + + /** + * 拿走虚拟耗材 + */ + public void takeAwayVirtualConsumable(int ch) { + // ConsumableOneChRawResult consumable = new ConsumableOneChRawResult(ch); + consumablesScanCtrlService.setVirtualConsumablesScanResult(ch, null, null, null); + } + +} diff --git a/src/main/java/a8k/app/teststate/VirtualDevice.java b/src/main/java/a8k/app/teststate/VirtualDevice.java new file mode 100644 index 0000000..802357c --- /dev/null +++ b/src/main/java/a8k/app/teststate/VirtualDevice.java @@ -0,0 +1,37 @@ +package a8k.app.teststate; + +import a8k.OS; +import a8k.app.a8ktype.DeviceRunMode; +import a8k.app.service.bases.UIMessage; +import a8k.app.service.statemgr.GStateMgrService; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +public class VirtualDevice { + + @Resource + GStateMgrService gstate; + + synchronized public Boolean isEnable() { + return gstate.getDeviceRunMode().equals(DeviceRunMode.VirtualMode); + } + + synchronized public void setEnableVirtualDevice() { + gstate.setDeviceRunMode(DeviceRunMode.VirtualMode); + } + + // + // Action + // + public void doVirtualThings(String msg) { + for (int i = 0; i < 3; i++) { + UIMessage.info(log, "执行,%s[%.1f] ", msg, i / 3.0 * 100); + OS.forceSleep(1000); + } + UIMessage.info(log, "执行,%s[100%%] ", msg); + + } +} diff --git a/src/main/java/a8k/app/utils/DoAction.java b/src/main/java/a8k/app/utils/DoAction.java new file mode 100644 index 0000000..9404191 --- /dev/null +++ b/src/main/java/a8k/app/utils/DoAction.java @@ -0,0 +1,32 @@ +package a8k.app.utils; + +import a8k.SpringBootBeanUtil; +import a8k.app.a8ktype.exception.AppException; +import a8k.app.teststate.VirtualDevice; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class DoAction { + @FunctionalInterface + public interface Action { + void doAction() throws AppException; + } + + @FunctionalInterface + public interface Action2 { + T doAction() throws AppException; + } + + public static void doIt(String msg, Action action) throws AppException { + VirtualDevice virtualDevice = SpringBootBeanUtil.getBean(VirtualDevice.class); + + + if (virtualDevice.isEnable()) { + virtualDevice.doVirtualThings(msg); + } else { + action.doAction(); + } + } + + +} diff --git a/src/main/java/a8k/app/utils/DoubleUtils.java b/src/main/java/a8k/app/utils/DoubleUtils.java new file mode 100644 index 0000000..89f21f4 --- /dev/null +++ b/src/main/java/a8k/app/utils/DoubleUtils.java @@ -0,0 +1,21 @@ +package a8k.app.utils; + +public class DoubleUtils { + public static boolean equals(double a, double b) { + return Math.abs(a - b) < 1e-6; + } + + public static boolean equals(double a, double b, double delta) { + return Math.abs(a - b) < delta; + } + + public static boolean greaterThan(double a, double b, double delta) { + return a - b > delta; + } + + public static boolean lessThan(double a, double b, double delta) { + return b - a > delta; + } + + +} diff --git a/src/main/java/a8k/app/utils/IPAddressValidator.java b/src/main/java/a8k/app/utils/IPAddressValidator.java new file mode 100644 index 0000000..d0c66db --- /dev/null +++ b/src/main/java/a8k/app/utils/IPAddressValidator.java @@ -0,0 +1,22 @@ +package a8k.app.utils; + +import java.util.regex.Pattern; + +public class IPAddressValidator { + private static final String IPV4_PATTERN = + "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; + + private static final Pattern pattern = Pattern.compile(IPV4_PATTERN); + + public static boolean isValidIPv4(String ip) { + if (ip == null) { + return false; + } + return pattern.matcher(ip).matches(); + } + + public static void main(String[] args) { + System.out.println(isValidIPv4("192.168.1.1")); + System.out.println(isValidIPv4("192.168")); + } +} diff --git a/src/main/java/a8k/app/utils/ZloggerRecorder.java b/src/main/java/a8k/app/utils/ZloggerRecorder.java new file mode 100644 index 0000000..f2266f9 --- /dev/null +++ b/src/main/java/a8k/app/utils/ZloggerRecorder.java @@ -0,0 +1,33 @@ +package a8k.app.utils; + +import org.slf4j.Logger; + +public class ZloggerRecorder { + Logger logger; + String record; + + public ZloggerRecorder(Logger logger) { + this.logger = logger; + this.record = ""; + } + + synchronized public void clear() { + record = ""; + } + + synchronized public String getRecord() { + return record; + } + + synchronized public void info(String fmt, Object... args) { + String info = String.format(fmt, args); + logger.info(info); + record += info + "\n"; + } + + synchronized public void error(String fmt, Object... args) { + String info = String.format(fmt, args); + logger.error(info); + record += info + "\n"; + } +} diff --git a/src/main/java/a8k/config/A8kCanBusConnectionConfig.java b/src/main/java/a8k/config/A8kCanBusConnectionConfig.java deleted file mode 100644 index 202ff28..0000000 --- a/src/main/java/a8k/config/A8kCanBusConnectionConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package a8k.config; - -import a8k.app.hardware.basedriver.A8kCanBusConnection; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class A8kCanBusConnectionConfig { - @Value("${hardware.canbus.cmdch.url}") - String cmdchurl; - - @Value("${hardware.canbus.datach.url}") - String datachurl; - - @Bean - A8kCanBusConnection a8kCanBusBaseService() { - return new A8kCanBusConnection(cmdchurl, datachurl); - } -} diff --git a/src/main/java/a8k/config/CorsConfig.java b/src/main/java/a8k/config/CorsConfig.java deleted file mode 100644 index ee618e2..0000000 --- a/src/main/java/a8k/config/CorsConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package a8k.config; - -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class CorsConfig implements WebMvcConfigurer { - - @Override - public void addCorsMappings(CorsRegistry registry) { - // 允许所有域名进行跨域访问,实际使用时应根据需要进行配置 - registry.addMapping("/**") - .allowedOrigins("*") - .allowedMethods("GET", "POST", "PUT", "DELETE") - .allowedHeaders("*"); - } -} \ No newline at end of file diff --git a/src/main/java/a8k/config/JacksonCustomizerConfig.java b/src/main/java/a8k/config/JacksonCustomizerConfig.java deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/a8k/config/SpringDocConfig.java b/src/main/java/a8k/config/SpringDocConfig.java deleted file mode 100644 index 03f856d..0000000 --- a/src/main/java/a8k/config/SpringDocConfig.java +++ /dev/null @@ -1,78 +0,0 @@ -package a8k.config; - -import io.swagger.v3.oas.models.OpenAPI; -import io.swagger.v3.oas.models.info.Info; -import org.springdoc.core.models.GroupedOpenApi; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class SpringDocConfig { - @Bean - public OpenAPI myOpenAPI() { - return new OpenAPI() - .info(new Info() - .title("A8000接口说明")); - } - - - @Bean - public GroupedOpenApi basicApi() { - return GroupedOpenApi.builder() - .group("v1.app.basic") - .packagesToScan("a8k.app.controler.api.v1.app.basic") - .build(); - } - - @Bean - public GroupedOpenApi ctrlApi() { - return GroupedOpenApi.builder() - .group("v1.app.ctrl") - .packagesToScan("a8k.app.controler.api.v1.app.ctrl") - .build(); - } - - @Bean - public GroupedOpenApi dataApi() { - return GroupedOpenApi.builder() - .group("v1.app.data") - .packagesToScan("a8k.app.controler.api.v1.app.data") - .build(); - } - - @Bean - public GroupedOpenApi settingApi() { - return GroupedOpenApi.builder() - .group("v1.app.setting") - .packagesToScan("a8k.app.controler.api.v1.app.setting") - .build(); - } - - @Bean - public GroupedOpenApi stateApi() { - return GroupedOpenApi.builder() - .group("v1.app.state") - .packagesToScan("a8k.app.controler.api.v1.app.state") - .build(); - } - - @Bean - public GroupedOpenApi allApi() { - return GroupedOpenApi.builder() - .group("v1.app.all") - .packagesToScan("a8k.app.controler.api.v1.app") - .build(); - } - - - // assistant - - @Bean - public GroupedOpenApi assistantApi() { - return GroupedOpenApi.builder() - .group("v1.app.assistant") - .packagesToScan("a8k.app.controler.api.v1.app.assistant") - .build(); - } - -} \ No newline at end of file diff --git a/src/main/java/a8k/config/WebSocketConfiguration.java b/src/main/java/a8k/config/WebSocketConfiguration.java deleted file mode 100644 index 33f569d..0000000 --- a/src/main/java/a8k/config/WebSocketConfiguration.java +++ /dev/null @@ -1,13 +0,0 @@ -package a8k.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.socket.server.standard.ServerEndpointExporter; - -@Configuration -public class WebSocketConfiguration { - @Bean - public ServerEndpointExporter serverEndpointExporter() { - return new ServerEndpointExporter(); - } -} diff --git a/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java b/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java index 9bb2880..e1c9cec 100644 --- a/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java +++ b/src/main/java/a8k/extui/page/debug/P02ConsumablesMgrDebugPage.java @@ -1,15 +1,12 @@ package a8k.extui.page.debug; -import a8k.app.a8ktype.DeviceRunMode; import a8k.app.a8ktype.device.ConsumableGroup; import a8k.app.a8ktype.device.TipGroup; import a8k.app.a8ktype.device.consumables.LarBottleGroup; import a8k.app.a8ktype.device.consumables.LittBottleGroup; import a8k.app.a8ktype.device.consumables.ReactionPlateGroup; -import a8k.app.a8ktype.device.consumables.Tips; import a8k.app.a8ktype.error.ConsumablesScanReportErrorType; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.type.ConsumablesOneChannelScanResultPacket; import a8k.app.a8ktype.type.ConsumablesScanReport; import a8k.app.a8ktype.type.ConsumablesScanResultPacket; import a8k.app.dao.db.type.ProjExtInfoCard; @@ -21,7 +18,6 @@ import a8k.app.service.statemgr.ConsumablesMgrService; import a8k.app.service.statemgr.GStateMgrService; import a8k.extui.mgr.ExtApiPageMgr; import a8k.extui.type.ExtApiStatu; -import a8k.teststate.TestStateMgrService; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; diff --git a/src/main/java/a8k/extui/page/debug/P02TubeSettingDebugPage.java b/src/main/java/a8k/extui/page/debug/P02TubeSettingDebugPage.java index 3c6a258..b1ad9b2 100644 --- a/src/main/java/a8k/extui/page/debug/P02TubeSettingDebugPage.java +++ b/src/main/java/a8k/extui/page/debug/P02TubeSettingDebugPage.java @@ -1,17 +1,13 @@ package a8k.extui.page.debug; -import a8k.app.a8ktype.device.A8kTubeHolderType; import a8k.app.a8ktype.device.BloodType; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.type.TubeHolderScanResult; -import a8k.app.a8ktype.type.TubesScanResult; import a8k.app.a8ktype.ui.TubeHolderSetting; import a8k.app.a8ktype.ui.TubeSetting; import a8k.app.service.mainctrl.TubeHolderSettingMgrService; import a8k.app.service.statemgr.GStateMgrService; import a8k.extui.mgr.ExtApiPageMgr; import a8k.extui.type.ExtApiStatu; -import a8k.teststate.TestStateMgrService; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/a8k/extui/page/extapp/UsrOperationSimulation.java b/src/main/java/a8k/extui/page/extapp/UsrOperationSimulation.java index f91640f..7c46297 100644 --- a/src/main/java/a8k/extui/page/extapp/UsrOperationSimulation.java +++ b/src/main/java/a8k/extui/page/extapp/UsrOperationSimulation.java @@ -1,22 +1,12 @@ package a8k.extui.page.extapp; -import a8k.app.a8ktype.DeviceRunMode; import a8k.app.a8ktype.device.A8kTubeHolderType; import a8k.app.a8ktype.device.ConsumableGroup; -import a8k.app.a8ktype.device.TipGroup; -import a8k.app.a8ktype.device.consumables.LarBottleGroup; -import a8k.app.a8ktype.device.consumables.LittBottleGroup; -import a8k.app.a8ktype.device.consumables.ReactionPlateGroup; -import a8k.app.a8ktype.device.consumables.Tips; -import a8k.app.a8ktype.error.ConsumablesScanReportErrorType; import a8k.app.a8ktype.exception.AppException; -import a8k.app.a8ktype.type.ConsumablesScanReport; -import a8k.app.a8ktype.type.ConsumablesScanResultPacket; import a8k.app.a8ktype.type.TubeHolderScanResult; import a8k.app.a8ktype.type.TubesScanResult; import a8k.app.dao.db.type.ProjExtInfoCard; import a8k.app.factory.ProjExtInfoCardFactory; -import a8k.app.hardware.type.a8kcanprotocol.A8kEcode; import a8k.app.service.data.ProjIdCardInfoMgrService; import a8k.app.service.data.ProjInfoMgrService; import a8k.app.service.lowerctrl.ProjIDCardCtrlAndMonitorService; @@ -24,8 +14,7 @@ import a8k.app.service.mainctrl.AppConsumablesScanService; import a8k.app.service.statemgr.ConsumablesMgrService; import a8k.app.service.statemgr.GStateMgrService; import a8k.extui.mgr.ExtApiPageMgr; -import a8k.extui.type.ExtApiStatu; -import a8k.teststate.TestStateMgrService; +import a8k.app.teststate.TestStateMgrService; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; diff --git a/src/main/java/a8k/extui/page/extapp/tools/MoterMoveUtilsPage.java b/src/main/java/a8k/extui/page/extapp/tools/MoterMoveUtilsPage.java new file mode 100644 index 0000000..6d27986 --- /dev/null +++ b/src/main/java/a8k/extui/page/extapp/tools/MoterMoveUtilsPage.java @@ -0,0 +1,48 @@ +package a8k.extui.page.extapp.tools; + +import a8k.app.a8ktype.exception.AppException; +import a8k.app.hardware.driver.MiniServoDriver; +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 MoterMoveUtilsPage { + @Resource + ExtApiPageMgr extApiPageMgr; + + static final Integer overtime = 10000; + + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + + + @Resource + MiniServoDriver miniServoDriver; + + public void clampALittle(Integer dpos) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, dpos, overtime); + } + + public void unclampALittle(Integer dpos) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.ShakeModClampingM, 1); + stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.ShakeModClampingM, -dpos, overtime); + } + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("摇匀模组-试管夹紧电机"); + page.addFunction("夹紧一点", this::clampALittle).setParamVal("dpos", () -> 5); + page.addFunction("松开一点", this::unclampALittle).setParamVal("dpos", 5); + + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/extsetting/pos_calibration/P01MiniServoReferencePointIniter.java b/src/main/java/a8k/extui/page/extsetting/pos_calibration/P01MiniServoReferencePointIniter.java deleted file mode 100644 index 50b0cf4..0000000 --- a/src/main/java/a8k/extui/page/extsetting/pos_calibration/P01MiniServoReferencePointIniter.java +++ /dev/null @@ -1,86 +0,0 @@ -package a8k.extui.page.extsetting.pos_calibration; - - -import a8k.extui.mgr.ExtApiPageMgr; -import a8k.app.hardware.driver.MiniServoDriver; -import a8k.app.hardware.driver.type.MiniServoMId; -import a8k.app.a8ktype.exception.AppException; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class P01MiniServoReferencePointIniter { - - @Resource - MiniServoDriver miniServoDriver; - - - public void disableMotor() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 0); - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 0); - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 0); - } - - - public void enableMotor() throws AppException { - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperSV, 1); - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModGripperYSV, 1); - miniServoDriver.miniServoEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 1); - } - - - public Integer gripperSVSetCurrentPosAsRef() throws AppException { - miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperSV); - return 1800; - } - - - public Integer YAxixServoSetCurrentPosAsRef() throws AppException { - return miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperYSV); - } - - - public void setTubeScanClampPos() throws AppException { - miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModTubeScanerClampingSV); - } - - - public void gripperSVMoveToZeroBlock() throws AppException { - miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModGripperSV); - } - - - public void YAxixServoMoveToZeroBlock() throws AppException { - miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModGripperYSV); - } - - - public void tubeScanClampMoveToZeroBlock() throws AppException { - miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModTubeScanerClampingSV); - } - - @Resource - ExtApiPageMgr extApiPageMgr; - - @PostConstruct - public void init() { - var page = extApiPageMgr.newPage(this); - - page.newGroup("基础"); - page.addFunction("失能所有舵机", this::disableMotor); - page.addFunction("使能所有舵机", this::enableMotor); - - page.newGroup("参考点设置"); - page.addFunction("设置<夹爪><参考点>(完全张开的位置)", this::gripperSVSetCurrentPosAsRef); - page.addFunction("设置<摇匀模组Y轴舵机><参考点>(Y轴最外侧的位置)", this::YAxixServoSetCurrentPosAsRef); - page.addFunction("设置<夹紧舵机>参考点(水平位置)", this::setTubeScanClampPos); - - page.newGroup("校验"); - page.addFunction("夹紧舵机移动到待机位(在参考点附近)", this::gripperSVMoveToZeroBlock); - page.addFunction("摇匀模组Y轴舵机移动到待机位(在参考点附近)", this::YAxixServoMoveToZeroBlock); - page.addFunction("夹紧舵机移动到待机位(在参考点附近)", this::tubeScanClampMoveToZeroBlock); - - extApiPageMgr.addPage(page); - } -} diff --git a/src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java b/src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java index 766ae39..dead4e6 100644 --- a/src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java +++ b/src/main/java/a8k/extui/page/measurement/FeedingModMeasurePage.java @@ -15,7 +15,7 @@ public class FeedingModMeasurePage { @Resource ExtApiPageMgr extApiPageMgr; - static final Integer overtime = 10000; + static final Integer overtime = 20000; @Resource @@ -29,23 +29,38 @@ public class FeedingModMeasurePage { Integer moveByDistance = 100; public Integer measureFeedingModXMPos() throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM,1); + if (stepMotorCtrlDriver.isHasMoveToZero(StepMotorMId.FeedingModXM)) { + return stepMotorCtrlDriver.stepMotorReadPos(StepMotorMId.FeedingModXM); + } + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); return stepMotorCtrlDriver.stepMotorReadPosByMoveToZeroBlock(StepMotorMId.FeedingModXM, overtime); } public void moveRight(Integer moveByDistance) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM,1); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, -moveByDistance, overtime); this.moveByDistance = moveByDistance; } public void moveLeft(Integer moveByDistance) throws AppException { - stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM,1); + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); stepMotorCtrlDriver.stepMotorEasyMoveByBlock(StepMotorMId.FeedingModXM, moveByDistance, overtime); this.moveByDistance = moveByDistance; } + public void moveTo(Integer pos) throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 1); + if (!stepMotorCtrlDriver.isHasMoveToZero(StepMotorMId.FeedingModXM)) { + stepMotorCtrlDriver.stepMotorEasyMoveToZeroBlock(StepMotorMId.FeedingModXM, overtime); + } + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.FeedingModXM, pos, overtime); + } + + public void freedomRun() throws AppException { + stepMotorCtrlDriver.stepMotorEnable(StepMotorMId.FeedingModXM, 0); + } + @PostConstruct public void init() { @@ -55,6 +70,8 @@ public class FeedingModMeasurePage { page.addFunction("向右移动", this::moveRight).setParamVal("moveByDistance", () -> moveByDistance); page.addFunction("向左移动", this::moveLeft).setParamVal("moveByDistance", () -> moveByDistance); page.addFunction("测量位置", this::measureFeedingModXMPos); + page.addFunction("移动到指定位置", this::moveTo); + page.addFunction("Freedom", this::freedomRun); extApiPageMgr.addPage(page); } diff --git a/src/main/java/a8k/extui/page/miniservo/MiniServoScanerPage.java b/src/main/java/a8k/extui/page/miniservo/MiniServoScanerPage.java new file mode 100644 index 0000000..830df43 --- /dev/null +++ b/src/main/java/a8k/extui/page/miniservo/MiniServoScanerPage.java @@ -0,0 +1,49 @@ +package a8k.extui.page.miniservo; + + +import a8k.app.a8ktype.exception.AppException; +import a8k.app.hardware.driver.MiniServoDriver; +import a8k.app.hardware.driver.type.MiniServoMId; +import a8k.extui.mgr.ExtApiPageMgr; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class MiniServoScanerPage { + + @Resource + MiniServoDriver miniServoDriver; + + + public Object scan() throws AppException { + Boolean shakeModGripperSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModGripperSV); + Boolean shakeModGripperYSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModGripperYSV); + Boolean shakeModTubeScanerClampingSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModTubeScanerClampingSV); + Boolean shakeModTubeScanerRotateSVState = miniServoDriver.miniServoPing(MiniServoMId.ShakeModTubeScanerRotateSV); + + Map state = new HashMap<>(); + state.put("摇匀模组-夹爪", shakeModGripperSVState); + state.put("摇匀模组-Y轴", shakeModGripperYSVState); + + state.put("入料模组-扫码夹紧", shakeModTubeScanerClampingSVState); + state.put("入料模组-扫码旋转", shakeModTubeScanerRotateSVState); + return state; + } + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础"); + page.addFunction("扫描", this::scan); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/miniservo/P01MiniServoReferencePointIniter.java b/src/main/java/a8k/extui/page/miniservo/P01MiniServoReferencePointIniter.java new file mode 100644 index 0000000..8c5ffa2 --- /dev/null +++ b/src/main/java/a8k/extui/page/miniservo/P01MiniServoReferencePointIniter.java @@ -0,0 +1,86 @@ +package a8k.extui.page.miniservo; + + +import a8k.extui.mgr.ExtApiPageMgr; +import a8k.app.hardware.driver.MiniServoDriver; +import a8k.app.hardware.driver.type.MiniServoMId; +import a8k.app.a8ktype.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@Component +public class P01MiniServoReferencePointIniter { + + @Resource + MiniServoDriver miniServoDriver; + + + public void disableMotor() throws AppException { + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 0); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 0); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 0); + } + + + public void enableMotor() throws AppException { + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperSV, 1); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModGripperYSV, 1); + miniServoDriver.miniServoForceEnable(MiniServoMId.ShakeModTubeScanerClampingSV, 1); + } + + + public Integer gripperSVSetCurrentPosAsRef() throws AppException { + miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperSV); + return 1800; + } + + + public Integer YAxixServoSetCurrentPosAsRef() throws AppException { + return miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModGripperYSV); + } + + + public void setTubeScanClampPos() throws AppException { + miniServoDriver.miniServoSetRefPos(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + + public void gripperSVMoveToZeroBlock() throws AppException { + miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModGripperSV); + } + + + public void YAxixServoMoveToZeroBlock() throws AppException { + miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModGripperYSV); + } + + + public void tubeScanClampMoveToZeroBlock() throws AppException { + miniServoDriver.miniServoMoveToZeroBlock(MiniServoMId.ShakeModTubeScanerClampingSV); + } + + @Resource + ExtApiPageMgr extApiPageMgr; + + @PostConstruct + public void init() { + var page = extApiPageMgr.newPage(this); + + page.newGroup("基础"); + page.addFunction("失能所有舵机", this::disableMotor); + page.addFunction("使能所有舵机", this::enableMotor); + + page.newGroup("参考点设置"); + page.addFunction("设置<夹爪><参考点>(完全张开的位置)", this::gripperSVSetCurrentPosAsRef); + page.addFunction("设置<摇匀模组Y轴舵机><参考点>(Y轴最外侧的位置)", this::YAxixServoSetCurrentPosAsRef); + page.addFunction("设置<夹紧舵机>参考点(水平位置)", this::setTubeScanClampPos); + + page.newGroup("校验"); + page.addFunction("夹紧舵机移动到待机位(在参考点附近)", this::gripperSVMoveToZeroBlock); + page.addFunction("摇匀模组Y轴舵机移动到待机位(在参考点附近)", this::YAxixServoMoveToZeroBlock); + page.addFunction("夹紧舵机移动到待机位(在参考点附近)", this::tubeScanClampMoveToZeroBlock); + + extApiPageMgr.addPage(page); + } +} diff --git a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java b/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java index 7614960..73a01a5 100644 --- a/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java +++ b/src/main/java/a8k/extui/page/test/driver/MotorCtrlPage.java @@ -40,7 +40,7 @@ public class MotorCtrlPage { public void stepMotorEasyMoveToZero() throws AppException { - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(id, 10000); + stepMotorCtrlDriver.stepMotorEasyMoveToZero(id); } public void stepMotorEasyMoveForward() throws AppException { @@ -67,7 +67,7 @@ public class MotorCtrlPage { page.newGroup("基础操作"); page.addFunction("使能电机", this::enableMotor); page.addFunction("失能电机", this::disableMotor); - page.addFunction("快速归零", this::stepMotorEasyMoveToZero); + page.addFunction("归零", this::stepMotorEasyMoveToZero); page.newGroup("相对移动"); page.addFunction("设置相对移动距离", this::setStepMotorDpos).setParamVal("dpos", () -> dpos); diff --git a/src/main/java/a8k/teststate/TestStateMgrService.java b/src/main/java/a8k/teststate/TestStateMgrService.java deleted file mode 100644 index 680c550..0000000 --- a/src/main/java/a8k/teststate/TestStateMgrService.java +++ /dev/null @@ -1,45 +0,0 @@ -package a8k.teststate; - - -import a8k.app.a8ktype.type.ConsumableOneChRawResult; -import a8k.app.a8ktype.type.TubeHolderScanResult; -import a8k.app.service.lowerctrl.ConsumablesScanCtrlService; -import a8k.app.service.lowerctrl.TubeFeedingCtrlService; -import a8k.app.utils.ReactionPlate2DCodeHelper; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class TestStateMgrService { - @Resource - TubeFeedingCtrlService tubeFeedingCtrlService; - @Resource - ConsumablesScanCtrlService consumablesScanCtrlService; - - /** - * 插入虚拟的试管架扫描结果 - * @param scanResult 试管架扫描结果 - */ - public void insertVirtualBloodTubeHolder(TubeHolderScanResult scanResult) { - tubeFeedingCtrlService.setVirtualTubeScanResult(scanResult); - } - - - /** - * 插入虚拟的耗材扫描结果 - * @param ch 通道号 - * @param lotId 批号 - */ - public void putVirtualConsumable(int ch, String lotId) { - consumablesScanCtrlService.setVirtualConsumablesScanResult(ch,ReactionPlate2DCodeHelper.build2DCode(lotId), lotId, lotId); - } - - /** - * 拿走虚拟耗材 - */ - public void takeAwayVirtualConsumable(int ch) { - // ConsumableOneChRawResult consumable = new ConsumableOneChRawResult(ch); - consumablesScanCtrlService.setVirtualConsumablesScanResult(ch, null, null, null); - } - -} diff --git a/src/main/java/a8k/teststate/VirtualDevice.java b/src/main/java/a8k/teststate/VirtualDevice.java deleted file mode 100644 index 519830e..0000000 --- a/src/main/java/a8k/teststate/VirtualDevice.java +++ /dev/null @@ -1,43 +0,0 @@ -package a8k.teststate; - -import a8k.OS; -import a8k.app.a8ktype.DeviceRunMode; -import a8k.app.dao.db.type.ProjExtInfoCard; -import a8k.app.a8ktype.type.ConsumableOneChRawResult; -import a8k.app.a8ktype.type.TubeHolderScanResult; -import a8k.app.service.bases.UIMessage; -import a8k.app.service.statemgr.GStateMgrService; -import jakarta.annotation.Resource; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -public class VirtualDevice { - - @Resource - GStateMgrService gstate; - - synchronized public Boolean isEnable() { - return gstate.getDeviceRunMode().equals(DeviceRunMode.VirtualMode); - } - - synchronized public void setEnableVirtualDevice() { - gstate.setDeviceRunMode(DeviceRunMode.VirtualMode); - } - - // - // Action - // - public void doVirtualThings(String msg) { - for (int i = 0; i < 3; i++) { - UIMessage.info(log, "执行,%s[%.1f] ", msg, i / 3.0 * 100); - OS.forceSleep(1000); - } - UIMessage.info(log, "执行,%s[100%%] ", msg); - - } -} diff --git a/src/main/java/a8k/unittest/TestBeforeRun.java b/src/main/java/a8k/unittest/TestBeforeRun.java deleted file mode 100644 index 2a61843..0000000 --- a/src/main/java/a8k/unittest/TestBeforeRun.java +++ /dev/null @@ -1,21 +0,0 @@ -package a8k.unittest; - - -import a8k.app.service.param.pipetteparam.PipetteGunLLDParamMgr; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@Component -public class TestBeforeRun { - - @Resource - PipetteGunLLDParamMgr pipetteGunLLDParamMgr; - - @PostConstruct - void init() { -// LldType lddType = pipetteGunLLDParamMgr.getLLDType(PipetteGunLLDTypeParam.DEFAULT_LLD_TYPE); -// Assert.isTrue(lddType != null, "LldType is null"); - } - -} diff --git a/src/main/java/a8k/unittest/TestOptAnalyzer.java b/src/main/java/a8k/unittest/TestOptAnalyzer.java deleted file mode 100644 index 85adb6d..0000000 --- a/src/main/java/a8k/unittest/TestOptAnalyzer.java +++ /dev/null @@ -1,55 +0,0 @@ -package a8k.unittest; - -import a8k.app.a8kproj.A8kReactionResultComputer; -import a8k.app.a8kproj.fakeprojcontext.FakeProjInfoContextFactory; -import a8k.app.a8kproj.optalgo.type.OptAlgoAnalysResult; -import a8k.app.a8ktype.state.SampleInfo; -import a8k.app.dao.db.type.a8kidcard.zenum.A8kReactionFlowType; -import a8k.app.a8ktype.type.ReactionResult; -import a8k.app.utils.ProjInfo; -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -public class TestOptAnalyzer { - - @FunctionalInterface - public interface TEST { - Boolean test(); - } - - public Boolean TEST_OPT_RESULT_PARSE_01() { - var cfg = FakeProjInfoContextFactory.createCfg("TEST_PROJ", 2, A8kReactionFlowType.SampleAndBS, 3); - - ProjInfo projInfoContext = FakeProjInfoContextFactory.build(cfg); - SampleInfo sampleInfo = new SampleInfo(); - - OptAlgoAnalysResult optAlgoAnalysResult = new OptAlgoAnalysResult(); - optAlgoAnalysResult.pdR = 1.0; - optAlgoAnalysResult.pdAR = 1.0; - optAlgoAnalysResult.pdATR = 1.0; - optAlgoAnalysResult.pdRFR = 1.0; - optAlgoAnalysResult.pdT4R = 1.0; - optAlgoAnalysResult.pdT4T3R = 1.0; - - ReactionResult result = A8kReactionResultComputer.optComputeResult(sampleInfo, projInfoContext, 0, optAlgoAnalysResult); - log.info("result: {}", result); - return true; - } - - void test(String mark, TEST test) { - Boolean suc = test.test(); - if (suc) { - log.info("TEST: {} -> SUCCESS", mark); - } else { - log.error("TEST: {} -> FAILED", mark); - } - } - - @PostConstruct - void init() { - test("TEST_OPT_RESULT_PARSE_01", this::TEST_OPT_RESULT_PARSE_01); - } -} diff --git a/src/main/java/a8k/utils/DoAction.java b/src/main/java/a8k/utils/DoAction.java deleted file mode 100644 index 798fd6a..0000000 --- a/src/main/java/a8k/utils/DoAction.java +++ /dev/null @@ -1,34 +0,0 @@ -package a8k.utils; - -import a8k.SpringBootBeanUtil; -import a8k.app.a8ktype.exception.AppException; -import a8k.app.service.bases.UIMessage; -import a8k.teststate.VirtualDevice; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class DoAction { - @FunctionalInterface - public interface Action { - void doAction() throws AppException; - } - - @FunctionalInterface - public interface Action2 { - T doAction() throws AppException; - } - - public static void doIt(String msg, Action action) throws AppException { - VirtualDevice virtualDevice = SpringBootBeanUtil.getBean(VirtualDevice.class); - - - if (virtualDevice.isEnable()) { - virtualDevice.doVirtualThings(msg); - } else { - action.doAction(); - } - } - - -} diff --git a/src/main/java/a8k/utils/DoubleUtils.java b/src/main/java/a8k/utils/DoubleUtils.java deleted file mode 100644 index 2a3b10c..0000000 --- a/src/main/java/a8k/utils/DoubleUtils.java +++ /dev/null @@ -1,21 +0,0 @@ -package a8k.utils; - -public class DoubleUtils { - public static boolean equals(double a, double b) { - return Math.abs(a - b) < 1e-6; - } - - public static boolean equals(double a, double b, double delta) { - return Math.abs(a - b) < delta; - } - - public static boolean greaterThan(double a, double b, double delta) { - return a - b > delta; - } - - public static boolean lessThan(double a, double b, double delta) { - return b - a > delta; - } - - -} diff --git a/src/main/java/a8k/utils/IPAddressValidator.java b/src/main/java/a8k/utils/IPAddressValidator.java deleted file mode 100644 index 89aceea..0000000 --- a/src/main/java/a8k/utils/IPAddressValidator.java +++ /dev/null @@ -1,22 +0,0 @@ -package a8k.utils; - -import java.util.regex.Pattern; - -public class IPAddressValidator { - private static final String IPV4_PATTERN = - "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"; - - private static final Pattern pattern = Pattern.compile(IPV4_PATTERN); - - public static boolean isValidIPv4(String ip) { - if (ip == null) { - return false; - } - return pattern.matcher(ip).matches(); - } - - public static void main(String[] args) { - System.out.println(isValidIPv4("192.168.1.1")); - System.out.println(isValidIPv4("192.168")); - } -} diff --git a/src/main/java/a8k/utils/ZloggerRecorder.java b/src/main/java/a8k/utils/ZloggerRecorder.java deleted file mode 100644 index bae0102..0000000 --- a/src/main/java/a8k/utils/ZloggerRecorder.java +++ /dev/null @@ -1,33 +0,0 @@ -package a8k.utils; - -import org.slf4j.Logger; - -public class ZloggerRecorder { - Logger logger; - String record; - - public ZloggerRecorder(Logger logger) { - this.logger = logger; - this.record = ""; - } - - synchronized public void clear() { - record = ""; - } - - synchronized public String getRecord() { - return record; - } - - synchronized public void info(String fmt, Object... args) { - String info = String.format(fmt, args); - logger.info(info); - record += info + "\n"; - } - - synchronized public void error(String fmt, Object... args) { - String info = String.format(fmt, args); - logger.error(info); - record += info + "\n"; - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 90eb685..1ad2a68 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,7 +2,7 @@ server: port: 80 #device.runmode: "RealMode" -a8k.enableTemperatureCtrl: true +a8k.enableTemperatureCtrl: false device.runmode: "RealMode"