summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gpsd.h4
-rw-r--r--isgps.c32
-rw-r--r--rtcm.c35
-rw-r--r--rtcmdecode.c12
-rw-r--r--rtcmdecode.xml4
5 files changed, 51 insertions, 36 deletions
diff --git a/gpsd.h b/gpsd.h
index db287b00..010b91a9 100644
--- a/gpsd.h
+++ b/gpsd.h
@@ -109,12 +109,14 @@ enum isgpsstat_t isgps_decode(struct gps_packet_t *,
size_t,
unsigned int);
extern unsigned int isgps_parity(isgps30bits_t);
+extern void isgps_output_magnavox(isgps30bits_t *, unsigned int, FILE *);
extern enum isgpsstat_t rtcm_decode(struct gps_packet_t *, unsigned int);
extern void rtcm_dump(struct rtcm_t *, /*@out@*/char[], size_t);
extern int rtcm_undump(/*@out@*/struct rtcm_t *, char *);
extern void rtcm_unpack(/*@out@*/struct rtcm_t *, char *);
extern bool rtcm_repack(struct rtcm_t *, isgps30bits_t *);
+extern void rtcm_output_magnavox(isgps30bits_t *, FILE *);
/* Next, declarations for the core library... */
@@ -333,7 +335,9 @@ extern int dgnss_open(struct gps_context_t *, char *);
extern int dgnss_poll(struct gps_context_t *);
extern void dgnss_report(struct gps_device_t *);
extern void dgnss_autoconnect(struct gps_context_t *, double, double);
+
extern void rtcm_relay(struct gps_device_t *);
+extern void rtcm_output_mag(isgps30bits_t *, FILE *);
extern int dgpsip_open(struct gps_context_t *, const char *);
extern void dgpsip_report(struct gps_device_t *);
diff --git a/isgps.c b/isgps.c
index 197e552d..92537c1f 100644
--- a/isgps.c
+++ b/isgps.c
@@ -305,3 +305,35 @@ enum isgpsstat_t isgps_decode(struct gps_packet_t *session,
return ISGPS_NO_SYNC;
}
/*@ +usereleased +compdef @*/
+
+/*
+ * ISGPS data words are 30-bit words. We will lay them into memory into
+ * 30-bit (low-end justified) chunks. To write them out we will write
+ * 5 Magnavox-format bytes where the low 6-bits of the byte are 6-bits
+ * of the 30-word msg.
+ */
+void isgps_output_magnavox(isgps30bits_t *ip, unsigned int len, FILE *fp)
+/* ship an RTCM message to standard output in Magnavox format */
+{
+ static isgps30bits_t w = 0;
+
+ while (len-- > 0) {
+ w <<= 30;
+ w |= *ip++ & W_DATA_MASK;
+
+ w |= isgps_parity(w);
+
+ /* weird-assed inversion */
+ if (w & P_30_MASK)
+ w ^= W_DATA_MASK;
+
+ /* msb first */
+ /*@ -type @*/
+ (void)fputc(MAG_TAG_DATA | reverse_bits[(w >> 24) & 0x3f], fp);
+ (void)fputc(MAG_TAG_DATA | reverse_bits[(w >> 18) & 0x3f], fp);
+ (void)fputc(MAG_TAG_DATA | reverse_bits[(w >> 12) & 0x3f], fp);
+ (void)fputc(MAG_TAG_DATA | reverse_bits[(w >> 6) & 0x3f], fp);
+ (void)fputc(MAG_TAG_DATA | reverse_bits[(w) & 0x3f], fp);
+ /*@ +type @*/
+ }
+}
diff --git a/rtcm.c b/rtcm.c
index 12904a6e..9b1ae9a9 100644
--- a/rtcm.c
+++ b/rtcm.c
@@ -713,42 +713,15 @@ int rtcm_undump(/*@out@*/struct rtcm_t *rtcmp, char *buf)
/*@ +usedef @*/
}
-#ifdef __UNUSED__
-/*
- * The RTCM words are 30-bit words. We will lay them into memory into
- * 30-bit (low-end justified) chunks. To write them out we will write
- * 5 Magnavox-format bytes where the low 6-bits of the byte are 6-bits
- * of the 30-word msg.
- */
-void rtcm_output_mag(isgps30bits_t * ip)
-/* ship an RTCM message to standard output in Magnavox format */
+void rtcm_output_magnavox(isgps30bits_t *ip, FILE *fp)
+/* ship an RTCM message in the format emitted by Magnavox DGPS receivers */
{
- static isgps30bits_t w = 0;
- int len;
static uint sqnum = 0;
- len = ((struct rtcm_msg *) ip)->w2.frmlen + 2;
- ((struct rtcm_msg *) ip)->w2.sqnum = sqnum++;
+ ((struct rtcm_msg_t *) ip)->w2.sqnum = sqnum++;
sqnum &= 0x7;
- while (len-- > 0) {
- w <<= 30;
- w |= *ip++ & W_DATA_MASK;
-
- w |= rtcmparity(w);
-
- /* weird-assed inversion */
- if (w & P_30_MASK)
- w ^= W_DATA_MASK;
-
- /* msb first */
- putchar(MAG_TAG_DATA | reverse_bits[(w >> 24) & 0x3f]);
- putchar(MAG_TAG_DATA | reverse_bits[(w >> 18) & 0x3f]);
- putchar(MAG_TAG_DATA | reverse_bits[(w >> 12) & 0x3f]);
- putchar(MAG_TAG_DATA | reverse_bits[(w >> 6) & 0x3f]);
- putchar(MAG_TAG_DATA | reverse_bits[(w) & 0x3f]);
- }
+ isgps_output_magnavox(ip, ((struct rtcm_msg_t *) ip)->w2.frmlen + 2, fp);
}
-#endif /* UNUSED */
#endif /* RTCM104_ENABLE */
diff --git a/rtcmdecode.c b/rtcmdecode.c
index 4742bc41..a911dfc1 100644
--- a/rtcmdecode.c
+++ b/rtcmdecode.c
@@ -128,28 +128,30 @@ int main(int argc, char **argv)
while ((c = getopt(argc, argv, "dehpVv:")) != EOF) {
switch (c) {
- case 'd': /* not documented, used for debugging */
+ case 'd':
mode = dodecode;
break;
- case 'e': /* not documented, used for debugging */
+ case 'e':
mode = doencode;
break;
- case 'h': /* not documented, used for debugging */
+ case 'h':
striphdr = true;
break;
- case 'p': /* not documented, used for debugging */
+ case 'p': /* undocumented, used for regression-testing */
mode = passthrough;
break;
- case 'v': /* verbose */
+ case 'v':
verbose = ISGPS_ERRLEVEL_BASE + atoi(optarg);
break;
+
case 'V':
(void)fprintf(stderr, "SVN ID: $Id$ \n");
exit(0);
+
case '?':
default:
(void)fputs("rtcmdecode [-v]\n", stderr);
diff --git a/rtcmdecode.xml b/rtcmdecode.xml
index 12214446..2d360818 100644
--- a/rtcmdecode.xml
+++ b/rtcmdecode.xml
@@ -19,6 +19,7 @@
<arg choice='opt'>-d</arg>
<arg choice='opt'>-e</arg>
<arg choice='opt'>-v <replaceable>debuglevel</replaceable></arg>
+ <arg choice='opt'>-V</arg>
</cmdsynopsis>
</refsynopsisdiv>
@@ -52,6 +53,9 @@ the format of
<citerefentry><refentrytitle>rtcm-104</refentrytitle><manvolnum>5</manvolnum></citerefentry>
to standard output.</para>
+<para>The -V option directs the program to emit its version number,
+then exit.</para>
+
<para>The -v option sets a verbosity level. It is mainly of interest
to developers.</para>