3 Commits

Author SHA1 Message Date
HSZ_HeSongZhen fa4c8a3846 Merge remote-tracking branch 'origin/master' 5 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())) {
log.trace("cmdHandlers: {}", cmd);
cmdHandlers.get(cmd.getDevice()).sendCommand(cmd);
Object result = cmdHandlers.get(cmd.getDevice()).sendCommand(cmd);
response.setSuccess(Boolean.TRUE);
response.setData(result);
} else {
log.error("不支持的设备类型: {}", 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());
@ -30,10 +30,10 @@ public abstract class CommandHandler {
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;
Boolean success;
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.Device;
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.type.BleGamepadMid;
import com.iflytop.handacid.hardware.type.IO.OutputIOMId;
@ -12,6 +13,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@ -22,12 +24,12 @@ import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
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)
);
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));
private final Set<Action> supportActions = Set.of(Action.OPEN, Action.CLOSE);
@ -44,7 +46,25 @@ public class BleGamepadHandler extends CommandHandler {
}
@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 org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@ -46,14 +47,30 @@ public class IOCtrlHandler extends CommandHandler {
}
@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) {
log.info("open {}", command.getDevice());
driver_.open(supportCmdDeviceIOOutputMap.get(command.getDevice()));
log.info("open {}", device);
driver_.open(outputIOMId);
} 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 org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@ -65,10 +66,12 @@ public class MotorHandler extends CommandHandler {
}
@Override
public void handleCommand(DeviceCommand command) throws Exception {
public Object handleCommand(DeviceCommand command) throws Exception {
// 发送命令
StepMotorMId stepMotorMId = stepMotorMIdMap_.get(command.getDevice());
Object result = null;
switch (command.getAction()) {
case ENABLE -> {
log.info("Motor {} Enable", stepMotorMId.mid.getDescription());
@ -120,7 +123,16 @@ public class MotorHandler extends CommandHandler {
case MOVE_END -> {
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);
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);
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);
}
// ==== ==== ==== ==== ==== ==== Get ==== ==== ==== ==== ====
public Double getPosition(StepMotorMId stepMotorMId) throws HardwareException {
// 从单片机中获取位置
int motorPosition = stepMotorCtrlDriver_.stepMotorReadPos(stepMotorMId);
// 转换为实际位置
double position = (double) motorPosition;
return position;
}
// ==== ==== ==== ==== ==== ==== Ctrl ==== ==== ==== ==== ==== ====
public void motorEnable(StepMotorMId stepMotorMId, Boolean enable) throws HardwareException {
Integer i_enable = enable ? 1 : 0;

Loading…
Cancel
Save