From 74c3c9af5cdbcd4197ea939c5154c120450b896b Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 15 Nov 2021 15:58:52 +0100 Subject: Create build and install script for debian There is a bug in GR 3.8 that installs the blocks in the wrong dir. See: https://github.com/gnuradio/gnuradio/issues/5121 --- src/gr-fadingui/build.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 src/gr-fadingui/build.sh diff --git a/src/gr-fadingui/build.sh b/src/gr-fadingui/build.sh new file mode 100755 index 0000000..29697af --- /dev/null +++ b/src/gr-fadingui/build.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +mkdir -p build +cmake -DGR_PYTHON_DIR=/usr/lib/python3/dist-packages/ -GNinja -Bbuild +ninja -C build + +# install to system +sudo ninja -C build install -- cgit v1.2.1 From c5145aa6519e0787457253749ea76456a0fb0011 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 15 Nov 2021 16:19:23 +0100 Subject: Implement basic framer --- src/gr-fadingui/python/datasource.py | 22 +++++++++++++++++++--- src/shell.nix | 2 +- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/gr-fadingui/python/datasource.py b/src/gr-fadingui/python/datasource.py index ddce468..2a54ce3 100644 --- a/src/gr-fadingui/python/datasource.py +++ b/src/gr-fadingui/python/datasource.py @@ -19,6 +19,8 @@ # Boston, MA 02110-1301, USA. # +import io + import numpy as np from gnuradio import gr @@ -30,9 +32,10 @@ class datasource(gr.sync_block): gr.sync_block.__init__(self, name="datasource", in_sig=None, - out_sig=[np.dtype('256b')]) + out_sig=[np.dtype('{vec_len}b')]) # parameters + self.header_size = 11 self.vec_len = vec_len self.sock_addr = sock_addr self.file_list = file_list @@ -49,15 +52,28 @@ class datasource(gr.sync_block): self.fdata = np.fromfile(fname, np.byte) self.fsize = len(self.data) - # TODO: remove + # TODO: remove debugging statements print(f"datasource: loaded file size={self.fsize}, head:") print(self.fdata[:10]) + def make_frame(self, data_size): + # TODO: check that data_size is not too big + pilot = 0x1248 + header = f"p{pilot:04x}s{data_size:04x}d".encode("ascii") + arr = np.array(bytearray(header)) + + assert(len(arr) == self.header_size) + return arr + def work(self, input_items, output_items): out = output_items[0] if self.fpos + self.vec_len > self.fsize: - # TODO: implement padding with zeroes + rest = self.fsize - self.fpos + + out[:rest] = self.fdata[self.fpos:rest] + out[rest:] = 0 # TODO: replace with 01010101.. seq or scramble + self.fpos = 0 return 0 diff --git a/src/shell.nix b/src/shell.nix index b6351e8..666bab3 100644 --- a/src/shell.nix +++ b/src/shell.nix @@ -12,7 +12,7 @@ in mkShell { gnuradio python38Packages.setuptools # gnuradio block dev dependencies - cmake ninja pkg-config log4cpp mpir boost175 gmp volk + cmake ninja pkg-config log4cpp mpir boost175 gmp volk doxygen python38Packages.pybind11 ]) ++ (with pkgs.python38Packages; [ numpy -- cgit v1.2.1 From 6431cb7740d535c7de3ba8c308ba5fd9926eb2e2 Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 15 Nov 2021 17:52:40 +0100 Subject: Partially fix framer --- src/gr-fadingui/grc/fadingui_datasource.block.yml | 13 +- src/gr-fadingui/python/datasource.py | 46 +++-- tests/fadingui/QAM/qam_nogui.grc | 213 ++++++---------------- tests/fadingui/QAM/qam_nogui.py | 168 +++-------------- 4 files changed, 118 insertions(+), 322 deletions(-) diff --git a/src/gr-fadingui/grc/fadingui_datasource.block.yml b/src/gr-fadingui/grc/fadingui_datasource.block.yml index 67f0275..5f34591 100644 --- a/src/gr-fadingui/grc/fadingui_datasource.block.yml +++ b/src/gr-fadingui/grc/fadingui_datasource.block.yml @@ -1,10 +1,10 @@ id: fadingui_datasource -label: UI Data Source +label: UI Framed Data Source category: '[fadingui]' templates: imports: import fadingui - make: fadingui.datasource(vec_len=${vec_len}, sock_addr=${sock_addr}, file_list=${file_list}) + make: fadingui.datasource(vec_len=${vec_len}, header_len=${header_len}, sock_addr=${sock_addr}, file_list=${file_list}) # Make one 'parameters' list entry for every parameter you want settable from the GUI. # Keys include: @@ -15,7 +15,12 @@ parameters: - id: vec_len label: Vector length dtype: int - default: 512 + default: 501 + +- id: header_len + label: Header length + dtype: int + default: 11 - id: sock_addr label: Socket Address @@ -40,7 +45,7 @@ outputs: - label: out domain: stream dtype: byte - vlen: ${vec_len} + vlen: ${ vec_len + header_len } # 'file_format' specifies the version of the GRC yml format used in the file # and should usually not be changed. diff --git a/src/gr-fadingui/python/datasource.py b/src/gr-fadingui/python/datasource.py index 2a54ce3..1914d33 100644 --- a/src/gr-fadingui/python/datasource.py +++ b/src/gr-fadingui/python/datasource.py @@ -28,14 +28,19 @@ class datasource(gr.sync_block): """ Loads data from a file choosen in the graphical user interface. """ - def __init__(self, vec_len, sock_addr, file_list): + + HEADER_LEN = 11; + + def __init__(self, vec_len, header_len, sock_addr, file_list): + # FIXME: find a better solution + assert(header_len == datasource.HEADER_LEN) + gr.sync_block.__init__(self, name="datasource", in_sig=None, - out_sig=[np.dtype('{vec_len}b')]) + out_sig=[np.dtype(f'{vec_len + header_len}b')]) # parameters - self.header_size = 11 self.vec_len = vec_len self.sock_addr = sock_addr self.file_list = file_list @@ -45,40 +50,55 @@ class datasource(gr.sync_block): self.fsize = None self.fpos = 0 + # cache + self.header_cache = None + # TODO: make it possible to choose from UI self.load_file(file_list[0]) def load_file(self, fname): self.fdata = np.fromfile(fname, np.byte) - self.fsize = len(self.data) + self.fsize = len(self.fdata) # TODO: remove debugging statements print(f"datasource: loaded file size={self.fsize}, head:") print(self.fdata[:10]) - def make_frame(self, data_size): + def make_header(self, data_size): # TODO: check that data_size is not too big pilot = 0x1248 header = f"p{pilot:04x}s{data_size:04x}d".encode("ascii") - arr = np.array(bytearray(header)) - - assert(len(arr) == self.header_size) + arr = np.frombuffer(header, dtype=np.dtype("byte")) return arr def work(self, input_items, output_items): out = output_items[0] + print(self.fpos) if self.fpos + self.vec_len > self.fsize: + # FIXME: repair broken code below + self.fpos = 0 + return 0; + rest = self.fsize - self.fpos - out[:rest] = self.fdata[self.fpos:rest] - out[rest:] = 0 # TODO: replace with 01010101.. seq or scramble + # cannot use cached header + header = self.make_header(rest) + data = self.fdata[self.fpos:rest] + + frame_size = datasource.HEADER_LEN + rest + out[:] = np.concatenate([header, data]) self.fpos = 0 - return 0 + return rest - out[:] = self.fdata[self.fpos:self.fpos + self.vec_len] - self.fpos += self.vec_len + if self.header_cache == None: + self.header = self.make_header(self.vec_len) + data = self.fdata[self.fpos:self.fpos + self.vec_len] + + out[:] = np.concatenate([self.header, data]) + + self.fpos += self.vec_len return len(output_items[0]) diff --git a/tests/fadingui/QAM/qam_nogui.grc b/tests/fadingui/QAM/qam_nogui.grc index be412f0..681ec7f 100644 --- a/tests/fadingui/QAM/qam_nogui.grc +++ b/tests/fadingui/QAM/qam_nogui.grc @@ -8,7 +8,7 @@ options: description: '' gen_cmake: 'On' gen_linking: dynamic - generate_options: qt_gui + generate_options: no_gui hier_block_src_path: '.:' id: qam_nogui max_nouts: '0' @@ -41,7 +41,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [880, 256.0] + coordinate: [920, 252.0] rotation: 0 state: true - name: const @@ -59,28 +59,19 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [464, 608.0] + coordinate: [440, 604.0] rotation: 0 state: true - name: eq_gain - id: variable_qtgui_range + id: variable parameters: comment: '' - gui_hint: 'params@1: 0,0,1,1' - label: Equalizer Rate - min_len: '200' - orient: Qt.Horizontal - rangeType: float - start: '0' - step: '.001' - stop: '.1' - value: '.01' - widget: counter_slider + value: 10e-3 states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1584, 460.0] + coordinate: [1504, 452.0] rotation: 0 state: true - name: eq_mod @@ -92,7 +83,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1584, 392.0] + coordinate: [1504, 388.0] rotation: 0 state: true - name: eq_ntaps @@ -104,7 +95,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1664, 392.0] + coordinate: [1584, 388.0] rotation: 0 state: true - name: excess_bw @@ -116,28 +107,19 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [560, 272.0] + coordinate: [536, 268.0] rotation: 0 state: true - name: freq_offset - id: variable_qtgui_range + id: variable parameters: comment: '' - gui_hint: 'params@0: 1,0,1,1' - label: Frequency Offset - min_len: '200' - orient: Qt.Horizontal - rangeType: float - start: -100e-3 - step: 1e-3 - stop: 100e-3 value: '0' - widget: counter_slider states: bus_sink: false bus_source: false bus_structure: null - coordinate: [880, 460.0] + coordinate: [1008, 252.0] rotation: 0 state: true - name: nfilts @@ -149,49 +131,31 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1248, 480.0] + coordinate: [1184, 476.0] rotation: 0 state: true - name: noise_volt - id: variable_qtgui_range + id: variable parameters: comment: '' - gui_hint: 'params@0: 0,0,1,1' - label: Noise Voltage - min_len: '200' - orient: Qt.Horizontal - rangeType: float - start: '0' - step: '0.01' - stop: '1' - value: '0.0001' - widget: counter_slider + value: 100e-6 states: bus_sink: false bus_source: false bus_structure: null - coordinate: [752, 460.0] + coordinate: [920, 188.0] rotation: 0 state: true - name: phase_bw - id: variable_qtgui_range + id: variable parameters: comment: '' - gui_hint: 'params@1: 1,0,1,1' - label: Phase Bandwidth - min_len: '200' - orient: Qt.Horizontal - rangeType: float - start: '0' - step: '.01' - stop: '1' value: 2 * 3.141592653589793 / 100 - widget: counter_slider states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1888, 428.0] + coordinate: [1792, 428.0] rotation: 0 state: true - name: qam_const @@ -212,7 +176,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [464, 444.0] + coordinate: [440, 444.0] rotation: 0 state: true - name: rrc_taps @@ -224,7 +188,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1328, 480.0] + coordinate: [1264, 476.0] rotation: 0 state: true - name: samp_rate @@ -248,49 +212,43 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [464, 272.0] + coordinate: [440, 268.0] rotation: 0 state: true - name: time_offset - id: variable_qtgui_range + id: variable parameters: comment: '' - gui_hint: 'params@0: 0,1,1,1' - label: Timing Offset - min_len: '200' - orient: Qt.Horizontal - rangeType: float - start: '0.999' - step: '0.0001' - stop: '1.001' - value: '1.0' - widget: counter_slider + value: '1' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [752, 604.0] + coordinate: [1008, 188.0] rotation: 0 state: true - name: timing_loop_bw - id: variable_qtgui_range + id: variable parameters: comment: '' - gui_hint: 'params@0: 1,1,1,1' - label: Time Bandwidth - min_len: '200' - orient: Qt.Horizontal - rangeType: float - start: '0' - step: 10e-3 - stop: 200e-3 value: 2 * 3.141592653589793 / 100 - widget: counter_slider states: bus_sink: false bus_source: false bus_structure: null - coordinate: [1248, 556.0] + coordinate: [1184, 556.0] + rotation: 0 + state: true +- name: variable_4 + id: variable + parameters: + comment: '' + value: '0' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1312, 556.0] rotation: 0 state: true - name: blocks_null_sink_0 @@ -307,7 +265,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [2424, 416.0] + coordinate: [2336, 424.0] rotation: 0 state: true - name: blocks_throttle_0 @@ -326,7 +284,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [704, 360.0] + coordinate: [688, 356.0] rotation: 0 state: enabled - name: blocks_vector_to_stream_0 @@ -337,14 +295,14 @@ blocks: comment: '' maxoutbuf: '0' minoutbuf: '0' - num_items: '512' + num_items: '2048' type: byte vlen: '1' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [240, 360.0] + coordinate: [248, 360.0] rotation: 0 state: true - name: channels_channel_model_0 @@ -365,7 +323,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [880, 316.0] + coordinate: [920, 316.0] rotation: 0 state: enabled - name: digital_cma_equalizer_cc_0 @@ -384,7 +342,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1584, 288.0] + coordinate: [1504, 284.0] rotation: 0 state: true - name: digital_constellation_decoder_cb_0 @@ -400,7 +358,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [2224, 280.0] + coordinate: [2152, 276.0] rotation: 0 state: true - name: digital_constellation_modulator_0 @@ -421,7 +379,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [464, 336.0] + coordinate: [440, 332.0] rotation: 0 state: enabled - name: digital_costas_loop_cc_0 @@ -439,7 +397,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1888, 288.0] + coordinate: [1792, 280.0] rotation: 0 state: true - name: digital_diff_decoder_bb_0 @@ -455,7 +413,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [2224, 352.0] + coordinate: [2152, 340.0] rotation: 180 state: true - name: digital_map_bb_0 @@ -471,7 +429,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [2224, 424.0] + coordinate: [2152, 420.0] rotation: 0 state: true - name: digital_pfb_clock_sync_xxx_0 @@ -494,7 +452,7 @@ blocks: bus_sink: false bus_source: false bus_structure: null - coordinate: [1248, 308.0] + coordinate: [1184, 308.0] rotation: 0 state: true - name: fadingui_datasource_0 @@ -504,83 +462,16 @@ blocks: alias: '' comment: '' file_list: '["./lena512color.tiff"]' + header_len: '11' maxoutbuf: '0' minoutbuf: '0' sock_addr: udp:// - vec_len: '512' - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [40, 276.0] - rotation: 0 - state: true -- name: params - id: qtgui_tab_widget - parameters: - alias: '' - comment: '' - gui_hint: '' - label0: Channel - label1: Receiver - label10: Tab 10 - label11: Tab 11 - label12: Tab 12 - label13: Tab 13 - label14: Tab 14 - label15: Tab 15 - label16: Tab 16 - label17: Tab 17 - label18: Tab 18 - label19: Tab 19 - label2: Tab 2 - label3: Tab 3 - label4: Tab 4 - label5: Tab 5 - label6: Tab 6 - label7: Tab 7 - label8: Tab 8 - label9: Tab 9 - num_tabs: '2' - states: - bus_sink: false - bus_source: false - bus_structure: null - coordinate: [296, 12.0] - rotation: 0 - state: true -- name: plots - id: qtgui_tab_widget - parameters: - alias: '' - comment: '' - gui_hint: '' - label0: Constellations - label1: Frequency - label10: Tab 10 - label11: Tab 11 - label12: Tab 12 - label13: Tab 13 - label14: Tab 14 - label15: Tab 15 - label16: Tab 16 - label17: Tab 17 - label18: Tab 18 - label19: Tab 19 - label2: Time - label3: Tab 3 - label4: Tab 4 - label5: Tab 5 - label6: Tab 6 - label7: Tab 7 - label8: Tab 8 - label9: Tab 9 - num_tabs: '3' + vec_len: '2037' states: bus_sink: false bus_source: false bus_structure: null - coordinate: [448, 12.0] + coordinate: [64, 252.0] rotation: 0 state: true diff --git a/tests/fadingui/QAM/qam_nogui.py b/tests/fadingui/QAM/qam_nogui.py index a75ed18..0a3fe02 100755 --- a/tests/fadingui/QAM/qam_nogui.py +++ b/tests/fadingui/QAM/qam_nogui.py @@ -9,19 +9,6 @@ # Author: Pross Naoki, Halter Sara Cinzia # GNU Radio version: 3.8.2.0 -from distutils.version import StrictVersion - -if __name__ == '__main__': - import ctypes - import sys - if sys.platform.startswith('linux'): - try: - x11 = ctypes.cdll.LoadLibrary('libX11.so') - x11.XInitThreads() - except: - print("Warning: failed to XInitThreads()") - -from PyQt5 import Qt from gnuradio import blocks from gnuradio import channels from gnuradio.filter import firdes @@ -32,43 +19,13 @@ import signal from argparse import ArgumentParser from gnuradio.eng_arg import eng_float, intx from gnuradio import eng_notation -from gnuradio.qtgui import Range, RangeWidget import fadingui -from gnuradio import qtgui -class qam_nogui(gr.top_block, Qt.QWidget): +class qam_nogui(gr.top_block): def __init__(self): gr.top_block.__init__(self, "QAM") - Qt.QWidget.__init__(self) - self.setWindowTitle("QAM") - qtgui.util.check_set_qss() - try: - self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) - except: - pass - 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) - - self.settings = Qt.QSettings("GNU Radio", "qam_nogui") - - try: - if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): - self.restoreGeometry(self.settings.value("geometry").toByteArray()) - else: - self.restoreGeometry(self.settings.value("geometry")) - except: - pass ################################################## # Variables @@ -76,96 +33,26 @@ class qam_nogui(gr.top_block, Qt.QWidget): self.sps = sps = 4 self.nfilts = nfilts = 32 self.excess_bw = excess_bw = 350e-3 + self.variable_4 = variable_4 = 0 self.timing_loop_bw = timing_loop_bw = 2 * 3.141592653589793 / 100 - self.time_offset = time_offset = 1.0 + self.time_offset = time_offset = 1 self.samp_rate = samp_rate = 32000 self.rrc_taps = rrc_taps = firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), excess_bw, 45*nfilts) self.qam_const = qam_const = digital.constellation_rect([(-3-3j), (-1-3j), (1-3j), (3-3j), (-3-1j), (-1-1j), (1-1j), (3-1j), (-3+1j), (-1+1j), (1+1j), (3+1j), (-3+3j), (-1+3j), (1+3j), (3+3j)], [0, 4, 12, 8, 1, 5, 13, 9, 3, 7, 15, 11, 2, 6, 14, 10], 4, 1, 1, 1, 1).base() self.phase_bw = phase_bw = 2 * 3.141592653589793 / 100 - self.noise_volt = noise_volt = 0.0001 + self.noise_volt = noise_volt = 100e-6 self.freq_offset = freq_offset = 0 self.eq_ntaps = eq_ntaps = 15 self.eq_mod = eq_mod = 1 - self.eq_gain = eq_gain = .01 + self.eq_gain = eq_gain = 10e-3 self.const = const = digital.constellation_16qam().base() self.chn_taps = chn_taps = [1.0 + 0.0j, ] ################################################## # Blocks ################################################## - self.params = Qt.QTabWidget() - self.params_widget_0 = Qt.QWidget() - self.params_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.params_widget_0) - self.params_grid_layout_0 = Qt.QGridLayout() - self.params_layout_0.addLayout(self.params_grid_layout_0) - self.params.addTab(self.params_widget_0, 'Channel') - self.params_widget_1 = Qt.QWidget() - self.params_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.params_widget_1) - self.params_grid_layout_1 = Qt.QGridLayout() - self.params_layout_1.addLayout(self.params_grid_layout_1) - self.params.addTab(self.params_widget_1, 'Receiver') - self.top_grid_layout.addWidget(self.params) - self._timing_loop_bw_range = Range(0, 200e-3, 10e-3, 2 * 3.141592653589793 / 100, 200) - self._timing_loop_bw_win = RangeWidget(self._timing_loop_bw_range, self.set_timing_loop_bw, 'Time Bandwidth', "counter_slider", float) - self.params_grid_layout_0.addWidget(self._timing_loop_bw_win, 1, 1, 1, 1) - for r in range(1, 2): - self.params_grid_layout_0.setRowStretch(r, 1) - for c in range(1, 2): - self.params_grid_layout_0.setColumnStretch(c, 1) - self._time_offset_range = Range(0.999, 1.001, 0.0001, 1.0, 200) - self._time_offset_win = RangeWidget(self._time_offset_range, self.set_time_offset, 'Timing Offset', "counter_slider", float) - self.params_grid_layout_0.addWidget(self._time_offset_win, 0, 1, 1, 1) - for r in range(0, 1): - self.params_grid_layout_0.setRowStretch(r, 1) - for c in range(1, 2): - self.params_grid_layout_0.setColumnStretch(c, 1) - self._phase_bw_range = Range(0, 1, .01, 2 * 3.141592653589793 / 100, 200) - self._phase_bw_win = RangeWidget(self._phase_bw_range, self.set_phase_bw, 'Phase Bandwidth', "counter_slider", float) - self.params_grid_layout_1.addWidget(self._phase_bw_win, 1, 0, 1, 1) - for r in range(1, 2): - self.params_grid_layout_1.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_1.setColumnStretch(c, 1) - self._noise_volt_range = Range(0, 1, 0.01, 0.0001, 200) - self._noise_volt_win = RangeWidget(self._noise_volt_range, self.set_noise_volt, 'Noise Voltage', "counter_slider", float) - self.params_grid_layout_0.addWidget(self._noise_volt_win, 0, 0, 1, 1) - for r in range(0, 1): - self.params_grid_layout_0.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_0.setColumnStretch(c, 1) - self._freq_offset_range = Range(-100e-3, 100e-3, 1e-3, 0, 200) - self._freq_offset_win = RangeWidget(self._freq_offset_range, self.set_freq_offset, 'Frequency Offset', "counter_slider", float) - self.params_grid_layout_0.addWidget(self._freq_offset_win, 1, 0, 1, 1) - for r in range(1, 2): - self.params_grid_layout_0.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_0.setColumnStretch(c, 1) - self._eq_gain_range = Range(0, .1, .001, .01, 200) - self._eq_gain_win = RangeWidget(self._eq_gain_range, self.set_eq_gain, 'Equalizer Rate', "counter_slider", float) - self.params_grid_layout_1.addWidget(self._eq_gain_win, 0, 0, 1, 1) - for r in range(0, 1): - self.params_grid_layout_1.setRowStretch(r, 1) - for c in range(0, 1): - self.params_grid_layout_1.setColumnStretch(c, 1) - self.plots = Qt.QTabWidget() - self.plots_widget_0 = Qt.QWidget() - self.plots_layout_0 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.plots_widget_0) - self.plots_grid_layout_0 = Qt.QGridLayout() - self.plots_layout_0.addLayout(self.plots_grid_layout_0) - self.plots.addTab(self.plots_widget_0, 'Constellations') - self.plots_widget_1 = Qt.QWidget() - self.plots_layout_1 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.plots_widget_1) - self.plots_grid_layout_1 = Qt.QGridLayout() - self.plots_layout_1.addLayout(self.plots_grid_layout_1) - self.plots.addTab(self.plots_widget_1, 'Frequency') - self.plots_widget_2 = Qt.QWidget() - self.plots_layout_2 = Qt.QBoxLayout(Qt.QBoxLayout.TopToBottom, self.plots_widget_2) - self.plots_grid_layout_2 = Qt.QGridLayout() - self.plots_layout_2.addLayout(self.plots_grid_layout_2) - self.plots.addTab(self.plots_widget_2, 'Time') - self.top_grid_layout.addWidget(self.plots) - self.fadingui_datasource_0 = fadingui.datasource(vec_len=512, sock_addr='udp://', file_list=["./lena512color.tiff"]) + self.fadingui_datasource_0 = fadingui.datasource(vec_len=2037, header_len=11, sock_addr='udp://', file_list=["./lena512color.tiff"]) self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps * 1.001, timing_loop_bw, rrc_taps, nfilts, nfilts/2, 1.5, sps) self.digital_map_bb_0 = digital.map_bb([0, 1, 3, 2]) self.digital_diff_decoder_bb_0 = digital.diff_decoder_bb(4) @@ -187,7 +74,7 @@ class qam_nogui(gr.top_block, Qt.QWidget): taps=chn_taps, noise_seed=0, block_tags=False) - self.blocks_vector_to_stream_0 = blocks.vector_to_stream(gr.sizeof_char*1, 512) + self.blocks_vector_to_stream_0 = blocks.vector_to_stream(gr.sizeof_char*1, 2048) self.blocks_throttle_0 = blocks.throttle(gr.sizeof_gr_complex*1, samp_rate,True) self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_char*1) @@ -209,11 +96,6 @@ class qam_nogui(gr.top_block, Qt.QWidget): self.connect((self.fadingui_datasource_0, 0), (self.blocks_vector_to_stream_0, 0)) - def closeEvent(self, event): - self.settings = Qt.QSettings("GNU Radio", "qam_nogui") - self.settings.setValue("geometry", self.saveGeometry()) - event.accept() - def get_sps(self): return self.sps @@ -235,6 +117,12 @@ class qam_nogui(gr.top_block, Qt.QWidget): self.excess_bw = excess_bw self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), self.excess_bw, 45*self.nfilts)) + def get_variable_4(self): + return self.variable_4 + + def set_variable_4(self, variable_4): + self.variable_4 = variable_4 + def get_timing_loop_bw(self): return self.timing_loop_bw @@ -330,34 +218,26 @@ class qam_nogui(gr.top_block, Qt.QWidget): def main(top_block_cls=qam_nogui, options=None): if gr.enable_realtime_scheduling() != gr.RT_OK: print("Error: failed to enable real-time scheduling.") - - if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"): - style = gr.prefs().get_string('qtgui', 'style', 'raster') - Qt.QApplication.setGraphicsSystem(style) - qapp = Qt.QApplication(sys.argv) - tb = top_block_cls() - tb.start() - - tb.show() - def sig_handler(sig=None, frame=None): - Qt.QApplication.quit() + tb.stop() + tb.wait() + + sys.exit(0) signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) - timer = Qt.QTimer() - timer.start(500) - timer.timeout.connect(lambda: None) + tb.start() - def quitting(): - tb.stop() - tb.wait() + try: + input('Press Enter to quit: ') + except EOFError: + pass + tb.stop() + tb.wait() - qapp.aboutToQuit.connect(quitting) - qapp.exec_() if __name__ == '__main__': main() -- cgit v1.2.1 From 785afc898559833cd5dfb7415bdb0da52942886e Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Mon, 15 Nov 2021 18:14:19 +0100 Subject: Create UI Plot sink block --- src/gr-fadingui/grc/CMakeLists.txt | 2 +- .../grc/fadingui_dearpygui_sink.block.yml | 38 ++++++++++++++++++++ src/gr-fadingui/python/CMakeLists.txt | 3 +- src/gr-fadingui/python/__init__.py | 1 + src/gr-fadingui/python/dearpygui_sink.py | 41 ++++++++++++++++++++++ tests/fadingui/QAM/qam_nogui.grc | 20 +++++++++-- 6 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 src/gr-fadingui/grc/fadingui_dearpygui_sink.block.yml create mode 100644 src/gr-fadingui/python/dearpygui_sink.py diff --git a/src/gr-fadingui/grc/CMakeLists.txt b/src/gr-fadingui/grc/CMakeLists.txt index e4b2ee9..98713e8 100644 --- a/src/gr-fadingui/grc/CMakeLists.txt +++ b/src/gr-fadingui/grc/CMakeLists.txt @@ -19,5 +19,5 @@ # Boston, MA 02110-1301, USA. install(FILES fadingui_datasource.block.yml - DESTINATION share/gnuradio/grc/blocks + fadingui_dearpygui_sink.block.yml DESTINATION share/gnuradio/grc/blocks ) diff --git a/src/gr-fadingui/grc/fadingui_dearpygui_sink.block.yml b/src/gr-fadingui/grc/fadingui_dearpygui_sink.block.yml new file mode 100644 index 0000000..3712be4 --- /dev/null +++ b/src/gr-fadingui/grc/fadingui_dearpygui_sink.block.yml @@ -0,0 +1,38 @@ +id: fadingui_dearpygui_sink +label: UI Sink +category: '[fadingui]' + +templates: + imports: import fadingui + make: fadingui.dearpygui_sink() + +# Make one 'parameters' list entry for every parameter you want settable from the GUI. +# Keys include: +# * id (makes the value accessible as \$keyname, e.g. in the make entry) +# * label (label shown in the GUI) +# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...) +parameters: +- id: sock_addr + label: Socket address + dtype: string + default: udp:// + +- id: ui_element_id + label: UI element ID + dtype: raw + + +# Make one 'inputs' list entry per input and one 'outputs' list entry per output. +# Keys include: +# * label (an identifier for the GUI) +# * domain (optional - stream or message. Default is stream) +# * dtype (e.g. int, float, complex, byte, short, xxx_vector, ...) +# * vlen (optional - data stream vector length. Default is 1) +# * optional (optional - set to 1 for optional inputs. Default is 0) +inputs: +- label: in + dtype: complex + +# 'file_format' specifies the version of the GRC yml format used in the file +# and should usually not be changed. +file_format: 1 diff --git a/src/gr-fadingui/python/CMakeLists.txt b/src/gr-fadingui/python/CMakeLists.txt index 4ab9bbc..27b5f4b 100644 --- a/src/gr-fadingui/python/CMakeLists.txt +++ b/src/gr-fadingui/python/CMakeLists.txt @@ -33,7 +33,7 @@ GR_PYTHON_INSTALL( FILES __init__.py datasource.py - DESTINATION ${GR_PYTHON_DIR}/fadingui + dearpygui_sink.py DESTINATION ${GR_PYTHON_DIR}/fadingui ) ######################################################################## @@ -43,3 +43,4 @@ include(GrTest) set(GR_TEST_TARGET_DEPS gnuradio-fadingui) set(GR_TEST_PYTHON_DIRS ${CMAKE_BINARY_DIR}/swig) +GR_ADD_TEST(qa_dearpygui_sink ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/qa_dearpygui_sink.py) diff --git a/src/gr-fadingui/python/__init__.py b/src/gr-fadingui/python/__init__.py index 6cfa23b..d551a71 100644 --- a/src/gr-fadingui/python/__init__.py +++ b/src/gr-fadingui/python/__init__.py @@ -33,5 +33,6 @@ except ImportError: # import any pure python here from .datasource import datasource +from .dearpygui_sink import dearpygui_sink # diff --git a/src/gr-fadingui/python/dearpygui_sink.py b/src/gr-fadingui/python/dearpygui_sink.py new file mode 100644 index 0000000..2b8e9fb --- /dev/null +++ b/src/gr-fadingui/python/dearpygui_sink.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2021 Naoki Pross. +# +# This is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3, or (at your option) +# any later version. +# +# This software is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this software; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + + +import numpy as np +from gnuradio import gr + +class dearpygui_sink(gr.sync_block): + """ + docstring for block dearpygui_sink + """ + def __init__(self): + gr.sync_block.__init__(self, + name="dearpygui_sink", + in_sig=[np.complex64], + out_sig=None) + + + def work(self, input_items, output_items): + in0 = input_items[0] + # <+signal processing here+> + return len(input_items[0]) + diff --git a/tests/fadingui/QAM/qam_nogui.grc b/tests/fadingui/QAM/qam_nogui.grc index 681ec7f..be2f20a 100644 --- a/tests/fadingui/QAM/qam_nogui.grc +++ b/tests/fadingui/QAM/qam_nogui.grc @@ -337,7 +337,7 @@ blocks: modulus: eq_mod mu: eq_gain num_taps: eq_ntaps - sps: sps + sps: '1' states: bus_sink: false bus_source: false @@ -444,8 +444,8 @@ blocks: max_dev: '1.5' maxoutbuf: '0' minoutbuf: '0' - osps: sps - sps: sps * 1.001 + osps: '1' + sps: sps taps: rrc_taps type: ccf states: @@ -474,6 +474,19 @@ blocks: coordinate: [64, 252.0] rotation: 0 state: true +- name: fadingui_dearpygui_sink_0 + id: fadingui_dearpygui_sink + parameters: + affinity: '' + alias: '' + comment: '' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [2120, 200.0] + rotation: 0 + state: true connections: - [blocks_throttle_0, '0', channels_channel_model_0, '0'] @@ -483,6 +496,7 @@ connections: - [digital_constellation_decoder_cb_0, '0', digital_diff_decoder_bb_0, '0'] - [digital_constellation_modulator_0, '0', blocks_throttle_0, '0'] - [digital_costas_loop_cc_0, '0', digital_constellation_decoder_cb_0, '0'] +- [digital_costas_loop_cc_0, '0', fadingui_dearpygui_sink_0, '0'] - [digital_diff_decoder_bb_0, '0', digital_map_bb_0, '0'] - [digital_map_bb_0, '0', blocks_null_sink_0, '0'] - [digital_pfb_clock_sync_xxx_0, '0', digital_cma_equalizer_cc_0, '0'] -- cgit v1.2.1