If you're converting from GNU Radio 3.7, you can automatically convert
your .xml files into .yml files with the command:
gr_modtool update --complete
Just run it in the old OOT directory and copy over the .yml files to
your new OOT. It does a very good (although not always perfect) job of
converting.
Ron
On 2/4/21 14:37, Gavin Jacobs wrote:
I made some progress on this and now I have my OOT module/block
working on Ubuntu 20.4, GNU Radio 3.9, written in C++, with callbacks
and variable # of inputs.
There are two key things to report.
First is the workflow. None of the tutorials on the wiki (that I
found) were complete, but eventually I got it working as follows:
cd <your desired base for modules>
gr_modtool newmod
/* < choose modulename > */
cd gr-modulename
gr_modtool add
/* < answer questions about blockname > */
/* < edit files:
./include/modulename/blockname.h
./lib/blockname_impl.h
./lib/blockname_impl.cc
./grc/modulename_blockname.block.yml
> */
gr_modtool bind blockname
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig
NB - the 'bind' step must be done AFTER you edit the blockname.h file,
and BEFORE you run cmake. So, if you make a mistake in the blockname.h
file, you have to delete the build directory and go back to the bind
step in the above sequence.
Second, the description of how to configure the yml file did not
address variable number of inputs, nor callbacks. Here is a working
example that shows both:
id: stream_select
label: Select
category: '[Stream]'
templates:
imports: import stream
make: stream.select(${qty}, ${ins})
callbacks:
- set_ins(${ins})
# 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: qty
label: 'Number of Inputs'
dtype: int
default: 2
- id: ins
label: 'Input Selector'
dtype: int
default: 0
# 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: float
multiplicity: ${ qty }
outputs:
- label: out
dtype: float
# 'file_format' specifies the version of the GRC yml format used in
the file
# and should usually not be changed.
file_format: 1
NB - I should have used a better id for the second parameter (ins) -
do not confuse that with the in and out definitions.
Hope that helps,
Gavin