|
|
@@ -0,0 +1,142 @@
|
|
|
+# 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.
|