Browse Source

2025-03-13 佟更新,一个类处理一个前台指令,增加了device类包,增加了一个全局单例DeviceInstance和一些辅助类

master
仁冬 5 months ago
parent
commit
7e5d1eb543
  1. 7
      src/main/java/com/qyft/ms/app/common/command/CommandFuture.java
  2. 31
      src/main/java/com/qyft/ms/app/common/command/CommandWaitControl.java
  3. 10
      src/main/java/com/qyft/ms/app/common/command/DeviceCommandGenerator.java
  4. 2
      src/main/java/com/qyft/ms/app/common/command/FrontCommandAck.java
  5. 8
      src/main/java/com/qyft/ms/app/common/constant/CommandStatus.java
  6. 136
      src/main/java/com/qyft/ms/app/controller/FrontCmdController.java
  7. 143
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/DehumidifierStart.java
  8. 46
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayChangeParam.java
  9. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayContinue.java
  10. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayPause.java
  11. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayStart.java
  12. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayStop.java
  13. 49
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/NozzlePipelinePreFill.java
  14. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SlideTrayIn.java
  15. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SlideTrayOut.java
  16. 52
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SprayPipelineWash.java
  17. 47
      src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SyringePipelineWash.java
  18. 66
      src/main/java/com/qyft/ms/device/device/DeviceInstance.java
  19. 34
      src/main/java/com/qyft/ms/device/device/DeviceLifeEnum.java
  20. 32
      src/main/java/com/qyft/ms/device/device/MatrixSprayStatusEnum.java
  21. 32
      src/main/java/com/qyft/ms/device/device/MotorNameEnum.java
  22. 10
      src/main/java/com/qyft/ms/device/device/MotorX.java
  23. 10
      src/main/java/com/qyft/ms/device/device/MotorY.java
  24. 10
      src/main/java/com/qyft/ms/device/device/MotorZ.java
  25. 48
      src/main/java/com/qyft/ms/device/handler/DeviceMessageHandler.java
  26. 39
      src/main/java/com/qyft/ms/device/model/DeviceStatusEnum.java

7
src/main/java/com/qyft/ms/app/common/command/CommandFuture.java

