master/fsm_coe_map.c
changeset 792 3778920f61e4
parent 768 b709149d5bba
child 814 a51f857b1b2d
--- a/master/fsm_coe_map.c	Thu Feb 14 09:18:55 2008 +0000
+++ b/master/fsm_coe_map.c	Tue Feb 19 08:22:20 2008 +0000
@@ -59,8 +59,6 @@
 void ec_fsm_coe_map_action_next_pdo(ec_fsm_coe_map_t *);
 void ec_fsm_coe_map_action_next_pdo_entry(ec_fsm_coe_map_t *);
 
-void ec_fsm_coe_map_clear_pdos(ec_fsm_coe_map_t *);
-
 /*****************************************************************************/
 
 /**
@@ -74,7 +72,7 @@
 {
     fsm->state = NULL;
     fsm->fsm_coe = fsm_coe;
-    INIT_LIST_HEAD(&fsm->pdos);
+    ec_pdo_mapping_init(&fsm->mapping);
 }
 
 /*****************************************************************************/
@@ -85,27 +83,7 @@
 
 void ec_fsm_coe_map_clear(ec_fsm_coe_map_t *fsm /**< finite state machine */)
 {
-    ec_fsm_coe_map_clear_pdos(fsm);
-}
-
-/*****************************************************************************/
-
-/**
- * Clear FSM PDOs.
- */
-
-void ec_fsm_coe_map_clear_pdos(
-        ec_fsm_coe_map_t *fsm /**< finite state machine */
-        )
-{
-    ec_pdo_t *pdo, *next;
-
-    // free all PDOs
-    list_for_each_entry_safe(pdo, next, &fsm->pdos, list) {
-        list_del(&pdo->list);
-        ec_pdo_clear(pdo);
-        kfree(pdo);
-    }
+    ec_pdo_mapping_clear(&fsm->mapping);
 }
 
 /*****************************************************************************/
@@ -188,7 +166,7 @@
             EC_DBG("Reading PDO mapping of sync manager %u of slave %u.\n",
                     fsm->sync_index, slave->ring_position);
 
