]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
samplefilt: add function to correct accumulated offsets
authorMiroslav Lichvar <mlichvar@redhat.com>
Thu, 24 Feb 2022 07:44:10 +0000 (08:44 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Thu, 24 Feb 2022 10:40:01 +0000 (11:40 +0100)
Analogously to SST_CorrectOffset(), add SPF_CorrectOffset() to correct
the offsets accumulated in the filter.

samplefilt.c
samplefilt.h
test/unit/samplefilt.c

index fe32b5ce878035078293dd5757e0500cac6f48ff..9cb892d3299cccd0a569eb7370ea813a2236db13 100644 (file)
@@ -412,24 +412,36 @@ SPF_GetFilteredSample(SPF_Instance filter, NTP_Sample *sample)
 
 /* ================================================== */
 
-void
-SPF_SlewSamples(SPF_Instance filter, struct timespec *when, double dfreq, double doffset)
+static int
+get_first_last(SPF_Instance filter, int *first, int *last)
 {
-  int i, first, last;
-  double delta_time;
-
   if (filter->last < 0)
-    return;
+    return 0;
 
   /* Always slew the last sample as it may be returned even if no new
      samples were accumulated */
   if (filter->used > 0) {
-    first = 0;
-    last = filter->used - 1;
+    *first = 0;
+    *last = filter->used - 1;
   } else {
-    first = last = filter->last;
+    *first = *last = filter->last;
   }
 
+  return 1;
+}
+
+
+/* ================================================== */
+
+void
+SPF_SlewSamples(SPF_Instance filter, struct timespec *when, double dfreq, double doffset)
+{
+  int i, first, last;
+  double delta_time;
+
+  if (!get_first_last(filter, &first, &last))
+    return;
+
   for (i = first; i <= last; i++) {
     UTI_AdjustTimespec(&filter->samples[i].time, when, &filter->samples[i].time,
                        &delta_time, dfreq, doffset);
@@ -439,6 +451,20 @@ SPF_SlewSamples(SPF_Instance filter, struct timespec *when, double dfreq, double
 
 /* ================================================== */
 
+void
+SPF_CorrectOffset(SPF_Instance filter, double doffset)
+{
+  int i, first, last;
+
+  if (!get_first_last(filter, &first, &last))
+    return;
+
+  for (i = first; i <= last; i++)
+    filter->samples[i].offset -= doffset;
+}
+
+/* ================================================== */
+
 void
 SPF_AddDispersion(SPF_Instance filter, double dispersion)
 {
index 3b4350a3762de7ddc35aa757c844a335aa529e0c..e55a776731622d16f44e537932d57132afd797f9 100644 (file)
@@ -44,6 +44,7 @@ extern void SPF_DropSamples(SPF_Instance filter);
 extern int SPF_GetFilteredSample(SPF_Instance filter, NTP_Sample *sample);
 extern void SPF_SlewSamples(SPF_Instance filter, struct timespec *when,
                             double dfreq, double doffset);
+extern void SPF_CorrectOffset(SPF_Instance filter, double doffset);
 extern void SPF_AddDispersion(SPF_Instance filter, double dispersion);
 
 #endif
index 513ff2c465ecd7f7ba29395a98e7258e63bdcf05..20e6febca394425cd57ceb14ca617452ac2c94a7 100644 (file)
@@ -69,6 +69,7 @@ test_unit(void)
         TEST_CHECK(!memcmp(&sample_in, &sample_out, sizeof (sample_in)));
 
         SPF_SlewSamples(filter, &sample_in.time, 0.0, 0.0);
+        SPF_CorrectOffset(filter, 0.0);
         SPF_AddDispersion(filter, 0.0);
 
         if (k + 1 < min_samples)