# GPS_parser ESP32 Component Componente ESP-IDF para parsear frases NMEA de GPS, diseñado para módulos como el NEO-6M. ## Características - Parser de sentencias NMEA `GGA` y `RMC` - Obtiene ubicación (latitud/longitud), fecha, hora, velocidad, curso, altitud, número de satélites y HDOP - Valida checksum de las sentencias GPS - Compatible con ESP-IDF como componente independiente - Define macros de conversión de unidades para velocidad y distancia ## Requisitos Este componente requiere: - `esp_driver_uart` - `esp_timer` Estas dependencias ya están declaradas en `idf_component.yml`. ## Archivos principales - `GPS_parser.c` — implementación del parser NMEA - `include/GPS_parser.h` — API pública y tipos de datos - `CMakeLists.txt` — registro del componente para ESP-IDF - `idf_component.yml` — metadatos del componente ## Integración en ESP-IDF Coloca este directorio dentro de `components/` de tu proyecto ESP-IDF o agrégalo a `EXTRA_COMPONENT_DIRS`. Luego incluye el header en tu aplicación: ```c #include "GPS_parser.h" ``` El componente se registrará automáticamente con `idf_component_register`. ## Uso básico ```c #include "GPS_parser.h" static gps_parser_t gps; void app_main(void) { gps_parser_init(&gps); // Ejemplo: procesar bytes entrantes del GPS while (true) { char c = obtener_byte_del_gps(); // leer del UART if (gps_parser_encode(&gps, c)) { if (gps_location_is_valid(&gps.location)) { double lat = gps_location_lat(&gps.location); double lng = gps_location_lng(&gps.location); printf("Lat: %.8f, Lng: %.8f\n", lat, lng); } if (gps_date_is_valid(&gps.date) && gps_time_is_valid(&gps.time)) { printf("Fecha: %02u/%02u/%04u Hora: %02u:%02u:%02u\n", gps_date_day(&gps.date), gps_date_month(&gps.date), gps_date_year(&gps.date), gps_time_hour(&gps.time), gps_time_minute(&gps.time), gps_time_second(&gps.time)); } } } } ``` ## API principal ### Inicialización `void gps_parser_init(gps_parser_t *gps); ` Inicializa la estructura del parser. Debe llamarse antes de procesar cualquier byte. ### Procesado de datos `bool gps_parser_encode(gps_parser_t *gps, char c); ` Procesa un carácter NMEA recibido. Devuelve `true` cuando una sentencia completa con checksum válido ha sido recibida. ### Lectura de ubicación - `bool gps_location_is_valid(const gps_location_t *location);` - `bool gps_location_is_updated(const gps_location_t *location);` - `uint32_t gps_location_age(const gps_location_t *location);` - `double gps_location_lat(const gps_location_t *location);` - `double gps_location_lng(const gps_location_t *location);` - `char gps_location_fix_quality(const gps_location_t *location);` - `char gps_location_fix_mode(const gps_location_t *location);` ### Fecha y hora - `bool gps_date_is_valid(const gps_date_t *date);` - `uint16_t gps_date_year(const gps_date_t *date);` - `uint8_t gps_date_month(const gps_date_t *date);` - `uint8_t gps_date_day(const gps_date_t *date);` - `bool gps_time_is_valid(const gps_time_t *time);` - `uint8_t gps_time_hour(const gps_time_t *time);` - `uint8_t gps_time_minute(const gps_time_t *time);` - `uint8_t gps_time_second(const gps_time_t *time);` - `uint8_t gps_time_centisecond(const gps_time_t *time);` ### Valores numéricos - `bool gps_decimal_is_valid(const gps_decimal_t *value);` - `int32_t gps_decimal_value(const gps_decimal_t *value);` - `gps_integer_t *gps_get_satellites(gps_parser_t *gps);` ### Estadísticas y contadores - `uint32_t gps_parser_chars_processed(const gps_parser_t *gps);` - `uint32_t gps_parser_sentences_with_fix(const gps_parser_t *gps);` - `uint32_t gps_parser_failed_checksum(const gps_parser_t *gps);` - `uint32_t gps_parser_passed_checksum(const gps_parser_t *gps);` ## Conversión de unidades Macros disponibles en `GPS_parser.h`: - `GPS_PARSER_MPH_PER_KNOT` - `GPS_PARSER_MPS_PER_KNOT` - `GPS_PARSER_KMPH_PER_KNOT` - `GPS_PARSER_MILES_PER_METER` - `GPS_PARSER_KM_PER_METER` - `GPS_PARSER_FEET_PER_METER` ## Notas - El parser maneja principalmente sentencias `GGA` y `RMC`. - Los valores de fecha/hora y coordenadas se actualizan solo cuando se recibe una sentencia con checksum válido. - `gps_parser_millis()` usa `esp_timer_get_time()` para calcular el tiempo en milisegundos.