aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/convert
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/convert')
-rw-r--r--host/lib/convert/convert_fc32_item32.cpp2
-rw-r--r--host/lib/convert/convert_impl.cpp19
-rw-r--r--host/lib/convert/convert_pack_sc12.cpp93
-rw-r--r--host/lib/convert/convert_unpack_sc12.cpp52
4 files changed, 126 insertions, 40 deletions
diff --git a/host/lib/convert/convert_fc32_item32.cpp b/host/lib/convert/convert_fc32_item32.cpp
index 4a188780a..38f71a62b 100644
--- a/host/lib/convert/convert_fc32_item32.cpp
+++ b/host/lib/convert/convert_fc32_item32.cpp
@@ -17,7 +17,7 @@
#include "convert_common.hpp"
#include <uhd/utils/byteswap.hpp>
-#include <uhd/utils/msg.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/math/special_functions/round.hpp>
#include <vector>
diff --git a/host/lib/convert/convert_impl.cpp b/host/lib/convert/convert_impl.cpp
index d624bf970..33f88d70b 100644
--- a/host/lib/convert/convert_impl.cpp
+++ b/host/lib/convert/convert_impl.cpp
@@ -22,7 +22,6 @@
#include <uhd/exception.hpp>
#include <stdint.h>
#include <boost/format.hpp>
-#include <boost/foreach.hpp>
#include <complex>
using namespace uhd;
@@ -81,10 +80,7 @@ void uhd::convert::register_converter(
get_table()[id][prio] = fcn;
//----------------------------------------------------------------//
- UHD_LOGV(always) << "register_converter: " << id.to_pp_string() << std::endl
- << " prio: " << prio << std::endl
- << std::endl
- ;
+ UHD_LOG_TRACE("CONVERT", boost::format("register_converter: %s prio: %s") % id.to_string() % prio)
//----------------------------------------------------------------//
}
@@ -100,12 +96,11 @@ convert::function_type convert::get_converter(
//find a matching priority
priority_type best_prio = -1;
- BOOST_FOREACH(priority_type prio_i, get_table()[id].keys()){
+ for(priority_type prio_i: get_table()[id].keys()){
if (prio_i == prio) {
//----------------------------------------------------------------//
- UHD_LOGV(always) << "get_converter: For converter ID: " << id.to_pp_string() << std::endl
- << "Using prio: " << prio << std::endl
- << std::endl
+ UHD_LOGGER_DEBUG("CONVERT") << "get_converter: For converter ID: " << id.to_pp_string()
+ << " Using prio: " << prio;
;
//----------------------------------------------------------------//
return get_table()[id][prio];
@@ -118,10 +113,8 @@ convert::function_type convert::get_converter(
"Cannot find a conversion routine [with prio] for " + id.to_pp_string());
//----------------------------------------------------------------//
- UHD_LOGV(always) << "get_converter: For converter ID: " << id.to_pp_string() << std::endl
- << "Using prio: " << best_prio << std::endl
- << std::endl
- ;
+ UHD_LOGGER_DEBUG("CONVERT") << "get_converter: For converter ID: " << id.to_pp_string()
+ << " Using prio: " << best_prio;
//----------------------------------------------------------------//
//otherwise, return best prio
diff --git a/host/lib/convert/convert_pack_sc12.cpp b/host/lib/convert/convert_pack_sc12.cpp
index fd32fc95f..2e45e19f5 100644
--- a/host/lib/convert/convert_pack_sc12.cpp
+++ b/host/lib/convert/convert_pack_sc12.cpp
@@ -17,9 +17,10 @@
#include "convert_common.hpp"
#include <uhd/utils/byteswap.hpp>
-#include <uhd/utils/msg.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/math/special_functions/round.hpp>
#include <vector>
+#include <type_traits>
using namespace uhd::convert;
@@ -59,6 +60,17 @@ enum item32_sc12_3x_enable {
* |_ _|_ _ _4_ _ _| 2
* 31 0
*/
+template <towire32_type towire>
+inline void pack(item32_sc12_3x &output, int enable, const int32_t i[4], const int32_t q[4])
+{
+ if (enable & CONVERT12_LINE0)
+ output.line0 = towire(i[0] << 20 | q[0] << 8 | i[1] >> 4);
+ if (enable & CONVERT12_LINE1)
+ output.line1 = towire(i[1] << 28 | q[1] << 16 | i[2] << 4 | q[2] >> 8);
+ if (enable & CONVERT12_LINE2)
+ output.line2 = towire(q[2] << 24 | i[3] << 12 | q[3]);
+}
+
template <typename type, towire32_type towire>
void convert_star_4_to_sc12_item32_3
(
@@ -68,31 +80,55 @@ void convert_star_4_to_sc12_item32_3
const std::complex<type> &in3,
const int enable,
item32_sc12_3x &output,
- const double scalar
+ const double scalar,
+ typename std::enable_if<std::is_floating_point<type>::value>::type* = NULL
)
{
- const item32_t i0 = int32_t(type(in0.real()*scalar)) & 0xfff;
- const item32_t q0 = int32_t(type(in0.imag()*scalar)) & 0xfff;
+ int32_t i[4] {
+ int32_t(in0.real()*scalar) & 0xfff,
+ int32_t(in1.real()*scalar) & 0xfff,
+ int32_t(in2.real()*scalar) & 0xfff,
+ int32_t(in3.real()*scalar) & 0xfff,
+ };
- const item32_t i1 = int32_t(type(in1.real()*scalar)) & 0xfff;
- const item32_t q1 = int32_t(type(in1.imag()*scalar)) & 0xfff;
+ int32_t q[4] {
+ int32_t(in0.imag()*scalar) & 0xfff,
+ int32_t(in1.imag()*scalar) & 0xfff,
+ int32_t(in2.imag()*scalar) & 0xfff,
+ int32_t(in3.imag()*scalar) & 0xfff,
+ };
- const item32_t i2 = int32_t(type(in2.real()*scalar)) & 0xfff;
- const item32_t q2 = int32_t(type(in2.imag()*scalar)) & 0xfff;
+ pack<towire>(output, enable, i, q);
+}
- const item32_t i3 = int32_t(type(in3.real()*scalar)) & 0xfff;
- const item32_t q3 = int32_t(type(in3.imag()*scalar)) & 0xfff;
+template <typename type, towire32_type towire>
+void convert_star_4_to_sc12_item32_3
+(
+ const std::complex<type> &in0,
+ const std::complex<type> &in1,
+ const std::complex<type> &in2,
+ const std::complex<type> &in3,
+ const int enable,
+ item32_sc12_3x &output,
+ const double,
+ typename std::enable_if<std::is_same<type, short>::value>::type* = NULL
+)
+{
+ int32_t i[4] {
+ int32_t(in0.real() >> 4) & 0xfff,
+ int32_t(in1.real() >> 4) & 0xfff,
+ int32_t(in2.real() >> 4) & 0xfff,
+ int32_t(in3.real() >> 4) & 0xfff,
+ };
- const item32_t line0 = (i0 << 20) | (q0 << 8) | (i1 >> 4);
- const item32_t line1 = (i1 << 28) | (q1 << 16) | (i2 << 4) | (q2 >> 8);
- const item32_t line2 = (q2 << 24) | (i3 << 12) | (q3);
+ int32_t q[4] {
+ int32_t(in0.imag() >> 4) & 0xfff,
+ int32_t(in1.imag() >> 4) & 0xfff,
+ int32_t(in2.imag() >> 4) & 0xfff,
+ int32_t(in3.imag() >> 4) & 0xfff,
+ };
- if (enable & CONVERT12_LINE0)
- output.line0 = towire(line0);
- if (enable & CONVERT12_LINE1)
- output.line1 = towire(line1);
- if (enable & CONVERT12_LINE2)
- output.line2 = towire(line2);
+ pack<towire>(output, enable, i, q);
}
template <typename type, towire32_type towire>
@@ -192,6 +228,16 @@ static converter::sptr make_convert_fc32_1_to_sc12_item32_be_1(void)
return converter::sptr(new convert_star_1_to_sc12_item32_1<float, uhd::ntohx>());
}
+static converter::sptr make_convert_sc16_1_to_sc12_item32_le_1(void)
+{
+ return converter::sptr(new convert_star_1_to_sc12_item32_1<short, uhd::wtohx>());
+}
+
+static converter::sptr make_convert_sc16_1_to_sc12_item32_be_1(void)
+{
+ return converter::sptr(new convert_star_1_to_sc12_item32_1<short, uhd::ntohx>());
+}
+
UHD_STATIC_BLOCK(register_convert_pack_sc12)
{
//uhd::convert::register_bytes_per_item("sc12", 3/*bytes*/); //registered in unpack
@@ -199,11 +245,16 @@ UHD_STATIC_BLOCK(register_convert_pack_sc12)
uhd::convert::id_type id;
id.num_inputs = 1;
id.num_outputs = 1;
- id.input_format = "fc32";
+ id.input_format = "fc32";
id.output_format = "sc12_item32_le";
uhd::convert::register_converter(id, &make_convert_fc32_1_to_sc12_item32_le_1, PRIORITY_GENERAL);
-
id.output_format = "sc12_item32_be";
uhd::convert::register_converter(id, &make_convert_fc32_1_to_sc12_item32_be_1, PRIORITY_GENERAL);
+
+ id.input_format = "sc16";
+ id.output_format = "sc12_item32_le";
+ uhd::convert::register_converter(id, &make_convert_sc16_1_to_sc12_item32_le_1, PRIORITY_GENERAL);
+ id.output_format = "sc12_item32_be";
+ uhd::convert::register_converter(id, &make_convert_sc16_1_to_sc12_item32_be_1, PRIORITY_GENERAL);
}
diff --git a/host/lib/convert/convert_unpack_sc12.cpp b/host/lib/convert/convert_unpack_sc12.cpp
index acc815951..07f9cffa0 100644
--- a/host/lib/convert/convert_unpack_sc12.cpp
+++ b/host/lib/convert/convert_unpack_sc12.cpp
@@ -17,9 +17,10 @@
#include "convert_common.hpp"
#include <uhd/utils/byteswap.hpp>
-#include <uhd/utils/msg.hpp>
+#include <uhd/utils/log.hpp>
#include <boost/math/special_functions/round.hpp>
#include <vector>
+#include <type_traits>
using namespace uhd::convert;
@@ -56,7 +57,8 @@ void convert_sc12_item32_3_to_star_4
std::complex<type> &out1,
std::complex<type> &out2,
std::complex<type> &out3,
- const double scalar
+ const double scalar,
+ typename std::enable_if<std::is_floating_point<type>::value>::type* = NULL
)
{
//step 0: extract the lines from the input buffer
@@ -87,6 +89,32 @@ void convert_sc12_item32_3_to_star_4
}
template <typename type, tohost32_type tohost>
+void convert_sc12_item32_3_to_star_4
+(
+ const item32_sc12_3x &input,
+ std::complex<type> &out0,
+ std::complex<type> &out1,
+ std::complex<type> &out2,
+ std::complex<type> &out3,
+ const double,
+ typename std::enable_if<std::is_integral<type>::value>::type* = NULL
+)
+{
+ //step 0: extract the lines from the input buffer
+ const item32_t line0 = tohost(input.line0);
+ const item32_t line1 = tohost(input.line1);
+ const item32_t line2 = tohost(input.line2);
+ const uint64_t line01 = (uint64_t(line0) << 32) | line1;
+ const uint64_t line12 = (uint64_t(line1) << 32) | line2;
+
+ //step 1: extract and load the outputs
+ out0 = std::complex<type>(line0 >> 16 & 0xfff0, line0 >> 4 & 0xfff0);
+ out1 = std::complex<type>(line01 >> 24 & 0xfff0, line1 >> 12 & 0xfff0);
+ out2 = std::complex<type>(line1 >> 0 & 0xfff0, line12 >> 20 & 0xfff0);
+ out3 = std::complex<type>(line2 >> 8 & 0xfff0, line2 << 4 & 0xfff0);
+}
+
+template <typename type, tohost32_type tohost>
struct convert_sc12_item32_1_to_star_1 : public converter
{
convert_sc12_item32_1_to_star_1(void):_scalar(0.0)
@@ -193,18 +221,32 @@ static converter::sptr make_convert_sc12_item32_be_1_to_fc32_1(void)
return converter::sptr(new convert_sc12_item32_1_to_star_1<float, uhd::ntohx>());
}
+static converter::sptr make_convert_sc12_item32_le_1_to_sc16_1(void)
+{
+ return converter::sptr(new convert_sc12_item32_1_to_star_1<short, uhd::wtohx>());
+}
+
+static converter::sptr make_convert_sc12_item32_be_1_to_sc16_1(void)
+{
+ return converter::sptr(new convert_sc12_item32_1_to_star_1<short, uhd::ntohx>());
+}
+
UHD_STATIC_BLOCK(register_convert_unpack_sc12)
{
uhd::convert::register_bytes_per_item("sc12", 3/*bytes*/);
-
uhd::convert::id_type id;
id.num_inputs = 1;
id.num_outputs = 1;
- id.output_format = "fc32";
+ id.output_format = "fc32";
id.input_format = "sc12_item32_le";
uhd::convert::register_converter(id, &make_convert_sc12_item32_le_1_to_fc32_1, PRIORITY_GENERAL);
-
id.input_format = "sc12_item32_be";
uhd::convert::register_converter(id, &make_convert_sc12_item32_be_1_to_fc32_1, PRIORITY_GENERAL);
+
+ id.output_format = "sc16";
+ id.input_format = "sc12_item32_le";
+ uhd::convert::register_converter(id, &make_convert_sc12_item32_le_1_to_sc16_1, PRIORITY_GENERAL);
+ id.input_format = "sc12_item32_be";
+ uhd::convert::register_converter(id, &make_convert_sc12_item32_be_1_to_sc16_1, PRIORITY_GENERAL);
}