GnuRadio - Eigene Blöcke

Sollte Gnu-Radio nicht die gewünschte Funktion als Block anbieten, so bietet Gnu-Radio auch die Möglichkeit sich selbst einen
eigenen Block zu erzeugen. Dazu wird das sogenannte GR-Modtool mit der Gnu-Radio-Software mitgeliefert, welches einem bei
der Erzeugung eines neuen Blockes unterstützt und fertige Code-Gerüste liefert. Dabei kann gewählt werden, ob der Block in der
Programmiersprache C++ oder in Python implementiert werden will. 

Im Folgenden wird die Erstellung eines einfachen File-Sink-Blocks erläutert, wobei nur auf den C++-Weg eingegangen wird.

1.) Zu Beginn muss ein neues Out-Of-Tree Modul, kurz OOT-Modul, erzeugt werden, in welches dann Blöcke eingefügt werden können.

Diese Anweisung erzeugt folgende Verzeichnisstruktur:

2.) Als nächstes wird der eigentliche Block in das OOT-Modul hinzugefügt.

Dabei müssen ein paar Einstellungen getroffen werden, welche dem Tool beim Erstellen des Code-Gerüstes helfen:

                 ● Enter code type: 
                 Hier wird der Block-Typ festgelegt (general, source, sink, …), je nach Typ kann Tool bereits Code und 

                 Funktionen vorbereiten

 

                 ● Language:

                 Gewünschte Programmiersprache (C++ oder Python)

 

                 ● Enter valid argument list, including default arguments: ….
                 Parameter, mit denen der Block konfiguriert wird
                 Für eine simple Sink z.B.: 
                               ♠ itemsize: Größe der einzelnen Daten, z.B. 1 für Byte
                               ♠ filename: Dateiname (+Pfad)

                 ● Add Python/C++ QA code? [y/n]
                 Hier bietet Gnu-Radio die Möglichkeit, Code zu generieren um einfacher Testcases zu verfassen, damit der erzeugte
                 Block getestet 
werden kann

Erzeugte Dateien:

               my_file_sink_impl.h:
                 Klassendefinition der Block-Implementierung

                 ● my_file_sink_impl.cpp:
                 Eigentliche Implementierung des Blocks

              ● my_file_sink.h:
                 Schnittstelle nach außen, welche das Erzeugen des Blocks mit der Funktion make() bereitstellt

                 ● tutorial_my_file_sink.xml:
                 Enthält den XML-Code, der beschreibt, wie der Block im Gnu-Radio-Companion dargestellt wird

3.) Als nächstes wird der Block implementiert in my_file_sink_impl.cc

Konstruktor:

Dabei muss die minimale und maximale Anzahl an Input- und Output-Ports festgelegt werden beim Funktionsaufruf von
gr::io_signature::make() mit den Parametern MIN_IN/OUT und MAX_IN/OUT

Weiters muss auch noch der Datentyp bei ITYPE eingetragen werden. In diesem Fall ist bei der 2. Make-funktion alles 0,
da es keinen Output gibt. Für den Input wird die Port-Anzahl auf 1 gesetzt und „itemsize“ als Datenlänge verwendet

In der work()-Funktion geschieht die eigentliche Implementierung:

In ITYPE muss der Datentyp eingetragen werden, wie die Input-Daten interpretiert werden
           ● input_items…       Input Daten, werden gelesen
           ● output_items …   Output-Datenstream, darauf wird geschrieben
           ● noutput_items … Anzahl an vorhandenen Input-Daten

Rückgabewert der Funktion ist die Anzahl an erzeugten Daten

4.) Als nächster Schritt muss das erzeugte XML-File angepasst werden
Darin wird bestimmt wie der Block im Gnu-Radio-Companion dargestellt wird und wie die
einstellbaren Parameter konfiguriert werden können

D.h. es müssen alle Parameter definiert werden und die jeweiligen Ein- und Ausgänge

In unserem Fall benötigen wir die Parameter itemsize (int) und filename (file_open = Öffnet Dateiexplorer)
und nur einen Eingang vom Typ „byte“

5.) Zuletzt muss der implementierte Block noch kompiliert und in Gnu-Radio eingebaut werden.
Dazu werden folgende Befehle benötigt:

# mkdir build
# cd build
# cmake ..

# make

# sudo make install

# sudo ldconfig

Zuerst wird ein neues Verzeichnis „build“ erstellt und in dieses gewechselt. Danach wird der Block kompiliert und
in die Gnu-Radio-Verzeichnisstruktur eingefügt. Mit „sudo ldconfig“ wird die Gnu-Radio Konfiguration aktualisiert,
damit der Block im Companion angezeigt wird.

Jetzt ist der Block im Gnu-Radio-Companion zu sehen:

Close Menu