From 57b427fb3165d3f015a565dad879d8009be5abf9 Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Tue, 12 Apr 2011 23:56:23 -0400 Subject: Interpret GLONASS channel numbers in RTCM3 correctly. --- driver_rtcm3.c | 11 ++++++----- gps.h | 4 ++-- gpsd_json.c | 18 +++++++++--------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/driver_rtcm3.c b/driver_rtcm3.c index 651bf6b7..3ea92163 100644 --- a/driver_rtcm3.c +++ b/driver_rtcm3.c @@ -59,6 +59,7 @@ BSD terms apply: see the file COPYING in the distribution root for details. /* Other magic values */ #define GPS_INVALID_PSEUDORANGE 0x80000 /* DF012, DF018 */ #define GLONASS_INVALID_RANGEINCR 0x2000 /* DF047 */ +#define GLONASS_CHANNEL_BASE 7 /* DF040 */ /* Large case statements make GNU indent very confused */ /* *INDENT-OFF* */ @@ -255,7 +256,7 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf) for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) { R1009.ident = (ushort)ugrab(6); R1009.L1.indicator = (bool)ugrab(1); - R1009.L1.channel = (ushort)ugrab(5); + R1009.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1009.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1009.L1, 20); R1009.L1.locktime = (unsigned char)sgrab(7); @@ -275,7 +276,7 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf) for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) { R1010.ident = (ushort)ugrab(6); R1010.L1.indicator = (bool)ugrab(1); - R1010.L1.channel = (ushort)ugrab(5); + R1010.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1010.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1010.L1, 20); R1010.L1.locktime = (unsigned char)sgrab(7); @@ -297,14 +298,14 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf) for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) { R1011.ident = (ushort)ugrab(6); R1011.L1.indicator = (bool)ugrab(1); - R1011.L1.channel = (ushort)ugrab(5); + R1011.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1011.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1011.L1, 20); R1011.L1.locktime = (unsigned char)sgrab(7); R1011.L1.ambiguity = (unsigned char)ugrab(7); R1011.L1.CNR = ugrab(8) * CARRIER_NOISE_RATIO_UNITS; R1011.L2.indicator = (bool)ugrab(1); - R1011.L2.channel = (ushort)ugrab(5); + R1011.L2.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1011.L2.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1011.L2, 20); R1011.L2.locktime = (unsigned char)sgrab(7); @@ -327,7 +328,7 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf) unsigned int rangeincr; R1012.ident = (ushort)ugrab(6); R1012.L1.indicator = (bool)ugrab(1); - R1012.L1.channel = (ushort)ugrab(5); + R1012.L1.channel = (short)ugrab(5) - GLONASS_CHANNEL_BASE; R1012.L1.pseudorange = ugrab(25) * GLONASS_PSEUDORANGE_RESOLUTION; RANGEDIFF(R1012.L1, 20); R1012.L1.locktime = (unsigned char)ugrab(7); diff --git a/gps.h b/gps.h index 0d93dd7c..add20f80 100644 --- a/gps.h +++ b/gps.h @@ -259,7 +259,7 @@ struct rtcm3_rtk_hdr { /* header data from 1001, 1002, 1003, 1004 */ struct rtcm3_basic_rtk { unsigned char indicator; /* Indicator */ - unsigned char channel; /* Satellite Frequency Channel Number + short channel; /* Satellite Frequency Channel Number (GLONASS only) */ double pseudorange; /* Pseudorange */ double rangediff; /* PhaseRange – Pseudorange in meters */ @@ -268,7 +268,7 @@ struct rtcm3_basic_rtk { struct rtcm3_extended_rtk { unsigned char indicator; /* Indicator */ - unsigned char channel; /* Satellite Frequency Channel Number + short channel; /* Satellite Frequency Channel Number (GLONASS only) */ double pseudorange; /* Pseudorange */ double rangediff; /* PhaseRange – L1 Pseudorange */ diff --git a/gpsd_json.c b/gpsd_json.c index ce23dc5c..bc00d932 100644 --- a/gpsd_json.c +++ b/gpsd_json.c @@ -1116,11 +1116,11 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm, for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) { #define R1009 rtcm->rtcmtypes.rtcm3_1009.rtk_data[i] (void)snprintf(buf + strlen(buf), buflen - strlen(buf), - "{\"ident\":%u,\"ind\":%u,\"channel\":%u," + "{\"ident\":%u,\"ind\":%u,\"channel\":%hd," "\"prange\":%8.2f,\"delta\":%6.4f,\"lockt\":%u},", R1009.ident, CODE(R1009.L1.indicator), - INT(R1009.L1.channel), + R1009.L1.channel, R1009.L1.pseudorange, R1009.L1.rangediff, INT(R1009.L1.locktime)); @@ -1144,12 +1144,12 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm, for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) { #define R1010 rtcm->rtcmtypes.rtcm3_1010.rtk_data[i] (void)snprintf(buf + strlen(buf), buflen - strlen(buf), - "{\"ident\":%u,\"ind\":%u,\"channel\":%u," + "{\"ident\":%u,\"ind\":%u,\"channel\":%hd," "\"prange\":%8.2f,\"delta\":%6.4f,\"lockt\":%u," "\"amb\":%u,\"CNR\":%.2f},", R1010.ident, CODE(R1010.L1.indicator), - INT(R1010.L1.channel), + R1010.L1.channel, R1010.L1.pseudorange, R1010.L1.rangediff, INT(R1010.L1.locktime), @@ -1176,14 +1176,14 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm, #define R1011 rtcm->rtcmtypes.rtcm3_1011.rtk_data[i] (void)snprintf(buf + strlen(buf), buflen - strlen(buf), "{\"ident\":%u," - "\"L1\":{\"ind\":%u,\"channel\":%u," + "\"L1\":{\"ind\":%u,\"channel\":%hd," "\"prange\":%8.2f,\"delta\":%6.4f,\"lockt\":%u}," "\"L2:{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u}" "}", R1011.ident, CODE(R1011.L1.indicator), - INT(R1011.L1.channel), + R1011.L1.channel, R1011.L1.pseudorange, R1011.L1.rangediff, INT(R1011.L1.locktime), @@ -1211,8 +1211,8 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm, for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) { #define R1012 rtcm->rtcmtypes.rtcm3_1012.rtk_data[i] (void)snprintf(buf + strlen(buf), buflen - strlen(buf), - "{\"ident\":%u," - "\"L1\":{\"ind\":%u,\"channel\":%u,\"prange\":%8.2f," + "{\"ident\":%u,\"channel\":%hd," + "\"L1\":{\"ind\":%u,\"prange\":%8.2f," "\"delta\":%6.4f,\"lockt\":%u,\"amb\":%u," "\"CNR\":%.2f}," "\"L2\":{\"ind\":%u,\"prange\":%8.2f," @@ -1220,8 +1220,8 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm, "\"CNR\":%.2f}," "},", R1012.ident, + R1012.L1.channel, CODE(R1012.L1.indicator), - INT(R1012.L1.channel), R1012.L1.pseudorange, R1012.L1.rangediff, INT(R1012.L1.locktime), -- cgit v1.2.1