Skip to content
Snippets Groups Projects
Commit d3568e97 authored by Florian Pose's avatar Florian Pose
Browse files

Moved Pdo sync manager configuration before Pdo assignment in slave

configuration state machine.
parent a6bbc529
No related branches found
No related tags found
No related merge requests found
......@@ -34,20 +34,26 @@ digraph slaveconf {
//preop -> preop
//preop -> error
preop -> end [fontname="Helvetica",label="PREOP\nrequested"]
preop -> enter_safeop [fontname="Helvetica",label="No slave\nconfig attached"]
preop -> enter_sdo_conf [weight=10]
enter_sdo_conf [shape=point,label=""]
enter_sdo_conf -> enter_safeop [fontname="Helvetica",label="No slave\nconfig attached"]
enter_sdo_conf -> enter_pdo_assign [fontname="Helvetica",label="No Sdo\nconfigurations"]
enter_sdo_conf -> enter_pdo_sync [fontname="Helvetica",label="No Sdo\nconfigurations"]
enter_sdo_conf -> sdo_conf [weight=10]
sdo_conf [fontname="Helvetica"]
//sdo_conf -> sdo_conf
//sdo_conf -> error
sdo_conf -> enter_pdo_assign [weight=10]
sdo_conf -> enter_pdo_sync [weight=10]
enter_pdo_assign [shape=point,label=""]
enter_pdo_assign -> pdo_assign [weight=10]
enter_pdo_sync [shape=point,label=""]
enter_pdo_sync -> enter_safeop [fontname="Helvetica",label="No Pdos"]
enter_pdo_sync -> pdo_sync [weight=10]
pdo_sync [fontname="Helvetica"]
//pdo_sync -> pdo_sync
//pdo_sync -> error
pdo_sync -> pdo_assign [weight=10]
pdo_assign [fontname="Helvetica"]
//pdo_assign -> pdo_assign
......@@ -57,16 +63,7 @@ digraph slaveconf {
pdo_mapping [fontname="Helvetica"]
//pdo_mapping -> pdo_mapping
//pdo_mapping -> error
pdo_mapping -> enter_pdo_sync [weight=10]
enter_pdo_sync [shape=point,label=""]
enter_pdo_sync -> pdo_sync [weight=10]
enter_pdo_sync -> enter_fmmu [fontname="Helvetica",label="No Pdos"]
pdo_sync [fontname="Helvetica"]
//pdo_sync -> pdo_sync
//pdo_sync -> error
pdo_sync -> enter_fmmu [weight=10]
pdo_mapping -> enter_fmmu [weight=10]
enter_fmmu [shape=point,label=""]
enter_fmmu -> enter_safeop [fontname="Helvetica",label="No FMMUs\nto configure"]
......
......@@ -52,9 +52,9 @@ void ec_fsm_slave_config_state_clear_fmmus(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_mbox_sync(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_preop(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_sdo_conf(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_pdo_assign(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_pdo_mapping(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_fmmu(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_safeop(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
......@@ -62,8 +62,8 @@ void ec_fsm_slave_config_state_op(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_mbox_sync(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_preop(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_pdo_assign(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_pdo_sync(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_pdo_assign(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_fmmu(ec_fsm_slave_config_t *);
void ec_fsm_slave_config_enter_safeop(ec_fsm_slave_config_t *);
......@@ -415,12 +415,18 @@ void ec_fsm_slave_config_state_preop(ec_fsm_slave_config_t *fsm /**< slave state
if (slave->current_state == slave->requested_state) {
fsm->state = ec_fsm_slave_config_state_end; // successful
if (master->debug_level) {
EC_DBG("Finished configuration of slave %i.\n",
EC_DBG("Finished configuration of slave %u.\n",
slave->ring_position);
}
return;
}
if (!slave->config) {
EC_DBG("Slave %u is not configured.\n", slave->ring_position);
ec_fsm_slave_config_enter_safeop(fsm);
return;
}
ec_fsm_slave_config_enter_sdo_conf(fsm);
}
......@@ -434,15 +440,9 @@ void ec_fsm_slave_config_enter_sdo_conf(ec_fsm_slave_config_t *fsm /**< slave st
{
ec_slave_t *slave = fsm->slave;
if (!slave->config) {
EC_DBG("Slave %u is not configured.\n", slave->ring_position);
ec_fsm_slave_config_enter_safeop(fsm);
return;
}
// No CoE configuration to be applied?
if (list_empty(&slave->config->sdo_configs)) { // skip Sdo configuration
ec_fsm_slave_config_enter_pdo_assign(fsm);
ec_fsm_slave_config_enter_pdo_sync(fsm);
return;
}
......@@ -486,71 +486,6 @@ void ec_fsm_slave_config_state_sdo_conf(
}
// All Sdos are now configured.
ec_fsm_slave_config_enter_pdo_assign(fsm);
}
/*****************************************************************************/
/**
* Check for alternate Pdo assignments to be applied.
*/
void ec_fsm_slave_config_enter_pdo_assign(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
// start applying alternate Pdo assignments
fsm->state = ec_fsm_slave_config_state_pdo_assign;
ec_fsm_pdo_assign_start(&fsm->fsm_pdo_assign, fsm->slave);
ec_fsm_pdo_assign_exec(&fsm->fsm_pdo_assign); // execute immediately
}
/*****************************************************************************/
/**
Slave configuration state: PDO_ASSIGN.
*/
void ec_fsm_slave_config_state_pdo_assign(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
if (ec_fsm_pdo_assign_exec(&fsm->fsm_pdo_assign)) return;
if (!ec_fsm_pdo_assign_success(&fsm->fsm_pdo_assign)) {
EC_ERR("Pdo assignment failed for slave %u.\n",
fsm->slave->ring_position);
fsm->slave->error_flag = 1;
fsm->state = ec_fsm_slave_config_state_error;
return;
}
// Start configuring Pdo mapping
fsm->state = ec_fsm_slave_config_state_pdo_mapping;
ec_fsm_pdo_mapping_start(&fsm->fsm_pdo_mapping, fsm->slave);
ec_fsm_pdo_mapping_exec(&fsm->fsm_pdo_mapping); // execute immediately
}
/*****************************************************************************/
/**
Slave configuration state: PDO_MAPPING.
*/
void ec_fsm_slave_config_state_pdo_mapping(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
if (ec_fsm_pdo_mapping_exec(&fsm->fsm_pdo_mapping)) return;
if (!ec_fsm_pdo_mapping_success(&fsm->fsm_pdo_mapping)) {
EC_ERR("Configuration of Pdo mapping failed for slave %u.\n",
fsm->slave->ring_position);
fsm->slave->error_flag = 1;
fsm->state = ec_fsm_slave_config_state_error;
return;
}
ec_fsm_slave_config_enter_pdo_sync(fsm);
}
......@@ -566,30 +501,32 @@ void ec_fsm_slave_config_enter_pdo_sync(
{
ec_slave_t *slave = fsm->slave;
ec_datagram_t *datagram = fsm->datagram;
unsigned int i, offset, num_syncs;
unsigned int i, offset, num_pdo_syncs;
const ec_sync_t *sync;
ec_direction_t dir;
uint16_t size;
if (!slave->sii.sync_count) {
ec_fsm_slave_config_enter_fmmu(fsm);
return;
}
if (slave->sii.mailbox_protocols) {
offset = 2; // slave has mailboxes
} else {
offset = 0;
}
num_syncs = slave->sii.sync_count - offset;
if (slave->sii.sync_count <= offset) {
// no Pdo sync managers to configure
ec_fsm_slave_config_enter_safeop(fsm);
return;
}
num_pdo_syncs = slave->sii.sync_count - offset;
// configure sync managers for process data
ec_datagram_fpwr(datagram, slave->station_address,
0x0800 + EC_SYNC_PAGE_SIZE * offset,
EC_SYNC_PAGE_SIZE * num_syncs);
memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * num_syncs);
EC_SYNC_PAGE_SIZE * num_pdo_syncs);
memset(datagram->data, 0x00, EC_SYNC_PAGE_SIZE * num_pdo_syncs);
for (i = 0; i < num_syncs; i++) {
for (i = 0; i < num_pdo_syncs; i++) {
sync = &slave->sii.syncs[i + offset];
dir = ec_sync_direction(sync);
size = ec_pdo_list_total_size(&slave->config->pdos[dir]);
......@@ -631,6 +568,71 @@ void ec_fsm_slave_config_state_pdo_sync(ec_fsm_slave_config_t *fsm /**< slave st
return;
}
ec_fsm_slave_config_enter_pdo_assign(fsm);
}
/*****************************************************************************/
/**
* Check for alternate Pdo assignments to be applied.
*/
void ec_fsm_slave_config_enter_pdo_assign(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
// start applying alternate Pdo assignments
fsm->state = ec_fsm_slave_config_state_pdo_assign;
ec_fsm_pdo_assign_start(&fsm->fsm_pdo_assign, fsm->slave);
ec_fsm_pdo_assign_exec(&fsm->fsm_pdo_assign); // execute immediately
}
/*****************************************************************************/
/**
Slave configuration state: PDO_ASSIGN.
*/
void ec_fsm_slave_config_state_pdo_assign(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
if (ec_fsm_pdo_assign_exec(&fsm->fsm_pdo_assign)) return;
if (!ec_fsm_pdo_assign_success(&fsm->fsm_pdo_assign)) {
EC_ERR("Pdo assignment failed for slave %u.\n",
fsm->slave->ring_position);
fsm->slave->error_flag = 1;
fsm->state = ec_fsm_slave_config_state_error;
return;
}
// Start configuring Pdo mapping
fsm->state = ec_fsm_slave_config_state_pdo_mapping;
ec_fsm_pdo_mapping_start(&fsm->fsm_pdo_mapping, fsm->slave);
ec_fsm_pdo_mapping_exec(&fsm->fsm_pdo_mapping); // execute immediately
}
/*****************************************************************************/
/**
Slave configuration state: PDO_MAPPING.
*/
void ec_fsm_slave_config_state_pdo_mapping(
ec_fsm_slave_config_t *fsm /**< slave state machine */
)
{
if (ec_fsm_pdo_mapping_exec(&fsm->fsm_pdo_mapping)) return;
if (!ec_fsm_pdo_mapping_success(&fsm->fsm_pdo_mapping)) {
EC_ERR("Configuration of Pdo mapping failed for slave %u.\n",
fsm->slave->ring_position);
fsm->slave->error_flag = 1;
fsm->state = ec_fsm_slave_config_state_error;
return;
}
ec_fsm_slave_config_enter_fmmu(fsm);
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment