3 Commits

Author SHA1 Message Date
HSZ_HeSongZhen fa4c8a3846 Merge remote-tracking branch 'origin/master' 6 days ago
HSZ_HeSongZhen 3f63b3a1af Merge remote-tracking branch 'origin/master' 6 days ago
HSZ_HeSongZhen 50cac4081d 增加 指令返回支持 6 days ago
  1. 3
      src/main/java/com/iflytop/handacid/hardware/HardwareService.java
  2. 6
      src/main/java/com/iflytop/handacid/hardware/command/CommandHandler.java
  3. 2
      src/main/java/com/iflytop/handacid/hardware/command/DeviceResponse.java
  4. 28
      src/main/java/com/iflytop/handacid/hardware/command/handlers/BleGamepadHandler.java
  5. 27
      src/main/java/com/iflytop/handacid/hardware/command/handlers/IOCtrlHandler.java
  6. 14
      src/main/java/com/iflytop/handacid/hardware/command/handlers/MotorHandler.java
  7. 9
      src/main/java/com/iflytop/handacid/hardware/drivers/BleGamepadDriver.java
  8. 9
      src/main/java/com/iflytop/handacid/hardware/drivers/MotorWrapperDriver.java

3
src/main/java/com/iflytop/handacid/hardware/HardwareService.java

@ -70,8 +70,9 @@ public class HardwareService {
if (cmdHandlers.containsKey(cmd.getDevice())) { if (cmdHandlers.containsKey(cmd.getDevice())) {
log.trace("cmdHandlers: {}", cmd); log.trace("cmdHandlers: {}", cmd);
cmdHandlers.get(cmd.getDevice()).sendCommand(cmd);
Object result = cmdHandlers.get(cmd.getDevice()).sendCommand(cmd);
response.setSuccess(Boolean.TRUE); response.setSuccess(Boolean.TRUE);
response.setData(result);
} else { } else {
log.error("不支持的设备类型: {}", cmd.getDevice()); log.error("不支持的设备类型: {}", cmd.getDevice());
throw new InvalidParameterException(StrUtil.format("[Device]: {}", cmd.getDevice())); throw new InvalidParameterException(StrUtil.format("[Device]: {}", cmd.getDevice()));

6
src/main/java/com/iflytop/handacid/hardware/command/CommandHandler.java

@ -22,7 +22,7 @@ public abstract class CommandHandler {
/** /**
* 发送指令 * 发送指令
*/ */
public void sendCommand(DeviceCommand command) throws Exception
public Object sendCommand(DeviceCommand command) throws Exception
{ {
// 校验动作是否合法 // 校验动作是否合法
checkAction(command.getAction()); checkAction(command.getAction());
@ -30,10 +30,10 @@ public abstract class CommandHandler {
checkParams(command); checkParams(command);
// 处理指令 // 处理指令
handleCommand(command);
return handleCommand(command);
} }
abstract protected void handleCommand(DeviceCommand command) throws Exception;
abstract protected Object handleCommand(DeviceCommand command) throws Exception;
/** /**
* 获取支持的设备 * 获取支持的设备

2
src/main/java/com/iflytop/handacid/hardware/command/DeviceResponse.java

@ -8,5 +8,5 @@ public class DeviceResponse {
Integer cmdId; Integer cmdId;
Boolean success; Boolean success;
String errorMsg; String errorMsg;
JSONObject data;
Object data;
} }

28
src/main/java/com/iflytop/handacid/hardware/command/handlers/BleGamepadHandler.java

@ -4,6 +4,7 @@ import com.iflytop.handacid.app.core.command.DeviceCommand;
import com.iflytop.handacid.common.enums.Action; import com.iflytop.handacid.common.enums.Action;
import com.iflytop.handacid.common.enums.Device; import com.iflytop.handacid.common.enums.Device;
import com.iflytop.handacid.hardware.command.CommandHandler; import com.iflytop.handacid.hardware.command.CommandHandler;
import com.iflytop.handacid.hardware.drivers.BleGamepadDriver;
import com.iflytop.handacid.hardware.drivers.OutputIOCtrlDriver; import com.iflytop.handacid.hardware.drivers.OutputIOCtrlDriver;
import com.iflytop.handacid.hardware.type.BleGamepadMid; import com.iflytop.handacid.hardware.type.BleGamepadMid;
import com.iflytop.handacid.hardware.type.IO.OutputIOMId; import com.iflytop.handacid.hardware.type.IO.OutputIOMId;
@ -12,6 +13,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -22,12 +24,12 @@ import java.util.stream.Collectors;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
public class BleGamepadHandler extends CommandHandler { public class BleGamepadHandler extends CommandHandler {
private final OutputIOCtrlDriver driver_;
private final Map<Device, BleGamepadMid> supportCmdDeviceIOOutputMap = Map.ofEntries(
private final BleGamepadDriver driver_;
private final Map<Device, BleGamepadMid> supportCmdDeviceBletMap = Map.ofEntries(
Map.entry(Device.BLE_GAMEPAD, BleGamepadMid.BleGamePad) Map.entry(Device.BLE_GAMEPAD, BleGamepadMid.BleGamePad)
); );
private final Map<Device, MId> supportCmdDeviceMIdMap = supportCmdDeviceIOOutputMap.entrySet().stream()
private final Map<Device, MId> supportCmdDeviceMIdMap = supportCmdDeviceBletMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().mid)); .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().mid));
private final Set<Action> supportActions = Set.of(Action.OPEN, Action.CLOSE); private final Set<Action> supportActions = Set.of(Action.OPEN, Action.CLOSE);
@ -44,7 +46,25 @@ public class BleGamepadHandler extends CommandHandler {
} }
@Override @Override
public void handleCommand(DeviceCommand command) throws Exception {
public Object handleCommand(DeviceCommand command) throws Exception {
// 发送命令 // 发送命令
Object result = null;
Device device = command.getDevice();
if (!supportCmdDeviceBletMap.containsKey(device)) {
throw new IllegalArgumentException("Device " + device + " not supported by BleGamepadHandler");
}
BleGamepadMid bleGamepadMid = supportCmdDeviceBletMap.get(device);
if (command.getAction() == Action.GET)
{
Double power = driver_.get_power_state(bleGamepadMid);
Boolean is_connected = driver_.is_connected(bleGamepadMid);
result = new HashMap<String, Object>()
{{
put("power", power);
put("is_connected", is_connected);
}};
}
return result;
} }
} }

27
src/main/java/com/iflytop/handacid/hardware/command/handlers/IOCtrlHandler.java

@ -11,6 +11,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -46,14 +47,30 @@ public class IOCtrlHandler extends CommandHandler {
} }
@Override @Override
public void handleCommand(DeviceCommand command) throws Exception {
public Object handleCommand(DeviceCommand command) throws Exception {
// 发送命令 // 发送命令
Object result = null;
Device device = command.getDevice();
if (!supportCmdDeviceIOOutputMap.containsKey(device)) {
throw new IllegalArgumentException("Device " + device + " not supported by IOCtrlHandler");
}
OutputIOMId outputIOMId = supportCmdDeviceIOOutputMap.get(device);
if (command.getAction() == Action.OPEN) { if (command.getAction() == Action.OPEN) {
log.info("open {}", command.getDevice());
driver_.open(supportCmdDeviceIOOutputMap.get(command.getDevice()));
log.info("open {}", device);
driver_.open(outputIOMId);
} else if (command.getAction() == Action.CLOSE) { } else if (command.getAction() == Action.CLOSE) {
log.info("close {}", command.getDevice());
driver_.close(supportCmdDeviceIOOutputMap.get(command.getDevice()));
log.info("close {}", device);
driver_.close(outputIOMId);
}
else if (command.getAction() == Action.GET)
{
Boolean state = driver_.getIOState(outputIOMId);
result = new HashMap<String, Object>()
{{
put("state", state);
}};
} }
return result;
} }
} }

14
src/main/java/com/iflytop/handacid/hardware/command/handlers/MotorHandler.java

@ -14,6 +14,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -65,10 +66,12 @@ public class MotorHandler extends CommandHandler {
} }
@Override @Override
public void handleCommand(DeviceCommand command) throws Exception {
public Object handleCommand(DeviceCommand command) throws Exception {
// 发送命令 // 发送命令
StepMotorMId stepMotorMId = stepMotorMIdMap_.get(command.getDevice()); StepMotorMId stepMotorMId = stepMotorMIdMap_.get(command.getDevice());
Object result = null;
switch (command.getAction()) { switch (command.getAction()) {
case ENABLE -> { case ENABLE -> {
log.info("Motor {} Enable", stepMotorMId.mid.getDescription()); log.info("Motor {} Enable", stepMotorMId.mid.getDescription());
@ -120,7 +123,16 @@ public class MotorHandler extends CommandHandler {
case MOVE_END -> { case MOVE_END -> {
driver_.moveToEnd(stepMotorMId); driver_.moveToEnd(stepMotorMId);
} }
case GET -> {
log.info("Motor {} Get Position", stepMotorMId.mid.getDescription());
double position = driver_.getPosition(stepMotorMId);
result = new HashMap<String, Object>()
{{
put("position", position);
}};
}
} }
return result;
} }
} }

9
src/main/java/com/iflytop/handacid/hardware/drivers/BleGamepadDriver.java

@ -21,11 +21,12 @@ public class BleGamepadDriver {
} }
public Integer[] get_power_state(BleGamepadMid id) throws HardwareException {
public Double get_power_state(BleGamepadMid id) throws HardwareException {
A8kPacket packet = canBus.callcmd(id.mid, CmdId.ble_gamepad_power_info); A8kPacket packet = canBus.callcmd(id.mid, CmdId.ble_gamepad_power_info);
Integer power = packet.getContentI32(0);
Integer charge_state = packet.getContentI32(1);
int power = packet.getContentI32(0);
int charge_state = packet.getContentI32(1);
log.info("power: {}, charge_state: {}", power, charge_state); log.info("power: {}, charge_state: {}", power, charge_state);
return new Integer[]{power, charge_state};
Double powerPercent = (double) power;
return powerPercent;
} }
} }

9
src/main/java/com/iflytop/handacid/hardware/drivers/MotorWrapperDriver.java

@ -34,6 +34,15 @@ public class MotorWrapperDriver {
stepMotorCtrlDriver_.setReg(stepMotorMId, StepMotorRegIndex.kreg_step_motor_default_velocity, motorSpeed); stepMotorCtrlDriver_.setReg(stepMotorMId, StepMotorRegIndex.kreg_step_motor_default_velocity, motorSpeed);
} }
// ==== ==== ==== ==== ==== ==== Get ==== ==== ==== ==== ====
public Double getPosition(StepMotorMId stepMotorMId) throws HardwareException {
// 从单片机中获取位置
int motorPosition = stepMotorCtrlDriver_.stepMotorReadPos(stepMotorMId);
// 转换为实际位置
double position = (double) motorPosition;
return position;
}
// ==== ==== ==== ==== ==== ==== Ctrl ==== ==== ==== ==== ==== ==== // ==== ==== ==== ==== ==== ==== Ctrl ==== ==== ==== ==== ==== ====
public void motorEnable(StepMotorMId stepMotorMId, Boolean enable) throws HardwareException { public void motorEnable(StepMotorMId stepMotorMId, Boolean enable) throws HardwareException {
Integer i_enable = enable ? 1 : 0; Integer i_enable = enable ? 1 : 0;

Loading…
Cancel
Save