From 37a64d6c402916f111f40035a1b51ac3d6c32ffc Mon Sep 17 00:00:00 2001 From: sige Date: Sat, 29 Jun 2024 16:16:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=B5=E8=82=B2=E7=9B=98=E6=B8=A9=E5=BA=A6?= =?UTF-8?q?=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.db | Bin 405504 -> 405504 bytes .../java/com/iflytop/a800/device/Incubator.java | 102 ++++++++++++++++++++- .../java/com/iflytop/a800/task/TubeTestTask.java | 3 + 3 files changed, 104 insertions(+), 1 deletion(-) diff --git a/app.db b/app.db index 2a0951e886a9a6aeb5ea086969466aa1db3878bb..8930bb78ad5ee233a755cc00e2a5755944ad798c 100644 GIT binary patch delta 4579 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 TPj4&=%$!s=mX+#8B^vw>EI`?- delta 1428 zcmaJ=e@q-j6rQ)cw|jfLJF|CJfg%Jvz!rsr`%#Xbg4k*sxTr;Gj5b8pziD=kfVQJBcCgZ7G(+tW%I*I7>4GpMt3r{yXqy+bMektpC|0A z@@zAb>y6${Pk1@!&%p&~>%CA2!GEVUi&KAHjt!w4Tzw91Z4S;?dkfjW>}a{p=F4?B zU*HzqWwOEBk^NRZ*W8Y^$Xo^T<*JY`SBZQ}HFErSi}Y+YtQ7GSnyGeD!wW$vo=B1i z+(}2gP$yc}5>X#d;12}1M%NnEMzpTJ zI%tFfAx_x5%1KAP;IqdQVGuSiY0*+I*dV+ZgQ_*qXsc(Poirb-ffJi}7k7$E18{*u zfs|9P5#%4a?^tVo3@HP?r`aKhq~csAH6T1-UK)flCCna%8%^=HeZmU-zV?RJs=lta zIvVBQW!*k0^0w2GhHr3Pq!&$zM^P6WAvW-N@yen;9)X9M(P_Hp`C%|GE$~Od-1!z9 z2Rc6tzsh(7J(Upiw{N7!7Wm?!x4}gxv%EzAyvdi?8ELnkrP)H+2J_+}c#{`H6=Hs* zg8s1=is+f^d|u`1Jr9*j`4tuLN@R!eY3OE7H_;V~?nwUM_R^U-ewVp_6na3w zKOuYS9ta8K2r6R$?QrW`RJ~=)H zLPy~v=xbyvmY&w0mk&7_aD(&%w@=~4arN9m4>u^-ipAK854brM4%1PMi==*QuM+S{ zR7pEZxN@@rbEn>0#T0d=gCn1j-MEu@@FXtRu4?aUTQsbmQTx>f<(hI>=}0^Es}4cA zh8|_%TWH4ww_a?C+1(qR^sfo70^+nd!<9-X(rI@$J88iLcQ^AjO>lRajT!EASz7pZ zzGP^c6OIUcttsfRKul=j`BIA@rmhQ8?HyJ!VTMKqt7X slots; // 槽位起始索引 private Integer slotStartIndex = 0; + // 目标温度 + public Integer destTemperature = null; + // 是否正在加热 + private Boolean isHeatingOn = false; // 构造函数 public Incubator() { + this.destTemperature = null; + this.isHeatingOn = false; this.slotStartIndex = 0; this.slots = new ArrayList<>(); for ( int i = 0; i < 20; i++ ) { @@ -24,6 +35,83 @@ public class Incubator extends DeviceComponent { } } + // 获取当前温度 + public Double getCurrentTemperature() { + String incubatorTempStr = UfActuatorCmdExecutor.execute("IncubatorTempCtrl", "read_temperature"); + int intTemp = Integer.parseInt(incubatorTempStr); + return (Double)(intTemp / 10.0); + } + + // 等待温度到达指定温度 + public void waitForTemperature( Integer temp ) { + if ( 0 == temp ) { + return ; + } + + this.heatingStart(); + + int destTemp = temp * 10; + int pmValue = UfMdbOption.getInteger("IncubatorTemperaturePmValue", 0); + do { + int curTemp = (int)(this.getCurrentTemperature() * 10); + if ( curTemp - pmValue < destTemp && destTemp < curTemp + pmValue ) { + break; + } + UfCommon.delay(1000); + } while ( true ); + } + + // 加热 + public void heatingStart() { + if ( this.isHeatingOn ) { + return ; + } + + String temp = this.destTemperature.toString(); + UfActuatorCmdExecutor.execute("IncubatorTempCtrl", "temp_controler_start_hearting", temp); + this.isHeatingOn = true; + } + + // 停止加热 + public void heatingStop() { + if ( !this.isHeatingOn ) { + return ; + } + UfActuatorCmdExecutor.execute("IncubatorTempCtrl", "temp_controler_stop_hearting"); + this.isHeatingOn = false; + } + + // 通过运行时变量清理测试卡 + public void cleanupByRuntimeVariableSlotStatus() { + var scanner = Device.getInstance().scanner; + var listString = UfMdbRuntimeVariable.getString("IncubatorSlotCardStatus", "[]"); + var listJson = UfJsonHelper.jsonToNode(listString); + for (JsonNode item : listJson) { + int index = item.get("index").asInt(); + boolean hasCard = item.get("hasCard").asBoolean(); + if ( !hasCard ) { + continue; + } + + var slot = new IncubatorSlot(); + slot.index = index; + this.exitCardToScanner(slot); + scanner.dropCard(); + } + } + + // 刷新运行时变量状态 + private void refreshRuntimeVariableSlotStatus() { + List> status = new ArrayList<>(); + for ( int i = 0; i < 20; i++ ) { + var slot = this.slots.get(i); + status.add(Map.of("index", i, "hasCard", null != slot.card)); + } + + var list = UfJsonHelper.objectToJson(status); + UfMdbRuntimeVariable.setString("IncubatorSlotCardStatus", list); + } + // 移动至提交位置 public void moveToCommitPos( IncubatorSlot slot ) { Integer commitStartPos = UfMdbOption.getInteger("IncubatorSlotCommitStartPos"); @@ -50,6 +138,9 @@ public class Incubator extends DeviceComponent { throw new RuntimeException("无可用孵育盘槽位"); } + slot.card = card; + this.refreshRuntimeVariableSlotStatus(); + Integer boxPos = UfMdbOption.getInteger(String.format("TestCardWarehouseBox.%d", card.boxIndex)); Integer slotStartPos = UfMdbOption.getInteger("IncubatorSlotStartPos"); Integer slotDistance = UfMdbOption.getInteger("IncubatorSlotDistance"); @@ -64,7 +155,6 @@ public class Incubator extends DeviceComponent { "commit", commitPos ); UfCmdSnippetExecutor.execute("IncubatorTestCardPushIn", params); - slot.card = card; this.unlock(lock); return slot; @@ -78,5 +168,15 @@ public class Incubator extends DeviceComponent { Map params = Map.of("slot", slotPos); UfCmdSnippetExecutor.execute("IncubatorTestCardExitToScanner", params); slot.card = null; + this.refreshRuntimeVariableSlotStatus(); + + // 当所有测试卡退出后, 关掉加热 + boolean hasTestCard = false; + for ( var tmpSlot : this.slots ) { + hasTestCard = hasTestCard || tmpSlot.card != null; + } + if ( !hasTestCard ) { + this.heatingStop(); + } } } diff --git a/src/main/java/com/iflytop/a800/task/TubeTestTask.java b/src/main/java/com/iflytop/a800/task/TubeTestTask.java index c0a7458..9e718f9 100644 --- a/src/main/java/com/iflytop/a800/task/TubeTestTask.java +++ b/src/main/java/com/iflytop/a800/task/TubeTestTask.java @@ -83,6 +83,9 @@ public class TubeTestTask extends TaskBase { this.test.isSamplingFinished = "no"; this.test.save(); + // 等待孵育盘温度 + device.incubator.waitForTemperature(this.project.temperature); + // 移动试管架 if ( !UfMdbDictItem.match("TUBE_TYPE", "EMERGENCY", this.tube.type) ) { Integer testStartPos = UfMdbOption.getInteger("TubeRackTubeTestStartPos");