@ -22,6 +22,11 @@ public class CommandFuture {
*/
private boolean isReceived = false;
/**
* 已收到
*/
private boolean isGetResult = false;
public void waitForContinue() {
commandWaitController.commandWait();
}
@ -29,4 +34,6 @@ public class CommandFuture {
public void commandContinue() {
commandWaitController.commandContinue();
}
}

31
src/main/java/com/qyft/ms/app/common/command/CommandWaitControl.java

@ -2,38 +2,17 @@ package com.qyft.ms.app.common.command;
public class CommandWaitControl {
public String commandCallbackJsonStringHolder = "";
private boolean shouldWait = true;
public synchronized void commandWait() {
while (shouldWait) {
try {
wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
wait(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// 重置标志以便下次可以再次等待
shouldWait = true;
}
public synchronized void commandContinue() {
shouldWait = false;
notify();
}
/**
* 获取命令回调值
* @return
*/
public String getCommandCallbackValue() {
return commandCallbackJsonStringHolder;
}
/**
* 设置命令回调值
* @param commandCallbackJsonString
*/
public void setCommandCallbackValue(String commandCallbackJsonString) {
this.commandCallbackJsonStringHolder = commandCallbackJsonString;
}
}

10
src/main/java/com/qyft/ms/app/common/command/FrontCommandGenerator.java → src/main/java/com/qyft/ms/app/common/command/DeviceCommandGenerator.java

@ -6,7 +6,7 @@ import com.qyft.ms.app.model.bo.CMDToDevice;
/**
* 生成给设备发送的指令
*/
public class FrontCommandGenerator {
public class DeviceCommandGenerator {
/**
* {
@ -35,12 +35,12 @@ public class FrontCommandGenerator {
* action:'get'
* }
*/
public static CMDToDevice temperature_get() {
public static CMDToDevice humidity_get() {
int cmdId = CyclicNumberGenerator.getInstance().generateNumber();
CMDToDevice cmdToDevice = new CMDToDevice();
cmdToDevice.setCmdId(cmdId);
cmdToDevice.setCmdName("getInfoCmd");
cmdToDevice.setDevice("temperature");
cmdToDevice.setDevice("humidity");
cmdToDevice.setAction("get");
return cmdToDevice;
}
@ -54,13 +54,13 @@ public class FrontCommandGenerator {
* action:'open|close'
* }
*/
public static CMDToDevice dehumidifier_start() {
public static CMDToDevice dehumidifier_valve_control(String action) {
int cmdId = CyclicNumberGenerator.getInstance().generateNumber();
CMDToDevice cmdToDevice = new CMDToDevice();
cmdToDevice.setCmdId(cmdId);
cmdToDevice.setCmdName("controlCmd");
cmdToDevice.setDevice("dehumidifier_valve");
cmdToDevice.setAction("open");
cmdToDevice.setAction(action);
return cmdToDevice;
}

2
src/main/java/com/qyft/ms/app/common/command/FrontCommandAck.java

@ -8,6 +8,7 @@ public class FrontCommandAck {
JSONObject jsonObject = new JSONObject();
jsonObject.set("cmdId", cmdId);
jsonObject.set("cmdName", cmdName);
jsonObject.set("success", true);
jsonObject.set("status", status);
jsonObject.set("info", info);
return jsonObject.toString();
@ -17,6 +18,7 @@ public class FrontCommandAck {
JSONObject jsonObject = new JSONObject();
jsonObject.set("cmdId", cmdId);
jsonObject.set("cmdName", cmdName);
jsonObject.set("success", true);
jsonObject.set("status", "receive");
return jsonObject.toString();
}

8
src/main/java/com/qyft/ms/app/common/constant/CommandStatus.java

@ -4,8 +4,16 @@ public class CommandStatus {
/**
* 已收到前端指令
*/
public static final String SEND = "SEND";
/**
* 已收到前端指令
*/
public static final String RECEIVE = "receive";
/**
* 已收到结果
*/
public static final String RESULT = "result";
/**
* 指令执行发生错误
*/
public static final String ERROR = "error";

136
src/main/java/com/qyft/ms/app/controller/FrontCmdController.java

@ -1,26 +1,16 @@
package com.qyft.ms.app.controller;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.command.CommandFuture;
import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.command.FrontCommandGenerator;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.bo.CMDToDevice;
import com.qyft.ms.app.controller.frontcommandhandle.DehumidifierStart;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
@Tag(name = "前端调用指令")
@RestController
@RequestMapping("/api/device/front")
@ -34,132 +24,17 @@ public class FrontCmdController {
@PostMapping("/control")
public ResponseBodyEmitter controlMethod(@RequestBody CMDFormV2 cmdForm) {
ResponseBodyEmitter emitter = new ResponseBodyEmitter();
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
if ("device_status_get".equals(frontCmdName)) {
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.TEXT_PLAIN);
} catch (IOException e) {
emitter.completeWithError(e);
}
//生成发给设备的指令
CMDToDevice cmdToDevice = FrontCommandGenerator.device_status_get();
CommandFuture commandFuture = new CommandFuture();
commandFuture.setCmdToDevice(cmdToDevice);
Integer toDeviceCmdId = cmdToDevice.getCmdId();
//将指令放入map,等待设备返回然后取出在调用commandContinue
CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, commandFuture);
//发送指令给设备
deviceTcpCMDServiceV2.send(JSONUtil.toJsonStr(cmdToDevice));
commandFuture.waitForContinue();
if (commandFuture.isReceived()) {
try {
emitter.send(FrontCommandAck.deviceAck(frontCmdId, frontCmdName), MediaType.TEXT_PLAIN);
} catch (IOException e) {
emitter.completeWithError(e);
}
}
commandFuture.waitForContinue();
// JSONObject callbackResult = commandFuture.getCallbackResult();
//对返回结果处理
emitter.complete();
}).start();
DehumidifierStart.handle(deviceTcpCMDServiceV2, emitter, cmdForm);
} else if ("dehumidifier_start".equals(frontCmdName)) {
/*
除湿该方法接收Double类型参数 humidity
*/
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.TEXT_PLAIN);
//判断参数是否合法
Integer humidity = (Integer) param.get("humidity");
if (humidity == null) {
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "参数 humidity 必填"), MediaType.TEXT_PLAIN);
emitter.complete();
return;
}
//1先判断当前湿度是否大于设置值
CMDToDevice temperatureCmdToDevice = FrontCommandGenerator.temperature_get();//生成指令 获取当前湿度
CommandFuture temperatureFuture = new CommandFuture();
temperatureFuture.setCmdToDevice(temperatureCmdToDevice);
Integer toDeviceCmdId = temperatureCmdToDevice.getCmdId();
CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, temperatureFuture);//将指令放入map
deviceTcpCMDServiceV2.send(temperatureCmdToDevice); //发送指令给设备
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "已向设备发送了指令:" + JSONUtil.toJsonStr(temperatureCmdToDevice)), MediaType.TEXT_PLAIN);
temperatureFuture.waitForContinue();//等待设备的反馈
JSONObject deviceResult = temperatureFuture.getCallbackResult();//拿到设备返回结果
if(temperatureFuture.isReceived()){//直接携带数据的反馈其实不需要判断isReceived直接判断deviceResult == null
CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除
//设备已经收到指令并且执行成功
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "设备指令反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.TEXT_PLAIN);
}
if (deviceResult == null) {
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "未读取到湿度传感器数值"), MediaType.TEXT_PLAIN);
emitter.complete();
return;
}
Double temperature = deviceResult.getDouble("temperature");//拿到设备返回的湿度数值
if (humidity < temperature) {
//2如果小于设置值提醒用户不用除湿
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "设定湿度小于当前湿度,无需除湿。"), MediaType.TEXT_PLAIN);
emitter.complete();
return;
}
//3如果需要除湿开始调用底层指令"
CMDToDevice cmdToDeviceHumidity = FrontCommandGenerator.dehumidifier_start();//生成指令 开启除湿阀
CommandFuture commandFutureHumidity = new CommandFuture();
//
//
// //生成发给设备的指令
// CMDToDevice cmdToDevice = FrontCommandGenerator.device_status_get();
// CommandFuture commandFuture = new CommandFuture();
// commandFuture.setCmdToDevice(cmdToDevice);
//
// String toDeviceCmdId = cmdToDevice.getCmdId();
// //将指令放入map,等待设备返回然后取出在调用commandContinue
// CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, commandFuture);
//
// //发送指令给设备
// deviceTcpCMDServiceV2.send(JSONUtil.toJsonStr(cmdToDevice));
// commandFuture.waitForContinue();
// if (commandFuture.isReceived()) {
//
// emitter.send(FrontCommandAck.deviceAck(frontCmdId, frontCmdName), MediaType.TEXT_PLAIN);
//
// }
// commandFuture.waitForContinue();
// String callbackResult = commandFuture.getCallbackResult();
//对返回结果处理
emitter.complete();
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
} else if ("matrix_prefill".equals(frontCmdName)) {
} else if ("spray_pipeline_wash".equals(frontCmdName)) {
@ -187,4 +62,9 @@ public class FrontCmdController {
}
@RequestMapping("/controlTest")
public void controlMethodTest(){
CurrentSendCmdMapInstance.getInstance().getCommand(1).commandContinue();
}
}

