summaryrefslogtreecommitdiff
path: root/gpsmon.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2009-02-18 22:58:08 +0000
committerEric S. Raymond <esr@thyrsus.com>2009-02-18 22:58:08 +0000
commit997cc04c9afd1843d8e502d13bc202c3a022a1eb (patch)
tree4f1a2e4c6bfc91979624867272208530f5f1188f /gpsmon.c
parent57ea31dec929e0dc88469b0d52087db154565f06 (diff)
downloadgpsd-997cc04c9afd1843d8e502d13bc202c3a022a1eb.tar.gz
Move the NMEA monitor driver to its own module.
Diffstat (limited to 'gpsmon.c')
-rw-r--r--gpsmon.c251
1 files changed, 1 insertions, 250 deletions
diff --git a/gpsmon.c b/gpsmon.c
index 8d0e3234..ea54b1f4 100644
--- a/gpsmon.c
+++ b/gpsmon.c
@@ -82,7 +82,7 @@ static char *type_name;
#define display (void)mvwprintw
/* external capability tables */
-extern struct mdevice_t sirf_mdt;
+extern struct mdevice_t nmea_mdt, sirf_mdt;
void fixframe(WINDOW *win)
{
@@ -92,255 +92,6 @@ void fixframe(WINDOW *win)
(void)mvwaddch(win, ycur, xmax-1, ACS_VLINE);
}
-/******************************************************************************
- *
- * The NMEA driver, for generic NMEA devices.
- *
- ******************************************************************************/
-
-extern const struct gps_type_t nmea;
-
-static WINDOW *nmeawin, *satwin, *gprmcwin, *gpggawin, *gpgsawin;
-static clock_t last_tick, tick_interval;
-
-#define SENTENCELINE 1
-
-static bool nmea_windows(void)
-{
- int i;
-
- /*@ -onlytrans @*/
- nmeawin = derwin(devicewin, 3, 80, 0, 0);
- (void)wborder(nmeawin, 0, 0, 0, 0, 0, 0, 0, 0);
- (void)syncok(nmeawin, true);
-
- wattrset(nmeawin, A_BOLD);
- mvwaddstr(nmeawin, 2, 34, " Sentences ");
- wattrset(nmeawin, A_NORMAL);
- /*@ +onlytrans @*/
-
- satwin = derwin(devicewin, 15, 20, 3, 0);
- (void)wborder(satwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(satwin, true);
- (void)wattrset(satwin, A_BOLD);
- display(satwin, 1, 1, " Ch SV Az El S/N");
- for (i = 0; i < SIRF_CHANNELS; i++)
- display(satwin, (int)(i+2), 1, "%2d",i);
- display(satwin, 14, 7, " GSV ");
- (void)wattrset(satwin, A_NORMAL);
-
- gprmcwin = derwin(devicewin, 8, 30, 3, 20);
- (void)wborder(gprmcwin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(gprmcwin, true);
- (void)wattrset(gprmcwin, A_BOLD);
- display(gprmcwin, 1, 1, "Time: ");
- display(gprmcwin, 2, 1, "Latitude: ");
- display(gprmcwin, 3, 1, "Longitude: ");
- display(gprmcwin, 4, 1, "Speed: ");
- display(gprmcwin, 5, 1, "Course: ");
- display(gprmcwin, 6, 1, "Status: FAA: ");
- display(gprmcwin, 7, 12, " RMC ");
- (void)wattrset(gprmcwin, A_NORMAL);
-
- gpgsawin = derwin(devicewin, 7, 30, 11, 20);
- (void)wborder(gpgsawin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(gpgsawin, true);
- (void)wattrset(gpgsawin, A_BOLD);
- display(gpgsawin, 1, 1, "Mode: ");
- display(gpgsawin, 2, 1, "Sats: ");
- display(gpgsawin, 3, 1, "HDOP: ");
- display(gpgsawin, 4, 1, "VDOP: ");
- display(gpgsawin, 5, 1, "PDOP: ");
- display(gpgsawin, 6, 12, " GSA ");
- (void)wattrset(gpgsawin, A_NORMAL);
-
- gpggawin = derwin(devicewin, 6, 30, 3, 50);
- (void)wborder(gpggawin, 0, 0, 0, 0, 0, 0, 0, 0),
- (void)syncok(gpggawin, true);
- (void)wattrset(gpggawin, A_BOLD);
- display(gpggawin, 1, 1, "Altitude: ");
- display(gpggawin, 2, 1, "Quality: Sats: ");
- display(gpggawin, 3, 1, "HDOP: ");
- display(gpggawin, 4, 1, "Geoid: ");
- display(gpggawin, 5, 12, " GGA ");
- (void)wattrset(gpggawin, A_NORMAL);
-
- last_tick = timestamp();
-
- return (nmeawin != NULL);
-}
-
-/*@ -globstate */
-static void nmea_update(size_t len)
-{
- if (len > 0 && session.packet.outbuflen > 0)
- {
- static char sentences[NMEA_MAX];
- char **fields;
-
- fields = session.driver.nmea.field;
-
- if (session.packet.outbuffer[0] == '$') {
- 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 (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),
- strlen(newid),
- A_BOLD, 0, NULL);
- }
- }
- 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]);
- }
- }
-
- 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, ymax, xmax;
- (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) >= xmax-2) {
- mvwaddch(gpgsawin, 2, xmax-2-7, '.');
- mvwaddch(gpgsawin, 2, xmax-3-7, '.');
- mvwaddch(gpgsawin, 2, xmax-4-7, '.');
- }
- 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]);
- }
- }
- }
-}
-/*@ +globstate */
-
-#undef SENTENCELINE
-
-static void nmea_wrap(void)
-{
- (void)delwin(nmeawin);
-}
-
-const struct mdevice_t nmea_mdt = {
- .initialize = nmea_windows,
- .update = nmea_update,
- .command = NULL,
- .wrap = nmea_wrap,
- .min_y = 18, .min_x = 80,
- .driver = &nmea,
-};
const struct mdevice_t *drivers[] = {
&nmea_mdt,