Fix updating of nano slew offset correction error
This commit is contained in:
parent
a3d47ffc81
commit
fa84496423
1 changed files with 23 additions and 11 deletions
34
sys_linux.c
34
sys_linux.c
|
@ -271,27 +271,38 @@ update_nano_slew_error(long offset, int new)
|
||||||
if (offset == 0 && nano_slew_error == 0)
|
if (offset == 0 && nano_slew_error == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (gettimeofday(&now, &tz) < 0) {
|
|
||||||
CROAK("gettimeofday() failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* maximum error in offset reported by adjtimex, assuming PLL constant 0
|
/* maximum error in offset reported by adjtimex, assuming PLL constant 0
|
||||||
and SHIFT_PLL = 2 */
|
and SHIFT_PLL = 2 */
|
||||||
offset /= new ? 4 : 3;
|
offset /= new ? 4 : 3;
|
||||||
if (offset < 0)
|
if (offset < 0)
|
||||||
offset = -offset;
|
offset = -offset;
|
||||||
|
|
||||||
UTI_DiffTimevalsToDouble(&ago, &now, &nano_slew_error_start);
|
if (new || nano_slew_error_start.tv_sec > 0) {
|
||||||
if (ago > 1.1) {
|
if (gettimeofday(&now, &tz) < 0) {
|
||||||
if (!new && nano_slew_error > offset)
|
CROAK("gettimeofday() failed");
|
||||||
nano_slew_error = offset;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* When PLL offset is newly set, use the maximum of the old and new error.
|
||||||
|
Otherwise use the minimum, but only when the last update is older than
|
||||||
|
1.1 seconds to be sure the previous adjustment is already gone. */
|
||||||
|
if (!new) {
|
||||||
|
if (nano_slew_error > offset) {
|
||||||
|
if (nano_slew_error_start.tv_sec == 0) {
|
||||||
|
nano_slew_error = offset;
|
||||||
|
} else {
|
||||||
|
UTI_DiffTimevalsToDouble(&ago, &now, &nano_slew_error_start);
|
||||||
|
if (ago > 1.1) {
|
||||||
|
nano_slew_error_start.tv_sec = 0;
|
||||||
|
nano_slew_error = offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (nano_slew_error < offset)
|
if (nano_slew_error < offset)
|
||||||
nano_slew_error = offset;
|
nano_slew_error = offset;
|
||||||
}
|
|
||||||
|
|
||||||
if (new)
|
|
||||||
nano_slew_error_start = now;
|
nano_slew_error_start = now;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static double
|
static double
|
||||||
|
@ -448,6 +459,7 @@ initiate_slew(void)
|
||||||
CROAK("adjtimex() failed in accrue_offset");
|
CROAK("adjtimex() failed in accrue_offset");
|
||||||
}
|
}
|
||||||
offset_register -= (double) offset / 1.0e9;
|
offset_register -= (double) offset / 1.0e9;
|
||||||
|
update_nano_slew_error(offset, 0);
|
||||||
|
|
||||||
offset = 0;
|
offset = 0;
|
||||||
if (TMX_ApplyPLLOffset(offset) < 0) {
|
if (TMX_ApplyPLLOffset(offset) < 0) {
|
||||||
|
|
Loading…
Reference in a new issue