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 (limited to 'src') 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(-) (limited to 'src') 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 ++++++++++++++++------- 2 files changed, 42 insertions(+), 17 deletions(-) (limited to 'src') 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]) -- 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 ++++++++++++++++++++++ 5 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/gr-fadingui/grc/fadingui_dearpygui_sink.block.yml create mode 100644 src/gr-fadingui/python/dearpygui_sink.py (limited to 'src') 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]) + -- cgit v1.2.1