summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2015-02-23 22:25:28 -0500
committerEric S. Raymond <esr@thyrsus.com>2015-02-23 22:25:28 -0500
commita0bbdc0fea3012448637e04bd775611bda94f2d8 (patch)
tree6f9c0e62907ce2191a1f94acb9c4ead8c966879a
parent1fd429217962d5a1758842752f99c7e476c1aa6c (diff)
downloadgpsd-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.c17
-rw-r--r--monitor_nmea0183.c36
2 files changed, 40 insertions, 13 deletions
diff --git a/gpsmon.c b/gpsmon.c
index 91f773a6..e7dfe99c 100644
--- a/gpsmon.c
+++ b/gpsmon.c
@@ -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) {