From 7ec5a16114a5a57770d5acd3733ffbcbe7232f79 Mon Sep 17 00:00:00 2001 From: sige Date: Mon, 8 Apr 2024 14:12:13 +0800 Subject: [PATCH] 1 --- app.db | Bin 176128 -> 176128 bytes pom.xml | 5 + .../digester/DigestionTaskTheadManager.java | 117 +++++++++++++++++- .../com/iflytop/digester/DigestionTaskThread.java | 131 +++++++++++++++++---- .../deviceinstance/HeatingTurntableSlot.java | 42 ++++++- .../deviceinstance/HeatingTurntableSlotTube.java | 7 ++ .../deviceinstance/LiquidAdditionInstance.java | 76 ++++++------ .../deviceinstance/TransferRobotArmInstance.java | 65 ++++++++-- .../iflytop/digester/model/MdbDigestionTask.java | 31 +++++ .../underframework/UfActuatorCmdExecutor.java | 7 ++ .../underframework/UfCmdSnippetExecutor.java | 56 ++++++++- .../connection/UfZcancmderWebsocket.java | 14 +-- .../underframework/dao/model/TsMdbActuatorCmd.java | 30 ----- .../underframework/dao/model/TsMdbSnippet.java | 22 ---- .../underframework/dao/model/UfMdbActuatorCmd.java | 30 +++++ .../underframework/dao/model/UfMdbSnippet.java | 22 ++++ .../web/api/TsApiActuatorCommand.java | 10 +- .../underframework/web/api/TsApiSnippet.java | 12 +- src/main/resources/application.yml | 11 +- web | 2 +- 20 files changed, 540 insertions(+), 150 deletions(-) create mode 100644 src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlotTube.java create mode 100644 src/main/java/com/iflytop/digester/underframework/UfActuatorCmdExecutor.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbActuatorCmd.java delete mode 100644 src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java create mode 100644 src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbActuatorCmd.java create mode 100644 src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java diff --git a/app.db b/app.db index 03bb6b750a30902950ad9d57aabd7fbd7d29fa3b..fe9d44e4fc098c2e59b5e1449a67550bfb30eac2 100644 GIT binary patch literal 176128 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 IzXk;UKYBIB%K!iX delta 632 zcmXZYUr19?90%}o?#{Nm-E)4wo4S_MwLPRX6cH6ti!mWV2x-`(4m1jT=s_WR5n>|q zAtK%G!@!4XCis*~PB4XDN+<P$7^&mm z8DniEK%(SBzP+o1Ry!U)RpvXUj86>Lth5ylYy@Ua=HK#-`=VZt*!IxYzi<6nzhMlf zov-FiyLGPjwm;n6&F909Chk7G?+m=Ccg~D@-lA>K6nEDAA-ye*Jt8>D_VT42XEyLn z$OwC%FKzg)_4~rNTAZqA)_vAzvC89oypR^A0ab<%psFvVK7y`3>EoGZ8r4G*H{DyAXfj?3P}HuO(_=0m!a@<^M%Q}j zIj>YFj4nt8-CZlk;KJava-WebSocket 1.5.4 + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.2.5 + diff --git a/src/main/java/com/iflytop/digester/DigestionTaskTheadManager.java b/src/main/java/com/iflytop/digester/DigestionTaskTheadManager.java index c8f2b84..5b72641 100644 --- a/src/main/java/com/iflytop/digester/DigestionTaskTheadManager.java +++ b/src/main/java/com/iflytop/digester/DigestionTaskTheadManager.java @@ -1,16 +1,40 @@ package com.iflytop.digester; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iflytop.digester.deviceinstance.HeatingTurntableSlotTube; import com.iflytop.digester.model.MdbDigestionTask; import jakarta.annotation.PostConstruct; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; - import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; + @Component public class DigestionTaskTheadManager { // Singleton instance private static DigestionTaskTheadManager instance = null; // Task list private List tasks; + // Mqtt client + private MqttClient client; + + @Value("${mqtt-broker.uri}") + private String mqttBrokerUri; + @Value("${mqtt-broker.username}") + private String mqttBrokerUsername; + @Value("${mqtt-broker.password}") + private String mqttBrokerPassword; + @Value("${mqtt-broker.clientId}") + private String mqttBrokerClientId; + @Value("${mqtt-broker.my-topic}") + private String mqttBrokerMyTopic; + @Value("${mqtt-broker.transbot-topic}") + private String mqttBrokerTransbotTopic; // Get instance public static DigestionTaskTheadManager getInstance() { @@ -21,12 +45,101 @@ public class DigestionTaskTheadManager { public void init() { this.tasks = new ArrayList<>(); instance = this; + this.setupMqttBroker(); + } + + // setup mqtt broker + private void setupMqttBroker() { + this.client = null; + try { + this.client = new MqttClient(this.mqttBrokerUri, this.mqttBrokerClientId, new MemoryPersistence()); + } catch (MqttException e) { + throw new RuntimeException(e); + } + this.client.setCallback(new MqttCallback() { + public void connectionLost(Throwable cause) { + System.out.println("connectionLost: " + cause.getMessage()); + } + public void messageArrived(String topic, MqttMessage message) { + DigestionTaskTheadManager.this.handleOnMessageArrived(topic, message); + } + public void deliveryComplete(IMqttDeliveryToken token) { + System.out.println("deliveryComplete---------" + token.isComplete()); + } + }); + try { + MqttConnectOptions options = new MqttConnectOptions(); + options.setUserName(this.mqttBrokerUsername); + options.setPassword(this.mqttBrokerPassword.toCharArray()); + client.connect(options); + } catch (MqttException e) { + throw new RuntimeException(e); + } + + try { + client.subscribe(this.mqttBrokerMyTopic, 2); + } catch (MqttException e) { + throw new RuntimeException(e); + } + } + + // Handle on message arrived + private void handleOnMessageArrived(String topic, MqttMessage message) { + String content = new String(message.getPayload()); + JsonNode actionJsonTree = null; + try { + ObjectMapper jsonMapper = new ObjectMapper(); + actionJsonTree = jsonMapper.readTree(content); + } catch (JsonProcessingException e) { + // ignore invalid message + } + + assert actionJsonTree != null; + String taskId = actionJsonTree.get("taskId").asText(); + String actionName = actionJsonTree.get("action").asText(); + Map actionParams = new HashMap<>(); + if ( actionJsonTree.has("params") ) { + var paramsJsonTree = actionJsonTree.get("params"); + for ( JsonNode paramNode : paramsJsonTree ) { + actionParams.put(paramNode.get("key").asText(), paramNode.get("value").asText()); + } + } + + DigestionTaskThread task = null; + for ( var t : this.tasks ) { + if ( t.getTaskId().equals(taskId) ) { + task = t; + break; + } + } + if ( null == task ) { + // ignore invalid task + return ; + } + task.executeAction(actionName, actionParams); + } + + // Send message to trans bot + public void sendMessageToTransBot(String message) { + try { + MqttMessage mqttMessage = new MqttMessage(message.getBytes()); + mqttMessage.setQos(2); + this.client.publish(this.mqttBrokerTransbotTopic, mqttMessage); + } catch (MqttException e) { + throw new RuntimeException(e); + } } // Start task public void startTask( MdbDigestionTask taskModel ) { var task = new DigestionTaskThread(taskModel); - tasks.add(task); + task.setFinishCallback(this::handleOnTaskFinished); + this.tasks.add(task); task.start(); } + + // Handle task finished + private void handleOnTaskFinished( DigestionTaskThread task ) { + this.tasks.remove(task); + } } diff --git a/src/main/java/com/iflytop/digester/DigestionTaskThread.java b/src/main/java/com/iflytop/digester/DigestionTaskThread.java index c0d8a3d..eec3710 100644 --- a/src/main/java/com/iflytop/digester/DigestionTaskThread.java +++ b/src/main/java/com/iflytop/digester/DigestionTaskThread.java @@ -8,7 +8,14 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.List; +import java.util.Map; + public class DigestionTaskThread extends Thread { + // 任务完成回调 + public interface FinishCallback { + void callback( DigestionTaskThread task ); + } + // logger public static final Logger LOG = LoggerFactory.getLogger(DigestionTaskThread.class); // 消解任务Model @@ -19,6 +26,14 @@ public class DigestionTaskThread extends Thread { private HeatingTurntableSlot heatingSlot; // 异常试管索引列表 private List errorTubeIndexes; + // 任务完成回调 + private FinishCallback finishCallback; + // 试管架放入等待锁 + private final Object tubeRackPutInWaitLock = new Object(); + // 试管架取出等待锁 + private final Object tubeRackTakeOutWaitLock = new Object(); + // 异常处理线程 + private Thread errorProcessThread; // 消解任务 public DigestionTaskThread(MdbDigestionTask taskModel) { @@ -26,6 +41,29 @@ public class DigestionTaskThread extends Thread { this.solution = UfActiveRecord.findOne(MdbDigestionSolution.class, taskModel.digestionId); } + // 设置任务完成回调 + public void setFinishCallback(FinishCallback finishCallback) { + this.finishCallback = finishCallback; + } + + // 获取任务ID + public String getTaskId() { + return this.taskModel.taskId; + } + + // 执行动作 + public void executeAction(String name, Map params) { + if ( "TubeRackPutInDone".equals(name) ) { + synchronized ( this.tubeRackPutInWaitLock ) { + this.tubeRackPutInWaitLock.notifyAll(); + } + } else if ( "TubeRackTakeOutDone".equals(name) ) { + synchronized ( this.tubeRackTakeOutWaitLock ) { + this.tubeRackTakeOutWaitLock.notifyAll(); + } + } + } + @Override public void run() { try { @@ -44,30 +82,27 @@ public class DigestionTaskThread extends Thread { this.executeRound(lastRound); // 检查试管 this.tubeCheck(); - - // 异常处理执行 - var errorRound = this.solution.getErrorRounds(); - for ( int i=0; i { + try { + // 异常处理执行 + var errorRound = this.solution.getErrorRounds(); + for ( int i=0; i tubeExistsMap = new ArrayList<>(); + public String heatingStatus = "off"; // off:未加热 on:加热中 + // 试管列表 + public List tubes = new ArrayList<>(); + + // Constructor + public HeatingTurntableSlot() { + for (int i = 0; i < 16; i++) { + tubes.add(null); + } + } // 设置试管架编号 public void setTubeRackNo( String tubeRackNo ) { this.tubeRackNo = tubeRackNo; } + // 设置试管 + public void setTubes( List tubes ) { + for (int i = 0; i < tubes.size(); i++) { + this.tubes.set(i, tubes.get(i)); + } + } + // 获取非空试管索引列表 public List getExistTubeIndexes() { List indexes = new ArrayList<>(); - for (int i = 0; i < tubeExistsMap.size(); i++) { - if (tubeExistsMap.get(i)) { + for (int i = 0; i < tubes.size(); i++) { + if ( null != tubes.get(i) ) { indexes.add(i); } } return indexes; } + // 执行加热 public void heating( Integer temperature, Integer duration ) { - // 执行加热 + this.destTemperature = temperature; + this.heatingDuration = duration; + this.heatingStatus = "on"; + + var snippetName = "HeatingTurntableSlotHeating.Start." + this.index; + Map snippetParams = Map.of("temperature", temperature, "duration", duration); + UfCmdSnippetExecutor.execute(snippetName, snippetParams); + + // 加热完成 + this.destTemperature = 0; + this.heatingDuration = 0; + this.heatingStatus = "off"; } } diff --git a/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlotTube.java b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlotTube.java new file mode 100644 index 0000000..55dad04 --- /dev/null +++ b/src/main/java/com/iflytop/digester/deviceinstance/HeatingTurntableSlotTube.java @@ -0,0 +1,7 @@ +package com.iflytop.digester.deviceinstance; +public class HeatingTurntableSlotTube { + // tube index + public Integer index = -1; + // tube no + public String no = ""; +} diff --git a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java index 81fb89d..cdfe016 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/LiquidAdditionInstance.java @@ -5,7 +5,6 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Map; - @Component public class LiquidAdditionInstance { // list of liquids @@ -27,43 +26,58 @@ public class LiquidAdditionInstance { // 针对试管加液 public void addLiquidToTubes(List tubes, String type, int volume ) { - var outerIndexes = List.of(0,4, 3,2, 15,11, 12,13); - var innerIndexes = List.of(1,5, 6,7, 14,10, 9,8); var pumpIndexes = this.getPumpIndexForGroupOutAndIn(type); var pumpGroupOutIndex = pumpIndexes.get(0); var pumpGroupInIndex = pumpIndexes.get(1); - - for ( int i=0; i<4; i++ ) { - // @TODO: 这里要计算坐标, 但是还没想好, 等一下 ~~~ - + for ( int batchIndex=0; batchIndex<4; batchIndex++ ) { // 外圈加液 - UfCmdSnippetExecutor.execute("LiquidAdditionGroupOutPrepare"); - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupOutIndex, - Map.of("volume", volume) - ); - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupInIndex, - Map.of("volume", volume) - ); + UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.Out." + batchIndex); + if ( this.checkTubeExists("GOUT", batchIndex, "TOUT", tubes) ) { // 外圈,外侧试管加液 + UfCmdSnippetExecutor.execute( + "LiquidAdditionPump" + pumpGroupOutIndex, + Map.of("volume", volume) + ); + } + if ( this.checkTubeExists("GOUT", batchIndex, "TIN", tubes) ) { // 外圈,内侧试管加液 + UfCmdSnippetExecutor.execute( + "LiquidAdditionPump" + pumpGroupInIndex, + Map.of("volume", volume) + ); + } // 内圈加液 - UfCmdSnippetExecutor.execute("LiquidAdditionGroupInPrepare"); - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupOutIndex, - Map.of("volume", volume) - ); - UfCmdSnippetExecutor.execute( - "LiquidAdditionPump" + pumpGroupInIndex, - Map.of("volume", volume) - ); + UfCmdSnippetExecutor.execute("LiquidAdditionPrepare.In." + batchIndex); + if ( this.checkTubeExists("GIN", batchIndex, "TOUT", tubes) ) { // 内圈,外侧试管加液 + UfCmdSnippetExecutor.execute( + "LiquidAdditionPump" + pumpGroupOutIndex, + Map.of("volume", volume) + ); + } + if ( this.checkTubeExists("GIN", batchIndex, "TIN", tubes) ) { // 内圈,内侧试管加液 + UfCmdSnippetExecutor.execute( + "LiquidAdditionPump" + pumpGroupInIndex, + Map.of("volume", volume) + ); + } } // 加液复位 UfCmdSnippetExecutor.execute("LiquidAdditionReset"); } + // 检查试管是否存在 + private Boolean checkTubeExists(String groupType, Integer batchIndex, String slotType, List tubes) { + var slotIndexes = Map.of( + "GIN", List.of(1,5, 6,7, 14,10, 9,8), + "GOUT", List.of(0,4, 3,2, 15,11, 12,13) + ); + var groupSlotIndexes = slotIndexes.get(groupType); + var batchSlotIndexes = groupSlotIndexes.subList(batchIndex*2, batchIndex*2+2); + var slotIndexesToCheck = batchSlotIndexes.get("TOUT".equals(slotType) ? 0 : 1); + return tubes.contains(slotIndexesToCheck); + } + // 获取蠕动泵索引 private List getPumpIndexForGroupOutAndIn( String type ) { for ( int i=0; i<8; i++ ) { @@ -73,16 +87,4 @@ public class LiquidAdditionInstance { } throw new RuntimeException("未找到对应的液体类型"); } - - - //当前有几种酸 - //各种酸目前的状态,是否缺液 - //指挥加酸机械臂运动 ,实际上调用的是 片段 - - - - //调用蠕动泵加酸,实际上调用的是 片段 - - - } diff --git a/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java b/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java index b09d6ad..63e5bda 100644 --- a/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java +++ b/src/main/java/com/iflytop/digester/deviceinstance/TransferRobotArmInstance.java @@ -1,35 +1,86 @@ package com.iflytop.digester.deviceinstance; +import com.iflytop.digester.underframework.UfCmdSnippetExecutor; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; @Component public class TransferRobotArmInstance { - + // 等待锁队列 private final List waitingLocks = new ArrayList<>(); + // 移动试管到试管架 public void takeOutTubesFromErrorSlot(List tubeIndexes) { + var lock = new Object(); + this.lockArm(lock); + // 执行从异常槽位取出试管 + UfCmdSnippetExecutor.execute("TubeTakeOutFromErrorSlotStart"); + for (Integer tubeIndex : tubeIndexes) { + UfCmdSnippetExecutor.execute("TubeTakeOutFromErrorSlot." + tubeIndex); + } + UfCmdSnippetExecutor.execute("TubeTakeOutFromErrorSlotEnd"); + + this.unlockArm(lock); } + // 移动试管到异常槽位 public void moveTubesToErrorSlot(List tubeIndexes) { + var lock = new Object(); + this.lockArm(lock); + // 执行移动试管到异常槽位 + UfCmdSnippetExecutor.execute("TubeMoveToErrorSlotStart"); + for (Integer tubeIndex : tubeIndexes) { + UfCmdSnippetExecutor.execute("TubeMoveToErrorSlot." + tubeIndex); + } + UfCmdSnippetExecutor.execute("TubeMoveToErrorSlotEnd"); + + this.unlockArm(lock); } + // 移动试管架到加液盘 public void moveTubeRackToLiquidPlate(Integer srcSlotIndex) { - // 执行移动试管架到液体盘 + var lock = new Object(); + this.lockArm(lock); + + // 执行移动试管架到加液盘 + var snippetName = "TubeRackMoveToLiquidPlate." + srcSlotIndex; + UfCmdSnippetExecutor.execute(snippetName); + + this.unlockArm(lock); } + // 移动试管架到加热转盘 public void moveTubeRackToHeatingTurntable(Integer slot) throws InterruptedException { - if ( !waitingLocks.isEmpty() ) { - var lock = new Object(); + var lock = new Object(); + this.lockArm(lock); + + // 执行移动试管架到加热转盘 + UfCmdSnippetExecutor.execute("TubeRackMoveToHeatingTurntable." + slot); + + this.unlockArm(lock); + } + + // wait for arm + private void lockArm( Object lock ) { + if ( waitingLocks.isEmpty() ) { + this.waitingLocks.add(lock); + return ; + } + + try { waitingLocks.add(lock); lock.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); } + } - // 执行移动试管架到加热转盘 - + // unlock arm + private void unlockArm( Object lock ) { + waitingLocks.remove(lock); if ( !waitingLocks.isEmpty() ) { - waitingLocks.remove(0).notify(); + waitingLocks.get(0).notify(); } } } diff --git a/src/main/java/com/iflytop/digester/model/MdbDigestionTask.java b/src/main/java/com/iflytop/digester/model/MdbDigestionTask.java index bb8d4b2..aca7ca4 100644 --- a/src/main/java/com/iflytop/digester/model/MdbDigestionTask.java +++ b/src/main/java/com/iflytop/digester/model/MdbDigestionTask.java @@ -1,6 +1,12 @@ package com.iflytop.digester.model; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iflytop.digester.deviceinstance.HeatingTurntableSlotTube; import com.iflytop.digester.underframework.dao.record.UfActiveRecord; import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; +import java.util.ArrayList; +import java.util.List; public class MdbDigestionTask extends UfActiveRecord { @UfActiveRecordField public String digestionId; @@ -29,8 +35,33 @@ public class MdbDigestionTask extends UfActiveRecord { @UfActiveRecordField public Integer finishedAt = 0; + @UfActiveRecordField + public Integer heatingSlotIndex = -1; + // get table name public static String getTableName() { return "app_digestion_tasks"; } + + // get tubes + public List getTubes() { + List list = new ArrayList<>(); + + ObjectMapper jsonMapper = new ObjectMapper(); + JsonNode tubesJsonTree = null; + try { + tubesJsonTree = jsonMapper.readTree(this.tubes); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + var indexCounter = 0; + for ( JsonNode tubeNode : tubesJsonTree ) { + var tube = new HeatingTurntableSlotTube(); + tube.index = indexCounter++; + tube.no = tubeNode.get("no").asText(); + list.add(tube); + } + return list; + } } diff --git a/src/main/java/com/iflytop/digester/underframework/UfActuatorCmdExecutor.java b/src/main/java/com/iflytop/digester/underframework/UfActuatorCmdExecutor.java new file mode 100644 index 0000000..0a283c8 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/UfActuatorCmdExecutor.java @@ -0,0 +1,7 @@ +package com.iflytop.digester.underframework; +import com.iflytop.digester.underframework.dao.model.UfMdbActuatorCmd; +public class UfActuatorCmdExecutor { + public static void execute(UfMdbActuatorCmd cmd) { + // @TODO : 这里要判断使用那种通讯方式进行执行, 所以待定一下 + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java b/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java index ef0d40b..1bf415f 100644 --- a/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java +++ b/src/main/java/com/iflytop/digester/underframework/UfCmdSnippetExecutor.java @@ -1,12 +1,30 @@ package com.iflytop.digester.underframework; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.iflytop.digester.deviceinstance.HeatingTurntableSlotTube; +import com.iflytop.digester.underframework.dao.model.UfMdbActuatorCmd; +import com.iflytop.digester.underframework.dao.model.UfMdbSnippet; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.util.UfJsonHelper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import java.util.HashMap; import java.util.Map; public class UfCmdSnippetExecutor { + // logger + public static final Logger LOG = LoggerFactory.getLogger(UfCmdSnippetExecutor.class); + // snippet + private final UfMdbSnippet snippet; + // params + private final Map params; + /** * execute snippet * @param snippetName - snippet name */ static public void execute(String snippetName) { - + UfCmdSnippetExecutor.execute(snippetName, new HashMap<>()); } /** @@ -15,6 +33,42 @@ public class UfCmdSnippetExecutor { * @param params - params */ static public void execute(String snippetName, Map params) { + LOG.info("[Snippet Execute] : {} ({})", snippetName, UfJsonHelper.objectToJson(params)); + +// var snippet = UfActiveRecord.findOne(UfMdbSnippet.class, Map.of("key", snippetName)); +// if (null == snippet) { +// throw new RuntimeException("无效的片段名称 : " + snippetName); +// } +// +// var executor = new UfCmdSnippetExecutor(snippet, params); +// executor.run(); + } + + // constructor + public UfCmdSnippetExecutor( UfMdbSnippet snippet, Map params ) { + this.snippet = snippet; + this.params = params; + } + + // execute snippet + public void run() { + ObjectMapper jsonMapper = new ObjectMapper(); + JsonNode cmdsJsonTree = null; + try { + cmdsJsonTree = jsonMapper.readTree(this.snippet.cmds); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + for ( JsonNode cmdNode : cmdsJsonTree ) { + var cmdId = cmdNode.get("cmdId").asText(); + var cmd = UfActiveRecord.findOne(UfMdbActuatorCmd.class, cmdId); + if (null == cmd) { + throw new RuntimeException("无效的指令ID : " + cmdId); + } + cmd.parameters = cmdNode.get("params").asText(); + UfActuatorCmdExecutor.execute(cmd); + } } } diff --git a/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java b/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java index a289a90..76a6c99 100644 --- a/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java +++ b/src/main/java/com/iflytop/digester/underframework/connection/UfZcancmderWebsocket.java @@ -1,6 +1,6 @@ package com.iflytop.digester.underframework.connection; import com.iflytop.digester.underframework.dao.model.TsMdbActuator; -import com.iflytop.digester.underframework.dao.model.TsMdbActuatorCmd; +import com.iflytop.digester.underframework.dao.model.UfMdbActuatorCmd; import com.iflytop.digester.underframework.util.TsByteBuffer; import org.java_websocket.client.WebSocketClient; import org.java_websocket.handshake.ServerHandshake; @@ -62,7 +62,7 @@ public class UfZcancmderWebsocket extends UfConnectionBase { } // execute command - synchronized public void execute( TsMdbActuatorCmd actuatorCmd ) { + synchronized public void execute( UfMdbActuatorCmd actuatorCmd ) { this.executeDeviceCommand(actuatorCmd); if ( 1 == actuatorCmd.waitForFinish ) { this.waitForActuatorFinish(actuatorCmd); @@ -70,9 +70,9 @@ public class UfZcancmderWebsocket extends UfConnectionBase { } // wait for actuator finish - private void waitForActuatorFinish(TsMdbActuatorCmd actuatorCmd) { + private void waitForActuatorFinish(UfMdbActuatorCmd actuatorCmd) { do { - var waitCmd = new TsMdbActuatorCmd(); + var waitCmd = new UfMdbActuatorCmd(); waitCmd.actuatorId = actuatorCmd.actuatorId; waitCmd.cmdId = "0104"; waitCmd.cmdKey = "module_get_status"; @@ -92,7 +92,7 @@ public class UfZcancmderWebsocket extends UfConnectionBase { } // execute device command - private void executeDeviceCommand( TsMdbActuatorCmd actuatorCmd ) { + private void executeDeviceCommand( UfMdbActuatorCmd actuatorCmd ) { this.response = null; this.responseError = null; this.sendCommandRequest(actuatorCmd); @@ -111,7 +111,7 @@ public class UfZcancmderWebsocket extends UfConnectionBase { } // send command request - private void sendCommandRequest(TsMdbActuatorCmd actuatorCmd) { + private void sendCommandRequest(UfMdbActuatorCmd actuatorCmd) { String cmd = this.buildCommand(actuatorCmd); TsMdbActuator actuator = TsMdbActuator.findOne(TsMdbActuator.class, actuatorCmd.actuatorId); @@ -131,7 +131,7 @@ public class UfZcancmderWebsocket extends UfConnectionBase { } // build command - private String buildCommand(TsMdbActuatorCmd actuatorCmd) { + private String buildCommand(UfMdbActuatorCmd actuatorCmd) { String params = actuatorCmd.parameters.trim(); List paramList = new ArrayList<>(); if ( !params.isEmpty() ) { diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbActuatorCmd.java b/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbActuatorCmd.java deleted file mode 100644 index 1cbe760..0000000 --- a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbActuatorCmd.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.iflytop.digester.underframework.dao.model; -import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; -public class TsMdbActuatorCmd extends UfActiveRecord { - @UfActiveRecordField - public String actuatorId; - - @UfActiveRecordField - public String name; - - @UfActiveRecordField - public String cmdId; - - @UfActiveRecordField - public String cmdKey; - - @UfActiveRecordField - public String fixedParameters; - - @UfActiveRecordField - public String parameters; - - @UfActiveRecordField - public Integer waitForFinish; - - // get table name - public static String getTableName() { - return "app_actuator_cmds"; - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java b/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java deleted file mode 100644 index aef4d68..0000000 --- a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iflytop.digester.underframework.dao.model; -import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; - -/** - * 执行片段 - */ -public class TsMdbSnippet extends UfActiveRecord { - @UfActiveRecordField - public String name; - - @UfActiveRecordField - public String key; - - @UfActiveRecordField - public String cmds; - - // get table name - public static String getTableName() { - return "app_snippets"; - } -} diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbActuatorCmd.java b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbActuatorCmd.java new file mode 100644 index 0000000..9ab1be3 --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbActuatorCmd.java @@ -0,0 +1,30 @@ +package com.iflytop.digester.underframework.dao.model; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; +public class UfMdbActuatorCmd extends UfActiveRecord { + @UfActiveRecordField + public String actuatorId; + + @UfActiveRecordField + public String name; + + @UfActiveRecordField + public String cmdId; + + @UfActiveRecordField + public String cmdKey; + + @UfActiveRecordField + public String fixedParameters; + + @UfActiveRecordField + public String parameters; + + @UfActiveRecordField + public Integer waitForFinish; + + // get table name + public static String getTableName() { + return "app_actuator_cmds"; + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java new file mode 100644 index 0000000..106009d --- /dev/null +++ b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java @@ -0,0 +1,22 @@ +package com.iflytop.digester.underframework.dao.model; +import com.iflytop.digester.underframework.dao.record.UfActiveRecord; +import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; + +/** + * 执行片段 + */ +public class UfMdbSnippet extends UfActiveRecord { + @UfActiveRecordField + public String name; + + @UfActiveRecordField + public String key; + + @UfActiveRecordField + public String cmds; + + // get table name + public static String getTableName() { + return "app_snippets"; + } +} diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java index 184d55d..7d29a77 100644 --- a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java +++ b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiActuatorCommand.java @@ -1,7 +1,7 @@ package com.iflytop.digester.underframework.web.api; import com.iflytop.digester.underframework.dao.record.UfActiveRecord; import com.iflytop.digester.underframework.dao.record.UfActiveRecordCriteria; -import com.iflytop.digester.underframework.dao.model.TsMdbActuatorCmd; +import com.iflytop.digester.underframework.dao.model.UfMdbActuatorCmd; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -15,13 +15,13 @@ public class TsApiActuatorCommand extends UfApiControllerBase { String actuatorId = (String) params.get("actuatorId"); var criteria = new UfActiveRecordCriteria(); criteria.conditions = Map.of("actuatorId", actuatorId); - var items = UfActiveRecord.find(TsMdbActuatorCmd.class, criteria); + var items = UfActiveRecord.find(UfMdbActuatorCmd.class, criteria); return success(items); } @PostMapping("/api/actuator-cmd/save") @ResponseBody - public UfApiResponse save(@RequestBody TsMdbActuatorCmd actuatorCmd ) { + public UfApiResponse save(@RequestBody UfMdbActuatorCmd actuatorCmd ) { if ( null != actuatorCmd.id ) { actuatorCmd.isNewRecord = false; } @@ -31,14 +31,14 @@ public class TsApiActuatorCommand extends UfApiControllerBase { @PostMapping("/api/actuator-cmd/delete") @ResponseBody - public UfApiResponse delete(@RequestBody TsMdbActuatorCmd actuatorCmd ) { + public UfApiResponse delete(@RequestBody UfMdbActuatorCmd actuatorCmd ) { actuatorCmd.delete(); return success(); } @PostMapping("/api/actuator-cmd/execute") @ResponseBody - public UfApiResponse execute(@RequestBody TsMdbActuatorCmd actuatorCmd ) { + public UfApiResponse execute(@RequestBody UfMdbActuatorCmd actuatorCmd ) { try { // UfApplication.getApp().commandExecutor.execute(actuatorCmd); } catch ( Exception e ) { diff --git a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java index 26a719d..b5b4dbf 100644 --- a/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java +++ b/src/main/java/com/iflytop/digester/underframework/web/api/TsApiSnippet.java @@ -1,6 +1,6 @@ package com.iflytop.digester.underframework.web.api; import com.iflytop.digester.underframework.dao.record.UfActiveRecord; -import com.iflytop.digester.underframework.dao.model.TsMdbSnippet; +import com.iflytop.digester.underframework.dao.model.UfMdbSnippet; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -11,13 +11,13 @@ public class TsApiSnippet extends UfApiControllerBase { @PostMapping("/api/snippet/list") @ResponseBody public UfApiResponse list() { - var items = UfActiveRecord.find(TsMdbSnippet.class); + var items = UfActiveRecord.find(UfMdbSnippet.class); return success(items); } @PostMapping("/api/snippet/save") @ResponseBody - public UfApiResponse save(@RequestBody TsMdbSnippet snippet ) { + public UfApiResponse save(@RequestBody UfMdbSnippet snippet ) { if ( null != snippet.id ) { snippet.isNewRecord = false; } @@ -27,16 +27,16 @@ public class TsApiSnippet extends UfApiControllerBase { @PostMapping("/api/snippet/delete") @ResponseBody - public UfApiResponse delete(@RequestBody TsMdbSnippet snippet ) { + public UfApiResponse delete(@RequestBody UfMdbSnippet snippet ) { snippet.delete(); return success(); } @PostMapping("/api/snippet/execute") @ResponseBody - public UfApiResponse execute(@RequestBody TsMdbSnippet snippet ) { + public UfApiResponse execute(@RequestBody UfMdbSnippet snippet ) { try { - snippet = UfActiveRecord.findOne(TsMdbSnippet.class, snippet.id); + snippet = UfActiveRecord.findOne(UfMdbSnippet.class, snippet.id); // TsSnippetExecutor.executeSnippet(snippet); } catch ( Exception e ) { return error(e.getMessage()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 8325452..c2ff9a5 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -12,4 +12,13 @@ device: connections: - name : zcancmder type : ZcancmderWebsocket - uri: ws://192.168.8.10:19005 \ No newline at end of file + uri: ws://192.168.8.10:19005 + +mqtt-broker: + uri: tcp://broker.emqx.io:1883 + username: admin + password: public + clientId: digester + my-topic : "stw-a80" + transbot-topic : "transbot" + diff --git a/web b/web index bb327e9..92cb587 160000 --- a/web +++ b/web @@ -1 +1 @@ -Subproject commit bb327e921950cf4cfad799a02f6c7faa076919f4 +Subproject commit 92cb587baccf83f33dd9465bb37dc815058f26a0