From d08690ddb09081d547f463e94e5d9ce8ab3a3d5f Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Mon, 28 Jul 2008 09:12:21 +0000
Subject: [PATCH] Implemented alias and position for configs.

---
 TODO                   |  1 -
 tool/Command.cpp       | 63 ++++++++++++++++++++++++++++++++++++++++++
 tool/Command.h         |  2 ++
 tool/CommandConfig.cpp | 29 +++----------------
 tool/CommandConfig.h   |  2 --
 5 files changed, 69 insertions(+), 28 deletions(-)

diff --git a/TODO b/TODO
index b2dc796c..a059431c 100644
--- a/TODO
+++ b/TODO
@@ -14,7 +14,6 @@ Version 1.4.0:
 * Get original driver for r8169.
 * Race in jiffies frame timeout?
 * ethercat tool:
-    - Implement Alias/Position selection for configs.
     - Update help for --alias and --position.
     - Show Pdos in 'ethercat slave -v'.
     - Accept files from stdin.
diff --git a/tool/Command.cpp b/tool/Command.cpp
index 407357bb..459f7b68 100644
--- a/tool/Command.cpp
+++ b/tool/Command.cpp
@@ -159,6 +159,69 @@ Command::SlaveList Command::selectedSlaves(MasterDevice &m)
     return list;
 }
 
+/*****************************************************************************/
+
+bool operator<(
+        const ec_ioctl_config_t &a,
+        const ec_ioctl_config_t &b
+        )
+{
+    return a.alias < b.alias
+        || (a.alias == b.alias && a.position < b.position);
+}
+
+/*****************************************************************************/
+
+Command::ConfigList Command::selectedConfigs(MasterDevice &m)
+{
+    unsigned int i;
+    int effAlias;
+    ec_ioctl_master_t master;
+    ec_ioctl_config_t config;
+    ConfigList list;
+    stringstream err;
+
+    m.getMaster(&master);
+
+    // Assume alias 0 if only position is given.
+    if (alias == -1 && position != -1) {
+        effAlias = 0;
+    } else {
+        effAlias = alias;
+    }
+
+    if (effAlias == -1) { // no alias given
+        if (position == -1) { // no alias and position given
+            // all items
+            for (i = 0; i < master.config_count; i++) {
+                m.getConfig(&config, i);
+                list.push_back(config);
+            }
+        }
+    } else { // alias given
+        if (position == -1) { // alias, but no position given
+            // take all items with a given alias
+            for (i = 0; i < master.config_count; i++) {
+                m.getConfig(&config, i);
+                if (config.alias == effAlias) {
+                    list.push_back(config);
+                }
+            }
+        } else { // alias and position given
+            for (i = 0; i < master.config_count; i++) {
+                m.getConfig(&config, i);
+                if (config.alias == effAlias && config.position == position) {
+                    list.push_back(config);
+                    break; // there can be at most one matching
+                }
+            }
+        }
+    }
+
+    list.sort();
+    return list;
+}
+
 /****************************************************************************/
 
 string Command::alStateString(uint8_t state)
diff --git a/tool/Command.h b/tool/Command.h
index dae6b09e..a998a015 100644
--- a/tool/Command.h
+++ b/tool/Command.h
@@ -91,6 +91,8 @@ class Command
 
         typedef list<ec_ioctl_slave_t> SlaveList;
         SlaveList selectedSlaves(MasterDevice &);
+        typedef list<ec_ioctl_config_t> ConfigList;
+        ConfigList selectedConfigs(MasterDevice &);
 
         static string alStateString(uint8_t);
 
diff --git a/tool/CommandConfig.cpp b/tool/CommandConfig.cpp
index 5280c471..133ea5e6 100644
--- a/tool/CommandConfig.cpp
+++ b/tool/CommandConfig.cpp
@@ -58,40 +58,19 @@ string CommandConfig::helpString() const
 
 /*****************************************************************************/
 
-bool operator<(
-        const ec_ioctl_config_t &a,
-        const ec_ioctl_config_t &b
-        )
-{
-    return a.alias < b.alias
-        || (a.alias == b.alias && a.position < b.position);
-}
-
-/*****************************************************************************/
-
 /** Lists the bus configuration.
  */
 void CommandConfig::execute(MasterDevice &m, const StringVector &args)
 {
-    ec_ioctl_master_t master;
-    unsigned int i;
-    ec_ioctl_config_t config;
-    ConfigList configList;
+    ConfigList configs;
 
     m.open(MasterDevice::Read);
-    m.getMaster(&master);
-
-    for (i = 0; i < master.config_count; i++) {
-        m.getConfig(&config, i);
-        configList.push_back(config);
-    }
-
-    configList.sort();
+    configs = selectedConfigs(m);
 
     if (getVerbosity() == Verbose) {
-        showDetailedConfigs(m, configList);
+        showDetailedConfigs(m, configs);
     } else {
-        listConfigs(m, configList);
+        listConfigs(m, configs);
     }
 }
 
diff --git a/tool/CommandConfig.h b/tool/CommandConfig.h
index beb56a1b..88ee6c96 100644
--- a/tool/CommandConfig.h
+++ b/tool/CommandConfig.h
@@ -32,8 +32,6 @@ class CommandConfig:
 			string state;
 		};
 
-		typedef list<ec_ioctl_config_t> ConfigList;
-
 		void showDetailedConfigs(MasterDevice &, const ConfigList &);
 		void listConfigs(MasterDevice &m, const ConfigList &);
 };
-- 
GitLab