143
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/DehumidifierStart.java

@ -0,0 +1,143 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.command.CommandFuture;
import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.command.DeviceCommandGenerator;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.bo.CMDToDevice;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
public class DehumidifierStart {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
/**
* 1判断参数是否合法
*/
Integer frontHumidity = (Integer) param.get("humidity");
if (frontHumidity == null) {
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "参数 humidity 必填"), MediaType.APPLICATION_JSON);
emitter.complete();
return;
}
/**
* 2获取设备湿度
*/
CMDToDevice humidityCmdToDevice = DeviceCommandGenerator.humidity_get();//生成指令 获取当前湿度
CommandFuture humidityGetFuture = new CommandFuture();
humidityGetFuture.setCmdToDevice(humidityCmdToDevice);
Integer toDeviceCmdId = humidityCmdToDevice.getCmdId();
CurrentSendCmdMapInstance.getInstance().putCommand(toDeviceCmdId, humidityGetFuture);//将指令放入map
deviceTcpCMDServiceV2.send(humidityCmdToDevice); //发送指令给设备
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了获取湿度指令:" + JSONUtil.toJsonStr(humidityCmdToDevice)), MediaType.APPLICATION_JSON);
humidityGetFuture.waitForContinue();//等待设备的反馈
/**
* 3处理返回结果或者没有响应
*/
JSONObject deviceResult = humidityGetFuture.getCallbackResult();//拿到设备返回结果
CurrentSendCmdMapInstance.getInstance().removeCommand(toDeviceCmdId);//将指令从map中删除
if (humidityGetFuture.isReceived() || humidityGetFuture.isGetResult()) {
//设备已经收到指令并且执行成功
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "设备指令反馈:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON);
Double deviceHumidity = deviceResult.getDouble("humidity");//拿到设备返回的湿度数值
if (frontHumidity > deviceHumidity) {
//如果小于设置值提醒用户不用除湿
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "设定湿度大于当前湿度,无需除湿。"), MediaType.APPLICATION_JSON);
}
else{
/**
* 4如果大于设置值开始除湿;打开除湿阀门
*/
CMDToDevice dehumidifier_valve_control = DeviceCommandGenerator.dehumidifier_valve_control("open");//生成指令 开启除湿阀
CommandFuture dehumidifier_valve_control_Future = new CommandFuture();
humidityGetFuture.setCmdToDevice(dehumidifier_valve_control);
Integer dehumidifier_valve_control_cmdId = dehumidifier_valve_control.getCmdId();
CurrentSendCmdMapInstance.getInstance().putCommand(dehumidifier_valve_control_cmdId, dehumidifier_valve_control_Future);//将指令放入map
deviceTcpCMDServiceV2.send(dehumidifier_valve_control); //发送指令给设备
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.SEND, "已向设备发送了开启除湿阀指令:" + JSONUtil.toJsonStr(dehumidifier_valve_control)), MediaType.APPLICATION_JSON);
dehumidifier_valve_control_Future.waitForContinue();//等待设备的反馈
/**
* 5处理打开除湿阀门返回结果
*/
JSONObject dehumidifier_valve_control_result = dehumidifier_valve_control_Future.getCallbackResult();//拿到设备返回结果
CurrentSendCmdMapInstance.getInstance().removeCommand(dehumidifier_valve_control_cmdId);//将指令从map中删除
if (dehumidifier_valve_control_Future.isReceived() || dehumidifier_valve_control_Future.isGetResult()) {
//设备已经收到指令并且执行成功
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RESULT, "开启除湿阀指令指令设备反馈:" + JSONUtil.toJsonStr(dehumidifier_valve_control_result)), MediaType.APPLICATION_JSON);
}
else{
//设备未收到指令或者执行失败
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "开启除湿阀指令没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON);
}
}
}else{
//设备未收到指令或者执行失败
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.ERROR, "设备没有响应:" + JSONUtil.toJsonStr(deviceResult)), MediaType.APPLICATION_JSON);
}
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

