Error using block UHD AMsg Source

Hi All,

I’m checking the functionality of the block “UHD AMsg Source” using the
USRP N210. The device is correctly detected as you can see:

uhd_find_devices
linux; GNU C++ version 4.6.1; Boost_104601;
UHD_003.004.003-221-g9d6f9492


– UHD Device 0

Device Address:
type: usrp2
addr: 172.17.3.140
name:
serial: E0R17TCUP

I’ve attached a screen-shot of the GRC file. When I run the flow graph,
I
get the following error:

Traceback (most recent call last):
File “/home/asrpuser/Desktop/Jose T. Material /top_block.py”, line
54, in
tb = top_block()
File “/home/asrpuser/Desktop/Jose T. Material /top_block.py”, line
33, in init
self.extras_uhd_amsg_source_0 =
gr_extras.uhd_amsg_source(device_addr=“add=172.17.3.140”)
File
“/usr/local/lib/python2.7/dist-packages/gnuradio/extras/extras_swig.py”,
line 5384, in make
return _extras_swig.uhd_amsg_source_make(*args, **kwargs)
TypeError: in method ‘uhd_amsg_source_make’, argument 1 of type
‘uhd::device_addr_t const &’

Anyone has seen an error like this before?, How can I solve/workaround
this error?

Thanks a lot for your help,

Jose.

On 10/10/2012 05:51 PM, Jose T. Diaz wrote:


File “/home/asrpuser/Desktop/Jose T. Material /top_block.py”, line
54, in
tb = top_block()
File “/home/asrpuser/Desktop/Jose T. Material /top_block.py”, line
33, in init
self.extras_uhd_amsg_source_0 =
gr_extras.uhd_amsg_source(device_addr=“add=172.17.3.140”)

try gr_extras.uhd_amsg_source(uhd.device_addr(“addr=172.17.3.140”))

Hi Josh,

Do you mean to change in the top_block.py?. I did this, but when I run
again the top_block.py, it changes back to:

gr_extras.uhd_amsg_source(device_addr=“add=172.17.3.140”)

even if I try:

gr_extras.uhd_amsg_source(uhd.device_addr=“add=172.17.3.140”)

Thanks again Josh,

Regards,

Jose

Hi Josh,

I’ve changed the .xml file. Also, I’ve checked the new top_block.py file
and it is generated as follows:

