/*
 * CMD 模块 V2 - 使用示例和配置模板
 * 
 * 本文件展示如何配置和使用新的CMD模块
 */
#include "cmd.h"

/* ========================================================================== */
/*                           配置示例                                          */
/* ========================================================================== */

/* 默认配置 */
static CMD_Config_t g_cmd_config = {
    /* 输入源优先级：RC > PC > NUC > REF */
    .source_priority = {
        CMD_SRC_RC,
        CMD_SRC_PC,
        CMD_SRC_NUC,
        CMD_SRC_REF,
    },
    
    /* 灵敏度设置 */
    .sensitivity = {
        .mouse_sens = 0.8f,
        .move_sens = 1.0f,
        .move_fast_mult = 1.5f,
        .move_slow_mult = 0.5f,
    },
    
    /* RC拨杆模式映射 */
    .rc_mode_map = {
        /* 左拨杆控制底盘模式 */
        .sw_left_up   = CHASSIS_MODE_BREAK,
        .sw_left_mid  = CHASSIS_MODE_FOLLOW_GIMBAL,
        .sw_left_down = CHASSIS_MODE_ROTOR,
        
        /* 用于云台模式 */
        .gimbal_sw_up   = GIMBAL_MODE_ABSOLUTE,
        .gimbal_sw_mid  = GIMBAL_MODE_ABSOLUTE,
        .gimbal_sw_down = GIMBAL_MODE_RELATIVE,
    },
    
    .enable_pc_input = true,
};

/* CMD上下文 */
static CMD_Context_t g_cmd_ctx;

/* ========================================================================== */
/*                           任务示例                                          */
/* ========================================================================== */

/*
 * 初始化示例
 */
void Example_CMD_Init(void) {
    CMD_Init(&g_cmd_ctx, &g_cmd_config);
}

/*
 * 任务循环示例
 */
void Example_CMD_Task(void) {
    /* 一键更新 */
    CMD_Update(&g_cmd_ctx);
    
    /* 获取命令发送到各模块 */
    Chassis_CMD_t *chassis_cmd = CMD_GetChassisCmd(&g_cmd_ctx);
    Gimbal_CMD_t *gimbal_cmd = CMD_GetGimbalCmd(&g_cmd_ctx);
    Shoot_CMD_t *shoot_cmd = CMD_GetShootCmd(&g_cmd_ctx);
    
    /* 使用命令... */
    (void)chassis_cmd;
    (void)gimbal_cmd;
    (void)shoot_cmd;
}

/* ========================================================================== */
/*                   架构说明                                                   */
/* ========================================================================== */

/*
 * ## 新架构优势
 * 
 * ### 1. 统一的输入抽象层 (CMD_RawInput_t)
 * - 所有设备（DR16/AT9S/VT13等）都转换成相同格式
 * - 上层代码无需关心具体设备类型
 * - 添加新设备只需实现适配器，不改动主逻辑
 * 
 * ### 2. 适配器模式
 * - 每个设备一个适配器文件
 * - 实现 Init, GetInput, IsOnline 三个函数
 * - 通过宏选择编译哪个适配器
 * 
 * ### 3. X-Macro配置表
 * - CMD_INPUT_SOURCE_TABLE: 配置输入源
 * - CMD_OUTPUT_MODULE_TABLE: 配置输出模块  
 * - CMD_BEHAVIOR_TABLE: 配置按键行为映射
 * - 编译时生成枚举、配置数组、处理函数
 * 
 * ### 4. 行为驱动设计
 * - 行为与按键解耦
 * - 运行时可修改映射
 * - 支持边沿触发和持续触发
 * 
 * ### 5. 清晰的分层
 * 
 *     ┌──────────────────────────────────────┐
 *     │          应用层 (cmd.c)              │
 *     │  - CMD_Update()                      │
 *     │  - 仲裁、命令生成                     │
 *     └──────────────┬───────────────────────┘
 *                    │
 *     ┌──────────────▼───────────────────────┐
 *     │        行为处理层 (cmd_behavior.c)    │
 *     │  - 按键触发检测                       │
 *     │  - 行为函数调用                       │
 *     └──────────────┬───────────────────────┘
 *                    │
 *     ┌──────────────▼───────────────────────┐
 *     │        抽象输入层 (cmd_types.h)       │
 *     │  - CMD_RawInput_t                    │
 *     │  - 统一的摇杆、开关、键鼠结构          │
 *     └──────────────┬───────────────────────┘
 *                    │
 *     ┌──────────────▼───────────────────────┐
 *     │        适配器层 (cmd_adapter.c)       │
 *     │  - DR16_Adapter                      │
 *     │  - AT9S_Adapter                      │
 *     │  - 设备数据 → CMD_RawInput_t          │
 *     └──────────────────────────────────────┘
 * 
 * ## 扩展指南
 * 
 * ### 添加新遥控器设备
 * 1. 在 cmd_adapter.h 中添加宏定义选项
 * 2. 在 cmd_adapter.c 中实现三个适配器函数
 * 3. 修改 CMD_RC_DEVICE_TYPE 宏选择新设备
 * 
 * ### 添加新输入源（如自定义协议）
 * 1. 在 CMD_INPUT_SOURCE_TABLE 添加条目
 * 2. 实现对应的适配器
 * 3. 在 CMD_GenerateCommands 添加处理分支
 * 
 * ### 添加新行为
 * 1. 在 CMD_BEHAVIOR_TABLE 添加条目
 * 2. 实现 CMD_Behavior_Handle_XXX 函数
 * 
 * ### 添加新输出模块
 * 1. 在 CMD_OUTPUT_MODULE_TABLE 添加条目
 * 2. 在 CMD_Context_t 中添加输出成员
 * 3. 实现对应的 BuildXXXCmd 函数
 */
