From: Martin Burnicki Date: Tue, 10 Mar 2015 09:48:25 +0000 (+0100) Subject: Fixed loops and decoding of Meinberg GPS satellite info. X-Git-Tag: NTP_4_3_10~8^2^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=581a9636bdbfb9186e766ddbca331b6a8b817358;p=thirdparty%2Fntp.git Fixed loops and decoding of Meinberg GPS satellite info. bk: 54febde9SSfDlTZzpV4zA2Slldvywg --- diff --git a/ChangeLog b/ChangeLog index 9030d8012..f23f90a38 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ --- +* [Bug 2777] Fixed loops and decoding of Meinberg GPS satellite info. * [Bug 2728] See if C99-style structure initialization works. * [Bug 2747] Upgrade libevent to 2.1.5-beta. * [Bug 2749] ntp/lib/NTP/Util.pm needs update for ntpq -w, IPv6, .POOL. . diff --git a/libparse/data_mbg.c b/libparse/data_mbg.c index 23ca75509..2f5f50e25 100644 --- a/libparse/data_mbg.c +++ b/libparse/data_mbg.c @@ -300,12 +300,12 @@ get_mbg_cfgh( get_mbg_tgps(buffpp, &cfghp->tot_63); get_mbg_tgps(buffpp, &cfghp->t0a); - for (i = MIN_SVNO; i <= MAX_SVNO; i++) + for (i = 0; i < N_SVNO; i++) { get_mbg_cfg(buffpp, &cfghp->cfg[i]); } - - for (i = MIN_SVNO; i <= MAX_SVNO; i++) + + for (i = 0; i < N_SVNO; i++) { get_mbg_health(buffpp, &cfghp->health[i]); } diff --git a/ntpd/refclock_parse.c b/ntpd/refclock_parse.c index aa4be6063..c7c4a436c 100644 --- a/ntpd/refclock_parse.c +++ b/ntpd/refclock_parse.c @@ -4459,6 +4459,8 @@ gps16x_message( get_mbg_cfgh(&bufp, &cfgh); if (cfgh.valid) { + const char *cp; + uint16_t tmp_val; int i; p = buffer; @@ -4484,84 +4486,58 @@ gps16x_message( p = ap(buffer, sizeof(buffer), p, "\""); set_var(&parse->kv, buffer, sizeof(buffer), RO); - - for (i = MIN_SVNO; i < MAX_SVNO; i++) + + for (i = 0; i < N_SVNO; i++) { p = buffer; - p = ap(buffer, sizeof(buffer), p, "gps_cfg[%d]=\"[0x%x] ", i, cfgh.cfg[i]); - switch (cfgh.cfg[i] & 0x7) - { - case 0: - p = ap(buffer, sizeof(buffer), p, "BLOCK I"); - break; - case 1: - p = ap(buffer, sizeof(buffer), p, "BLOCK II"); - break; - default: - p = ap(buffer, sizeof(buffer), p, "bad CFG"); - break; - } - p = ap(buffer, sizeof(buffer), p, "\""); - set_var(&parse->kv, buffer, sizeof(buffer), RO); - - p = buffer; - p = ap(buffer, sizeof(buffer), p, "gps_health[%d]=\"[0x%x] ", i, cfgh.health[i]); - switch ((cfgh.health[i] >> 5) & 0x7 ) - { - case 0: - p = ap(buffer, sizeof(buffer), p, "OK;"); - break; - case 1: - p = ap(buffer, sizeof(buffer), p, "PARITY;"); - break; - case 2: - p = ap(buffer, sizeof(buffer), p, "TLM/HOW;"); - break; - case 3: - p = ap(buffer, sizeof(buffer), p, "Z-COUNT;"); - break; - case 4: - p = ap(buffer, sizeof(buffer), p, "SUBFRAME 1,2,3;"); - break; - case 5: - p = ap(buffer, sizeof(buffer), p, "SUBFRAME 4,5;"); - break; - case 6: - p = ap(buffer, sizeof(buffer), p, "UPLOAD BAD;"); - break; - case 7: - p = ap(buffer, sizeof(buffer), p, "DATA BAD;"); - break; + p = ap(buffer, sizeof(buffer), p, "sv_info[%d]=\"PRN%d", i, i + MIN_SVNO); + + tmp_val = cfgh.health[i]; /* a 6 bit SV health code */ + p = ap(buffer, sizeof(buffer), p, "; health=0x%02x (", tmp_val); + /* "All Ones" has a special meaning" */ + if (tmp_val == 0x3F) /* satellite is unusable or doesn't even exist */ + cp = "SV UNAVAILABLE"; + else { + /* The MSB contains a summary of the 3 MSBs of the 8 bit health code, + * indicating if the data sent by the satellite is OK or not. */ + p = ap(buffer, sizeof(buffer), p, "DATA %s, ", (tmp_val & 0x20) ? "BAD" : "OK" ); + + /* The 5 LSBs contain the status of the different signals sent by the satellite. */ + switch (tmp_val & 0x1F) + { + case 0x00: cp = "SIGNAL OK"; break; + /* codes 0x01 through 0x1B indicate that one or more + * specific signal components are weak or dead. + * We don't decode this here in detail. */ + case 0x1C: cp = "SV IS TEMP OUT"; break; + case 0x1D: cp = "SV WILL BE TEMP OUT"; break; + default: cp = "TRANSMISSION PROBLEMS"; break; + } } - - switch (cfgh.health[i] & 0x1F) + p = ap(buffer, sizeof(buffer), p, "%s)", cp ); + + tmp_val = cfgh.cfg[i]; /* a 4 bit SV configuration/type code */ + p = ap(buffer, sizeof(buffer), p, "; cfg=0x%02x (", tmp_val); + switch (tmp_val & 0x7) { - case 0: - p = ap(buffer, sizeof(buffer), p, "SIGNAL OK"); - break; - case 0x1C: - p = ap(buffer, sizeof(buffer), p, "SV TEMP OUT"); - break; - case 0x1D: - p = ap(buffer, sizeof(buffer), p, "SV WILL BE TEMP OUT"); - break; - case 0x1E: - break; - case 0x1F: - p = ap(buffer, sizeof(buffer), p, "MULTIPLE ERRS"); - break; - default: - p = ap(buffer, sizeof(buffer), p, "TRANSMISSION PROBLEMS"); - break; + case 0x00: cp = "(reserved)"; break; + case 0x01: cp = "BLOCK II/IIA/IIR"; break; + case 0x02: cp = "BLOCK IIR-M"; break; + case 0x03: cp = "BLOCK IIF"; break; + case 0x04: cp = "BLOCK III"; break; + default: cp = "unknown SV type"; break; } - - p = ap(buffer, sizeof(buffer), p, "\""); + p = ap(buffer, sizeof(buffer), p, "%s", cp ); + if (tmp_val & 0x08) /* A-S is on, P-code is encrypted */ + p = ap( buffer, sizeof(buffer), p, ", A-S on" ); + + p = ap(buffer, sizeof(buffer), p, ")\""); set_var(&parse->kv, buffer, sizeof(buffer), RO); } } } break; - + case GPS_ALM: break;