From 0aedfdac0f24d024dc08c08247b41a282b625ec7 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Tue, 9 Aug 2011 22:10:45 +0200 Subject: [PATCH] Improved DC sync at startup: Abort iterating though slaves and first correct system time offsets, then begin configuring at slave 0. --- documentation/graphs/fsm_master.dot | 3 ++- master/fsm_master.c | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/documentation/graphs/fsm_master.dot b/documentation/graphs/fsm_master.dot index 0d6224c7..79997703 100644 --- a/documentation/graphs/fsm_master.dot +++ b/documentation/graphs/fsm_master.dot @@ -1,5 +1,5 @@ -/* $Id: fsm_master.dot,v df2b21f15939 2010/05/02 06:03:05 fp $ */ +/* $Id$ */ digraph master { size="7,9" @@ -37,6 +37,7 @@ digraph master { action_configure [shape=point,label=""] action_configure -> configure_slave [weight=10] action_configure -> action_next_slave_state + action_configure -> write_system_times read_state -> acknowledge [weight=10] read_state -> action_configure diff --git a/master/fsm_master.c b/master/fsm_master.c index 4e60c5e8..f45e64f3 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -567,6 +567,17 @@ void ec_fsm_master_action_configure( ec_master_t *master = fsm->master; ec_slave_t *slave = fsm->slave; + if (master->config_changed) { + // abort iterating through slaves, + // first compensate DC system time offsets, + // then begin configuring at slave 0 + EC_MASTER_DBG(master, 1, "Configuration changed" + " (aborting state check).\n"); + + fsm->slave = master->slaves; // begin with first slave + ec_fsm_master_enter_write_system_times(fsm); + } + // Does the slave have to be configured? if ((slave->current_state != slave->requested_state || slave->force_config) && !slave->error_flag) { @@ -853,6 +864,7 @@ void ec_fsm_master_enter_write_system_times( EC_MASTER_DBG(master, 1, "Writing system time offsets...\n"); if (master->has_app_time) { + while (fsm->slave < master->slaves + master->slave_count) { if (!fsm->slave->base_dc_supported || !fsm->slave->has_dc_system_time) { @@ -869,8 +881,14 @@ void ec_fsm_master_enter_write_system_times( fsm->state = ec_fsm_master_state_dc_read_offset; return; } + } else { - EC_MASTER_DBG(master, 1, "No app_time received up to now.\n"); + if (master->active) { + EC_MASTER_ERR(master, "No app_time received up to now," + " but master already active).\n"); + } else { + EC_MASTER_DBG(master, 1, "No app_time received up to now.\n"); + } } ec_master_request_op(master);