Browse Source

加酸仪 V2 硬件适配

master
HSZ_HeSongZhen 6 days ago
parent
commit
50f5314c9e
  1. 170
      src/main/java/com/iflytop/handacid/hardware/command/handlers/CeramicPumpHandler.java
  2. 4
      src/main/java/com/iflytop/handacid/hardware/command/handlers/IOCtrlHandler.java
  3. 8
      src/main/java/com/iflytop/handacid/hardware/command/handlers/MotorHandler.java
  4. 62
      src/main/java/com/iflytop/handacid/hardware/service/BleGamepadService.java
  5. 15
      src/main/java/com/iflytop/handacid/hardware/type/BleGamepadMid.java
  6. 6
      src/main/java/com/iflytop/handacid/hardware/type/CmdId.java
  7. 9
      src/main/java/com/iflytop/handacid/hardware/type/IO/OutputIOMId.java
  8. 44
      src/main/java/com/iflytop/handacid/hardware/type/MId.java
  9. 5
      src/main/java/com/iflytop/handacid/hardware/type/ModuleType.java
  10. 2
      src/main/java/com/iflytop/handacid/hardware/type/Servo/MiniServoId.java
  11. 2
      src/main/java/com/iflytop/handacid/hardware/type/Servo/MiniServoMId.java
  12. 24
      src/main/java/com/iflytop/handacid/hardware/type/StepMotor/StepMotorMId.java
  13. 4
      src/main/java/com/iflytop/handacid/hardware/type/TecHeaterRodMId.java
  14. 24
      src/main/java/com/iflytop/handacid/hardware/type/appevent/A8kHardwareReport.java

170
src/main/java/com/iflytop/handacid/hardware/command/handlers/CeramicPumpHandler.java

