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