mirror of
https://github.com/goldenfishs/MRobot.git
synced 2026-04-01 05:17:13 +08:00
解决不更新
This commit is contained in:
172
assets/User_code/module/cmd/cmd_behavior.c
Normal file
172
assets/User_code/module/cmd/cmd_behavior.c
Normal file
@@ -0,0 +1,172 @@
|
||||
/*
|
||||
* CMD 模块 V2 - 行为处理器实现
|
||||
*/
|
||||
#include "cmd_behavior.h"
|
||||
#include "cmd.h"
|
||||
#include "module/gimbal.h"
|
||||
#include <string.h>
|
||||
|
||||
/* ========================================================================== */
|
||||
/* 行为回调函数 */
|
||||
/* ========================================================================== */
|
||||
|
||||
/* 行为处理函数实现 */
|
||||
int8_t CMD_Behavior_Handle_FORE(CMD_t *ctx) {
|
||||
ctx->output.chassis.cmd.ctrl_vec.vy += ctx->config->sensitivity.move_sens;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_BACK(CMD_t *ctx) {
|
||||
ctx->output.chassis.cmd.ctrl_vec.vy -= ctx->config->sensitivity.move_sens;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_LEFT(CMD_t *ctx) {
|
||||
ctx->output.chassis.cmd.ctrl_vec.vx -= ctx->config->sensitivity.move_sens;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_RIGHT(CMD_t *ctx) {
|
||||
ctx->output.chassis.cmd.ctrl_vec.vx += ctx->config->sensitivity.move_sens;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_ACCELERATE(CMD_t *ctx) {
|
||||
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;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_DECELERATE(CMD_t *ctx) {
|
||||
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;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_FIRE(CMD_t *ctx) {
|
||||
ctx->output.shoot.cmd.firecmd = true;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_FIRE_MODE(CMD_t *ctx) {
|
||||
ctx->output.shoot.cmd.mode = (ctx->output.shoot.cmd.mode + 1) % SHOOT_MODE_NUM;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_ROTOR(CMD_t *ctx) {
|
||||
ctx->output.chassis.cmd.mode = CHASSIS_MODE_ROTOR;
|
||||
ctx->output.chassis.cmd.mode_rotor = ROTOR_MODE_RAND;
|
||||
ctx->output.gimbal.cmd.mode = GIMBAL_MODE_RELATIVE;
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_AUTOAIM(CMD_t *ctx) {
|
||||
/* TODO: 自瞄模式切换 */
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_Handle_CHECKSOURCERCPC(CMD_t *ctx) {
|
||||
/* TODO: 切换RC和PC输入源 */
|
||||
if (ctx->active_source == CMD_SRC_PC) {
|
||||
ctx->active_source = CMD_SRC_RC;
|
||||
ctx->output.chassis.source = CMD_SRC_RC;
|
||||
ctx->output.gimbal.source = CMD_SRC_RC;
|
||||
ctx->output.shoot.source = CMD_SRC_RC;
|
||||
} else if(ctx->active_source == CMD_SRC_RC) {
|
||||
ctx->active_source = CMD_SRC_PC;
|
||||
ctx->output.chassis.source = CMD_SRC_PC;
|
||||
ctx->output.gimbal.source = CMD_SRC_PC;
|
||||
ctx->output.shoot.source = CMD_SRC_PC;
|
||||
}
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
/* 行为配置表 - 由宏生成 */
|
||||
static const CMD_BehaviorConfig_t g_behavior_configs[] = {
|
||||
CMD_BEHAVIOR_TABLE(BUILD_BEHAVIOR_CONFIG)
|
||||
};
|
||||
|
||||
/* ========================================================================== */
|
||||
/* API实现 */
|
||||
/* ========================================================================== */
|
||||
|
||||
int8_t CMD_Behavior_Init(void) {
|
||||
/* 当前静态配置,无需初始化 */
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
bool CMD_Behavior_IsTriggered(const CMD_RawInput_t *current,
|
||||
const CMD_RawInput_t *last,
|
||||
const CMD_BehaviorConfig_t *config) {
|
||||
if (config == NULL || current == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool now_pressed = false;
|
||||
bool last_pressed = false;
|
||||
|
||||
// 鼠标特殊按键处理
|
||||
if (config->key == (CMD_KEY_L_CLICK)) {
|
||||
now_pressed = current->pc.mouse.l_click;
|
||||
last_pressed = last ? last->pc.mouse.l_click : false;
|
||||
} else if (config->key == (CMD_KEY_R_CLICK)) {
|
||||
now_pressed = current->pc.mouse.r_click;
|
||||
last_pressed = last ? last->pc.mouse.r_click : false;
|
||||
} else if (config->key == (CMD_KEY_M_CLICK)) {
|
||||
now_pressed = current->pc.mouse.m_click;
|
||||
last_pressed = last ? last->pc.mouse.m_click : false;
|
||||
} else if (config->key == 0) {
|
||||
return false;
|
||||
} else {
|
||||
// 多按键组合检测
|
||||
now_pressed = ((current->pc.keyboard.bitmap & config->key) == config->key);
|
||||
last_pressed = last ? ((last->pc.keyboard.bitmap & config->key) == config->key) : false;
|
||||
}
|
||||
|
||||
switch (config->trigger) {
|
||||
case CMD_ACTIVE_PRESSED:
|
||||
return now_pressed;
|
||||
case CMD_ACTIVE_RISING_EDGE:
|
||||
return now_pressed && !last_pressed;
|
||||
case CMD_ACTIVE_FALLING_EDGE:
|
||||
return !now_pressed && last_pressed;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
int8_t CMD_Behavior_ProcessAll(CMD_t *ctx,
|
||||
const CMD_RawInput_t *current,
|
||||
const CMD_RawInput_t *last,
|
||||
CMD_ModuleMask_t active_modules) {
|
||||
if (ctx == NULL || current == NULL) {
|
||||
return CMD_ERR_NULL;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < BEHAVIOR_CONFIG_COUNT; i++) {
|
||||
const CMD_BehaviorConfig_t *config = &g_behavior_configs[i];
|
||||
|
||||
/* 过滤模块掩码 */
|
||||
if ((config->module_mask & active_modules) == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* 检查是否触发 */
|
||||
if (CMD_Behavior_IsTriggered(current, last, config)) {
|
||||
if (config->handler != NULL) {
|
||||
config->handler(ctx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return CMD_OK;
|
||||
}
|
||||
|
||||
const CMD_BehaviorConfig_t* CMD_Behavior_GetConfig(CMD_Behavior_t behavior) {
|
||||
for (size_t i = 0; i < BEHAVIOR_CONFIG_COUNT; i++) {
|
||||
if (g_behavior_configs[i].behavior == behavior) {
|
||||
return &g_behavior_configs[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
Reference in New Issue
Block a user