diff --git a/TODO b/TODO index b2dc796c1d11b5c4442ab121b908fd4864158a19..a059431c7ae20a86ab2c720119fedb226ff9792d 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 407357bbf2c3bd8c6126c0e815cd2fddd8e9f669..459f7b68531dddd00af06d88fb378a21b8cccd4a 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 dae6b09eb82a0a9414d475a8ed30d272d1c22602..a998a0157e348ae9419b22469e25a01b5f21f7f5 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 5280c47170e4aa0daded990294f238a65eeced9e..133ea5e62f4a64e27fd91ddd49a792e37c9c49e3 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 beb56a1b03d232d71f788fc1de0ddbb7d960ff6f..88ee6c9659a749f11d6c9f270b5c566e57ab27dd 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 &); };