@ -1,85 +1,85 @@
package com.iflytop.handacid.hardware.command.handlers;
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.common.enums.MotorDirection;
import com.iflytop.handacid.hardware.command.CommandHandler;
import com.iflytop.handacid.hardware.drivers.CeramicPumpDriver;
import com.iflytop.handacid.hardware.type.CeramicPumpDriverSlaveId;
import com.iflytop.handacid.hardware.type.MId;
import com.iflytop.handacid.hardware.type.StepMotor.MotorDirect;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static java.lang.Math.abs;
@Slf4j
@Component
@RequiredArgsConstructor
public class CeramicPumpHandler extends CommandHandler {
private final CeramicPumpDriver driver_;
private final Map<Device, CeramicPumpDriverSlaveId> stepMotorMIdMap_ = Map.ofEntries(
Map.entry(Device.PUMP_1, CeramicPumpDriverSlaveId.CERAMIC_PUMP1_ID),
Map.entry(Device.PUMP_2, CeramicPumpDriverSlaveId.CERAMIC_PUMP2_ID)
);
private final Map<Device, MId> supportCmdDeviceMIdMap = stepMotorMIdMap_.entrySet().stream().
collect(Collectors.toMap(Map.Entry::getKey, entry -> MId.NotSet));
private final Set<Action> supportActions = Set.of(
Action.SET, Action.CLOSE_CLAMP,
Action.MOVE_BY,
Action.STOP);
@Override
protected Map<Device, MId> getSupportCmdDeviceMIdMap() {
return supportCmdDeviceMIdMap;
}
@Override
protected Set<Action> getSupportActions() {
return supportActions;
}
public MotorDirect getMotorDirect(MotorDirection cmdDirection)
{
return switch (cmdDirection) {
case FORWARD -> MotorDirect.FORWARD;
case BACKWARD -> MotorDirect.BACKWARD;
};
}
@Override
public void handleCommand(DeviceCommand command) throws Exception {
// 发送命令
CeramicPumpDriverSlaveId slaveId = stepMotorMIdMap_.get(command.getDevice());
switch (command.getAction()) {
case MOVE_BY -> {
double distance = command.getParam().getPosition();
log.info("Motor {} Move By Distance {}", slaveId, distance);
CeramicPumpDriver.Direction direction = distance < 0 ?
CeramicPumpDriver.Direction.BACKWARD : CeramicPumpDriver.Direction.FORWARD;
driver_.moveByBlock(slaveId, direction, abs((int)(distance)));
}
case STOP -> {
log.info("Motor {} Stop", slaveId);
driver_.stopBlock(slaveId);
}
case SET -> {
Double speed = command.getParam().getSpeed();
if (speed != null) {
double d_speed = speed;
log.info("Motor {} Set Speed {}", slaveId, speed);
driver_.setSpeed(slaveId, (int)d_speed);
}
}
}
}
}
//package com.iflytop.handacid.hardware.command.handlers;
//
//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.common.enums.MotorDirection;
//import com.iflytop.handacid.hardware.command.CommandHandler;
//import com.iflytop.handacid.hardware.drivers.CeramicPumpDriver;
//import com.iflytop.handacid.hardware.type.CeramicPumpDriverSlaveId;
//import com.iflytop.handacid.hardware.type.MId;
//import com.iflytop.handacid.hardware.type.StepMotor.MotorDirect;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import java.util.Map;
//import java.util.Set;
//import java.util.stream.Collectors;
//
//import static java.lang.Math.abs;
//
//@Slf4j
//@Component
//@RequiredArgsConstructor
//public class CeramicPumpHandler extends CommandHandler {
// private final CeramicPumpDriver driver_;
//
// private final Map<Device, CeramicPumpDriverSlaveId> stepMotorMIdMap_ = Map.ofEntries(
// Map.entry(Device.PUMP_1, CeramicPumpDriverSlaveId.CERAMIC_PUMP1_ID),
// Map.entry(Device.PUMP_2, CeramicPumpDriverSlaveId.CERAMIC_PUMP2_ID)
// );
// private final Map<Device, MId> supportCmdDeviceMIdMap = stepMotorMIdMap_.entrySet().stream().
// collect(Collectors.toMap(Map.Entry::getKey, entry -> MId.NotSet));
//
// private final Set<Action> supportActions = Set.of(
// Action.SET, Action.CLOSE_CLAMP,
// Action.MOVE_BY,
// Action.STOP);
//
// @Override
// protected Map<Device, MId> getSupportCmdDeviceMIdMap() {
// return supportCmdDeviceMIdMap;
// }
//
// @Override
// protected Set<Action> getSupportActions() {
// return supportActions;
// }
//
// public MotorDirect getMotorDirect(MotorDirection cmdDirection)
// {
// return switch (cmdDirection) {
// case FORWARD -> MotorDirect.FORWARD;
// case BACKWARD -> MotorDirect.BACKWARD;
// };
// }
//
// @Override
// public void handleCommand(DeviceCommand command) throws Exception {
// // 发送命令
// CeramicPumpDriverSlaveId slaveId = stepMotorMIdMap_.get(command.getDevice());
//
// switch (command.getAction()) {
// case MOVE_BY -> {
// double distance = command.getParam().getPosition();
// log.info("Motor {} Move By Distance {}", slaveId, distance);
// CeramicPumpDriver.Direction direction = distance < 0 ?
// CeramicPumpDriver.Direction.BACKWARD : CeramicPumpDriver.Direction.FORWARD;
// driver_.moveByBlock(slaveId, direction, abs((int)(distance)));
// }
// case STOP -> {
// log.info("Motor {} Stop", slaveId);
// driver_.stopBlock(slaveId);
// }
// case SET -> {
// Double speed = command.getParam().getSpeed();
// if (speed != null) {
// double d_speed = speed;
// log.info("Motor {} Set Speed {}", slaveId, speed);
// driver_.setSpeed(slaveId, (int)d_speed);
// }
// }
// }
// }
//}

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

@ -23,6 +23,10 @@ import java.util.stream.Collectors;
public class IOCtrlHandler extends CommandHandler {
private final OutputIOCtrlDriver driver_;
private final Map<Device, OutputIOMId> supportCmdDeviceIOOutputMap = Map.ofEntries(
Map.entry(Device.VALVE_1, OutputIOMId.DO_VALVE1),
Map.entry(Device.VALVE_2, OutputIOMId.DO_VALVE2),
Map.entry(Device.VALVE_3, OutputIOMId.DO_VALVE3),
Map.entry(Device.VALVE_4, OutputIOMId.DO_VALVE4)
);
private final Map<Device, MId> supportCmdDeviceMIdMap = supportCmdDeviceIOOutputMap.entrySet().stream()

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

@ -25,10 +25,10 @@ public class MotorHandler extends CommandHandler {
private final MotorWrapperDriver driver_;
private final Map<Device, StepMotorMId> stepMotorMIdMap_ = Map.ofEntries(
Map.entry(Device.PUMP_1, StepMotorMId.BrushlessPump1M),
Map.entry(Device.PUMP_2, StepMotorMId.BrushlessPump2M),
Map.entry(Device.PUMP_3, StepMotorMId.BrushlessPump3M),
Map.entry(Device.PUMP_4, StepMotorMId.BrushlessPump4M)
Map.entry(Device.PUMP_1, StepMotorMId.HandAcid1M),
Map.entry(Device.PUMP_2, StepMotorMId.HandAcid2M),
Map.entry(Device.PUMP_3, StepMotorMId.HandAcid3M),
Map.entry(Device.PUMP_4, StepMotorMId.HandAcid4M)
);
private final Map<Device, MId> supportCmdDeviceMIdMap = stepMotorMIdMap_.entrySet().stream().
collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().mid));

62
src/main/java/com/iflytop/handacid/hardware/service/BleGamepadService.java

@ -0,0 +1,62 @@
package com.iflytop.handacid.hardware.service;
import com.iflytop.handacid.hardware.comm.can.A8kCanBusService;
import com.iflytop.handacid.hardware.type.A8kPacket;
import com.iflytop.handacid.hardware.type.CmdId;
import com.iflytop.handacid.hardware.type.appevent.A8kCanBusOnConnectEvent;
import com.iflytop.handacid.hardware.type.appevent.A8kHardwareReport;
import com.iflytop.handacid.hardware.type.appevent.AppEvent;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* 蓝牙手柄服务管理
*
*/
@Component
@Slf4j
@RequiredArgsConstructor
public class BleGamepadService {
private final A8kCanBusService canBus;
private final AppEventBusService eventBus;
@PostConstruct
synchronized public void init() {
eventBus.regListener(this::onAppEvent);
}
/**
* 事件总线事件处理
* @param event e
*/
private void onAppEvent(AppEvent event) {
if (event instanceof A8kHardwareReport canPacket) {
A8kPacket packet = canPacket.getReportPacket();
CmdId cmdId = CmdId.valueOf(packet.getCmdId());
if (CmdId.event_ble_gamepad_liquid_acid.equals(cmdId)) {
log.info("蓝牙手柄 加酸按钮 按下");
} else if (CmdId.event_ble_gamepad_liquid_acid_prefilling.equals(cmdId)) {
log.info("蓝牙手柄 预充按钮 按下");
}
else if (CmdId.event_ble_gamepad_connected.equals(cmdId)) {
log.info("蓝牙手柄 连接成功");
}
else if (CmdId.event_ble_gamepad_disconnected.equals(cmdId)) {
log.info("蓝牙手柄 连接断开");
}
} else if (event instanceof A8kCanBusOnConnectEvent canPacket) {
log.info("a8k canbus connect sucess");
}
}
}

15
src/main/java/com/iflytop/handacid/hardware/type/BleGamepadMid.java

@ -0,0 +1,15 @@
package com.iflytop.handacid.hardware.type;
import org.springframework.util.Assert;
public enum BleGamepadMid {
BleGamePad(MId.BleGamePad),
;
final public MId mid;
BleGamepadMid(MId mid) {
Assert.isTrue(this.name().equals(mid.name()), "BleGamepadMid Init fail");
this.mid = mid;
}
}

6
src/main/java/com/iflytop/handacid/hardware/type/CmdId.java

