The message_strobe block can generate any PMT, including PDUs.

I think a point of confusion might be that pmt.pmt_cons() does not construct a 
PMT, it constructs a PMT pair. Many pmt.pmt_xxx() functions return pmt_t (PMT 
type) objects. For example, if you want to receive PDUs and republish just the 
uniform vector you could do this:

def handle_msg(self, msg):
self.message_port_pub(pmt.intern('msg_out'), pmt.cdr(msg))
Or if you wanted to republish the metadata dictionary only with an added field 
"author" you could do:

def handle_msg(self, msg):
meta_dict = pmt.dict_add(pmt.car(msg), pmt.intern('author'), pmt.intern('barry 
duggan'))
self.message_port_pub(pmt.intern('msg_out'), meta_dict)

Hope that helps

https://www.gnuradio.org/doc/doxygen/namespacepmt.html

Jacob

------- Original Message -------
On Thursday, July 6th, 2023 at 10:09 AM, Barry Duggan <ba...@dcsmail.net> wrote:

> Hi Jacob,
>
> I'm trying to get the same PMT form as output from a Message_Strobe, i.e. not 
> a pair. See below for what I am expecting.
>
> Thanks :)
> ---
> Barry Duggan
>
> ---- On Thu, 06 Jul 2023 10:43:39 -0500 jacob <jacobgilb...@protonmail.com> 
> wrote ---
>
>> Hey Barry,
>>
>> PDUs are a specific type of PMT object, PDUs are defined to be a PMT pair of 
>> a PMT dictionary and PMT uniform vector.
>>
>>> pmt.cons(pmt.PMT_NIL,pmt.to_pmt(buff)))
>>
>> The above object generates a PMT pair type object of an empty dictionary 
>> (PMT_NIL) and what is hopefully a uniform vector. Using to_pmt() can PMT-ify 
>> any type of object and doing so from a weakly typed language is a little 
>> risky, I'd use pmt.init_u8vector() or the expected type instead of to_pmt() 
>> but the idea is the same.
>>
>> The PMT_NIL, the uniform vector, and the pair are all individually PMT type 
>> objects themselves.
>>
>> Is there a particular type of PMT object you are trying to turn the PDUs 
>> into?
>>
>> Jacob
>>
>> ------- Original Message -------
>> On Thursday, July 6th, 2023 at 8:55 AM, Barry Duggan <ba...@dcsmail.net> 
>> wrote:
>>
>>> Jeff,
>>>
>>> Thank you for your corrections. However, based on my debug information, a 
>>> PMT message as output from a Message_Strobe is:
>>> PST_SYMBOL = 0x02
>>> UVI_U8 = 0x00
>>> length of symbols
>>> symbol vector
>>> whereas a PDU has a form:
>>> PST_PAIR
>>> PST_NULL
>>> PST_UNIFORM_VECTOR
>>> etc.
>>> Using the string "GNU Radio", a PMT generates:
>>> 2 0 9 71 78 85 32 82 97 100 105 111
>>> and a PDU generates:
>>> 7 6 10 0 0 0 0 9 1 0 71 78 85 32 82 97 100 105 111
>>> So the construct of `pmt.cons(pmt.PMT_NIL,pmt.to_pmt(buff)))` seems to 
>>> generate a PDU. What is the construct for a PMT?
>>>
>>> Thanks!
>>> ---
>>> Barry Duggan
>>>
>>> ---- On Thu, 06 Jul 2023 08:03:26 -0500 Jeff Long <willco...@gmail.com> 
>>> wrote ---
>>>
>>>> b_len is defined in the try block, and is out of scope by the time it is 
>>>> checked below.
>>>>
>>>> This code should work. The routine returns in the except clause and b_len 
>>>> is set after the try/except.
>>>>
>>>> import numpy as np
>>>> from gnuradio import gr
>>>> import pmt
>>>> import array
>>>>
>>>> class blk(gr.sync_block):
>>>> def __init__(self):
>>>> gr.sync_block.__init__(
>>>> self,
>>>> name='EPB: Packet to PMT', # will show up in GRC
>>>> in_sig=None,
>>>> out_sig=None)
>>>> self.message_port_register_in(pmt.intern('msg_in'))
>>>> self.message_port_register_out(pmt.intern('msg_out'))
>>>> self.set_msg_handler(pmt.intern('msg_in'), self.handle_msg)
>>>>
>>>> def handle_msg(self, msg):
>>>> _debug = 0 # set to zero to turn off diagnostics
>>>> try:
>>>> buff = pmt.to_python(pmt.cdr(msg))
>>>> except Exception as e:
>>>> gr.log.error("Error with message conversion: %s" % str(e))
>>>> return
>>>>
>>>> b_len = len (buff)
>>>> if (_debug):
>>>> print ("new_val =", buff, b_len)
>>>> if (b_len != 52):
>>>> self.message_port_pub (pmt.intern('msg_out'), 
>>>> pmt.cons(pmt.PMT_NIL,pmt.to_pmt(buff)))
>>>> elif ((buff[0] != 37) and (buff[51] != 93)):
>>>> self.message_port_pub (pmt.intern('msg_out'), 
>>>> pmt.cons(pmt.PMT_NIL,pmt.to_pmt(buff)))
>>>>
>>>> On Wed, Jul 5, 2023 at 6:11 PM Barry Duggan <ba...@dcsmail.net> wrote:
>>>>
>>>>> I would like to receive a PDU message containing a string using an 
>>>>> Embedded Python Block and, after discarding certain messages, send a PMT 
>>>>> message with that string to the output message port. My efforts so far 
>>>>> have not produced a valid PMT format. My current code is:
>>>>> ```
>>>>> import numpy as np
>>>>>
>>>>> from gnuradio import gr
>>>>>
>>>>> import pmt
>>>>>
>>>>> import array
>>>>>
>>>>> class blk(gr.sync_block):
>>>>>
>>>>> def __init__(self):
>>>>>
>>>>> gr.sync_block.__init__(
>>>>>
>>>>> self,
>>>>>
>>>>> name='EPB: Packet to PMT', # will show up in GRC
>>>>>
>>>>> in_sig=None,
>>>>>
>>>>> out_sig=None)
>>>>>
>>>>> self.message_port_register_in(pmt.intern('msg_in'))
>>>>>
>>>>> self.message_port_register_out(pmt.intern('msg_out'))
>>>>>
>>>>> self.set_msg_handler(pmt.intern('msg_in'), self.handle_msg)
>>>>>
>>>>> def handle_msg(self, msg):
>>>>>
>>>>> _debug = 0 # set to zero to turn off diagnostics
>>>>>
>>>>> try:
>>>>>
>>>>> buff = pmt.to_python(pmt.cdr(msg))
>>>>>
>>>>> b_len = len (buff)
>>>>>
>>>>> except Exception as e:
>>>>>
>>>>> gr.log.error("Error with message conversion: %s" % str(e))
>>>>>
>>>>> if (_debug):
>>>>>
>>>>> print ("new_val =", buff, b_len)
>>>>>
>>>>> if (b_len != 52):
>>>>>
>>>>> self.message_port_pub (pmt.intern('msg_out'), 
>>>>> pmt.cons(pmt.PMT_NIL,pmt.to_pmt(buff)))
>>>>>
>>>>> elif ((buff[0] != 37) and (buff[51] != 93)):
>>>>>
>>>>> self.message_port_pub (pmt.intern('msg_out'), 
>>>>> pmt.cons(pmt.PMT_NIL,pmt.to_pmt(buff)))
>>>>>
>>>>> ```
>>>>>
>>>>> Any help will be appreciated!
>>>>>
>>>>> ---
>>>>> Barry Duggan

Reply via email to