yincheng.zhong
3 天以前 30303d366d1a0d857357c90bed876686f2d1e603
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
/*******************************************************************************
 * 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数据包 (10Hz)
#define PYTHONLINK_TYPE_IMU             0x02    // IMU数据包 (100Hz)
#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
 
/*******************************************************************************
 *                             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;
 
/*******************************************************************************
 *                             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 获取发送统计信息
 * @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_ */