@ -117,6 +117,12 @@ public enum CmdId {
tec103_heater_set_target_temperature(0x5803, "TEC103_HEATER_SET_TARGET_TEMPERATURE"),
tec103_heater_read_temperature(0x5804, "TEC103_HEATER_READ_TEMPERATURE"),
tec103_heater_factory_reset(0x5805, "TEC103_HEATER_FACTORY_RESET"),
event_ble_gamepad_liquid_acid(0x5901, "EVENT_BLE_GAMEPAD_LIQUID_ACID"),
event_ble_gamepad_liquid_acid_prefilling(0x5902, "EVENT_BLE_GAMEPAD_LIQUID_ACID_PREFILLING"),
event_ble_gamepad_connected(0x5903, "EVENT_BLE_GAMEPAD_CONNECTED"),
event_ble_gamepad_disconnected(0x5904, "EVENT_BLE_GAMEPAD_DISCONNECTED"),
ble_gamepad_is_connected(0x5905, "BLE_GAMEPAD_IS_CONNECTED"),
;
public final static int ATTACH_IS_BYTES = 1;

9
src/main/java/com/iflytop/handacid/hardware/type/IO/OutputIOMId.java

@ -4,11 +4,10 @@ import com.iflytop.handacid.hardware.type.MId;
public enum OutputIOMId {
DO_FAN1("FAN1", MId.IO1_IO, 0, false),
DO_FAN2("FAN2", MId.IO1_IO, 1, false),
DO_FAN3("FAN3", MId.IO1_IO, 2, false),
DO_FAN4("FAN4", MId.IO1_IO, 3, false),
SYSTEM_POWER("SYSTEM_POWER", MId.IO1_IO, 4, false),
DO_VALVE1("电磁阀1", MId.IO1_IO, 0, false),
DO_VALVE2("电磁阀2", MId.IO1_IO, 1, false),
DO_VALVE3("电磁阀3", MId.IO1_IO, 2, false),
DO_VALVE4("电磁阀4", MId.IO1_IO, 3, false),
;
final public String description;

44
src/main/java/com/iflytop/handacid/hardware/type/MId.java

@ -7,41 +7,15 @@ public enum MId {
NotSet(0, "未设置"),
IO1Board(5, "台面 IO 板模块"),
IO1_IO(6, "台面 IO 板模块"),
IO1_TriColorLight(7, "三色灯"),
IO1_ADC(9, "台面 ADC 板模块"),
RobotArmBoard(40, "机械臂控制板"),
DualRobot1M(41, "机械臂X轴电机"),
DualRobot2M(42, "机械臂Y轴电机"),
RobotArmZM(43, "机械臂Z轴电机"),
RobotArmClawSV(44, "机械臂夹爪伺服"),
BrushlessPumpBoard(50, "无刷泵控制板"),
BrushlessPump1M(51, "无刷泵1号电机"),
BrushlessPump2M(52, "无刷泵2号电机"),
BrushlessPump3M(53, "无刷泵3号电机"),
BrushlessPump4M(54, "无刷泵4号电机"),
BrushlessPump5M(55, "无刷泵5号电机"),
BrushlessPump6M(56, "无刷泵6号电机"),
BrushlessPump7M(57, "无刷泵7号电机"),
BrushlessPump8M(58, "无刷泵8号电机"),
BrushlessPump9M(59, "无刷泵9号电机"),
BrushlessPump10M(60, "无刷泵10号电机"),
StepPumpBoard(65, "步进泵控制板"),
StepPump1M(66, "步进泵1号"),
StepPump2M(67, "步进泵2号"),
StepPump3M(68, "步进泵3号"),
TitratorBoard(75, "滴定仪控制板"),
TitratorStir1M(76, "滴定仪搅拌1泵"),
TitratorStir2M(77, "滴定仪搅拌2泵"),
Titrator1M(78, "滴定仪1泵"),
Titrator2M(79, "滴定仪2泵"),
HeaterRod1(80, "加热棒1"),
HeaterRod2(81, "加热棒2"),
// IO1_TriColorLight(7, "三色灯"),
// IO1_ADC(9, "台面 ADC 板模块"),
HandAcidBoard(40, "加酸控制模块"),
HandAcid1M(41, "加酸泵1"),
HandAcid2M(42, "加酸泵2"),
HandAcid3M(43, "加酸泵3"),
HandAcid4M(44, "加酸泵4"),
BleGamePad(45, "蓝牙手柄模块"),
;
final public String description;

5
src/main/java/com/iflytop/handacid/hardware/type/ModuleType.java

@ -12,6 +12,11 @@ public enum ModuleType {
ADC(103), // ADC扩展
LeiSaiServo(104), // 雷赛伺服
LiquidDistributionArm(105), // 液体分配机械臂控制
ChimeBuzzer(106), // 和弦蜂鸣器
LiquidValve(107), // 加液四通阀
Tec103Heater(108), // TEC 103加热头
BleGamePad(109), // 蓝牙游戏手柄
CodeScanner(201), // 条形码扫描器
UNKNOWN(999); // 未知类型
public final int code;

2
src/main/java/com/iflytop/handacid/hardware/type/Servo/MiniServoId.java

@ -1,7 +1,7 @@
package com.iflytop.handacid.hardware.type.Servo;
public enum MiniServoId {
claw(MiniServoMId.RobotArmClawSV, "夹爪"),
// claw(MiniServoMId.RobotArmClawSV, "夹爪"),
;
private MiniServoMId servoMId;

2
src/main/java/com/iflytop/handacid/hardware/type/Servo/MiniServoMId.java

@ -4,7 +4,7 @@ import com.iflytop.handacid.hardware.type.MId;
public enum MiniServoMId {
NotSet(MId.NotSet),//
RobotArmClawSV(MId.RobotArmClawSV),
// RobotArmClawSV(MId.RobotArmClawSV),
;
final public MId mid;

24
src/main/java/com/iflytop/handacid/hardware/type/StepMotor/StepMotorMId.java

@ -3,26 +3,10 @@ package com.iflytop.handacid.hardware.type.StepMotor;
import com.iflytop.handacid.hardware.type.MId;
public enum StepMotorMId {
DualRobot1M(MId.DualRobot1M),
DualRobot2M(MId.DualRobot2M),
RobotArmZM(MId.RobotArmZM),
BrushlessPump1M(MId.BrushlessPump1M),
BrushlessPump2M(MId.BrushlessPump2M),
BrushlessPump3M(MId.BrushlessPump3M),
BrushlessPump4M(MId.BrushlessPump4M),
BrushlessPump5M(MId.BrushlessPump5M),
BrushlessPump6M(MId.BrushlessPump6M),
BrushlessPump7M(MId.BrushlessPump7M),
BrushlessPump8M(MId.BrushlessPump8M),
BrushlessPump9M(MId.BrushlessPump9M),
BrushlessPump10M(MId.BrushlessPump10M),
StepPump1M(MId.StepPump1M),
StepPump2M(MId.StepPump2M),
StepPump3M(MId.StepPump3M),
TitratorStir1M(MId.TitratorStir1M),
TitratorStir2M(MId.TitratorStir2M),
Titrator1M(MId.Titrator1M),
Titrator2M(MId.Titrator2M)
HandAcid1M(MId.HandAcid1M),
HandAcid2M(MId.HandAcid2M),
HandAcid3M(MId.HandAcid3M),
HandAcid4M(MId.HandAcid4M),
;
final public MId mid;

4
src/main/java/com/iflytop/handacid/hardware/type/TecHeaterRodMId.java

@ -3,8 +3,8 @@ package com.iflytop.handacid.hardware.type;
import org.springframework.util.Assert;
public enum TecHeaterRodMId {
HeaterRod1(MId.HeaterRod1),
HeaterRod2(MId.HeaterRod2),
// HeaterRod1(MId.HeaterRod1),
// HeaterRod2(MId.HeaterRod2),
;
final public MId mid;

24
src/main/java/com/iflytop/handacid/hardware/type/appevent/A8kHardwareReport.java

@ -0,0 +1,24 @@
package com.iflytop.handacid.hardware.type.appevent;
import com.iflytop.handacid.hardware.type.A8kPacket;
import org.springframework.lang.NonNull;
/**
* A8k底层硬件上报事件
*/
public class A8kHardwareReport extends AppEvent{
A8kPacket reportPacket;
public A8kHardwareReport(@NonNull A8kPacket packet) {
super(A8kHardwareReport.class.getSimpleName());
this.reportPacket = packet;
}
public A8kPacket getReportPacket(){
return reportPacket;
}
public String toString(){
return String.format("|Event A8kHardwareReport :%s|", reportPacket.toString());
}
}
Loading…
Cancel
Save