summaryrefslogtreecommitdiff
path: root/driver_sirf.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2019-01-11 17:18:37 -0800
committerGary E. Miller <gem@rellim.com>2019-01-11 17:18:37 -0800
commita2d307dceefb0bb71ee7c01d540596e6d18a9cd2 (patch)
treef72e3a5282f99a28b50ec4f51c01b25619009efe /driver_sirf.c
parent50f3ed3cdf635ce02c9fe0125638ae815f12f34a (diff)
downloadgpsd-a2d307dceefb0bb71ee7c01d540596e6d18a9cd2.tar.gz
driver_sirf: Add support for extended ACK/NACK messages
Just shows up in better logging.
Diffstat (limited to 'driver_sirf.c')
-rw-r--r--driver_sirf.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/driver_sirf.c b/driver_sirf.c
index c1170b25..0086b732 100644
--- a/driver_sirf.c
+++ b/driver_sirf.c
@@ -1842,14 +1842,34 @@ gps_mask_t sirf_parse(struct gps_device_t * session, unsigned char *buf,
return sirf_msg_errors(session, buf, len);
case 0x0b: /* Command Acknowledgement MID 11 */
- gpsd_log(&session->context->errout, LOG_PROG,
- "SiRF: ACK 0x0b: %#02x\n", getub(buf, 1));
+ if (2 > len) {
+ return 0;
+ }
+ if (2 == len) {
+ gpsd_log(&session->context->errout, LOG_PROG,
+ "SiRF: ACK 0x0b: %#02x\n", getub(buf, 1));
+ } else {
+ /* SiRF III+, has ACK ID */
+ gpsd_log(&session->context->errout, LOG_PROG,
+ "SiRF: ACK 0x0b: %#02x/%02x\n",
+ getub(buf, 1), getub(buf, 2));
+ }
session->driver.sirf.need_ack = 0;
return 0;
case 0x0c: /* Command NAcknowledgement MID 12 */
- gpsd_log(&session->context->errout, LOG_PROG,
- "SiRF: NAK 0x0c: %#02x\n", getub(buf, 1));
+ if (2 > len) {
+ return 0;
+ }
+ if (2 == len) {
+ gpsd_log(&session->context->errout, LOG_PROG,
+ "SiRF: NACK 0x0c: %#02x\n", getub(buf, 1));
+ } else {
+ /* SiRF III+, has NACK ID */
+ gpsd_log(&session->context->errout, LOG_PROG,
+ "SiRF: NACK 0x0c: %#02x/%02x\n",
+ getub(buf, 1), getub(buf, 2));
+ }
/* ugh -- there's no alternative but silent failure here */
session->driver.sirf.need_ack = 0;
return 0;