From c0adb9cbfd9be919a010d3b4a57ffca47e5fc8a1 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Thu, 6 Dec 2012 14:06:10 +0100 Subject: [PATCH] Do not use slaves's SoE state machine for configuration. --- master/fsm_master.c | 6 +++-- master/fsm_master.h | 1 + master/fsm_slave_config.c | 48 +++++++++++++++++---------------------- master/fsm_slave_config.h | 3 ++- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/master/fsm_master.c b/master/fsm_master.c index a1f570b4..ccc2e853 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -86,10 +86,11 @@ void ec_fsm_master_init( // init sub-state-machines ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); + ec_fsm_soe_init(&fsm->fsm_soe, fsm->datagram); ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe); ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram, - &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_pdo); + &fsm->fsm_change, &fsm->fsm_coe, &fsm->fsm_soe, &fsm->fsm_pdo); ec_fsm_slave_scan_init(&fsm->fsm_slave_scan, fsm->datagram, &fsm->fsm_slave_config, &fsm->fsm_pdo); ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram); @@ -105,6 +106,7 @@ void ec_fsm_master_clear( { // clear sub-state machines ec_fsm_coe_clear(&fsm->fsm_coe); + ec_fsm_soe_clear(&fsm->fsm_soe); ec_fsm_pdo_clear(&fsm->fsm_pdo); ec_fsm_change_clear(&fsm->fsm_change); ec_fsm_slave_config_clear(&fsm->fsm_slave_config); @@ -611,7 +613,7 @@ void ec_fsm_master_action_configure( return; } - // slave has error flag set; process next one + // process next slave ec_fsm_master_action_next_slave_state(fsm); } diff --git a/master/fsm_master.h b/master/fsm_master.h index 3a0a8839..a41b949c 100644 --- a/master/fsm_master.h +++ b/master/fsm_master.h @@ -90,6 +90,7 @@ struct ec_fsm_master { ec_sdo_request_t *sdo_request; /**< SDO request to process. */ ec_fsm_coe_t fsm_coe; /**< CoE state machine */ + ec_fsm_soe_t fsm_soe; /**< SoE state machine */ ec_fsm_pdo_t fsm_pdo; /**< PDO configuration state machine. */ ec_fsm_change_t fsm_change; /**< State change state machine */ ec_fsm_slave_config_t fsm_slave_config; /**< slave state machine */ diff --git a/master/fsm_slave_config.c b/master/fsm_slave_config.c index b93fd35a..f5ebbc0d 100644 --- a/master/fsm_slave_config.c +++ b/master/fsm_slave_config.c @@ -114,6 +114,7 @@ void ec_fsm_slave_config_init( ec_datagram_t *datagram, /**< datagram structure to use */ ec_fsm_change_t *fsm_change, /**< State change state machine to use. */ ec_fsm_coe_t *fsm_coe, /**< CoE state machine to use. */ + ec_fsm_soe_t *fsm_soe, /**< SoE state machine to use. */ ec_fsm_pdo_t *fsm_pdo /**< PDO configuration state machine to use. */ ) { @@ -123,6 +124,7 @@ void ec_fsm_slave_config_init( fsm->datagram = datagram; fsm->fsm_change = fsm_change; fsm->fsm_coe = fsm_coe; + fsm->fsm_soe = fsm_soe; fsm->fsm_pdo = fsm_pdo; } @@ -688,7 +690,9 @@ void ec_fsm_slave_config_state_sdo_conf( ec_fsm_slave_config_t *fsm /**< slave state machine */ ) { - if (ec_fsm_coe_exec(fsm->fsm_coe)) return; + if (ec_fsm_coe_exec(fsm->fsm_coe)) { + return; + } if (!ec_fsm_coe_success(fsm->fsm_coe)) { EC_SLAVE_ERR(fsm->slave, "SDO configuration failed.\n"); @@ -726,7 +730,6 @@ void ec_fsm_slave_config_enter_soe_conf_preop( ) { ec_slave_t *slave = fsm->slave; - ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; ec_soe_request_t *req; if (!slave->config) { @@ -741,10 +744,9 @@ void ec_fsm_slave_config_enter_soe_conf_preop( fsm->soe_request = req; ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); ec_soe_request_write(&fsm->soe_request_copy); - ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); - ec_fsm_soe_exec(fsm_soe); // execute immediately - ec_master_queue_external_datagram(slave->master, - fsm_soe->datagram); + ec_fsm_soe_transfer(fsm->fsm_soe, fsm->slave, + &fsm->soe_request_copy); + ec_fsm_soe_exec(fsm->fsm_soe); // execute immediately return; } } @@ -762,14 +764,12 @@ void ec_fsm_slave_config_state_soe_conf_preop( ) { ec_slave_t *slave = fsm->slave; - ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; - if (ec_fsm_soe_exec(fsm_soe)) { - ec_master_queue_external_datagram(slave->master, fsm_soe->datagram); + if (ec_fsm_soe_exec(fsm->fsm_soe)) { return; } - if (!ec_fsm_soe_success(fsm_soe)) { + if (!ec_fsm_soe_success(fsm->fsm_soe)) { EC_SLAVE_ERR(slave, "SoE configuration failed.\n"); fsm->slave->error_flag = 1; fsm->state = ec_fsm_slave_config_state_error; @@ -788,10 +788,9 @@ void ec_fsm_slave_config_state_soe_conf_preop( if (fsm->soe_request->al_state == EC_AL_STATE_PREOP) { ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); ec_soe_request_write(&fsm->soe_request_copy); - ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); - ec_fsm_soe_exec(fsm_soe); // execute immediately - ec_master_queue_external_datagram(slave->master, - fsm_soe->datagram); + ec_fsm_soe_transfer(fsm->fsm_soe, fsm->slave, + &fsm->soe_request_copy); + ec_fsm_soe_exec(fsm->fsm_soe); // execute immediately return; } } @@ -1455,7 +1454,6 @@ void ec_fsm_slave_config_enter_soe_conf_safeop( ) { ec_slave_t *slave = fsm->slave; - ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; ec_soe_request_t *req; if (!slave->config) { @@ -1470,10 +1468,9 @@ void ec_fsm_slave_config_enter_soe_conf_safeop( fsm->soe_request = req; ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); ec_soe_request_write(&fsm->soe_request_copy); - ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); - ec_fsm_soe_exec(fsm_soe); // execute immediately - ec_master_queue_external_datagram(slave->master, - fsm_soe->datagram); + ec_fsm_soe_transfer(fsm->fsm_soe, fsm->slave, + &fsm->soe_request_copy); + ec_fsm_soe_exec(fsm->fsm_soe); // execute immediately return; } } @@ -1491,14 +1488,12 @@ void ec_fsm_slave_config_state_soe_conf_safeop( ) { ec_slave_t *slave = fsm->slave; - ec_fsm_soe_t *fsm_soe = &slave->fsm.fsm_soe; - if (ec_fsm_soe_exec(fsm_soe)) { - ec_master_queue_external_datagram(slave->master, fsm_soe->datagram); + if (ec_fsm_soe_exec(fsm->fsm_soe)) { return; } - if (!ec_fsm_soe_success(fsm_soe)) { + if (!ec_fsm_soe_success(fsm->fsm_soe)) { EC_SLAVE_ERR(slave, "SoE configuration failed.\n"); fsm->slave->error_flag = 1; fsm->state = ec_fsm_slave_config_state_error; @@ -1517,10 +1512,9 @@ void ec_fsm_slave_config_state_soe_conf_safeop( if (fsm->soe_request->al_state == EC_AL_STATE_SAFEOP) { ec_soe_request_copy(&fsm->soe_request_copy, fsm->soe_request); ec_soe_request_write(&fsm->soe_request_copy); - ec_fsm_soe_transfer(fsm_soe, fsm->slave, &fsm->soe_request_copy); - ec_fsm_soe_exec(fsm_soe); // execute immediately - ec_master_queue_external_datagram(slave->master, - fsm_soe->datagram); + ec_fsm_soe_transfer(fsm->fsm_soe, fsm->slave, + &fsm->soe_request_copy); + ec_fsm_soe_exec(fsm->fsm_soe); // execute immediately return; } } diff --git a/master/fsm_slave_config.h b/master/fsm_slave_config.h index 15370f1a..0111be7b 100644 --- a/master/fsm_slave_config.h +++ b/master/fsm_slave_config.h @@ -56,6 +56,7 @@ struct ec_fsm_slave_config ec_datagram_t *datagram; /**< Datagram used in the state machine. */ ec_fsm_change_t *fsm_change; /**< State change state machine. */ ec_fsm_coe_t *fsm_coe; /**< CoE state machine. */ + ec_fsm_soe_t *fsm_soe; /**< SoE state machine. */ ec_fsm_pdo_t *fsm_pdo; /**< PDO configuration state machine. */ ec_slave_t *slave; /**< Slave the FSM runs on. */ @@ -72,7 +73,7 @@ struct ec_fsm_slave_config /*****************************************************************************/ void ec_fsm_slave_config_init(ec_fsm_slave_config_t *, ec_datagram_t *, - ec_fsm_change_t *, ec_fsm_coe_t *, ec_fsm_pdo_t *); + ec_fsm_change_t *, ec_fsm_coe_t *, ec_fsm_soe_t *, ec_fsm_pdo_t *); void ec_fsm_slave_config_clear(ec_fsm_slave_config_t *); void ec_fsm_slave_config_start(ec_fsm_slave_config_t *, ec_slave_t *);