46
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayChangeParam.java

@ -0,0 +1,46 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.device.DeviceInstance;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 实时修改参数
*/
public class MatrixSprayChangeParam {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayContinue.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 前端继续基质喷涂
*/
public class MatrixSprayContinue {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayPause.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 前端暂停基质喷涂
*/
public class MatrixSprayPause {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayStart.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 前端开始基质喷涂
*/
public class MatrixSprayStart {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/MatrixSprayStop.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 前端主动结束基质喷涂
*/
public class MatrixSprayStop {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

49
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/NozzlePipelinePreFill.java

@ -0,0 +1,49 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端喷嘴管路预充指令
*/
public class NozzlePipelinePreFill {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SlideTrayIn.java

@ -0,0 +1,47 @@
spackage com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端推入托盘
*/
public class SlideTrayIn {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SlideTrayOut.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端推出托盘
*/
public class SlideTrayOut {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

52
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SprayPipelineWash.java

@ -0,0 +1,52 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.command.CommandFuture;
import com.qyft.ms.app.common.command.CurrentSendCmdMapInstance;
import com.qyft.ms.app.common.command.DeviceCommandGenerator;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.bo.CMDToDevice;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端清洗喷嘴管路
*/
public class SprayPipelineWash {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

47
src/main/java/com/qyft/ms/app/controller/frontcommandhandle/SyringePipelineWash.java

@ -0,0 +1,47 @@
package com.qyft.ms.app.controller.frontcommandhandle;
import com.qyft.ms.app.common.command.FrontCommandAck;
import com.qyft.ms.app.common.constant.CommandStatus;
import com.qyft.ms.app.model.form.CMDFormV2;
import com.qyft.ms.device.service.DeviceTcpCMDServiceV2;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
import java.io.IOException;
import java.util.Map;
/**
* 处理前端清洗注射器管路
*/
public class SyringePipelineWash {
public static void handle(DeviceTcpCMDServiceV2 deviceTcpCMDServiceV2, ResponseBodyEmitter emitter, CMDFormV2 cmdForm) {
String frontCmdId = cmdForm.getCmdId();
String frontCmdName = cmdForm.getCmdName();
Map<String, Object> param = cmdForm.getParam();
new Thread(() -> {
try {
//向前端发送接收到指令
emitter.send(FrontCommandAck.backstageAck(frontCmdId, frontCmdName, CommandStatus.RECEIVE, "后台已收到指令"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
emitter.completeWithError(e);
}
}).start();
//对返回结果处理
emitter.complete();
}
}

66
src/main/java/com/qyft/ms/device/device/DeviceInstance.java

@ -0,0 +1,66 @@
package com.qyft.ms.device.device;
import com.qyft.ms.device.model.DeviceStatusEnum;
import lombok.Data;
@Data
public class DeviceInstance {
private static DeviceInstance instance;
private DeviceInstance() {
// private constructor to prevent instantiation
}
public static synchronized DeviceInstance getInstance() {
if (instance == null) {
instance = new DeviceInstance();
}
return instance;
}
//设备名称
private String deviceName;
//序列号
private String deviceNumber;
//前端版本
private String frontVersion;
//后端版本
private String javaVersion;
//嵌入式版本
private String linuxVersion;
//嵌入式版本
private String microVersion;
//设备状态
private DeviceStatusEnum deviceStatus;
//喷涂状态
private MatrixSprayStatusEnum matrixSprayStatusEnum;
//当前任务
private String currentTaskCommandName;
//上一个任务
private String previousTaskCommandName;
private MotorX motorX;
private MotorY motorY;
private MotorZ motorZ;
private void updateMotorPosition(MotorNameEnum motorName, Double position) {
if (motorName == MotorNameEnum.X) {
motorX.setPosition(position);
} else if (motorName == MotorNameEnum.Y) {
motorY.setPosition(position);
} else if (motorName == MotorNameEnum.Z) {
motorZ.setPosition(position);
}
};
private void updateMotorOrigin(MotorNameEnum motorName, Boolean isOrigin) {
if (motorName == MotorNameEnum.X) {
motorX.setIsOrigin(isOrigin);
} else if (motorName == MotorNameEnum.Y) {
motorY.setIsOrigin(isOrigin);
} else if (motorName == MotorNameEnum.Z) {
motorZ.setIsOrigin(isOrigin);
}
};
}

34
src/main/java/com/qyft/ms/device/device/DeviceLifeEnum.java

@ -0,0 +1,34 @@
package com.qyft.ms.device.device;
public enum DeviceLifeEnum {
SYNCED("sync", "已经同步信息"),
NOSYNC("nosync", "未同步信息"),
NEWSTART("newStart", "刚从从新启动"),
SLEFCHECKED("slefchecked", "已经自检");
private String code;
private String desc;
DeviceLifeEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static DeviceLifeEnum getByCode(String code) {
for (DeviceLifeEnum value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}
}

32
src/main/java/com/qyft/ms/device/device/MatrixSprayStatusEnum.java

@ -0,0 +1,32 @@
package com.qyft.ms.device.device;
public enum MatrixSprayStatusEnum {
YES("yes", "是"),
NO("no", "否");
private String code;
private String desc;
MatrixSprayStatusEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static MatrixSprayStatusEnum getByCode(String code) {
for (MatrixSprayStatusEnum value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}
}

32
src/main/java/com/qyft/ms/device/device/MotorNameEnum.java

@ -0,0 +1,32 @@
package com.qyft.ms.device.device;
public enum MotorNameEnum {
X("x", "X轴"),
Y("y", "Y轴"),
Z("z", "Z轴");
private String code;
private String desc;
MotorNameEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static MotorNameEnum getByCode(String code) {
for (MotorNameEnum value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}
}

10
src/main/java/com/qyft/ms/device/device/MotorX.java

@ -0,0 +1,10 @@
package com.qyft.ms.device.device;
import lombok.Data;
@Data
public class MotorX {
private Boolean isOrigin;
private Double position;
private String name = MotorNameEnum.X.getCode();
}

10
src/main/java/com/qyft/ms/device/device/MotorY.java

@ -0,0 +1,10 @@
package com.qyft.ms.device.device;
import lombok.Data;
@Data
public class MotorY {
private Boolean isOrigin;
private Double position;
private String name = MotorNameEnum.Y.getCode();
}

10
src/main/java/com/qyft/ms/device/device/MotorZ.java

@ -0,0 +1,10 @@
package com.qyft.ms.device.device;
import lombok.Data;
@Data
public class MotorZ {
private Boolean isOrigin;
private Double position;
private String name = MotorNameEnum.Z.getCode();
}

48
src/main/java/com/qyft/ms/device/handler/DeviceMessageHandler.java

@ -52,26 +52,44 @@ public class DeviceMessageHandler extends ChannelInboundHandlerAdapter {
String tag = deviceResult.get("tag").toString();
if ("event".equals(tag)) {
//设备上报事件
} else if ("ack".equals(tag)) {
//设备指令反馈
Integer cmdId = payload.getInt("cmdId");
JSONObject error = payload.getJSONObject("error");
CommandFuture commandFuture = CurrentSendCmdMapInstance.getInstance().getCommand(cmdId);
if (error != null) {
//指令执行错误将错误放到CallbackResult中
commandFuture.setCallbackResult(error);
}
Object result = payload.get("result");
if (result instanceof Boolean) {
//ack 没携带数据
} else if (result instanceof JSONObject) {
//ack 携带了数据将数据放到了CallbackResult中
commandFuture.setCallbackResult((JSONObject) result);
} else {
//TODO 没有定义的类型
if(commandFuture!=null){
commandFuture.setReceived(true);
commandFuture.setCallbackResult(payload);
commandFuture.commandContinue();
}
commandFuture.setReceived(true);//已收到设备反馈
commandFuture.commandContinue();
//
// if (error != null) {
// //指令执行错误将错误放到CallbackResult中
// commandFuture.setCallbackResult(error);
// }
// Object result = payload.get("result");
// if (result instanceof Boolean) {
// //ack 没携带数据
// } else if (result instanceof JSONObject) {
// //ack 携带了数据将数据放到了CallbackResult中
// commandFuture.setCallbackResult((JSONObject) result);
// } else {
// //TODO 没有定义的类型
// }
// commandFuture.setReceived(true);//已收到设备反馈
// commandFuture.commandContinue();
} else if ("status".equals(tag)) {
//设备上报状态
}

39
src/main/java/com/qyft/ms/device/model/DeviceStatusEnum.java

@ -0,0 +1,39 @@
package com.qyft.ms.device.model;
/**
* 设备状态枚举
*/
public enum DeviceStatusEnum {
FREE("free", "闲"),
BUSY("busy", "忙"),
ONLINE("online", "在线"),
OFFLINE("offline", "离线"),
FAULT("fault", "故障"),
MAINTENANCE("maintenance", "维护"),
UNKNOWN("unknown", "未知");
private String code;
private String desc;
DeviceStatusEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
public String getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static DeviceStatusEnum getByCode(String code) {
for (DeviceStatusEnum value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}
}
Loading…
Cancel
Save