self.extras_uhd_amsg_source_0 =
gr_extras.uhd_amsg_source(uhd.device_addr=“172.17.3.140”

However, it is still complaining when I run the flow graph:

File “/home/asrpuser/Desktop/Jose T. Material /top_block.py”, line
33
self.extras_uhd_amsg_source_0 =
gr_extras.uhd_amsg_source(uhd.device_addr=“add=172.17.3.140”)
SyntaxError: keyword can’t be an expression

Thanks,

Jose.

On 10/10/2012 06:09 PM, Jose T. Diaz wrote:

Thanks again Josh,

I see. Its the xml definition. Too bad python/swig does get the
constructor overloads that c++ sees.

I pushed this change to the repo:

 <param>
     <name>Device Addr</name>
     <key>dev_addr</key>

-josh

On 10/10/2012 06:35 PM, Jose T. Diaz wrote:

File “/home/asrpuser/Desktop/Jose T. Material /top_block.py”, line 33
self.extras_uhd_amsg_source_0 =
gr_extras.uhd_amsg_source(uhd.device_addr=“add=172.17.3.140”)
SyntaxError: keyword can’t be an expression

Generates perfectly over here:
self.extras_uhd_amsg_source_0 =
gr_extras.uhd_amsg_source(uhd.device_addr(“addr=192.168.10.2”))

-josh

On 10/10/2012 07:16 PM, Jose T. Diaz wrote:

http://gnuradio.org/redmine/projects/gnuradio/wiki/TypePMT#Dictionaries. If
I want to set values in the dictionary, I should use

pmt_dict_set(%parameters here)

Doesnt exist. I think it should be added. This version could add the
key/value to the existing dictionary. vs the pmt_dict_add which creates
a new one

or values:
pmt::pmt_dict_values(value_dict) <<std::endl;

Results (always empty!):

the code to add a key/value actually returns a new dictionary and doesnt
change the old ones.

I know this pmt stuff is crazy. Why didnt we just use std::map? :slight_smile:

Adding the value, items : ()
Adding the value, keys : ()
Adding the value, values : ()

Issue (3): I post the dictionary downstream similar to the code in
“UHD_AMSG_SOURCE”:

this->post_msg(0,value_dict,_msg.value,_id);

The key has to the a pmt that holds a string, the value does not have
the restriction.

Hi Josh,

I am very keen on this block (UHD_AMSG_SOURCE), because I saw that you
post
a dictionary downstream in this example. Thus, I would like to analyze
how
it works. I’ve tried to replicate your code in a different block, but I
have some issues with the dictionary.

Here is my summary:

Issue (1): According to the wiki:
http://gnuradio.org/redmine/projects/gnuradio/wiki/TypePMT#Dictionaries.
If
I want to set values in the dictionary, I should use

pmt_dict_set(%parameters here)

However, this command it doesn’t work for me (as it is not part of pmt).

The command that works without problem is:

pmt_dict_add(%parameters here)

Issue (2): I’ve set a dictionary with one value on it. (See the code
below). However, it is always empty when I tried to check the items,
keys
or values:

pmt::pmt_t value_dict=pmt::pmt_make_dict();
std::cout << std::endl << "Making a dictionary : " << value_dict
<<std::endl;
pmt::pmt_dict_add (value_dict,blob_key,pmt::pmt_from_uint64(10));
std::cout << std::endl << "Adding the value, items : " <<
pmt::pmt_dict_items(value_dict) <<std::endl;
std::cout << std::endl << "Adding the value, keys : " <<
pmt::pmt_dict_keys(value_dict) <<std::endl;
std::cout << std::endl << "Adding the value, values : " <<
pmt::pmt_dict_values(value_dict) <<std::endl;

Results (always empty!):

Adding the value, items : ()
Adding the value, keys : ()
Adding the value, values : ()

Issue (3): I post the dictionary downstream similar to the code in
“UHD_AMSG_SOURCE”:

this->post_msg(0,value_dict,_msg.value,_id);

However, similarly to my previous post, the flow graph complains that
this
is a wrong type:

thread[thread-per-block[8]: <gr_block msg_sourcer (9)>]:
gr_block_detail::add_item_tag key: wrong_type : ()

For these reasons, I would like to see how your code is working with
these
dictionaries.

Thanks again,

Jose

On Thu, Oct 11, 2012 at 12:05 PM, Jose T. Diaz <

Hi Josh,

Now it is running. Also, I add some lines into the uhd_amsg_source.cc
file
for debugging purposes:

Just ordinary prints to see when the message is post and what kind of
message:
std::cout << std::endl << “interruption”<<std::endl;

When I run the flow graph shows:

Executing: “/home/Desktop/Jose T. Material /top_block.py”

linux; GNU C++ version 4.6.1; Boost_104601;
UHD_003.004.003-221-g9d6f9492

– Opening a USRP2/N-Series device…
– Current recv frame size: 1472 bytes
– Current send frame size: 1472 bytes

And stays there (it does not show my debugging lines). Do you see the
same
lines than me above, or stops at some point?.

Thanks for your help,

Regards,

Jose.

On Thu, Oct 11, 2012 at 12:05 PM, Jose T. Diaz <

Hi Josh,

You mentioned that:

"the code to add a key/value actually returns a new dictionary and
doesnt
change the old ones.

I know this pmt stuff is crazy. Why didnt we just use std::map? :-)"

I’m confused with this, because I created the dictionary and added the
values. However, when I’ve checked the type, it shows that it is a
dictionary (as I expected), but also it is always empty.

  pmt::pmt_t value_dict = pmt::pmt_make_dict();
  std::cout << std::endl << "Making a dictionary" << std::endl;
  pmt::pmt_dict_add(value_dict, TIME_KEY, 

pmt::pmt_from_uint64(3200));
this->post_msg(0, AMSG_KEY, value_dict, _id);
std::cout << std::endl << “Posting downstream” << std::endl;

std::cout << std::endl << “checking if null:”
<<pmt::pmt_is_null(value_dict)<< std::endl; //Return true
std::cout << std::endl << “checking if dict:”
<<pmt::pmt_is_dict(value_dict)<< std::endl; //Return true

So, does it mean that I cannot access the values that are added into the
dictionary “value_dict”?. If it is possible, how should I access them?.

Sort of related question:

Since this is dictionary, in order to debug my code I printed out the
items, keys and values. I expected to see at least the items inside the
dictionary, but again everything is empty.

std::cout << std::endl << “Checking items ;” <<
pmt::pmt_dict_items(value_dict)<<std::endl;
std::cout << std::endl << “Checking keys ;” <<
pmt::pmt_dict_keys(value_dict)<<std::endl;
std::cout << std::endl << “Checking values;” <<
pmt::pmt_dict_values(value_dict)<<std::endl;

Thanks a lot for your help,

Kind Regards,

Jose

Hi Josh,

I’ve figure out the problem. I didn’t check this:

where you changed this:

  • pmt::pmt_dict_add(value_dict, TIME_KEY, timestamp);
  • value_dict = pmt::pmt_dict_add(value_dict, TIME_KEY, timestamp);
    Thanks,

Jose.

On Mon, Oct 15, 2012 at 11:54 AM, Jose T. Diaz <