/*
  chronyd/chronyc - Programs for keeping computer clocks accurate.

 **********************************************************************
 * Copyright (C) Richard P. Curnow  1997-2002
 * Copyright (C) Miroslav Lichvar  2014
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 * 
 **********************************************************************

  =======================================================================

  This is the header file for the module that keeps track of the current
  reference.

  */

#ifndef GOT_REFERENCE_H
#define GOT_REFERENCE_H

#include "sysincl.h"

#include "ntp.h"
#include "reports.h"

/* Leap second handling modes */
typedef enum {
  REF_LeapModeSystem,
  REF_LeapModeSlew,
  REF_LeapModeStep,
  REF_LeapModeIgnore,
} REF_LeapMode;

/* Init function */
extern void REF_Initialise(void);

/* Fini function */
extern void REF_Finalise(void);

typedef enum {
  REF_ModeNormal,
  REF_ModeInitStepSlew,
  REF_ModeUpdateOnce,
  REF_ModePrintOnce,
  REF_ModeIgnore,
} REF_Mode;

/* Set reference update mode */
extern void REF_SetMode(REF_Mode mode);

/* Get reference update mode */
extern REF_Mode REF_GetMode(void);

/* Function type for handlers to be called back when mode ends */
typedef void (*REF_ModeEndHandler)(int result);

/* Set the handler for being notified of mode ending */
extern void REF_SetModeEndHandler(REF_ModeEndHandler handler);

/* Get leap second handling mode */
extern REF_LeapMode REF_GetLeapMode(void);

/* Function which takes a local cooked time and returns the estimated
   time of the reference.  It also returns the other parameters
   required for forming the outgoing NTP packet.

   local_time is the cooked local time returned by the LCL module

   is_synchronised indicates whether we are synchronised to anything
   at the moment.

   leap indicates the current leap status

   stratum is the stratum of this machine, when considered to be sync'd to the
   reference
   
   ref_id is the reference_id of the source

   ref_time is the time at which the we last set the reference source up

   root_delay is the root delay of the sample we are using

   root_dispersion is the root dispersion of the sample we are using, with all the
   skew etc added on.

   */

extern void REF_GetReferenceParams
(
 struct timespec *local_time,
 int *is_synchronised,
 NTP_Leap *leap,
 int *stratum,
 uint32_t *ref_id,
 struct timespec *ref_time,
 double *root_delay,
 double *root_dispersion
);

/* Function called by the clock selection process to register a new
   reference source and its parameters

   stratum is the stratum of the reference

   leap is the leap status read from the source

   ref_id is the reference id of the reference

   ref_time is the time at which the parameters are assumed to be
   correct, in terms of local time

   frequency is the amount of local clock gain relative to the
   reference per unit time interval of the local clock

   skew is the maximum estimated frequency error (so we are within
   [frequency+-skew])

   root_delay is the root delay of the sample we are using

   root_dispersion is the root dispersion of the sample we are using

   */

extern void REF_SetReference
(
 int stratum,
 NTP_Leap leap,
 int combined_sources,
 uint32_t ref_id,
 IPAddr *ref_ip,
 struct timespec *ref_time,
 double offset,
 double offset_sd,
 double frequency,
 double frequency_sd,
 double skew,
 double root_delay,
 double root_dispersion
);

extern void REF_SetManualReference
(
 struct timespec *ref_time,
 double offset,
 double frequency,
 double skew
);

/* Mark the local clock as unsynchronised */
extern void
REF_SetUnsynchronised(void);

/* Announce a leap second before the full reference update */
extern void REF_UpdateLeapStatus(NTP_Leap leap);

/* Return the current stratum of this host or 16 if the host is not
   synchronised */
extern int REF_GetOurStratum(void);

/* Return stratum of the local reference if orphan mode is enabled */
extern int REF_GetOrphanStratum(void);

/* Return the current skew */
extern double REF_GetSkew(void);

/* Modify the setting for the maximum skew we are prepared to allow updates on (in ppm). */
extern void REF_ModifyMaxupdateskew(double new_max_update_skew);

/* Modify makestep settings */
extern void REF_ModifyMakestep(int limit, double threshold);

extern void REF_EnableLocal(int stratum, double distance, int orphan);
extern void REF_DisableLocal(void);

/* Check if either of the current raw and cooked time, and optionally a
   provided timestamp with an offset, is close to a leap second */
extern int REF_IsLeapSecondClose(struct timespec *ts, double offset);

/* Return TAI-UTC offset corresponding to a time in UTC if available */
extern int REF_GetTaiOffset(struct timespec *ts);

extern void REF_GetTrackingReport(RPT_TrackingReport *rep);

#endif /* GOT_REFERENCE_H */
