From 60d0fa299307076143da94d36deb7b908fa9bdb7 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Thu, 9 Jan 2014 16:34:59 +0100 Subject: [PATCH] Fix frequency accumulation again This is a revert of commit 99d18abf updated for later changes. It seems in that commit the calculation was changed to match the reversed dfreq added in 1a7415a6, which itself was calculated incorrectly. Fix the calculation of updated frequency and matching dfreq. --- local.c | 10 +++++----- rtc_linux.c | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/local.c b/local.c index 8de198e..e4be12b 100644 --- a/local.c +++ b/local.c @@ -382,7 +382,7 @@ LCL_SetAbsoluteFrequency(double afreq_ppm) afreq_ppm = (*drv_set_freq)(afreq_ppm); - dfreq = (afreq_ppm - current_freq_ppm) / (1.0e6 + current_freq_ppm); + dfreq = (afreq_ppm - current_freq_ppm) / (1.0e6 - current_freq_ppm); LCL_ReadRawTime(&raw); LCL_CookTime(&raw, &cooked, NULL); @@ -411,11 +411,11 @@ LCL_AccumulateDeltaFrequency(double dfreq) are handled in units of ppm, whereas the 'dfreq' argument is in terms of the gradient of the (offset) v (local time) function. */ - current_freq_ppm = (1.0 + dfreq) * current_freq_ppm + 1.0e6 * dfreq; + current_freq_ppm = (1.0 - dfreq) * current_freq_ppm + 1.0e6 * dfreq; /* Call the system-specific driver for setting the frequency */ current_freq_ppm = (*drv_set_freq)(current_freq_ppm); - dfreq = (current_freq_ppm - old_freq_ppm) / (1.0e6 + old_freq_ppm); + dfreq = (current_freq_ppm - old_freq_ppm) / (1.0e6 - old_freq_ppm); LCL_ReadRawTime(&raw); LCL_CookTime(&raw, &cooked, NULL); @@ -508,14 +508,14 @@ LCL_AccumulateFrequencyAndOffset(double dfreq, double doffset, double corr_rate) /* Work out new absolute frequency. Note that absolute frequencies are handled in units of ppm, whereas the 'dfreq' argument is in terms of the gradient of the (offset) v (local time) function. */ - current_freq_ppm = (1.0 + dfreq) * old_freq_ppm + 1.0e6 * dfreq; + current_freq_ppm = (1.0 - dfreq) * old_freq_ppm + 1.0e6 * dfreq; DEBUG_LOG(LOGF_Local, "old_freq=%.3fppm new_freq=%.3fppm offset=%.6fsec", old_freq_ppm, current_freq_ppm, doffset); /* Call the system-specific driver for setting the frequency */ current_freq_ppm = (*drv_set_freq)(current_freq_ppm); - dfreq = (current_freq_ppm - old_freq_ppm) / (1.0e6 + old_freq_ppm); + dfreq = (current_freq_ppm - old_freq_ppm) / (1.0e6 - old_freq_ppm); (*drv_accrue_offset)(doffset, corr_rate); diff --git a/rtc_linux.c b/rtc_linux.c index fe52c33..3fcf297 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -282,7 +282,7 @@ slew_samples if (coefs_valid) { coef_seconds_fast += doffset; - coef_gain_rate = (1.0 + dfreq) * (1.0 + coef_gain_rate) - 1.0; + coef_gain_rate = (1.0 - dfreq) * coef_gain_rate + dfreq; } DEBUG_LOG(LOGF_RtcLinux, "dfreq=%.8f doffset=%.6f old_fast=%.6f old_rate=%.3f new_fast=%.6f new_rate=%.3f",