master/slave.c
changeset 298 d491d1f84ebc
parent 296 967aaacf9b20
child 302 ad630f38cca1
--- a/master/slave.c	Mon Jul 17 12:58:47 2006 +0000
+++ b/master/slave.c	Mon Jul 17 13:01:38 2006 +0000
@@ -1494,6 +1494,37 @@
     return size;
 }
 
+/*****************************************************************************/
+
+/**
+   Calculates the size of a sync manager by evaluating PDO sizes.
+   \return sync manager size
+*/
+
+uint16_t ec_slave_calc_eeprom_sync_size(const ec_slave_t *slave,
+                                        /**< EtherCAT slave */
+                                        const ec_eeprom_sync_t *sync
+                                        /**< sync manager */
+                                        )
+{
+    ec_eeprom_pdo_t *pdo;
+    ec_eeprom_pdo_entry_t *pdo_entry;
+    uint16_t size;
+
+    if (sync->length) return sync->length;
+
+    size = 0;
+    list_for_each_entry(pdo, &slave->eeprom_pdos, list) {
+        if (pdo->sync_manager != sync->index) continue;
+
+        list_for_each_entry(pdo_entry, &pdo->entries, list) {
+            size += pdo_entry->bit_length / 8;
+        }
+    }
+
+    return size;
+}
+
 /******************************************************************************
  *  Realtime interface
  *****************************************************************************/