]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
Fixed loops and decoding of Meinberg GPS satellite info.
authorMartin Burnicki <burnicki@ntp.org>
Tue, 10 Mar 2015 09:48:25 +0000 (10:48 +0100)
committerMartin Burnicki <burnicki@ntp.org>
Tue, 10 Mar 2015 09:48:25 +0000 (10:48 +0100)
bk: 54febde9SSfDlTZzpV4zA2Slldvywg

ChangeLog
libparse/data_mbg.c
ntpd/refclock_parse.c

index 9030d8012a4a76e14f555ae36e48b7a641048359..f23f90a387d253b836f637c0f48b2046320f4a5d 100644 (file)
--- 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. .
index 23ca75509180cf05793db41d8fba38f26c4a8ccf..2f5f50e2596b3586619b87d053283e1db6f6f321 100644 (file)
@@ -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]);
     }
index aa4be6063c1d14841c5ce2daeef238b9d193ce8e..c7c4a436c41576826b8633f05a437aa90948678e 100644 (file)
@@ -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;