Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 43 additions & 21 deletions TypeHelpers.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// Copyright (c) 2014-2017 Josh Blum
// 2023 Nicholas Corgan
// SPDX-License-Identifier: GPL-3.0

#pragma once
Expand All @@ -17,33 +18,33 @@
static inline SoapySDR::Kwargs dictToKwargs(const uhd::device_addr_t &addr)
{
SoapySDR::Kwargs kwargs;
const std::vector<std::string> keys = addr.keys();
for (size_t i = 0; i < keys.size(); i++)
for (const auto &key: addr.keys())
{
kwargs[keys[i]] = addr[keys[i]];
kwargs[key] = addr[key];
}
return kwargs;
}

static inline uhd::device_addr_t kwargsToDict(const SoapySDR::Kwargs &kwargs)
{
uhd::device_addr_t addr;
for (SoapySDR::Kwargs::const_iterator it = kwargs.begin(); it != kwargs.end(); ++it)
for (const auto &kwarg: kwargs)
{
addr[it->first] = it->second;
addr[kwarg.first] = kwarg.second;
}

return addr;
}

static inline SoapySDR::RangeList metaRangeToRangeList(const uhd::meta_range_t &metaRange)
{
SoapySDR::RangeList out;
for (size_t i = 0; i < metaRange.size(); i++)
for (const auto &range: metaRange)
{
#ifdef SOAPY_SDR_API_HAS_RANGE_TYPE_STEP
out.push_back(SoapySDR::Range(metaRange[i].start(), metaRange[i].stop(), metaRange[i].step()));
out.emplace_back(range.start(), range.stop(), range.step());
#else
out.push_back(SoapySDR::Range(metaRange[i].start(), metaRange[i].stop()));
out.emplace_back(range.start(), range.stop());
#endif
}
return out;
Expand All @@ -52,15 +53,15 @@ static inline SoapySDR::RangeList metaRangeToRangeList(const uhd::meta_range_t &
static inline uhd::meta_range_t rangeListToMetaRange(const SoapySDR::RangeList &ranges)
{
uhd::meta_range_t out;
for (size_t i = 0; i < ranges.size(); i++)
for (const auto &range: ranges)
{
#ifdef SOAPY_SDR_API_HAS_RANGE_TYPE_STEP
out.push_back(uhd::range_t(ranges[i].minimum(), ranges[i].maximum(), ranges[i].step()));
out.emplace_back(range.minimum(), range.maximum(), range.step());
#else
out.push_back(uhd::range_t(ranges[i].minimum(), ranges[i].maximum()));
out.emplace_back(range.minimum(), range.maximum());
#endif
}
if (out.empty()) out.push_back(uhd::range_t(0.0));
if (out.empty()) out.emplace_back(uhd::range_t(0.0));
return out;
}

Expand All @@ -76,11 +77,11 @@ static inline SoapySDR::Range metaRangeToRange(const uhd::meta_range_t &metaRang
static inline uhd::meta_range_t numberListToMetaRange(const std::vector<double> &nums)
{
uhd::meta_range_t out;
for (size_t i = 0; i < nums.size(); i++)
for(const double num: nums)
{
out.push_back(uhd::range_t(nums[i]));
out.emplace_back(num);
}
if (out.empty()) out.push_back(uhd::range_t(0.0));
if (out.empty()) out.emplace_back(0.0);
return out;
}

Expand All @@ -91,15 +92,15 @@ static inline std::vector<double> metaRangeToNumericList(const uhd::meta_range_t
//in this case, the bounds are in element 0
if (metaRange.size() == 1)
{
out.push_back(metaRange[0].start());
out.push_back(metaRange[0].stop());
out.emplace_back(metaRange[0].start());
out.emplace_back(metaRange[0].stop());
return out;
}

for (size_t i = 0; i < metaRange.size(); i++)
{
//in these cases start == stop
out.push_back(metaRange[i].start());
out.emplace_back(metaRange[i].start());
}
return out;
}
Expand Down Expand Up @@ -135,9 +136,30 @@ static inline uhd::sensor_value_t argInfoToSensor(const SoapySDR::ArgInfo &argIn
{
switch (argInfo.type)
{
case SoapySDR::ArgInfo::BOOL: return uhd::sensor_value_t(argInfo.name, value == "true", argInfo.units, argInfo.units);
case SoapySDR::ArgInfo::INT: return uhd::sensor_value_t(argInfo.name, atoi(value.c_str()), argInfo.units);
case SoapySDR::ArgInfo::FLOAT: return uhd::sensor_value_t(argInfo.name, atof(value.c_str()), argInfo.units);
case SoapySDR::ArgInfo::BOOL:
return uhd::sensor_value_t(
argInfo.name,
SoapySDR::StringToSetting<bool>(value),
SOAPY_SDR_TRUE,
SOAPY_SDR_FALSE
);

// UHD's sensors are limited to an int32_t, but that should be enough for
// most cases.
case SoapySDR::ArgInfo::INT:
return uhd::sensor_value_t(
argInfo.name,
SoapySDR::StringToSetting<signed>(value),
argInfo.units
);

case SoapySDR::ArgInfo::FLOAT:
return uhd::sensor_value_t(
argInfo.name,
SoapySDR::StringToSetting<double>(value),
argInfo.units
);

case SoapySDR::ArgInfo::STRING: return uhd::sensor_value_t(argInfo.name, value, argInfo.units);
}
return uhd::sensor_value_t(argInfo.name, value, argInfo.units);
Expand Down