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