# HG changeset patch # User Martin Troxler # Date 1260871147 -3600 # Node ID a784812c787f9c88fb87daf4c285de4614c49568 # Parent e36c92cf58a9600cc5fc61bbf7dcc6cc36d29735 master FSM enables slave FSM slave FSM should not be active when master is scanning or configuring the slaves diff -r e36c92cf58a9 -r a784812c787f master/fsm_master.c --- a/master/fsm_master.c Tue Dec 15 10:55:36 2009 +0100 +++ b/master/fsm_master.c Tue Dec 15 10:59:07 2009 +0100 @@ -471,7 +471,14 @@ if (ec_fsm_master_action_process_sdo(fsm)) return; - // check, if slaves have an SDO dictionary to read out. + // enable processing of SDO/FOE requests + for (slave = master->slaves; + slave < master->slaves + master->slave_count; + slave++) { + ec_fsm_slave_ready(&slave->fsm); + } + + // check, if slaves have an SDO dictionary to read out. for (slave = master->slaves; slave < master->slaves + master->slave_count; slave++) { diff -r e36c92cf58a9 -r a784812c787f master/fsm_slave.c --- a/master/fsm_slave.c Tue Dec 15 10:55:36 2009 +0100 +++ b/master/fsm_slave.c Tue Dec 15 10:59:07 2009 +0100 @@ -42,6 +42,7 @@ /*****************************************************************************/ void ec_fsm_slave_state_idle(ec_fsm_slave_t *); +void ec_fsm_slave_state_ready(ec_fsm_slave_t *); int ec_fsm_slave_action_process_sdo(ec_fsm_slave_t *); int ec_fsm_slave_action_process_foe(ec_fsm_slave_t *); void ec_fsm_slave_state_sdo_request(ec_fsm_slave_t *); @@ -102,6 +103,25 @@ return; } + +/*****************************************************************************/ + +/** Sets the current state of the state machine to READY + * + */ +void ec_fsm_slave_ready( + ec_fsm_slave_t *fsm /**< Slave state machine. */ + ) +{ + if (fsm->state == ec_fsm_slave_state_idle) { + if (fsm->slave->master->debug_level) { + EC_DBG("Slave %u ready for SDO/FOE.\n",fsm->slave->ring_position); + } + fsm->state = ec_fsm_slave_state_ready; + } + return; +} + /****************************************************************************** * Slave state machine *****************************************************************************/ @@ -113,15 +133,29 @@ * */ void ec_fsm_slave_state_idle( - ec_fsm_slave_t *fsm /**< Slave state machine. */ - ) -{ - // Check for pending external SDO requests - if (ec_fsm_slave_action_process_sdo(fsm)) - return; - // Check for pending FOE requests - if (ec_fsm_slave_action_process_foe(fsm)) - return; + ec_fsm_slave_t *fsm /**< Slave state machine. */ + ) +{ + // do nothing +} + + +/*****************************************************************************/ + +/** Slave state: READY. + * + * + */ +void ec_fsm_slave_state_ready( + ec_fsm_slave_t *fsm /**< Slave state machine. */ + ) +{ + // Check for pending external SDO requests + if (ec_fsm_slave_action_process_sdo(fsm)) + return; + // Check for pending FOE requests + if (ec_fsm_slave_action_process_foe(fsm)) + return; } @@ -143,10 +177,17 @@ // search the first external request to be processed list_for_each_entry_safe(request, next, &slave->slave_sdo_requests, list) { - if (slave->current_state == EC_SLAVE_STATE_INIT) { + if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { + EC_WARN("Postponing SDO request, slave %u has ERROR.\n", + slave->ring_position); + fsm->state = ec_fsm_slave_state_idle; + return 0; + } + if (slave->current_state == EC_SLAVE_STATE_INIT) { EC_WARN("Postponing SDO request, slave %u is in INIT.\n", slave->ring_position); - return 0; + fsm->state = ec_fsm_slave_state_idle; + return 0; } list_del_init(&request->list); // dequeue request->req.state = EC_INT_REQUEST_BUSY; @@ -184,11 +225,17 @@ // search the first request to be processed list_for_each_entry_safe(request, next, &slave->foe_requests, list) { - list_del_init(&request->list); // dequeue + if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { + EC_WARN("Postponing FOE request, slave %u has ERROR.\n", + slave->ring_position); + fsm->state = ec_fsm_slave_state_idle; + return 0; + } + list_del_init(&request->list); // dequeue request->req.state = EC_INT_REQUEST_BUSY; if (master->debug_level) - EC_DBG("Processing FoE request for slave %u.\n", + EC_DBG("Processing FOE request for slave %u.\n", slave->ring_position); fsm->foe_request = &request->req; @@ -239,7 +286,7 @@ wake_up(&slave->sdo_queue); fsm->sdo_request = NULL; - fsm->state = ec_fsm_slave_state_idle; + fsm->state = ec_fsm_slave_state_ready; } @@ -280,6 +327,6 @@ wake_up(&slave->foe_queue); fsm->foe_request = NULL; - fsm->state = ec_fsm_slave_state_idle; -} - + fsm->state = ec_fsm_slave_state_ready; +} + diff -r e36c92cf58a9 -r a784812c787f master/fsm_slave.h --- a/master/fsm_slave.h Tue Dec 15 10:55:36 2009 +0100 +++ b/master/fsm_slave.h Tue Dec 15 10:59:07 2009 +0100 @@ -65,7 +65,7 @@ void ec_fsm_slave_clear(ec_fsm_slave_t *); void ec_fsm_slave_exec(ec_fsm_slave_t *); -int ec_fsm_slave_idle(const ec_fsm_slave_t *); +void ec_fsm_slave_ready(ec_fsm_slave_t *); /*****************************************************************************/