/*******************************************************************************
|
* 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_ */
|