From 7b0074aeae467db03a1f24e120faa7e15e7d472b Mon Sep 17 00:00:00 2001 From: sige Date: Wed, 29 May 2024 15:32:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E6=B6=B2=E5=90=8C=E6=97=B6=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../deviceinstance/LiquidAdditionInstance.java | 49 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java index da76b65..42de08e 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java @@ -13,6 +13,11 @@ import java.util.List; import java.util.Map; @Component public class LiquidAdditionInstance { + // finish callback + public interface ExecuteCallback { + void callback(); + } + // list of liquids private List liquids; // lock for bucket empty @@ -93,12 +98,14 @@ public class LiquidAdditionInstance { Boolean hasGoutTin = this.checkTubeExists("GOUT", batchIndex, "TIN", tubes); if ( hasGoutTout || hasGoutTin ) { UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.Out." + batchIndex); + var pumpExecOut = new ArrayList(); if ( hasGoutTout ) { - this.pump(pumpGroupOutIndex, volume); + pumpExecOut.add(() -> this.pump(pumpGroupOutIndex, volume)); } if ( hasGoutTin ) { - this.pump(pumpGroupInIndex, volume); + pumpExecOut.add(() -> this.pump(pumpGroupInIndex, volume)); } + this.pumpGroupExecute(pumpExecOut); } // 内圈 @@ -106,27 +113,55 @@ public class LiquidAdditionInstance { Boolean hasGinTin = this.checkTubeExists("GIN", batchIndex, "TIN", tubes); if ( hasGinTout || hasGinTin ) { UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.In." + batchIndex); + var pumpExecIn = new ArrayList(); if ( hasGinTout ) { - this.pump(pumpGroupOutIndex, volume); + pumpExecIn.add(() -> this.pump(pumpGroupOutIndex, volume)); } if ( hasGinTin ) { - this.pump(pumpGroupInIndex, volume); + pumpExecIn.add(() -> this.pump(pumpGroupInIndex, volume)); } + this.pumpGroupExecute(pumpExecIn); } } UfCmdSnippetExecutor.execute("LiquidAdditionReset"); } + // pump group execute + private void pumpGroupExecute( List actions ) { + List threads = new ArrayList<>(); + for (ExecuteCallback action : actions) { + Thread thread = new Thread(action::callback); + threads.add(thread); + thread.start(); + } + + for (Thread thread : threads) { + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + // add liquid to tubes by given pump indexes private void pump( Integer pumpIndex, Integer volume ) { var liquid = liquids.get((0==pumpIndex%2) ? pumpIndex/2 : (pumpIndex-1)/2); var type = liquid.type; - var snippetKey = "LiquidAdditionPump." + pumpIndex; + var rotateDistance = this.convertVolumeToPumpRotationDistance(type, volume); - Map snippetParams = Map.of("volume", rotateDistance); - UfCmdSnippetExecutor.execute(snippetKey, snippetParams); + String pumpKey = String.format("LiquidPeristalticPump_%d_%d", pumpIndex/2, pumpIndex%2); + UfActuatorCmdExecutor.execute(pumpKey,"motor_easy_move_by_nb", rotateDistance.toString()); + do { + String status = UfActuatorCmdExecutor.execute(pumpKey, "module_get_status"); + if ( "0".equals(status) ) { + break ; + } + UfCommon.delay(100); + } while( true ); + UfActuatorCmdExecutor.execute(pumpKey, "motor_easy_move_by", "-500"); // update liquid volume liquid.setVolumeByConsumed(volume);