In addition to what Johannes said:

Make sure that you have

    virtual void set_gain(float gain) = 0;

in your var_gain.h and

    virtual void set_gain(float gain);

in your var_gain_impl.h, as well as

    void
    var_gain_impl::set_gain(float gain) {
        ...
    }

in your var_gain_impl.cc.

The idea is that the user of your block only sees var_gain and its
public attributes, while you and your module work in var_gain_impl to
make it easier for swig and readers to understand your "interface" for
using that class and giving you the freedom to have whatever methods
you'd need in the _impl without asking yourself if potential users might
be confused by these methods.

And another side note for future readers: I assume you implement this as
an exercise, which is a very good idea!
If someone just needs functionality of this kind, there's
multiply_const_??.

Greetings,
Marcus

On 20.07.2014 12:24, Johannes Demel wrote:
> hey,
>
> I'm not entirely sure if it still holds true, but that might be an
> error related to SWIG. For some reason virtual header files don't get
> swig'ed again unless explicitly triggered. Just do a 'make clean' and
> 'make' again. That should rebuild your module from scratch and also
> swig your headers.
>
> happy hacking
> Johannes
>
> On 20.07.2014 07:58, jsam45 wrote:
> > Using gr_modtool, I am trying to make a simple Gain block (called
> > var_gain) which multiplies the input with a constant. I have a
> > private variable called d_gain in the var_gain_impl class and a
> > public function set_gain(float gain) which sets the value of d_gain
> > to the argument. I modified the xml file by adding the line
> > <callback>set_gain($gain)</callback> after the <make> line.
>
> > During execution, gain value does not change even after changing it
> > through a WX Slider. If I run it from terminal, I am getting the
> > following error - Traceback (most recent call last): File
> > "/usr/local/lib/python2.7/dist-packages/gnuradio/wxgui/forms/forms.py",
> > line 180, in _handle def _handle(self, event): self[INT_KEY] =
> > self._slider.GetValue() File
> > "/usr/local/lib/python2.7/dist-packages/gnuradio/gr/pubsub.py",
> > line 52, in __setitem__ sub(val) File
> > "/usr/local/lib/python2.7/dist-packages/gnuradio/wxgui/forms/forms.py",
> > line 138, in _translate_internal_to_external if self._callback:
> > self._callback(self[EXT_KEY]) File "top_block.py", line 102, in
> > set_gg self.fsk_var_gain_0.set_gain(self.gg) AttributeError:
> > 'var_gain_sptr' object has no attribute 'set_gain'
>
> > I tried looking at some in-built blocks to see how callback is
> > implemented. Then I saw that the in-built blocks have pure virtual
> > functions in the include/module_name/var_gain.h header file. I
> > tried implementing that but the result is still the same. What am I
> > missing here?
>
>
>
> > -- View this message in context:
> >
> http://gnuradio.4.n7.nabble.com/Implementing-callbacks-in-custom-blocks-tp49462.html
>
>
> Sent from the GnuRadio mailing list archive at Nabble.com.
>
> > _______________________________________________ Discuss-gnuradio
> > mailing list Discuss-gnuradio@gnu.org
> > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
>
>
> _______________________________________________
> Discuss-gnuradio mailing list
> Discuss-gnuradio@gnu.org
> https://lists.gnu.org/mailman/listinfo/discuss-gnuradio


_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to