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

Cleaned up Pdo mapping and configuration state machines.

parent 6f0241e5
No related branches found
No related tags found
No related merge requests found
......@@ -150,7 +150,7 @@ void ec_fsm_mapping_state_start(
return;
}
fsm->dir = EC_DIR_OUTPUT;
fsm->sync = NULL;
ec_fsm_mapping_next_sync(fsm);
}
......@@ -162,31 +162,38 @@ void ec_fsm_mapping_next_sync(
ec_fsm_mapping_t *fsm /**< mapping state machine */
)
{
while (1) {
if (fsm->dir > EC_DIR_INPUT) {
// no more directions to configure mappings for
fsm->state = ec_fsm_mapping_state_end;
return;
}
ec_direction_t dir;
const ec_sync_t *sync;
const ec_pdo_mapping_t *map;
if (!(fsm->sync = ec_slave_get_pdo_sync(fsm->slave, fsm->dir))) {
EC_WARN("next_sync(): No sync manager!\n");
fsm->dir++;
for (dir = EC_DIR_OUTPUT; dir <= EC_DIR_INPUT; dir++) {
if (!(sync = ec_slave_get_pdo_sync(fsm->slave, dir))) {
EC_WARN("No sync manager for direction %u!\n", dir);
continue;
}
fsm->mapping = &fsm->slave->config->mapping[fsm->dir];
if (ec_pdo_mapping_equal(&fsm->sync->mapping, fsm->mapping)) {
// the mapping for this direction does not have to be altered
fsm->dir++;
continue;
if (fsm->sync) { // there is a last SM
if (sync == fsm->sync) // this is the last SM
fsm->sync = NULL; // take the next one
} else {
fsm->dir++;
map = &fsm->slave->config->mapping[dir];
if (ec_pdo_mapping_equal(&sync->mapping, map))
continue;
fsm->sync = sync;
fsm->mapping = map;
break;
}
}
if (!sync) {
if (fsm->slave->master->debug_level)
EC_DBG("Pdo mapping finished for slave %u.\n",
fsm->slave->ring_position);
fsm->state = ec_fsm_mapping_state_end;
return;
}
if (fsm->slave->master->debug_level) {
EC_DBG("Configuring PDO mapping for SM%u of slave %u.\n",
fsm->sync->index, fsm->slave->ring_position);
......@@ -222,6 +229,27 @@ ec_pdo_t *ec_fsm_mapping_next_pdo(
/*****************************************************************************/
/** Add a Pdo to the mapping.
*/
void ec_fsm_mapping_add_pdo(
ec_fsm_mapping_t *fsm /**< mapping state machine */
)
{
fsm->sdodata.subindex = fsm->pdo_count;
EC_WRITE_U16(&fsm->sdo_value, fsm->pdo->index);
fsm->sdodata.size = 2;
if (fsm->slave->master->debug_level)
EC_DBG("Mapping PDO 0x%04X at position %u.\n",
fsm->pdo->index, fsm->sdodata.subindex);
fsm->state = ec_fsm_mapping_state_add_pdo;
ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->sdodata);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
}
/*****************************************************************************/
/** Set the number of mapped PDOs to zero.
*/
void ec_fsm_mapping_state_zero_count(
......@@ -250,17 +278,7 @@ void ec_fsm_mapping_state_zero_count(
// add first PDO to mapping
fsm->pdo_count = 1;
fsm->sdodata.subindex = fsm->pdo_count;
EC_WRITE_U16(&fsm->sdo_value, fsm->pdo->index);
fsm->sdodata.size = 2;
if (fsm->slave->master->debug_level)
EC_DBG("Mapping PDO 0x%04X at position %u.\n",
fsm->pdo->index, fsm->sdodata.subindex);
fsm->state = ec_fsm_mapping_state_add_pdo;
ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->sdodata);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
ec_fsm_mapping_add_pdo(fsm);
}
/*****************************************************************************/
......@@ -299,16 +317,7 @@ void ec_fsm_mapping_state_add_pdo(
// add next PDO to mapping
fsm->pdo_count++;
fsm->sdodata.subindex = fsm->pdo_count;
EC_WRITE_U16(&fsm->sdo_value, fsm->pdo->index);
fsm->sdodata.size = 2;
if (fsm->slave->master->debug_level)
EC_DBG("Mapping PDO 0x%04X at position %u.\n",
fsm->pdo->index, fsm->sdodata.subindex);
ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->sdodata);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
ec_fsm_mapping_add_pdo(fsm);
}
/*****************************************************************************/
......
......@@ -54,18 +54,17 @@ typedef struct ec_fsm_mapping ec_fsm_mapping_t; /**< \see ec_fsm_mapping */
*/
struct ec_fsm_mapping
{
void (*state)(ec_fsm_mapping_t *); /**< state function */
ec_fsm_coe_t *fsm_coe; /**< CoE state machine to use */
void (*state)(ec_fsm_mapping_t *); /**< State function. */
ec_fsm_coe_t *fsm_coe; /**< CoE state machine to use. */
ec_slave_t *slave; /**< Slave the FSM runs on. */
ec_slave_t *slave; /**< slave the FSM runs on */
const ec_sync_t *sync; /**< Current sync manager. */
const ec_pdo_mapping_t *mapping; /**< Target Pdo mapping. */
const ec_pdo_t *pdo; /**< Current Pdo. */
ec_direction_t dir; /**< current PDO direction */
ec_sync_t *sync; /**< current sync manager */
const ec_pdo_mapping_t *mapping; /**< Mapping to assign. */
ec_pdo_t *pdo; /**< current PDO */
ec_sdo_data_t sdodata; /**< SDO configuration data */
uint16_t sdo_value; /**< SDO value */
unsigned int pdo_count; /**< number of mapped PDOs */
ec_sdo_data_t sdodata; /**< SDO configuration data. */
uint16_t sdo_value; /**< SDO value. */
unsigned int pdo_count; /**< Number of mapped Pdos. */
};
/*****************************************************************************/
......
......@@ -167,27 +167,28 @@ void ec_fsm_pdo_config_next_pdo(
map = &fsm->slave->config->mapping[dir];
list_for_each_entry(pdo, &map->pdos, list) {
if (fsm->pdo) {
if (pdo == fsm->pdo)
fsm->pdo = NULL;
if (fsm->pdo) { // there was a Pdo configured in the last run
if (pdo == fsm->pdo) // this is the last Pdo
fsm->pdo = NULL; // take the next one
} else {
if ((mapped_pdo = ec_slave_find_pdo(fsm->slave, pdo->index)))
if (ec_pdo_equal_entries(pdo, mapped_pdo))
continue; // Pdo configured correctly
fsm->pdo = pdo;
goto configure;
break;
}
}
}
if (fsm->slave->master->debug_level)
EC_DBG("Pdo configuration finished for slave %u.\n",
fsm->slave->ring_position);
fsm->state = ec_fsm_pdo_config_state_end;
return;
if (!fsm->pdo) {
if (fsm->slave->master->debug_level)
EC_DBG("Pdo configuration finished for slave %u.\n",
fsm->slave->ring_position);
fsm->state = ec_fsm_pdo_config_state_end;
return;
}
configure:
if (fsm->slave->master->debug_level) {
EC_DBG("Changing configuration of Pdo 0x%04X of slave %u.\n",
fsm->pdo->index, fsm->slave->ring_position);
......
......@@ -31,10 +31,9 @@
*
*****************************************************************************/
/**
\file
EtherCAT PDO configuration state machine structures.
*/
/** \file
* EtherCAT PDO configuration state machine structures.
*/
/*****************************************************************************/
......
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