#ifndef DR16_H #define DR16_H #include #include "stm32f4xx_hal.h" #define DR16_OFFLINE_TIME_MS 25 // 遥控器掉线判定时间(legacy 25ms) /* DT7 遥控器 + 图传键鼠数据结构,自 legacy Remote 模块移植 * S1/S2 拨杆:1-上 2-下 3-中(与 legacy 解析保持一致) * 摇杆:364~1684,中值 1024 */ typedef struct { uint16_t rc_r_RL; // 通道0-右摇杆左右 uint16_t rc_r_UD; // 通道1-右摇杆上下 uint16_t rc_l_RL; // 通道2-左摇杆左右 uint16_t rc_l_UD; // 通道3-左摇杆上下 uint8_t s1; // 左侧拨杆 uint8_t s2; // 右侧拨杆 int16_t mouse_rl; // 鼠标X轴速度 int16_t mouse_du; // 鼠标Y轴速度 int16_t mouse_wheel; // 鼠标滚轮 uint8_t mouse_key_l; uint8_t mouse_key_r; uint8_t key_w; uint8_t key_s; uint8_t key_a; uint8_t key_d; uint8_t key_shift; uint8_t key_ctrl; uint8_t key_q; uint8_t key_e; uint8_t key_alpha1; // 图传扩展键 uint8_t key_alpha2; /* 原始按键字节(诊断用,不做位拆分) —— 用来判断"帧里到底有没有键鼠数据": * 官方 dbus.h 的 key_code 是 16 位:bit0..7 = W/S/A/D/Shift/Ctrl/Q/E(=data[14]), * bit8..15 = R/F/G/Z/X/C/V/B(=data[15])。本工程此前只读了 data[14]。 * 拨键盘时这两个字节若非 0 说明数据确实到了;全 0 说明帧里就是空的。 */ uint8_t key_code_lo; // data[14] uint8_t key_code_hi; // data[15] int16_t thumb_wheel; // 遥控器拨轮 /* 按键边沿检测(legacy 语义) */ uint8_t key_push_q; // Q 键按下翻转 uint8_t key_push_e; // E 键按下翻转 uint8_t key_push_shift; // Shift 按下翻转 uint8_t key_push_ctrl; // Ctrl 按下翻转 uint8_t mouse_key_push_r; // 鼠标右键按下瞬间为 1 } dr16_t; extern dr16_t dr16; extern uint8_t dr16_status; // 1-已连接 0-掉线 extern uint8_t dr16_start_flag; // 1-准备启动 2-收到首帧(与 legacy Remote_StartFlag 一致) /* 解析一帧 18 字节原始数据(usart3 接收回调/中断上下文调用) */ extern void dr16_parse(const uint8_t * data); /* 最近收帧 tick(HAL_GetTick),用于掉线检测 */ extern uint32_t dr16_last_tick; extern uint32_t dr16_frame_count; // 收到的帧计数(诊断用) /* 判定遥控器是否掉线 */ extern uint8_t dr16_offline(void); #endif