mirror of
https://gitlab.com/chrony/chrony.git
synced 2025-12-03 16:45:07 -05:00
samplefilt: add function to correct accumulated offsets
Analogously to SST_CorrectOffset(), add SPF_CorrectOffset() to correct the offsets accumulated in the filter.
This commit is contained in:
46
samplefilt.c
46
samplefilt.c
@@ -410,6 +410,27 @@ SPF_GetFilteredSample(SPF_Instance filter, NTP_Sample *sample)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
static int
|
||||
get_first_last(SPF_Instance filter, int *first, int *last)
|
||||
{
|
||||
if (filter->last < 0)
|
||||
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;
|
||||
} else {
|
||||
*first = *last = filter->last;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/* ================================================== */
|
||||
|
||||
void
|
||||
@@ -418,18 +439,9 @@ SPF_SlewSamples(SPF_Instance filter, struct timespec *when, double dfreq, double
|
||||
int i, first, last;
|
||||
double delta_time;
|
||||
|
||||
if (filter->last < 0)
|
||||
if (!get_first_last(filter, &first, &last))
|
||||
return;
|
||||
|
||||
/* 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;
|
||||
} else {
|
||||
first = last = filter->last;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user