summaryrefslogtreecommitdiff
path: root/nmeamon.c
diff options
context:
space:
mode:
Diffstat (limited to 'nmeamon.c')
-rw-r--r--nmeamon.c280
1 files changed, 139 insertions, 141 deletions
diff --git a/nmeamon.c b/nmeamon.c
index 89492077..a8581f69 100644
--- a/nmeamon.c
+++ b/nmeamon.c
@@ -94,160 +94,158 @@ static bool nmea_initialize(void)
}
/*@ -globstate -nullpass (splint is confused) */
-static void nmea_update(size_t len)
+static void nmea_update(void)
{
+ static char sentences[NMEA_MAX];
+ char **fields;
+
assert(nmeawin!=NULL);
assert(gpgsawin!=NULL);
assert(gpggawin!=NULL);
assert(gprmcwin!=NULL);
- if (len > 0 && session.packet.outbuflen > 0)
- {
- static char sentences[NMEA_MAX];
- char **fields;
-
- fields = session.driver.nmea.field;
-
- if (session.packet.outbuffer[0] == (unsigned char)'$') {
- int ymax, xmax;
- double now;
- char newid[NMEA_MAX];
- getmaxyx(nmeawin, ymax, xmax);
- (void)strlcpy(newid, (char *)session.packet.outbuffer+1,
- strcspn((char *)session.packet.outbuffer+1, ",")+1);
- if (strstr(sentences, newid) == NULL) {
- char *s_end = sentences + strlen(sentences);
- if ((int)(strlen(sentences) + strlen(newid)) < xmax-2) {
- *s_end++ = ' ';
- (void)strcpy(s_end, newid);
- } else {
- *--s_end = '.';
- *--s_end = '.';
- *--s_end = '.';
- }
- mvwaddstr(nmeawin, SENTENCELINE, 1, sentences);
- }
- /*
- * If the interval between this and last update is
- * the longest we've seen yet, boldify the corresponding
- * tag.
- */
- now = timestamp();
- if (now > last_tick && (now - last_tick) > tick_interval)
- {
- char *findme = strstr(sentences, newid);
-
- tick_interval = now - last_tick;
- if (findme != NULL) {
- mvwchgat(nmeawin, SENTENCELINE, 1, xmax-13, A_NORMAL, 0, NULL);
- mvwchgat(nmeawin,
- SENTENCELINE, 1+(findme-sentences),
- (int)strlen(newid),
- A_BOLD, 0, NULL);
- }
+ fields = session.driver.nmea.field;
+
+ if (session.packet.outbuffer[0] == (unsigned char)'$') {
+ int ymax, xmax;
+ double now;
+ char newid[NMEA_MAX];
+ getmaxyx(nmeawin, ymax, xmax);
+ (void)strlcpy(newid, (char *)session.packet.outbuffer+1,
+ strcspn((char *)session.packet.outbuffer+1, ",")+1);
+ if (strstr(sentences, newid) == NULL) {
+ char *s_end = sentences + strlen(sentences);
+ if ((int)(strlen(sentences) + strlen(newid)) < xmax-2) {
+ *s_end++ = ' ';
+ (void)strcpy(s_end, newid);
+ } else {
+ *--s_end = '.';
+ *--s_end = '.';
+ *--s_end = '.';
}
- last_tick = now;
-
- if (strcmp(newid, "GPGSV") == 0) {
- int i;
-
- for (i = 0; i < session.gpsdata.satellites; i++) {
- (void)wmove(satwin, i+2, 3);
- (void)wprintw(satwin, " %3d %3d%3d %3d",
- session.gpsdata.PRN[i],
- session.gpsdata.azimuth[i],
- session.gpsdata.elevation[i],
- session.gpsdata.ss[i]);
- }
+ mvwaddstr(nmeawin, SENTENCELINE, 1, sentences);
+ }
+
+ /*
+ * If the interval between this and last update is
+ * the longest we've seen yet, boldify the corresponding
+ * tag.
+ */
+ now = timestamp();
+ if (now > last_tick && (now - last_tick) > tick_interval)
+ {
+ char *findme = strstr(sentences, newid);
+
+ tick_interval = now - last_tick;
+ if (findme != NULL) {
+ mvwchgat(nmeawin, SENTENCELINE, 1, xmax-13, A_NORMAL, 0, NULL);
+ mvwchgat(nmeawin,
+ SENTENCELINE, 1+(findme-sentences),
+ (int)strlen(newid),
+ A_BOLD, 0, NULL);
}
+ }
+ last_tick = now;
- if (strcmp(newid, "GPRMC") == 0) {
- /* Not dumped yet: magnetic variation */
- char scr[128];
- if (isnan(session.gpsdata.fix.time)==0) {
- (void)unix_to_iso8601(session.gpsdata.fix.time, scr, sizeof(scr));
- } else
- (void)snprintf(scr, sizeof(scr), "n/a");
- (void)wmove(gprmcwin, 1, 7);
- (void)wclrtoeol(gprmcwin);
- (void)waddstr(gprmcwin, scr);
- fixframe(gprmcwin);
-
- /* Fill in the latitude. */
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.latitude)==0) {
- (void)snprintf(scr, sizeof(scr), "%s %c",
- deg_to_str(deg_ddmmss, fabs(session.gpsdata.fix.latitude)),
- (session.gpsdata.fix.latitude < 0) ? 'S' : 'N');
- } else
- (void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(gprmcwin, 2, 11, "%-17s", scr);
-
- /* Fill in the longitude. */
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.longitude)==0) {
- (void)snprintf(scr, sizeof(scr), "%s %c",
- deg_to_str(deg_ddmmss, fabs(session.gpsdata.fix.longitude)),
- (session.gpsdata.fix.longitude < 0) ? 'W' : 'E');
- } else
- (void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(gprmcwin, 3, 11, "%-17s", scr);
-
- /* Fill in the speed. */
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.track)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f meters/sec", session.gpsdata.fix.speed);
- else
- (void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(gprmcwin, 4, 11, "%-17s", scr);
-
- if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.track)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f deg", session.gpsdata.fix.track);
- else
- (void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(gprmcwin, 5, 11, "%-17s", scr);
-
- /* the status field and FAA code */
- (void)mvwaddstr(gprmcwin, 6, 11, fields[2]);
- (void)mvwaddstr(gprmcwin, 6, 23, fields[12]);
+ if (strcmp(newid, "GPGSV") == 0) {
+ int i;
+
+ for (i = 0; i < session.gpsdata.satellites; i++) {
+ (void)wmove(satwin, i+2, 3);
+ (void)wprintw(satwin, " %3d %3d%3d %3d",
+ session.gpsdata.PRN[i],
+ session.gpsdata.azimuth[i],
+ session.gpsdata.elevation[i],
+ session.gpsdata.ss[i]);
}
+ }
- if (strcmp(newid, "GPGSA") == 0) {
- char scr[128];
- int i;
- (void)mvwprintw(gpgsawin, 1,7, "%1s %s", fields[1], fields[2]);
- (void)wmove(gpgsawin, 2, 7);
- (void)wclrtoeol(gpgsawin);
- scr[0] = '\0';
- for (i = 0; i < session.gpsdata.satellites_used; i++) {
- (void)snprintf(scr + strlen(scr), sizeof(scr)-strlen(scr),
- "%d ", session.gpsdata.used[i]);
- }
- getmaxyx(gpgsawin, ymax, xmax);
- (void)mvwaddnstr(gpgsawin, 2, 7, scr, xmax-2-7);
- if (strlen(scr) >= (size_t)(xmax-2)) {
- mvwaddch(gpgsawin, 2, xmax-2-7, (chtype)'.');
- mvwaddch(gpgsawin, 2, xmax-3-7, (chtype)'.');
- mvwaddch(gpgsawin, 2, xmax-4-7, (chtype)'.');
- }
- fixframe(gpgsawin);
- (void)wmove(gpgsawin, 3, 7);
- (void)wprintw(gpgsawin, "%2.2f", session.gpsdata.hdop);
- (void)wmove(gpgsawin, 4, 7);
- (void)wprintw(gpgsawin, "%2.2f", session.gpsdata.vdop);
- (void)wmove(gpgsawin, 5, 7);
- (void)wprintw(gpgsawin, "%2.2f", session.gpsdata.pdop);
+ if (strcmp(newid, "GPRMC") == 0) {
+ /* Not dumped yet: magnetic variation */
+ char scr[128];
+ if (isnan(session.gpsdata.fix.time)==0) {
+ (void)unix_to_iso8601(session.gpsdata.fix.time, scr, sizeof(scr));
+ } else
+ (void)snprintf(scr, sizeof(scr), "n/a");
+ (void)wmove(gprmcwin, 1, 7);
+ (void)wclrtoeol(gprmcwin);
+ (void)waddstr(gprmcwin, scr);
+ fixframe(gprmcwin);
+
+ /* Fill in the latitude. */
+ if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.latitude)==0) {
+ (void)snprintf(scr, sizeof(scr), "%s %c",
+ deg_to_str(deg_ddmmss, fabs(session.gpsdata.fix.latitude)),
+ (session.gpsdata.fix.latitude < 0) ? 'S' : 'N');
+ } else
+ (void)snprintf(scr, sizeof(scr), "n/a");
+ (void)mvwprintw(gprmcwin, 2, 11, "%-17s", scr);
+
+ /* Fill in the longitude. */
+ if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.longitude)==0) {
+ (void)snprintf(scr, sizeof(scr), "%s %c",
+ deg_to_str(deg_ddmmss, fabs(session.gpsdata.fix.longitude)),
+ (session.gpsdata.fix.longitude < 0) ? 'W' : 'E');
+ } else
+ (void)snprintf(scr, sizeof(scr), "n/a");
+ (void)mvwprintw(gprmcwin, 3, 11, "%-17s", scr);
+
+ /* Fill in the speed. */
+ if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.track)==0)
+ (void)snprintf(scr, sizeof(scr), "%.1f meters/sec", session.gpsdata.fix.speed);
+ else
+ (void)snprintf(scr, sizeof(scr), "n/a");
+ (void)mvwprintw(gprmcwin, 4, 11, "%-17s", scr);
+
+ if (session.gpsdata.fix.mode >= MODE_2D && isnan(session.gpsdata.fix.track)==0)
+ (void)snprintf(scr, sizeof(scr), "%.1f deg", session.gpsdata.fix.track);
+ else
+ (void)snprintf(scr, sizeof(scr), "n/a");
+ (void)mvwprintw(gprmcwin, 5, 11, "%-17s", scr);
+
+ /* the status field and FAA code */
+ (void)mvwaddstr(gprmcwin, 6, 11, fields[2]);
+ (void)mvwaddstr(gprmcwin, 6, 23, fields[12]);
+ }
+
+ if (strcmp(newid, "GPGSA") == 0) {
+ char scr[128];
+ int i;
+ (void)mvwprintw(gpgsawin, 1,7, "%1s %s", fields[1], fields[2]);
+ (void)wmove(gpgsawin, 2, 7);
+ (void)wclrtoeol(gpgsawin);
+ scr[0] = '\0';
+ for (i = 0; i < session.gpsdata.satellites_used; i++) {
+ (void)snprintf(scr + strlen(scr), sizeof(scr)-strlen(scr),
+ "%d ", session.gpsdata.used[i]);
}
- if (strcmp(newid, "GPGGA") == 0) {
- char scr[128];
- /* Fill in the altitude. */
- if (session.gpsdata.fix.mode == MODE_3D && isnan(session.gpsdata.fix.altitude)==0)
- (void)snprintf(scr, sizeof(scr), "%.1f meters",session.gpsdata.fix.altitude);
- else
- (void)snprintf(scr, sizeof(scr), "n/a");
- (void)mvwprintw(gpggawin, 1, 11, "%-17s", scr);
- (void)mvwprintw(gpggawin, 2, 10, "%1.1s", fields[6]);
- (void)mvwprintw(gpggawin, 2, 19, "%2.2s", fields[7]);
- (void)mvwprintw(gpggawin, 3, 10, "%-5.5s", fields[8]);
- (void)mvwprintw(gpggawin, 4, 10, "%-5.5s", fields[11]);
+ getmaxyx(gpgsawin, ymax, xmax);
+ (void)mvwaddnstr(gpgsawin, 2, 7, scr, xmax-2-7);
+ if (strlen(scr) >= (size_t)(xmax-2)) {
+ mvwaddch(gpgsawin, 2, xmax-2-7, (chtype)'.');
+ mvwaddch(gpgsawin, 2, xmax-3-7, (chtype)'.');
+ mvwaddch(gpgsawin, 2, xmax-4-7, (chtype)'.');
}
+ fixframe(gpgsawin);
+ (void)wmove(gpgsawin, 3, 7);
+ (void)wprintw(gpgsawin, "%2.2f", session.gpsdata.hdop);
+ (void)wmove(gpgsawin, 4, 7);
+ (void)wprintw(gpgsawin, "%2.2f", session.gpsdata.vdop);
+ (void)wmove(gpgsawin, 5, 7);
+ (void)wprintw(gpgsawin, "%2.2f", session.gpsdata.pdop);
+ }
+ if (strcmp(newid, "GPGGA") == 0) {
+ char scr[128];
+ /* Fill in the altitude. */
+ if (session.gpsdata.fix.mode == MODE_3D && isnan(session.gpsdata.fix.altitude)==0)
+ (void)snprintf(scr, sizeof(scr), "%.1f meters",session.gpsdata.fix.altitude);
+ else
+ (void)snprintf(scr, sizeof(scr), "n/a");
+ (void)mvwprintw(gpggawin, 1, 11, "%-17s", scr);
+ (void)mvwprintw(gpggawin, 2, 10, "%1.1s", fields[6]);
+ (void)mvwprintw(gpggawin, 2, 19, "%2.2s", fields[7]);
+ (void)mvwprintw(gpggawin, 3, 10, "%-5.5s", fields[8]);
+ (void)mvwprintw(gpggawin, 4, 10, "%-5.5s", fields[11]);
}
}
}