yincheng.zhong
2 天以前 567085ead3f6adaabd884f16ab4b17c62e8f0403
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
/*******************************************************************************
 * File Name         : PythonLink.h
 * Description       : Python通信链路模块 - 用于发送GPS/IMU数据到Python程序
 * Created on        : 2025-11-13
 * Author            : Auto-generated
 *******************************************************************************/
 
#ifndef FML_PYTHONLINK_H_
#define FML_PYTHONLINK_H_
 
/*******************************************************************************
 *                              Include Files                                  *
 *******************************************************************************/
#include "HIDO_TypeDef.h"
#include "GPS.h"
 
/*******************************************************************************
 *                                  Macro                                      *
 *******************************************************************************/
// 协议帧格式常量
#define PYTHONLINK_FRAME_HEADER1        0xAA    // 帧头1
#define PYTHONLINK_FRAME_HEADER2        0x55    // 帧头2
#define PYTHONLINK_FRAME_FOOTER1        0x0D    // 帧尾1 (CR)
#define PYTHONLINK_FRAME_FOOTER2        0x0A    // 帧尾2 (LF)
 
// 数据类型定义 (保留以兼容旧版)
#define PYTHONLINK_TYPE_GPS             0x01    // GPS数据包 (已停用)
#define PYTHONLINK_TYPE_IMU             0x02    // IMU数据包 (已停用)
#define PYTHONLINK_TYPE_CONTROL         0x10    // 控制命令包 (Python->STM32)
 
// 缓冲区大小
#define PYTHONLINK_TX_BUF_SIZE          2048    // 发送缓冲区 (增大以减少 DMA 发送队列溢出/丢包)
#define PYTHONLINK_RX_BUF_SIZE          1024     // 接收缓冲区 (增大以适应DMA循环缓冲)
 
// 调试选项: 置1则发送固定内容以排查乱码
#define PYTHONLINK_FORCE_FIXED_PAYLOAD  0
 
// ASCII 输出关键字
#define PYTHONLINK_ASCII_KEY_CTRL       "CTRL"
#define PYTHONLINK_ASCII_KEY_POSE       "POSE"
#define PYTHONLINK_ASCII_KEY_STACK      "STACK"
#define PYTHONLINK_ASCII_KEY_STATE      "STATE"
 
/*******************************************************************************
 *                             Type Definition                                 *
 *******************************************************************************/
 
/**
 * @brief GPS数据包结构 (用于发送到Python)
 * 包含: 航向角、经纬度、东北天速度、定位质量等
 */
typedef struct __attribute__((packed))
{
    HIDO_DOUBLE m_dLatitude;             // 纬度(°), 正数为北纬
    HIDO_DOUBLE m_dLongitude;            // 经度(°), 正数为东经
    HIDO_FLOAT m_fHeadingAngle;          // 航向角(°), 0~360
    HIDO_FLOAT m_fPitchAngle;            // 俯仰角(°)
    HIDO_FLOAT m_fRollAngle;             // 横滚角(°)
    HIDO_FLOAT m_fEastVelocity;          // 东方向速度(m/s)
    HIDO_FLOAT m_fNorthVelocity;         // 北方向速度(m/s)
    HIDO_FLOAT m_fUpVelocity;            // 天顶方向速度(m/s)
    HIDO_FLOAT m_fAltitude;              // 高程(m)
    HIDO_UINT32 m_u32UTCTime;            // UTC时间, hhmmss格式
    HIDO_UINT8 m_u8PositionQuality;      // 定位质量: 0=无效,1=单点,2=差分,4=固定,5=浮点
    HIDO_UINT8 m_u8SatelliteCount;       // 卫星数量
    HIDO_UINT8 m_u8Reserved[2];          // 保留字节(对齐)
} ST_PythonLink_GPS;
 
/**
 * @brief IMU数据包结构 (用于发送到Python)
 * 包含: 三轴加速度、三轴角速度、温度
 */
typedef struct __attribute__((packed))
{
    HIDO_FLOAT m_fAccelX;                // X轴加速度(g)
    HIDO_FLOAT m_fAccelY;                // Y轴加速度(g)
    HIDO_FLOAT m_fAccelZ;                // Z轴加速度(g)
    HIDO_FLOAT m_fGyroX;                 // X轴角速度(°/s)
    HIDO_FLOAT m_fGyroY;                 // Y轴角速度(°/s)
    HIDO_FLOAT m_fGyroZ;                 // Z轴角速度(°/s)
    HIDO_FLOAT m_fTemperature;           // 传感器温度(℃)
    HIDO_UINT32 m_u32UTCTime;            // UTC时间, hhmmss.sss格式(毫秒)
} ST_PythonLink_IMU;
 
/**
 * @brief 数据帧头结构
 */
typedef struct __attribute__((packed))
{
    HIDO_UINT8 m_u8Header1;              // 帧头1 (0xAA)
    HIDO_UINT8 m_u8Header2;              // 帧头2 (0x55)
    HIDO_UINT8 m_u8Type;                 // 数据类型
    HIDO_UINT16 m_u16Length;             // 数据长度(payload)
} ST_PythonLink_FrameHeader;
 
/**
 * @brief 数据帧尾结构
 */
typedef struct __attribute__((packed))
{
    HIDO_UINT16 m_u16CRC;                // CRC16校验
    HIDO_UINT8 m_u8Footer1;              // 帧尾1 (0x0D)
    HIDO_UINT8 m_u8Footer2;              // 帧尾2 (0x0A)
} ST_PythonLink_FrameFooter;
 
