/* Maximum number of samples per clock */
#define MAX_SAMPLES 16
-/* Minimum interval between samples (in seconds) */
-#define MIN_SAMPLE_SEPARATION 1.0
-
struct HCL_Instance_Record {
/* HW and local reference timestamp */
struct timespec hw_ref;
/* Maximum error of the last sample */
double last_err;
+ /* Minimum interval between samples */
+ double min_separation;
+
/* Flag indicating the offset and frequency values are valid */
int valid_coefs;
/* ================================================== */
HCL_Instance
-HCL_CreateInstance(void)
+HCL_CreateInstance(double min_separation)
{
HCL_Instance clock;
clock->y_data[MAX_SAMPLES - 1] = 0.0;
clock->n_samples = 0;
clock->valid_coefs = 0;
+ clock->min_separation = min_separation;
LCL_AddParameterChangeHandler(handle_slew, clock);
HCL_NeedsNewSample(HCL_Instance clock, struct timespec *now)
{
if (!clock->n_samples ||
- fabs(UTI_DiffTimespecsToDouble(now, &clock->local_ref)) >= MIN_SAMPLE_SEPARATION)
+ fabs(UTI_DiffTimespecsToDouble(now, &clock->local_ref)) >= clock->min_separation)
return 1;
return 0;
hw_delta = UTI_DiffTimespecsToDouble(hw_ts, &clock->hw_ref);
local_delta = UTI_DiffTimespecsToDouble(local_ts, &clock->local_ref) / local_freq;
- if (hw_delta <= 0.0 || local_delta < MIN_SAMPLE_SEPARATION / 2.0) {
+ if (hw_delta <= 0.0 || local_delta < clock->min_separation / 2.0) {
clock->n_samples = 0;
DEBUG_LOG(LOGF_HwClocks, "HW clock reset interval=%f", local_delta);
}
typedef struct HCL_Instance_Record *HCL_Instance;
/* Create a new HW clock instance */
-extern HCL_Instance HCL_CreateInstance(void);
+extern HCL_Instance HCL_CreateInstance(double min_separation);
/* Destroy a HW clock instance */
extern void HCL_DestroyInstance(HCL_Instance clock);
iface->tx_comp = conf_iface->tx_comp;
iface->rx_comp = conf_iface->rx_comp;
- iface->clock = HCL_CreateInstance();
+ iface->clock = HCL_CreateInstance(1.0);
DEBUG_LOG(LOGF_NtpIOLinux, "Enabled HW timestamping on %s", iface->name);
LCL_Initialise();
- clock = HCL_CreateInstance();
+ clock = HCL_CreateInstance(1.0);
for (i = 0; i < 2000; i++) {
UTI_ZeroTimespec(&start_hw_ts);
freq = TST_GetRandomDouble(0.9, 1.1);
jitter = TST_GetRandomDouble(10.0e-9, 1000.0e-9);
- interval = TST_GetRandomDouble(MIN_SAMPLE_SEPARATION / 10, MIN_SAMPLE_SEPARATION * 10.0);
+ interval = TST_GetRandomDouble(0.1, 10.0);
clock->n_samples = 0;
clock->valid_coefs = 0;