-        ec_fsm_coe_map_clear_pdos(fsm);
+        ec_pdo_mapping_clear_pdos(&fsm->mapping);
 
         if (!(entry = ec_sdo_get_entry(fsm->sync_sdo, 0))) {
             EC_ERR("SDO 0x%04X has no subindex 0 on slave %u.\n",
@@ -269,15 +247,14 @@
 
     {
         ec_sync_t *sync = fsm->slave->sii_syncs + fsm->sync_index;
-        ec_pdo_t *pdo;
-
-        // exchange sync manager PDO mapping
-        ec_sync_clear_pdos(sync);
-        list_for_each_entry(pdo, &fsm->pdos, list) {
-            ec_sync_add_pdo(sync, pdo);
-        }
+
+        if (ec_pdo_mapping_copy(&sync->mapping, &fsm->mapping)) {
+            fsm->state = ec_fsm_coe_map_state_error;
+            return;
+        }
+        
         sync->mapping_source = EC_SYNC_MAPPING_COE;
-        ec_fsm_coe_map_clear_pdos(fsm);
+        ec_pdo_mapping_clear_pdos(&fsm->mapping);
 
         // next sync manager
         fsm->sync_index++;
@@ -316,8 +293,8 @@
 
         ec_pdo_init(fsm->pdo);
         fsm->pdo->index = EC_READ_U16(fsm->request.data);
-        fsm->pdo->type =
-            ec_sync_get_pdo_type(fsm->slave->sii_syncs + fsm->sync_index);
+        fsm->pdo->dir =
+            ec_sync_direction(fsm->slave->sii_syncs + fsm->sync_index);
 
         if (fsm->slave->master->debug_level)
             EC_DBG("  PDO 0x%04X.\n", fsm->pdo->index);
@@ -331,19 +308,11 @@
             return;
         }
 
-        if (fsm->pdo_sdo->name && strlen(fsm->pdo_sdo->name)) {
-            if (!(fsm->pdo->name = (char *)
-                        kmalloc(strlen(fsm->pdo_sdo->name) + 1, GFP_KERNEL))) {
-                EC_ERR("Failed to allocate PDO name.\n");
-                ec_pdo_clear(fsm->pdo);
-                kfree(fsm->pdo);
-                fsm->state = ec_fsm_coe_map_state_error;
-                return;
-            }
-            memcpy(fsm->pdo->name, fsm->pdo_sdo->name,
-                    strlen(fsm->pdo_sdo->name) + 1);
-        } else {
-            fsm->pdo->name = NULL;
+        if (ec_pdo_set_name(fsm->pdo, fsm->pdo_sdo->name)) {
+            ec_pdo_clear(fsm->pdo);
+            kfree(fsm->pdo);
+            fsm->state = ec_fsm_coe_map_state_error;
+            return;
         }
 
         if (!(entry = ec_sdo_get_entry(fsm->pdo_sdo, 0))) {
@@ -356,7 +325,7 @@
             return;
         }
 
-        list_add_tail(&fsm->pdo->list, &fsm->pdos);
+        list_add_tail(&fsm->pdo->list, &fsm->mapping.pdos);
 
         ec_sdo_request_init_read(&fsm->request, entry);
         fsm->state = ec_fsm_coe_map_state_pdo_entry_count;
@@ -463,28 +432,25 @@
             return;
         }
 
+        ec_pdo_entry_init(pdo_entry);
         pdo_entry->index = pdo_entry_info >> 16;
         pdo_entry->subindex = (pdo_entry_info >> 8) & 0xFF;
         pdo_entry->bit_length = pdo_entry_info & 0xFF;
 
         if (!pdo_entry->index && !pdo_entry->subindex) {
-            char gapname[] = "Gap";
-
             // we have a gap in the PDO, next PDO entry
             if (fsm->slave->master->debug_level) {
                 EC_DBG("    PDO entry gap: %u bit.\n",
                         pdo_entry->bit_length);
             }
 
-            if (!(pdo_entry->name = (char *)
-                        kmalloc(strlen(gapname) + 1, GFP_KERNEL))) {
-                EC_ERR("Failed to allocate GAP entry name.\n");
+            if (ec_pdo_entry_set_name(pdo_entry, "Gap")) {
+                ec_pdo_entry_clear(pdo_entry);
                 kfree(pdo_entry);
                 fsm->state = ec_fsm_coe_map_state_error;
                 return;
             }
 
-            memcpy(pdo_entry->name, gapname, strlen(gapname) + 1);
             list_add_tail(&pdo_entry->list, &fsm->pdo->entries);
             fsm->pdo_subindex++;
             ec_fsm_coe_map_action_next_pdo_entry(fsm);
@@ -494,6 +460,7 @@
         if (!(sdo = ec_slave_get_sdo(fsm->slave, pdo_entry->index))) {
             EC_ERR("Slave %u has no SDO 0x%04X.\n",
                     fsm->slave->ring_position, pdo_entry->index);
+            ec_pdo_entry_clear(pdo_entry);
             kfree(pdo_entry);
             fsm->state = ec_fsm_coe_map_state_error;
             return;
@@ -503,27 +470,22 @@
             EC_ERR("Slave %u has no SDO entry 0x%04X:%u.\n",
                     fsm->slave->ring_position, pdo_entry->index,
                     pdo_entry->subindex);
+            ec_pdo_entry_clear(pdo_entry);
             kfree(pdo_entry);
             fsm->state = ec_fsm_coe_map_state_error;
             return;
         }
 
-        if (entry->description && strlen(entry->description)) {
-            if (!(pdo_entry->name = (char *)
-                        kmalloc(strlen(entry->description) + 1, GFP_KERNEL))) {
-                EC_ERR("Failed to allocate PDO entry name.\n");
-                kfree(pdo_entry);
-                fsm->state = ec_fsm_coe_map_state_error;
-                return;
-            }
-            memcpy(pdo_entry->name, entry->description, strlen(entry->description) + 1);
-        } else {
-            pdo_entry->name = NULL;
+        if (ec_pdo_entry_set_name(pdo_entry, entry->description)) {
+            ec_pdo_entry_clear(pdo_entry);
+            kfree(pdo_entry);
+            fsm->state = ec_fsm_coe_map_state_error;
+            return;
         }
 
         if (fsm->slave->master->debug_level) {
-            EC_DBG("    PDO entry 0x%04X \"%s\" (%u bit).\n",
-                    pdo_entry->index, pdo_entry->name ? pdo_entry->name : "???",
+            EC_DBG("    PDO entry 0x%04X \"%s\" (%u bit).\n", pdo_entry->index,
+                    pdo_entry->name ? pdo_entry->name : "???",
                     pdo_entry->bit_length);
         }