From 0412482d80177273e9ca047c4116afe3ab22ef7b Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 24 Jul 2024 15:35:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.db | Bin 479232 -> 487424 bytes src/main/java/a8k/a8k_can_protocol/A8kEcode.java | 2 +- .../java/a8k/base_hardware/A8kCanBusService.java | 21 +++- .../a8k/service/appdb/entity/AppSettingIterm.java | 2 +- .../SamplesPreProcessModuleCtrlService.java | 134 +++++++++++---------- src/main/java/a8k/utils/HardwareParamReader.java | 19 +++ ...1__create_table_HardwareServiceSettingTable.sql | 8 ++ 7 files changed, 117 insertions(+), 69 deletions(-) create mode 100644 src/main/java/a8k/utils/HardwareParamReader.java create mode 100644 src/main/resources/db/migration/V100_1__create_table_HardwareServiceSettingTable.sql diff --git a/app.db b/app.db index 7d17b1d1ba765807bad7b138dfb41a6c80eab300..0bc3270ae3306d1bd8fd285ced5de09f93df57cb 100644 GIT binary patch delta 630 zcmZozAlvXjc7n8E0Rsa=IS|9Z)QLLAj0GDLmhkhj@*Zd4Kge&xcaATD_xNT(fvvpt zjeM-!jN_${7)G8|L}j~|G@u>|H)=SgG>ButjvsztgMq?=}Q5nUx1{)^MB%h z%l`r>eT|=$g_)C)wfU`m`&)ZPAZFVB)}C2>1G6Y&(RB6?%<3$RMNAPuPdhNyHzwDy zi@UlqHhF^Gi_f|Es9xA-T&(w72?z6FVX=l{h27ASg`zxl0w`&)ZP zAZFVB)}C2>1G6yG#_8-InAJBc3N$lq-}s5Sm6@}a4QzXG`SilMjEe0E-> 8) & 0xFFFF; @@ -143,6 +144,11 @@ public class A8kCanBusService { } return new A8kPacket(buffer.array()); } + // fan_controler_set_speed + + public void fanControlerSetSpeed(MId id, int speed) throws HardwareException, InterruptedException { + callcmd(id.toInt(), CmdId.fan_controler_set_speed.toInt(), speed); + } //code_scaner_start_scan @@ -150,21 +156,21 @@ public class A8kCanBusService { //code_scaner_result_is_ready //code_scaner_read_scaner_result - public void codeScanerStartScan(MId id) throws HardwareException { + public void codeScanerStartScan(MId id) throws HardwareException, InterruptedException { callcmd(id.toInt(), CmdId.code_scaner_start_scan.toInt()); } - public void codeScanerStopScan(MId id) throws HardwareException { + public void codeScanerStopScan(MId id) throws HardwareException, InterruptedException { callcmd(id.toInt(), CmdId.code_scaner_stop_scan.toInt()); } - public String codeScanerReadScanerResult(MId id) throws HardwareException { + public String codeScanerReadScanerResult(MId id) throws HardwareException, InterruptedException { A8kPacket ack = callcmd(id.toInt(), CmdId.code_scaner_read_scaner_result.toInt()); var contentBytes = ack.getCmdContent(); return new String(contentBytes); } - public Boolean codeScanerResultIsReady(MId id) throws HardwareException { + public Boolean codeScanerResultIsReady(MId id) throws HardwareException, InterruptedException { var packet = callcmd(id.toInt(), CmdId.code_scaner_result_is_ready.toInt()); return packet.getContentI32(0) != 0; } @@ -384,7 +390,7 @@ public class A8kCanBusService { if (now - startedAt > acitionOvertime) { throw new HardwareException(id, A8kEcode.Overtime); } - Thread.sleep(100); + } while (true); } @@ -531,6 +537,11 @@ public class A8kCanBusService { throw e; } } + try { + Thread.sleep(300); + } catch (InterruptedException ignore) { + } + } throw new HardwareException(MId.valueOf(pack.getModuleId()), A8kEcode.Overtime); diff --git a/src/main/java/a8k/service/appdb/entity/AppSettingIterm.java b/src/main/java/a8k/service/appdb/entity/AppSettingIterm.java index 77616e3..950c9c3 100644 --- a/src/main/java/a8k/service/appdb/entity/AppSettingIterm.java +++ b/src/main/java/a8k/service/appdb/entity/AppSettingIterm.java @@ -12,6 +12,6 @@ public class AppSettingIterm { public String val; public static String getTableName() { - return "HardwareServiceSetting" + "Table"; + return "AppSettingIterm" + "Table"; } } diff --git a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java index 79183bb..7eb3ae5 100644 --- a/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java +++ b/src/main/java/a8k/service/hardware/SamplesPreProcessModuleCtrlService.java @@ -21,86 +21,111 @@ import org.springframework.web.bind.annotation.*; @HardwareServiceParams(service = SamplesPreProcessModuleCtrlService.class) public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { static Logger logger = LoggerFactory.getLogger(SamplesPreProcessModuleCtrlService.class); + HardwareParamReader hpReader = new HardwareParamReader(SamplesPreProcessModuleCtrlService.class); @Resource private A8kCanBusService canBus; @Resource private CommonHardwareOpeartion comHardwareOpear; - @Autowired - private CommonHardwareOpeartion commonHardwareOpeartion; final private int actionDelayTime = 0; - final private Boolean debug = true; + final private Boolean debug = false; - // - // 参数 - // + Boolean IntEq(Integer pos1, Integer pos2, Integer diff) { + return Math.abs(pos1 - pos2) < diff; + } + + void actionDelay() throws InterruptedException { + if (actionDelayTime != 0) + Thread.sleep(actionDelayTime); + } + /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + * 参数 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @HardwareServiceParam(name = "动作超时时间", group = "基础参数") public Integer getActionOvertime() { - return 5000; + return hpReader.getInteger("ActionOvertime", 5000); + } + + @HardwareServiceParam(name = "试管帽有无判断时间", group = "基础参数") + public Integer getCapJudgeDelayTime() { + return hpReader.getInteger("CapJudgeDelayTime", 300); } + @HardwareServiceParam(name = "抓手张开位置", group = "抓手") public Integer getGripperOpenPos() { - return 150; + return hpReader.getInteger("GripperOpenPos", 150); } + @HardwareServiceParam(name = "抓手闭合位置", group = "抓手") public Integer getGripperClosePos() { - return 10; + return hpReader.getInteger("GripperClosePos", 10); } + @HardwareServiceParam(name = "抓手取试管位置", group = "抓手") public Integer getGripperTakeCapPos() { - return 55;// + return hpReader.getInteger("GripperTakeCapPos", 55); } + @HardwareServiceParam(name = "取试管位置", group = "Y轴位置") public Integer getGripperTakeTubeYPos() { - return 2735; + return hpReader.getInteger("GripperTakeTubeYPos", 2750); } + @HardwareServiceParam(name = "摇匀位置", group = "Y轴位置") public Integer getGripperShakeYPos() { - return 1828; + return hpReader.getInteger("GripperShakeYPos", 1828); } + @HardwareServiceParam(name = "待机位", group = "Y轴位置") public Integer getGripperZeroYPos() { - return 10; + return hpReader.getInteger("GripperZeroYPos", 10); } - // TakeTubeZ + + @HardwareServiceParam(name = "取高试管位置", group = "Z轴位置") public Integer getGripperTakeHTubeZPos() { - return 739; + return hpReader.getInteger("GripperTakeHTubeZPos", 739); } + @HardwareServiceParam(name = "取低试管位置", group = "Z轴位置") public Integer getGripperTakeSTubeZPos() { - return 985; + return hpReader.getInteger("GripperTakeSTubeZPos", 985); } //JudgeTubeCapZ + @HardwareServiceParam(name = "高试管帽有无判断位", group = "Z轴位置") public Integer getGripperJudgeHTubeCapZPos() { - return 591; + return hpReader.getInteger("GripperJudgeHTubeCapZPos", 591); } + @HardwareServiceParam(name = "低试管帽有无判断位", group = "Z轴位置") public Integer getGripperJudgeSTubeCapZPos() { - return 867; + return hpReader.getInteger("GripperJudgeSTubeCapZPos", 867); } //ShakeTubeZ + @HardwareServiceParam(name = "摇匀放置位置", group = "Z轴位置") public Integer getGripperShakeTubeZPos() { - return 835; + return hpReader.getInteger("GripperShakeTubeZPos", 835); } //TakeCapZ + @HardwareServiceParam(name = "取试管帽位", group = "Z轴位置") public Integer getGripperTakeCapZPos() { - return 835; + return hpReader.getInteger("GripperTakeCapZPos", 835); } + @HardwareServiceParam(name = "试管夹紧位", group = "试管夹紧模块") public Integer getShakeClampingPos() { - return 10; + return hpReader.getInteger("ShakeClampingPos", 10); } - // + @HardwareServiceParam(name = "摇匀臂", group = "试管摇匀待机位") public Integer getShakeModShakeMStandbyPos() { - return 90; + return hpReader.getInteger("ShakeModShakeMStandbyPos", 90); } @@ -122,11 +147,13 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { } } + @HardwareServiceAction(name = "模组停止") @Override public void modGroupStop() throws HardwareException { comHardwareOpear.forceStopAllMOtor(); } + @HardwareServiceAction(name = "模组归零") @Override public void modGroupMoveToZero() throws HardwareException, InterruptedException { // if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { @@ -152,6 +179,7 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { } + @HardwareServiceAction(name = "模组快速归零") @Override public void modGroupMoveToZeroQuick() throws HardwareException, InterruptedException { /* @@ -172,23 +200,13 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { modGroupMoveToZero(); } - Boolean IntEq(Integer pos1, Integer pos2, Integer diff) { - return Math.abs(pos1 - pos2) < diff; - } - - - void actionDelay() throws InterruptedException { - if (actionDelayTime != 0) - Thread.sleep(actionDelayTime); - } - /** * 取试管帽,如果试管帽存在, * @param tubeType HighBlood,ShortBlood,Mini,MiniBlood,BulletTube1P5,BulletTube0P5 - * @param actionDealyTime 为true时,为不带试管测试,且步骤之间有1s的动作延迟 */ - public AppRet takeTubeAndJudgeTubeExist(@RequestParam String tubeType) throws HardwareException, InterruptedException { + @HardwareServiceAction(name = "取试管") + public AppRet takeTubeAndJudgeTubeExist(A8kTubeType tubeType) throws HardwareException, InterruptedException { logger.info("takeTube tubeType:{}", tubeType); /* @@ -196,6 +214,10 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { * 1.当前摇匀模组设计到的电机是否都处于待机位 */ + if (tubeType != A8kTubeType.HighBlood && tubeType != A8kTubeType.ShortBlood) { + return AppRet.fail(A8kEcode.TubeTypeNotSupport); + } + //Z轴在原点 if (!canBus.stepMotorReadIoState(MId.ShakeModGripperZM, 0)) { throw new HardwareException(MId.ShakeModGripperZM, A8kEcode.MNotInZeroPos); @@ -216,7 +238,7 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { throw new HardwareException(MId.ShakeModClampingM, A8kEcode.MNotInZeroPos); } - boolean isHighBlood = A8kTubeType.HighBlood.equals(A8kTubeType.valueOf(tubeType)); + boolean isHighBlood = A8kTubeType.HighBlood.equals(tubeType); boolean tubeCapExist = true; Integer gripperJudgeCapZPos = isHighBlood ? getGripperJudgeHTubeCapZPos() : getGripperJudgeSTubeCapZPos(); Integer gripperTakeTubeZPos = isHighBlood ? getGripperTakeHTubeZPos() : getGripperTakeSTubeZPos(); @@ -263,7 +285,7 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { //闭合夹爪检测试管帽是否存在 logger.info("闭合夹爪检测试管帽是否存在"); canBus.miniServoRotateWithTorque(MId.ShakeModGripperSV, -400); - Thread.sleep(1000); + Thread.sleep(getCapJudgeDelayTime()); if (IntEq(canBus.miniServoReadPos(MId.ShakeModGripperSV), getGripperClosePos(), 30)) { logger.info("试管帽不存在"); tubeCapExist = false; @@ -351,7 +373,8 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { } - public void shakeTube(@RequestParam Integer shakeDegree, @RequestParam Integer times) throws HardwareException, InterruptedException { + @HardwareServiceAction(name = "摇匀") + public void shakeTube(Integer shakeDegree, Integer times) throws HardwareException, InterruptedException { var standByPos = getShakeModShakeMStandbyPos(); var startPos = standByPos - shakeDegree; var endPos = standByPos + shakeDegree; @@ -359,6 +382,7 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { canBus.waitForMod(MId.ShakeModShakeM, getActionOvertime()); } + @HardwareServiceAction(name = "取试管帽") public void takeTubeCap() throws HardwareException, InterruptedException { //Y移动到取试管帽位置 logger.info("Y移动到取试管帽位置 && 打开夹爪"); @@ -389,11 +413,11 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { canBus.waitForMods(new MId[]{MId.ShakeModGripperYSV}, getActionOvertime()); } - /** * 盖试管帽,并将试管移动回试管架中 */ - public void pushBackTubeCapAndTakeBakTube(String tubeType) throws HardwareException, InterruptedException { + @HardwareServiceAction(name = "盖试管帽并放回试管架") + public void pushBackTubeCapAndTakeBakTube(A8kTubeType tubeType) throws HardwareException, InterruptedException { //移动Y轴到取试管帽位置 logger.info("移动Y轴到取试管帽位置"); canBus.miniServoMoveTo(MId.ShakeModGripperYSV, getGripperShakeYPos()); @@ -444,29 +468,15 @@ public class SamplesPreProcessModuleCtrlService implements HardwareCtrlModule { } - - /** - * 打开气溶胶风扇 - */ - public void openAerosolFan() throws HardwareException { - // var params = this.paramDao; - // this.canBus.callcmd(MId.WbTubeFanMod.toInt(), CmdId.fan_controler_set_speed.toInt(), params.getAerosolFanLevel()); - } - /** - * 关闭气溶胶风扇 + * 气溶胶风扇控制 */ - public void closeAerosolFan() throws HardwareException { - // this.canBus.callcmd(MId.WbTubeFanMod.toInt(), CmdId.fan_controler_set_speed.toInt(), 0); - } - - @HardwareServiceStatus(name = "A") - public Integer getAerosolFanLevel() { - return 123; - } - - @HardwareServiceStatus(name = "B") - public Boolean getBool() { - return true; + @HardwareServiceAction(name = "气溶胶风扇控制") + public void setAeroslFanPower(Boolean enable) throws HardwareException, InterruptedException { + if (enable) { + canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 99); + } else { + canBus.fanControlerSetSpeed(MId.WbTubeFanMod, 0); + } } } diff --git a/src/main/java/a8k/utils/HardwareParamReader.java b/src/main/java/a8k/utils/HardwareParamReader.java new file mode 100644 index 0000000..eb653c6 --- /dev/null +++ b/src/main/java/a8k/utils/HardwareParamReader.java @@ -0,0 +1,19 @@ +package a8k.utils; + +import a8k.service.db.entity.HardwareServiceSetting; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class HardwareParamReader { + String serviceName; + + public HardwareParamReader(Class cla) { + this.serviceName = cla.getName(); + } + + public Integer getInteger(String key, Integer defaultValue) { + return HardwareServiceSetting.getInteger(serviceName, key, defaultValue); + } +} diff --git a/src/main/resources/db/migration/V100_1__create_table_HardwareServiceSettingTable.sql b/src/main/resources/db/migration/V100_1__create_table_HardwareServiceSettingTable.sql new file mode 100644 index 0000000..dd27424 --- /dev/null +++ b/src/main/resources/db/migration/V100_1__create_table_HardwareServiceSettingTable.sql @@ -0,0 +1,8 @@ +CREATE TABLE "HardwareServiceSettingTable" ( + "id" text NOT NULL, + "key" text, + "serviceName" text, + "valType" text, + "val" text, + PRIMARY KEY ("id") +); \ No newline at end of file