diff --git a/makefile b/makefile index 0f22b16..a8e5ce8 100644 --- a/makefile +++ b/makefile @@ -24,7 +24,7 @@ CFLAGS = -Wall $(VER) $(incdefs) $(DEBUG) $(EXTRA_CFLAGS) LDLIBS = -lm -lrt $(EXTRA_LDFLAGS) PRG = ptp4l pmc phc2sys hwstamp_ctl phc_ctl timemaster OBJ = bmc.o clock.o clockadj.o clockcheck.o config.o fault.o \ - filter.o fsm.o linreg.o mave.o mmedian.o msg.o ntpshm.o phc.o \ + filter.o fsm.o linreg.o mave.o mmedian.o msg.o ntpshm.o nullf.o phc.o \ pi.o port.o print.o ptp4l.o raw.o servo.o sk.o stats.o tlv.o \ transport.o tsproc.o udp.o udp6.o uds.o util.o version.o @@ -49,8 +49,8 @@ ptp4l: $(OBJ) pmc: msg.o pmc.o pmc_common.o print.o raw.o sk.o tlv.o transport.o udp.o \ udp6.o uds.o util.o version.o -phc2sys: clockadj.o clockcheck.o linreg.o msg.o ntpshm.o phc.o phc2sys.o pi.o \ - pmc_common.o print.o raw.o servo.o sk.o stats.o sysoff.o tlv.o \ +phc2sys: clockadj.o clockcheck.o linreg.o msg.o ntpshm.o nullf.o phc.o \ + phc2sys.o pi.o pmc_common.o print.o raw.o servo.o sk.o stats.o sysoff.o tlv.o \ transport.o udp.o udp6.o uds.o util.o version.o hwstamp_ctl: hwstamp_ctl.o version.o diff --git a/nullf.c b/nullf.c new file mode 100644 index 0000000..5512837 --- /dev/null +++ b/nullf.c @@ -0,0 +1,79 @@ +/** + * @file nullf.c + * @brief Implements a clock servo that always set the frequency offset to zero. + * @note Copyright (C) 2015 Richard Cochran + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + */ +#include +#include + +#include "nullf.h" +#include "print.h" +#include "servo_private.h" + +struct nullf_servo { + struct servo servo; +}; + +static void nullf_destroy(struct servo *servo) +{ + struct nullf_servo *s = container_of(servo, struct nullf_servo, servo); + free(s); +} + +static double nullf_sample(struct servo *servo, int64_t offset, + uint64_t local_ts, double weight, + enum servo_state *state) +{ + if (!offset) { + *state = SERVO_LOCKED; + return 0.0; + } + + if ((servo->first_update && servo->first_step_threshold && + servo->first_step_threshold < fabs(offset)) || + (servo->step_threshold && servo->step_threshold < fabs(offset))) { + *state = SERVO_JUMP; + } else { + *state = SERVO_UNLOCKED; + } + + return 0.0; +} + +static void nullf_sync_interval(struct servo *servo, double interval) +{ +} + +static void nullf_reset(struct servo *servo) +{ +} + +struct servo *nullf_servo_create(void) +{ + struct nullf_servo *s; + + s = calloc(1, sizeof(*s)); + if (!s) + return NULL; + + s->servo.destroy = nullf_destroy; + s->servo.sample = nullf_sample; + s->servo.sync_interval = nullf_sync_interval; + s->servo.reset = nullf_reset; + + return &s->servo; +} diff --git a/nullf.h b/nullf.h new file mode 100644 index 0000000..9e8bc7b --- /dev/null +++ b/nullf.h @@ -0,0 +1,26 @@ +/** + * @file nullf.h + * @note Copyright (C) 2015 Richard Cochran + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * 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. + */ +#ifndef HAVE_NULLF_H +#define HAVE_NULLF_H + +#include "servo.h" + +struct servo *nullf_servo_create(void); + +#endif diff --git a/servo.c b/servo.c index 2739ebd..b936a85 100644 --- a/servo.c +++ b/servo.c @@ -20,6 +20,7 @@ #include "linreg.h" #include "ntpshm.h" +#include "nullf.h" #include "pi.h" #include "servo_private.h" @@ -43,6 +44,9 @@ struct servo *servo_create(enum servo_type type, int fadj, int max_ppb, int sw_t case CLOCK_SERVO_NTPSHM: servo = ntpshm_servo_create(); break; + case CLOCK_SERVO_NULLF: + servo = nullf_servo_create(); + break; default: return NULL; } diff --git a/servo.h b/servo.h index 4be8c23..0a182a4 100644 --- a/servo.h +++ b/servo.h @@ -56,6 +56,7 @@ enum servo_type { CLOCK_SERVO_PI, CLOCK_SERVO_LINREG, CLOCK_SERVO_NTPSHM, + CLOCK_SERVO_NULLF, }; /**