This commit is contained in:
2025-08-12 14:21:23 -04:00
parent b07ad97186
commit be574ec6f2
5 changed files with 64 additions and 107 deletions

View File

View File

@@ -1 +1 @@
ref: refs/heads/main
4c2820d377d1375e787bcef612f0c32c1427d183

View File

@@ -18,7 +18,7 @@ set(HEAD_HASH)
file(READ "/home/alex/github/ESP-Nodes/ESP-IDF_GPS/build/CMakeFiles/git-data/HEAD" HEAD_CONTENTS LIMIT 1024)
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
set(GIT_DIR "/home/alex/github/ESP-Nodes/.git")
set(GIT_DIR "/home/alex/esp/v5.4.1/esp-idf/.git")
# handle git-worktree
if(EXISTS "${GIT_DIR}/commondir")
file(READ "${GIT_DIR}/commondir" GIT_DIR_NEW LIMIT 1024)

View File

@@ -1 +1 @@
98d60c7dd1d23e6a473b48dce17af996e9db8d3c
4c2820d377d1375e787bcef612f0c32c1427d183

View File

@@ -68,123 +68,80 @@ void app_main(void)
static void read_and_parse_nmea()
{
printf("Example ready\n");
while (1) {
char fmt_buf[32];
// Sentence string to be parsed
//char sentence[] = "$GPGLL,4916.45,N,12311.12,W,225444,A,*1D\r\n";
//char sentence[] = "$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30\r\n";
//char sentence[] = "$GPTXT,01,03,02,u-blox ag - www.u-blox.com*50\r\n";
//char sentence[] = "$GPVTG,054.7,T,034.4,M,005.5,N,010.2,K\r\n";
char sentence[] = "$GPGSV,3,1,11,03,03,111,00,04,15,270,00,06,01,010,00,13,06,292,00*74\r\n";
printf("Parsing NMEA sentence: %s", sentence);
// Pointer to struct containing the parsed data. Should be freed manually.
nmea_s *data;
char *start;
size_t length;
nmea_example_read_line(&start, &length, 100 /* ms */);
if (length == 0) {
continue;
}
// Parse...
data = nmea_parse(sentence, strlen(sentence), 0);
/* handle data */
data = nmea_parse(start, length, 0);
if (data == NULL) {
printf("Failed to parse the sentence!\n");
printf(" Type: %.5s (%d)\n", start + 1, nmea_get_type(start));
} else {
if (data->errors != 0) {
printf("WARN: The sentence struct contains parse errors!\n");
}
if (NMEA_GPGGA == data->type) {
printf("GPGGA sentence\n");
nmea_gpgga_s *gpgga = (nmea_gpgga_s *) data;
printf("Number of satellites: %d\n", gpgga->n_satellites);
printf("Altitude: %f %c\n", gpgga->altitude,
gpgga->altitude_unit);
if(NULL == data) {
printf("Failed to parse sentence!\n");
return -1;
}
if (NMEA_GPGLL == data->type) {
printf("GPGLL sentence\n");
nmea_gpgll_s *pos = (nmea_gpgll_s *) data;
printf("Longitude:\n");
printf(" Degrees: %d\n", pos->longitude.degrees);
printf(" Minutes: %f\n", pos->longitude.minutes);
printf(" Cardinal: %c\n", (char) pos->longitude.cardinal);
printf("Latitude:\n");
printf(" Degrees: %d\n", pos->latitude.degrees);
printf(" Minutes: %f\n", pos->latitude.minutes);
printf(" Cardinal: %c\n", (char) pos->latitude.cardinal);
strftime(fmt_buf, sizeof(fmt_buf), "%H:%M:%S", &pos->time);
printf("Time: %s\n", fmt_buf);
}
nmea_gpgll_s *gpgll = (nmea_gpgll_s *) data;
if (NMEA_GPRMC == data->type) {
printf("GPRMC sentence\n");
nmea_gprmc_s *pos = (nmea_gprmc_s *) data;
printf("GPGLL Sentence\n");
printf("Longitude:\n");
printf(" Degrees: %d\n", pos->longitude.degrees);
printf(" Minutes: %f\n", pos->longitude.minutes);
printf(" Cardinal: %c\n", (char) pos->longitude.cardinal);
printf(" Degrees: %d\n", gpgll->longitude.degrees);
printf(" Minutes: %f\n", gpgll->longitude.minutes);
printf(" Cardinal: %c\n", (char) gpgll->longitude.cardinal);
printf("Latitude:\n");
printf(" Degrees: %d\n", pos->latitude.degrees);
printf(" Minutes: %f\n", pos->latitude.minutes);
printf(" Cardinal: %c\n", (char) pos->latitude.cardinal);
strftime(fmt_buf, sizeof(fmt_buf), "%d %b %T %Y", &pos->date_time);
printf("Date & Time: %s\n", fmt_buf);
printf("Speed, in Knots: %f\n", pos->gndspd_knots);
printf("Track, in degrees: %f\n", pos->track_deg);
printf("Magnetic Variation:\n");
printf(" Degrees: %f\n", pos->magvar_deg);
printf(" Cardinal: %c\n", (char) pos->magvar_cardinal);
double adjusted_course = pos->track_deg;
if (NMEA_CARDINAL_DIR_EAST == pos->magvar_cardinal) {
adjusted_course -= pos->magvar_deg;
} else if (NMEA_CARDINAL_DIR_WEST == pos->magvar_cardinal) {
adjusted_course += pos->magvar_deg;
} else {
printf("Invalid Magnetic Variation Direction!\n");
}
printf("Adjusted Track (heading): %f\n", adjusted_course);
printf(" Degrees: %d\n", gpgll->latitude.degrees);
printf(" Minutes: %f\n", gpgll->latitude.minutes);
printf(" Cardinal: %c\n", (char) gpgll->latitude.cardinal);
}
if (NMEA_GPGSA == data->type) {
nmea_gpgsa_s *gpgsa = (nmea_gpgsa_s *) data;
printf("GPGSA Sentence:\n");
printf(" Mode: %c\n", gpgsa->mode);
printf(" Fix: %d\n", gpgsa->fixtype);
printf(" PDOP: %.2lf\n", gpgsa->pdop);
printf(" HDOP: %.2lf\n", gpgsa->hdop);
printf(" VDOP: %.2lf\n", gpgsa->vdop);
}
if (NMEA_GPGSV == data->type) {
nmea_gpgsv_s *gpgsv = (nmea_gpgsv_s *) data;
printf("GPGSV Sentence:\n");
printf(" Num: %d\n", gpgsv->sentences);
printf(" ID: %d\n", gpgsv->sentence_number);
printf(" SV: %d\n", gpgsv->satellites);
printf(" #1: %d %d %d %d\n", gpgsv->sat[0].prn, gpgsv->sat[0].elevation, gpgsv->sat[0].azimuth, gpgsv->sat[0].snr);
printf(" #2: %d %d %d %d\n", gpgsv->sat[1].prn, gpgsv->sat[1].elevation, gpgsv->sat[1].azimuth, gpgsv->sat[1].snr);
printf(" #3: %d %d %d %d\n", gpgsv->sat[2].prn, gpgsv->sat[2].elevation, gpgsv->sat[2].azimuth, gpgsv->sat[2].snr);
printf(" #4: %d %d %d %d\n", gpgsv->sat[3].prn, gpgsv->sat[3].elevation, gpgsv->sat[3].azimuth, gpgsv->sat[3].snr);
}
if (NMEA_GPTXT == data->type) {
nmea_gptxt_s *gptxt = (nmea_gptxt_s *) data;
printf("GPTXT Sentence:\n");
printf(" ID: %d %d %d\n", gptxt->id_00, gptxt->id_01, gptxt->id_02);
printf(" %s\n", gptxt->text);
printf("\tMode: %c\n", gpgsa->mode);
printf("\tFix: %d\n", gpgsa->fixtype);
printf("\tPDOP: %.2lf\n", gpgsa->pdop);
printf("\tHDOP: %.2lf\n", gpgsa->hdop);
printf("\tVDOP: %.2lf\n", gpgsa->vdop);
}
if (NMEA_GPVTG == data->type) {
nmea_gpvtg_s *gpvtg = (nmea_gpvtg_s *) data;
printf("GPVTG Sentence:\n");
printf(" Track [deg]: %.2lf\n", gpvtg->track_deg);
printf(" Speed [kmph]: %.2lf\n", gpvtg->gndspd_kmph);
printf(" Speed [knots]: %.2lf\n", gpvtg->gndspd_knots);
printf("\tTrack [deg]: %.2lf\n", gpvtg->track_deg);
printf("\tSpeed [kmph]: %.2lf\n", gpvtg->gndspd_kmph);
printf("\tSpeed [knots]: %.2lf\n", gpvtg->gndspd_knots);
}
if (NMEA_GPTXT == data->type) {
nmea_gptxt_s *gptxt = (nmea_gptxt_s *) data;
printf("GPTXT Sentence:\n");
printf("\tID: %d %d %d\n", gptxt->id_00, gptxt->id_01, gptxt->id_02);
printf("\t%s\n", gptxt->text);
}
if (NMEA_GPGSV == data->type) {
nmea_gpgsv_s *gpgsv = (nmea_gpgsv_s *) data;
printf("GPGSV Sentence:\n");
printf("\tNum: %d\n", gpgsv->sentences);
printf("\tID: %d\n", gpgsv->sentence_number);
printf("\tSV: %d\n", gpgsv->satellites);
printf("\t#1: %d %d %d %d\n", gpgsv->sat[0].prn, gpgsv->sat[0].elevation, gpgsv->sat[0].azimuth, gpgsv->sat[0].snr);
printf("\t#2: %d %d %d %d\n", gpgsv->sat[1].prn, gpgsv->sat[1].elevation, gpgsv->sat[1].azimuth, gpgsv->sat[1].snr);
printf("\t#3: %d %d %d %d\n", gpgsv->sat[2].prn, gpgsv->sat[2].elevation, gpgsv->sat[2].azimuth, gpgsv->sat[2].snr);
printf("\t#4: %d %d %d %d\n", gpgsv->sat[3].prn, gpgsv->sat[3].elevation, gpgsv->sat[3].azimuth, gpgsv->sat[3].snr);
}
nmea_free(data);
}
}
}