diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2009-02-18 22:58:08 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2009-02-18 22:58:08 +0000 |
commit | 997cc04c9afd1843d8e502d13bc202c3a022a1eb (patch) | |
tree | 4f1a2e4c6bfc91979624867272208530f5f1188f /gpsmon.c | |
parent | 57ea31dec929e0dc88469b0d52087db154565f06 (diff) | |
download | gpsd-997cc04c9afd1843d8e502d13bc202c3a022a1eb.tar.gz |
Move the NMEA monitor driver to its own module.
Diffstat (limited to 'gpsmon.c')
-rw-r--r-- | gpsmon.c | 251 |
1 files changed, 1 insertions, 250 deletions
@@ -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, |