diff --git a/app.db b/app.db index 03bb6b7..fe9d44e 100644 Binary files a/app.db and b/app.db differ diff --git a/pom.xml b/pom.xml index ad29e25..cb6b004 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,11 @@ Java-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/UfMdbActuatorCmd.java similarity index 92% rename from src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbActuatorCmd.java rename to src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbActuatorCmd.java index 1cbe760..9ab1be3 100644 --- a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbActuatorCmd.java +++ b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbActuatorCmd.java @@ -1,7 +1,7 @@ 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 { +public class UfMdbActuatorCmd extends UfActiveRecord { @UfActiveRecordField public String actuatorId; diff --git a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java similarity index 90% rename from src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java rename to src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java index aef4d68..106009d 100644 --- a/src/main/java/com/iflytop/digester/underframework/dao/model/TsMdbSnippet.java +++ b/src/main/java/com/iflytop/digester/underframework/dao/model/UfMdbSnippet.java @@ -5,7 +5,7 @@ import com.iflytop.digester.underframework.dao.record.UfActiveRecordField; /** * 执行片段 */ -public class TsMdbSnippet extends UfActiveRecord { +public class UfMdbSnippet extends UfActiveRecord { @UfActiveRecordField public String name; 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