Move estimated offset and error to sourcestats report
And print the estimated offset in sourcestats output.
This commit is contained in:
parent
feb86e336a
commit
b32432c232
9 changed files with 56 additions and 47 deletions
4
candm.h
4
candm.h
|
@ -475,8 +475,6 @@ typedef struct {
|
||||||
Float orig_latest_meas;
|
Float orig_latest_meas;
|
||||||
Float latest_meas;
|
Float latest_meas;
|
||||||
Float latest_meas_err;
|
Float latest_meas_err;
|
||||||
Float est_offset;
|
|
||||||
Float est_offset_err;
|
|
||||||
int32_t EOR;
|
int32_t EOR;
|
||||||
} RPY_Source_Data;
|
} RPY_Source_Data;
|
||||||
|
|
||||||
|
@ -503,6 +501,8 @@ typedef struct {
|
||||||
Float sd;
|
Float sd;
|
||||||
Float resid_freq_ppm;
|
Float resid_freq_ppm;
|
||||||
Float skew_ppm;
|
Float skew_ppm;
|
||||||
|
Float est_offset;
|
||||||
|
Float est_offset_err;
|
||||||
int32_t EOR;
|
int32_t EOR;
|
||||||
} RPY_Sourcestats;
|
} RPY_Sourcestats;
|
||||||
|
|
||||||
|
|
|
@ -3569,9 +3569,9 @@ An example report is
|
||||||
@example
|
@example
|
||||||
@group
|
@group
|
||||||
210 Number of sources = 1
|
210 Number of sources = 1
|
||||||
Name/IP Address NP NR Span Frequency Freq Skew Std Dev
|
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
|
||||||
========================================================================
|
===============================================================================
|
||||||
abc.def.ghi 11 5 46m -0.001 0.045 25us
|
abc.def.ghi 11 5 46m -0.001 0.045 1us 25us
|
||||||
@end group
|
@end group
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
@ -3609,6 +3609,9 @@ million. In this case, the computer's clock is estimated to be running
|
||||||
This is the estimated error bounds on @code{Freq} (again in parts per
|
This is the estimated error bounds on @code{Freq} (again in parts per
|
||||||
million).
|
million).
|
||||||
|
|
||||||
|
@item Offset
|
||||||
|
This is the estimated offset of the source.
|
||||||
|
|
||||||
@item Std Dev
|
@item Std Dev
|
||||||
This is the estimated sample standard deviation.
|
This is the estimated sample standard deviation.
|
||||||
|
|
||||||
|
|
30
client.c
30
client.c
|
@ -1553,9 +1553,8 @@ process_cmd_sources(char *line)
|
||||||
int n_sources, i;
|
int n_sources, i;
|
||||||
int verbose = 0;
|
int verbose = 0;
|
||||||
|
|
||||||
double orig_latest_meas, latest_meas, est_offset;
|
double orig_latest_meas, latest_meas, latest_meas_err;
|
||||||
IPAddr ip_addr;
|
IPAddr ip_addr;
|
||||||
double latest_meas_err, est_offset_err;
|
|
||||||
uint32_t latest_meas_ago;
|
uint32_t latest_meas_ago;
|
||||||
uint16_t poll, stratum;
|
uint16_t poll, stratum;
|
||||||
uint16_t state, mode;
|
uint16_t state, mode;
|
||||||
|
@ -1583,7 +1582,7 @@ process_cmd_sources(char *line)
|
||||||
printf("MS Name/IP address Stratum Poll LastRx Last sample\n");
|
printf("MS Name/IP address Stratum Poll LastRx Last sample\n");
|
||||||
printf("============================================================================\n");
|
printf("============================================================================\n");
|
||||||
|
|
||||||
/* "MS NNNNNNNNNNNNNNNNNNNNNNNNN SS PP RRRR SSSSSSS[SSSSSSS] +/- SSSSSS" */
|
/* "MS NNNNNNNNNNNNNNNNNNNNNNNNN SS PP RRRR SSSSSSS[SSSSSSS] +/- SSSSSS" */
|
||||||
|
|
||||||
for (i=0; i<n_sources; i++) {
|
for (i=0; i<n_sources; i++) {
|
||||||
request.command = htons(REQ_SOURCE_DATA);
|
request.command = htons(REQ_SOURCE_DATA);
|
||||||
|
@ -1598,8 +1597,6 @@ process_cmd_sources(char *line)
|
||||||
orig_latest_meas = UTI_FloatNetworkToHost(reply.data.source_data.orig_latest_meas);
|
orig_latest_meas = UTI_FloatNetworkToHost(reply.data.source_data.orig_latest_meas);
|
||||||
latest_meas = UTI_FloatNetworkToHost(reply.data.source_data.latest_meas);
|
latest_meas = UTI_FloatNetworkToHost(reply.data.source_data.latest_meas);
|
||||||
latest_meas_err = UTI_FloatNetworkToHost(reply.data.source_data.latest_meas_err);
|
latest_meas_err = UTI_FloatNetworkToHost(reply.data.source_data.latest_meas_err);
|
||||||
est_offset = UTI_FloatNetworkToHost(reply.data.source_data.est_offset);
|
|
||||||
est_offset_err = UTI_FloatNetworkToHost(reply.data.source_data.est_offset_err);
|
|
||||||
|
|
||||||
if (mode == RPY_SD_MD_REF) {
|
if (mode == RPY_SD_MD_REF) {
|
||||||
snprintf(hostname_buf, sizeof(hostname_buf), "%s", UTI_RefidToString(ip_addr.addr.in4));
|
snprintf(hostname_buf, sizeof(hostname_buf), "%s", UTI_RefidToString(ip_addr.addr.in4));
|
||||||
|
@ -1663,7 +1660,7 @@ process_cmd_sourcestats(char *line)
|
||||||
|
|
||||||
char hostname_buf[32];
|
char hostname_buf[32];
|
||||||
unsigned long n_samples, n_runs, span_seconds;
|
unsigned long n_samples, n_runs, span_seconds;
|
||||||
double resid_freq_ppm, skew_ppm, sd;
|
double resid_freq_ppm, skew_ppm, sd, est_offset, est_offset_err;
|
||||||
unsigned long ref_id;
|
unsigned long ref_id;
|
||||||
IPAddr ip_addr;
|
IPAddr ip_addr;
|
||||||
|
|
||||||
|
@ -1678,16 +1675,17 @@ process_cmd_sourcestats(char *line)
|
||||||
printf(" / .- Number of residual runs with same sign.\n");
|
printf(" / .- Number of residual runs with same sign.\n");
|
||||||
printf(" | / .- Length of measurement set (time).\n");
|
printf(" | / .- Length of measurement set (time).\n");
|
||||||
printf(" | | / .- Est. clock freq error (ppm).\n");
|
printf(" | | / .- Est. clock freq error (ppm).\n");
|
||||||
printf(" | | | / .- Est error in freq.\n");
|
printf(" | | | / .- Est. error in freq.\n");
|
||||||
printf(" | | | | / .- On the\n");
|
printf(" | | | | / .- Est. offset.\n");
|
||||||
printf(" | | | | | / samples.\n");
|
printf(" | | | | | | On the -.\n");
|
||||||
printf(" | | | | | |\n");
|
printf(" | | | | | | samples. \\\n");
|
||||||
|
printf(" | | | | | | |\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("Name/IP Address NP NR Span Frequency Freq Skew Std Dev\n");
|
printf("Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev\n");
|
||||||
printf("========================================================================\n");
|
printf("==============================================================================\n");
|
||||||
|
|
||||||
/* NNNNNNNNNNNNNNNNNNNNNNNNN NP NR SSSS FFFFFFFFFF SSSSSSSSSS SSSSSSS */
|
/* NNNNNNNNNNNNNNNNNNNNNNNNN NP NR SSSS FFFFFFFFFF SSSSSSSSSS SSSSSSS SSSSSS*/
|
||||||
|
|
||||||
for (i=0; i<n_sources; i++) {
|
for (i=0; i<n_sources; i++) {
|
||||||
request.command = htons(REQ_SOURCESTATS);
|
request.command = htons(REQ_SOURCESTATS);
|
||||||
|
@ -1701,6 +1699,8 @@ process_cmd_sourcestats(char *line)
|
||||||
resid_freq_ppm = UTI_FloatNetworkToHost(reply.data.sourcestats.resid_freq_ppm);
|
resid_freq_ppm = UTI_FloatNetworkToHost(reply.data.sourcestats.resid_freq_ppm);
|
||||||
skew_ppm = UTI_FloatNetworkToHost(reply.data.sourcestats.skew_ppm);
|
skew_ppm = UTI_FloatNetworkToHost(reply.data.sourcestats.skew_ppm);
|
||||||
sd = UTI_FloatNetworkToHost(reply.data.sourcestats.sd);
|
sd = UTI_FloatNetworkToHost(reply.data.sourcestats.sd);
|
||||||
|
est_offset = UTI_FloatNetworkToHost(reply.data.sourcestats.est_offset);
|
||||||
|
est_offset_err = UTI_FloatNetworkToHost(reply.data.sourcestats.est_offset_err);
|
||||||
|
|
||||||
if (ip_addr.family == IPADDR_UNSPEC)
|
if (ip_addr.family == IPADDR_UNSPEC)
|
||||||
snprintf(hostname_buf, sizeof(hostname_buf), "%s", UTI_RefidToString(ref_id));
|
snprintf(hostname_buf, sizeof(hostname_buf), "%s", UTI_RefidToString(ref_id));
|
||||||
|
@ -1713,7 +1713,9 @@ process_cmd_sourcestats(char *line)
|
||||||
|
|
||||||
printf("%-25s %2lu %2lu ", hostname_buf, n_samples, n_runs);
|
printf("%-25s %2lu %2lu ", hostname_buf, n_samples, n_runs);
|
||||||
print_seconds(span_seconds);
|
print_seconds(span_seconds);
|
||||||
printf(" %10.3f %10.3f ", resid_freq_ppm, skew_ppm);
|
printf(" %10.3f %10.3f ", resid_freq_ppm, skew_ppm);
|
||||||
|
print_signed_nanoseconds(est_offset);
|
||||||
|
printf(" ");
|
||||||
print_nanoseconds(sd);
|
print_nanoseconds(sd);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else {
|
} else {
|
||||||
|
|
10
cmdmon.c
10
cmdmon.c
|
@ -1043,8 +1043,6 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
|
||||||
tx_message->data.source_data.orig_latest_meas = UTI_FloatHostToNetwork(report.orig_latest_meas);
|
tx_message->data.source_data.orig_latest_meas = UTI_FloatHostToNetwork(report.orig_latest_meas);
|
||||||
tx_message->data.source_data.latest_meas = UTI_FloatHostToNetwork(report.latest_meas);
|
tx_message->data.source_data.latest_meas = UTI_FloatHostToNetwork(report.latest_meas);
|
||||||
tx_message->data.source_data.latest_meas_err = UTI_FloatHostToNetwork(report.latest_meas_err);
|
tx_message->data.source_data.latest_meas_err = UTI_FloatHostToNetwork(report.latest_meas_err);
|
||||||
tx_message->data.source_data.est_offset = UTI_FloatHostToNetwork(report.est_offset);
|
|
||||||
tx_message->data.source_data.est_offset_err = UTI_FloatHostToNetwork(report.est_offset_err);
|
|
||||||
} else {
|
} else {
|
||||||
tx_message->status = htons(STT_NOSUCHSOURCE);
|
tx_message->status = htons(STT_NOSUCHSOURCE);
|
||||||
}
|
}
|
||||||
|
@ -1395,8 +1393,12 @@ handle_sourcestats(CMD_Request *rx_message, CMD_Reply *tx_message)
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
RPT_SourcestatsReport report;
|
RPT_SourcestatsReport report;
|
||||||
|
struct timeval now_corr;
|
||||||
|
double local_clock_err;
|
||||||
|
|
||||||
|
LCL_ReadCookedTime(&now_corr, &local_clock_err);
|
||||||
status = SRC_ReportSourcestats(ntohl(rx_message->data.sourcestats.index),
|
status = SRC_ReportSourcestats(ntohl(rx_message->data.sourcestats.index),
|
||||||
&report);
|
&report, &now_corr);
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
tx_message->status = htons(STT_SUCCESS);
|
tx_message->status = htons(STT_SUCCESS);
|
||||||
|
@ -1409,6 +1411,8 @@ handle_sourcestats(CMD_Request *rx_message, CMD_Reply *tx_message)
|
||||||
tx_message->data.sourcestats.resid_freq_ppm = UTI_FloatHostToNetwork(report.resid_freq_ppm);
|
tx_message->data.sourcestats.resid_freq_ppm = UTI_FloatHostToNetwork(report.resid_freq_ppm);
|
||||||
tx_message->data.sourcestats.skew_ppm = UTI_FloatHostToNetwork(report.skew_ppm);
|
tx_message->data.sourcestats.skew_ppm = UTI_FloatHostToNetwork(report.skew_ppm);
|
||||||
tx_message->data.sourcestats.sd = UTI_FloatHostToNetwork(report.sd);
|
tx_message->data.sourcestats.sd = UTI_FloatHostToNetwork(report.sd);
|
||||||
|
tx_message->data.sourcestats.est_offset = UTI_FloatHostToNetwork(report.est_offset);
|
||||||
|
tx_message->data.sourcestats.est_offset_err = UTI_FloatHostToNetwork(report.est_offset_err);
|
||||||
} else {
|
} else {
|
||||||
tx_message->status = htons(STT_NOSUCHSOURCE);
|
tx_message->status = htons(STT_NOSUCHSOURCE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,8 +47,6 @@ typedef struct {
|
||||||
double orig_latest_meas; /* seconds */
|
double orig_latest_meas; /* seconds */
|
||||||
double latest_meas; /* seconds */
|
double latest_meas; /* seconds */
|
||||||
double latest_meas_err; /* seconds */
|
double latest_meas_err; /* seconds */
|
||||||
double est_offset; /* seconds */
|
|
||||||
double est_offset_err; /* seconds */
|
|
||||||
} RPT_SourceReport ;
|
} RPT_SourceReport ;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -73,6 +71,8 @@ typedef struct {
|
||||||
double resid_freq_ppm;
|
double resid_freq_ppm;
|
||||||
double skew_ppm;
|
double skew_ppm;
|
||||||
double sd;
|
double sd;
|
||||||
|
double est_offset;
|
||||||
|
double est_offset_err;
|
||||||
} RPT_SourcestatsReport;
|
} RPT_SourcestatsReport;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -956,7 +956,7 @@ SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now)
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
int
|
int
|
||||||
SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report)
|
SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timeval *now)
|
||||||
{
|
{
|
||||||
SRC_Instance src;
|
SRC_Instance src;
|
||||||
|
|
||||||
|
@ -969,7 +969,7 @@ SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report)
|
||||||
report->ip_addr = *src->ip_addr;
|
report->ip_addr = *src->ip_addr;
|
||||||
else
|
else
|
||||||
report->ip_addr.family = IPADDR_UNSPEC;
|
report->ip_addr.family = IPADDR_UNSPEC;
|
||||||
SST_DoSourcestatsReport(src->stats, report);
|
SST_DoSourcestatsReport(src->stats, report, now);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,7 @@ extern int SRC_IsSyncPeer(SRC_Instance inst);
|
||||||
extern int SRC_ReadNumberOfSources(void);
|
extern int SRC_ReadNumberOfSources(void);
|
||||||
extern int SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now);
|
extern int SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now);
|
||||||
|
|
||||||
extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report);
|
extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timeval *now);
|
||||||
|
|
||||||
extern SRC_Type SRC_GetType(int index);
|
extern SRC_Type SRC_GetType(int index);
|
||||||
|
|
||||||
|
|
|
@ -845,8 +845,7 @@ SST_LoadFromFile(SST_Stats inst, FILE *in)
|
||||||
void
|
void
|
||||||
SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now)
|
SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now)
|
||||||
{
|
{
|
||||||
int n, nb;
|
int n;
|
||||||
double elapsed, sample_elapsed;
|
|
||||||
struct timeval ago;
|
struct timeval ago;
|
||||||
|
|
||||||
if (inst->n_samples > 0) {
|
if (inst->n_samples > 0) {
|
||||||
|
@ -858,27 +857,12 @@ SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now
|
||||||
|
|
||||||
UTI_DiffTimevals(&ago, now, &inst->sample_times[n]);
|
UTI_DiffTimevals(&ago, now, &inst->sample_times[n]);
|
||||||
report->latest_meas_ago = ago.tv_sec;
|
report->latest_meas_ago = ago.tv_sec;
|
||||||
|
|
||||||
if (inst->n_samples > 3) {
|
|
||||||
UTI_DiffTimevalsToDouble(&elapsed, now, &inst->offset_time);
|
|
||||||
nb = inst->best_single_sample;
|
|
||||||
UTI_DiffTimevalsToDouble(&sample_elapsed, now, &(inst->sample_times[nb]));
|
|
||||||
report->est_offset = inst->estimated_offset + elapsed * inst->estimated_frequency;
|
|
||||||
report->est_offset_err = (inst->estimated_offset_sd +
|
|
||||||
sample_elapsed * inst->skew +
|
|
||||||
(0.5*inst->root_delays[nb] + inst->root_dispersions[nb]));
|
|
||||||
} else {
|
|
||||||
report->est_offset = report->latest_meas;
|
|
||||||
report->est_offset_err = report->latest_meas_err;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
report->latest_meas_ago = 86400 * 365 * 10;
|
report->latest_meas_ago = 86400 * 365 * 10;
|
||||||
report->orig_latest_meas = 0;
|
report->orig_latest_meas = 0;
|
||||||
report->latest_meas = 0;
|
report->latest_meas = 0;
|
||||||
report->latest_meas_err = 0;
|
report->latest_meas_err = 0;
|
||||||
report->stratum = 0;
|
report->stratum = 0;
|
||||||
report->est_offset = 0;
|
|
||||||
report->est_offset_err = 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -893,10 +877,11 @@ SST_Skew_Direction SST_LastSkewChange(SST_Stats inst)
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
void
|
void
|
||||||
SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report)
|
SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report, struct timeval *now)
|
||||||
{
|
{
|
||||||
double dspan;
|
double dspan;
|
||||||
int n;
|
double elapsed, sample_elapsed;
|
||||||
|
int n, nb;
|
||||||
|
|
||||||
report->n_samples = inst->n_samples;
|
report->n_samples = inst->n_samples;
|
||||||
report->n_runs = inst->nruns;
|
report->n_runs = inst->nruns;
|
||||||
|
@ -905,8 +890,23 @@ SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report)
|
||||||
n = inst->n_samples - 1;
|
n = inst->n_samples - 1;
|
||||||
UTI_DiffTimevalsToDouble(&dspan, &inst->sample_times[n], &inst->sample_times[0]);
|
UTI_DiffTimevalsToDouble(&dspan, &inst->sample_times[n], &inst->sample_times[0]);
|
||||||
report->span_seconds = (unsigned long) (dspan + 0.5);
|
report->span_seconds = (unsigned long) (dspan + 0.5);
|
||||||
|
|
||||||
|
if (inst->n_samples > 3) {
|
||||||
|
UTI_DiffTimevalsToDouble(&elapsed, now, &inst->offset_time);
|
||||||
|
nb = inst->best_single_sample;
|
||||||
|
UTI_DiffTimevalsToDouble(&sample_elapsed, now, &(inst->sample_times[nb]));
|
||||||
|
report->est_offset = inst->estimated_offset + elapsed * inst->estimated_frequency;
|
||||||
|
report->est_offset_err = (inst->estimated_offset_sd +
|
||||||
|
sample_elapsed * inst->skew +
|
||||||
|
(0.5*inst->root_delays[nb] + inst->root_dispersions[nb]));
|
||||||
|
} else {
|
||||||
|
report->est_offset = inst->offsets[n];
|
||||||
|
report->est_offset_err = 0.5*inst->root_delays[n] + inst->root_dispersions[n];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
report->span_seconds = 0;
|
report->span_seconds = 0;
|
||||||
|
report->est_offset = 0;
|
||||||
|
report->est_offset_err = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
report->resid_freq_ppm = 1.0e6 * inst->estimated_frequency;
|
report->resid_freq_ppm = 1.0e6 * inst->estimated_frequency;
|
||||||
|
|
|
@ -140,7 +140,7 @@ extern int SST_LoadFromFile(SST_Stats inst, FILE *in);
|
||||||
|
|
||||||
extern void SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now);
|
extern void SST_DoSourceReport(SST_Stats inst, RPT_SourceReport *report, struct timeval *now);
|
||||||
|
|
||||||
extern void SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report);
|
extern void SST_DoSourcestatsReport(SST_Stats inst, RPT_SourcestatsReport *report, struct timeval *now);
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SST_Skew_Decrease,
|
SST_Skew_Decrease,
|
||||||
|
|
Loading…
Reference in a new issue