Implement the synchronization events.
This will allow a port to get from the uncalibrated into the slave state. Signed-off-by: Richard Cochran <richardcochran@gmail.com>master
parent
347b42b7d5
commit
10753faccf
13
clock.c
13
clock.c
|
@ -371,13 +371,15 @@ int clock_slave_only(struct clock *c)
|
||||||
return c->dds.slaveOnly;
|
return c->dds.slaveOnly;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clock_synchronize(struct clock *c,
|
enum servo_state clock_synchronize(struct clock *c,
|
||||||
struct timespec ingress_ts, struct timestamp origin_ts,
|
struct timespec ingress_ts,
|
||||||
Integer64 correction1, Integer64 correction2)
|
struct timestamp origin_ts,
|
||||||
|
Integer64 correction1,
|
||||||
|
Integer64 correction2)
|
||||||
{
|
{
|
||||||
double adj;
|
double adj;
|
||||||
tmv_t ingress, origin;
|
tmv_t ingress, origin;
|
||||||
enum servo_state state;
|
enum servo_state state = SERVO_UNLOCKED;
|
||||||
|
|
||||||
ingress = timespec_to_tmv(ingress_ts);
|
ingress = timespec_to_tmv(ingress_ts);
|
||||||
origin = timestamp_to_tmv(origin_ts);
|
origin = timestamp_to_tmv(origin_ts);
|
||||||
|
@ -395,7 +397,7 @@ void clock_synchronize(struct clock *c,
|
||||||
tmv_add(origin, tmv_add(c->path_delay, tmv_add(c->c1, c->c2))));
|
tmv_add(origin, tmv_add(c->path_delay, tmv_add(c->c1, c->c2))));
|
||||||
|
|
||||||
if (!c->path_delay)
|
if (!c->path_delay)
|
||||||
return;
|
return state;
|
||||||
|
|
||||||
adj = servo_sample(c->servo, c->master_offset, ingress, &state);
|
adj = servo_sample(c->servo, c->master_offset, ingress, &state);
|
||||||
|
|
||||||
|
@ -412,6 +414,7 @@ void clock_synchronize(struct clock *c,
|
||||||
clock_ppb(c->clkid, -adj);
|
clock_ppb(c->clkid, -adj);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_state_decision_event(struct clock *c)
|
static void handle_state_decision_event(struct clock *c)
|
||||||
|
|
11
clock.h
11
clock.h
|
@ -21,6 +21,7 @@
|
||||||
#define HAVE_CLOCK_H
|
#define HAVE_CLOCK_H
|
||||||
|
|
||||||
#include "ds.h"
|
#include "ds.h"
|
||||||
|
#include "servo.h"
|
||||||
#include "transport.h"
|
#include "transport.h"
|
||||||
|
|
||||||
#define MAX_PORTS 8
|
#define MAX_PORTS 8
|
||||||
|
@ -141,8 +142,12 @@ int clock_slave_only(struct clock *c);
|
||||||
* @param correction1 The correction field of the sync message.
|
* @param correction1 The correction field of the sync message.
|
||||||
* @param correction2 The correction field of the follow up message.
|
* @param correction2 The correction field of the follow up message.
|
||||||
* Pass zero in the case of one step operation.
|
* Pass zero in the case of one step operation.
|
||||||
|
* @return The state of the clock's servo.
|
||||||
*/
|
*/
|
||||||
void clock_synchronize(struct clock *c,
|
enum servo_state clock_synchronize(struct clock *c,
|
||||||
struct timespec ingress_ts, struct timestamp origin_ts,
|
struct timespec ingress_ts,
|
||||||
Integer64 correction1, Integer64 correction2);
|
struct timestamp origin_ts,
|
||||||
|
Integer64 correction1,
|
||||||
|
Integer64 correction2);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
32
port.c
32
port.c
|
@ -240,6 +240,26 @@ static int port_set_delay_tmo(struct port *p)
|
||||||
return timerfd_settime(p->fda.fd[FD_DELAY_TIMER], 0, &tmo, NULL);
|
return timerfd_settime(p->fda.fd[FD_DELAY_TIMER], 0, &tmo, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void port_synchronize(struct port *p,
|
||||||
|
struct timespec ingress_ts,
|
||||||
|
struct timestamp origin_ts,
|
||||||
|
Integer64 correction1, Integer64 correction2)
|
||||||
|
{
|
||||||
|
enum servo_state state;
|
||||||
|
|
||||||
|
state = clock_synchronize(p->clock, ingress_ts, origin_ts,
|
||||||
|
correction1, correction2);
|
||||||
|
switch (state) {
|
||||||
|
case SERVO_UNLOCKED:
|
||||||
|
case SERVO_JUMP:
|
||||||
|
port_dispatch(p, EV_SYNCHRONIZATION_FAULT);
|
||||||
|
break;
|
||||||
|
case SERVO_LOCKED:
|
||||||
|
port_dispatch(p, EV_MASTER_CLOCK_SELECTED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int port_delay_request(struct port *p)
|
static int port_delay_request(struct port *p)
|
||||||
{
|
{
|
||||||
struct ptp_message *msg;
|
struct ptp_message *msg;
|
||||||
|
@ -495,8 +515,8 @@ static void process_follow_up(struct port *p, struct ptp_message *m)
|
||||||
if (memcmp(pid, &m->header.sourcePortIdentity, sizeof(*pid)))
|
if (memcmp(pid, &m->header.sourcePortIdentity, sizeof(*pid)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
clock_synchronize(p->clock, syn->hwts.ts, m->ts.pdu,
|
port_synchronize(p, syn->hwts.ts, m->ts.pdu,
|
||||||
syn->header.correction, m->header.correction);
|
syn->header.correction, m->header.correction);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_sync(struct port *p, struct ptp_message *m)
|
static void process_sync(struct port *p, struct ptp_message *m)
|
||||||
|
@ -525,8 +545,8 @@ static void process_sync(struct port *p, struct ptp_message *m)
|
||||||
// TODO - add asymmetry value to correctionField.
|
// TODO - add asymmetry value to correctionField.
|
||||||
|
|
||||||
if (one_step(m)) {
|
if (one_step(m)) {
|
||||||
clock_synchronize(p->clock, m->hwts.ts, m->ts.pdu,
|
port_synchronize(p, m->hwts.ts, m->ts.pdu,
|
||||||
m->header.correction, 0);
|
m->header.correction, 0);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -534,8 +554,8 @@ static void process_sync(struct port *p, struct ptp_message *m)
|
||||||
*/
|
*/
|
||||||
fup = p->last_follow_up;
|
fup = p->last_follow_up;
|
||||||
if (fup && fup->header.sequenceId == m->header.sequenceId) {
|
if (fup && fup->header.sequenceId == m->header.sequenceId) {
|
||||||
clock_synchronize(p->clock, m->hwts.ts, fup->ts.pdu,
|
port_synchronize(p, m->hwts.ts, fup->ts.pdu,
|
||||||
m->header.correction, fup->header.correction);
|
m->header.correction, fup->header.correction);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue