tool/Command.cpp
changeset 1151 1fc1535dec29
parent 1146 f18d124d7fbc
child 1155 bd4e5b544473
--- a/tool/Command.cpp	Fri Jul 25 14:14:47 2008 +0000
+++ b/tool/Command.cpp	Fri Jul 25 14:19:29 2008 +0000
@@ -28,6 +28,20 @@
 	verbosity = v;
 };
 
+/*****************************************************************************/
+
+void Command::setAlias(int a)
+{
+	alias = a;
+};
+
+/*****************************************************************************/
+
+void Command::setPosition(int p)
+{
+	position = p;
+};
+
 /****************************************************************************/
 
 bool Command::matchesSubstr(const string &cmd) const
@@ -78,6 +92,61 @@
     throw CommandException(s);
 }
 
+/*****************************************************************************/
+
+Command::SlaveList Command::selectedSlaves(MasterDevice &m)
+{
+    unsigned int numSlaves = m.slaveCount(), i, aliasIndex;
+    uint16_t lastAlias;
+    ec_ioctl_slave_t slave;
+    SlaveList list;
+
+    if (alias == -1) { // no alias given
+        if (position == -1) { // no alias and position given
+            // all items
+            for (i = 0; i < numSlaves; i++) {
+                m.getSlave(&slave, i);
+                list.push_back(slave);
+            }
+        } else { // no alias, but position given
+            // one item by position
+            m.getSlave(&slave, position);
+            list.push_back(slave);
+        }
+    } else { // alias given
+        if (position == -1) { // alias, but no position given
+            // take all items with a given alias
+            lastAlias = 0;
+            for (i = 0; i < numSlaves; i++) {
+                m.getSlave(&slave, i);
+                if (slave.alias) {
+                    lastAlias = slave.alias;
+                }
+                if (lastAlias == (uint16_t) alias) {
+                    list.push_back(slave);
+                }
+            }
+        } else { // alias and position given
+            lastAlias = 0;
+            aliasIndex = 0;
+            for (i = 0; i < numSlaves; i++) {
+                m.getSlave(&slave, i);
+                if (slave.alias) { // FIXME 'lock' first alias
+                    lastAlias = slave.alias;
+                    aliasIndex = 0;
+                }
+                if (lastAlias == (uint16_t) alias
+                        && aliasIndex == (unsigned int) position) {
+                    list.push_back(slave);
+                }
+                aliasIndex++;
+            }
+        }
+    }
+
+    return list;
+}
+
 /****************************************************************************/
 
 string Command::alStateString(uint8_t state)