summaryrefslogtreecommitdiff
path: root/driver_nmea0183.c
diff options
context:
space:
mode:
authorGary E. Miller <gem@rellim.com>2019-04-12 12:51:38 -0700
committerGary E. Miller <gem@rellim.com>2019-04-12 12:51:38 -0700
commit0c80fc906d856a7e1511a67ff77978d907b36246 (patch)
treef119fceb226e1f383bbd9b3a6d1f02e47422d4f9 /driver_nmea0183.c
parenteb791a3066846ea48febef737c7cd122525c4287 (diff)
downloadgpsd-0c80fc906d856a7e1511a67ff77978d907b36246.tar.gz
driver_nmea0183: Prep work to support gnssid in xxGSV.
This is needed to fix NMEA 4.10 decodes.
Diffstat (limited to 'driver_nmea0183.c')
-rw-r--r--driver_nmea0183.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/driver_nmea0183.c b/driver_nmea0183.c
index 865f28ab..c348eac6 100644
--- a/driver_nmea0183.c
+++ b/driver_nmea0183.c
@@ -1275,6 +1275,8 @@ static gps_mask_t processGSV(int count, char *field[],
*/
int n, fldnum;
+ int gnssid = 0;
+
if (count <= 3) {
gpsd_log(&session->context->errout, LOG_WARN,
"malformed GPGSV - fieldcount %d <= 3\n",
@@ -1287,10 +1289,22 @@ static gps_mask_t processGSV(int count, char *field[],
* This check used to be !=0, but we have loosen it a little to let by
* NMEA 4.1 GSVs with an extra signal-ID field at the end.
*/
- if (count % 4 > 1) {
+ switch (count % 4) {
+ case 0:
+ /* normal, pre-NMEA 4.10 */
+ break;
+ case 1:
+ /* NMEA 4.10, get the signal ID */
+ gnssid = field[count - 1][0];
+ if (0 == gnssid) gnssid = '0';
+ gpsd_log(&session->context->errout, LOG_DATA,
+ "GPGSV fieldcount %d %% 4 == 1, gnssid %c (%#x)\n", count,
+ gnssid, gnssid);
+ break;
+ default:
+ /* bad count */
gpsd_log(&session->context->errout, LOG_WARN,
- "malformed GPGSV - fieldcount %d %% 4 != 0\n",
- count);
+ "malformed GPGSV - fieldcount %d %% 4 != 0\n", count);
gpsd_zero_satellites(&session->gpsdata);
session->gpsdata.satellites_visible = 0;
return ONLINE_SET;
@@ -1309,6 +1323,7 @@ static gps_mask_t processGSV(int count, char *field[],
*/
if (session->nmea.last_gsv_talker == '\0'
|| GSV_TALKER == session->nmea.last_gsv_talker) {
+ /* FIXME: this is zeroing too often */
gpsd_zero_satellites(&session->gpsdata);
}
session->nmea.last_gsv_talker = GSV_TALKER;