summaryrefslogtreecommitdiff
path: root/driver_nmea2000.c
diff options
context:
space:
mode:
authorReinhard Arlt <reinhard.arlt@t-online.de>2013-02-27 00:47:31 +0100
committerReinhard Arlt <reinhard.arlt@t-online.de>2013-02-27 00:47:31 +0100
commita6337a7be1ecd2a21e6eb75e7df8cba1d918fba2 (patch)
tree393de7c53f7998d00e09815280182e8a3ee03282 /driver_nmea2000.c
parent0e07b5cfbfdce0f03cef8e79f1b6bf5ac964e233 (diff)
downloadgpsd-a6337a7be1ecd2a21e6eb75e7df8cba1d918fba2.tar.gz
Workaround for possibly swaped mode fields in PGN 129539 by some GARMIN plotter.
Diffstat (limited to 'driver_nmea2000.c')
-rw-r--r--driver_nmea2000.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/driver_nmea2000.c b/driver_nmea2000.c
index 0d8d08cd..2fa9d61d 100644
--- a/driver_nmea2000.c
+++ b/driver_nmea2000.c
@@ -238,6 +238,8 @@ static const int mode_tab[] = {MODE_NO_FIX, MODE_2D, MODE_3D, MODE_NO_FIX,
static gps_mask_t hnd_129539(unsigned char *bu, int len, PGN *pgn, struct gps_device_t *session)
{
gps_mask_t mask;
+ unsigned int req_mode;
+ unsigned int act_mode;
print_data(bu, len, pgn);
gpsd_report(LOG_DATA, "pgn %6d(%3d):\n", pgn->pgn, session->driver.nmea2000.unit);
@@ -247,7 +249,15 @@ static gps_mask_t hnd_129539(unsigned char *bu, int len, PGN *pgn, struct gps_de
session->driver.nmea2000.mode_valid = 1;
- session->driver.nmea2000.mode = mode_tab[(bu[1] >> 3) & 0x07];
+ req_mode = (unsigned int)((bu[1] >> 0) & 0x07);
+ act_mode = (unsigned int)((bu[1] >> 3) & 0x07);
+
+ /* This is a workaround for some GARMIN plotter, actual mode auto makes no sense for me! */
+ if ((act_mode == 3) && (req_mode != 3)) {
+ act_mode = req_mode;
+ }
+
+ session->driver.nmea2000.mode = mode_tab[act_mode];
/*@-type@*//* splint has a bug here */
session->gpsdata.dop.hdop = getleu16(bu, 2) * 1e-2;