New state in slaveconf FSM: Clear FMMU configurations after INIT.
This commit is contained in:
parent
1f44556083
commit
ab80d57c03
231
master/fsm.c
231
master/fsm.c
|
|
@ -68,17 +68,23 @@ void ec_fsm_slavescan_datalink(ec_fsm_t *);
|
|||
void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
|
||||
void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
|
||||
|
||||
void ec_fsm_slaveconf_start(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_init(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_sync(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_preop(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_fmmu(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_sdoconf(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_saveop(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_op(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_start(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_init(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_clear_fmmus(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_sync(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_preop(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_fmmu(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_sdoconf(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_saveop(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_state_op(ec_fsm_t *);
|
||||
|
||||
void ec_fsm_slave_end(ec_fsm_t *);
|
||||
void ec_fsm_slave_error(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_enter_sync(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_enter_preop(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_enter_sdoconf(ec_fsm_t *);
|
||||
void ec_fsm_slaveconf_enter_saveop(ec_fsm_t *);
|
||||
|
||||
void ec_fsm_slave_state_end(ec_fsm_t *);
|
||||
void ec_fsm_slave_state_error(ec_fsm_t *);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
@ -332,7 +338,7 @@ void ec_fsm_master_action_process_states(ec_fsm_t *fsm
|
|||
|
||||
fsm->master_state = ec_fsm_master_configure_slave;
|
||||
fsm->slave = slave;
|
||||
fsm->slave_state = ec_fsm_slaveconf_start;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_start;
|
||||
fsm->slave_state(fsm); // execute immediately
|
||||
return;
|
||||
}
|
||||
|
|
@ -713,8 +719,8 @@ void ec_fsm_master_scan_slaves(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
fsm->slave_state(fsm); // execute slave state machine
|
||||
|
||||
if (fsm->slave_state != ec_fsm_slave_end
|
||||
&& fsm->slave_state != ec_fsm_slave_error) return;
|
||||
if (fsm->slave_state != ec_fsm_slave_state_end
|
||||
&& fsm->slave_state != ec_fsm_slave_state_error) return;
|
||||
|
||||
// another slave to fetch?
|
||||
if (slave->list.next != &master->slaves) {
|
||||
|
|
@ -750,8 +756,8 @@ void ec_fsm_master_configure_slave(ec_fsm_t *fsm
|
|||
{
|
||||
fsm->slave_state(fsm); // execute slave's state machine
|
||||
|
||||
if (fsm->slave_state != ec_fsm_slave_end
|
||||
&& fsm->slave_state != ec_fsm_slave_error) return;
|
||||
if (fsm->slave_state != ec_fsm_slave_state_end
|
||||
&& fsm->slave_state != ec_fsm_slave_state_error) return;
|
||||
|
||||
ec_fsm_master_action_process_states(fsm);
|
||||
}
|
||||
|
|
@ -917,7 +923,7 @@ void ec_fsm_slavescan_address(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to write station address of slave %i.\n",
|
||||
fsm->slave->ring_position);
|
||||
return;
|
||||
|
|
@ -943,7 +949,7 @@ void ec_fsm_slavescan_state(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to read AL state of slave %i.\n",
|
||||
fsm->slave->ring_position);
|
||||
return;
|
||||
|
|
@ -977,7 +983,7 @@ void ec_fsm_slavescan_base(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to read base data of slave %i.\n",
|
||||
slave->ring_position);
|
||||
return;
|
||||
|
|
@ -1014,7 +1020,7 @@ void ec_fsm_slavescan_datalink(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to read DL status of slave %i.\n",
|
||||
slave->ring_position);
|
||||
return;
|
||||
|
|
@ -1050,7 +1056,7 @@ void ec_fsm_slavescan_eeprom_size(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to read EEPROM size of slave %i.\n",
|
||||
slave->ring_position);
|
||||
return;
|
||||
|
|
@ -1078,7 +1084,7 @@ void ec_fsm_slavescan_eeprom_size(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (!(slave->eeprom_data =
|
||||
(uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to allocate EEPROM data on slave %i.\n",
|
||||
slave->ring_position);
|
||||
return;
|
||||
|
|
@ -1107,7 +1113,7 @@ void ec_fsm_slavescan_eeprom_data(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to fetch EEPROM contents of slave %i.\n",
|
||||
slave->ring_position);
|
||||
return;
|
||||
|
|
@ -1196,13 +1202,13 @@ void ec_fsm_slavescan_eeprom_data(ec_fsm_t *fsm /**< finite state machine */)
|
|||
cat_word += cat_size + 2;
|
||||
}
|
||||
|
||||
fsm->slave_state = ec_fsm_slave_end;
|
||||
fsm->slave_state = ec_fsm_slave_state_end;
|
||||
return;
|
||||
|
||||
end:
|
||||
EC_ERR("Failed to analyze category data.\n");
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -1213,7 +1219,7 @@ end:
|
|||
Slave configuration state: START.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_start(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_start(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
if (fsm->master->debug_level) {
|
||||
EC_DBG("Configuring slave %i...\n", fsm->slave->ring_position);
|
||||
|
|
@ -1221,7 +1227,7 @@ void ec_fsm_slaveconf_start(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
|
||||
ec_fsm_change_exec(&fsm->fsm_change);
|
||||
fsm->slave_state = ec_fsm_slaveconf_init;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_init;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -1230,19 +1236,17 @@ void ec_fsm_slaveconf_start(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: INIT.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_init(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_master_t *master = fsm->master;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
ec_datagram_t *datagram = &fsm->datagram;
|
||||
const ec_sii_sync_t *sync;
|
||||
ec_sii_sync_t mbox_sync;
|
||||
|
||||
if (ec_fsm_change_exec(&fsm->fsm_change)) return;
|
||||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1252,9 +1256,66 @@ void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
|
|||
EC_DBG("Slave %i is now in INIT.\n", slave->ring_position);
|
||||
}
|
||||
|
||||
// check and reset CRC fault counters
|
||||
//ec_slave_check_crc(slave);
|
||||
// TODO: Implement state machine for CRC checking.
|
||||
|
||||
if (!slave->base_fmmu_count) { // skip FMMU configuration
|
||||
ec_fsm_slaveconf_enter_sync(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
if (master->debug_level)
|
||||
EC_DBG("Clearing FMMU configurations of slave %i...\n",
|
||||
slave->ring_position);
|
||||
|
||||
// clear FMMU configurations
|
||||
ec_datagram_npwr(datagram, slave->station_address,
|
||||
0x0600, EC_FMMU_SIZE * slave->base_fmmu_count);
|
||||
memset(datagram->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
|
||||
ec_master_queue_datagram(master, datagram);
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_clear_fmmus;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
Slave configuration state: CLEAR FMMU.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_state_clear_fmmus(ec_fsm_t *fsm
|
||||
/**< finite state machine */)
|
||||
{
|
||||
ec_datagram_t *datagram = &fsm->datagram;
|
||||
|
||||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to clear FMMUs on slave %i.\n",
|
||||
fsm->slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
||||
ec_fsm_slaveconf_enter_sync(fsm);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_enter_sync(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_master_t *master = fsm->master;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
ec_datagram_t *datagram = &fsm->datagram;
|
||||
const ec_sii_sync_t *sync;
|
||||
ec_sii_sync_t mbox_sync;
|
||||
|
||||
// slave is now in INIT
|
||||
if (slave->current_state == slave->requested_state) {
|
||||
fsm->slave_state = ec_fsm_slave_end; // successful
|
||||
fsm->slave_state = ec_fsm_slave_state_end; // successful
|
||||
if (master->debug_level) {
|
||||
EC_DBG("Finished configuration of slave %i.\n",
|
||||
slave->ring_position);
|
||||
|
|
@ -1262,14 +1323,8 @@ void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
|
|||
return;
|
||||
}
|
||||
|
||||
// check and reset CRC fault counters
|
||||
//ec_slave_check_crc(slave);
|
||||
// TODO: Implement state machine for CRC checking.
|
||||
|
||||
if (!slave->base_sync_count) { // no sync managers
|
||||
fsm->slave_state = ec_fsm_slaveconf_preop;
|
||||
ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP);
|
||||
ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
|
||||
ec_fsm_slaveconf_enter_preop(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1311,7 +1366,7 @@ void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (sync->index >= slave->base_sync_count) {
|
||||
EC_ERR("Invalid sync manager configuration found!");
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
ec_sync_config(sync, slave,
|
||||
|
|
@ -1320,7 +1375,7 @@ void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
|
|||
}
|
||||
|
||||
ec_master_queue_datagram(fsm->master, datagram);
|
||||
fsm->slave_state = ec_fsm_slaveconf_sync;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_sync;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -1329,7 +1384,7 @@ void ec_fsm_slaveconf_init(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: SYNC.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_sync(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_sync(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_datagram_t *datagram = &fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
|
@ -1337,14 +1392,24 @@ void ec_fsm_slaveconf_sync(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to set sync managers on slave %i.\n",
|
||||
slave->ring_position);
|
||||
return;
|
||||
}
|
||||
|
||||
fsm->slave_state = ec_fsm_slaveconf_preop;
|
||||
ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_PREOP);
|
||||
ec_fsm_slaveconf_enter_preop(fsm);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_enter_preop(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_preop;
|
||||
ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_PREOP);
|
||||
ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
|
||||
}
|
||||
|
||||
|
|
@ -1354,7 +1419,7 @@ void ec_fsm_slaveconf_sync(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: PREOP.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_preop(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_preop(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
ec_master_t *master = fsm->master;
|
||||
|
|
@ -1365,7 +1430,7 @@ void ec_fsm_slaveconf_preop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1377,7 +1442,7 @@ void ec_fsm_slaveconf_preop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
}
|
||||
|
||||
if (slave->current_state == slave->requested_state) {
|
||||
fsm->slave_state = ec_fsm_slave_end; // successful
|
||||
fsm->slave_state = ec_fsm_slave_state_end; // successful
|
||||
if (master->debug_level) {
|
||||
EC_DBG("Finished configuration of slave %i.\n",
|
||||
slave->ring_position);
|
||||
|
|
@ -1387,18 +1452,11 @@ void ec_fsm_slaveconf_preop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
if (!slave->base_fmmu_count) { // skip FMMU configuration
|
||||
if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
|
||||
fsm->slave_state = ec_fsm_slaveconf_saveop;
|
||||
ec_fsm_change_start(&fsm->fsm_change, slave,
|
||||
EC_SLAVE_STATE_SAVEOP);
|
||||
ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
|
||||
ec_fsm_slaveconf_enter_saveop(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
// start SDO configuration
|
||||
fsm->slave_state = ec_fsm_slaveconf_sdoconf;
|
||||
fsm->sdodata = list_entry(slave->sdo_confs.next, ec_sdo_data_t, list);
|
||||
ec_fsm_coe_download(&fsm->fsm_coe, slave, fsm->sdodata);
|
||||
ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
|
||||
ec_fsm_slaveconf_enter_sdoconf(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1412,7 +1470,7 @@ void ec_fsm_slaveconf_preop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
}
|
||||
|
||||
ec_master_queue_datagram(master, datagram);
|
||||
fsm->slave_state = ec_fsm_slaveconf_fmmu;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_fmmu;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -1421,7 +1479,7 @@ void ec_fsm_slaveconf_preop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: FMMU.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_fmmu(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_fmmu(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_datagram_t *datagram = &fsm->datagram;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
|
@ -1429,7 +1487,7 @@ void ec_fsm_slaveconf_fmmu(ec_fsm_t *fsm /**< finite state machine */)
|
|||
if (datagram->state != EC_DATAGRAM_RECEIVED
|
||||
|| datagram->working_counter != 1) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
EC_ERR("Failed to set FMMUs on slave %i.\n",
|
||||
fsm->slave->ring_position);
|
||||
return;
|
||||
|
|
@ -1437,17 +1495,24 @@ void ec_fsm_slaveconf_fmmu(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
// No CoE configuration to be applied? Jump to SAVEOP state.
|
||||
if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
|
||||
// set state to SAVEOP
|
||||
fsm->slave_state = ec_fsm_slaveconf_saveop;
|
||||
ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_SAVEOP);
|
||||
ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
|
||||
ec_fsm_slaveconf_enter_saveop(fsm);
|
||||
return;
|
||||
}
|
||||
|
||||
ec_fsm_slaveconf_enter_sdoconf(fsm);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_enter_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
// start SDO configuration
|
||||
fsm->slave_state = ec_fsm_slaveconf_sdoconf;
|
||||
fsm->sdodata = list_entry(slave->sdo_confs.next, ec_sdo_data_t, list);
|
||||
ec_fsm_coe_download(&fsm->fsm_coe, slave, fsm->sdodata);
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_sdoconf;
|
||||
fsm->sdodata = list_entry(fsm->slave->sdo_confs.next, ec_sdo_data_t, list);
|
||||
ec_fsm_coe_download(&fsm->fsm_coe, fsm->slave, fsm->sdodata);
|
||||
ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
|
||||
}
|
||||
|
||||
|
|
@ -1457,13 +1522,13 @@ void ec_fsm_slaveconf_fmmu(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: SDOCONF.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
|
||||
|
||||
if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1479,7 +1544,17 @@ void ec_fsm_slaveconf_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
|
|||
// All SDOs are now configured.
|
||||
|
||||
// set state to SAVEOP
|
||||
fsm->slave_state = ec_fsm_slaveconf_saveop;
|
||||
ec_fsm_slaveconf_enter_saveop(fsm);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_enter_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_saveop;
|
||||
ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP);
|
||||
ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
|
||||
}
|
||||
|
|
@ -1490,7 +1565,7 @@ void ec_fsm_slaveconf_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: SAVEOP.
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_master_t *master = fsm->master;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
|
@ -1499,7 +1574,7 @@ void ec_fsm_slaveconf_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
fsm->slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1510,7 +1585,7 @@ void ec_fsm_slaveconf_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
}
|
||||
|
||||
if (fsm->slave->current_state == fsm->slave->requested_state) {
|
||||
fsm->slave_state = ec_fsm_slave_end; // successful
|
||||
fsm->slave_state = ec_fsm_slave_state_end; // successful
|
||||
if (master->debug_level) {
|
||||
EC_DBG("Finished configuration of slave %i.\n",
|
||||
slave->ring_position);
|
||||
|
|
@ -1519,7 +1594,7 @@ void ec_fsm_slaveconf_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
}
|
||||
|
||||
// set state to OP
|
||||
fsm->slave_state = ec_fsm_slaveconf_op;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_op;
|
||||
ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP);
|
||||
ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
|
||||
}
|
||||
|
|
@ -1530,7 +1605,7 @@ void ec_fsm_slaveconf_saveop(ec_fsm_t *fsm /**< finite state machine */)
|
|||
Slave configuration state: OP
|
||||
*/
|
||||
|
||||
void ec_fsm_slaveconf_op(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slaveconf_state_op(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
ec_master_t *master = fsm->master;
|
||||
ec_slave_t *slave = fsm->slave;
|
||||
|
|
@ -1539,7 +1614,7 @@ void ec_fsm_slaveconf_op(ec_fsm_t *fsm /**< finite state machine */)
|
|||
|
||||
if (!ec_fsm_change_success(&fsm->fsm_change)) {
|
||||
slave->error_flag = 1;
|
||||
fsm->slave_state = ec_fsm_slave_error;
|
||||
fsm->slave_state = ec_fsm_slave_state_error;
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -1550,7 +1625,7 @@ void ec_fsm_slaveconf_op(ec_fsm_t *fsm /**< finite state machine */)
|
|||
EC_DBG("Finished configuration of slave %i.\n", slave->ring_position);
|
||||
}
|
||||
|
||||
fsm->slave_state = ec_fsm_slave_end; // successful
|
||||
fsm->slave_state = ec_fsm_slave_state_end; // successful
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -1561,7 +1636,7 @@ void ec_fsm_slaveconf_op(ec_fsm_t *fsm /**< finite state machine */)
|
|||
State: ERROR.
|
||||
*/
|
||||
|
||||
void ec_fsm_slave_error(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slave_state_error(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -1571,7 +1646,7 @@ void ec_fsm_slave_error(ec_fsm_t *fsm /**< finite state machine */)
|
|||
State: END.
|
||||
*/
|
||||
|
||||
void ec_fsm_slave_end(ec_fsm_t *fsm /**< finite state machine */)
|
||||
void ec_fsm_slave_state_end(ec_fsm_t *fsm /**< finite state machine */)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -89,10 +89,10 @@ int ec_fsm_exec(ec_fsm_t *);
|
|||
int ec_fsm_running(ec_fsm_t *);
|
||||
int ec_fsm_success(ec_fsm_t *);
|
||||
|
||||
// FIXME
|
||||
void ec_fsm_slaveconf_start(ec_fsm_t *);
|
||||
void ec_fsm_slave_end(ec_fsm_t *);
|
||||
void ec_fsm_slave_error(ec_fsm_t *);
|
||||
// TODO: layout slave state machines
|
||||
void ec_fsm_slaveconf_state_start(ec_fsm_t *);
|
||||
void ec_fsm_slave_state_end(ec_fsm_t *);
|
||||
void ec_fsm_slave_state_error(ec_fsm_t *);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -436,14 +436,14 @@ void ec_master_leave_operation_mode(ec_master_t *master
|
|||
ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
|
||||
|
||||
fsm->slave = slave;
|
||||
fsm->slave_state = ec_fsm_slaveconf_start;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_start;
|
||||
|
||||
do {
|
||||
fsm->slave_state(fsm);
|
||||
ec_master_sync_io(master);
|
||||
}
|
||||
while (fsm->slave_state != ec_fsm_slave_end
|
||||
&& fsm->slave_state != ec_fsm_slave_error);
|
||||
while (fsm->slave_state != ec_fsm_slave_state_end
|
||||
&& fsm->slave_state != ec_fsm_slave_state_error);
|
||||
}
|
||||
|
||||
ec_master_destroy_domains(master);
|
||||
|
|
@ -1333,16 +1333,16 @@ int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
|
|||
// configure all slaves
|
||||
list_for_each_entry(slave, &master->slaves, list) {
|
||||
fsm->slave = slave;
|
||||
fsm->slave_state = ec_fsm_slaveconf_start;
|
||||
fsm->slave_state = ec_fsm_slaveconf_state_start;
|
||||
|
||||
do {
|
||||
fsm->slave_state(fsm);
|
||||
ec_master_sync_io(master);
|
||||
}
|
||||
while (fsm->slave_state != ec_fsm_slave_end
|
||||
&& fsm->slave_state != ec_fsm_slave_error);
|
||||
while (fsm->slave_state != ec_fsm_slave_state_end
|
||||
&& fsm->slave_state != ec_fsm_slave_state_error);
|
||||
|
||||
if (fsm->slave_state == ec_fsm_slave_error) {
|
||||
if (fsm->slave_state == ec_fsm_slave_state_error) {
|
||||
EC_ERR("Failed to configure slave %i!\n", slave->ring_position);
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue