dacowars 4 semanas atrás
pai
commit
884b01b7e0
1 arquivos alterados com 142 adições e 0 exclusões
  1. 142 0
      README.md

+ 142 - 0
README.md

@@ -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.