{
struct timeval newadj, oldadj;
struct timeval T1;
- double elapsed, accrued_error;
+ double elapsed, accrued_error, predicted_error;
double adjust_required;
double rounding_error;
double old_adjust_remaining;
UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0);
accrued_error = elapsed * current_freq;
+ predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq;
- adjust_required = - (accrued_error + offset_register);
+ adjust_required = - (accrued_error + offset_register + predicted_error);
UTI_DoubleToTimeval(adjust_required, &newadj);
UTI_TimevalToDouble(&newadj, &adjustment_requested);
UTI_TimevalToDouble(&oldadj, &old_adjust_remaining);
- offset_register = rounding_error - old_adjust_remaining;
+ offset_register = rounding_error - old_adjust_remaining - predicted_error;
T0 = T1;
}
{
struct timeval newadj, oldadj;
struct timeval T1;
- double elapsed, accrued_error;
+ double elapsed, accrued_error, predicted_error;
double adjust_required;
struct timeval exact_newadj;
double rounding_error;
UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0);
accrued_error = elapsed * current_freq;
+ predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq;
- adjust_required = - (accrued_error + offset_register);
+ adjust_required = - (accrued_error + offset_register + predicted_error);
UTI_DoubleToTimeval(adjust_required, &exact_newadj);
UTI_TimevalToDouble(&oldadj, &old_adjust_remaining);
- offset_register = rounding_error - old_adjust_remaining;
+ offset_register = rounding_error - old_adjust_remaining - predicted_error;
T0 = T1;
UTI_TimevalToDouble(&newadj, &adjustment_requested);
{
struct timeval newadj, oldadj;
struct timeval T1;
- double elapsed, accrued_error;
+ double elapsed, accrued_error, predicted_error;
double adjust_required;
struct timeval exact_newadj;
double rounding_error;
UTI_DiffTimevalsToDouble(&elapsed, &T1, &T0);
accrued_error = elapsed * current_freq;
+ predicted_error = DRIFT_REMOVAL_INTERVAL / 2.0 * current_freq;
- adjust_required = - (accrued_error + offset_register);
+ adjust_required = - (accrued_error + offset_register + predicted_error);
UTI_DoubleToTimeval(adjust_required, &exact_newadj);
UTI_TimevalToDouble(&oldadj, &old_adjust_remaining);
- offset_register = rounding_error - old_adjust_remaining;
+ offset_register = rounding_error - old_adjust_remaining - predicted_error;
T0 = T1;
UTI_TimevalToDouble(&newadj, &adjustment_requested);