master/fsm_pdo_assign.c
changeset 1055 2be8918682fa
parent 1050 c6afe1cbfaf7
child 1056 7b656881e771
--- a/master/fsm_pdo_assign.c	Tue Jun 24 10:55:40 2008 +0000
+++ b/master/fsm_pdo_assign.c	Thu Jun 26 13:16:15 2008 +0000
@@ -53,7 +53,7 @@
 void ec_fsm_pdo_assign_state_end(ec_fsm_pdo_assign_t *);
 void ec_fsm_pdo_assign_state_error(ec_fsm_pdo_assign_t *);
 
-void ec_fsm_pdo_assign_next_dir(ec_fsm_pdo_assign_t *);
+void ec_fsm_pdo_assign_next_sync(ec_fsm_pdo_assign_t *);
 
 /*****************************************************************************/
 
@@ -151,46 +151,50 @@
         return;
     }
 
-    fsm->dir = (ec_direction_t) -1; // next is EC_DIR_OUTPUT
-    fsm->num_configured_dirs = 0;
-    ec_fsm_pdo_assign_next_dir(fsm);
-}
-
-/*****************************************************************************/
-
-/** Process Pdo assignment of next direction.
- */
-void ec_fsm_pdo_assign_next_dir(
-        ec_fsm_pdo_assign_t *fsm /**< Pdo assignment state machine. */
-        )
-{
-    fsm->dir++;
-
-    for (; fsm->dir <= EC_DIR_INPUT; fsm->dir++) {
-        fsm->pdos = &fsm->slave->config->pdos[fsm->dir];
+    fsm->sync_index = 0xff; // next is zero
+    fsm->num_configured_syncs = 0;
+    ec_fsm_pdo_assign_next_sync(fsm);
+}
+
+/*****************************************************************************/
+
+/** Process Pdo assignment of next sync manager.
+ */
+void ec_fsm_pdo_assign_next_sync(
+        ec_fsm_pdo_assign_t *fsm /**< Pdo assignment state machine. */
+        )
+{
+    fsm->sync_index++;
+
+    for (; fsm->sync_index < EC_MAX_SYNCS; fsm->sync_index++) {
+        fsm->pdos = &fsm->slave->config->sync_configs[fsm->sync_index].pdos;
         
-        if (!(fsm->sync = ec_slave_get_pdo_sync(fsm->slave, fsm->dir))) {
+        if (!(fsm->sync = ec_slave_get_sync(fsm->slave, fsm->sync_index))) {
             if (!list_empty(&fsm->pdos->list)) {
-                EC_ERR("No sync manager for direction %u!\n", fsm->dir);
+                EC_ERR("Slave %u does not provide a configuration for sync "
+                        "manager %u!\n", fsm->slave->ring_position,
+                        fsm->sync_index);
                 fsm->state = ec_fsm_pdo_assign_state_end;
                 return;
             }
             continue;
         }
 
-        if (fsm->slave->master->debug_level) {
-            EC_DBG("Sync Pdos: ");
-            ec_pdo_list_print(&fsm->sync->pdos);
-            printk("\n");
-            EC_DBG("Config Pdos: ");
-            ec_pdo_list_print(fsm->pdos);
-            printk("\n");
-        }
-
         // check if assignment has to be altered
         if (ec_pdo_list_equal(&fsm->sync->pdos, fsm->pdos))
             continue;
 
+        if (fsm->slave->master->debug_level) {
+            EC_DBG("Pdo assignment of SM%u differs in slave %u:\n",
+                    fsm->sync_index, fsm->slave->ring_position);
+            EC_DBG("Currently assigned Pdos: ");
+            ec_pdo_list_print(&fsm->sync->pdos);
+            printk("\n");
+            EC_DBG("Pdos to assign: ");
+            ec_pdo_list_print(fsm->pdos);
+            printk("\n");
+        }
+
         // Pdo assignment has to be changed. Does the slave support this?
         if (!(fsm->slave->sii.mailbox_protocols & EC_MBOX_COE)
                 || (fsm->slave->sii.has_general
@@ -201,11 +205,11 @@
             return;
         }
 
-        fsm->num_configured_dirs++;
+        fsm->num_configured_syncs++;
 
         if (fsm->slave->master->debug_level) {
             EC_DBG("Changing Pdo assignment for SM%u of slave %u.\n",
-                    fsm->sync->index, fsm->slave->ring_position);
+                    fsm->sync_index, fsm->slave->ring_position);
         }
 
         if (ec_sdo_request_alloc(&fsm->request, 2)) {
@@ -216,10 +220,10 @@
         // set mapped Pdo count to zero
         EC_WRITE_U8(fsm->request.data, 0); // zero Pdos mapped
         fsm->request.data_size = 1;
-        ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync->index, 0);
+        ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
         ecrt_sdo_request_write(&fsm->request);
         if (fsm->slave->master->debug_level)
-            EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync->index);
+            EC_DBG("Setting Pdo count to zero for SM%u.\n", fsm->sync_index);
 
         fsm->state = ec_fsm_pdo_assign_state_zero_count;
         ec_fsm_coe_transfer(fsm->fsm_coe, fsm->slave, &fsm->request);
@@ -227,7 +231,7 @@
         return;
     }
 
-    if (fsm->slave->master->debug_level && !fsm->num_configured_dirs)
+    if (fsm->slave->master->debug_level && !fsm->num_configured_syncs)
         EC_DBG("Pdo assignments of slave %u are already configured"
                 " correctly.\n", fsm->slave->ring_position);
     fsm->state = ec_fsm_pdo_assign_state_end;
@@ -259,7 +263,7 @@
     EC_WRITE_U16(fsm->request.data, fsm->pdo->index);
     fsm->request.data_size = 2;
     ec_sdo_request_address(&fsm->request,
-            0x1C10 + fsm->sync->index, fsm->pdo_count);
+            0x1C10 + fsm->sync_index, fsm->pdo_count);
     ecrt_sdo_request_write(&fsm->request);
     if (fsm->slave->master->debug_level)
         EC_DBG("Assigning Pdo 0x%04X at position %u.\n",
@@ -293,8 +297,8 @@
     if (!(fsm->pdo = ec_fsm_pdo_assign_next_pdo(fsm, &fsm->pdos->list))) {
         if (fsm->slave->master->debug_level)
             EC_DBG("No Pdos to assign for SM%u of slave %u.\n",
-                    fsm->sync->index, fsm->slave->ring_position);
-        ec_fsm_pdo_assign_next_dir(fsm);
+                    fsm->sync_index, fsm->slave->ring_position);
+        ec_fsm_pdo_assign_next_sync(fsm);
         return;
     }
 
@@ -315,7 +319,7 @@
 
     if (!ec_fsm_coe_success(fsm->fsm_coe)) {
         EC_ERR("Failed to map Pdo 0x%04X for SM%u of slave %u.\n",
-                fsm->pdo->index, fsm->sync->index, fsm->slave->ring_position);
+                fsm->pdo->index, fsm->sync_index, fsm->slave->ring_position);
         fsm->state = ec_fsm_pdo_assign_state_error;
         return;
     }
@@ -325,7 +329,7 @@
         // no more Pdos to map. write Pdo count
         EC_WRITE_U8(fsm->request.data, fsm->pdo_count);
         fsm->request.data_size = 1;
-        ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync->index, 0);
+        ec_sdo_request_address(&fsm->request, 0x1C10 + fsm->sync_index, 0);
         ecrt_sdo_request_write(&fsm->request);
         if (fsm->slave->master->debug_level)
             EC_DBG("Setting number of assigned Pdos to %u.\n",
@@ -361,10 +365,10 @@
 
     if (fsm->slave->master->debug_level)
         EC_DBG("Successfully configured Pdo assignment for SM%u of"
-                " slave %u.\n", fsm->sync->index, fsm->slave->ring_position);
-
-    // assignment for this direction finished
-    ec_fsm_pdo_assign_next_dir(fsm);
+                " slave %u.\n", fsm->sync_index, fsm->slave->ring_position);
+
+    // assignment for this sync manager finished
+    ec_fsm_pdo_assign_next_sync(fsm);
 }
 
 /******************************************************************************