summaryrefslogtreecommitdiff
path: root/rtcm3.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2008-07-21 17:28:19 +0000
committerEric S. Raymond <esr@thyrsus.com>2008-07-21 17:28:19 +0000
commit8fe9919500bf73b8234d63eb6c9a5787fa67d0bd (patch)
treeff2b6dea062f72912d6d7278c26702f2830b5636 /rtcm3.c
parentfd208be4d01ac748783288a50da966d5dc09ddc1 (diff)
downloadgpsd-8fe9919500bf73b8234d63eb6c9a5787fa67d0bd.tar.gz
Unpack and dump two more RTCM3 messages.
Diffstat (limited to 'rtcm3.c')
-rw-r--r--rtcm3.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/rtcm3.c b/rtcm3.c
index f271cc5f..36a3df6d 100644
--- a/rtcm3.c
+++ b/rtcm3.c
@@ -43,7 +43,7 @@ firmware.
#define PSEUDORANGE_RESOLUTION 0.2 /* DF011 */
#define PSEUDORANGE_DIFF_RESOLUTION 0.0005 /* DF012 */
#define CARRIER_NOISE_RATIO_UNITS 0.25 /* DF015 */
-#define ANTENNA_HEIGHT_RESOLUTION 0.0001 /* DF025-027 */
+#define ANTENNA_POSITION_RESOLUTION 0.0001 /* DF025-027 */
#define ANTENNA_DEGREE_RESOLUTION 25e-6 /* DF062 */
#define GPS_EPOCH_TIME_RESOLUTION 0.1 /* DF065 */
#define PHASE_CORRECTION_RESOLUTION 0.5 /* DF069-070 */
@@ -193,9 +193,40 @@ void rtcm3_unpack(/*@out@*/struct rtcm3_t *rtcm, char *buf)
break;
case 1005:
+ rtcm->rtcm3_1005.station_id = (unsigned short)ugrab(12);
+ ugrab(6); /* reserved */
+ if ((bool)ugrab(1))
+ rtcm->rtcm3_1005.system = gps;
+ else if ((bool)ugrab(1))
+ rtcm->rtcm3_1005.system = glonass;
+ else if ((bool)ugrab(1))
+ rtcm->rtcm3_1005.system = galileo;
+ rtcm->rtcm3_1005.reference_station = (bool)ugrab(1);
+ rtcm->rtcm3_1005.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcm3_1005.single_receiver = ugrab(1);
+ ugrab(1);
+ rtcm->rtcm3_1005.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ ugrab(2);
+ rtcm->rtcm3_1005.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
break;
case 1006:
+ rtcm->rtcm3_1006.station_id = (unsigned short)ugrab(12);
+ ugrab(6); /* reserved */
+ if ((bool)ugrab(1))
+ rtcm->rtcm3_1006.system = gps;
+ else if ((bool)ugrab(1))
+ rtcm->rtcm3_1006.system = glonass;
+ else if ((bool)ugrab(1))
+ rtcm->rtcm3_1006.system = galileo;
+ rtcm->rtcm3_1006.reference_station = (bool)ugrab(1);
+ rtcm->rtcm3_1006.ecef_x = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcm3_1006.single_receiver = ugrab(1);
+ ugrab(1);
+ rtcm->rtcm3_1006.ecef_y = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ ugrab(2);
+ rtcm->rtcm3_1006.ecef_z = sgrab(38) * ANTENNA_POSITION_RESOLUTION;
+ rtcm->rtcm3_1006.height = ugrab(16) * ANTENNA_POSITION_RESOLUTION;
break;
case 1007:
@@ -253,6 +284,8 @@ void rtcm3_dump(struct rtcm3_t *rtcm, FILE *fp)
{
int i;
+ char *systems[] = {"GPS", "Glonass", "Galileo", "unknown"};
+
(void)fprintf(fp, "%u (%u):\n", rtcm->type, rtcm->length);
#define BOOL(c) (c!=0 ? 't' : 'f')
@@ -357,9 +390,28 @@ void rtcm3_dump(struct rtcm3_t *rtcm, FILE *fp)
break;
case 1005:
+ (void)fprintf(fp,
+ " station_id=%d, %s refstation=%c sro=%c x=%f y=%f z=%f\n",
+ rtcm->rtcm3_1005.station_id,
+ systems[rtcm->rtcm3_1005.system],
+ BOOL(rtcm->rtcm3_1005.reference_station),
+ BOOL(rtcm->rtcm3_1005.single_receiver),
+ rtcm->rtcm3_1005.ecef_x,
+ rtcm->rtcm3_1005.ecef_y,
+ rtcm->rtcm3_1005.ecef_z);
break;
case 1006:
+ (void)fprintf(fp,
+ " station_id=%d, %s refstation=%c sro=%c x=%f y=%f z=%f a=%f\n",
+ rtcm->rtcm3_1006.station_id,
+ systems[rtcm->rtcm3_1006.system],
+ BOOL(rtcm->rtcm3_1006.reference_station),
+ BOOL(rtcm->rtcm3_1006.single_receiver),
+ rtcm->rtcm3_1006.ecef_x,
+ rtcm->rtcm3_1006.ecef_y,
+ rtcm->rtcm3_1006.ecef_z,
+ rtcm->rtcm3_1006.height);
break;
case 1007: