Hi all,

The story is this:

I always add all the necessary gr_modtool created files to a new project in
qt-creator named "pre_gr" and develop a new OOT block there. Then, by
building from source, I add the block to GRC, test it, and use it. This way
I have developed some nontrivial practical modems.

BUT

I decided to be more organized by using more object-oriented features.
The problem is: the code in qt-creator compiled OK but when I add the block
to GRC, I get this error:

Generating: '/home/ali/grdrills/top_block.py'
Executing: /usr/bin/python2 -u /home/ali/grdrills/top_block.py
Traceback (most recent call last):
  File "/home/ali/grdrills/top_block.py", line 168, in <module>
    main()
  File "/home/ali/grdrills/top_block.py", line 156, in main
    tb = top_block_cls()
  File "/home/ali/grdrills/top_block.py", line 69, in __init__
    self.tmp_tmp_cmo_acq0_0 = tmp.tmp_cmo_acq0()
AttributeError: 'module' object has no attribute 'tmp_cmo_acq0'

which is usually related to SWIG.
The point is that the class "_impl.h" has two member variables:
        Prm                 d_p;
        ACQ                 d_acq;
which are Prm class to hold all the parameters, and ACQ class for
acquisition, and in "_impl.cpp" the constructor is like this:
    tmp_cmo_acq0_impl::tmp_cmo_acq0_impl()
      : gr::block("tmp_cmo_acq0",
                  gr::io_signature::make(1, 1, sizeof(gr_complex)),
                  gr::io_signature::make(1, 1, sizeof(gr_complex))),
            d_p(awgn, 5),
            d_acq(d_p)
    {
    }
and the problem arises just as I add "d_acq" to the block.
I really wonder why and it drives me crazy these days.
I did a lot of searches but nothing!
I am certain that there are lots of experts on the list and that's my only
hope!

The code is as follows:

tmp_cmo_acq0_impl.h:









*#ifndef INCLUDED_TMP_TMP_CMO_ACQ0_IMPL_H#define
INCLUDED_TMP_TMP_CMO_ACQ0_IMPL_H#include <tmp/tmp_cmo_acq0.h>#include
"acq.h"#include "nco.h"#include "prm.h"#include <itpp/itbase.h>#include
<itpp/signal/transforms.h>#include <complex>#include <deque>*






















*namespace gr {  namespace tmp {    class tmp_cmo_acq0_impl : public
tmp_cmo_acq0    {     private:        Prm                 d_p;        ACQ
              d_acq;     public:      tmp_cmo_acq0_impl();
~tmp_cmo_acq0_impl();      // Where all the action really happens      void
forecast (int noutput_items, gr_vector_int &ninput_items_required);
int general_work(int noutput_items,           gr_vector_int &ninput_items,
         gr_vector_const_void_star &input_items,
 gr_vector_void_star &output_items);    };  } // namespace tmp} //
namespace gr#endif /* INCLUDED_TMP_TMP_CMO_ACQ0_IMPL_H */*



tmp_cmo_acq0_impl.cpp:






























































*#ifdef HAVE_CONFIG_H#include "config.h"#endif#include
<gnuradio/io_signature.h>#include "tmp_cmo_acq0_impl.h"#include
"acq.h"#include "nco.h"#include "prm.h"#include <itpp/itbase.h>#include
<itpp/signal/transforms.h>#include <complex>#include <deque>namespace gr {
namespace tmp {    tmp_cmo_acq0::sptr    tmp_cmo_acq0::make()    {
return gnuradio::get_initial_sptr        (new tmp_cmo_acq0_impl());    }
tmp_cmo_acq0_impl::tmp_cmo_acq0_impl()      : gr::block("tmp_cmo_acq0",
              gr::io_signature::make(1, 1, sizeof(gr_complex)),
      gr::io_signature::make(1, 1, sizeof(gr_complex))),
d_p(awgn, 5),            d_acq(d_p)    {    }
tmp_cmo_acq0_impl::~tmp_cmo_acq0_impl()    {    }    void
tmp_cmo_acq0_impl::forecast (int noutput_items, gr_vector_int
&ninput_items_required)    {      ninput_items_required[0] =
noutput_items;    }    int    tmp_cmo_acq0_impl::general_work (int
noutput_items,                       gr_vector_int &ninput_items,
             gr_vector_const_void_star &input_items,
 gr_vector_void_star &output_items)    {        const gr_complex *in =
(const gr_complex *) input_items[0];        gr_complex *out = (gr_complex
*) output_items[0];        // Do <+signal processing+>        int i = 0;
    for (i = 0; i < noutput_items; ++i) {            out[i] = in[i]; //
almost nothing !!!        }        consume_each (noutput_items);
return noutput_items;    }  } /* namespace tmp */} /* namespace gr */*


prm.h:




















*#ifndef PRM_H#define PRM_H#include <itpp/itbase.h>using namespace
std;using namespace itpp;enum CH_MODE {awgn, rayleigh};class Prm{public:
CH_MODE ch_mode;    int n_sb;public:    Prm(CH_MODE u_ch_mode, int
u_n_sb);};#endif // PRM_H*



prm.cpp:










*#include "prm.h"#include <itpp/itbase.h>using namespace std;using
namespace itpp;Prm::Prm(CH_MODE u_ch_mode, int u_n_sb)    :
ch_mode(u_ch_mode),      n_sb(u_n_sb){}*



acq.h


















*#ifndef ACQ_H#define ACQ_H#include "nco.h"#include "prm.h"#include
<itpp/itbase.h>#include <itpp/signal/transforms.h>#include
<complex>#include <deque>class ACQ {public:    const Prm
&p;public:                        ACQ(const Prm &u_p);}; // Acq#endif //
ACQ_H*




acq.cpp










*#include "acq.h"#include "nco.h"#include "prm.h"#include
<itpp/itbase.h>#include <itpp/signal/transforms.h>ACQ::ACQ(const Prm &u_p)
  : p(u_p){}*




The versions:
*** cmake: 3.15.1
*** gnuradio: 3.7.13.4
*** ubuntu: 16.04
and IT++ is quite OK in my other OOT blocks. (and of course here)

I really appreciate it,
regards
Ali G. Dezfuli

Reply via email to