diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2011-03-01 02:05:12 -0500 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2011-03-01 02:05:12 -0500 |
commit | 88c470d67e400fde5d3ecd2eb07116581fb80a6e (patch) | |
tree | 93d88c6dfc46b2cf54320afb0a3c5519cabde5d0 | |
parent | 049cfc6b80f96d56eb8e1a470cbef7e66db4e8aa (diff) | |
download | gpsd-88c470d67e400fde5d3ecd2eb07116581fb80a6e.tar.gz |
Replace the crappy old RTCM3 dumper with one that emits JSON.
-rw-r--r-- | driver_rtcm3.c | 369 | ||||
-rw-r--r-- | gps.h | 41 | ||||
-rw-r--r-- | gpsd.h-tail | 4 | ||||
-rw-r--r-- | gpsd_json.c | 435 | ||||
-rw-r--r-- | gpsdecode.c | 10 |
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* */ @@ -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 */ } } } |