STM_ATEM/User/gps_driver.h
zhoujie 29cc814384 feat(scripts): 新增光泵磁力仪数据支持与混流解析
- 新增混流解析函数 `parse_mixed_stream()`,支持标准包与光泵包交替出现的二进制文件
- 新增光泵磁力仪模拟器 `OpticMagSimulatorThread`,以可配置频率发送BCD帧
- 新增光泵磁场显示标签页,支持文件模式与实时模式下的磁场曲线绘制
- 新增 `flash_counter` 模块,用于NOFX模式下文件序号持久化

♻️ refactor(data_storage): 重构数据存储目录与文件命名策略

- 会话目录改为按GPS日期命名(YYYYMMDD),无GPS时使用NOFX目录
- 文件命名改为基于GPS时间(HHMMSS)或Flash计数器(C开头),消除序号文件依赖
- 移除 `config_manager` 依赖和 `PARAM.TXT` 序号文件读写逻辑
- 新增 `GPS_ParseGPRMC()` 解析函数,提取日期字段用于目录命名

🐛 fix(ltc2508_driver): 修复DMA启动失败时资源泄漏问题

- SPI2/SPI3 DMA启动失败时主动停止已启动的DMA,防止资源泄漏
- 将SPI1的dummy发送缓冲区改为static,确保DMA传输期间数据有效

🐛 fix(rs485_driver): 修复DMA发送缓冲区可能被覆盖的问题

- 引入静态发送缓冲区 `s_tx_buf`,隔离调用方数据与DMA传输,防止TIM2 ISR覆盖

♻️ refactor(ATEMParse): 重构数据结构定义与解析逻辑

- 移除硬编码的V1/V2 dtype,改为动态构建 `make_dtype()` 函数
- 新增数据格式选项(GPS经纬度/光泵),支持灵活配置
- 新增文件模式下的分页浏览功能(滑块/上一页/下一页)
- 优化实时模式下的光泵数据显示与表格列过滤
2026-06-14 23:06:25 +08:00

170 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
******************************************************************************
* @file gps_driver.h
* @brief GPS NMEA数据接收和解析驱动
* @author Your Name
* @date 2026-02-07
******************************************************************************
* @attention
*
* 本驱动用于通过USART3接收GPS模块的NMEA数据主要解析GPGGA语句
* 提取时间、经纬度等信息
*
******************************************************************************
*/
#ifndef __GPS_DRIVER_H
#define __GPS_DRIVER_H
#ifdef __cplusplus
extern "C" {
#endif
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
/* Exported types ------------------------------------------------------------*/
/**
* @brief GPS定位状态
*/
typedef enum {
GPS_FIX_INVALID = 0, // 无效定位
GPS_FIX_GPS = 1, // GPS定位
GPS_FIX_DGPS = 2, // 差分GPS定位
GPS_FIX_PPS = 3, // PPS定位
GPS_FIX_RTK = 4, // RTK固定解
GPS_FIX_RTK_FLOAT = 5, // RTK浮点解
GPS_FIX_ESTIMATED = 6, // 估算
GPS_FIX_MANUAL = 7, // 手动输入
GPS_FIX_SIMULATION = 8 // 模拟模式
} GPS_FixStatus_t;
/**
* @brief GPS时间结构体
*/
typedef struct {
uint8_t hour; // 时 (UTC)
uint8_t minute; // 分
uint8_t second; // 秒
uint16_t millisec; // 毫秒
} GPS_Time_t;
/**
* @brief GPS日期结构体来自 GPRMC/GNRMC
*/
typedef struct {
uint8_t day; // 日 (1~31)
uint8_t month; // 月 (1~12)
uint16_t year; // 年 (完整年份,如 2025)
} GPS_Date_t;
/**
* @brief GPS位置结构体
*/
typedef struct {
double latitude; // 纬度 (度)
char lat_direction; // 纬度方向 ('N' or 'S')
double longitude; // 经度 (度)
char lon_direction; // 经度方向 ('E' or 'W')
double altitude; // 海拔高度 (米)
GPS_FixStatus_t fix_status; // 定位状态
uint8_t satellites; // 使用的卫星数量
float hdop; // 水平精度因子
} GPS_Position_t;
/**
* @brief GPS数据结构体
*/
typedef struct {
GPS_Time_t time; // GPS时间来自GPGGA
GPS_Date_t date; // GPS日期来自GPRMC
GPS_Position_t position; // GPS位置
uint8_t data_valid; // 时间与位置有效GPGGA fix > 0
uint8_t date_valid; // 日期有效GPRMC 已收到且 status='A'
uint32_t last_update_tick; // 最后更新时间戳
} GPS_Data_t;
/* Exported constants --------------------------------------------------------*/
#define GPS_UART_HANDLE huart3 // GPS使用的UART句柄
#define GPS_RX_BUFFER_SIZE 512 // 接收缓冲区大小
#define GPS_NMEA_MAX_LENGTH 128 // NMEA语句最大长度
#define GPS_DATA_TIMEOUT_MS 10000 // 数据超时时间(ms)
/* Exported macro ------------------------------------------------------------*/
/* Exported functions prototypes ---------------------------------------------*/
/**
* @brief 初始化GPS驱动
* @retval HAL状态
*/
HAL_StatusTypeDef GPS_Init(void);
/**
* @brief GPS数据接收处理在主循环中调用
* @retval None
*/
void GPS_Process(void);
/**
* @brief 获取GPS数据
* @param gps_data: 指向GPS数据结构体的指针
* @retval 1=数据有效, 0=数据无效或超时
*/
uint8_t GPS_GetData(GPS_Data_t *gps_data);
/**
* @brief 检查GPS数据是否有效
* @retval 1=有效, 0=无效
*/
uint8_t GPS_IsDataValid(void);
/**
* @brief 获取GPS时间字符串
* @param buffer: 输出缓冲区
* @param size: 缓冲区大小
* @retval None
*/
void GPS_GetTimeString(char *buffer, uint16_t size);
/**
* @brief 获取GPS位置字符串
* @param buffer: 输出缓冲区
* @param size: 缓冲区大小
* @retval None
*/
void GPS_GetPositionString(char *buffer, uint16_t size);
/**
* @brief UART接收完成回调函数在stm32f4xx_it.c中调用
* @param huart: UART句柄
* @retval None
*/
void GPS_UART_RxCpltCallback(UART_HandleTypeDef *huart);
/**
* @brief UART空闲中断回调函数在stm32f4xx_it.c中调用
* @param huart: UART句柄
* @retval None
*/
void GPS_UART_IdleCallback(UART_HandleTypeDef *huart);
/**
* @brief 获取GPS日期字符串格式 YYYYMMDD无定位时返回空字符串
* @param buffer: 输出缓冲区至少9字节
* @param size: 缓冲区大小
* @retval None
*/
void GPS_GetDateString(char *buffer, uint16_t size);
#ifdef __cplusplus
}
#endif
#endif /* __GPS_DRIVER_H */