diff options
-rw-r--r-- | gnuradio-core/src/lib/filter/gr_single_pole_iir.h | 4 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_quadrature_demod_cf.h | 2 | ||||
-rw-r--r-- | gnuradio-core/src/lib/general/gr_quadrature_demod_cf.i | 4 | ||||
-rw-r--r-- | gr-uhd/lib/gr_uhd_usrp_source.cc | 34 | ||||
-rw-r--r-- | grc/blocks/gr_quadrature_demod_cf.xml | 1 | ||||
-rw-r--r-- | grc/python/flow_graph.tmpl | 11 |
6 files changed, 39 insertions, 17 deletions
diff --git a/gnuradio-core/src/lib/filter/gr_single_pole_iir.h b/gnuradio-core/src/lib/filter/gr_single_pole_iir.h index da919b35c..8781065d4 100644 --- a/gnuradio-core/src/lib/filter/gr_single_pole_iir.h +++ b/gnuradio-core/src/lib/filter/gr_single_pole_iir.h @@ -71,7 +71,7 @@ public: d_prev_output = 0; } - o_type prev_output () { return d_prev_output; } + o_type prev_output () const { return d_prev_output; } protected: tap_type d_alpha; @@ -155,7 +155,7 @@ public: d_prev_output = 0; } - gr_complexd prev_output () { return d_prev_output; } + gr_complexd prev_output () const { return d_prev_output; } protected: double d_alpha; diff --git a/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.h b/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.h index a29acd628..df6de93d5 100644 --- a/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.h +++ b/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.h @@ -44,6 +44,8 @@ class gr_quadrature_demod_cf : public gr_sync_block float d_gain; public: + void set_gain(float gain) { d_gain = gain; } + float gain() const { return d_gain; } int work (int noutput_items, gr_vector_const_void_star &input_items, diff --git a/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.i b/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.i index fbd45dcf8..d9f338daa 100644 --- a/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.i +++ b/gnuradio-core/src/lib/general/gr_quadrature_demod_cf.i @@ -27,4 +27,8 @@ gr_quadrature_demod_cf_sptr gr_make_quadrature_demod_cf (float gain); class gr_quadrature_demod_cf : public gr_sync_block { gr_quadrature_demod_cf (float gain); + +public: + void set_gain(float gain) { d_gain = gain; } + float gain() const { return d_gain; } }; diff --git a/gr-uhd/lib/gr_uhd_usrp_source.cc b/gr-uhd/lib/gr_uhd_usrp_source.cc index 9983489c3..669f890ea 100644 --- a/gr-uhd/lib/gr_uhd_usrp_source.cc +++ b/gr-uhd/lib/gr_uhd_usrp_source.cc @@ -182,19 +182,37 @@ public: gr_vector_const_void_star &input_items, gr_vector_void_star &output_items ){ - //wait for a packet to become available + //In order to allow for low-latency: + //We receive all available packets without timeout. + //This call can timeout under regular operation... size_t num_samps = _dev->get_device()->recv( output_items, noutput_items, _metadata, - _type, uhd::device::RECV_MODE_ONE_PACKET, 1.0 + _type, uhd::device::RECV_MODE_FULL_BUFF, 0.0 ); + //If receive resulted in a timeout condition: + //We now receive a single packet with a large timeout. + if (_metadata.error_code == uhd::rx_metadata_t::ERROR_CODE_TIMEOUT){ + num_samps = _dev->get_device()->recv( + output_items, noutput_items, _metadata, + _type, uhd::device::RECV_MODE_ONE_PACKET, 1.0 + ); + } + //handle possible errors conditions switch(_metadata.error_code){ case uhd::rx_metadata_t::ERROR_CODE_NONE: + //TODO insert tag for time stamp break; + case uhd::rx_metadata_t::ERROR_CODE_TIMEOUT: + //Assume that the user called stop() on the flow graph. + //However, a timeout can occur under error conditions. + return WORK_DONE; + case uhd::rx_metadata_t::ERROR_CODE_OVERFLOW: //ignore overflows and try work again + //TODO insert tag for overflow return work(noutput_items, input_items, output_items); default: @@ -204,18 +222,6 @@ public: return num_samps; } - //advance the pointers and count by num_samps - noutput_items -= num_samps; - for (size_t i = 0; i < _nchan; i++){ - _tmp_buffs[i] = static_cast<char *>(output_items[i]) + num_samps*_type.size; - } - - //receive all available packets without timeout - num_samps += _dev->get_device()->recv( - _tmp_buffs, noutput_items, _metadata, - _type, uhd::device::RECV_MODE_FULL_BUFF, 0.0 - ); - return num_samps; } diff --git a/grc/blocks/gr_quadrature_demod_cf.xml b/grc/blocks/gr_quadrature_demod_cf.xml index a0e630c7e..fad0b3879 100644 --- a/grc/blocks/gr_quadrature_demod_cf.xml +++ b/grc/blocks/gr_quadrature_demod_cf.xml @@ -9,6 +9,7 @@ <key>gr_quadrature_demod_cf</key> <import>from gnuradio import gr</import> <make>gr.quadrature_demod_cf($gain)</make> + <callback>set_gain($gain)</callback> <param> <name>Gain</name> <key>gain</key> diff --git a/grc/python/flow_graph.tmpl b/grc/python/flow_graph.tmpl index d5e53b52b..0878be4ba 100644 --- a/grc/python/flow_graph.tmpl +++ b/grc/python/flow_graph.tmpl @@ -65,9 +65,18 @@ class $(class_name)(gr.top_block, Qt.QWidget): Qt.QWidget.__init__(self) self.setWindowTitle("$title") self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) - self.top_layout = Qt.QVBoxLayout(self) + self.top_scroll_layout = Qt.QVBoxLayout() + self.setLayout(self.top_scroll_layout) + self.top_scroll = Qt.QScrollArea() + self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame) + self.top_scroll_layout.addWidget(self.top_scroll) + self.top_scroll.setWidgetResizable(True) + self.top_widget = Qt.QWidget() + self.top_scroll.setWidget(self.top_widget) + self.top_layout = Qt.QVBoxLayout(self.top_widget) self.top_grid_layout = Qt.QGridLayout() self.top_layout.addLayout(self.top_grid_layout) + #elif $generate_options == 'no_gui' class $(class_name)(gr.top_block): |