summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnuradio-runtime/lib/math/qa_fxpt_nco.cc6
-rw-r--r--gnuradio-runtime/lib/math/qa_fxpt_vco.cc18
-rw-r--r--gnuradio-runtime/python/gnuradio/gr/tag_utils.py16
-rw-r--r--gr-analog/grc/analog_fmdet_cf.xml45
-rw-r--r--gr-analog/lib/agc3_cc_impl.cc10
-rw-r--r--gr-blocks/examples/ctrlport/simple_copy.grc100
-rw-r--r--gr-blocks/grc/blocks_tag_gate.xml14
-rw-r--r--gr-blocks/include/gnuradio/blocks/tag_gate.h15
-rw-r--r--gr-blocks/lib/file_meta_sink_impl.cc31
-rw-r--r--gr-blocks/lib/file_meta_source_impl.cc22
-rw-r--r--gr-blocks/lib/tag_gate_impl.cc41
-rw-r--r--gr-blocks/lib/tag_gate_impl.h6
-rw-r--r--gr-blocks/python/blocks/qa_file_metadata.py2
-rwxr-xr-xgr-blocks/python/blocks/qa_tag_gate.py75
-rw-r--r--gr-fec/python/fec/polar/channel_construction.py4
-rw-r--r--gr-fft/lib/fft.cc28
-rw-r--r--gr-uhd/apps/uhd_app.py20
-rw-r--r--gr-utils/python/modtool/modtool_makexml.py2
-rw-r--r--gr-utils/python/modtool/modtool_rm.py2
19 files changed, 376 insertions, 81 deletions
diff --git a/gnuradio-runtime/lib/math/qa_fxpt_nco.cc b/gnuradio-runtime/lib/math/qa_fxpt_nco.cc
index cf229d68be..16ea120381 100644
--- a/gnuradio-runtime/lib/math/qa_fxpt_nco.cc
+++ b/gnuradio-runtime/lib/math/qa_fxpt_nco.cc
@@ -86,8 +86,8 @@ qa_fxpt_nco::t1()
{
gr::nco<float,float> ref_nco;
gr::fxpt_nco new_nco;
- gr_complex ref_block[SIN_COS_BLOCK_SIZE];
- gr_complex new_block[SIN_COS_BLOCK_SIZE];
+ gr_complex* ref_block = new gr_complex[SIN_COS_BLOCK_SIZE];
+ gr_complex* new_block = new gr_complex[SIN_COS_BLOCK_SIZE];
double max_error = 0;
ref_nco.set_freq((float)(2 * M_PI / SIN_COS_FREQ));
@@ -107,6 +107,8 @@ qa_fxpt_nco::t1()
}
CPPUNIT_ASSERT_DOUBLES_EQUAL (ref_nco.get_phase(), new_nco.get_phase(), SIN_COS_TOLERANCE);
// printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, max_phase_error);
+ delete[] ref_block;
+ delete[] new_block;
}
void
diff --git a/gnuradio-runtime/lib/math/qa_fxpt_vco.cc b/gnuradio-runtime/lib/math/qa_fxpt_vco.cc
index 8ee402fdc1..a406c12c0f 100644
--- a/gnuradio-runtime/lib/math/qa_fxpt_vco.cc
+++ b/gnuradio-runtime/lib/math/qa_fxpt_vco.cc
@@ -79,9 +79,9 @@ qa_fxpt_vco::t1()
{
gr::vco<float,float> ref_vco;
gr::fxpt_vco new_vco;
- float ref_block[SIN_COS_BLOCK_SIZE];
- float new_block[SIN_COS_BLOCK_SIZE];
- float input[SIN_COS_BLOCK_SIZE];
+ float *ref_block = new float[SIN_COS_BLOCK_SIZE];
+ float *new_block = new float[SIN_COS_BLOCK_SIZE];
+ float *input = new float[SIN_COS_BLOCK_SIZE];
double max_error = 0;
for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) {
@@ -97,6 +97,9 @@ qa_fxpt_vco::t1()
}
CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_vco.get_phase(), new_vco.get_phase(), SIN_COS_TOLERANCE);
// printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, ref_vco.get_phase()-new_vco.get_phase());
+ delete[] ref_block;
+ delete[] new_block;
+ delete[] input;
}
void
@@ -104,9 +107,9 @@ qa_fxpt_vco::t2()
{
gr::vco<gr_complex,float> ref_vco;
gr::fxpt_vco new_vco;
- gr_complex ref_block[SIN_COS_BLOCK_SIZE];
- gr_complex new_block[SIN_COS_BLOCK_SIZE];
- float input[SIN_COS_BLOCK_SIZE];
+ gr_complex *ref_block = new gr_complex[SIN_COS_BLOCK_SIZE];
+ gr_complex *new_block = new gr_complex[SIN_COS_BLOCK_SIZE];
+ float *input = new float[SIN_COS_BLOCK_SIZE];
double max_error = 0;
for(int i = 0; i < SIN_COS_BLOCK_SIZE; i++) {
@@ -122,6 +125,9 @@ qa_fxpt_vco::t2()
}
CPPUNIT_ASSERT_DOUBLES_EQUAL(ref_vco.get_phase(), new_vco.get_phase(), SIN_COS_TOLERANCE);
// printf ("Fxpt max error %.9f, max phase error %.9f\n", max_error, ref_vco.get_phase()-new_vco.get_phase());
+ delete[] ref_block;
+ delete[] new_block;
+ delete[] input;
}
void
diff --git a/gnuradio-runtime/python/gnuradio/gr/tag_utils.py b/gnuradio-runtime/python/gnuradio/gr/tag_utils.py
index a7745428c7..0d4805a8b8 100644
--- a/gnuradio-runtime/python/gnuradio/gr/tag_utils.py
+++ b/gnuradio-runtime/python/gnuradio/gr/tag_utils.py
@@ -57,17 +57,17 @@ def python_to_tag(tag_struct):
good = True
if(tag_struct.has_key('key')):
- if(isinstance(tag_struct['key'], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct['key'], pmt.swig_int_ptr)):
tag.key = tag_struct['key']
good = True
if(tag_struct.has_key('value')):
- if(isinstance(tag_struct['value'], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct['value'], pmt.swig_int_ptr)):
tag.value = tag_struct['value']
good = True
if(tag_struct.has_key('srcid')):
- if(isinstance(tag_struct['srcid'], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct['srcid'], pmt.swig_int_ptr)):
tag.srcid = tag_struct['srcid']
good = True
@@ -77,15 +77,15 @@ def python_to_tag(tag_struct):
tag.offset = tag_struct[0]
good = True
- if(isinstance(tag_struct[1], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct[1], pmt.swig_int_ptr)):
tag.key = tag_struct[1]
good = True
- if(isinstance(tag_struct[2], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct[2], pmt.swig_int_ptr)):
tag.value = tag_struct[2]
good = True
- if(isinstance(tag_struct[3], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct[3], pmt.swig_int_ptr)):
tag.srcid = tag_struct[3]
good = True
@@ -94,11 +94,11 @@ def python_to_tag(tag_struct):
tag.offset = tag_struct[0]
good = True
- if(isinstance(tag_struct[1], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct[1], pmt.swig_int_ptr)):
tag.key = tag_struct[1]
good = True
- if(isinstance(tag_struct[2], pmt.pmt_swig.swig_int_ptr)):
+ if(isinstance(tag_struct[2], pmt.swig_int_ptr)):
tag.value = tag_struct[2]
good = True
diff --git a/gr-analog/grc/analog_fmdet_cf.xml b/gr-analog/grc/analog_fmdet_cf.xml
new file mode 100644
index 0000000000..26688b2893
--- /dev/null
+++ b/gr-analog/grc/analog_fmdet_cf.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!--
+###################################################
+##FM Detector
+###################################################
+ -->
+<block>
+ <name>FM Detector</name>
+ <key>analog_fmdet_cf</key>
+ <import>from gnuradio import analog</import>
+ <make>analog.fmdet_cf(
+ samplerate=$samplerate,
+ freq_low=$freq_low,
+ freq_high=$freq_high,
+ scl=$scl
+)</make>
+ <param>
+ <name>Sample rate</name>
+ <key>samplerate</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Lowest frequency</name>
+ <key>freq_low</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Highest frequency</name>
+ <key>freq_high</key>
+ <type>real</type>
+ </param>
+ <param>
+ <name>Scale factor</name>
+ <key>scl</key>
+ <type>real</type>
+ </param>
+ <sink>
+ <name>in</name>
+ <type>complex</type>
+ </sink>
+ <source>
+ <name>out</name>
+ <type>float</type>
+ </source>
+</block>
diff --git a/gr-analog/lib/agc3_cc_impl.cc b/gr-analog/lib/agc3_cc_impl.cc
index fddefd6710..9d34c7b84d 100644
--- a/gr-analog/lib/agc3_cc_impl.cc
+++ b/gr-analog/lib/agc3_cc_impl.cc
@@ -79,7 +79,7 @@ namespace gr {
#else
// Compute a linear average on reset (no expected)
if(!d_reset) {
- std::vector<float> mags(noutput_items);
+ _declspec(align(16)) std::vector<float> mags(noutput_items) ;
volk_32fc_magnitude_32f(&mags[0], &in[0], noutput_items);
#endif
float mag(0.0);
@@ -104,8 +104,8 @@ namespace gr {
else {
// Otherwise perform a normal iir update
#ifdef _MSC_VER
- std::vector<float> mag_sq(noutput_items/d_iir_update_decim);
- std::vector<float> inv_mag(noutput_items/d_iir_update_decim);
+ __declspec(align(16)) std::vector<float> mag_sq(noutput_items/d_iir_update_decim) ;
+ __declspec(align(16)) std::vector<float> inv_mag(noutput_items/d_iir_update_decim) ;
#else
float mag_sq[noutput_items/d_iir_update_decim] __attribute__ ((aligned (16)));
float inv_mag[noutput_items/d_iir_update_decim] __attribute__ ((aligned (16)));
@@ -123,8 +123,8 @@ namespace gr {
// apply updates
for(int i=0; i<noutput_items/d_iir_update_decim; i++){
float magi = inv_mag[i];
-#ifdef _MSC_VER
- if(!_finite(magi)){
+#if defined(_MSC_VER) && _MSC_VER < 1900
+ if(!_finite(magi)){
#else
if(std::isfinite(magi)){
#endif
diff --git a/gr-blocks/examples/ctrlport/simple_copy.grc b/gr-blocks/examples/ctrlport/simple_copy.grc
index 6e795d751b..a52c350ded 100644
--- a/gr-blocks/examples/ctrlport/simple_copy.grc
+++ b/gr-blocks/examples/ctrlport/simple_copy.grc
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
-<?grc format='1' created='3.7.9'?>
+<?grc format='1' created='3.7.11'?>
<flow_graph>
<timestamp>Sat Mar 16 22:03:14 2013</timestamp>
<block>
@@ -41,6 +41,10 @@
<value>qt_gui</value>
</param>
<param>
+ <key>hier_block_src_path</key>
+ <value>.:</value>
+ </param>
+ <param>
<key>id</key>
<value>simple_copy</value>
</param>
@@ -49,10 +53,18 @@
<value>0</value>
</param>
<param>
+ <key>qt_qss_theme</key>
+ <value></value>
+ </param>
+ <param>
<key>realtime_scheduling</key>
<value></value>
</param>
<param>
+ <key>run_command</key>
+ <value>{python} -u {filename}</value>
+ </param>
+ <param>
<key>run_options</key>
<value>prompt</value>
</param>
@@ -381,12 +393,92 @@ to enable/disablethis block</value>
</param>
</block>
<block>
+ <key>epy_block</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_io_cache</key>
+ <value>('Null Msg Source', 'blk', [], [], [('fake_output', 'message', 1)], '', [])</value>
+ </param>
+ <param>
+ <key>_source_code</key>
+ <value># Block that doesn't do anything, just used to get a msg input port on another block exposed to ControlPort
+from gnuradio import gr
+import pmt
+class blk(gr.basic_block):
+ def __init__(self):
+ gr.basic_block.__init__(self,name='Null Msg Source',in_sig=[],out_sig=[])
+ self.message_port_register_out(pmt.intern("fake_output"))
+</value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value></value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(357, 218)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>epy_block_0</value>
+ </param>
+ </block>
+ <block>
+ <key>note</key>
+ <param>
+ <key>alias</key>
+ <value></value>
+ </param>
+ <param>
+ <key>comment</key>
+ <value>Make sure to turn on ControlPort (edit ~/.gnuradio/config.conf)
+and run the following script to toggle Copy block:
+cd /src/gnuradio/gr-blocks/examples/ctrlport
+python simple_copy_controller.py 127.0.0.1 &lt;PORT&gt; true</value>
+ </param>
+ <param>
+ <key>_enabled</key>
+ <value>True</value>
+ </param>
+ <param>
+ <key>_coordinate</key>
+ <value>(352, 13)</value>
+ </param>
+ <param>
+ <key>_rotation</key>
+ <value>0</value>
+ </param>
+ <param>
+ <key>id</key>
+ <value>note_0</value>
+ </param>
+ <param>
+ <key>note</key>
+ <value></value>
+ </param>
+ </block>
+ <block>
<key>qtgui_time_sink_x</key>
<param>
<key>autoscale</key>
<value>False</value>
</param>
<param>
+ <key>axislabels</key>
+ <value>True</value>
+ </param>
+ <param>
<key>alias</key>
<value></value>
</param>
@@ -769,4 +861,10 @@ to enable/disablethis block</value>
<source_key>0</source_key>
<sink_key>0</sink_key>
</connection>
+ <connection>
+ <source_block_id>epy_block_0</source_block_id>
+ <sink_block_id>blocks_copy_0</sink_block_id>
+ <source_key>fake_output</source_key>
+ <sink_key>en</sink_key>
+ </connection>
</flow_graph>
diff --git a/gr-blocks/grc/blocks_tag_gate.xml b/gr-blocks/grc/blocks_tag_gate.xml
index 5c748f27cf..34475ff96f 100644
--- a/gr-blocks/grc/blocks_tag_gate.xml
+++ b/gr-blocks/grc/blocks_tag_gate.xml
@@ -3,7 +3,10 @@
<name>Tag Gate</name>
<key>blocks_tag_gate</key>
<import>from gnuradio import blocks</import>
- <make>blocks.tag_gate($type.size * $vlen, $propagate_tags)</make>
+ <make>blocks.tag_gate($type.size * $vlen, $propagate_tags)
+self.$(id).set_single_key($single_key))</make>
+ <callback>self.$(id).set_single_key($single_key)</callback>
+
<param>
<name>Item Type</name>
<key>type</key>
@@ -41,7 +44,7 @@
<type>int</type>
</param>
<param>
- <name>Propagate_tags</name>
+ <name>Propagate Tags</name>
<key>propagate_tags</key>
<value>False</value>
<type>enum</type>
@@ -54,6 +57,13 @@
<key>False</key>
</option>
</param>
+
+ <param>
+ <name>Single Key</name>
+ <key>single_key</key>
+ <value>""</value>
+ <type>string</type>
+ </param>
<check>$vlen &gt; 0</check>
<sink>
<name>in</name>
diff --git a/gr-blocks/include/gnuradio/blocks/tag_gate.h b/gr-blocks/include/gnuradio/blocks/tag_gate.h
index 5363301192..644b5cf75a 100644
--- a/gr-blocks/include/gnuradio/blocks/tag_gate.h
+++ b/gr-blocks/include/gnuradio/blocks/tag_gate.h
@@ -47,6 +47,21 @@ namespace gr {
* \param propagate_tags Set this to true to allow tags to pass through this block.
*/
static sptr make(size_t item_size, bool propagate_tags=false);
+
+ /*!
+ * \brief Only gate stream tags with one specific key instead of all keys
+ *
+ * \details
+ * If set to "", all tags will be affected by the gate.
+ * If set to "foo", all tags with key different from "foo" will pass
+ * through.
+ */
+ virtual void set_single_key(const std::string &single_key)=0;
+
+ /*!
+ * \brief Get the current single key.
+ */
+ virtual std::string single_key() const = 0;
};
} // namespace blocks
diff --git a/gr-blocks/lib/file_meta_sink_impl.cc b/gr-blocks/lib/file_meta_sink_impl.cc
index 027d12faf2..b6d858489d 100644
--- a/gr-blocks/lib/file_meta_sink_impl.cc
+++ b/gr-blocks/lib/file_meta_sink_impl.cc
@@ -141,17 +141,7 @@ namespace gr {
{
close();
- if(d_fp) {
- fclose(d_fp);
- d_fp = 0;
- }
- if(d_state == STATE_DETACHED) {
- if(d_hdr_fp) {
- fclose(d_hdr_fp);
- d_hdr_fp = 0;
- }
- }
}
bool
@@ -216,6 +206,18 @@ namespace gr {
d_new_fp = 0;
}
d_updated = true;
+
+ if (d_fp) {
+ fclose(d_fp);
+ d_fp = 0;
+ }
+
+ if (d_state == STATE_DETACHED) {
+ if (d_hdr_fp) {
+ fclose(d_hdr_fp);
+ d_hdr_fp = 0;
+ }
+ }
}
void
@@ -298,10 +300,11 @@ namespace gr {
void
file_meta_sink_impl::update_last_header()
{
- if(d_state == STATE_DETACHED)
- update_last_header_detached();
- else
- update_last_header_inline();
+ if(d_state == STATE_DETACHED) {
+ if (d_hdr_fp) update_last_header_detached();
+ } else {
+ if(d_fp) update_last_header_inline();
+ }
}
void
diff --git a/gr-blocks/lib/file_meta_source_impl.cc b/gr-blocks/lib/file_meta_source_impl.cc
index 4cb0ab8ed1..3c72e2a003 100644
--- a/gr-blocks/lib/file_meta_source_impl.cc
+++ b/gr-blocks/lib/file_meta_source_impl.cc
@@ -111,17 +111,7 @@ namespace gr {
{
close();
- if(d_fp) {
- fclose(d_fp);
- d_fp = 0;
- }
- if(d_state == STATE_DETACHED) {
- if(d_hdr_fp) {
- fclose(d_hdr_fp);
- d_hdr_fp = 0;
- }
- }
}
bool
@@ -339,6 +329,18 @@ namespace gr {
d_new_fp = 0;
}
d_updated = true;
+
+ if (d_fp) {
+ fclose(d_fp);
+ d_fp = 0;
+ }
+
+ if (d_state == STATE_DETACHED) {
+ if (d_hdr_fp) {
+ fclose(d_hdr_fp);
+ d_hdr_fp = 0;
+ }
+ }
}
void
diff --git a/gr-blocks/lib/tag_gate_impl.cc b/gr-blocks/lib/tag_gate_impl.cc
index 643ec6748f..ad55c8af9a 100644
--- a/gr-blocks/lib/tag_gate_impl.cc
+++ b/gr-blocks/lib/tag_gate_impl.cc
@@ -41,11 +41,13 @@ namespace gr {
gr::io_signature::make(1, 1, item_size),
gr::io_signature::make(1, 1, item_size)),
d_item_size(item_size),
- d_propagate_tags(propagate_tags)
+ d_propagate_tags(propagate_tags),
+ d_single_key_set(false)
{
if (!d_propagate_tags) {
set_tag_propagation_policy(TPP_DONT);
}
+ d_single_key = pmt::PMT_NIL;
}
tag_gate_impl::~tag_gate_impl()
@@ -54,10 +56,34 @@ namespace gr {
void tag_gate_impl::set_propagation(bool propagate_tags)
{
+ d_propagate_tags = propagate_tags;
+
if (propagate_tags) {
- set_tag_propagation_policy(TPP_ALL_TO_ALL);
+ set_tag_propagation_policy(TPP_ALL_TO_ALL);
} else {
- set_tag_propagation_policy(TPP_DONT);
+ set_tag_propagation_policy(TPP_DONT);
+ }
+ }
+
+ void tag_gate_impl::set_single_key(const std::string &single_key)
+ {
+ if(single_key == "") {
+ d_single_key = pmt::PMT_NIL;
+ d_single_key_set = false;
+ }
+ else {
+ d_single_key = pmt::intern(single_key);
+ d_single_key_set = true;
+ }
+ }
+
+ std::string tag_gate_impl::single_key() const
+ {
+ if(pmt::equal(d_single_key, pmt::PMT_NIL)) {
+ return "";
+ }
+ else {
+ return pmt::symbol_to_string(d_single_key);
}
}
@@ -68,9 +94,18 @@ namespace gr {
{
const unsigned char *in = (const unsigned char *) input_items[0];
unsigned char *out = (unsigned char *) output_items[0];
+ std::vector<tag_t> tags;
memcpy((void *) out, (void *) in, d_item_size * noutput_items);
+ if (d_single_key_set && (!d_propagate_tags)) {
+ get_tags_in_range(tags, 0, nitems_read(0), nitems_read(0) + noutput_items);
+ for (unsigned int i=0; i < tags.size(); i++) {
+ if (!pmt::equal(tags[i].key, d_single_key))
+ add_item_tag(0, tags[i].offset, tags[i].key, tags[i].value, tags[i].srcid);
+ }
+ }
+
return noutput_items;
}
diff --git a/gr-blocks/lib/tag_gate_impl.h b/gr-blocks/lib/tag_gate_impl.h
index 4983ba10b4..129fb78cb8 100644
--- a/gr-blocks/lib/tag_gate_impl.h
+++ b/gr-blocks/lib/tag_gate_impl.h
@@ -33,6 +33,9 @@ namespace gr {
private:
size_t d_item_size;
bool d_propagate_tags;
+ bool d_single_key_set;
+
+ pmt::pmt_t d_single_key;
public:
tag_gate_impl(size_t item_size, bool propagate_tags);
@@ -43,6 +46,9 @@ namespace gr {
int work(int noutput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
+
+ void set_single_key(const std::string &single_key);
+ std::string single_key() const;
};
} // namespace blocks
diff --git a/gr-blocks/python/blocks/qa_file_metadata.py b/gr-blocks/python/blocks/qa_file_metadata.py
index 0d7628bbdc..886207f108 100644
--- a/gr-blocks/python/blocks/qa_file_metadata.py
+++ b/gr-blocks/python/blocks/qa_file_metadata.py
@@ -106,6 +106,7 @@ class test_file_metadata(gr_unittest.TestCase):
self.tb.connect(src, ssnk)
self.tb.run()
+ fsrc.close()
# Test to make sure tags with 'samp_rate' and 'rx_rate' keys
# were generated and received correctly.
tags = tsnk.current_tags()
@@ -187,6 +188,7 @@ class test_file_metadata(gr_unittest.TestCase):
self.tb.connect(src, ssnk)
self.tb.run()
+ fsrc.close()
# Test to make sure tags with 'samp_rate' and 'rx_rate' keys
# were generated and received correctly.
tags = tsnk.current_tags()
diff --git a/gr-blocks/python/blocks/qa_tag_gate.py b/gr-blocks/python/blocks/qa_tag_gate.py
index acb2c68a82..7ae676562e 100755
--- a/gr-blocks/python/blocks/qa_tag_gate.py
+++ b/gr-blocks/python/blocks/qa_tag_gate.py
@@ -40,9 +40,84 @@ class qa_tag_gate (gr_unittest.TestCase):
src = blocks.vector_source_f(range(20), False, 1, (tag,))
gate = blocks.tag_gate(gr.sizeof_float, False)
sink = blocks.vector_sink_f()
+ self.tb.connect(src, gate, sink)
self.tb.run ()
self.assertEqual(len(sink.tags()), 0)
+ def test_002_t (self):
+ tags = []
+ tags.append(gr.tag_t())
+ tags[0].key = pmt.string_to_symbol('key')
+ tags[0].value = pmt.from_long(42)
+ tags[0].offset = 0
+ tags.append(gr.tag_t())
+ tags[1].key = pmt.string_to_symbol('key')
+ tags[1].value = pmt.from_long(42)
+ tags[1].offset = 5
+ tags.append(gr.tag_t())
+ tags[2].key = pmt.string_to_symbol('secondkey')
+ tags[2].value = pmt.from_long(42)
+ tags[2].offset = 6
+ src = blocks.vector_source_f(range(20), False, 1, tags)
+ gate = blocks.tag_gate(gr.sizeof_float, False)
+ gate.set_single_key("key")
+ self.assertEqual(gate.single_key(),"key")
+ sink = blocks.vector_sink_f()
+ self.tb.connect(src, gate, sink)
+ self.tb.run ()
+ self.assertEqual(len(sink.tags()), 1)
+
+ def test_003_t (self):
+ tags = []
+ tags.append(gr.tag_t())
+ tags[0].key = pmt.string_to_symbol('key')
+ tags[0].value = pmt.from_long(42)
+ tags[0].offset = 0
+ tags.append(gr.tag_t())
+ tags[1].key = pmt.string_to_symbol('key')
+ tags[1].value = pmt.from_long(42)
+ tags[1].offset = 5
+ tags.append(gr.tag_t())
+ tags[2].key = pmt.string_to_symbol('secondkey')
+ tags[2].value = pmt.from_long(42)
+ tags[2].offset = 6
+ src = blocks.vector_source_f(range(20), False, 1, tags)
+ gate = blocks.tag_gate(gr.sizeof_float, True)
+ gate.set_single_key("key")
+ sink = blocks.vector_sink_f()
+ self.tb.connect(src, gate, sink)
+ self.tb.run ()
+ self.assertEqual(len(sink.tags()), 3)
+
+ def test_004_t (self):
+ tags = []
+ tags.append(gr.tag_t())
+ tags[0].key = pmt.string_to_symbol('key')
+ tags[0].value = pmt.from_long(42)
+ tags[0].offset = 0
+ tags.append(gr.tag_t())
+ tags[1].key = pmt.string_to_symbol('key')
+ tags[1].value = pmt.from_long(42)
+ tags[1].offset = 5
+ tags.append(gr.tag_t())
+ tags[2].key = pmt.string_to_symbol('secondkey')
+ tags[2].value = pmt.from_long(42)
+ tags[2].offset = 6
+ src = blocks.vector_source_f(range(20), False, 1, tags)
+ gate = blocks.tag_gate(gr.sizeof_float, True)
+ sink = blocks.vector_sink_f()
+ self.tb.connect(src, gate, sink)
+ self.tb.run ()
+ self.assertEqual(len(sink.tags()), 3)
+
+ def test_005_t (self):
+ gate = blocks.tag_gate(gr.sizeof_float, True)
+ self.assertEqual(gate.single_key(), "")
+ gate.set_single_key("the_key")
+ self.assertEqual(gate.single_key(), "the_key")
+ gate.set_single_key("")
+ self.assertEqual(gate.single_key(), "")
+
if __name__ == '__main__':
gr_unittest.run(qa_tag_gate, "qa_tag_gate.xml")
diff --git a/gr-fec/python/fec/polar/channel_construction.py b/gr-fec/python/fec/polar/channel_construction.py
index a981007b45..b7a3dee3bd 100644
--- a/gr-fec/python/fec/polar/channel_construction.py
+++ b/gr-fec/python/fec/polar/channel_construction.py
@@ -37,7 +37,7 @@ Z_PARAM_FIRST_HEADER_LINE = "Bhattacharyya parameters (Z-parameters) for a polar
def get_frozen_bit_indices_from_capacities(chan_caps, nfrozen):
indexes = np.array([], dtype=int)
while indexes.size < nfrozen:
- index = np.argmin(chan_caps)
+ index = np.argmin(chan_caps).astype(int)
indexes = np.append(indexes, index)
chan_caps[index] = 2.0 # make absolutely sure value is out of range!
return np.sort(indexes)
@@ -46,7 +46,7 @@ def get_frozen_bit_indices_from_capacities(chan_caps, nfrozen):
def get_frozen_bit_indices_from_z_parameters(z_params, nfrozen):
indexes = np.array([], dtype=int)
while indexes.size < nfrozen:
- index = np.argmax(z_params)
+ index = np.argmax(z_params).astype(int)
indexes = np.append(indexes, index)
z_params[index] = -1.0
return np.sort(indexes)
diff --git a/gr-fft/lib/fft.cc b/gr-fft/lib/fft.cc
index ef81583187..3b6d05c383 100644
--- a/gr-fft/lib/fft.cc
+++ b/gr-fft/lib/fft.cc
@@ -36,6 +36,10 @@ static int my_fftw_read_char(void *f) { return fgetc((FILE *) f); }
#define fftw_import_wisdom_from_file(f) fftw_import_wisdom(my_fftw_read_char, (void*) (f))
#define fftwf_import_wisdom_from_file(f) fftwf_import_wisdom(my_fftw_read_char, (void*) (f))
#define fftwl_import_wisdom_from_file(f) fftwl_import_wisdom(my_fftw_read_char, (void*) (f))
+#include <fcntl.h>
+#include <io.h>
+#define O_NOCTTY 0
+#define O_NONBLOCK 0
#endif //_MSC_VER
#include <stdlib.h>
@@ -52,6 +56,7 @@ namespace fs = boost::filesystem;
namespace gr {
namespace fft {
static boost::mutex wisdom_thread_mutex;
+ boost::interprocess::file_lock wisdom_lock;
gr_complex *
malloc_complex(int size)
@@ -96,23 +101,13 @@ namespace gr {
static void
lock_wisdom()
{
- const std::string wisdom_lock_file = wisdom_filename() + ".lock";
- int fd = open(wisdom_lock_file.c_str(),
- O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK,
- 0666);
- if (fd < 0){
- throw std::exception();
- }
- boost::interprocess::file_lock wisdom_lock(wisdom_lock_file.c_str());
- wisdom_lock.lock();
- wisdom_thread_mutex.lock();
+ wisdom_thread_mutex.lock();
+ wisdom_lock.lock();
}
static void
unlock_wisdom()
{
- const std::string wisdom_lock_file = wisdom_filename() + ".lock";
- boost::interprocess::file_lock wisdom_lock(wisdom_lock_file.c_str());
wisdom_lock.unlock();
wisdom_thread_mutex.unlock();
}
@@ -168,6 +163,15 @@ namespace gr {
{
// Hold global mutex during plan construction and destruction.
planner::scoped_lock lock(planner::mutex());
+ const std::string wisdom_lock_file = wisdom_filename() + ".lock";
+ int fd = open(wisdom_lock_file.c_str(),
+ O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK,
+ 0666);
+ if (fd < 0) {
+ throw std::exception();
+ }
+ close(fd);
+ wisdom_lock = boost::interprocess::file_lock(wisdom_lock_file.c_str());
assert (sizeof (fftwf_complex) == sizeof (gr_complex));
diff --git a/gr-uhd/apps/uhd_app.py b/gr-uhd/apps/uhd_app.py
index 7fccf858dc..5c8881ce34 100644
--- a/gr-uhd/apps/uhd_app.py
+++ b/gr-uhd/apps/uhd_app.py
@@ -121,10 +121,13 @@ class UHDApp(object):
if arg is None:
return None
args = [x.strip() for x in arg.split(",")]
+ if len(args) == 1:
+ args = args * num
if len(args) != num:
raise ValueError("Invalid {m} setting for {n} {b}: {a}".format(
m=arg_name, n=num, a=arg, b=num_name
))
+
return args
def async_callback(self, msg):
@@ -161,27 +164,18 @@ class UHDApp(object):
self.usrp.get_num_mboards(), args.spec)
if self.spec:
for mb_idx in xrange(self.usrp.get_num_mboards()):
- if len(self.spec) == 1:
- self.usrp.set_subdev_spec(self.spec, mb_idx)
- else:
- self.usrp.set_subdev_spec(self.spec[mb_idx], mb_idx)
+ self.usrp.set_subdev_spec(self.spec[mb_idx], mb_idx)
# Set the clock and/or time source:
if args.clock_source is not None:
self.clock_source = self.normalize_sel("mboards", "clock-source",
self.usrp.get_num_mboards(), args.clock_source)
for mb_idx in xrange(self.usrp.get_num_mboards()):
- if len(self.clock_source) == 1:
- self.usrp.set_clock_source(self.clock_source[0], mb_idx)
- else:
- self.usrp.set_clock_source(self.clock_source[mb_idx], mb_idx)
+ self.usrp.set_clock_source(self.clock_source[mb_idx], mb_idx)
if args.time_source is not None:
self.time_source = self.normalize_sel("mboards", "time-source",
self.usrp.get_num_mboards(), args.time_source)
for mb_idx in xrange(self.usrp.get_num_mboards()):
- if len(self.time_source) == 1:
- self.usrp.set_time_source(self.time_source[0], mb_idx)
- else:
- self.usrp.set_time_source(self.time_source[mb_idx], mb_idx)
+ self.usrp.set_time_source(self.time_source[mb_idx], mb_idx)
# Sampling rate:
self.usrp.set_samp_rate(args.samp_rate)
self.samp_rate = self.usrp.get_samp_rate()
@@ -189,8 +183,6 @@ class UHDApp(object):
# Set the antenna:
self.antenna = self.normalize_sel("channels", "antenna", len(args.channels), args.antenna)
if self.antenna is not None:
- if len(self.antenna) == 1:
- self.antenna = self.antenna * len(args.channels)
for i, chan in enumerate(self.channels):
if not self.antenna[i] in self.usrp.get_antennas(i):
print("[ERROR] {} is not a valid antenna name for this USRP device!".format(self.antenna[i]))
diff --git a/gr-utils/python/modtool/modtool_makexml.py b/gr-utils/python/modtool/modtool_makexml.py
index 575d7eb873..9d047a67bc 100644
--- a/gr-utils/python/modtool/modtool_makexml.py
+++ b/gr-utils/python/modtool/modtool_makexml.py
@@ -79,7 +79,7 @@ class ModToolMakeXML(ModTool):
def _search_files(self, path, path_glob):
""" Search for files matching pattern in the given path. """
- files = glob.glob("%s/%s"% (path, path_glob))
+ files = sorted(glob.glob("%s/%s"% (path, path_glob)))
files_filt = []
print "Searching for matching files in %s/:" % path
for f in files:
diff --git a/gr-utils/python/modtool/modtool_rm.py b/gr-utils/python/modtool/modtool_rm.py
index 47128dbc87..67de33f044 100644
--- a/gr-utils/python/modtool/modtool_rm.py
+++ b/gr-utils/python/modtool/modtool_rm.py
@@ -127,7 +127,7 @@ class ModToolRemove(ModTool):
# 1. Create a filtered list
files = []
for g in globs:
- files = files + glob.glob("%s/%s"% (path, g))
+ files = files + sorted(glob.glob("%s/%s"% (path, g)))
files_filt = []
print "Searching for matching files in %s/:" % path
for f in files: