diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2015-02-23 22:25:28 -0500 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2015-02-23 22:25:28 -0500 |
commit | a0bbdc0fea3012448637e04bd775611bda94f2d8 (patch) | |
tree | 6f9c0e62907ce2191a1f94acb9c4ead8c966879a | |
parent | 1fd429217962d5a1758842752f99c7e476c1aa6c (diff) | |
download | gpsd-a0bbdc0fea3012448637e04bd775611bda94f2d8.tar.gz |
Incomplete TOFF display code for gpsmon in NMEA0183 mode.
Fields have been moved to accommodate TOFF but it is not yet displayed.
-rw-r--r-- | gpsmon.c | 17 | ||||
-rw-r--r-- | monitor_nmea0183.c | 36 |
2 files changed, 40 insertions, 13 deletions
@@ -47,6 +47,7 @@ extern const struct gps_type_t driver_nmea0183; /* These are public */ struct gps_device_t session; WINDOW *devicewin; +struct timedelta_t time_offset; bool serial; /* These are private */ @@ -667,23 +668,23 @@ static void gpsmon_hook(struct gps_device_t *device, gps_mask_t changed UNUSED) #if defined(SOCKET_EXPORT_ENABLE) && defined(PPS_ENABLE) if (!serial && str_starts_with((char*)device->lexer.outbuffer, "{\"class\":\"TOFF\",")) { const char *end = NULL; - struct gps_data_t noclobber; - int status = json_pps_read((const char *)device->lexer.outbuffer, - &noclobber, + int status = json_toff_read((const char *)device->lexer.outbuffer, + &session.gpsdata, &end); if (status != 0) { /* FIXME: figure out why using json_error_string() core dumps */ complain("Ill-formed TOFF packet: %d", status); buf[0] = '\0'; } else { - /* someday we'll display this data */ + /*@-type -noeffect@*/ /* splint is confused about struct timespec */ if (!curses_active) (void)fprintf(stderr, "TOFF clock=%ld.%09ld real=%ld.%09ld\n", - (long)noclobber.toff.clock.tv_sec, - (long)noclobber.toff.clock.tv_nsec, - (long)noclobber.toff.real.tv_sec, - (long)noclobber.toff.real.tv_nsec); + (long)session.gpsdata.toff.clock.tv_sec, + (long)session.gpsdata.toff.clock.tv_nsec, + (long)session.gpsdata.toff.real.tv_sec, + (long)session.gpsdata.toff.real.tv_nsec); + /*@+type +noeffect@*/ } } else if (!serial && str_starts_with((char*)device->lexer.outbuffer, "{\"class\":\"PPS\",")) { const char *end = NULL; diff --git a/monitor_nmea0183.c b/monitor_nmea0183.c index 4eac611a..cf79f23b 100644 --- a/monitor_nmea0183.c +++ b/monitor_nmea0183.c @@ -93,12 +93,15 @@ static bool nmea_initialize(void) (void)wattrset(gpgsawin, A_BOLD); #define MODE_LINE 1 (void)mvwprintw(gpgsawin, MODE_LINE, 1, "Mode: "); -#define SATS_LINE 2 - (void)mvwprintw(gpgsawin, SATS_LINE, 1, "Sats: "); -#define DOP_LINE 3 +#define SATS_LINE 1 +#define SATS_COL 10 + (void)mvwprintw(gpgsawin, SATS_LINE, SATS_COL, "Sats: "); +#define DOP_LINE 2 (void)mvwprintw(gpgsawin, DOP_LINE, 1, "DOP: H= V= P="); #define PPS_LINE 4 (void)mvwprintw(gpgsawin, PPS_LINE, 1, "PPS: "); +#define TOFF_LINE 3 + (void)mvwprintw(gpgsawin, TOFF_LINE, 1, "TOFF: "); #ifndef PPS_ENABLE (void)mvwaddstr(gpgsawin, PPS_LINE, 6, "N/A"); #endif /* PPS_ENABLE */ @@ -305,13 +308,36 @@ static void nmea_update(void) if (strcmp(fields[0], "GPGSA") == 0 || strcmp(fields[0], "GNGSA") == 0 || strcmp(fields[0], "GLGSA") == 0) { - (void)mvwprintw(gpgsawin, MODE_LINE, 7, "%1s %s", fields[1], fields[2]); - monitor_satlist(gpgsawin, SATS_LINE, 7); + (void)mvwprintw(gpgsawin, MODE_LINE, 7, "%1s%s", fields[1], fields[2]); + monitor_satlist(gpgsawin, SATS_LINE, SATS_COL+6); (void)mvwprintw(gpgsawin, DOP_LINE, 8, "%-5s", fields[16]); (void)mvwprintw(gpgsawin, DOP_LINE, 16, "%-5s", fields[17]); (void)mvwprintw(gpgsawin, DOP_LINE, 24, "%-5s", fields[15]); monitor_fixframe(gpgsawin); } + + /*@-compdef@*/ + /*@-type -noeffect@*/ /* splint is confused about struct timespec */ + if ((session.gpsdata.set & TOFF_SET) != 0) { + /* NOTE: can not use double here due to precision requirements */ + struct timespec timedelta; + TS_SUB(&timedelta, + &session.gpsdata.toff.clock, &session.gpsdata.toff.real); + if ( 86400 < (long)labs(timedelta.tv_sec) ) { + /* more than one day off, overflow */ + /* need a bigger field to show it */ + (void)mvwprintw(gpgsawin, TOFF_LINE, 7, "> 1 day"); + } else { + char buf[TIMESPEC_LEN]; + timespec_str( &timedelta, buf, sizeof(buf) ); + (void)mvwprintw(gpgsawin, TOFF_LINE, 7, "%s", buf); + } + (void)wnoutrefresh(gpgsawin); + } + /*@+type +noeffect@*/ + /*@+compdef@*/ + + if (strcmp(fields[0], "GPGGA") == 0 || strcmp(fields[0], "GNGGA") == 0 || strcmp(fields[0], "GLGGA") == 0) { |