diff -r 9327c261056f -r 87de63b19e4c tool/Command.cpp --- a/tool/Command.cpp Tue Sep 21 14:20:23 2010 +0200 +++ b/tool/Command.cpp Tue Dec 14 21:58:53 2010 +0100 @@ -29,6 +29,9 @@ * ****************************************************************************/ +#include +using namespace std; + #include "Command.h" #include "MasterDevice.h" #include "NumberListParser.h" @@ -38,13 +41,89 @@ class MasterIndexParser: public NumberListParser { - unsigned int getMax() - { - MasterDevice dev; - dev.setIndex(0U); - dev.open(MasterDevice::Read); - return dev.getMasterCount() - 1; - }; + protected: + int getMax() { + MasterDevice dev; + dev.setIndex(0U); + dev.open(MasterDevice::Read); + return (int) dev.getMasterCount() - 1; + }; +}; + +/*****************************************************************************/ + +class SlaveAliasParser: + public NumberListParser +{ + public: + SlaveAliasParser(ec_ioctl_master_t &master, MasterDevice &dev): + master(master), dev(dev) {} + + protected: + int getMax() { + unsigned int i; + + uint16_t maxAlias = 0; + for (i = 0; i < master.slave_count; i++) { + ec_ioctl_slave_t slave; + dev.getSlave(&slave, i); + if (slave.alias > maxAlias) { + maxAlias = slave.alias; + } + } + return maxAlias ? maxAlias : -1; + }; + + private: + ec_ioctl_master_t &master; + MasterDevice &dev; +}; + +/*****************************************************************************/ + +class ConfigAliasParser: + public NumberListParser +{ + public: + ConfigAliasParser(ec_ioctl_master_t &master, MasterDevice &dev): + master(master), dev(dev) {} + + protected: + int getMax() { + unsigned int i; + + uint16_t maxAlias = 0; + for (i = 0; i < master.config_count; i++) { + ec_ioctl_config_t config; + dev.getConfig(&config, i); + if (config.alias > maxAlias) { + maxAlias = config.alias; + } + } + return maxAlias ? maxAlias : -1; + }; + + private: + ec_ioctl_master_t &master; + MasterDevice &dev; +}; + +/*****************************************************************************/ + +class PositionParser: + public NumberListParser +{ + public: + PositionParser(unsigned int count): + count(count) {} + + protected: + int getMax() { + return count - 1; + }; + + private: + const unsigned int count; }; /*****************************************************************************/ @@ -78,23 +157,23 @@ /*****************************************************************************/ -void Command::setAlias(int a) -{ - alias = a; -}; - -/*****************************************************************************/ - -void Command::setPosition(int p) -{ - position = p; -}; - -/*****************************************************************************/ - -void Command::setDomain(int d) -{ - domain = d; +void Command::setAliases(const string &a) +{ + aliases = a; +}; + +/*****************************************************************************/ + +void Command::setPositions(const string &p) +{ + positions = p; +}; + +/*****************************************************************************/ + +void Command::setDomains(const string &d) +{ + domains = d; }; /*****************************************************************************/ @@ -227,51 +306,59 @@ Command::SlaveList Command::selectedSlaves(MasterDevice &m) { ec_ioctl_master_t master; - unsigned int i, aliasIndex; - uint16_t lastAlias; + unsigned int i; ec_ioctl_slave_t slave; SlaveList list; m.getMaster(&master); - if (alias == -1) { // no alias given - if (position == -1) { // no alias and position given - // all items - for (i = 0; i < master.slave_count; i++) { - m.getSlave(&slave, i); - list.push_back(slave); - } - } else { // no alias, but position given - // one item by position - m.getSlave(&slave, position); + if (aliases == "-") { // no alias given + PositionParser pp(master.slave_count); + NumberListParser::List posList = pp.parse(positions.c_str()); + NumberListParser::List::const_iterator pi; + for (pi = posList.begin(); pi != posList.end(); pi++) { + m.getSlave(&slave, *pi); list.push_back(slave); } - } else { // alias given - if (position == -1) { // alias, but no position given - // take all items with a given alias - lastAlias = 0; + } else { // aliases given + SlaveAliasParser ap(master, m); + NumberListParser::List aliasList = ap.parse(aliases.c_str()); + NumberListParser::List::const_iterator ai; + + for (ai = aliasList.begin(); ai != aliasList.end(); ai++) { + + // gather slaves with that alias (and following) + uint16_t lastAlias = 0; + vector aliasSlaves; + for (i = 0; i < master.slave_count; i++) { m.getSlave(&slave, i); if (slave.alias) { + if (lastAlias && lastAlias == *ai && slave.alias != *ai) { + // ignore multiple ocurrences of the same alias to + // assure consistency for the position argument + break; + } 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 < master.slave_count; i++) { - m.getSlave(&slave, i); - if (slave.alias && slave.alias == (uint16_t) alias) { - lastAlias = slave.alias; - aliasIndex = 0; - } - if (lastAlias && aliasIndex == (unsigned int) position) { - list.push_back(slave); - } - aliasIndex++; + if (lastAlias == *ai) { + aliasSlaves.push_back(slave); + } + } + + PositionParser pp(aliasSlaves.size()); + NumberListParser::List posList = pp.parse(positions.c_str()); + NumberListParser::List::const_iterator pi; + + for (pi = posList.begin(); pi != posList.end(); pi++) { + if (*pi < aliasSlaves.size()) { + list.push_back(aliasSlaves[*pi]); + } else { + stringstream err; + err << "Warning: Slave " << *ai << ":" << *pi + << " does not exist on master " << m.getIndex(); + throwCommandException(err); + } } } } @@ -302,37 +389,50 @@ m.getMaster(&master); - if (alias == -1) { // no alias given - if (position == -1) { // no alias and position given - // all items + if (aliases == "-") { // no alias given + PositionParser pp(master.config_count); + NumberListParser::List posList = pp.parse(positions.c_str()); + NumberListParser::List::const_iterator pi; + for (pi = posList.begin(); pi != posList.end(); pi++) { + m.getConfig(&config, *pi); // FIXME use sorted list + list.push_back(config); + } + } else { // alias given + ConfigAliasParser ap(master, m); + NumberListParser::List aliasList = ap.parse(aliases.c_str()); + NumberListParser::List::const_iterator ai; + + for (ai = aliasList.begin(); ai != aliasList.end(); ai++) { + + // gather configs with that alias + map aliasConfigs; + + int maxPos = -1; for (i = 0; i < master.config_count; i++) { m.getConfig(&config, i); - list.push_back(config); - } - } else { // no alias, but position given - for (i = 0; i < master.config_count; i++) { - m.getConfig(&config, i); - if (!config.alias && config.position == position) { - list.push_back(config); - break; // there can be at most one matching - } - } - } - } 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 == alias) { - list.push_back(config); - } - } - } else { // alias and position given - for (i = 0; i < master.config_count; i++) { - m.getConfig(&config, i); - if (config.alias == alias && config.position == position) { - list.push_back(config); - break; // there can be at most one matching + if (config.alias == *ai) { + aliasConfigs[config.position] = config; + if (config.position > maxPos) { + maxPos = config.position; + } + } + } + + PositionParser pp(maxPos + 1); + NumberListParser::List posList = pp.parse(positions.c_str()); + NumberListParser::List::const_iterator pi; + + for (pi = posList.begin(); pi != posList.end(); pi++) { + map::const_iterator ci; + ci = aliasConfigs.find(*pi); + + if (ci != aliasConfigs.end()) { + list.push_back(ci->second); + } else { + stringstream err; + err << "Warning: Config " << *ai << ":" << *pi + << " does not exist on master " << m.getIndex(); + throwCommandException(err); } } } @@ -346,21 +446,18 @@ Command::DomainList Command::selectedDomains(MasterDevice &m) { - ec_ioctl_domain_t d; + ec_ioctl_master_t master; DomainList list; - if (domain == -1) { - ec_ioctl_master_t master; - unsigned int i; - - m.getMaster(&master); - - for (i = 0; i < master.domain_count; i++) { - m.getDomain(&d, i); - list.push_back(d); - } - } else { - m.getDomain(&d, domain); + m.getMaster(&master); + + PositionParser pp(master.domain_count); + NumberListParser::List domList = pp.parse(domains.c_str()); + NumberListParser::List::const_iterator di; + + for (di = domList.begin(); di != domList.end(); di++) { + ec_ioctl_domain_t d; + m.getDomain(&d, *di); list.push_back(d); }