summaryrefslogtreecommitdiff
path: root/driver_rtcm2.c
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-02-28 17:42:53 -0500
committerEric S. Raymond <esr@thyrsus.com>2011-02-28 17:42:53 -0500
commitc9c70d8fa2483a506b3b14c68f7c0ca7a69897df (patch)
tree9fff2eda19cc4e726531de115e43dffab542fa95 /driver_rtcm2.c
parent5f28af9f91b118e13c49b949777187ab57d1cff2 (diff)
downloadgpsd-c9c70d8fa2483a506b3b14c68f7c0ca7a69897df.tar.gz
Implement and document RTCM 2.3 message type 13.
Diffstat (limited to 'driver_rtcm2.c')
-rw-r--r--driver_rtcm2.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/driver_rtcm2.c b/driver_rtcm2.c
index e9c989bf..de564850 100644
--- a/driver_rtcm2.c
+++ b/driver_rtcm2.c
@@ -68,8 +68,7 @@ BSD terms apply: see the file COPYING in the distribution root for details.
* Very few of these are left in 2008.)
*
* The RTCM 2.1 standard is less explicit than it should be about signed-integer
- * representations. Two's complement is specified for prc and rrc (msg1wX),
- * but not everywhere.
+ * representations. Two's complement is specified forsome but not all.
*/
#define ZCOUNT_SCALE 0.6 /* sec */
@@ -90,6 +89,9 @@ BSD terms apply: see the file COPYING in the distribution root for details.
#define CNR_OFFSET 24 /* dB */
#define TU_SCALE 5 /* minutes */
+#define LATLON_SCALE 0.01 /* degrees */
+#define RANGE_SCALE 4 /* kilometers */
+
#pragma pack(1)
#ifndef WORDS_BIGENDIAN /* little-endian, like x86 */
@@ -278,6 +280,24 @@ struct rtcm2_msg_t {
} almanac[(RTCM2_WORDS_MAX - 2)/3];
} type7;
+ /* msg 13 - Ground Transmitter Parameters (RTCM2.3 only) */
+ struct rtcm2_msg13 {
+ struct {
+ uint parity:6;
+ int lat:16;
+ uint reserved:6;
+ uint rangeflag:1;
+ uint status:1;
+ uint _pad:2;
+ } w1;
+ struct {
+ uint parity:6;
+ uint range:8;
+ int lon:16;
+ uint _pad:2;
+ } w2;
+ } type13;
+
/* msg 14 - GPS Time of Week (RTCM2.3 only) */
struct rtcm2_msg14 {
struct {
@@ -488,6 +508,24 @@ struct rtcm2_msg_t {
} almanac[(RTCM2_WORDS_MAX - 2)/3];
} type7;
+ /* msg 13 - Ground Transmitter Parameters (RTCM2.3 only) */
+ struct rtcm2_msg13 {
+ struct {
+ uint _pad:2;
+ uint status:1;
+ uint rangeflag:1;
+ uint reserved:6;
+ int lat:16;
+ uint parity:6;
+ } w1;
+ struct {
+ uint _pad:2;
+ int lon:16;
+ uint range:8;
+ uint parity:6;
+ } w2;
+ } type13;
+
/* msg 14 - GPS Time of Week (RTCM2.3 only) */
struct rtcm2_msg14 {
struct {
@@ -671,6 +709,15 @@ void rtcm2_unpack( /*@out@*/ struct rtcm2_t *tp, char *buf)
}
tp->almanac.nentries = (unsigned)(len / 3);
break;
+ case 13:
+ tp->xmitter.status = (bool)msg->msg_type.type13.w1.status;
+ tp->xmitter.rangeflag = (bool)msg->msg_type.type13.w1.rangeflag;
+ tp->xmitter.lat = msg->msg_type.type13.w1.lat * LATLON_SCALE;
+ tp->xmitter.lon = msg->msg_type.type13.w2.lon * LATLON_SCALE;
+ tp->xmitter.range = msg->msg_type.type13.w2.range * RANGE_SCALE;
+ if (tp->xmitter.range == 0)
+ tp->xmitter.range = 1024;
+ break;
case 14:
tp->gpstime.week = msg->msg_type.type14.w1.week;
tp->gpstime.hour = msg->msg_type.type14.w1.hour;