double offset, double dispersion)
{
/* Dispatch to all handlers */
- invoke_parameter_change_handlers(raw, cooked, 0.0, offset, LCL_ChangeStep);
+ invoke_parameter_change_handlers(raw, cooked, 0.0, offset, LCL_ChangeUnknownStep);
lcl_InvokeDispersionNotifyHandlers(dispersion);
}
typedef enum {
LCL_ChangeAdjust,
- LCL_ChangeStep
+ LCL_ChangeStep,
+ LCL_ChangeUnknownStep
} LCL_ChangeType;
typedef void (*LCL_ParameterChangeHandler)
{
double delta_time;
int i;
+
+ if (change_type == LCL_ChangeUnknownStep) {
+ MNL_Reset();
+ }
+
for (i=0; i<n_samples; i++) {
UTI_AdjustTimeval(&samples[i].when, cooked, &samples[i].when, &delta_time,
dfreq, doffset);
UTI_IPToString(&records[i].remote_addr->ip_addr), dfreq, doffset);
#endif
- NCR_SlewTimes(records[i].data, cooked, dfreq, doffset);
+ if (change_type == LCL_ChangeUnknownStep) {
+ NCR_ResetInstance(records[i].data);
+ } else {
+ NCR_SlewTimes(records[i].data, cooked, dfreq, doffset);
+ }
}
}
{
int i;
- for (i = 0; i < n_sources; i++)
- filter_slew_samples(&refclocks[i].filter, cooked, dfreq, doffset);
+ for (i = 0; i < n_sources; i++) {
+ if (change_type == LCL_ChangeUnknownStep)
+ filter_reset(&refclocks[i].filter);
+ else
+ filter_slew_samples(&refclocks[i].filter, cooked, dfreq, doffset);
+ }
}
static void
LCL_ChangeType change_type,
void *anything)
{
- if (change_type == LCL_ChangeStep) {
+ if (change_type == LCL_ChangeUnknownStep) {
+ last_ref_update.tv_sec = 0;
+ last_ref_update.tv_usec = 0;
+ } else if (change_type == LCL_ChangeStep) {
UTI_AddDoubleToTimeval(&last_ref_update, -doffset, &last_ref_update);
}
}
double delta_time;
double old_seconds_fast, old_gain_rate;
+ if (change_type == LCL_ChangeUnknownStep) {
+ /* Drop all samples. */
+ n_samples = 0;
+ }
+
for (i=0; i<n_samples; i++) {
UTI_AdjustTimeval(system_times + i, cooked, system_times + i, &delta_time,
dfreq, doffset);
int i;
for (i=0; i<n_sources; i++) {
- SST_SlewSamples(sources[i]->stats, cooked, dfreq, doffset);
+ if (change_type == LCL_ChangeUnknownStep) {
+ SST_ResetInstance(sources[i]->stats);
+ } else {
+ SST_SlewSamples(sources[i]->stats, cooked, dfreq, doffset);
+ }
+ }
+
+ if (change_type == LCL_ChangeUnknownStep) {
+ /* After resetting no source is selectable, set reference unsynchronised */
+ SRC_SelectSource(NULL);
}
-
}
/* ================================================== */
/* ================================================== */
static void handle_end_of_slew(void *anything);
+static void update_slew(void);
/* ================================================== */
/* Adjust slew_start on clock step */
handle_step(struct timeval *raw, struct timeval *cooked, double dfreq,
double doffset, LCL_ChangeType change_type, void *anything)
{
- if (change_type == LCL_ChangeStep)
+ if (change_type == LCL_ChangeUnknownStep) {
+ /* Reset offset and slewing */
+ slew_start = *raw;
+ offset_register = 0.0;
+ update_slew();
+ } else if (change_type == LCL_ChangeStep) {
UTI_AddDoubleToTimeval(&slew_start, -doffset, &slew_start);
+ }
}
/* ================================================== */
test_start "external time step"
-min_sync_time=1300
-max_sync_time=1500
+min_sync_time=1500
+max_sync_time=1550
for step in -1e2 1e2; do
# Make one step in 150th second