/**
 * @brief 控制命令包结构 (Python -> STM32)
 * 包含: 转向PWM和油门PWM值
 */
typedef struct __attribute__((packed))
{
    HIDO_UINT16 m_u16SteeringPWM;        // 转向PWM值 (1000~2000us)
    HIDO_UINT16 m_u16ThrottlePWM;        // 油门PWM值 (1000~2000us)
} ST_PythonLink_Control;
 
typedef struct __attribute__((packed))
{
    HIDO_FLOAT m_fForwardMps;
    HIDO_FLOAT m_fTurnRate;
} ST_PythonLink_ControlFeedback;
 
/*******************************************************************************
 *                             Global Function                                 *
 *******************************************************************************/
 
/**
 * @brief 初始化 PythonLink 模块
 *        - 配置 UART5 DMA 发送和接收
 *        - 初始化内部缓冲区
 * @return HIDO_OK: 成功, HIDO_ERR: 失败
 */
HIDO_INT32 PythonLink_Init(HIDO_VOID);
 
/**
 * @brief PythonLink 轮询函数 (在主循环中定期调用)
 *        - 处理接收数据(接收Python控制命令)
 *        - 解析控制命令并应用到PWM输出
 * @return 无
 */
HIDO_VOID PythonLink_Poll(HIDO_VOID);
 
/**
 * @brief 获取最新的控制命令
 * @param _pu16SteeringPWM: 转向PWM值输出指针 (1000~2000us)
 * @param _pu16ThrottlePWM: 油门PWM值输出指针 (1000~2000us)
 * @param _pu32Timestamp: 时间戳输出指针 (ms)
 * @return HIDO_TRUE: 有有效命令, HIDO_FALSE: 无有效命令
 */
HIDO_BOOL PythonLink_GetControl(HIDO_UINT16 *_pu16SteeringPWM, 
                                 HIDO_UINT16 *_pu16ThrottlePWM,
                                 HIDO_UINT32 *_pu32Timestamp);
 
/**
 * @brief 发送GPS数据包到Python
 *        - 自动封装为协议帧并通过DMA发送
 *        - 适用于10Hz GPS数据更新
 * @param _pstGPRMI: GPRMI数据结构指针
 * @return HIDO_OK: 成功, HIDO_ERR: 失败
 */
HIDO_INT32 PythonLink_SendGPSData(const ST_GPRMI *_pstGPRMI);
 
/**
 * @brief 发送IMU数据包到Python
 *        - 自动封装为协议帧并通过DMA发送
 *        - 适用于100Hz IMU数据更新
 * @param _pstGPIMU: GPIMU数据结构指针
 * @return HIDO_OK: 成功, HIDO_ERR: 失败
 */
HIDO_INT32 PythonLink_SendIMUData(const ST_GPIMU *_pstGPIMU);
 
/**
 * @brief ASCII 输出:控制量/频率/阶段
 */
HIDO_VOID PythonLink_ReportControl(HIDO_FLOAT _forward_mps,
                                   HIDO_FLOAT _turn_rate,
                                   HIDO_FLOAT _freq_hz,
                                   HIDO_UINT16 _steering_pwm,
                                   HIDO_UINT16 _throttle_pwm,
                                   const HIDO_CHAR *_pcStage,
                                   HIDO_UINT32 _timestamp_ms,
                                   const HIDO_FLOAT *_pos_enu,
                                   HIDO_FLOAT _heading_deg,
                                   HIDO_FLOAT _target_heading_deg,
                                   const HIDO_FLOAT *_target_xy);
/**
 * @brief ASCII 输出:姿态/位置/目标点
 */
HIDO_VOID PythonLink_ReportPose(const HIDO_FLOAT _enu[3],
                                HIDO_FLOAT _heading_deg,
                                HIDO_FLOAT _pitch_deg,
                                HIDO_FLOAT _roll_deg,
                                const HIDO_FLOAT _target_xy[2],
                                HIDO_UINT32 _timestamp_ms);
/**
 * @brief ASCII 输出:算法状态(阶段+误差)
 */
HIDO_VOID PythonLink_ReportState(const HIDO_CHAR *_pcStage,
                                 HIDO_FLOAT _xte_m,
                                 HIDO_FLOAT _heading_err_deg,
                                 HIDO_UINT32 _timestamp_ms);
/**
 * @brief ASCII 输出:堆栈/堆监测
 */
HIDO_VOID PythonLink_ReportStack(const HIDO_CHAR *_pcTaskName,
                                 HIDO_UINT32 _u32StackHighWaterWords,
                                 HIDO_UINT32 _u32HeapFreeBytes,
                                 HIDO_UINT32 _u32HeapMinBytes);
 
/**
 * @brief 获取发送统计信息
 * @param _pu32GPSCount: GPS数据包发送计数
 * @param _pu32IMUCount: IMU数据包发送计数
 * @param _pu32ErrorCount: 发送错误计数
 * @return 无
 */
HIDO_VOID PythonLink_GetStats(HIDO_UINT32 *_pu32GPSCount, 
                               HIDO_UINT32 *_pu32IMUCount, 
                               HIDO_UINT32 *_pu32ErrorCount);
 
/**
 * @brief 打印调试信息
 * @return 无
 */
HIDO_VOID PythonLink_PrintDebugInfo(HIDO_VOID);
HIDO_VOID PythonLink_PrintRxDebug(HIDO_VOID);
 
#endif /* FML_PYTHONLINK_H_ */