- 新增混流解析函数 `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经纬度/光泵),支持灵活配置 - 新增文件模式下的分页浏览功能(滑块/上一页/下一页) - 优化实时模式下的光泵数据显示与表格列过滤
170 lines
4.7 KiB
C
170 lines
4.7 KiB
C
/**
|
||
******************************************************************************
|
||
* @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 */
|