Thanks much, Marcus. That was the issue. I had missed adding the declarations for the callbacks in the non-impl class. As in the analog signal source block, just adding pure virtual function declarations for the callbacks did the trick. I'm not familiar with SWIG and I don't know why this works. But I'm happy it does without having to dig into SWIG details. Thanks, --Patrick > Date: Mon, 6 Jul 2015 09:53:16 +0200 > From: marcus.muel...@ettus.com > To: discuss-gnuradio@gnu.org > Subject: Re: [Discuss-gnuradio] Calling C++ method from Python > > Hi Patrick, > > the typical problem with C++ blocks is that people add public methods to > their _impl, but forget to declare these same methods in their public > non-impl class. > Have you done the same expand magic with the header in your > include/CMakeLists.txt? > > Best regards, > Marcus > > > On 07/06/2015 04:09 AM, Patrick Sathyanathan wrote: > > Hi, > > > > I have worked my way through the Guided Tutorials on gnuradio.org. I have > > written OOT blocks in Python and managed to expose some set methods in the > > block as callbacks. Now I have written an OOT C++ block sweeper_cpp_f and I > > want to expose a couple of setter methods in my block's class as callbacks > > that can be invoked from Python. Initially I just defined the methods in my > > sweeper_cpp_f_impl.cc file and added the following to the matching XML file: > > > > <callback>set_direction($direction)</callback> > > <callback>set_trigger_level($trigger_level)</callback> > > > > This builds fine and I am able to use the block in a GRC flow-graph. But at > > runtime when one of the above methods is invoked as a result of GUI input I > > get an error message: > > > > File "/home/wpats/ettus/grc/new_sweep_cpp.py", line 141, in > > set_variable_chooser_direction > > > > self.tutorial_sweeper_cpp_f_0.set_direction(self.variable_chooser_direction) > > AttributeError: 'sweeper_cpp_f_sptr' object has no attribute 'set_direction' > > > > I looked at built in module sig_source_X_impl.h.t and > > sig_source_X_impl.cc.t (this is the analog signal source block) in > > gr-analog as an example for what I am trying to accomplish. I converted my > > sources into a similar format and modified the CMakeLists.txt in the > > .../gr-tutorial/lib directory to add: > > > > ######################################################################## > > # Invoke macro to generate various sources and headers > > ######################################################################## > > include(GrMiscUtils) > > GR_EXPAND_X_CC_H(tutorial sweeper_cpp_X_impl f) > > > > This again builds fine after I edit the generate_helper.py generated script > > to find an import module. I assumed that the above would do the necessary > > magic to generate the wrappers for my callback methods but no such luck. I > > still get the attribute error when invoking my C++ method. > > > > What is the right way to do this ? Any help/suggestions/pointers would be > > appreciated. I can't be the first one to try to do this seemingly simple > > task... > > > > Thanks, > > > > --Patrick > > > > > > _______________________________________________ > > 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