diff options
-rw-r--r-- | gnuradio-runtime/lib/math/qa_fxpt_nco.cc | 6 | ||||
-rw-r--r-- | gnuradio-runtime/lib/math/qa_fxpt_vco.cc | 18 | ||||
-rw-r--r-- | gnuradio-runtime/python/gnuradio/gr/tag_utils.py | 16 | ||||
-rw-r--r-- | gr-analog/grc/analog_fmdet_cf.xml | 45 | ||||
-rw-r--r-- | gr-analog/lib/agc3_cc_impl.cc | 10 | ||||
-rw-r--r-- | gr-blocks/examples/ctrlport/simple_copy.grc | 100 | ||||
-rw-r--r-- | gr-blocks/grc/blocks_tag_gate.xml | 14 | ||||
-rw-r--r-- | gr-blocks/include/gnuradio/blocks/tag_gate.h | 15 | ||||
-rw-r--r-- | gr-blocks/lib/file_meta_sink_impl.cc | 31 | ||||
-rw-r--r-- | gr-blocks/lib/file_meta_source_impl.cc | 22 | ||||
-rw-r--r-- | gr-blocks/lib/tag_gate_impl.cc | 41 | ||||
-rw-r--r-- | gr-blocks/lib/tag_gate_impl.h | 6 | ||||
-rw-r--r-- | gr-blocks/python/blocks/qa_file_metadata.py | 2 | ||||
-rwxr-xr-x | gr-blocks/python/blocks/qa_tag_gate.py | 75 | ||||
-rw-r--r-- | gr-fec/python/fec/polar/channel_construction.py | 4 | ||||
-rw-r--r-- | gr-fft/lib/fft.cc | 28 | ||||
-rw-r--r-- | gr-uhd/apps/uhd_app.py | 20 | ||||
-rw-r--r-- | gr-utils/python/modtool/modtool_makexml.py | 2 | ||||
-rw-r--r-- | gr-utils/python/modtool/modtool_rm.py | 2 |
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 <PORT> 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 > 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: |