diff options
| author | Josh Blum <josh@joshknows.com> | 2010-08-18 17:33:09 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-08-18 17:33:09 -0700 | 
| commit | afb22c9d15ab5cfa4b843942f656d9eb978587f7 (patch) | |
| tree | ec8dc78446a68ca32c81185e8bc498f3d57aa8d9 | |
| parent | 8740197dfed997bb235b73ec649edb803d544326 (diff) | |
| download | uhd-afb22c9d15ab5cfa4b843942f656d9eb978587f7.tar.gz uhd-afb22c9d15ab5cfa4b843942f656d9eb978587f7.tar.bz2 uhd-afb22c9d15ab5cfa4b843942f656d9eb978587f7.zip | |
usrp: rethrow validate subdev spec errors with additional info
| -rw-r--r-- | host/lib/usrp/misc_utils.cpp | 65 | 
1 files changed, 36 insertions, 29 deletions
| diff --git a/host/lib/usrp/misc_utils.cpp b/host/lib/usrp/misc_utils.cpp index 46094ba32..a1664d810 100644 --- a/host/lib/usrp/misc_utils.cpp +++ b/host/lib/usrp/misc_utils.cpp @@ -25,6 +25,7 @@  #include <uhd/usrp/codec_props.hpp>  #include <boost/bind.hpp>  #include <boost/foreach.hpp> +#include <boost/format.hpp>  using namespace uhd;  using namespace uhd::usrp; @@ -132,43 +133,49 @@ static void verify_xx_subdev_spec(      wax::obj mboard,      std::string xx_type  ){ -    prop_names_t dboard_names = mboard[dboard_names_prop].as<prop_names_t>(); -    UHD_ASSERT_THROW(dboard_names.size() > 0); //well i hope there is a dboard +    try{ +        prop_names_t dboard_names = mboard[dboard_names_prop].as<prop_names_t>(); +        UHD_ASSERT_THROW(dboard_names.size() > 0); //well i hope there is a dboard -    //the subdevice specification is empty: handle automatic -    if (subdev_spec.empty()){ -        BOOST_FOREACH(const std::string &db_name, dboard_names){ -            wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)]; +        //the subdevice specification is empty: handle automatic +        if (subdev_spec.empty()){ +            BOOST_FOREACH(const std::string &db_name, dboard_names){ +                wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)]; + +                //if the dboard slot is populated, take the first subdevice +                if (dboard[DBOARD_PROP_DBOARD_ID].as<dboard_id_t>() != dboard_id_t::none()){ +                    std::string sd_name = dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>().front(); +                    subdev_spec.push_back(subdev_spec_pair_t(db_name, sd_name)); +                    break; +                } +            } -            //if the dboard slot is populated, take the first subdevice -            if (dboard[DBOARD_PROP_DBOARD_ID].as<dboard_id_t>() != dboard_id_t::none()){ +            //didnt find any populated dboards: add the first subdevice +            if (subdev_spec.empty()){ +                std::string db_name = dboard_names.front(); +                wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)];                  std::string sd_name = dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>().front();                  subdev_spec.push_back(subdev_spec_pair_t(db_name, sd_name)); -                break;              }          } -        //didnt find any populated dboards: add the first subdevice -        if (subdev_spec.empty()){ -            std::string db_name = dboard_names.front(); -            wax::obj dboard = mboard[named_prop_t(dboard_prop, db_name)]; -            std::string sd_name = dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>().front(); -            subdev_spec.push_back(subdev_spec_pair_t(db_name, sd_name)); -        } -    } - -    //sanity check that the dboard/subdevice names exist for this mboard -    BOOST_FOREACH(const subdev_spec_pair_t &pair, subdev_spec){ -        //empty db name means select dboard automatically -        if (pair.db_name.empty()){ -            if (dboard_names.size() != 1) throw std::runtime_error( -                "A daughterboard name must be provided for multi-slot boards: " + subdev_spec.to_string() -            ); -            pair.db_name == dboard_names.front(); +        //sanity check that the dboard/subdevice names exist for this mboard +        BOOST_FOREACH(const subdev_spec_pair_t &pair, subdev_spec){ +            //empty db name means select dboard automatically +            if (pair.db_name.empty()){ +                if (dboard_names.size() != 1) throw std::runtime_error( +                    "A daughterboard name must be provided for multi-slot boards: " + subdev_spec.to_string() +                ); +                pair.db_name == dboard_names.front(); +            } +            uhd::assert_has(dboard_names, pair.db_name, xx_type + " dboard name"); +            wax::obj dboard = mboard[named_prop_t(dboard_prop, pair.db_name)]; +            uhd::assert_has(dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>(), pair.sd_name, xx_type + " subdev name");          } -        uhd::assert_has(dboard_names, pair.db_name, xx_type + " dboard name"); -        wax::obj dboard = mboard[named_prop_t(dboard_prop, pair.db_name)]; -        uhd::assert_has(dboard[DBOARD_PROP_SUBDEV_NAMES].as<prop_names_t>(), pair.sd_name, xx_type + " subdev name"); +    }catch(const std::exception &e){ +        throw std::runtime_error(str(boost::format( +            "Validate %s subdev spec failed: %s\n    %s" +        ) % xx_type % subdev_spec.to_string() % e.what()));      }  } | 
