aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/utils
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2017-11-10 23:32:16 -0800
committerMartin Braun <martin.braun@ettus.com>2018-02-20 16:23:46 -0800
commit9fb055a78a1452547abd490cccce8b804cc3b153 (patch)
treef9885333620cc504ee48a6c39bb22506b20e9898 /host/lib/utils
parenta99e89a689490aa03e2bbd8153b61e394cd55a6e (diff)
downloaduhd-9fb055a78a1452547abd490cccce8b804cc3b153.tar.gz
uhd-9fb055a78a1452547abd490cccce8b804cc3b153.tar.bz2
uhd-9fb055a78a1452547abd490cccce8b804cc3b153.zip
lib: Add 'prefs' API
This defines and reads configuration files that can be used to customize UHD's behaviour. On Unix systems, they default to: /etc/uhd/uhd.conf $APPDATA/.uhd/uhd.conf On Windows systems, it will look in: %ProgramData%/uhd/uhd.conf %AppData%/.uhd/uhd.conf
Diffstat (limited to 'host/lib/utils')
-rw-r--r--host/lib/utils/CMakeLists.txt7
-rw-r--r--host/lib/utils/prefs.cpp101
2 files changed, 108 insertions, 0 deletions
diff --git a/host/lib/utils/CMakeLists.txt b/host/lib/utils/CMakeLists.txt
index 62d1ba090..659c855a1 100644
--- a/host/lib/utils/CMakeLists.txt
+++ b/host/lib/utils/CMakeLists.txt
@@ -155,6 +155,12 @@ SET_SOURCE_FILES_PROPERTIES(
"UHD_PKG_PATH=\"${UHD_PKG_PATH}\";UHD_LIB_DIR=\"${UHD_LIB_DIR}\""
)
+SET_SOURCE_FILES_PROPERTIES(
+ ${CMAKE_CURRENT_SOURCE_DIR}/prefs.cpp
+ PROPERTIES COMPILE_DEFINITIONS
+ "UHD_SYS_CONF_FILE=\"${UHD_SYS_CONF_FILE}\";UHD_USER_CONF_FILE=\"${UHD_USER_CONF_FILE}\""
+)
+
########################################################################
# Append sources
########################################################################
@@ -170,6 +176,7 @@ LIBUHD_APPEND_SOURCES(
${CMAKE_CURRENT_SOURCE_DIR}/paths.cpp
${CMAKE_CURRENT_SOURCE_DIR}/pathslib.cpp
${CMAKE_CURRENT_SOURCE_DIR}/platform.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/prefs.cpp
${CMAKE_CURRENT_SOURCE_DIR}/static.cpp
${CMAKE_CURRENT_SOURCE_DIR}/tasks.cpp
${CMAKE_CURRENT_SOURCE_DIR}/thread.cpp
diff --git a/host/lib/utils/prefs.cpp b/host/lib/utils/prefs.cpp
new file mode 100644
index 000000000..5e5fa40f5
--- /dev/null
+++ b/host/lib/utils/prefs.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright 2017-2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: GPL-3.0+
+//
+
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/paths.hpp>
+#include <uhdlib/utils/prefs.hpp>
+#include <uhdlib/utils/paths.hpp>
+#include <boost/filesystem.hpp>
+#include <cstdlib>
+
+using namespace uhd;
+
+namespace {
+ constexpr char UHD_CONF_FILE_VAR[] = "UHD_CONFIG_FILE";
+
+ inline void _update_conf_file(
+ const std::string& path,
+ const std::string& config_type,
+ config_parser& conf_file
+ ) {
+ if (not path.empty()) {
+ UHD_LOG_TRACE("PREFS", "Trying to load " << path);
+ try {
+ conf_file.read_file(path);
+ UHD_LOG_DEBUG("PREFS",
+ "Loaded " << config_type << " config file " << path);
+ } catch (...) {
+ // nop
+ }
+ }
+ }
+
+ void update_from_key(
+ const std::string& key, const std::string &value,
+ uhd::device_addr_t& user_args
+ ) {
+ if (value.empty()) {
+ return;
+ }
+
+ const std::string key_str = key + "=" + value;
+ for (const auto& key : uhd::prefs::get_uhd_config().options(key_str)) {
+ user_args[key] =
+ uhd::prefs::get_uhd_config().get<std::string>(key_str, key);
+ }
+ }
+}
+
+config_parser& uhd::prefs::get_uhd_config()
+{
+ static config_parser _conf_files{};
+ static bool init_done = false;
+ if (not init_done) {
+ UHD_LOG_TRACE("CONF", "Initializing config file object...");
+ const std::string sys_conf_file = path_expandvars(UHD_SYS_CONF_FILE);
+ _update_conf_file(sys_conf_file, "system", _conf_files);
+ const std::string user_conf_file =
+ (boost::filesystem::path(get_app_path())
+ / std::string(UHD_USER_CONF_FILE)).string();
+ _update_conf_file(user_conf_file, "user", _conf_files);
+ std::string env_conf_file;
+ try { // getenv into std::string can fail
+ if (std::getenv(UHD_CONF_FILE_VAR) != NULL) {
+ env_conf_file = std::string(std::getenv(UHD_CONF_FILE_VAR));
+ }
+ _update_conf_file(env_conf_file, "ENV", _conf_files);
+ } catch (const std::exception &) {
+ // nop
+ }
+ UHD_LOG_TRACE("PREFS", "Done initializing.");
+ }
+
+ return _conf_files;
+}
+
+
+device_addr_t uhd::prefs::get_usrp_args(
+ const uhd::device_addr_t &user_args
+) {
+ device_addr_t usrp_args;
+ const std::vector<std::string> keys_to_update_from = {
+ "type",
+ "product",
+ "serial"
+ };
+
+ for (const auto& key : keys_to_update_from) {
+ update_from_key(key, user_args.get(key, ""), usrp_args);
+ }
+
+ // Finally, copy over the original user args:
+ for (const auto &user_key : user_args.keys()) {
+ usrp_args[user_key] = user_args[user_key];
+ }
+
+ return usrp_args;
+}
+