summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>2011-03-01 02:05:12 -0500
committerEric S. Raymond <esr@thyrsus.com>2011-03-01 02:05:12 -0500
commit88c470d67e400fde5d3ecd2eb07116581fb80a6e (patch)
tree93d88c6dfc46b2cf54320afb0a3c5519cabde5d0
parent049cfc6b80f96d56eb8e1a470cbef7e66db4e8aa (diff)
downloadgpsd-88c470d67e400fde5d3ecd2eb07116581fb80a6e.tar.gz
Replace the crappy old RTCM3 dumper with one that emits JSON.
-rw-r--r--driver_rtcm3.c369
-rw-r--r--gps.h41
-rw-r--r--gpsd.h-tail4
-rw-r--r--gpsd_json.c435
-rw-r--r--gpsdecode.c10
5 files changed, 462 insertions, 397 deletions
diff --git a/driver_rtcm3.c b/driver_rtcm3.c
index 137d1b32..6770646e 100644
--- a/driver_rtcm3.c
+++ b/driver_rtcm3.c
@@ -3,7 +3,7 @@
This is a decoder for RTCM-104 3.x, a serial protocol used for
broadcasting pseudorange corrections from differential-GPS reference
stations. The applicable specification is RTCM 10403.1: RTCM Paper
-177-2006-SC104-STD. This obsolesces the esrlier RTCM-104 2.x
+177-2006-SC104-STD. This obsolesces the earlier RTCM-104 2.x
specifications. The specification document is proprietary; ordering
instructions are accessible from <http://www.rtcm.org/>
under "Publications".
@@ -548,372 +548,15 @@ void rtcm3_unpack( /*@out@*/ struct rtcm3_t *rtcm, char *buf)
bitcount += 8 * n;
assert(bitcount == (int)(72 + 8 * n));
break;
- }
-#undef sgrab
-#undef ugrab
- /*@ +evalorder +sefparams +mayaliasunique @*/
-}
-
-void rtcm3_dump(struct rtcm3_t *rtcm, FILE * fp)
-/* dump the contents of a parsed RTCM104 message */
-{
- 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')
-#define CODE(x) (unsigned int)(x)
-#define INT(x) (unsigned int)(x)
- switch (rtcm->type) {
- case 1001:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1001.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1001.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1001.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1001.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1001.header.interval,
- rtcm->rtcmtypes.rtcm3_1001.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.indicator),
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1001.rtk_data[i].
- L1.locktime));
- }
- break;
-
- case 1002:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1002.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1002.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1002.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1002.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1002.header.interval,
- rtcm->rtcmtypes.rtcm3_1002.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.indicator),
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
- L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
- L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR);
- }
- break;
-
- case 1003:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1003.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1003.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1003.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1003.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1003.header.interval,
- rtcm->rtcmtypes.rtcm3_1003.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.indicator),
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.locktime),
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L2.indicator),
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L2.locktime));
- }
- break;
-
- case 1004:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smoothing=%c interval=%u satcount=%u\n",
- rtcm->rtcmtypes.rtcm3_1004.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1004.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1004.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1004.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1004.header.interval,
- rtcm->rtcmtypes.rtcm3_1004.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L1.indicator),
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].
- L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1002.rtk_data[i].L1.CNR,
- CODE(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L2.indicator),
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L2.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].
- L2.ambiguity),
- rtcm->rtcmtypes.rtcm3_1004.rtk_data[i].L2.CNR);
- }
- break;
-
- case 1005:
- (void)fprintf(fp,
- " station_id=%u, %s refstation=%c sro=%c x=%f y=%f z=%f\n",
- rtcm->rtcmtypes.rtcm3_1005.station_id,
- systems[rtcm->rtcmtypes.rtcm3_1005.system],
- BOOL(rtcm->rtcmtypes.rtcm3_1005.reference_station),
- BOOL(rtcm->rtcmtypes.rtcm3_1005.single_receiver),
- rtcm->rtcmtypes.rtcm3_1005.ecef_x,
- rtcm->rtcmtypes.rtcm3_1005.ecef_y,
- rtcm->rtcmtypes.rtcm3_1005.ecef_z);
- break;
-
- case 1006:
- (void)fprintf(fp,
- " station_id=%u, %s refstation=%c sro=%c x=%f y=%f z=%f a=%f\n",
- rtcm->rtcmtypes.rtcm3_1006.station_id,
- systems[rtcm->rtcmtypes.rtcm3_1006.system],
- BOOL(rtcm->rtcmtypes.rtcm3_1006.reference_station),
- 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,
- rtcm->rtcmtypes.rtcm3_1006.height);
- break;
-
- case 1007:
- (void)fprintf(fp,
- " station_id=%u, desc=%s setup-id=%u\n",
- rtcm->rtcmtypes.rtcm3_1007.station_id,
- rtcm->rtcmtypes.rtcm3_1007.descriptor,
- INT(rtcm->rtcmtypes.rtcm3_1007.setup_id));
- break;
-
- case 1008:
- (void)fprintf(fp,
- " station_id=%u, desc=%s setup-id=%u serial=%s\n",
- rtcm->rtcmtypes.rtcm3_1008.station_id,
- rtcm->rtcmtypes.rtcm3_1008.descriptor,
- INT(rtcm->rtcmtypes.rtcm3_1008.setup_id),
- rtcm->rtcmtypes.rtcm3_1008.serial);
- break;
-
- case 1009:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1009.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1009.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1009.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1009.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1009.header.interval,
- rtcm->rtcmtypes.rtcm3_1009.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].
- L1.channel),
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1009.rtk_data[i].
- L1.locktime));
- }
- break;
-
- case 1010:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1010.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1010.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1010.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1010.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1010.header.interval,
- rtcm->rtcmtypes.rtcm3_1010.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1003.rtk_data[i].
- L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
- L1.channel),
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
- L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].
- L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1010.rtk_data[i].L1.CNR);
- }
- break;
-
- case 1011:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1011.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1011.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1011.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1011.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1011.header.interval,
- rtcm->rtcmtypes.rtcm3_1011.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u\n",
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L1.channel),
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L1.locktime),
- CODE(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L2.indicator),
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1011.rtk_data[i].
- L2.locktime));
- }
- break;
-
- case 1012:
- (void)fprintf(fp,
- " #station_id=%u, tow=%d sync=%c smooting=%c interval=%u satcount=%u",
- rtcm->rtcmtypes.rtcm3_1012.header.station_id,
- (int)rtcm->rtcmtypes.rtcm3_1012.header.tow,
- BOOL(rtcm->rtcmtypes.rtcm3_1012.header.sync),
- BOOL(rtcm->rtcmtypes.rtcm3_1012.header.smoothing),
- rtcm->rtcmtypes.rtcm3_1012.header.interval,
- rtcm->rtcmtypes.rtcm3_1012.header.satcount);
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) {
- (void)fprintf(fp,
- " ident=%u\n L1: ind=%u channel=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n L2: ind=%u prange=%8.1f delta=%6.4f lockt=%u amb=%u CNR=%.2f\n",
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].ident,
- CODE(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L1.indicator),
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L1.channel),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L1.pseudorange,
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L1.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L1.ambiguity),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L1.CNR,
- CODE(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L2.indicator),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L2.pseudorange,
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.rangediff,
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L2.locktime),
- INT(rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].
- L2.ambiguity),
- rtcm->rtcmtypes.rtcm3_1012.rtk_data[i].L2.CNR);
- }
- break;
-
- case 1013:
- (void)fprintf(fp,
- " station_id=%u, mjd=%u sec=%u leapsecs=%u ncount=%u\n",
- rtcm->rtcmtypes.rtcm3_1013.station_id,
- rtcm->rtcmtypes.rtcm3_1013.mjd,
- rtcm->rtcmtypes.rtcm3_1013.sod,
- INT(rtcm->rtcmtypes.rtcm3_1013.leapsecs),
- INT(rtcm->rtcmtypes.rtcm3_1013.ncount));
- for (i = 0; i < rtcm->rtcmtypes.rtcm3_1013.ncount; i++)
- (void)fprintf(fp,
- " id=%u sync=%c interval=%u\n",
- rtcm->rtcmtypes.rtcm3_1013.announcements[i].id,
- BOOL(rtcm->rtcmtypes.rtcm3_1013.
- announcements[i].sync),
- rtcm->rtcmtypes.rtcm3_1013.
- announcements[i].interval);
- break;
-
- case 1014:
- (void)fprintf(fp,
- " netid=%u subnetid=%u statcount=%u master=%u aux=%u lat=%f, lon=%f, alt=%f\n",
- rtcm->rtcmtypes.rtcm3_1014.network_id,
- rtcm->rtcmtypes.rtcm3_1014.subnetwork_id,
- (uint) rtcm->rtcmtypes.rtcm3_1014.stationcount,
- rtcm->rtcmtypes.rtcm3_1014.master_id,
- rtcm->rtcmtypes.rtcm3_1014.aux_id,
- rtcm->rtcmtypes.rtcm3_1014.d_lat,
- rtcm->rtcmtypes.rtcm3_1014.d_lon,
- rtcm->rtcmtypes.rtcm3_1014.d_alt);
- break;
-
- case 1015:
- break;
-
- case 1016:
- break;
-
- case 1017:
- break;
-
- case 1018:
- break;
-
- case 1019:
- break;
-
- case 1020:
- break;
-
- case 1029:
- (void)fprintf(fp,
- " station_id=%u, mjd=%u sec=%u len=%u units=%u msg=%s\n",
- rtcm->rtcmtypes.rtcm3_1029.station_id,
- rtcm->rtcmtypes.rtcm3_1029.mjd,
- rtcm->rtcmtypes.rtcm3_1029.sod,
- INT(rtcm->rtcmtypes.rtcm3_1029.len),
- INT(rtcm->rtcmtypes.rtcm3_1029.unicode_units),
- (char *)rtcm->rtcmtypes.rtcm3_1029.text);
- break;
default:
- (void)fprintf(fp, " Unknown content\n");
+ //memcpy(tp->rtcmtypes.data, msg->msg_type.rtcm2_msgunk,
+ // (RTCM2_WORDS_MAX - 2) * sizeof(isgps30bits_t));
break;
}
-#undef CODE
-#undef BOOL
-#undef INT
+#undef sgrab
+#undef ugrab
+ /*@ +evalorder +sefparams +mayaliasunique @*/
}
/* *INDENT-ON* */
diff --git a/gps.h b/gps.h
index 779b73c5..94275d14 100644
--- a/gps.h
+++ b/gps.h
@@ -301,19 +301,19 @@ struct rtcm3_t {
/* 1001-1013 were present in the 3.0 version */
struct {
struct rtcm3_rtk_hdr header;
- struct {
+ struct rtcm3_1001_t {
unsigned ident; /* Satellite ID */
struct rtcm3_basic_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1001;
- struct {
+ struct rtcm3_1002_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1002;
- struct {
+ struct rtcm3_1003_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
@@ -321,7 +321,7 @@ struct rtcm3_t {
struct rtcm3_basic_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1003;
- struct {
+ struct rtcm3_1004_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
@@ -329,14 +329,14 @@ struct rtcm3_t {
struct rtcm3_extended_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1004;
- struct {
+ struct rtcm3_1005_t {
unsigned int station_id; /* Reference Station ID */
int system; /* Which system is it? */
bool reference_station; /* Reference-station indicator */
bool single_receiver; /* Single Receiver Oscillator */
double ecef_x, ecef_y, ecef_z; /* ECEF antenna location */
} rtcm3_1005;
- struct {
+ struct rtcm3_1006_t {
unsigned int station_id; /* Reference Station ID */
int system; /* Which system is it? */
bool reference_station; /* Reference-station indicator */
@@ -344,32 +344,32 @@ struct rtcm3_t {
double ecef_x, ecef_y, ecef_z; /* ECEF antenna location */
double height; /* Antenna height */
} rtcm3_1006;
- struct {
+ struct rtcm3_1007_t {
unsigned int station_id; /* Reference Station ID */
char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */
unsigned char setup_id;
} rtcm3_1007;
- struct {
+ struct rtcm3_1008_t {
unsigned int station_id; /* Reference Station ID */
char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */
unsigned char setup_id;
char serial[RTCM3_MAX_DESCRIPTOR+1]; /* Serial # string */
} rtcm3_1008;
- struct {
+ struct rtcm3_1009_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
struct rtcm3_basic_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1009;
- struct {
+ struct rtcm3_1010_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1010;
- struct {
+ struct rtcm3_1011_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
@@ -377,7 +377,7 @@ struct rtcm3_t {
struct rtcm3_extended_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1011;
- struct {
+ struct rtcm3_1012_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
@@ -385,7 +385,7 @@ struct rtcm3_t {
struct rtcm3_extended_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1012;
- struct {
+ struct rtcm3_1013_t {
unsigned int station_id; /* Reference Station ID */
unsigned short mjd; /* Modified Julian Day (MJD) Number */
unsigned int sod; /* Seconds of Day (UTC) */
@@ -398,7 +398,7 @@ struct rtcm3_t {
} announcements[RTCM3_MAX_ANNOUNCEMENTS];
} rtcm3_1013;
/* 1014-1017 were added in the 3.1 version */
- struct {
+ struct rtcm3_1014_t {
unsigned int network_id; /* Network ID */
unsigned int subnetwork_id; /* Subnetwork ID */
unsigned char stationcount; /* # auxiliary stations transmitted */
@@ -406,20 +406,20 @@ struct rtcm3_t {
unsigned int aux_id; /* Auxilary Reference Station ID */
double d_lat, d_lon, d_alt; /* Aux-master location delta */
} rtcm3_1014;
- struct {
+ struct rtcm3_1015_t {
struct rtcm3_network_rtk_header header;
struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
} rtcm3_1015;
- struct {
+ struct rtcm3_1016_t {
struct rtcm3_network_rtk_header header;
struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
} rtcm3_1016;
- struct {
+ struct rtcm3_1017_t {
struct rtcm3_network_rtk_header header;
struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
} rtcm3_1017;
/* 1018-1029 were in the 3.0 version */
- struct {
+ struct rtcm3_1019_t {
unsigned int ident; /* Satellite ID */
unsigned int week; /* GPS Week Number */
unsigned char sv_accuracy; /* GPS SV ACCURACY */
@@ -452,7 +452,7 @@ struct rtcm3_t {
bool p_data;
bool fit_interval;
} rtcm3_1019;
- struct {
+ struct rtcm3_1020_t {
unsigned int ident; /* Satellite ID */
unsigned short channel; /* Satellite Frequency Channel Number */
/* ephemeris fields, not scaled */
@@ -490,7 +490,7 @@ struct rtcm3_t {
signed int M_tau_sub_GPS;
bool M_l_sub_n;
} rtcm3_1020;
- struct {
+ struct rtcm3_1029_t {
unsigned int station_id; /* Reference Station ID */
unsigned short mjd; /* Modified Julian Day (MJD) Number */
unsigned int sod; /* Seconds of Day (UTC) */
@@ -498,6 +498,7 @@ struct rtcm3_t {
unsigned char unicode_units;
unsigned char text[128];
} rtcm3_1029;
+ char data[4096];
} rtcmtypes;
};
diff --git a/gpsd.h-tail b/gpsd.h-tail
index 37a9fb8e..6fc6a4bd 100644
--- a/gpsd.h-tail
+++ b/gpsd.h-tail
@@ -159,10 +159,10 @@ extern void isgps_output_magnavox(const isgps30bits_t *, unsigned int, FILE *);
extern enum isgpsstat_t rtcm2_decode(struct gps_packet_t *, unsigned int);
extern void json_rtcm2_dump(const struct rtcm2_t *,
/*@null@*/const char *, /*@out@*/char[], size_t);
-extern int rtcm2_undump(/*@out@*/struct rtcm2_t *, char *);
extern void rtcm2_unpack(/*@out@*/struct rtcm2_t *, char *);
+extern void json_rtcm3_dump(const struct rtcm3_t *,
+ /*@null@*/const char *, /*@out@*/char[], size_t);
extern void rtcm3_unpack(/*@out@*/struct rtcm3_t *, char *);
-extern void rtcm3_dump(struct rtcm3_t *rtcm, FILE *);
/* Next, declarations for the core library... */
diff --git a/gpsd_json.c b/gpsd_json.c
index 512ed2c8..afc0d554 100644
--- a/gpsd_json.c
+++ b/gpsd_json.c
@@ -861,8 +861,431 @@ void json_rtcm2_dump(const struct rtcm2_t *rtcm,
}
#endif /* defined(RTCM104V2_ENABLE) */
-#if defined(AIVDM_ENABLE)
+#if defined(RTCM104V3_ENABLE)
+void json_rtcm3_dump(const struct rtcm3_t *rtcm,
+ /*@null@*/const char *device,
+ /*@out@*/char buf[], size_t buflen)
+/* dump the contents of a parsed RTCM104v3 message as JSON */
+{
+ /*@-mustfreefresh@*/
+ char buf1[JSON_VAL_MAX * 2 + 1];
+ const char *systems[] = { "GPS", "Glonass", "Galileo", "unknown" };
+ unsigned short i;
+ unsigned int n;
+
+ (void)snprintf(buf, buflen, "{\"class\":\"RTCM3\",");
+ if (device != NULL && device[0] != '\0')
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"device\":\"%s\",", device);
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"type\":%u,", rtcm->type);
+
+#define CODE(x) (unsigned int)(x)
+#define INT(x) (unsigned int)(x)
+ switch (rtcm->type) {
+ case 1001:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1001.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1001.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1001.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1001.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1001.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1001.header.satcount; i++) {
+#define R1001 rtcm->rtcmtypes.rtcm3_1001.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,\"ind\":%u,\"prange\"=%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u},",
+ R1001.ident,
+ CODE(R1001.L1.indicator),
+ R1001.L1.pseudorange,
+ R1001.L1.rangediff,
+ INT(R1001.L1.locktime));
+#undef R1001
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1002:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1002.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1002.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1002.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1002.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1002.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1002.header.satcount; i++) {
+#define R1002 rtcm->rtcmtypes.rtcm3_1002.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u,\"amb\":%u,"
+ "\"CNR\":%.2f},",
+ R1002.ident,
+ CODE(R1002.L1.indicator),
+ R1002.L1.pseudorange,
+ R1002.L1.rangediff,
+ INT(R1002.L1.locktime),
+ INT(R1002.L1.ambiguity),
+ R1002.L1.CNR);
+#undef R1002
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+ case 1003:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1003.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1003.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1003.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1003.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1003.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1003.header.satcount; i++) {
+#define R1003 rtcm->rtcmtypes.rtcm3_1003.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,"
+ "\"L1\":{\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u},"
+ "\"L2\":{\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u},"
+ "},",
+ R1003.ident,
+ CODE(R1003.L1.indicator),
+ R1003.L1.pseudorange,
+ R1003.L1.rangediff,
+ INT(R1003.L1.locktime),
+ CODE(R1003.L2.indicator),
+ R1003.L2.pseudorange,
+ R1003.L2.rangediff,
+ INT(R1003.L2.locktime));
+#undef R1003
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1004:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1004.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1004.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1004.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1004.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1004.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1004.header.satcount; i++) {
+#define R1004 rtcm->rtcmtypes.rtcm3_1004.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,"
+ "\"L1\":{\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u,"
+ "\"amb\":%u,\"CNR\":%.2f}"
+ "\"L2\":{\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u,"
+ "\"amb\":%u,\"CNR\":%.2f}"
+ "},",
+ R1004.ident,
+ CODE(R1004.L1.indicator),
+ R1004.L1.pseudorange,
+ R1004.L1.rangediff,
+ INT(R1004.L1.locktime),
+ INT(R1004.L1.ambiguity),
+ R1004.L1.CNR,
+ CODE(R1004.L2.indicator),
+ R1004.L2.pseudorange,
+ R1004.L2.rangediff,
+ INT(R1004.L2.locktime),
+ INT(R1004.L2.ambiguity),
+ R1004.L2.CNR);
+#undef R1004
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1005:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"system\":\"%s\","
+ "\"refstation\":\"%s\",\"sro\":\"%s\","
+ "\"x\":%f,\"y\":%f,\"z\":%f,",
+ rtcm->rtcmtypes.rtcm3_1005.station_id,
+ systems[rtcm->rtcmtypes.rtcm3_1005.system],
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1005.reference_station),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1005.single_receiver),
+ rtcm->rtcmtypes.rtcm3_1005.ecef_x,
+ rtcm->rtcmtypes.rtcm3_1005.ecef_y,
+ rtcm->rtcmtypes.rtcm3_1005.ecef_z);
+ break;
+
+ case 1006:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"system\":\"%s\","
+ "\"refstation\":\"%s\",\"sro\":\"%s\","
+ "\"x\":%f,\"y\":%f,\"z\":%f,\"a\":%f,",
+ rtcm->rtcmtypes.rtcm3_1006.station_id,
+ systems[rtcm->rtcmtypes.rtcm3_1006.system],
+ 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,
+ rtcm->rtcmtypes.rtcm3_1006.height);
+ break;
+
+ case 1007:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"desc\":\"%s\",\"setup-id\":%u",
+ rtcm->rtcmtypes.rtcm3_1007.station_id,
+ rtcm->rtcmtypes.rtcm3_1007.descriptor,
+ INT(rtcm->rtcmtypes.rtcm3_1007.setup_id));
+ break;
+
+ case 1008:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"desc\":\"%s\","
+ "\"setup-id\":%u,\"serial\":\"%s\"",
+ rtcm->rtcmtypes.rtcm3_1008.station_id,
+ rtcm->rtcmtypes.rtcm3_1008.descriptor,
+ INT(rtcm->rtcmtypes.rtcm3_1008.setup_id),
+ rtcm->rtcmtypes.rtcm3_1008.serial);
+ break;
+
+ case 1009:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\","
+ "\"satcount\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1009.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1009.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1009.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1009.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1009.header.interval,
+ rtcm->rtcmtypes.rtcm3_1009.header.satcount);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1009.header.satcount; i++) {
+#define R1009 rtcm->rtcmtypes.rtcm3_1009.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,\"ind\":%u,\"channel\":%u,"
+ "\"prange\":%8.1f,\"delta\":%6.4f,\"lockt\":%u},",
+ R1009.ident,
+ CODE(R1009.L1.indicator),
+ INT(R1009.L1.channel),
+ R1009.L1.pseudorange,
+ R1009.L1.rangediff,
+ INT(R1009.L1.locktime));
+#undef R1009
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1010:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1010.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1010.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1010.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1010.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1010.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1010.header.satcount; i++) {
+#define R1010 rtcm->rtcmtypes.rtcm3_1010.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,\"ind\":%u,\"channel\":%u,"
+ "\"prange\":%8.1f,\"delta\":%6.4f,\"lockt\":%u,"
+ "\"amb\":%u,\"CNR\":%.2f},",
+ R1010.ident,
+ CODE(R1010.L1.indicator),
+ INT(R1010.L1.channel),
+ R1010.L1.pseudorange,
+ R1010.L1.rangediff,
+ INT(R1010.L1.locktime),
+ INT(R1010.L1.ambiguity),
+ R1010.L1.CNR);
+#undef R1010
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1011:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1011.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1011.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1011.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1011.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1011.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1011.header.satcount; i++) {
+#define R1011 rtcm->rtcmtypes.rtcm3_1011.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,"
+ "\"L1\":{\"ind\":%u,\"channel\":%u,"
+ "\"prange\":%8.1f,\"delta\":%6.4f,\"lockt\":%u},"
+ "\"L2:{\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u}"
+ "}",
+ R1011.ident,
+ CODE(R1011.L1.indicator),
+ INT(R1011.L1.channel),
+ R1011.L1.pseudorange,
+ R1011.L1.rangediff,
+ INT(R1011.L1.locktime),
+ CODE(R1011.L2.indicator),
+ R1011.L2.pseudorange,
+ R1011.L2.rangediff,
+ INT(R1011.L2.locktime));
+#undef R1011
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1012:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"tow\":%d,\"sync\":\"%s\","
+ "\"smoothing\":\"%s\",\"interval\":\"%u\",",
+ rtcm->rtcmtypes.rtcm3_1012.header.station_id,
+ (int)rtcm->rtcmtypes.rtcm3_1012.header.tow,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1012.header.sync),
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1012.header.smoothing),
+ rtcm->rtcmtypes.rtcm3_1012.header.interval);
+ (void)strlcat(buf, "\"satellites\":[", buflen);
+ for (i = 0; i < rtcm->rtcmtypes.rtcm3_1012.header.satcount; i++) {
+#define R1012 rtcm->rtcmtypes.rtcm3_1012.rtk_data[i]
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"ident\":%u,"
+ "\"L1\":{\"ind\":%u,\"channel\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u,\"amb\":%u,"
+ "\"CNR\":%.2f},"
+ "\"L2\":{\"ind\":%u,\"prange\":%8.1f,"
+ "\"delta\":%6.4f,\"lockt\":%u,\"amb\":%u,"
+ "\"CNR\":%.2f},"
+ "},",
+ R1012.ident,
+ CODE(R1012.L1.indicator),
+ INT(R1012.L1.channel),
+ R1012.L1.pseudorange,
+ R1012.L1.rangediff,
+ INT(R1012.L1.locktime),
+ INT(R1012.L1.ambiguity),
+ R1012.L1.CNR,
+ CODE(R1012.L2.indicator),
+ R1012.L2.pseudorange,
+ R1012.L2.rangediff,
+ INT(R1012.L2.locktime),
+ INT(R1012.L2.ambiguity),
+ R1012.L2.CNR);
+#undef R1012
+ }
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+
+ case 1013:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"mjd\":%u,\"sec\":%u,"
+ "\"leapsecs\":%u,",
+ rtcm->rtcmtypes.rtcm3_1013.station_id,
+ rtcm->rtcmtypes.rtcm3_1013.mjd,
+ rtcm->rtcmtypes.rtcm3_1013.sod,
+ INT(rtcm->rtcmtypes.rtcm3_1013.leapsecs));
+ for (i = 0; i < (unsigned short)rtcm->rtcmtypes.rtcm3_1013.ncount; i++)
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "{\"id\":%u,\"sync\"=\"%s\",\"interval\":%u}",
+ rtcm->rtcmtypes.rtcm3_1013.announcements[i].id,
+ JSON_BOOL(rtcm->rtcmtypes.rtcm3_1013.
+ announcements[i].sync),
+ rtcm->rtcmtypes.rtcm3_1013.
+ announcements[i].interval);
+ break;
+
+ case 1014:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"netid\":%u,\"subnetid\":%u,\"statcount\":%u"
+ "\"master\":%u,\"aux\":%u,\"lat\":%f,\"lon\":%f,\"alt\":%f,",
+ rtcm->rtcmtypes.rtcm3_1014.network_id,
+ rtcm->rtcmtypes.rtcm3_1014.subnetwork_id,
+ (uint) rtcm->rtcmtypes.rtcm3_1014.stationcount,
+ rtcm->rtcmtypes.rtcm3_1014.master_id,
+ rtcm->rtcmtypes.rtcm3_1014.aux_id,
+ rtcm->rtcmtypes.rtcm3_1014.d_lat,
+ rtcm->rtcmtypes.rtcm3_1014.d_lon,
+ rtcm->rtcmtypes.rtcm3_1014.d_alt);
+ break;
+
+ case 1015:
+ break;
+
+ case 1016:
+ break;
+
+ case 1017:
+ break;
+
+ case 1018:
+ break;
+
+ case 1019:
+ break;
+
+ case 1020:
+ break;
+
+ case 1029:
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"station_id\":%u,\"mjd\":%u,\"sec\":%u,"
+ "\"len\":%u,\"units\":%u,\"msg\"=\"%s\",",
+ rtcm->rtcmtypes.rtcm3_1029.station_id,
+ rtcm->rtcmtypes.rtcm3_1029.mjd,
+ rtcm->rtcmtypes.rtcm3_1029.sod,
+ INT(rtcm->rtcmtypes.rtcm3_1029.len),
+ INT(rtcm->rtcmtypes.rtcm3_1029.unicode_units),
+ json_stringify(buf1, sizeof(buf1),
+ (char *)rtcm->rtcmtypes.rtcm3_1029.text));
+ break;
+
+ default:
+ (void)strlcat(buf, "\"data\":[", buflen);
+ for (n = 0; n < rtcm->length; n++)
+ (void)snprintf(buf + strlen(buf), buflen - strlen(buf),
+ "\"0x%02x\",",(unsigned int)rtcm->rtcmtypes.data[n]);
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "]", buflen);
+ break;
+ }
+
+ if (buf[strlen(buf) - 1] == ',')
+ buf[strlen(buf) - 1] = '\0';
+ (void)strlcat(buf, "}\r\n", buflen);
+ /*@+mustfreefresh@*/
+#undef CODE
+#undef INT
+}
+#endif /* defined(RTCM104V3_ENABLE) */
+
+#if defined(AIVDM_ENABLE)
void json_aivdm_dump(const struct ais_t *ais,
/*@null@*/const char *device, bool scaled,
/*@out@*/char *buf, size_t buflen)
@@ -1064,7 +1487,6 @@ void json_aivdm_dump(const struct ais_t *ais,
#define NAVAIDTYPE_DISPLAY(n) (((n) < (unsigned int)NITEMS(navaid_type_legends[0])) ? navaid_type_legends[n] : "INVALID NAVAID TYPE")
-#define JSON_BOOL(x) ((x)?"true":"false")
(void)snprintf(buf, buflen, "{\"class\":\"AIS\",");
if (device != NULL && device[0] != '\0')
(void)snprintf(buf + strlen(buf), buflen - strlen(buf),
@@ -1688,7 +2110,6 @@ void json_aivdm_dump(const struct ais_t *ais,
break;
}
/*@ +formatcode +mustfreefresh @*/
-#undef SHOW_BOOL
}
#endif /* defined(AIVDM_ENABLE) */
@@ -1857,6 +2278,13 @@ void json_data_report(gps_mask_t changed,
}
#endif /* RTCM104V2_ENABLE */
+#ifdef RTCM104V3_ENABLE
+ if ((changed & RTCM3_IS) != 0) {
+ json_rtcm3_dump(&datap->rtcm3, datap->dev.path,
+ buf+strlen(buf), buflen-strlen(buf));
+ }
+#endif /* RTCM104V3_ENABLE */
+
#ifdef AIVDM_ENABLE
if ((changed & AIS_IS) != 0) {
json_aivdm_dump(&datap->ais, datap->dev.path,
@@ -1866,5 +2294,6 @@ void json_data_report(gps_mask_t changed,
#endif /* AIVDM_ENABLE */
}
+#undef JSON_BOOL
/* gpsd_json.c ends here */
diff --git a/gpsdecode.c b/gpsdecode.c
index 6ccfb104..a8530688 100644
--- a/gpsdecode.c
+++ b/gpsdecode.c
@@ -387,26 +387,18 @@ static void decode(FILE *fpin, FILE*fpout)
(void)fputs((char *)session.packet.outbuffer, fpout);
if ((changed & (REPORT_IS|SUBFRAME_IS|AIS_IS|RTCM2_IS|RTCM3_IS)) == 0)
continue;
- /*
- * We really ought to get rid of the non-JSON cases someday.
- * They're not used for production, only regression testing.
- */
else if (json) {
json_data_report(changed,
&session.gpsdata, &policy,
buf, sizeof(buf));
(void)fputs(buf, fpout);
-#ifdef RTCM104V3_ENABLE
- } else if (session.packet.type == RTCM3_PACKET) {
- rtcm3_dump(&session.gpsdata.rtcm3, fpout);
-#endif
#ifdef AIVDM_ENABLE
} else if (session.packet.type == AIVDM_PACKET) {
if ((changed & AIS_IS)!=0) {
aivdm_csv_dump(&session.gpsdata.ais, buf, sizeof(buf));
(void)fputs(buf, fpout);
}
-#endif
+#endif /* AIVDM_ENABLE */
}
}
}