Interfacing Hardware with a C++ OOT Module

This page aims to give a rough overview about what needs to be considered developing a GNURadio OOT module, that accesses hardware as for instance a SDR.

Using gr::block Facilities
Luckily, the class gr::block provides functions, that can be used to initialize and deinitialize hardware. These member functions are virtual bool start  and virtual bool stop . start  is generally used to initialize the hardware and is not coupled with the block construction, when the hole flowgraph is instantiated, i.e. the scheduler can take up working without having to wait for the hardware. The constructor of the block in the module is called before start  is invoked. stop  facilitates hardware deinitialization, such as turning off a transceiver, destroying a stream etc. GNURadio calls stop  when something goes wrong, for instance when a exception is thrown in the work  function. However, one can no solely trust on this mechanism as it seems not to be called when start  fails. One work around might be to call stop  oneself as part of the exception handling in a catch block. It is in any case better to use exceptions combined with these two functions instead of relying on constructor and destructor designing blocks to interface with hardware. When a flowgraph is exited normally (e.g. using your preferred window manager), the blocks destructors are called as well as the stop  function of your hardware I/O block, which closes the connection to your device properly. It is a well-known fact, that throwing exceptions in a destructor can be dangerous (cf. here). This is the same with the stop  function. If the exception is allowed to escape the function std::terminate might be called, which is something nobody wants.