tool/Command.cpp
changeset 2013 0aea9df5fa21
parent 2010 87de63b19e4c
child 2014 1d2111370ad5
equal deleted inserted replaced
2012:ee4782738e30 2013:0aea9df5fa21
    33 using namespace std;
    33 using namespace std;
    34 
    34 
    35 #include "Command.h"
    35 #include "Command.h"
    36 #include "MasterDevice.h"
    36 #include "MasterDevice.h"
    37 #include "NumberListParser.h"
    37 #include "NumberListParser.h"
       
    38 
       
    39 /*****************************************************************************/
       
    40 
       
    41 typedef map<uint16_t, ec_ioctl_config_t> AliasMap;
       
    42 typedef map<uint16_t, AliasMap> ConfigMap;
    38 
    43 
    39 /*****************************************************************************/
    44 /*****************************************************************************/
    40 
    45 
    41 class MasterIndexParser:
    46 class MasterIndexParser:
    42     public NumberListParser
    47     public NumberListParser
    83 
    88 
    84 class ConfigAliasParser:
    89 class ConfigAliasParser:
    85     public NumberListParser
    90     public NumberListParser
    86 {
    91 {
    87     public:
    92     public:
    88         ConfigAliasParser(ec_ioctl_master_t &master, MasterDevice &dev):
    93         ConfigAliasParser(unsigned int maxAlias):
    89             master(master), dev(dev) {}
    94             maxAlias(maxAlias) {}
    90 
    95 
    91     protected:
    96     protected:
    92         int getMax() {
    97         int getMax() { return maxAlias; };
    93             unsigned int i;
       
    94 
       
    95             uint16_t maxAlias = 0;
       
    96             for (i = 0; i < master.config_count; i++) {
       
    97                 ec_ioctl_config_t config;
       
    98                 dev.getConfig(&config, i);
       
    99                 if (config.alias > maxAlias) {
       
   100                     maxAlias = config.alias;
       
   101                 }
       
   102             }
       
   103             return maxAlias ? maxAlias : -1;
       
   104         };
       
   105 
    98 
   106     private:
    99     private:
   107         ec_ioctl_master_t &master;
   100         unsigned int maxAlias;
   108         MasterDevice &dev;
       
   109 };
   101 };
   110 
   102 
   111 /*****************************************************************************/
   103 /*****************************************************************************/
   112 
   104 
   113 class PositionParser:
   105 class PositionParser:
   122             return count - 1;
   114             return count - 1;
   123         };
   115         };
   124 
   116 
   125     private:
   117     private:
   126         const unsigned int count;
   118         const unsigned int count;
       
   119 };
       
   120 
       
   121 /*****************************************************************************/
       
   122 
       
   123 class AliasPositionParser:
       
   124     public NumberListParser
       
   125 {
       
   126     public:
       
   127         AliasPositionParser(const AliasMap &aliasMap):
       
   128             aliasMap(aliasMap) {}
       
   129 
       
   130     protected:
       
   131         int getMax() {
       
   132             AliasMap::const_iterator i;
       
   133             int maxPos = -1;
       
   134 
       
   135             for (i = aliasMap.begin(); i != aliasMap.end(); i++) {
       
   136                 if (i->first > maxPos) {
       
   137                     maxPos = i->first;
       
   138                 }
       
   139             }
       
   140 
       
   141             return maxPos;
       
   142         };
       
   143 
       
   144     private:
       
   145         const AliasMap &aliasMap;
   127 };
   146 };
   128 
   147 
   129 /*****************************************************************************/
   148 /*****************************************************************************/
   130 
   149 
   131 Command::Command(const string &name, const string &briefDesc):
   150 Command::Command(const string &name, const string &briefDesc):
   291 /*****************************************************************************/
   310 /*****************************************************************************/
   292 
   311 
   293 unsigned int Command::getSingleMasterIndex() const
   312 unsigned int Command::getSingleMasterIndex() const
   294 {
   313 {
   295     MasterIndexList masterIndices = getMasterIndices();
   314     MasterIndexList masterIndices = getMasterIndices();
       
   315 
   296     if (masterIndices.size() != 1) {
   316     if (masterIndices.size() != 1) {
   297         stringstream err;
   317         stringstream err;
   298         err << getName() << " requires to select a single master!";
   318         err << getName() << " requires to select a single master!";
   299         throwInvalidUsageException(err);
   319         throwInvalidUsageException(err);
   300     }
   320     }
       
   321 
   301     return masterIndices.front();
   322     return masterIndices.front();
   302 }
   323 }
   303 
   324 
   304 /*****************************************************************************/
   325 /*****************************************************************************/
   305 
   326 
   314 
   335 
   315     if (aliases == "-") { // no alias given
   336     if (aliases == "-") { // no alias given
   316         PositionParser pp(master.slave_count);
   337         PositionParser pp(master.slave_count);
   317         NumberListParser::List posList = pp.parse(positions.c_str());
   338         NumberListParser::List posList = pp.parse(positions.c_str());
   318         NumberListParser::List::const_iterator pi;
   339         NumberListParser::List::const_iterator pi;
       
   340 
   319         for (pi = posList.begin(); pi != posList.end(); pi++) {
   341         for (pi = posList.begin(); pi != posList.end(); pi++) {
   320             m.getSlave(&slave, *pi);
   342             m.getSlave(&slave, *pi);
   321             list.push_back(slave);
   343             list.push_back(slave);
   322         }
   344         }
   323     } else { // aliases given
   345     } else { // aliases given
   387     ConfigList list;
   409     ConfigList list;
   388     stringstream err;
   410     stringstream err;
   389 
   411 
   390     m.getMaster(&master);
   412     m.getMaster(&master);
   391 
   413 
   392     if (aliases == "-") { // no alias given
   414     if (aliases == "-" && positions == "-") { // shortcut
   393         PositionParser pp(master.config_count);
   415         for (i = 0; i < master.config_count; i++) {
   394         NumberListParser::List posList = pp.parse(positions.c_str());
   416             m.getConfig(&config, i);
   395         NumberListParser::List::const_iterator pi;
       
   396         for (pi = posList.begin(); pi != posList.end(); pi++) {
       
   397             m.getConfig(&config, *pi); // FIXME use sorted list
       
   398             list.push_back(config);
   417             list.push_back(config);
   399         }
   418         }
   400     } else { // alias given
   419     } else { // take the long way home...
   401         ConfigAliasParser ap(master, m);
   420         ConfigMap configs;
       
   421         uint16_t maxAlias = 0;
       
   422 
       
   423         // fill cascaded map structure with all configs
       
   424         for (i = 0; i < master.config_count; i++) {
       
   425             m.getConfig(&config, i);
       
   426             AliasMap &aliasMap = configs[config.alias];
       
   427             aliasMap[config.position] = config;
       
   428             if (config.alias > maxAlias) {
       
   429                 maxAlias = config.alias;
       
   430             }
       
   431         }
       
   432 
       
   433         ConfigAliasParser ap(maxAlias);
   402         NumberListParser::List aliasList = ap.parse(aliases.c_str());
   434         NumberListParser::List aliasList = ap.parse(aliases.c_str());
   403         NumberListParser::List::const_iterator ai;
   435         NumberListParser::List::const_iterator ai;
   404 
   436 
   405         for (ai = aliasList.begin(); ai != aliasList.end(); ai++) {
   437         for (ai = aliasList.begin(); ai != aliasList.end(); ai++) {
   406 
   438 
   407             // gather configs with that alias
   439             ConfigMap::iterator ci = configs.find(*ai);
   408             map<uint16_t, ec_ioctl_config_t> aliasConfigs;
   440             if (ci == configs.end()) {
   409 
   441                 continue;
   410             int maxPos = -1;
   442             }
   411             for (i = 0; i < master.config_count; i++) {
   443 
   412                 m.getConfig(&config, i);
   444             AliasMap &aliasMap = configs[*ai];
   413                 if (config.alias == *ai) {
   445             AliasPositionParser pp(aliasMap);
   414                     aliasConfigs[config.position] = config;
       
   415                     if (config.position > maxPos) {
       
   416                         maxPos = config.position;
       
   417                     }
       
   418                 }
       
   419             }
       
   420 
       
   421             PositionParser pp(maxPos + 1);
       
   422             NumberListParser::List posList = pp.parse(positions.c_str());
   446             NumberListParser::List posList = pp.parse(positions.c_str());
   423             NumberListParser::List::const_iterator pi;
   447             NumberListParser::List::const_iterator pi;
   424 
   448 
   425             for (pi = posList.begin(); pi != posList.end(); pi++) {
   449             for (pi = posList.begin(); pi != posList.end(); pi++) {
   426                 map<uint16_t, ec_ioctl_config_t>::const_iterator ci;
   450                 AliasMap::const_iterator ci;
   427                 ci = aliasConfigs.find(*pi);
   451 
   428 
   452                 ci = aliasMap.find(*pi);
   429                 if (ci != aliasConfigs.end()) {
   453                 if (ci != aliasMap.end()) {
   430                     list.push_back(ci->second);
   454                     list.push_back(ci->second);
   431                 } else { 
       
   432                     stringstream err;
       
   433                     err << "Warning: Config " << *ai << ":" << *pi
       
   434                         << " does not exist on master " << m.getIndex();
       
   435                     throwCommandException(err);
       
   436                 }
   455                 }
   437             }
   456             }
   438         }
   457         }
   439     }
   458     }
   440 
   459