discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Modifying existing GNURadio blocks


From: Marcus Müller
Subject: Re: Modifying existing GNURadio blocks
Date: Sat, 30 Dec 2023 14:16:34 +0100
User-agent: Mozilla Thunderbird

Heyo Kimmo,

sorry for the delayed response:

On 29.12.23 01:00, Kimmo Lehtinen wrote:
I would like to make modifications to the following two GNURadio blocks:
1) QT GUI number sink-------------------------------
I would like to modify it so that it can also display integers and strings. Currently it can display floats, shorts and bytes.
I raised an issue about this at the Github page of GNURadio, and I got the following reply:"A number of GR blocks infer type from item size, and that's what this block does (in its constructor). Unfortunately, float and int32 are the same size, so int32 is not usable.It would be possible to add another constructor that uses an explicit type instead of item size."

Warning: this is probably more involved than you hoped for. If you've worked with C++ before: No problem, you can at any point always ask for help. It's also super helpful to use "Draft PR" on github to share your current state of affairs!

If you haven't: I think this might be a bit too hard.

Yep, you would need to copy the make function as declared in number_sink.h in [0]:

    static sptr make(size_t itemsize,
                     float average = 0,
                     graph_t graph_type = NUM_GRAPH_HORIZ,
                     int nconnections = 1,
                     QWidget* parent = NULL);

to a second make function that has a different signature, for example

    static sptr make(item_type_t itemtype,
                     float average = 0,
                     graph_t graph_type = NUM_GRAPH_HORIZ,
                     int nconnections = 1,
                     QWidget* parent = NULL);

where item_type_t is a "Scoped enum"/class enum [1]; something like, within number_sink class,

enum class item_type_t { FLOAT, INT32 , INT16, INT8 }; // or whatever types you want to support

Then you would actually need to implement that in number_sink_impl.cc like [2]. But for that you need to modify the actual constructor to not take size_t itemsize as argument [3], but item_type_t itemtype!

You would add a field const item_type_t d_itemtype and remove d_itemsize in number_sink_impl.h [4] and add it to the initializer list [5]; you'd want a switch()/case construct to set the alignment_multiple [6].

Then, you replace the switch (d_itemsize) in get_item [7] with an appropriate switch(d_itemtype).

Test it successfully compiles!

Now you only need to do two things to gr-qtgui/python/qtgui/bindings/number_sink_python.cc

  1. add the new class enum item_type_t to bind_number_sink [8],
  2. add the new make function:
    1. modify the existing definition and
    2. copy it to replace size_t itemsize with number_sink::item_type_t itemtype

In detail: following [9], you need to change

    py::class_<number_sink,
               gr::sync_block,
               gr::block,
               gr::basic_block,
               std::shared_ptr<number_sink>>(m, "number_sink", D(number_sink))

        .def(py::init(&number_sink::make), 
        …………………

into

    py::class_<number_sink,
               gr::sync_block,
               gr::block,
               gr::basic_block,
               std::shared_ptr<number_sink>>
        number_sink_wrapper(m, "number_sink", D(number_sink));

    py::enum_<number_sink::item_type_t>(number_sink_wrapper, "item_type_t");

    number_sink_wrapper
        .def(py::init(&number_sink::make),
        ……………………

Please compile the result (make sure to make clean before, we've changed bindings), and test it works, from python!

Now, we need to tell GRC that there's a new way to create a Qt GUI number sink! So, modify qtgui_humber_sink.block.yml [10] to use the new make function instead of the old (both in the python templates: directive, and in the C++ cpp_templates: directive), and add the integer option to id: type. Then make; make install and open GRC and try!

Definitely make sure you also add an example GRC flowgraph to the gr-qtgui/examples director.

Then, please make a commit with a title that starts with "qtgui: ", for example "qtgui: add type-based number_sink, allowing for int32", and don't forget to use the -s flag with git commit, so that your commit is signed off! Push to your fork of GNU Radio, and open a Pull Request against main.

[0] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/include/gnuradio/qtgui/number_sink.h#L55-L68
[1] https://en.cppreference.com/w/cpp/language/enum#Scoped_enumerations
[2] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/lib/number_sink_impl.cc#L38-L43
[3] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/lib/number_sink_impl.cc#L46
[4] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/lib/number_sink_impl.h#L28
[5] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/lib/number_sink_impl.cc#L50
[6] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/lib/number_sink_impl.cc#L64
[8] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/python/qtgui/bindings/number_sink_python.cc
[9] https://pybind11.readthedocs.io/en/stable/classes.html#enumerations-and-internal-types
[10] https://github.com/gnuradio/gnuradio/blob/86af478a88cf0521b023ad2c924c74ea38d9adcf/gr-qtgui/grc/qtgui_number_sink.block.yml

If displaying strings, there is no sense to have a bar graph, which is currently an option in the 'QT GUI number sink' block. Thus, there could be a separate block for displaying strings, without an option for  a bar graph. 
Qt GUI Label can already do that; since there's no possibility to send strings on GNU Radio streams, the question is more: where do your strings come from!
2) QT GUI time raster sink-----------------------------------
I would like to modify it so that the parameters 'x-axis start value' and 'x-axis end value' can be changed during runtime. 
sounds like a good idea.
For example, in the 'QT GUI vector sink' block the corresponding parameters can be changed during runtime. 

I understand that the best way to make the modifications is to change the code and then recompile the whole GNURadio.
yes

The problem is that I cannot write C++ code...

So, you really can't :( I think this really means that hopefully someone with time finds this email and implements that!

Is there anyone willing to change the code ?   Or at least give good instructions how to do that. 

I think these modifications would be useful also to other GNURadio users :-)

Ideally, you'd open a Feature Request on github,

https://github.com/gnuradio/gnuradio/issues/new?assignees=&labels=Feature+Request&projects=&template=feature_request.yml

You can simply copy and paste your email into feature description, and paste my reply into "More information", preceded by "Marcus says:"


Best,
Marcus


reply via email to

[Prev in Thread] Current Thread [Next in Thread]