Skip to content
Snippets Groups Projects
Commit 47e5e9d6 authored by Florian Pose's avatar Florian Pose
Browse files

Fixed / improved config selection.

parent f73d947c
No related branches found
No related tags found
No related merge requests found
...@@ -38,6 +38,11 @@ using namespace std; ...@@ -38,6 +38,11 @@ using namespace std;
/*****************************************************************************/ /*****************************************************************************/
typedef map<uint16_t, ec_ioctl_config_t> AliasMap;
typedef map<uint16_t, AliasMap> ConfigMap;
/*****************************************************************************/
class MasterIndexParser: class MasterIndexParser:
public NumberListParser public NumberListParser
{ {
...@@ -85,27 +90,14 @@ class ConfigAliasParser: ...@@ -85,27 +90,14 @@ class ConfigAliasParser:
public NumberListParser public NumberListParser
{ {
public: public:
ConfigAliasParser(ec_ioctl_master_t &master, MasterDevice &dev): ConfigAliasParser(unsigned int maxAlias):
master(master), dev(dev) {} maxAlias(maxAlias) {}
protected: protected:
int getMax() { int getMax() { return maxAlias; };
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: private:
ec_ioctl_master_t &master; unsigned int maxAlias;
MasterDevice &dev;
}; };
/*****************************************************************************/ /*****************************************************************************/
...@@ -128,6 +120,33 @@ class PositionParser: ...@@ -128,6 +120,33 @@ class PositionParser:
/*****************************************************************************/ /*****************************************************************************/
class AliasPositionParser:
public NumberListParser
{
public:
AliasPositionParser(const AliasMap &aliasMap):
aliasMap(aliasMap) {}
protected:
int getMax() {
AliasMap::const_iterator i;
int maxPos = -1;
for (i = aliasMap.begin(); i != aliasMap.end(); i++) {
if (i->first > maxPos) {
maxPos = i->first;
}
}
return maxPos;
};
private:
const AliasMap &aliasMap;
};
/*****************************************************************************/
Command::Command(const string &name, const string &briefDesc): Command::Command(const string &name, const string &briefDesc):
name(name), name(name),
briefDesc(briefDesc), briefDesc(briefDesc),
...@@ -293,11 +312,13 @@ Command::MasterIndexList Command::getMasterIndices() const ...@@ -293,11 +312,13 @@ Command::MasterIndexList Command::getMasterIndices() const
unsigned int Command::getSingleMasterIndex() const unsigned int Command::getSingleMasterIndex() const
{ {
MasterIndexList masterIndices = getMasterIndices(); MasterIndexList masterIndices = getMasterIndices();
if (masterIndices.size() != 1) { if (masterIndices.size() != 1) {
stringstream err; stringstream err;
err << getName() << " requires to select a single master!"; err << getName() << " requires to select a single master!";
throwInvalidUsageException(err); throwInvalidUsageException(err);
} }
return masterIndices.front(); return masterIndices.front();
} }
...@@ -316,6 +337,7 @@ Command::SlaveList Command::selectedSlaves(MasterDevice &m) ...@@ -316,6 +337,7 @@ Command::SlaveList Command::selectedSlaves(MasterDevice &m)
PositionParser pp(master.slave_count); PositionParser pp(master.slave_count);
NumberListParser::List posList = pp.parse(positions.c_str()); NumberListParser::List posList = pp.parse(positions.c_str());
NumberListParser::List::const_iterator pi; NumberListParser::List::const_iterator pi;
for (pi = posList.begin(); pi != posList.end(); pi++) { for (pi = posList.begin(); pi != posList.end(); pi++) {
m.getSlave(&slave, *pi); m.getSlave(&slave, *pi);
list.push_back(slave); list.push_back(slave);
...@@ -389,50 +411,47 @@ Command::ConfigList Command::selectedConfigs(MasterDevice &m) ...@@ -389,50 +411,47 @@ Command::ConfigList Command::selectedConfigs(MasterDevice &m)
m.getMaster(&master); m.getMaster(&master);
if (aliases == "-") { // no alias given if (aliases == "-" && positions == "-") { // shortcut
PositionParser pp(master.config_count); for (i = 0; i < master.config_count; i++) {
NumberListParser::List posList = pp.parse(positions.c_str()); m.getConfig(&config, i);
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); list.push_back(config);
} }
} else { // alias given } else { // take the long way home...
ConfigAliasParser ap(master, m); ConfigMap configs;
uint16_t maxAlias = 0;
// fill cascaded map structure with all configs
for (i = 0; i < master.config_count; i++) {
m.getConfig(&config, i);
AliasMap &aliasMap = configs[config.alias];
aliasMap[config.position] = config;
if (config.alias > maxAlias) {
maxAlias = config.alias;
}
}
ConfigAliasParser ap(maxAlias);
NumberListParser::List aliasList = ap.parse(aliases.c_str()); NumberListParser::List aliasList = ap.parse(aliases.c_str());
NumberListParser::List::const_iterator ai; NumberListParser::List::const_iterator ai;
for (ai = aliasList.begin(); ai != aliasList.end(); ai++) { for (ai = aliasList.begin(); ai != aliasList.end(); ai++) {
// gather configs with that alias ConfigMap::iterator ci = configs.find(*ai);
map<uint16_t, ec_ioctl_config_t> aliasConfigs; if (ci == configs.end()) {
continue;
int maxPos = -1;
for (i = 0; i < master.config_count; i++) {
m.getConfig(&config, i);
if (config.alias == *ai) {
aliasConfigs[config.position] = config;
if (config.position > maxPos) {
maxPos = config.position;
}
}
} }
PositionParser pp(maxPos + 1); AliasMap &aliasMap = configs[*ai];
AliasPositionParser pp(aliasMap);
NumberListParser::List posList = pp.parse(positions.c_str()); NumberListParser::List posList = pp.parse(positions.c_str());
NumberListParser::List::const_iterator pi; NumberListParser::List::const_iterator pi;
for (pi = posList.begin(); pi != posList.end(); pi++) { for (pi = posList.begin(); pi != posList.end(); pi++) {
map<uint16_t, ec_ioctl_config_t>::const_iterator ci; AliasMap::const_iterator ci;
ci = aliasConfigs.find(*pi);
if (ci != aliasConfigs.end()) { ci = aliasMap.find(*pi);
if (ci != aliasMap.end()) {
list.push_back(ci->second); list.push_back(ci->second);
} else {
stringstream err;
err << "Warning: Config " << *ai << ":" << *pi
<< " does not exist on master " << m.getIndex();
throwCommandException(err);
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment