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

Fixed warning about missing sync managers during Pdo mapping.

parent 7e403e80
No related branches found
No related tags found
No related merge requests found
......@@ -53,7 +53,7 @@ void ec_fsm_pdo_mapping_state_pdo_count(ec_fsm_pdo_mapping_t *);
void ec_fsm_pdo_mapping_state_end(ec_fsm_pdo_mapping_t *);
void ec_fsm_pdo_mapping_state_error(ec_fsm_pdo_mapping_t *);
void ec_fsm_pdo_mapping_next_sync(ec_fsm_pdo_mapping_t *);
void ec_fsm_pdo_mapping_next_dir(ec_fsm_pdo_mapping_t *);
/*****************************************************************************/
......@@ -150,66 +150,57 @@ void ec_fsm_pdo_mapping_state_start(
return;
}
fsm->sync = NULL;
ec_fsm_pdo_mapping_next_sync(fsm);
fsm->dir = (ec_direction_t) -1; // next is EC_DIR_OUTPUT
ec_fsm_pdo_mapping_next_dir(fsm);
}
/*****************************************************************************/
/** Process mapping of next sync manager.
/** Process mapping of next direction.
*/
void ec_fsm_pdo_mapping_next_sync(
void ec_fsm_pdo_mapping_next_dir(
ec_fsm_pdo_mapping_t *fsm /**< mapping state machine */
)
{
ec_direction_t dir;
const ec_sync_t *sync;
const ec_pdo_mapping_t *map;
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);
for (; fsm->dir <= EC_DIR_INPUT; fsm->dir++) {
fsm->mapping = &fsm->slave->config->mapping[fsm->dir];
if (!(fsm->sync = ec_slave_get_pdo_sync(fsm->slave, fsm->dir))) {
if (!list_empty(&fsm->mapping->pdos)) {
EC_ERR("No sync manager for direction %u!\n", fsm->dir);
fsm->state = ec_fsm_pdo_mapping_state_end;
return;
}
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 {
map = &fsm->slave->config->mapping[dir];
if (ec_pdo_mapping_equal(&sync->mapping, map))
continue;
fsm->sync = sync;
fsm->mapping = map;
break;
// check if mapping has to be altered
if (ec_pdo_mapping_equal(&fsm->sync->mapping, fsm->mapping))
continue;
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);
}
}
if (!fsm->sync) {
// set mapped Pdo count to zero
fsm->sdodata.index = 0x1C10 + fsm->sync->index;
fsm->sdodata.subindex = 0; // mapped Pdo count
EC_WRITE_U8(&fsm->sdo_value, 0); // zero Pdos mapped
fsm->sdodata.size = 1;
if (fsm->slave->master->debug_level)
EC_DBG("Pdo mapping finished for slave %u.\n",
fsm->slave->ring_position);
fsm->state = ec_fsm_pdo_mapping_state_end;
return;
}
EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync->index);
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);
fsm->state = ec_fsm_pdo_mapping_state_zero_count;
ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->sdodata);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
return;
}
// set mapped Pdo count to zero
fsm->sdodata.index = 0x1C10 + fsm->sync->index;
fsm->sdodata.subindex = 0; // mapped Pdo count
EC_WRITE_U8(&fsm->sdo_value, 0); // zero Pdos mapped
fsm->sdodata.size = 1;
if (fsm->slave->master->debug_level)
EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync->index);
fsm->state = ec_fsm_pdo_mapping_state_zero_count;
ec_fsm_coe_download(fsm->fsm_coe, fsm->slave, &fsm->sdodata);
ec_fsm_coe_exec(fsm->fsm_coe); // execute immediately
EC_DBG("Pdo mapping finished for slave %u.\n",
fsm->slave->ring_position);
fsm->state = ec_fsm_pdo_mapping_state_end;
}
/*****************************************************************************/
......@@ -272,7 +263,7 @@ void ec_fsm_pdo_mapping_state_zero_count(
if (fsm->slave->master->debug_level)
EC_DBG("No Pdos to map for SM%u of slave %u.\n",
fsm->sync->index, fsm->slave->ring_position);
ec_fsm_pdo_mapping_next_sync(fsm);
ec_fsm_pdo_mapping_next_dir(fsm);
return;
}
......@@ -341,8 +332,8 @@ void ec_fsm_pdo_mapping_state_pdo_count(
EC_DBG("Successfully set Pdo mapping for SM%u of slave %u.\n",
fsm->sync->index, fsm->slave->ring_position);
// mapping configuration for this sync manager complete.
ec_fsm_pdo_mapping_next_sync(fsm);
// mapping configuration for this direction finished
ec_fsm_pdo_mapping_next_dir(fsm);
}
/******************************************************************************
......
......@@ -62,6 +62,7 @@ struct ec_fsm_pdo_mapping
ec_fsm_coe_t *fsm_coe; /**< CoE state machine to use. */
ec_slave_t *slave; /**< Slave the FSM runs on. */
ec_direction_t dir; /**< Current direction. */
const ec_sync_t *sync; /**< Current sync manager. */
const ec_pdo_mapping_t *mapping; /**< Target Pdo mapping. */
const ec_pdo_t *pdo; /**< Current Pdo. */
......
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