From d5d9628cf20fe73cd44fd56fbbb38cdf734a3b5c Mon Sep 17 00:00:00 2001 From: xxxxm <2389287465@qq.com> Date: Mon, 16 Mar 2026 22:06:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86pc=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E5=92=8C=E6=8C=89=E9=94=AE=E8=A1=8C=E4=B8=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- User/module/cmd/cmd.c | 26 ++++++++------------- User/module/cmd/cmd_adapter.c | 1 + User/module/cmd/cmd_behavior.c | 41 ++++++++++++++++++++++++++-------- User/module/cmd/cmd_types.h | 21 ++++++++--------- User/module/config.c | 4 ++-- User/module/shoot.c | 6 ++--- User/task/blink.c | 5 +++++ User/task/rc.c | 15 +++++++++++++ 8 files changed, 78 insertions(+), 41 deletions(-) diff --git a/User/module/cmd/cmd.c b/User/module/cmd/cmd.c index 1b96cb0..e60c015 100644 --- a/User/module/cmd/cmd.c +++ b/User/module/cmd/cmd.c @@ -233,14 +233,14 @@ static void CMD_NUC_BuildShootCmd(CMD_t *ctx) { ctx->output.shoot.cmd.firecmd = false; break; case 2: - if (ctx->input.rc.sw[1]==CMD_SW_DOWN) { - ctx->output.shoot.cmd.ready = true; - ctx->output.shoot.cmd.firecmd = true; - }else { - ctx->output.shoot.cmd.ready = true; - ctx->output.shoot.cmd.firecmd = false; - } - + if ((ctx->active_source == CMD_SRC_PC && ctx->input.pc.mouse.l_click) || + (ctx->active_source == CMD_SRC_RC && ctx->input.rc.sw[1] == CMD_SW_DOWN)) { + ctx->output.shoot.cmd.ready = true; + ctx->output.shoot.cmd.firecmd = true; + } else { + ctx->output.shoot.cmd.ready = true; + ctx->output.shoot.cmd.firecmd = false; + } break; } } @@ -388,19 +388,11 @@ static void CMD_PC_BuildBalanceChassisCmd(CMD_t *ctx) { ctx->output.balance_chassis.cmd.mode = CHASSIS_MODE_WHELL_LEG_BALANCE; float vx = 0.0f, wz = 0.0f; - uint32_t kb = ctx->input.pc.keyboard.bitmap; - - //案件的命令要放到behavior里, - // if (kb & CMD_KEY_W) vx += sens->move_sens; - // if (kb & CMD_KEY_S) vx -= sens->move_sens; - // if (kb & CMD_KEY_A) wz += sens->move_sens; - // if (kb & CMD_KEY_D) wz -= sens->move_sens; - // if (kb & CMD_KEY_SHIFT) { vx *= sens->move_fast_mult; wz *= sens->move_fast_mult; } - // if (kb & CMD_KEY_CTRL) { vx *= sens->move_slow_mult; wz *= sens->move_slow_mult; } ctx->output.balance_chassis.cmd.move_vec.vx = vx; ctx->output.balance_chassis.cmd.move_vec.wz = wz; ctx->output.balance_chassis.cmd.move_vec.vy = 0.0f; + } #endif /* CMD_ENABLE_SRC_PC && CMD_ENABLE_MODULE_BALANCE_CHASSIS */ #if CMD_ENABLE_SRC_NUC && CMD_ENABLE_MODULE_REFUI diff --git a/User/module/cmd/cmd_adapter.c b/User/module/cmd/cmd_adapter.c index ca92383..9638392 100644 --- a/User/module/cmd/cmd_adapter.c +++ b/User/module/cmd/cmd_adapter.c @@ -64,6 +64,7 @@ int8_t CMD_DR16_PC_GetInput(void *data, CMD_RawInput_t *output) { /* PC端鼠标映射 */ output->pc.mouse.x = dr16->data.mouse.x; output->pc.mouse.y = dr16->data.mouse.y; + output->pc.mouse.z = dr16->data.mouse.z; output->pc.mouse.l_click = dr16->data.mouse.l_click; output->pc.mouse.r_click = dr16->data.mouse.r_click; diff --git a/User/module/cmd/cmd_behavior.c b/User/module/cmd/cmd_behavior.c index 32e6d65..e47e96a 100644 --- a/User/module/cmd/cmd_behavior.c +++ b/User/module/cmd/cmd_behavior.c @@ -3,6 +3,7 @@ */ #include "cmd_behavior.h" #include "cmd.h" +#include "module/balance_chassis.h" #if CMD_ENABLE_MODULE_GIMBAL #include "module/gimbal.h" #endif @@ -16,6 +17,9 @@ int8_t CMD_Behavior_Handle_FORE(CMD_t *ctx) { #if CMD_ENABLE_MODULE_CHASSIS ctx->output.chassis.cmd.ctrl_vec.vy += ctx->config->sensitivity.move_sens; +#endif +#if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.move_vec.vy += ctx->config->sensitivity.move_sens; #endif return CMD_OK; } @@ -23,6 +27,9 @@ int8_t CMD_Behavior_Handle_FORE(CMD_t *ctx) { int8_t CMD_Behavior_Handle_BACK(CMD_t *ctx) { #if CMD_ENABLE_MODULE_CHASSIS ctx->output.chassis.cmd.ctrl_vec.vy -= ctx->config->sensitivity.move_sens; +#endif +#if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.move_vec.vy -= ctx->config->sensitivity.move_sens; #endif return CMD_OK; } @@ -30,6 +37,9 @@ int8_t CMD_Behavior_Handle_BACK(CMD_t *ctx) { int8_t CMD_Behavior_Handle_LEFT(CMD_t *ctx) { #if CMD_ENABLE_MODULE_CHASSIS ctx->output.chassis.cmd.ctrl_vec.vx -= ctx->config->sensitivity.move_sens; +#endif +#if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.move_vec.vx -= ctx->config->sensitivity.move_sens; #endif return CMD_OK; } @@ -37,6 +47,9 @@ int8_t CMD_Behavior_Handle_LEFT(CMD_t *ctx) { int8_t CMD_Behavior_Handle_RIGHT(CMD_t *ctx) { #if CMD_ENABLE_MODULE_CHASSIS ctx->output.chassis.cmd.ctrl_vec.vx += ctx->config->sensitivity.move_sens; +#endif +#if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.move_vec.vx += ctx->config->sensitivity.move_sens; #endif return CMD_OK; } @@ -45,14 +58,17 @@ int8_t CMD_Behavior_Handle_ACCELERATE(CMD_t *ctx) { #if CMD_ENABLE_MODULE_CHASSIS ctx->output.chassis.cmd.ctrl_vec.vx *= ctx->config->sensitivity.move_fast_mult; ctx->output.chassis.cmd.ctrl_vec.vy *= ctx->config->sensitivity.move_fast_mult; +#endif +#if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.move_vec.vx *= ctx->config->sensitivity.move_fast_mult; + ctx->output.balance_chassis.cmd.move_vec.vy *= ctx->config->sensitivity.move_fast_mult; #endif return CMD_OK; } -int8_t CMD_Behavior_Handle_DECELERATE(CMD_t *ctx) { -#if CMD_ENABLE_MODULE_CHASSIS - ctx->output.chassis.cmd.ctrl_vec.vx *= ctx->config->sensitivity.move_slow_mult; - ctx->output.chassis.cmd.ctrl_vec.vy *= ctx->config->sensitivity.move_slow_mult; +int8_t CMD_Behavior_Handle_CLIMB(CMD_t *ctx) { +#if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.mode = CHASSIS_MODE_CLIMB_STEP; #endif return CMD_OK; } @@ -72,12 +88,15 @@ int8_t CMD_Behavior_Handle_FIRE_MODE(CMD_t *ctx) { } int8_t CMD_Behavior_Handle_ROTOR(CMD_t *ctx) { -#if CMD_ENABLE_MODULE_CHASSIS - ctx->output.chassis.cmd.mode = CHASSIS_MODE_ROTOR; - ctx->output.chassis.cmd.mode_rotor = ROTOR_MODE_RAND; -#endif #if CMD_ENABLE_MODULE_GIMBAL ctx->output.gimbal.cmd.mode = GIMBAL_MODE_RELATIVE; + #if CMD_ENABLE_MODULE_CHASSIS + ctx->output.chassis.cmd.mode = CHASSIS_MODE_ROTOR; + ctx->output.chassis.cmd.mode_rotor = ROTOR_MODE_RAND; + #endif + #if CMD_ENABLE_MODULE_BALANCE_CHASSIS + ctx->output.balance_chassis.cmd.mode = CHASSIS_MODE_BALANCE_ROTOR; + #endif #endif return CMD_OK; } @@ -131,7 +150,11 @@ int8_t CMD_Behavior_Handle_CHECKSOURCERCPC(CMD_t *ctx) { } return CMD_OK; } - +extern bool reset; +int8_t CMD_Behavior_Handle_RESET(CMD_t *ctx) { + reset = !reset; + return CMD_OK; +} /* 行为配置表 - 由宏生成 */ static const CMD_BehaviorConfig_t g_behavior_configs[] = { CMD_BEHAVIOR_TABLE(BUILD_BEHAVIOR_CONFIG) diff --git a/User/module/cmd/cmd_types.h b/User/module/cmd/cmd_types.h index 818a593..24e6454 100644 --- a/User/module/cmd/cmd_types.h +++ b/User/module/cmd/cmd_types.h @@ -252,19 +252,20 @@ typedef enum { /* 行为定义 */ /* ========================================================================== */ /* 行为-按键映射宏表 */ -#define BEHAVIOR_CONFIG_COUNT (11) +#define BEHAVIOR_CONFIG_COUNT (12) #define CMD_BEHAVIOR_TABLE(X) \ - X(FORE, CMD_KEY_W, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ - X(BACK, CMD_KEY_S, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ - X(LEFT, CMD_KEY_A, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ - X(RIGHT, CMD_KEY_D, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ - X(ACCELERATE, CMD_KEY_SHIFT, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ - X(DECELERATE, CMD_KEY_CTRL, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ - X(FIRE, CMD_KEY_L_CLICK, CMD_ACTIVE_PRESSED, CMD_MODULE_SHOOT) \ + X(FORE, CMD_KEY_W, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS|CMD_MODULE_BALANCE_CHASSIS) \ + X(BACK, CMD_KEY_S, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS|CMD_MODULE_BALANCE_CHASSIS) \ + X(LEFT, CMD_KEY_A, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS|CMD_MODULE_BALANCE_CHASSIS) \ + X(RIGHT, CMD_KEY_D, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS|CMD_MODULE_BALANCE_CHASSIS) \ + X(ACCELERATE, CMD_KEY_SHIFT, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS|CMD_MODULE_BALANCE_CHASSIS) \ + X(ROTOR, CMD_KEY_CTRL, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS|CMD_MODULE_BALANCE_CHASSIS) \ + X(FIRE, CMD_KEY_L_CLICK, CMD_ACTIVE_PRESSED, CMD_MODULE_SHOOT) \ X(FIRE_MODE, CMD_KEY_B, CMD_ACTIVE_RISING_EDGE, CMD_MODULE_SHOOT) \ - X(ROTOR, CMD_KEY_E, CMD_ACTIVE_PRESSED, CMD_MODULE_CHASSIS) \ + X(CLIMB, CMD_KEY_R, CMD_ACTIVE_PRESSED, CMD_MODULE_BALANCE_CHASSIS) \ X(AUTOAIM, CMD_KEY_R_CLICK, CMD_ACTIVE_PRESSED, CMD_MODULE_NONE) \ - X(CHECKSOURCERCPC, CMD_KEY_CTRL|CMD_KEY_SHIFT|CMD_KEY_V, CMD_ACTIVE_RISING_EDGE, CMD_MODULE_NONE) + X(CHECKSOURCERCPC,CMD_KEY_CTRL|CMD_KEY_SHIFT|CMD_KEY_V, CMD_ACTIVE_RISING_EDGE, CMD_MODULE_NONE) \ + X(RESET, CMD_KEY_G, CMD_ACTIVE_RISING_EDGE, CMD_MODULE_NONE) /* 触发类型 */ typedef enum { CMD_ACTIVE_PRESSED, /* 按住时触发 */ diff --git a/User/module/config.c b/User/module/config.c index 5a58db8..65f3b20 100644 --- a/User/module/config.c +++ b/User/module/config.c @@ -113,8 +113,8 @@ Config_RobotParam_t robot_config = { .shoot_param = { .basic={ .projectileType=SHOOT_PROJECTILE_17MM, - .fric_num=2, - .extra_deceleration_ratio=1.0f, + .fric_num=2, + .extra_deceleration_ratio=1.0f, .num_trig_tooth=8, .shot_freq=1.0f, .shot_burst_num=3, diff --git a/User/module/shoot.c b/User/module/shoot.c index c9bdee0..4e76a51 100644 --- a/User/module/shoot.c +++ b/User/module/shoot.c @@ -516,7 +516,7 @@ int8_t Shoot_CaluTargetAngle(Shoot_t *s, Shoot_CMD_t *cmd) if (s->param->heatControl.enable && s->heatcontrol.shots_available <= s->param->heatControl.safe_shots) { actual_freq = 0.0f; /* 禁止发弹 */ } - + float dt = s->timer.now - s->var_trig.time_lastShoot; float dpos; dpos = CircleError(s->target_variable.trig_angle, s->var_trig.trig_agl, M_2PI); @@ -971,10 +971,10 @@ int8_t Shoot_Control(Shoot_t *s, Shoot_CMD_t *cmd) s->timer.now = BSP_TIME_Get_us() / 1000000.0f; s->timer.dt = (BSP_TIME_Get_us() - s->timer.lask_wakeup) / 1000000.0f; s->timer.lask_wakeup = BSP_TIME_Get_us(); - // Shoot_CaluTargetRPM(s,233); + Shoot_CaluTargetRPM(s,233); /* 运行热量检测状态机 */ - // Shoot_HeatDetectionFSM(s); + Shoot_HeatDetectionFSM(s); /* 运行卡弹检测状态机 */ Shoot_JamDetectionFSM(s, cmd); diff --git a/User/task/blink.c b/User/task/blink.c index 6d0fd0d..d31b6ca 100644 --- a/User/task/blink.c +++ b/User/task/blink.c @@ -17,6 +17,7 @@ /* USER STRUCT BEGIN */ BUZZER_t buzzer; static uint16_t count; +bool reset=0; /* USER STRUCT END */ /* Private function --------------------------------------------------------- */ @@ -54,6 +55,10 @@ void Task_blink(void *argument) { /* 播放100ms后停止 (50/500Hz = 0.1s) */ BUZZER_Stop(&buzzer); } + if (reset) { + __set_FAULTMASK(1); /* 关闭所有中断 */ + NVIC_SystemReset(); /* 系统复位 */ + } /* USER CODE END */ osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ } diff --git a/User/task/rc.c b/User/task/rc.c index b46ddab..21ba275 100644 --- a/User/task/rc.c +++ b/User/task/rc.c @@ -8,6 +8,7 @@ /* USER INCLUDE BEGIN */ #include "device/dr16.h" #include "device/mrobot.h" +#include "stm32h7xx.h" /* USER INCLUDE END */ /* Private typedef ---------------------------------------------------------- */ @@ -16,6 +17,8 @@ /* Private variables -------------------------------------------------------- */ /* USER STRUCT BEGIN */ DR16_t dr16; +static DR16_SwitchPos_t last_sw_l = DR16_SW_ERR; /* 记录左拨杆上一次状态 */ +extern bool reset; /* USER STRUCT END */ /* Private function --------------------------------------------------------- */ @@ -75,6 +78,18 @@ void Task_rc(void *argument) { osMessageQueueReset(task_runtime.msgq.cmd.rc); osMessageQueuePut(task_runtime.msgq.cmd.rc, &dr16, 0, 0); + /* 检测左拨杆切换到UP位置时触发软件复位 */ + if (dr16.header.online) { + /* 拨杆从非UP状态切换到UP状态,且复位功能已使能,触发系统复位 */ + if ( + dr16.data.sw_l == DR16_SW_UP && + last_sw_l != DR16_SW_UP) { + reset=!reset; + } + + last_sw_l = dr16.data.sw_l; /* 更新拨杆状态 */ + } + /* USER CODE END */ osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ }