master/fsm_master.c
branchstable-1.3
changeset 1746 72e7507b3f1b
parent 1745 07fd94c5119d
--- a/master/fsm_master.c	Thu Sep 13 11:08:46 2007 +0000
+++ b/master/fsm_master.c	Wed Oct 03 08:58:01 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);
 }
 
 /*****************************************************************************/
@@ -329,8 +332,8 @@
         up(&master->eeprom_sem);
 
         slave = request->slave;
-        if (slave->online_state == EC_SLAVE_OFFLINE || slave->error_flag) {
-            EC_ERR("Discarding EEPROM data, slave %i not ready.\n",
+        if (slave->online_state == EC_SLAVE_OFFLINE) {
+            EC_ERR("Discarding EEPROM data, slave %i offline.\n",
                     slave->ring_position);
             request->state = EC_REQUEST_FAILURE;
             wake_up(&master->eeprom_queue);
@@ -343,8 +346,8 @@
                     slave->ring_position);
         fsm->eeprom_request = request;
         fsm->eeprom_index = 0;
-        ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->offset,
-                request->words, EC_FSM_SII_NODE);
+        ec_fsm_sii_write(&fsm->fsm_sii, request->slave, request->word_offset,
+                request->data, EC_FSM_SII_NODE);
         fsm->state = ec_fsm_master_state_write_eeprom;
         fsm->state(fsm); // execute immediately
         return 1;
@@ -382,7 +385,7 @@
         request->state = EC_REQUEST_IN_PROGRESS;
         up(&master->sdo_sem);
 
-        slave = request->sdo->slave;
+        slave = request->entry->sdo->slave;
         if (slave->current_state == EC_SLAVE_STATE_INIT ||
                 slave->online_state == EC_SLAVE_OFFLINE ||
                 slave->error_flag) {
@@ -414,6 +417,7 @@
 /*****************************************************************************/
 
 /**
+ * Check for slaves that are not configured and configure them.
  */
 
 int ec_fsm_master_action_configure(
@@ -521,6 +525,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
@@ -945,10 +972,10 @@
     }
 
     fsm->eeprom_index++;
-    if (fsm->eeprom_index < request->size) {
+    if (fsm->eeprom_index < request->word_size) {
         ec_fsm_sii_write(&fsm->fsm_sii, slave,
-                request->offset + fsm->eeprom_index,
-                request->words + fsm->eeprom_index,
+                request->word_offset + fsm->eeprom_index,
+                request->data + fsm->eeprom_index * 2,
                 EC_FSM_SII_NODE);
         ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
         return;
@@ -956,8 +983,8 @@
 
     // finished writing EEPROM
     if (master->debug_level)
-        EC_DBG("Finished writing EEPROM data to slave %i.\n",
-                slave->ring_position);
+        EC_DBG("Finished writing %u words of EEPROM data to slave %u.\n",
+                request->word_size, slave->ring_position);
     request->state = EC_REQUEST_COMPLETE;
     wake_up(&master->eeprom_queue);
 
@@ -1003,6 +1030,27 @@
 /*****************************************************************************/
 
 /**
+ * Scan the PDO mapping of a slave.
+ */
+
+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.
 */