3 changed files with 248 additions and 0 deletions
-
3src/main/java/org/mgc/server/SSCommandHandler.java
-
2src/main/java/org/mgc/server/command/SupportDevice.java
-
243src/main/java/org/mgc/server/command/command_handler/TempControlDevice.java
@ -0,0 +1,243 @@ |
|||
package org.mgc.server.command.command_handler; |
|||
|
|||
import com.fasterxml.jackson.databind.ObjectMapper; |
|||
import com.fasterxml.jackson.databind.node.ObjectNode; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.mgc.app.SubSprayAppSingleton; |
|||
import org.mgc.server.CommandFuture; |
|||
import org.mgc.server.DeviceCommandGenerator; |
|||
import org.mgc.server.command.BaseCommandHandler; |
|||
import org.mgc.server.command.Command; |
|||
import org.mgc.server.command.SupportDevice; |
|||
import org.mgc.server.response.JsonErrorResponse; |
|||
import org.mgc.server.response.JsonResponse; |
|||
import org.mgc.server.response.JsonSucResponse; |
|||
import org.mgc.service.DeviceCommandManager; |
|||
import org.mgc.service.SerialCommand; |
|||
import org.mgc.service.SerialResult; |
|||
import org.mgc.utils.StringHelper; |
|||
|
|||
import java.io.IOException; |
|||
import java.security.InvalidParameterException; |
|||
import java.util.concurrent.ExecutionException; |
|||
|
|||
@Slf4j |
|||
public class TempControlDevice extends BaseCommandHandler { |
|||
public static final int TMEP_CONTROL_NOZZLE_SET_TEMP_ADDRESS = 0x24; // 设置温度 |
|||
public static final int TMEP_CONTROL_NOZZLE_CLOSE_TEMP_ADDRESS = 0x25; // 关闭温度 |
|||
public static final int TMEP_CONTROL_NOZZLE_READ_TEMP_ADDRESS = 0x26; // 读取温度 |
|||
public static final int TMEP_CONTROL_SLIDE_SET_TEMP_ADDRESS = 0x27; // 设置温度 |
|||
public static final int TMEP_CONTROL_SLIDE_CLOSE_TEMP_ADDRESS = 0x28; // 关闭温度 |
|||
public static final int TMEP_CONTROL_SLIDE_READ_TEMP_ADDRESS = 0x29; // 读取温度; |
|||
void checkAction(String action) { |
|||
if(TempAction.fromString(action) != null) |
|||
{ |
|||
return ; |
|||
} |
|||
throw new InvalidParameterException(StringHelper.format("Action E:{}", action)); |
|||
} |
|||
|
|||
@Override |
|||
public JsonResponse execute(Command command) { |
|||
int cmdId = (int) command.getCmdId(); |
|||
int res = 0; |
|||
|
|||
checkAction(command.getAction()); |
|||
|
|||
TempAction action = TempAction.fromString(command.getAction()); |
|||
|
|||
if(action == TempAction.ActionOpen) |
|||
{ |
|||
if(!command.getParam().has("temp")) |
|||
{ |
|||
throw new InvalidParameterException("temp"); |
|||
} |
|||
double temp = command.getParam().get("temp").asDouble(); |
|||
log.info("TempControlDevice open temp: {}", temp); |
|||
res = openTemp(getCmdDevice(command.getDevice()), cmdId, temp); |
|||
} |
|||
else if(action == TempAction.ActionClose) |
|||
{ |
|||
log.info("TempControlDevice close"); |
|||
res = closeTemp(getCmdDevice(command.getDevice()), cmdId); |
|||
} |
|||
else if(action == TempAction.ActionGet) |
|||
{ |
|||
double temperature = getTemp(getCmdDevice(command.getDevice()), cmdId); |
|||
ObjectMapper objectMapper = new ObjectMapper(); |
|||
ObjectNode jsonNode = objectMapper.createObjectNode(); |
|||
jsonNode.put("temp", temperature); |
|||
JsonSucResponse jsonSucResponse = new JsonSucResponse(command.getCmdId(), jsonNode); |
|||
jsonSucResponse.setDevice(command.getDevice()); |
|||
return jsonSucResponse; |
|||
} |
|||
else |
|||
{ |
|||
res = -1; |
|||
} |
|||
|
|||
boolean isSuc = res == 0; |
|||
if (isSuc) { |
|||
return new JsonSucResponse(command.getCmdId(), null); |
|||
} else { |
|||
return new JsonErrorResponse(command.getCmdId(), res, "command execution failed"); |
|||
} |
|||
} |
|||
|
|||
int openTemp(SupportDevice.CmdDevice cmdDevice, int cmdId, double temp) |
|||
{ |
|||
int address; |
|||
if(cmdDevice == SupportDevice.CmdDevice.NOZZLE_TEMP) |
|||
{ |
|||
address = TMEP_CONTROL_NOZZLE_SET_TEMP_ADDRESS; |
|||
} |
|||
else if(cmdDevice == SupportDevice.CmdDevice.SLIDE_TEMP) |
|||
{ |
|||
address = TMEP_CONTROL_SLIDE_SET_TEMP_ADDRESS; |
|||
} |
|||
else |
|||
{ |
|||
return -1; // 不支持的设备 |
|||
} |
|||
|
|||
short i_temp = (short) (temp * 10); // 转换为整数 |
|||
|
|||
// 拼 485 指令 |
|||
SerialCommand ctrlCommand = DeviceCommandGenerator.ctrlSingleRegCmdControl(cmdId, address, |
|||
i_temp); |
|||
try { |
|||
// 发送 485 指令 |
|||
DeviceCommandManager deviceCommandManager = SubSprayAppSingleton.getInstance().getDeviceCommandManager(); |
|||
CommandFuture ctrlCommandFuture = deviceCommandManager.sendCommand(ctrlCommand); |
|||
// 等待 |
|||
commandWait(1000, ctrlCommandFuture); |
|||
|
|||
// 485 指令 转 data |
|||
SerialResult result = ctrlCommandFuture.getAckFuture().get(); |
|||
return result.getCode(); |
|||
} catch (IOException | ExecutionException | InterruptedException e) { |
|||
return -1; |
|||
} |
|||
} |
|||
|
|||
int closeTemp(SupportDevice.CmdDevice cmdDevice, int cmdId) |
|||
{ |
|||
int address; |
|||
if(cmdDevice == SupportDevice.CmdDevice.NOZZLE_TEMP) |
|||
{ |
|||
address = TMEP_CONTROL_NOZZLE_CLOSE_TEMP_ADDRESS; |
|||
} |
|||
else if(cmdDevice == SupportDevice.CmdDevice.SLIDE_TEMP) |
|||
{ |
|||
address = TMEP_CONTROL_SLIDE_CLOSE_TEMP_ADDRESS; |
|||
} |
|||
else |
|||
{ |
|||
return -1; // 不支持的设备 |
|||
} |
|||
// 拼 485 指令 |
|||
SerialCommand ctrlCommand = DeviceCommandGenerator.ctrlSingleRegCmdControl(cmdId, address, |
|||
(short)(0)); |
|||
try { |
|||
// 发送 485 指令 |
|||
DeviceCommandManager deviceCommandManager = SubSprayAppSingleton.getInstance().getDeviceCommandManager(); |
|||
CommandFuture ctrlCommandFuture = deviceCommandManager.sendCommand(ctrlCommand); |
|||
// 等待 |
|||
commandWait(1000, ctrlCommandFuture); |
|||
|
|||
// 485 指令 转 data |
|||
SerialResult result = ctrlCommandFuture.getAckFuture().get(); |
|||
return result.getCode(); |
|||
} catch (IOException | ExecutionException | InterruptedException e) { |
|||
return -1; |
|||
} |
|||
} |
|||
|
|||
double getTemp(SupportDevice.CmdDevice cmdDevice, int cmdId) |
|||
{ |
|||
int address; |
|||
if(cmdDevice == SupportDevice.CmdDevice.NOZZLE_TEMP) |
|||
{ |
|||
address = TMEP_CONTROL_NOZZLE_READ_TEMP_ADDRESS; |
|||
} |
|||
else if(cmdDevice == SupportDevice.CmdDevice.SLIDE_TEMP) |
|||
{ |
|||
address = TMEP_CONTROL_SLIDE_READ_TEMP_ADDRESS; |
|||
} |
|||
else |
|||
{ |
|||
return -1; // 不支持的设备 |
|||
} |
|||
// 拼 485 指令 |
|||
SerialCommand ctrlCommand = DeviceCommandGenerator.getMultiRegInfoCmd(cmdId, address, |
|||
1); |
|||
try { |
|||
// 发送 485 指令 |
|||
DeviceCommandManager deviceCommandManager = SubSprayAppSingleton.getInstance().getDeviceCommandManager(); |
|||
CommandFuture ctrlCommandFuture = deviceCommandManager.sendCommand(ctrlCommand); |
|||
// 等待 |
|||
commandWait(1000, ctrlCommandFuture); |
|||
|
|||
// 485 指令 转 data |
|||
SerialResult result = ctrlCommandFuture.getAckFuture().get(); |
|||
if(result.getDataType() == SerialResult.DataType.REGISTER) |
|||
{ |
|||
short []array = result.getRegisterData(); |
|||
if(array == null || array.length != 1) |
|||
{ |
|||
return -1; |
|||
} |
|||
double temperature = array[0] / 10.0; |
|||
log.info("Temperature: {}", temperature); |
|||
return temperature; // 成功获取温湿度 |
|||
} |
|||
else |
|||
{ |
|||
return 0.0; |
|||
} |
|||
} catch (IOException | ExecutionException | InterruptedException e) { |
|||
return 0.0; // 异常处理 |
|||
} |
|||
} |
|||
|
|||
public SupportDevice.CmdDevice getCmdDevice(String strDevice) { |
|||
if(strDevice.equals(SupportDevice.CmdDevice.NOZZLE_TEMP.getStrValue()) ) |
|||
{ |
|||
return SupportDevice.CmdDevice.NOZZLE_TEMP; |
|||
} |
|||
else if(strDevice.equals(SupportDevice.CmdDevice.SLIDE_TEMP.getStrValue())) |
|||
{ |
|||
return SupportDevice.CmdDevice.SLIDE_TEMP; |
|||
} |
|||
else { |
|||
return SupportDevice.CmdDevice.NOZZLE_TEMP; |
|||
} |
|||
} |
|||
|
|||
public enum TempAction { |
|||
ActionOpen("open"), |
|||
ActionClose("close"), |
|||
ActionGet("get"); |
|||
|
|||
private final String strAction; |
|||
|
|||
TempAction(String strAction) { |
|||
this.strAction = strAction; |
|||
} |
|||
|
|||
// 获取关联的字符串值 |
|||
public String getStrAction() { |
|||
return strAction; |
|||
} |
|||
|
|||
// 根据字符串查找枚举值 |
|||
public static TempAction fromString(String value) { |
|||
for (TempAction action : TempAction.values()) { |
|||
if (action.getStrAction().equals(value)) { |
|||
return action; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue