// // Copyright 2014 Ettus Research LLC // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include #include #include using namespace uhd::rfnoc; block_id_t::block_id_t() : _device_no(0), _block_name(""), _block_ctr(0) { } block_id_t::block_id_t(const std::string &block_str) : _device_no(0), _block_name(""), _block_ctr(0) { if (not set(block_str)) { throw uhd::value_error("block_id_t: Invalid block ID string."); } } block_id_t::block_id_t( const size_t device_no, const std::string &block_name, const size_t block_ctr ) : _device_no(device_no), _block_name(block_name), _block_ctr(block_ctr) { if (not is_valid_blockname(block_name)) { throw uhd::value_error("block_id_t: Invalid block name."); } } bool block_id_t::is_valid_blockname(const std::string &block_name) { return boost::regex_match(block_name, boost::regex(VALID_BLOCKNAME_REGEX)); } bool block_id_t::is_valid_block_id(const std::string &block_name) { return boost::regex_match(block_name, boost::regex(VALID_BLOCKID_REGEX)); } std::string block_id_t::to_string() const { return str(boost::format("%d/%s") % get_device_no() % get_local() ); } std::string block_id_t::get_local() const { return str(boost::format("%s_%d") % get_block_name() % get_block_count() ); } uhd::fs_path block_id_t::get_tree_root() const { return str(boost::format("/mboards/%d/xbar/%s") % get_device_no() % get_local() ); } bool block_id_t::match(const std::string &block_str) { boost::cmatch matches; if (not boost::regex_match(block_str.c_str(), matches, boost::regex(VALID_BLOCKID_REGEX))) { return false; } try { return (matches[1] == "" or boost::lexical_cast(matches[1]) == _device_no) and (matches[2] == "" or matches[2] == _block_name) and (matches[3] == "" or boost::lexical_cast(matches[3]) == _block_ctr) and not (matches[1] == "" and matches[2] == "" and matches[3] == ""); } catch (const std::bad_cast &e) { return false; } return false; } bool block_id_t::set(const std::string &new_name) { boost::cmatch matches; if (not boost::regex_match(new_name.c_str(), matches, boost::regex(VALID_BLOCKID_REGEX))) { return false; } if (not (matches[1] == "")) { _device_no = boost::lexical_cast(matches[1]); } if (not (matches[2] == "")) { _block_name = matches[2]; } if (not (matches[3] == "")) { _block_ctr = boost::lexical_cast(matches[3]); } return true; } bool block_id_t::set( const size_t device_no, const std::string &block_name, const size_t block_ctr ) { if (not set_block_name(block_name)) { return false; } set_device_no(device_no); set_block_count(block_ctr); return true; } bool block_id_t::set_block_name(const std::string &block_name) { if (not is_valid_blockname(block_name)) { return false; } _block_name = block_name; return true; }