Fixed / improved config selection.
This commit is contained in:
parent
abfc319232
commit
f83d10d66b
111
tool/Command.cpp
111
tool/Command.cpp
|
|
@ -38,6 +38,11 @@ using namespace std;
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef map<uint16_t, ec_ioctl_config_t> AliasMap;
|
||||
typedef map<uint16_t, AliasMap> ConfigMap;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
class MasterIndexParser:
|
||||
public NumberListParser
|
||||
{
|
||||
|
|
@ -85,27 +90,14 @@ class ConfigAliasParser:
|
|||
public NumberListParser
|
||||
{
|
||||
public:
|
||||
ConfigAliasParser(ec_ioctl_master_t &master, MasterDevice &dev):
|
||||
master(master), dev(dev) {}
|
||||
ConfigAliasParser(unsigned int maxAlias):
|
||||
maxAlias(maxAlias) {}
|
||||
|
||||
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;
|
||||
};
|
||||
int getMax() { return maxAlias; };
|
||||
|
||||
private:
|
||||
ec_ioctl_master_t &master;
|
||||
MasterDevice &dev;
|
||||
unsigned int maxAlias;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
|
@ -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):
|
||||
name(name),
|
||||
briefDesc(briefDesc),
|
||||
|
|
@ -293,11 +312,13 @@ Command::MasterIndexList Command::getMasterIndices() const
|
|||
unsigned int Command::getSingleMasterIndex() const
|
||||
{
|
||||
MasterIndexList masterIndices = getMasterIndices();
|
||||
|
||||
if (masterIndices.size() != 1) {
|
||||
stringstream err;
|
||||
err << getName() << " requires to select a single master!";
|
||||
throwInvalidUsageException(err);
|
||||
}
|
||||
|
||||
return masterIndices.front();
|
||||
}
|
||||
|
||||
|
|
@ -316,6 +337,7 @@ Command::SlaveList Command::selectedSlaves(MasterDevice &m)
|
|||
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);
|
||||
|
|
@ -389,50 +411,47 @@ Command::ConfigList Command::selectedConfigs(MasterDevice &m)
|
|||
|
||||
m.getMaster(&master);
|
||||
|
||||
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
|
||||
if (aliases == "-" && positions == "-") { // shortcut
|
||||
for (i = 0; i < master.config_count; i++) {
|
||||
m.getConfig(&config, i);
|
||||
list.push_back(config);
|
||||
}
|
||||
} else { // alias given
|
||||
ConfigAliasParser ap(master, m);
|
||||
} else { // take the long way home...
|
||||
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::const_iterator ai;
|
||||
|
||||
for (ai = aliasList.begin(); ai != aliasList.end(); ai++) {
|
||||
|
||||
// gather configs with that alias
|
||||
map<uint16_t, ec_ioctl_config_t> aliasConfigs;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
ConfigMap::iterator ci = configs.find(*ai);
|
||||
if (ci == configs.end()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
PositionParser pp(maxPos + 1);
|
||||
AliasMap &aliasMap = configs[*ai];
|
||||
AliasPositionParser pp(aliasMap);
|
||||
NumberListParser::List posList = pp.parse(positions.c_str());
|
||||
NumberListParser::List::const_iterator pi;
|
||||
|
||||
for (pi = posList.begin(); pi != posList.end(); pi++) {
|
||||
map<uint16_t, ec_ioctl_config_t>::const_iterator ci;
|
||||
ci = aliasConfigs.find(*pi);
|
||||
AliasMap::const_iterator ci;
|
||||
|
||||
if (ci != aliasConfigs.end()) {
|
||||
ci = aliasMap.find(*pi);
|
||||
if (ci != aliasMap.end()) {
|
||||
list.push_back(ci->second);
|
||||
} else {
|
||||
stringstream err;
|
||||
err << "Warning: Config " << *ai << ":" << *pi
|
||||
<< " does not exist on master " << m.getIndex();
|
||||
throwCommandException(err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue