From 1f0b7bc595ee3df02550ec3ea91f24e43d166fff Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Mon, 4 Dec 2006 05:21:11 +0000 Subject: Make the code for Magnavox-format output work again... ...though it's still not hooked up to anything in rtcmdecode(). --- gpsd.h | 4 ++++ isgps.c | 32 ++++++++++++++++++++++++++++++++ rtcm.c | 35 ++++------------------------------- rtcmdecode.c | 12 +++++++----- rtcmdecode.xml | 4 ++++ 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 @@ -d -e -v debuglevel + -V @@ -52,6 +53,9 @@ the format of rtcm-1045 to standard output. +The -V option directs the program to emit its version number, +then exit. + The -v option sets a verbosity level. It is mainly of interest to developers. -- cgit v1.2.1