diff options
author | Reinhard Arlt <reinhard.arlt@t-online.de> | 2013-02-27 00:47:31 +0100 |
---|---|---|
committer | Reinhard Arlt <reinhard.arlt@t-online.de> | 2013-02-27 00:47:31 +0100 |
commit | a6337a7be1ecd2a21e6eb75e7df8cba1d918fba2 (patch) | |
tree | 393de7c53f7998d00e09815280182e8a3ee03282 /driver_nmea2000.c | |
parent | 0e07b5cfbfdce0f03cef8e79f1b6bf5ac964e233 (diff) | |
download | gpsd-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.c | 12 |
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; |