--- a/master/fsm_master.c Wed Sep 19 17:32:39 2007 +0000
+++ b/master/fsm_master.c Wed Sep 19 17:44:28 2007 +0000
@@ -60,6 +60,7 @@
void ec_fsm_master_state_scan_slaves(ec_fsm_master_t *);
void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *);
void ec_fsm_master_state_sdodict(ec_fsm_master_t *);
+void ec_fsm_master_state_pdomap(ec_fsm_master_t *);
void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
void ec_fsm_master_state_end(ec_fsm_master_t *);
void ec_fsm_master_state_error(ec_fsm_master_t *);
@@ -90,6 +91,7 @@
ec_fsm_sii_init(&fsm->fsm_sii, fsm->datagram);
ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
+ ec_fsm_coe_map_init(&fsm->fsm_coe_map, &fsm->fsm_coe);
}
/*****************************************************************************/
@@ -105,6 +107,7 @@
ec_fsm_sii_clear(&fsm->fsm_sii);
ec_fsm_change_clear(&fsm->fsm_change);
ec_fsm_coe_clear(&fsm->fsm_coe);
+ ec_fsm_coe_map_clear(&fsm->fsm_coe_map);
}
/*****************************************************************************/
@@ -521,6 +524,29 @@
return;
}
+ // check, if slaves have their PDO mapping to be read.
+ list_for_each_entry(slave, &master->slaves, list) {
+ if (!(slave->sii_mailbox_protocols & EC_MBOX_COE)
+ || slave->pdo_mapping_fetched
+ || !slave->sdo_dictionary_fetched
+ || slave->current_state == EC_SLAVE_STATE_INIT
+ || slave->online_state == EC_SLAVE_OFFLINE) continue;
+
+ if (master->debug_level) {
+ EC_DBG("Fetching PDO mapping from slave %i via CoE.\n",
+ slave->ring_position);
+ }
+
+ slave->pdo_mapping_fetched = 1;
+
+ // start fetching PDO mapping
+ fsm->idle = 0;
+ fsm->state = ec_fsm_master_state_pdomap;
+ ec_fsm_coe_map_start(&fsm->fsm_coe_map, slave);
+ ec_fsm_coe_map_exec(&fsm->fsm_coe_map); // execute immediately
+ return;
+ }
+
// check for pending EEPROM write operations.
if (ec_fsm_master_action_process_eeprom(fsm))
return; // EEPROM write request found
@@ -1003,6 +1029,26 @@
/*****************************************************************************/
/**
+ */
+
+void ec_fsm_master_state_pdomap(
+ ec_fsm_master_t *fsm /**< master state machine */
+ )
+{
+ if (ec_fsm_coe_map_exec(&fsm->fsm_coe_map)) return;
+
+ if (!ec_fsm_coe_map_success(&fsm->fsm_coe_map)) {
+ fsm->state = ec_fsm_master_state_error;
+ return;
+ }
+
+ // fetching of PDO mapping finished
+ fsm->state = ec_fsm_master_state_end;
+}
+
+/*****************************************************************************/
+
+/**
Master state: SDO REQUEST.
*/