diff --git a/TODO b/TODO index dc7197642cb444f24af3923bd6b0bcd1a40e15f8..232f1975b6a3dc61b7a983fc0a5cd1df38519e9e 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 c853b7c84007bf329d935e489b4ce80b9a8618e1..d704428118e3c9bd9f5f18f1ca0a61f572045749 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 b1d363610fc8256831aea66f71ca7eb5aa016146..975675ae4c9ae401f852938775f7ec614a502fe0 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 */