From c17bb46b000ec893c57898a8323b3726e0287472 Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Tue, 13 Feb 2007 10:51:40 +0000 Subject: [PATCH] Introduced topology_change_pending to delay bus scanning until IDLE mode has been reached. --- TODO | 1 - master/fsm_master.c | 22 ++++++++++++---------- master/fsm_master.h | 1 + 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/TODO b/TODO index dc719764..232f1975 100644 --- a/TODO +++ b/TODO @@ -7,7 +7,6 @@ $Id$ ------------------------------------------------------------------------------- * Release 1.2: - - Introduce topology_change_pending. - Update feature lists. * Release 1.3: diff --git a/master/fsm_master.c b/master/fsm_master.c index c853b7c8..d7044281 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -75,6 +75,7 @@ void ec_fsm_master_init(ec_fsm_master_t *fsm, /**< master state machine */ fsm->datagram = datagram; fsm->state = ec_fsm_master_state_start; fsm->slaves_responding = 0; + fsm->topology_change_pending = 0; fsm->slave_states = EC_SLAVE_STATE_UNKNOWN; fsm->validate = 0; @@ -170,7 +171,7 @@ void ec_fsm_master_state_start(ec_fsm_master_t *fsm) void ec_fsm_master_state_broadcast(ec_fsm_master_t *fsm /**< master state machine */) { ec_datagram_t *datagram = fsm->datagram; - unsigned int topology_change, states_change, i; + unsigned int i; ec_slave_t *slave; ec_master_t *master = fsm->master; @@ -190,14 +191,11 @@ void ec_fsm_master_state_broadcast(ec_fsm_master_t *fsm /**< master state machin return; } - topology_change = (datagram->working_counter != - fsm->slaves_responding); - states_change = (EC_READ_U8(datagram->data) != fsm->slave_states); + // bus topology change? + if (datagram->working_counter != fsm->slaves_responding) { + fsm->topology_change_pending = 1; + fsm->slaves_responding = datagram->working_counter; - fsm->slave_states = EC_READ_U8(datagram->data); - fsm->slaves_responding = datagram->working_counter; - - if (topology_change) { EC_INFO("%i slave%s responding.\n", fsm->slaves_responding, fsm->slaves_responding == 1 ? "" : "s"); @@ -212,14 +210,18 @@ void ec_fsm_master_state_broadcast(ec_fsm_master_t *fsm /**< master state machin } } - if (states_change) { + // slave states changed? + if (EC_READ_U8(datagram->data) != fsm->slave_states) { char states[EC_STATE_STRING_SIZE]; + fsm->slave_states = EC_READ_U8(datagram->data); ec_state_string(fsm->slave_states, states); EC_INFO("Slave states: %s.\n", states); } // topology change in idle mode: clear all slaves and scan the bus - if (topology_change && master->mode == EC_MASTER_MODE_IDLE) { + if (fsm->topology_change_pending && + master->mode == EC_MASTER_MODE_IDLE) { + fsm->topology_change_pending = 0; ec_master_eoe_stop(master); ec_master_destroy_slaves(master); diff --git a/master/fsm_master.h b/master/fsm_master.h index b1d36361..975675ae 100644 --- a/master/fsm_master.h +++ b/master/fsm_master.h @@ -65,6 +65,7 @@ struct ec_fsm_master void (*state)(ec_fsm_master_t *); /**< master state function */ unsigned int slaves_responding; /**< number of responding slaves */ + unsigned int topology_change_pending; /**< bus topology changed */ ec_slave_state_t slave_states; /**< states of responding slaves */ unsigned int validate; /**< non-zero, if validation to do */ ec_slave_t *slave; /**< current slave */ -- GitLab