summaryrefslogtreecommitdiff
path: root/nmea_parse.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2009-01-06 14:49:21 +0000
committerEric S. Raymond <esr@thyrsus.com>2009-01-06 14:49:21 +0000
commit649df04ceb10762b70916d9c58bbc86179fb8896 (patch)
treebb996691fe96676be5da7e4330810cb6b4ba2402 /nmea_parse.c
parent4ada7201b3e3ea30cc5cf7f905025c72e2ff0761 (diff)
downloadgpsd-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.c29
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));
+}