From f33105e58353780757efbaf8593623b4d0568561 Mon Sep 17 00:00:00 2001 From: HSZ_HeSongZhen <210202959@qq.com> Date: Wed, 30 Apr 2025 16:53:33 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E6=96=B0=E5=A2=9E=E5=8C=85=E5=B7=A5?= =?UTF-8?q?=E5=8E=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/app/service/DeviceParamConfigService.java | 8 +- .../gd/hardware/command/CommandHandler.java | 6 + .../command/command_handler/FanHandler.java | 21 +- .../com/iflytop/gd/hardware/device/ServoMotor.java | 2 +- .../com/iflytop/gd/hardware/device/StepMotor.java | 2 +- .../iflytop/gd/hardware/drivers/AppErrorCode.java | 21 -- .../com/iflytop/gd/hardware/drivers/CmdId.java | 122 ----------- .../iflytop/gd/hardware/drivers/CommandBus.java | 22 -- .../com/iflytop/gd/hardware/drivers/ModuleId.java | 98 --------- .../com/iflytop/gd/hardware/drivers/RegIndex.java | 78 ------- .../hardware/drivers/WebSocketCommandBusImpl.java | 1 + .../gd/hardware/factory/A8kPacketFactory.java | 53 +++++ .../com/iflytop/gd/hardware/type/A8kPacket.java | 227 +++++++++++++++++++++ .../com/iflytop/gd/hardware/type/AppErrorCode.java | 21 ++ .../java/com/iflytop/gd/hardware/type/CmdId.java | 154 ++++++++++++++ .../com/iflytop/gd/hardware/type/CommandBus.java | 22 ++ .../java/com/iflytop/gd/hardware/type/MId.java | 98 +++++++++ .../com/iflytop/gd/hardware/type/RegIndex.java | 78 +++++++ .../com/iflytop/gd/hardware/utils/ByteArray.java | 124 +++++++++++ .../drivers/WebSocketCommandBusImplTest.java | 6 +- 20 files changed, 808 insertions(+), 356 deletions(-) delete mode 100644 src/main/java/com/iflytop/gd/hardware/drivers/AppErrorCode.java delete mode 100644 src/main/java/com/iflytop/gd/hardware/drivers/CmdId.java delete mode 100644 src/main/java/com/iflytop/gd/hardware/drivers/CommandBus.java delete mode 100644 src/main/java/com/iflytop/gd/hardware/drivers/ModuleId.java delete mode 100644 src/main/java/com/iflytop/gd/hardware/drivers/RegIndex.java create mode 100644 src/main/java/com/iflytop/gd/hardware/factory/A8kPacketFactory.java create mode 100644 src/main/java/com/iflytop/gd/hardware/type/A8kPacket.java create mode 100644 src/main/java/com/iflytop/gd/hardware/type/AppErrorCode.java create mode 100644 src/main/java/com/iflytop/gd/hardware/type/CmdId.java create mode 100644 src/main/java/com/iflytop/gd/hardware/type/CommandBus.java create mode 100644 src/main/java/com/iflytop/gd/hardware/type/MId.java create mode 100644 src/main/java/com/iflytop/gd/hardware/type/RegIndex.java create mode 100644 src/main/java/com/iflytop/gd/hardware/utils/ByteArray.java diff --git a/src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java b/src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java index a9bc8c9..54bfc35 100644 --- a/src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java +++ b/src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java @@ -7,8 +7,8 @@ import com.iflytop.gd.app.model.entity.DeviceParamConfig; import com.iflytop.gd.app.model.vo.DeviceParamGroupVO; import com.iflytop.gd.app.model.vo.ModuleIdVO; import com.iflytop.gd.app.model.vo.RegIndexVO; -import com.iflytop.gd.hardware.drivers.ModuleId; -import com.iflytop.gd.hardware.drivers.RegIndex; +import com.iflytop.gd.hardware.type.MId; +import com.iflytop.gd.hardware.type.RegIndex; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -58,7 +58,7 @@ public class DeviceParamConfigService extends ServiceImpl() .eq(DeviceParamConfig::getMid, moduleId.name()) @@ -72,7 +72,7 @@ public class DeviceParamConfigService extends ServiceImpl */ public List listAllModuleIds() { - return Arrays.stream(ModuleId.values()) + return Arrays.stream(MId.values()) .map(e -> new ModuleIdVO( e.name(), // 枚举常量名 e.name // 描述字段 diff --git a/src/main/java/com/iflytop/gd/hardware/command/CommandHandler.java b/src/main/java/com/iflytop/gd/hardware/command/CommandHandler.java index da69877..f0df264 100644 --- a/src/main/java/com/iflytop/gd/hardware/command/CommandHandler.java +++ b/src/main/java/com/iflytop/gd/hardware/command/CommandHandler.java @@ -3,8 +3,14 @@ package com.iflytop.gd.hardware.command; import com.iflytop.gd.common.cmd.DeviceCommand; import com.iflytop.gd.common.cmd.DeviceCommandParams; import com.iflytop.gd.common.enums.cmd.CmdAction; +import com.iflytop.gd.hardware.type.A8kPacket; public abstract class CommandHandler { protected abstract void checkAction(CmdAction action) throws Exception; public abstract boolean sendCommand(DeviceCommand command) throws Exception; + + protected A8kPacket sendPacket(A8kPacket packet) throws Exception { + // 发送数据包 + return packet; + } } diff --git a/src/main/java/com/iflytop/gd/hardware/command/command_handler/FanHandler.java b/src/main/java/com/iflytop/gd/hardware/command/command_handler/FanHandler.java index 61a72b9..0e35648 100644 --- a/src/main/java/com/iflytop/gd/hardware/command/command_handler/FanHandler.java +++ b/src/main/java/com/iflytop/gd/hardware/command/command_handler/FanHandler.java @@ -7,7 +7,7 @@ import com.iflytop.gd.hardware.command.CommandHandler; public class FanHandler extends CommandHandler { - private int fandId_; + private final int fandId_; public FanHandler(int fanId) { fandId_ = fanId; @@ -17,7 +17,6 @@ public class FanHandler extends CommandHandler { public boolean sendCommand(DeviceCommand command) throws Exception { // 校验动作 checkAction(command.getAction()); - // 发送命令 if (command.getAction() == CmdAction.open) { // 校验参数 @@ -25,15 +24,25 @@ public class FanHandler extends CommandHandler { // get 参数值 Double speed = command.getParam().getSpeed(); - // 组包 - // 发送命令 - return true; + return openFan(speed); } else if (command.getAction() == CmdAction.close) { - return true; + return closeFan(); } return false; } + private boolean openFan(Double speed) { + // 组包 + // 发送命令 + return true; + } + + private boolean closeFan() { + // 组包 + // 发送命令 + return true; + } + @Override protected void checkAction(CmdAction action) throws Exception { if (!action.equals(CmdAction.open) && !action.equals(CmdAction.close)) { diff --git a/src/main/java/com/iflytop/gd/hardware/device/ServoMotor.java b/src/main/java/com/iflytop/gd/hardware/device/ServoMotor.java index 5235455..6bbf662 100644 --- a/src/main/java/com/iflytop/gd/hardware/device/ServoMotor.java +++ b/src/main/java/com/iflytop/gd/hardware/device/ServoMotor.java @@ -1,6 +1,6 @@ package com.iflytop.gd.hardware.device; -import com.iflytop.gd.hardware.drivers.RegIndex; +import com.iflytop.gd.hardware.type.RegIndex; /** diff --git a/src/main/java/com/iflytop/gd/hardware/device/StepMotor.java b/src/main/java/com/iflytop/gd/hardware/device/StepMotor.java index 59936bd..ec18760 100644 --- a/src/main/java/com/iflytop/gd/hardware/device/StepMotor.java +++ b/src/main/java/com/iflytop/gd/hardware/device/StepMotor.java @@ -1,6 +1,6 @@ package com.iflytop.gd.hardware.device; -import com.iflytop.gd.hardware.drivers.RegIndex; +import com.iflytop.gd.hardware.type.RegIndex; import com.iflytop.gd.hardware.constants.DistanceUnit; import com.iflytop.gd.hardware.constants.RotationDirection; diff --git a/src/main/java/com/iflytop/gd/hardware/drivers/AppErrorCode.java b/src/main/java/com/iflytop/gd/hardware/drivers/AppErrorCode.java deleted file mode 100644 index f500f3f..0000000 --- a/src/main/java/com/iflytop/gd/hardware/drivers/AppErrorCode.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.iflytop.gd.hardware.drivers; - -public enum AppErrorCode { - APP_OK(200, "操作成功"), - FAIL(500, "操作失败"), - PARAM_ERROR(400, "参数错误"); - - private int code; - private String msg; - private AppErrorCode(int code, String msg) { - this.code = code; - this.msg = msg; - } - - public int getCode() { - return code; - } - public String getMsg() { - return msg; - } -} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/hardware/drivers/CmdId.java b/src/main/java/com/iflytop/gd/hardware/drivers/CmdId.java deleted file mode 100644 index 0e8da24..0000000 --- a/src/main/java/com/iflytop/gd/hardware/drivers/CmdId.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.iflytop.gd.hardware.drivers; - - -public enum CmdId { - NotSet(0xFFFF, "NOACTION"),// - - board_reset(0x0000, "复位板子"),// - event_bus_reg_change_report(0x0064, "寄存器修改事件"),// - // - - module_ping(0x0101, "MODULE_PING"), - module_stop(0x0102, "MODULE_STOP"), - - module_get_error(0x0110, "MODULE_GET_ERROR"), - module_get_detail_error(0x0111, "MODULE_GET_DETAIL_ERROR"), - module_clear_error(0x0112, "MODULE_CLEAR_ERROR"), - - module_set_reg(0x0120, "MODULE_SET_REG"), - module_get_reg(0x0121, "MODULE_GET_REG"), - module_reset_reg(0x0123, "MODULE_RESET_REG"), - - module_get_version(0x0130, "MODULE_GET_VERSION"), - module_get_type(0x0131, "MODULE_GET_TYPE"), - module_get_status(0x0132, "MODULE_GET_STATUS"), - - // 扩展板 - extboard_read_inio(0x6701, "EXTBOARD_READ_INIO"),// - extboard_write_outio(0x6702, "EXTBOARD_WRITE_OUTIO"),// - extboard_read_muti_inio(0x6703, "EXTBOARD_READ_MUTI_INIO"),// - extboard_read_inio_index_in_stm32(0x6704, "EXTBOARD_READ_INIO_INDEX_IN_STM32"),// - extboard_read_outio_index_in_stm32(0x6705, "EXTBOARD_READ_OUTIO_INDEX_IN_STM32"),// - extboard_read_outio(0x6706, "EXTBOARD_READ_OUTIO"),// - - // 补光灯模块 - module_pwm_light_on(0x0204, "MODULE_PWM_LIGHT_ON"), // 补光灯 开启 - module_pwm_light_off(0x0205, "MODULE_PWM_LIGHT_OFF"), // 补光灯 - - // 三色灯模块 - module_tricolor_light_on(0x0206, "MODULE_TRICOLOR_LIGHT_ON"), // 三色灯开启 - module_tricolor_light_off(0x0207, "MODULE_TRICOLOR_LIGHT_OFF"), // 三色灯 - - // IO 板卡 1 - module_io1_read_heat_rod_current(0x0207, "MODULE_IO_READ_HEAT_ROD_CURRENT"), // 读取加热棒电流 - - // IO 板卡 2 - - // 电机通用控制 - step_motor_enable(0x0201, "STEP_MOTOR_ENABLE"),// - step_motor_read_pos(0x020b, "STEP_MOTOR_READ_POS"),// - step_motor_read_enc_pos(0x020c, "STEP_MOTOR_READ_ENC_POS"),// - step_motor_easy_rotate(0x0211, "STEP_MOTOR_EASY_ROTATE"),// - step_motor_easy_move_by(0x0212, "STEP_MOTOR_EASY_MOVE_BY"),// - step_motor_easy_move_to(0x0213, "STEP_MOTOR_EASY_MOVE_TO"),// - step_motor_easy_move_to_zero(0x0214, "STEP_MOTOR_EASY_MOVE_TO_ZERO"),// - step_motor_easy_set_current_pos(0x0215, "STEP_MOTOR_EASY_SET_CURRENT_POS"),// - step_motor_easy_move_to_io(0x0216, "STEP_MOTOR_EASY_MOVE_TO_IO"),// - step_motor_stop(0x0228, "STEP_MOTOR_STOP"),// - step_motor_move_by(0x021d, "STEP_MOTOR_MOVE_BY"), // (dpos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high) - step_motor_move_to(0x021e, "STEP_MOTOR_MOVE_TO"), // (pos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high) - step_motor_move_to_zero_point_quick(0x021f, "STEP_MOTOR_MOVE_TO_ZERO_POINT_QUICK"), // (speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high) - step_motor_rotate(0x0220, "STEP_MOTOR_ROTATE"), // - - step_motor_active_cfg(0x0229, "STEP_MOTOR_ACTIVE_CFG"),// - step_motor_read_io_state(0x022a, "STEP_MOTOR_READ_IO_STATE"),// - step_motor_easy_move_to_end_point(0x022c, "STEP_MOTOR_EASY_MOVE_TO_END_POINT"),// - step_motor_read_tmc5130_status(0x0232, "STEP_MOTOR_READ_TMC5130_STATUS"),// - step_motor_read_tmc5130_state(0x0233, "STEP_MOTOR_READ_TMC5130_STATE"),// - step_motor_read_io_index_in_stm32(0x0238, "STEP_MOTOR_READ_IO_INDEX_IN_STM32"),// - step_motor_set_subdevice_reg(0x0239, "STEP_MOTOR_SET_SUBDEVICE_REG"),// - step_motor_get_subdevice_reg(0x023a, "STEP_MOTOR_GET_SUBDEVICE_REG"),// - step_motor_easy_reciprocating_motion(0x022d, "STEP_MOTOR_EASY_RECIPROCATING_MOTION"),// - step_motor_easy_move_to_zero_point_quick(0x022e, "STEP_MOTOR_EASY_MOVE_TO_ZERO_POINT_QUICK"), - - - ; - - public final static int ATTACH_IS_BYTES = 1; - public final static int ATTACH_IS_INT32 = 2; - public final int index; - public final String name; - - CmdId(int index, String chname) { - this.index = index; - this.name = chname; - } - - public int toInt() { - return index; - } - - public static CmdId valueOf(int val) { - CmdId[] values = CmdId.values(); - for (CmdId e : values) { - if (e.toInt() == val) - return e; - } - return null; - } - - public static String toString(int val) { - CmdId[] values = CmdId.values(); - for (CmdId e : values) { - if (e.toInt() == val) { - return e.toString(); - } - } - return "unknown(" + val + ")"; - } - - public String getName() { - return name; - } - - public Boolean eq(Integer index) { - return this.index == index; - } - - - public boolean isTrace() { - return true; - } -} diff --git a/src/main/java/com/iflytop/gd/hardware/drivers/CommandBus.java b/src/main/java/com/iflytop/gd/hardware/drivers/CommandBus.java deleted file mode 100644 index bbc0c0f..0000000 --- a/src/main/java/com/iflytop/gd/hardware/drivers/CommandBus.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.iflytop.gd.hardware.drivers; - -import com.iflytop.gd.common.exception.CommandExecTimeoutException; -import com.iflytop.gd.common.exception.HardwareErrorException; -import com.iflytop.gd.hardware.model.DataPacket; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -public interface CommandBus { - - /** - * 发送命令数据包并等待响应 - * @param commandPacket 命令数据包 - * @param timeout 等待超时事件 - * @param unit 超时时间单位 - * @return 响应数据包 - * @throws Exception - */ - DataPacket waitForCommandExec(DataPacket commandPacket, Integer timeout, TimeUnit unit) - throws CommandExecTimeoutException, HardwareErrorException, IOException, InterruptedException; -} diff --git a/src/main/java/com/iflytop/gd/hardware/drivers/ModuleId.java b/src/main/java/com/iflytop/gd/hardware/drivers/ModuleId.java deleted file mode 100644 index 01770bd..0000000 --- a/src/main/java/com/iflytop/gd/hardware/drivers/ModuleId.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.iflytop.gd.hardware.drivers; - -public enum ModuleId { - NotSet(0, "未设置"), - IO1Board(10, "台面 IO 板模块"), - PWMLight(11, "PWM 灯"), - TriColorLight(12, "三色灯"), - - IO2Board(30, "台下 IO 板模块"), - - DoorBoard(80, "门电机板模块"),// - DoorM(81, "门电机"), - - ShakeModBoard(90, "摇匀模组板"), // - ShakeModShakeM(91, "加液位摇匀电机"), // - - CapStorageBoard(100, "拍子存放板模块"), // - CapStorageM(101, "拍子存放电机"), // - - DualRobotAxis1Board(110, "双轴机械臂1轴板模块"),// - DualRobotAxis1M(111, "双轴机械臂1轴电机"), - DualRobotAxis2Board(120, "双轴机械臂2轴板模块"),// - DualRobotAxis2M(121, "双轴机械臂2轴电机"), - - HBotXBoard(130, "X轴板模块"),// - HBotXM(131, "X轴电机"), - HBotYBoard(140, "Y轴板模块"),// - HBotYM(141, "Y轴电机"), - HBotZBoard(150, "Z轴板模块"),// - HBotZM(151, "Z轴电机"), - - Heater1Board(160, "加热1板模块"),// - Heater1M(161, "加热1电机"), - Heater2Board(170, "加热2板模块"),// - Heater2M(171, "加热2电机"), - Heater3Board(180, "加热3板模块"),// - Heater3M(181, "加热3电机"), - Heater4Board(190, "加热4板模块"),// - Heater4M(191, "加热4电机"), - Heater5Board(200, "加热5板模块"),// - Heater5M(201, "加热5电机"), - Heater6Board(210, "加热6板模块"),// - Heater6M(211, "加热6电机"), - - AcidPump1Board(220, "加酸泵1板模块"),// - AcidPump1M(221, "加酸泵1电机"), - AcidPump2Board(230, "加酸泵2板模块"),// - AcidPump2M(231, "加酸泵2电机"), - AcidPump3Board(240, "加酸泵3板模块"),// - AcidPump3M(241, "加酸泵3电机"), - AcidPump4Board(250, "加酸泵4板模块"),// - AcidPump4M(251, "加酸泵4电机"), - AcidPump5Board(260, "泵5板模块"),// - AcidPump5M(261, "泵5电机"), - AcidPump6Board(270, "泵6板模块"),// - AcidPump6M(271, "泵6电机"), - AcidPump7Board(280, "泵7板模块"),// - AcidPump7M(281, "泵7电机"), - AcidPump8Board(290, "泵8板模块"),// - AcidPump8M(291, "泵8电机"), - ; - - final public String name; - final public int index; - - ModuleId(int index, String name) { - this.name = name; - this.index = index; - } - - public int toInt() { - return index; - } - - - public static ModuleId valueOf(Integer val) { - return valueOf(val.intValue()); - } - - public static ModuleId valueOf(int val) { - ModuleId[] values = ModuleId.values(); - for (ModuleId e : values) { - if (e.toInt() == val) - return e; - } - return null; - } - - public static String toString(int val) { - ModuleId[] values = ModuleId.values(); - for (ModuleId e : values) { - if (e.toInt() == val) { - return e.toString(); - } - } - return "unknown(" + val + ")"; - } -} diff --git a/src/main/java/com/iflytop/gd/hardware/drivers/RegIndex.java b/src/main/java/com/iflytop/gd/hardware/drivers/RegIndex.java deleted file mode 100644 index 3a1079e..0000000 --- a/src/main/java/com/iflytop/gd/hardware/drivers/RegIndex.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.iflytop.gd.hardware.drivers; - -/** - * @brief 寄存器索引 - */ -public enum RegIndex { - - /*********************************************************************************************************************** - * 步进电机控制器 * - ***********************************************************************************************************************/ - /*********************************************************************************************************************** - * step_motor start * - ***********************************************************************************************************************/ - - kreg_step_motor_pos(10101), // 机器人x坐标 - kreg_step_motor_is_enable(10102), // 是否使能 - kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移 - kreg_step_motor_has_move_zero(10104), // 是否回零 - // kreg_step_motor_shift(10150), // x偏移 - kreg_step_motor_shaft(10151), // x轴是否反转 - kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数 - kreg_step_motor_one_circle_pulse_denominator(10153), // 设置一圈脉冲数的分母 - kreg_step_motor_default_velocity(10154), // 默认速度 - kreg_step_motor_low_velocity(10155), // 低速 - kreg_step_motor_mid_velocity(10156), // 中速 - kreg_step_motor_high_velocity(10157), // 高速 - kreg_step_motor_ihold(10158), // 步进电机电流配置 - kreg_step_motor_irun(10159), // 步进电机电流配置 - kreg_step_motor_iholddelay(10160), // 步进电机电流配置 - kreg_step_motor_iglobalscaler(10161), // 步进电机电流配置 - kreg_step_motor_mres(10162), // 电机细分 - kreg_step_motor_run_to_zero_speed(10173), // 回零速度 - kreg_step_motor_look_zero_edge_speed(10175), // 找零边缘速度 - kreg_step_motor_max_d(10178), // 最大限制距离 - kreg_step_motor_min_d(10179), // 最小限制距离 - kreg_step_motor_in_debug_mode(10180), // 驱动器处于调试模式 - kreg_step_motor_vstart(10181), // a1起作用的速度 - kreg_step_motor_a1(10182), // - kreg_step_motor_amax(10183), // - kreg_step_motor_v1(10184), // - kreg_step_motor_dmax(10185), // - kreg_step_motor_d1(10186), // - kreg_step_motor_vstop(10187), // - kreg_step_motor_tzerowait(10188), // - kreg_step_motor_enc_resolution(10189), // 编码器分辨率 1000,1024,4000,4096,16384 - kreg_step_motor_enable_enc(10190), // - kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式 - kret_step_motor_pos_devi_tolerance(10192), // 位置偏差容忍度 - kret_step_motor_io_trigger_append_distance(10193), // 移动到io时,附加的距离 - - /*********************************************************************************************************************** - * step_motor end * - ***********************************************************************************************************************/ - ; - - public final int index; - public final Boolean trace; - - RegIndex(int regIndex) { - this.index = regIndex; - this.trace = true; - } - - RegIndex(int regIndex, Boolean trace) { - this.index = regIndex; - this.trace = trace; - } - - public static RegIndex valueOf(int val) { - RegIndex[] values = RegIndex.values(); - for (RegIndex regindex : values) { - if (regindex.index == val) { - return regindex; - } - } - return null; - } -} diff --git a/src/main/java/com/iflytop/gd/hardware/drivers/WebSocketCommandBusImpl.java b/src/main/java/com/iflytop/gd/hardware/drivers/WebSocketCommandBusImpl.java index 4cd9c7f..98d9ad6 100644 --- a/src/main/java/com/iflytop/gd/hardware/drivers/WebSocketCommandBusImpl.java +++ b/src/main/java/com/iflytop/gd/hardware/drivers/WebSocketCommandBusImpl.java @@ -5,6 +5,7 @@ import com.iflytop.gd.common.exception.CommandExecTimeoutException; import com.iflytop.gd.common.exception.HardwareErrorException; import com.iflytop.gd.hardware.model.DataPacket; import com.iflytop.gd.common.utils.ByteArray; +import com.iflytop.gd.hardware.type.CommandBus; import jakarta.annotation.PostConstruct; import jakarta.websocket.*; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/iflytop/gd/hardware/factory/A8kPacketFactory.java b/src/main/java/com/iflytop/gd/hardware/factory/A8kPacketFactory.java new file mode 100644 index 0000000..d565ae0 --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/factory/A8kPacketFactory.java @@ -0,0 +1,53 @@ +package com.iflytop.gd.hardware.factory; + + + +import com.iflytop.gd.hardware.type.A8kPacket; +import com.iflytop.gd.hardware.type.CmdId; + +import java.util.List; + +public class A8kPacketFactory { + + //typedef struct { + // uint8_t packetType; + // uint16_t cmdid; + // uint8_t moduleId; + // uint8_t index; + // uint8_t datalen; + // uint8_t data[]; + // /* int8_t checksum;*/ + //} zcr_cmd_header_t; + + static public A8kPacket buildPacket(Integer moduleId, int packetType, Integer cmdId, Integer[] params) { + return A8kPacket.createPacket(moduleId, packetType, cmdId, params); + } + + static public A8kPacket buildCMDPacket(Integer moduleId, Integer cmdId, Integer[] params) { + return buildPacket(moduleId, (byte) 0, cmdId, params); + } + + static public A8kPacket buildCMDPacket(Integer moduleId, Integer cmdId, List params) { + Integer[] array = new Integer[params.size()]; + params.toArray(array); + return buildPacket(moduleId, A8kPacket.PACKET_TYPE_CMD, cmdId, array); + } + + static public A8kPacket buildReportPacket(Integer moduleId, Integer cmdId, Integer[] params) { + return buildPacket(moduleId, (byte) 3, cmdId, params); + } + + // static public A8kPacket build_event_a8000_idcard_online() { + // return buildReportPacket(MId.A8kIdCardReader.toInt(), CmdId.event_a8000_idcard_online.index, new Integer[0]); + // } + // + // static public A8kPacket build_event_a8000_idcard_offline() { + // return buildReportPacket(MId.A8kIdCardReader.toInt(), CmdId.event_a8000_idcard_offline.index, new Integer[0]); + // } + + public static void main(String[] args) { + var packet = buildCMDPacket(1, CmdId.module_get_reg.toInt(), List.of(1, 2, 3)); + System.out.println(packet.toByteString()); + } +} + diff --git a/src/main/java/com/iflytop/gd/hardware/type/A8kPacket.java b/src/main/java/com/iflytop/gd/hardware/type/A8kPacket.java new file mode 100644 index 0000000..aec759e --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/type/A8kPacket.java @@ -0,0 +1,227 @@ +package com.iflytop.gd.hardware.type; + +import com.iflytop.gd.hardware.utils.ByteArray; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class A8kPacket { + + //#pragma pack(push, 1) + //typedef struct { + // uint8_t packetType; + // uint16_t cmdid; + // uint8_t moduleId; + // uint16_t index; + // uint8_t datalen; + // uint8_t data[]; + // /* int8_t checksum;*/ + //} zcr_cmd_header_t; + // + //#pragma pack(pop) + //typedef enum { + // kptv2_cmd = 0xA0, + // kptv2_ack = 0xA1, + // kptv2_error_ack = 0xA2, + // kptv2_event = 0xA3, + //} zcan_cmd_packet_type_t; + // + + /** + * + * @WARNING + * 1. 修改这里时,需要注意连同createPacket一起修改 + * 2. PACKET_MIN_LEN 比Header多一个字节,是因为还有一个字节的校验位 + */ + + public static final int PACKET_TYPE_OFFSET = 0; + public static final int CMDID_OFFSET = 1; + public static final int MODULE_ID_OFFSET = 3; + public static final int INDEX_OFFSET = 4; + public static final int DATA_LEN_OFFSET = 6; + public static final int DATA_OFFSET = 7; + + public static final int PACKET_MIN_LEN = 8;// + + public static final int CMD_OVERTIME = 1500; + + + public static final int PACKET_TYPE_CMD = 0xA0; + public static final int PACKET_TYPE_ACK = 0xA1; + public static final int PACKET_TYPE_ERROR_ACK = 0xA2; + public static final int PACKET_TYPE_EVENT = 0xA3; + + public static final Logger logger = LoggerFactory.getLogger(A8kPacket.class); + + byte[] raw; + + public A8kPacket(byte[] cmd) { + raw = new byte[cmd.length]; + System.arraycopy(cmd, 0, raw, 0, cmd.length); + } + + public void setPacketIndex(int packetIndex) { + ByteArray.setU16bit(raw, INDEX_OFFSET, packetIndex); + int checkcode = computeCheckcode(); + ByteArray.setU8(raw, raw.length - 1, checkcode); + } + + + public int getPacketIndex() { + return ByteArray.readU16bit(raw, INDEX_OFFSET); + } + + public int getCmdId() { + return ByteArray.readU16bit(raw, CMDID_OFFSET); + } + + public int getPacketType() { + return ByteArray.readU8bit(raw, PACKET_TYPE_OFFSET); + } + + public int getModuleId() { + return ByteArray.readU8bit(raw, MODULE_ID_OFFSET); + } + + public int getDataLen() { + return ByteArray.readU8bit(raw, DATA_LEN_OFFSET); + } + + public byte[] getCmdContent() { + if (raw.length < PACKET_MIN_LEN) { + return new byte[0]; + } + byte[] cmdcontent = new byte[getDataLen()]; + System.arraycopy(raw, DATA_OFFSET, cmdcontent, 0, getDataLen()); + return cmdcontent; + } + + public int getContentI32(int index) { + return ByteArray.read32bit(raw, DATA_OFFSET + index * 4); + } + + public int getCheckcode() { + return ByteArray.readU8bit(raw, raw.length - 1); + } + + public int computeCheckcode() { + int checkcode = 0; + for (int i = 0; i < raw.length - 1; i++) { + checkcode += raw[i]; + } + return checkcode & 0xFF; + } + + public String toByteString() { + return ByteArray.toByteString(raw); + } + + public String toString() { + int packetType = getPacketType(); + String ret = ""; + + CmdId cmdId = CmdId.valueOf(getCmdId()); + Assert.isTrue(cmdId != null, "cmdId is null"); + if (packetType == PACKET_TYPE_CMD) { + + if (cmdId.equals(CmdId.module_get_reg) || cmdId.equals(CmdId.module_set_reg)) { + RegIndex regIndex = RegIndex.valueOf(getContentI32(0)); + if (regIndex != null) { + ret = String.format("[CMD ] index:[%d] %s %s %s(%d) %d", getPacketIndex(), cmdId, + MId.valueOf(getModuleId()), regIndex, regIndex.index, getContentI32(1)); + } else { + ret = String.format("[CMD ] index:[%d] %s unkown_index(%d) %d", getPacketIndex(), cmdId, + getContentI32(0), getContentI32(1)); + } + } else { + if (cmdId.getCmdAttachType() == CmdId.ATTACH_IS_INT32) { + ret = String.format("[CMD ] index:[%d] (%s %s(%d) :param:[%s])", getPacketIndex(), cmdId, + MId.valueOf(getModuleId()), getModuleId(), formatInt32ATTACH(getCmdContent())); + } else { + ret = String.format("[CMD ] index:[%d] (%s %s(%d) :param:[%s])", getPacketIndex(), cmdId, + MId.valueOf(getModuleId()), getModuleId(), ByteArray.toByteString(getCmdContent())); + } + } + + } else if (packetType == PACKET_TYPE_ACK) { + if (cmdId.getReceiptAttachType() == CmdId.ATTACH_IS_INT32) { + ret = String.format("[ACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, + formatInt32ATTACH(getCmdContent())); + } else { + ret = String.format("[ACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, + ByteArray.toByteString(getCmdContent())); + } + } else if (packetType == PACKET_TYPE_ERROR_ACK) { + ret = String.format("[EACK ] index:[%d] (%s :[%s])", getPacketIndex(), cmdId, (getContentI32(0))); + } else if (packetType == PACKET_TYPE_EVENT) { + if (cmdId.getCmdAttachType() == CmdId.ATTACH_IS_INT32) { + ret = String.format("[EVENT] index:[%d] (%s %s(%d) :[%s])", getPacketIndex(), cmdId, + MId.valueOf(getModuleId()), getModuleId(), formatInt32ATTACH(getCmdContent())); + } else { + ret = String.format("[EVENT] index:[%d] (%s %s(%d) :[%s])", getPacketIndex(), cmdId, + MId.valueOf(getModuleId()), getModuleId(), ByteArray.toByteString(getCmdContent())); + } + } else { + ret = String.format("Unknown packet type: %d", packetType); + } + return ret; + } + + private String formatInt32ATTACH(byte[] attach) { + StringBuilder ret = new StringBuilder(); + for (int i = 0; i < attach.length; i += 4) { + if (i + 3 >= attach.length) + break; + if (i != 0) + ret.append(","); + ret.append(String.format("%d", ByteArray.read32bit(attach, i))); + } + return ret.toString(); + } + + public Boolean isSupportPacket() { + CmdId cmdid = CmdId.valueOf(getCmdId()); + if (cmdid == null) { + return false; + } + if (CmdId.module_get_reg.equals(cmdid) || CmdId.module_set_reg.equals(cmdid)) { + if (getPacketType() == PACKET_TYPE_CMD) { + RegIndex regIndex = RegIndex.valueOf(getContentI32(0)); + return regIndex != null; + } + } + return true; + } + + + static public A8kPacket createPacket(Integer moduleId, int packetType, Integer cmdId, Integer[] params) { + int bufferSize = A8kPacket.PACKET_MIN_LEN + 4 * params.length; + ByteBuffer buffer = ByteBuffer.allocate(bufferSize); + buffer.order(ByteOrder.LITTLE_ENDIAN); + buffer.put((byte) (packetType & 0xff)); // packetType + buffer.putShort((short) (cmdId & 0xffff)); // cmdid + buffer.put((byte) (moduleId & 0xFF)); // moduleId + buffer.put((byte) 0x4C); // index + buffer.put((byte) 0x00); // index + buffer.put((byte) (params.length * 4)); // datalen + for (int value : params) { + buffer.putInt(value); + } + // int8_t checksum; + int checksum = 0; + for (int i = 0; i < bufferSize - 1; i++) { + checksum += buffer.get(i); + } + buffer.put((byte) checksum); + return new A8kPacket(buffer.array()); + } + + public static void main(String[] args) { + var packet = createPacket(41, A8kPacket.PACKET_TYPE_CMD, CmdId.module_stop.index, new Integer[]{}); + logger.info("{}", packet.toByteString()); + } + +} diff --git a/src/main/java/com/iflytop/gd/hardware/type/AppErrorCode.java b/src/main/java/com/iflytop/gd/hardware/type/AppErrorCode.java new file mode 100644 index 0000000..e844e08 --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/type/AppErrorCode.java @@ -0,0 +1,21 @@ +package com.iflytop.gd.hardware.type; + +public enum AppErrorCode { + APP_OK(200, "操作成功"), + FAIL(500, "操作失败"), + PARAM_ERROR(400, "参数错误"); + + private int code; + private String msg; + private AppErrorCode(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public int getCode() { + return code; + } + public String getMsg() { + return msg; + } +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/hardware/type/CmdId.java b/src/main/java/com/iflytop/gd/hardware/type/CmdId.java new file mode 100644 index 0000000..8a64a6c --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/type/CmdId.java @@ -0,0 +1,154 @@ +package com.iflytop.gd.hardware.type; + + +public enum CmdId { + NotSet(0xFFFF, "NOACTION"),// + + board_reset(0x0000, "复位板子"),// + event_bus_reg_change_report(0x0064, "寄存器修改事件"),// + // + + module_ping(0x0101, "MODULE_PING"), + module_stop(0x0102, "MODULE_STOP"), + + module_get_error(0x0110, "MODULE_GET_ERROR"), + module_get_detail_error(0x0111, "MODULE_GET_DETAIL_ERROR"), + module_clear_error(0x0112, "MODULE_CLEAR_ERROR"), + + module_set_reg(0x0120, "MODULE_SET_REG"), + module_get_reg(0x0121, "MODULE_GET_REG"), + module_reset_reg(0x0123, "MODULE_RESET_REG"), + + module_get_version(0x0130, "MODULE_GET_VERSION"), + module_get_type(0x0131, "MODULE_GET_TYPE"), + module_get_status(0x0132, "MODULE_GET_STATUS"), + + // 扩展板 + extboard_read_inio(0x6701, "EXTBOARD_READ_INIO"),// + extboard_write_outio(0x6702, "EXTBOARD_WRITE_OUTIO"),// + extboard_read_muti_inio(0x6703, "EXTBOARD_READ_MUTI_INIO"),// + extboard_read_inio_index_in_stm32(0x6704, "EXTBOARD_READ_INIO_INDEX_IN_STM32"),// + extboard_read_outio_index_in_stm32(0x6705, "EXTBOARD_READ_OUTIO_INDEX_IN_STM32"),// + extboard_read_outio(0x6706, "EXTBOARD_READ_OUTIO"),// + + // 补光灯模块 + module_pwm_light_on(0x0204, "MODULE_PWM_LIGHT_ON"), // 补光灯 开启 + module_pwm_light_off(0x0205, "MODULE_PWM_LIGHT_OFF"), // 补光灯 + + // 三色灯模块 + module_tricolor_light_on(0x0206, "MODULE_TRICOLOR_LIGHT_ON"), // 三色灯开启 + module_tricolor_light_off(0x0207, "MODULE_TRICOLOR_LIGHT_OFF"), // 三色灯 + + // IO 板卡 1 + module_io1_read_heat_rod_current(0x0207, "MODULE_IO_READ_HEAT_ROD_CURRENT"), // 读取加热棒电流 + + // IO 板卡 2 + + // 电机通用控制 + step_motor_enable(0x0201, "STEP_MOTOR_ENABLE"),// + step_motor_read_pos(0x020b, "STEP_MOTOR_READ_POS"),// + step_motor_read_enc_pos(0x020c, "STEP_MOTOR_READ_ENC_POS"),// + step_motor_easy_rotate(0x0211, "STEP_MOTOR_EASY_ROTATE"),// + step_motor_easy_move_by(0x0212, "STEP_MOTOR_EASY_MOVE_BY"),// + step_motor_easy_move_to(0x0213, "STEP_MOTOR_EASY_MOVE_TO"),// + step_motor_easy_move_to_zero(0x0214, "STEP_MOTOR_EASY_MOVE_TO_ZERO"),// + step_motor_easy_set_current_pos(0x0215, "STEP_MOTOR_EASY_SET_CURRENT_POS"),// + step_motor_easy_move_to_io(0x0216, "STEP_MOTOR_EASY_MOVE_TO_IO"),// + step_motor_stop(0x0228, "STEP_MOTOR_STOP"),// + step_motor_move_by(0x021d, "STEP_MOTOR_MOVE_BY"), // (dpos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high) + step_motor_move_to(0x021e, "STEP_MOTOR_MOVE_TO"), // (pos,speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high) + step_motor_move_to_zero_point_quick(0x021f, "STEP_MOTOR_MOVE_TO_ZERO_POINT_QUICK"), // (speedlevel)->null speedlevel=0,1,2,3(default,low,mid,high) + step_motor_rotate(0x0220, "STEP_MOTOR_ROTATE"), // + + step_motor_active_cfg(0x0229, "STEP_MOTOR_ACTIVE_CFG"),// + step_motor_read_io_state(0x022a, "STEP_MOTOR_READ_IO_STATE"),// + step_motor_easy_move_to_end_point(0x022c, "STEP_MOTOR_EASY_MOVE_TO_END_POINT"),// + step_motor_read_tmc5130_status(0x0232, "STEP_MOTOR_READ_TMC5130_STATUS"),// + step_motor_read_tmc5130_state(0x0233, "STEP_MOTOR_READ_TMC5130_STATE"),// + step_motor_read_io_index_in_stm32(0x0238, "STEP_MOTOR_READ_IO_INDEX_IN_STM32"),// + step_motor_set_subdevice_reg(0x0239, "STEP_MOTOR_SET_SUBDEVICE_REG"),// + step_motor_get_subdevice_reg(0x023a, "STEP_MOTOR_GET_SUBDEVICE_REG"),// + step_motor_easy_reciprocating_motion(0x022d, "STEP_MOTOR_EASY_RECIPROCATING_MOTION"),// + step_motor_easy_move_to_zero_point_quick(0x022e, "STEP_MOTOR_EASY_MOVE_TO_ZERO_POINT_QUICK"), + + + ; + + public final static int ATTACH_IS_BYTES = 1; + public final static int ATTACH_IS_INT32 = 2; + public final int index; + public final String chName; + + + // public final int cmdAttachType = ATTACH_IS_INT32; + // public final int receiptAttachType = ATTACH_IS_INT32; + // public final boolean trace = true; + // public final boolean actionCmd = true; + + CmdId(int index, String chname) { + this.index = index; + this.chName = chname; + } + + public int toInt() { + return index; + } + + public static CmdId valueOf(int val) { + CmdId[] values = CmdId.values(); + for (CmdId e : values) { + if (e.toInt() == val) + return e; + } + return null; + } + + public static String toString(int val) { + CmdId[] values = CmdId.values(); + for (CmdId e : values) { + if (e.toInt() == val) { + return e.toString(); + } + } + return "unkown(" + val + ")"; + } + + public String getChname() { + return chName; + } + + public Boolean eq(Integer index) { + return this.index == index; + } + + + public int getCmdAttachType() { + return switch (this) { + default -> ATTACH_IS_INT32; + }; + } + + public int getReceiptAttachType() { + return switch (this) { + default -> ATTACH_IS_INT32; + }; + } + + public boolean isTrace() { + return true; + } + + public boolean isActionCmd() { + + return switch (this) { + case module_get_status, + module_get_error, + step_motor_read_io_state, + extboard_read_inio, + extboard_read_muti_inio, + module_get_reg, + module_set_reg -> false; + default -> true; + }; + } +} diff --git a/src/main/java/com/iflytop/gd/hardware/type/CommandBus.java b/src/main/java/com/iflytop/gd/hardware/type/CommandBus.java new file mode 100644 index 0000000..b703d55 --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/type/CommandBus.java @@ -0,0 +1,22 @@ +package com.iflytop.gd.hardware.type; + +import com.iflytop.gd.common.exception.CommandExecTimeoutException; +import com.iflytop.gd.common.exception.HardwareErrorException; +import com.iflytop.gd.hardware.model.DataPacket; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +public interface CommandBus { + + /** + * 发送命令数据包并等待响应 + * @param commandPacket 命令数据包 + * @param timeout 等待超时事件 + * @param unit 超时时间单位 + * @return 响应数据包 + * @throws Exception + */ + DataPacket waitForCommandExec(DataPacket commandPacket, Integer timeout, TimeUnit unit) + throws CommandExecTimeoutException, HardwareErrorException, IOException, InterruptedException; +} diff --git a/src/main/java/com/iflytop/gd/hardware/type/MId.java b/src/main/java/com/iflytop/gd/hardware/type/MId.java new file mode 100644 index 0000000..fe21551 --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/type/MId.java @@ -0,0 +1,98 @@ +package com.iflytop.gd.hardware.type; + +public enum MId { + NotSet(0, "未设置"), + IO1Board(10, "台面 IO 板模块"), + PWMLight(11, "PWM 灯"), + TriColorLight(12, "三色灯"), + + IO2Board(30, "台下 IO 板模块"), + + DoorBoard(80, "门电机板模块"),// + DoorM(81, "门电机"), + + ShakeModBoard(90, "摇匀模组板"), // + ShakeModShakeM(91, "加液位摇匀电机"), // + + CapStorageBoard(100, "拍子存放板模块"), // + CapStorageM(101, "拍子存放电机"), // + + DualRobotAxis1Board(110, "双轴机械臂1轴板模块"),// + DualRobotAxis1M(111, "双轴机械臂1轴电机"), + DualRobotAxis2Board(120, "双轴机械臂2轴板模块"),// + DualRobotAxis2M(121, "双轴机械臂2轴电机"), + + HBotXBoard(130, "X轴板模块"),// + HBotXM(131, "X轴电机"), + HBotYBoard(140, "Y轴板模块"),// + HBotYM(141, "Y轴电机"), + HBotZBoard(150, "Z轴板模块"),// + HBotZM(151, "Z轴电机"), + + Heater1Board(160, "加热1板模块"),// + Heater1M(161, "加热1电机"), + Heater2Board(170, "加热2板模块"),// + Heater2M(171, "加热2电机"), + Heater3Board(180, "加热3板模块"),// + Heater3M(181, "加热3电机"), + Heater4Board(190, "加热4板模块"),// + Heater4M(191, "加热4电机"), + Heater5Board(200, "加热5板模块"),// + Heater5M(201, "加热5电机"), + Heater6Board(210, "加热6板模块"),// + Heater6M(211, "加热6电机"), + + AcidPump1Board(220, "加酸泵1板模块"),// + AcidPump1M(221, "加酸泵1电机"), + AcidPump2Board(230, "加酸泵2板模块"),// + AcidPump2M(231, "加酸泵2电机"), + AcidPump3Board(240, "加酸泵3板模块"),// + AcidPump3M(241, "加酸泵3电机"), + AcidPump4Board(250, "加酸泵4板模块"),// + AcidPump4M(251, "加酸泵4电机"), + AcidPump5Board(260, "泵5板模块"),// + AcidPump5M(261, "泵5电机"), + AcidPump6Board(270, "泵6板模块"),// + AcidPump6M(271, "泵6电机"), + AcidPump7Board(280, "泵7板模块"),// + AcidPump7M(281, "泵7电机"), + AcidPump8Board(290, "泵8板模块"),// + AcidPump8M(291, "泵8电机"), + ; + + final public String name; + final public int index; + + MId(int index, String name) { + this.name = name; + this.index = index; + } + + public int toInt() { + return index; + } + + + public static MId valueOf(Integer val) { + return valueOf(val.intValue()); + } + + public static MId valueOf(int val) { + MId[] values = MId.values(); + for (MId e : values) { + if (e.toInt() == val) + return e; + } + return null; + } + + public static String toString(int val) { + MId[] values = MId.values(); + for (MId e : values) { + if (e.toInt() == val) { + return e.toString(); + } + } + return "unknown(" + val + ")"; + } +} diff --git a/src/main/java/com/iflytop/gd/hardware/type/RegIndex.java b/src/main/java/com/iflytop/gd/hardware/type/RegIndex.java new file mode 100644 index 0000000..a195ded --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/type/RegIndex.java @@ -0,0 +1,78 @@ +package com.iflytop.gd.hardware.type; + +/** + * @brief 寄存器索引 + */ +public enum RegIndex { + + /*********************************************************************************************************************** + * 步进电机控制器 * + ***********************************************************************************************************************/ + /*********************************************************************************************************************** + * step_motor start * + ***********************************************************************************************************************/ + + kreg_step_motor_pos(10101), // 机器人x坐标 + kreg_step_motor_is_enable(10102), // 是否使能 + kreg_step_motor_dpos(10103), // 执行完上一条指令后的相对位移 + kreg_step_motor_has_move_zero(10104), // 是否回零 + // kreg_step_motor_shift(10150), // x偏移 + kreg_step_motor_shaft(10151), // x轴是否反转 + kreg_step_motor_one_circle_pulse(10152), // x轴一圈脉冲数 + kreg_step_motor_one_circle_pulse_denominator(10153), // 设置一圈脉冲数的分母 + kreg_step_motor_default_velocity(10154), // 默认速度 + kreg_step_motor_low_velocity(10155), // 低速 + kreg_step_motor_mid_velocity(10156), // 中速 + kreg_step_motor_high_velocity(10157), // 高速 + kreg_step_motor_ihold(10158), // 步进电机电流配置 + kreg_step_motor_irun(10159), // 步进电机电流配置 + kreg_step_motor_iholddelay(10160), // 步进电机电流配置 + kreg_step_motor_iglobalscaler(10161), // 步进电机电流配置 + kreg_step_motor_mres(10162), // 电机细分 + kreg_step_motor_run_to_zero_speed(10173), // 回零速度 + kreg_step_motor_look_zero_edge_speed(10175), // 找零边缘速度 + kreg_step_motor_max_d(10178), // 最大限制距离 + kreg_step_motor_min_d(10179), // 最小限制距离 + kreg_step_motor_in_debug_mode(10180), // 驱动器处于调试模式 + kreg_step_motor_vstart(10181), // a1起作用的速度 + kreg_step_motor_a1(10182), // + kreg_step_motor_amax(10183), // + kreg_step_motor_v1(10184), // + kreg_step_motor_dmax(10185), // + kreg_step_motor_d1(10186), // + kreg_step_motor_vstop(10187), // + kreg_step_motor_tzerowait(10188), // + kreg_step_motor_enc_resolution(10189), // 编码器分辨率 1000,1024,4000,4096,16384 + kreg_step_motor_enable_enc(10190), // + kreg_step_motor_dzero_pos(10191), // 驱动器处于调试模式 + kret_step_motor_pos_devi_tolerance(10192), // 位置偏差容忍度 + kret_step_motor_io_trigger_append_distance(10193), // 移动到io时,附加的距离 + + /*********************************************************************************************************************** + * step_motor end * + ***********************************************************************************************************************/ + ; + + public final int index; + public final Boolean trace; + + RegIndex(int regIndex) { + this.index = regIndex; + this.trace = true; + } + + RegIndex(int regIndex, Boolean trace) { + this.index = regIndex; + this.trace = trace; + } + + public static RegIndex valueOf(int val) { + RegIndex[] values = RegIndex.values(); + for (RegIndex regindex : values) { + if (regindex.index == val) { + return regindex; + } + } + return null; + } +} diff --git a/src/main/java/com/iflytop/gd/hardware/utils/ByteArray.java b/src/main/java/com/iflytop/gd/hardware/utils/ByteArray.java new file mode 100644 index 0000000..2527ba9 --- /dev/null +++ b/src/main/java/com/iflytop/gd/hardware/utils/ByteArray.java @@ -0,0 +1,124 @@ +package com.iflytop.gd.hardware.utils; + +import org.springframework.lang.NonNull; + +public class ByteArray { + public ByteArray() { + } + + public static int readU8bit(byte[] code, int index) { + if (index >= code.length) + return 0; + return code[index] & 255; + } + + public static int readS8bit(byte[] code, int index) { + if (index >= code.length) + return 0; + + return code[index]; + } + + public static int readU16bit(byte[] code, int index) { + if (index + 1 >= code.length) + return 0; + return (code[index + 1] & 255) << 8 | code[index] & 255; + } + + public static void setU16bit(byte[] code, int index, int value) { + code[index + 1] = (byte) (value >> 8); + code[index] = (byte) value; + } + + public static void setU8(byte[] code, int off, int value) { + code[off] = (byte) value; + } + + public static int readS16bit(byte[] code, int index) { + if (index + 1 >= code.length) + return 0; + + return code[index + 1] << 8 | code[index] & 255; + } + + public static int read32bit(byte[] code, int index) { + if (index + 3 >= code.length) + return 0; + return code[index + 3] << 24 | (code[index + 2] & 255) << 16 | (code[index + 1] & 255) << 8 | code[index] & 255; + } + + public static Integer[] read32bitArray(byte[] code) { + int count = code.length / 4; + Integer[] array = new Integer[count]; + for (int i = 0; i < count; i++) { + array[i] = read32bit(code, i * 4); + } + return array; + } + + public static Integer[] read16bitArray(byte[] code) { + int count = code.length / 2; + Integer[] array = new Integer[count]; + for (int i = 0; i < count; i++) { + array[i] = readS16bit(code, i * 2); + } + return array; + } + + public static Integer[] readU16bitArray(byte[] code) { + int count = code.length / 2; + Integer[] array = new Integer[count]; + for (int i = 0; i < count; i++) { + array[i] = readU16bit(code, i * 2); + } + return array; + } + + + public static String toByteString(byte[] arrary) { + StringBuilder sb = new StringBuilder(); + for (byte b : arrary) { + sb.append(String.format("%02X", b)); + } + return sb.toString(); + } + + public static byte[] hexStringToBytes(@NonNull String str) { + if (str.isEmpty()) { + return new byte[0]; + } else { + byte[] byteArray = new byte[str.length() / 2]; + for (int i = 0; i < byteArray.length; i++) { + int high = Character.digit(str.charAt(i * 2), 16); + int low = Character.digit(str.charAt(i * 2 + 1), 16); + if (high == -1 || low == -1) { + return null; + } + byteArray[i] = (byte) (high * 16 + low); + } + return byteArray; + } + } + + + public static byte[] concat(byte[]... arrays) { + int length = 0; + for (byte[] array : arrays) { + length += array.length; + } + + byte[] result = new byte[length]; + int destPos = 0; + for (byte[] array : arrays) { + System.arraycopy(array, 0, result, destPos, array.length); + destPos += array.length; + } + + return result; + } + + // public static void main(String[] args) { + // byte[] bytes = new byte[]{0x01, 0x02, 0x03, 0x04}; + // System.out.println(toByteString(bytes)); + // } +} diff --git a/src/test/java/com/iflytop/gd/infrastructure/drivers/WebSocketCommandBusImplTest.java b/src/test/java/com/iflytop/gd/infrastructure/drivers/WebSocketCommandBusImplTest.java index 5f50a49..844faa2 100644 --- a/src/test/java/com/iflytop/gd/infrastructure/drivers/WebSocketCommandBusImplTest.java +++ b/src/test/java/com/iflytop/gd/infrastructure/drivers/WebSocketCommandBusImplTest.java @@ -1,7 +1,7 @@ package com.iflytop.gd.infrastructure.drivers; -import com.iflytop.gd.hardware.drivers.CmdId; -import com.iflytop.gd.hardware.drivers.ModuleId; +import com.iflytop.gd.hardware.type.CmdId; +import com.iflytop.gd.hardware.type.MId; import com.iflytop.gd.hardware.drivers.WebSocketCommandBusImpl; import com.iflytop.gd.common.exception.CommandExecTimeoutException; import com.iflytop.gd.common.exception.HardwareErrorException; @@ -20,7 +20,7 @@ class WebSocketCommandBusImplTest { WebSocketCommandBusImpl webSocketCommandBus = new WebSocketCommandBusImpl(webSocketUrl, true); webSocketCommandBus.connectToCommandBusWebSocketServer(); - DataPacket dataPacket = DataPacket.createCommandDataPacket(ModuleId.HBotXM.index, CmdId.step_motor_easy_move_to.index, 100); + DataPacket dataPacket = DataPacket.createCommandDataPacket(MId.HBotXM.index, CmdId.step_motor_easy_move_to.index, 100); webSocketCommandBus.waitForCommandExec(dataPacket, 30, TimeUnit.SECONDS); } } \ No newline at end of file