diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2009-01-06 14:49:21 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2009-01-06 14:49:21 +0000 |
commit | 649df04ceb10762b70916d9c58bbc86179fb8896 (patch) | |
tree | bb996691fe96676be5da7e4330810cb6b4ba2402 /nmea_parse.c | |
parent | 4ada7201b3e3ea30cc5cf7f905025c72e2ff0761 (diff) | |
download | gpsd-649df04ceb10762b70916d9c58bbc86179fb8896.tar.gz |
Refactor sending of control strings.
Most drivers now have a control_send method that takes a
payload. provides whatever checksuming and leader/trailer bytes are
needed, and ships it to a specified active device.
This change should not alter any behavior. All regression tests pass.
Diffstat (limited to 'nmea_parse.c')
-rw-r--r-- | nmea_parse.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/nmea_parse.c b/nmea_parse.c index eda0e276..54f81f0a 100644 --- a/nmea_parse.c +++ b/nmea_parse.c @@ -887,24 +887,18 @@ void nmea_add_checksum(char *sentence) (void)snprintf(p, 5, "%02X\r\n", (unsigned)sum); } -int nmea_send(int fd, const char *fmt, ... ) +ssize_t nmea_write(struct gps_device_t *session, char *buf, size_t len) /* ship a command to the GPS, adding * and correct checksum */ { - int status; - char buf[BUFSIZ]; - va_list ap; - - va_start(ap, fmt) ; - (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap); - va_end(ap); - if (fmt[0] == '$') { + ssize_t status; + if (buf[0] == '$') { (void)strlcat(buf, "*", BUFSIZ); nmea_add_checksum(buf); } else (void)strlcat(buf, "\r\n", BUFSIZ); - status = (int)write(fd, buf, strlen(buf)); - (void)tcdrain(fd); - if (status == (int)strlen(buf)) { + status = write(session->gpsdata.gps_fd, buf, strlen(buf)); + (void)tcdrain(session->gpsdata.gps_fd); + if (status == (ssize_t)strlen(buf)) { gpsd_report(LOG_IO, "=> GPS: %s\n", buf); return status; } else { @@ -912,3 +906,14 @@ int nmea_send(int fd, const char *fmt, ... ) return -1; } } + +ssize_t nmea_send(struct gps_device_t *session, const char *fmt, ... ) +{ + char buf[BUFSIZ]; + va_list ap; + + va_start(ap, fmt) ; + (void)vsnprintf(buf, sizeof(buf)-5, fmt, ap); + va_end(ap); + return nmea_write(session, buf, strlen(buf)); +} |