Ha! No, not emailing myself, just a user who was replying directly. But to
continue my conversation (hopefully with the OP), here is some working
code. It does a print() because I didn't get around to actually sending a
pmt as a message, but you get the idea. Picture of flowgraph attached.

import threading
import time

import numpy as np
from gnuradio import gr
import pmt

class blk(gr.sync_block):

    def __init__(self, val=0):
        gr.sync_block.__init__(
            self,
            name='Show Value',
            in_sig=[],
            out_sig=[]
        )
        self.message_port_register_out(pmt.intern("msgout"))
        self.val = val
        self.thread = None
        print('init')

    def start(self):
        print('start')
        self.stopit = False
        self.thread = threading.Thread(target=self.run, daemon=True)
        self.thread.start()
        return True

    def stop(self):
        print('stop')
        self.stopit = True
        self.thread.join()
        return True

    def set_val(self, val):
        self.val = val

    def run(self):
        while(not self.stopit):
            print(f'val={self.val} (would send as message)')
            time.sleep(1)

On Tue, Nov 30, 2021 at 2:13 AM Marcin Puchlik <m.puch...@is-wireless.com>
wrote:

> Jeff,
> Are you mailing with yourself?
>
> wt., 30 lis 2021 o 00:46 Jeff Long <willco...@gmail.com> napisaƂ(a):
>
>> Sounds good. Only look at the C++ to figure out the general idea. I'd
>> learn Python threading first in a standalone program so you're not learning
>> (debugging) GR and python threading at the same time. Good luck - let us
>> know how it goes.
>>
>> Also, please respond to the mailing list so everyone can benefit from the
>> conversation.
>>
>> On Mon, Nov 29, 2021 at 5:11 PM Michelle <mkprojects...@gmail.com> wrote:
>>
>>> Hi Jeff,
>>>
>>> thank you for your help and sorry for the delay, I was in class.
>>>
>>> it is now that I start to work on it. My first step is to master how the
>>> c++ code of the strobe message block work, specially the functions:
>>>
>>> -bool message_strobe_impl::start()
>>>
>>> -bool message_strobe_impl::stop()
>>>
>>> -void message_strobe_impl::run()
>>>
>>> Then I will implement the python version following your advice. I will
>>> write to you to show you the result.
>>>
>>> Once again thank you, I was really lost.
>>>
>>> Have a good afternoon.
>>>
>>> OK, it does work, as long as there is a message port defined and
>>> connected in a flowgraph. I was trying too simple an example. You would do
>>> your thread management in the start() and stop() functions.
>>>
>>> """
>>> Embedded Python Blocks:
>>>
>>> Each time this file is saved, GRC will instantiate the first class it
>>> finds
>>> to get ports and parameters of your block. The arguments to __init__
>>>  will
>>> be the parameters. All of them are required to have default values!
>>> """
>>>
>>> import numpy as np
>>> from gnuradio import gr
>>> import pmt
>>>
>>> class blk(gr.sync_block):  # other base classes are basic_block,
>>> decim_block, interp_block
>>>     """Embedded Python Block example - a simple multiply const"""
>>>
>>>     def __init__(self):  # only default arguments here
>>>         """arguments to this function show up as parameters in GRC"""
>>>         gr.sync_block.__init__(
>>>             self,
>>>             name='Embedded Python Block',   # will show up in GRC
>>>             in_sig=[],
>>>             out_sig=[]
>>>         )
>>>         self.message_port_register_out(pmt.intern("msgout"))
>>>         print('init')
>>>
>>>     def start(self):
>>>         print('start')
>>>         return True
>>>
>>>     def stop(self):
>>>         print('stop')
>>>         return True
>>>
>>> On Mon, Nov 29, 2021 at 2:13 PM Jeff Long <willco...@gmail.com> wrote:
>>>
>>>> Issue submitted: https://github.com/gnuradio/gnuradio/issues/5358
>>>>
>>>> On Mon, Nov 29, 2021 at 1:58 PM Jeff Long <willco...@gmail.com> wrote:
>>>>
>>>>> It does not seem that python blocks can override start() and stop(),
>>>>> which they should be able to do. So, don't go too far down that path. I do
>>>>> not see anywhere in the code where this is used or would have been caught.
>>>>>
>>>>> The embedded blocks are easier, be beware that GRC calls the init
>>>>> function to learn about the block. Therefore, you don't want any action
>>>>> taken as a result of a call to init, for instance spawning a thread and
>>>>> starting to send messages. Embedded python block are sort of a toy that
>>>>> turned out to be useful. In general, an OOT is a better idea, but an
>>>>> embedded block can work if it's simple enough.
>>>>>
>>>>> Maybe someone else has figured this out. With just a quick look, I
>>>>> don't see how a Message Strobe kind of block can be implemented in python
>>>>> without start() and stop().
>>>>>
>>>>> Here's kind of a hack: make a python block with a message handler that
>>>>> gets a periodic strobe from the existing Message Strobe block. In the
>>>>> handler, send out the message that you would have sent in the thread.
>>>>>
>>>>

Reply via email to