summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-04-10 22:19:51 -0400
committerEric S. Raymond <esr@thyrsus.com>2011-04-10 22:19:51 -0400
commit4fda87b5d4dc3dd8200e5f74d6fefc2a32616d6a (patch)
tree96fa92dc591ac358b39e52537e17d5635e5884e4
parent090692924a259d90db1374e35463adb19245b3d2 (diff)
downloadgpsd-4fda87b5d4dc3dd8200e5f74d6fefc2a32616d6a.tar.gz
RTCM3 decoding, more progress.
-rw-r--r--driver_rtcm3.c7
-rw-r--r--gpsd_json.c30
2 files changed, 29 insertions, 8 deletions
diff --git a/driver_rtcm3.c b/driver_rtcm3.c
index de2fe16a..cd61f542 100644
--- a/driver_rtcm3.c
+++ b/driver_rtcm3.c
@@ -46,13 +46,14 @@ BSD terms apply: see the file COPYING in the distribution root for details.
/* scaling constants for RTCM3 real number types */
#define GPS_PSEUDORANGE_RESOLUTION 0.2 /* DF011 */
#define PSEUDORANGE_DIFF_RESOLUTION 0.0005 /* DF012,DF042 */
-#define CARRIER_NOISE_RATIO_UNITS 0.25 /* DF015 */
+#define CARRIER_NOISE_RATIO_UNITS 0.25 /* DF015, DF045, DF50 */
#define ANTENNA_POSITION_RESOLUTION 0.0001 /* DF025-027 */
#define GLONASS_PSEUDORANGE_RESOLUTION 0.02 /* DF041 */
#define ANTENNA_DEGREE_RESOLUTION 25e-6 /* DF062 */
#define GPS_EPOCH_TIME_RESOLUTION 0.1 /* DF065 */
#define PHASE_CORRECTION_RESOLUTION 0.5 /* DF069-070 */
+
/* Other magic values */
#define GPS_INVALID_PSEUDORANGE 0x80000 /* DF012 */
#define GLONASS_INVALID_RANGEINCR 0x2000 /* DF047 */
@@ -330,7 +331,7 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf)
RANGEDIFF(R1012.L1, 20);
R1012.L1.locktime = (unsigned char)ugrab(7);
R1012.L1.ambiguity = (unsigned char)ugrab(7);
- R1012.L1.CNR = (unsigned char)ugrab(8);
+ R1012.L1.CNR = (unsigned char)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
R1012.L2.indicator = (bool)ugrab(2);
rangeincr = ugrab(14);
if (rangeincr == GLONASS_INVALID_RANGEINCR)
@@ -339,7 +340,7 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf)
R1012.L2.pseudorange = R1012.L1.pseudorange + (rangeincr * GLONASS_PSEUDORANGE_RESOLUTION);
RANGEDIFF(R1012.L2, 20);
R1012.L2.locktime = (unsigned char)sgrab(7);
- R1012.L2.CNR = (unsigned char)ugrab(8);
+ R1012.L2.CNR = (unsigned char)ugrab(8) * CARRIER_NOISE_RATIO_UNITS;
}
#undef R1012
break;
diff --git a/gpsd_json.c b/gpsd_json.c
index 78cc3f1f..5dd1bddf 100644
--- a/gpsd_json.c
+++ b/gpsd_json.c
@@ -1038,7 +1038,6 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm,
break;
case 1005:
- case 1006:
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
"\"station_id\":%u,\"system\":[",
rtcm->rtcmtypes.rtcm3_1005.station_id);
@@ -1058,10 +1057,31 @@ void json_rtcm3_dump(const struct rtcm3_t *rtcm,
rtcm->rtcmtypes.rtcm3_1005.ecef_x,
rtcm->rtcmtypes.rtcm3_1005.ecef_y,
rtcm->rtcmtypes.rtcm3_1005.ecef_z);
- if (rtcm->type == 1006)
- (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
- "\"h\":%.4f,",
- rtcm->rtcmtypes.rtcm3_1006.height);
+ break;
+
+ case 1006:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"system\":[",
+ rtcm->rtcmtypes.rtcm3_1006.station_id);
+ if ((rtcm->rtcmtypes.rtcm3_1006.system & 0x04)!=0)
+ (void)strlcat(buf, "\"GPS\",", buflen - strlen(buf));
+ if ((rtcm->rtcmtypes.rtcm3_1006.system & 0x02)!=0)
+ (void)strlcat(buf, "\"GLONASS\",", buflen - strlen(buf));
+ if ((rtcm->rtcmtypes.rtcm3_1006.system & 0x01)!=0)
+ (void)strlcat(buf, "\"GALILEO\",", buflen - strlen(buf));
+ if (buf[strlen(buf)-1] == ',')
+ buf[strlen(buf)-1] = '\0';
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "],\"refstation\":%s,\"sro\":%s,"
+ "\"x\":%.4f,\"y\":%.4f,\"z\":%.4f,",
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1006.reference_station),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1006.single_receiver),
+ rtcm->rtcmtypes.rtcm3_1006.ecef_x,
+ rtcm->rtcmtypes.rtcm3_1006.ecef_y,
+ rtcm->rtcmtypes.rtcm3_1006.ecef_z);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"h\":%.4f,",
+ rtcm->rtcmtypes.rtcm3_1006.height);
break;
case 1007: