196 lines
5.9 KiB
C
196 lines
5.9 KiB
C
/*-
|
|
* Copyright (c) 2014 Poul-Henning Kamp
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* Main include file
|
|
* =================
|
|
*/
|
|
|
|
#ifdef NTIMED_H_INCLUDED
|
|
#error "ntimed.h included multiple times"
|
|
#endif
|
|
#define NTIMED_H_INCLUDED
|
|
|
|
#include "compiler.h"
|
|
|
|
#include <unistd.h>
|
|
#include "ntimed_queue.h"
|
|
#include "ntimed_tricks.h"
|
|
|
|
struct todolist;
|
|
struct udp_socket;
|
|
struct timestamp;
|
|
|
|
/* ocx_*.c -- Operational Context *************************************/
|
|
|
|
struct ocx; // private
|
|
|
|
enum ocx_chan {
|
|
OCX_DIAG, // think: stderr
|
|
OCX_TRACE, // think: /var/run/stats
|
|
OCX_DEBUG, // think: stdout
|
|
};
|
|
|
|
void Put(struct ocx *, enum ocx_chan, const char *, ...)
|
|
__printflike(3, 4);
|
|
void PutHex(struct ocx *, enum ocx_chan, const void *, ssize_t len);
|
|
void PutTime(struct ocx *, enum ocx_chan , const char *,
|
|
const struct timestamp *);
|
|
|
|
/*
|
|
* Report "Failure: " + args + "\n" [+ errno-line] + "\n". exit(1);
|
|
*/
|
|
void Fail(struct ocx *, int err, const char *, ...) \
|
|
__attribute__((__noreturn__))
|
|
__printflike(3, 4);
|
|
|
|
#define Debug(ocx, ...) Put(ocx, OCX_DEBUG, __VA_ARGS__)
|
|
#define DebugHex(ocx, ptr, len) PutHex(ocx, OCX_DEBUG, ptr, len)
|
|
|
|
void ArgTracefile(const char *fn);
|
|
|
|
/* param.c -- Parameters **********************************************/
|
|
|
|
struct param_tbl {
|
|
const char *name;
|
|
double *val;
|
|
double min;
|
|
double max;
|
|
double def;
|
|
const char *doc;
|
|
TAILQ_ENTRY(param_tbl) list;
|
|
};
|
|
|
|
void Param_Register(struct param_tbl *pt);
|
|
void Param_Tweak(struct ocx *, const char *arg);
|
|
void Param_Report(struct ocx *ocx, enum ocx_chan);
|
|
|
|
/* pll_std.c -- Standard PLL ******************************************/
|
|
|
|
typedef void pll_f(struct ocx *ocx, double offset, double weight);
|
|
extern pll_f *PLL;
|
|
|
|
void PLL_Init(void);
|
|
|
|
/* suckaddr.c -- Sockaddr utils ***************************************/
|
|
|
|
int SA_Equal(const void *sa1, size_t sl1, const void *sa2, size_t sl2);
|
|
|
|
/* time_sim.c -- Simulated timebase ***********************************/
|
|
|
|
extern double Time_Sim_delta;
|
|
void Time_Sim(struct todolist *);
|
|
void Time_Sim_Bump(struct todolist *, double when, double freq, double phase);
|
|
|
|
/* time_unix.c -- UNIX timebase ***************************************/
|
|
|
|
void Time_Unix(struct todolist *);
|
|
void Time_Unix_Passive(void);
|
|
|
|
/* time_stuff.c -- Timebase infrastructure ****************************/
|
|
|
|
struct timestamp {
|
|
unsigned magic;
|
|
#define TIMESTAMP_MAGIC 0x344cd213
|
|
uint64_t sec; // Really: time_t
|
|
uint64_t frac;
|
|
};
|
|
|
|
typedef int tb_sleep_f(double dur);
|
|
typedef struct timestamp *tb_now_f(struct timestamp *);
|
|
typedef void tb_step_f(struct ocx *, double offset);
|
|
typedef void tb_adjust_f(struct ocx *, double offset, double duration,
|
|
double frequency);
|
|
|
|
extern int TB_generation;
|
|
extern tb_sleep_f *TB_Sleep;
|
|
extern tb_now_f *TB_Now;
|
|
extern tb_step_f *TB_Step;
|
|
extern tb_adjust_f *TB_Adjust;
|
|
|
|
void TS_Add(struct timestamp *ts, double dt);
|
|
struct timestamp *TS_Nanosec(struct timestamp *storage,
|
|
int64_t sec, int64_t nsec);
|
|
|
|
struct timestamp *TS_Double(struct timestamp *storage, double);
|
|
double TS_Diff(const struct timestamp *t1, const struct timestamp *t2);
|
|
int TS_SleepUntil(const struct timestamp *);
|
|
void TS_Format(char *buf, size_t len, const struct timestamp *ts);
|
|
|
|
void TS_RunTest(struct ocx *ocx);
|
|
|
|
/* todo.c -- todo-list scheduler **************************************/
|
|
|
|
|
|
enum todo_e {
|
|
TODO_INTR = -2, // Signal received
|
|
TODO_FAIL = -1, // Break out of TODO_Run()
|
|
TODO_OK = 0,
|
|
TODO_DONE = 1, // Stop repeating me
|
|
};
|
|
|
|
typedef enum todo_e todo_f(struct ocx *, struct todolist *, void *priv);
|
|
|
|
struct todolist *TODO_NewList(void);
|
|
|
|
uintptr_t TODO_ScheduleRel(struct todolist *,
|
|
todo_f *func, void *priv,
|
|
double when, double repeat,
|
|
const char *fmt, ...) __printflike(6, 7);
|
|
uintptr_t TODO_ScheduleAbs(struct todolist *,
|
|
todo_f *func, void *priv,
|
|
const struct timestamp *when, double repeat,
|
|
const char *fmt, ...) __printflike(6, 7);
|
|
enum todo_e TODO_Run(struct ocx *ocx, struct todolist *);
|
|
void TODO_Cancel(struct todolist *tdl, uintptr_t *);
|
|
|
|
/* combine_delta.c -- Source Combiner based on delta-pdfs *************/
|
|
|
|
struct combiner;
|
|
|
|
typedef void combine_f(struct ocx *, const struct combiner *,
|
|
double trust, double low, double mid, double high);
|
|
|
|
struct combiner {
|
|
unsigned magic;
|
|
#define COMBINER_MAGIC 0xab2b239c
|
|
|
|
combine_f *func;
|
|
void *priv;
|
|
const char *name1;
|
|
const char *name2;
|
|
};
|
|
|
|
struct combine_delta *CD_New(void);
|
|
struct combiner *CD_AddSource(struct combine_delta *,
|
|
const char *name1, const char *name2);
|
|
|
|
/**********************************************************************
|
|
* Main functions
|
|
*/
|
|
|
|
int main_client(int argc, char *const *argv);
|
|
int main_poll_server(int argc, char *const *argv);
|
|
int main_sim_client(int argc, char *const *argv);
|