Hi all,
today i was trying to make hierarchical signal processing block in
Python.
I started with gr_modtool script, and configured it for hierpython block
type.
My idea was to design block similar to packet framer, so inside of the
new
block, I connected binary slicer and Framer sink. I have also declared
message queue.
Outside of main block, I designed another block which should collect
messages sent by framer from the main block.
When I wanted to run this block, I got following error:
Traceback (most recent call last):
File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 439, in
<module>
tb = top_block()
File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 183, in
__init__
self.test_packet_proba_0 = test.packet_proba()
AttributeError: 'module' object has no attribute 'packet_proba'
Next I found that maybe I have to put following line in __init__.py
file:
from packet_proba import *
After that I got similar error:
Traceback (most recent call last):
File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 18, in
<module>
import test
File "/usr/local/lib64/python2.6/site-packages/test/__init__.py", line
49, in <module>
from packet_proba import *
File "/usr/local/lib64/python2.6/site-packages/test/packet_proba.py",
line 51, in <module>
class proba(gr.basic_block):
AttributeError: 'module' object has no attribute 'basic_block'
I have also tried with gr.block instead of gr.basic_block, but with
identical results.
Can anybody tell what's missing?
Thanks
on 2013-01-25 17:07
on 2013-01-25 17:39
For a hier block in Python, do $ gr_modtool.py add -t hier -l python You need 3.6.3 to do that. Also, you'll need a new version of modtool (it usually lags a bit behind changes in GNU Radio). MB On Fri, Jan 25, 2013 at 05:05:56PM +0100, Nemanja Savic wrote: > > File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 439, in <module> > > 51, in <module> > > Thanks > > > -- > Nemanja Savić > > _______________________________________________ > Discuss-gnuradio mailing list > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio -- Karlsruhe Institute of Technology (KIT) Communications Engineering Lab (CEL) Dipl.-Ing. Martin Braun Research Associate Kaiserstraße 12 Building 05.01 76131 Karlsruhe Phone: +49 721 608-43790 Fax: +49 721 608-46071 www.cel.kit.edu KIT -- University of the State of Baden-Württemberg and National Laboratory of the Helmholtz Association
on 2013-01-25 21:23
Thank you Martin, I will try that on Monday. I suppose that I have older version of gr_modtool, cause there is no option -l for selecting language. My weekend would be maybe perfect If you or anybody else can explain to me why my code won't work, cause I have more or less copied block structure from grextras. Nice weekend Nemanja
on 2013-01-28 10:29
I installed new version of gr_modtool script and it won't work. The
error
is following:
[savi_ne@ts-070046nl gr-test]$ gr_modtool.py add -N rx_tx_message -t
hier
-l python
Using Python < 2.7 possibly buggy. Ahem. Please send all complaints to
/dev/null.
Operating in directory .
GNU Radio module name identified: test
Language: Python
Block/code identifier: rx_tx_message
Enter valid argument list, including default arguments:
Add Python QA code? [Y/n] n
Traversing python...
Adding file 'rx_tx_message.py'...
Traceback (most recent call last):
File "/usr/local/bin/gr_modtool.py", line 3369, in <module>
main()
File "/usr/local/bin/gr_modtool.py", line 3362, in main
modtool.run()
File "/usr/local/bin/gr_modtool.py", line 1339, in run
self._run_python()
File "/usr/local/bin/gr_modtool.py", line 1479, in _run_python
self._write_tpl('block_python', 'python', fname_py)
File "/usr/local/bin/gr_modtool.py", line 1324, in _write_tpl
open(os.path.join(path, fname), 'w').write(get_template(tpl,
**self._info))
File "/usr/local/bin/gr_modtool.py", line 870, in get_template
return str(GRMTemplate(Templates[tpl_id], searchList=kwargs))
File "/usr/local/bin/gr_modtool.py", line 865, in __init__
Cheetah.Template.Template.__init__(self, src, searchList=searchList)
File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line
1257,
in __init__
self._compile(source, file, compilerSettings=compilerSettings)
File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line
1551,
in _compile
keepRefToGeneratedCode=True)
File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line
795,
in compile
raise parseError
Cheetah.Parser.ParseError:
Error in the Python code which Cheetah generated for this template:
================================================================================
expected an indented block (DynamicallyCompiledCheetahTemplate.py, line
122)
Line|Python Code
----|-------------------------------------------------------------
120 | deciminterp = ''
121 | else: # generated from line 42, col 1
122 | write(u'''from gnuradio import gr
^
123 |class ''')
124 | _v = VFFSL(SL,"blockname",True) # u'${blockname}' on line
46,
col 7
125 | if _v is not None: write(_filter(_v,
rawExpr=u'${blockname}'))
# from line 46, col 7.
================================================================================
Here is the corresponding Cheetah code.
** I had to guess the line & column numbers, so they are probably
incorrect:
Line 42, column 1
Line|Cheetah Code
----|-------------------------------------------------------------
39 |#else if $blocktype == 'decimator'
40 |#set $deciminterp = ', <+decimation+>'
41 |#set $deciminterp = ''
42 |#else
^
43 |#end if
44 |from gnuradio import gr
45 |
Any suggestions how to ovecome this except using older version which
worked
perfectly?
on 2013-01-28 16:43
Since I don't know why gr_modtool doesn't work for me, I took the older
working version and made very simple hier block in order to understand
messages flow in gnuradio.
The block code is following:
from gnuradio import gr
class msg_proba(gr.hier_block2):
def __init__(self, ):
gr.hier_block2.__init__(self, "msg_proba",
gr.io_signature(1, 1, gr.sizeof_char), # Input
signature
gr.io_signature(1, 1, gr.sizeof_char)) # Output
signature
gr_message_sink_0_msgq_out = gr_message_source_0_msgq_in =
gr.msg_queue(4)
self.gr_message_source_0 = gr.message_source(gr.sizeof_char*1,
gr_message_source_0_msgq_in)
self.gr_message_sink_0 = gr.message_sink(gr.sizeof_char*1,
gr_message_sink_0_msgq_out, False)
self.connect(self, self.gr_message_sink_0)
self.connect(self.gr_message_source_0, self)
and the test code is following:
from gnuradio import gr, gr_unittest
import test
import msg_proba
class qa_msg_proba (gr_unittest.TestCase):
def setUp (self):
self.tb = gr.top_block ()
def tearDown (self):
self.tb = None
def test_001_msg_proba (self):
self.src_data = ()
self.expected_result = ()
for i in range(51):
self.src_data = self.src_data + (1,)
self.expected_result = self.expected_result+(1,)
self.src = gr.vector_source_b(self.src_data, False, 1)
self.dst = gr.vector_sink_b ()
self.msg_pr = msg_proba.msg_proba()
self.tb.connect(self.src, self.msg_pr, self.dst)
self.tb.run ()
# check data
result_data = dst.data ()
self.assertEqual (expected_result, result_data)
if __name__ == '__main__':
gr_unittest.main ()
When I run test, it doesn't finish. No errors, just stays active without
giving any results.
Can somebody provide some explanation?
on 2013-01-28 17:07
- Try the latest gr_modtool from github - What you're doing seems weird--why are you connecting message blocks? These are meant as a hackish solution to access samples from outside the flow graph. Perhaps you want the new PDU to stream blocks? MB On Mon, Jan 28, 2013 at 04:42:04PM +0100, Nemanja Savic wrote: > def __init__(self, ): > gr_message_sink_0_msgq_out, False) > from gnuradio import gr, gr_unittest > > self.dst = gr.vector_sink_b () > if __name__ == '__main__': > > Operating in directory . > > **self._info)) > File "/usr/lib64/python2.6/site-packages/Cheetah/Template.py", line 795, > > # from line 46, col 7. > Line|Cheetah Code > > I suppose that I have older version of gr_modtool, cause there is no > > > > > declared message > > > > > > File "/home/savi_ne/work/gnuradio/GRC/top_block.py", line 18, > > AttributeError: 'module' object has no attribute 'basic_block' > > Thanks > > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio > Building 05.01 > Discuss-gnuradio mailing list > > Nemanja Savić > > _______________________________________________ > Discuss-gnuradio mailing list > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio -- Karlsruhe Institute of Technology (KIT) Communications Engineering Lab (CEL) Dipl.-Ing. Martin Braun Research Associate Kaiserstraße 12 Building 05.01 76131 Karlsruhe Phone: +49 721 608-43790 Fax: +49 721 608-46071 www.cel.kit.edu KIT -- University of the State of Baden-Württemberg and National Laboratory of the Helmholtz Association
on 2013-01-28 22:15
Hi all, In my first post from today, where I reported error in gr_modtool, I was using script downloaded from github this morning (just to clarifu how old scriot I used). Basically I am trying to make my own packet deframer block, and they are more or less designed like that. This block was designed just to see how messages work. In GRC when I connect them in that way it works, but in test script above it doesn't work. Basically the problem comes from making similar block like packet deframer, but I am not able to import gr.block, or gr.basic_block in python (and gr.hier_block2 works perfectly) Cheers
on 2013-01-30 11:02
Guys, i am not able to load gr.basic_block and make signal processing block in Python. Simplu, there is no binding within gnuradio/gr for that class. It works perfectly for gr.hier)block2 class. What might be the problem? Thanks
on 2013-01-30 11:02
On Tue, Jan 29, 2013 at 7:40 AM, Nemanja Savic <vlasinac@gmail.com> wrote: >> gr.hier_block2.__init__( >> 1's and 0's" % (access_code,) >> >> # num_msg_outputs = 1 > I have no idea what files these are from. Are they part of the GNU Radio source code? I can't find references to them. > > Sounds like you don't have something installed correctly. You wouldn't normally be inheriting straight from gr_basic_block, but you should be able to. > And in tutorial on how to write signal processing block, it is stated to > use gr.basic_block. > Which tutorial? Again, I don't think this is in the main GNU Radio source, so please point out where you are getting this from. Tom
on 2013-01-30 11:02
OK, I'll try to explain everything.
I want to design block responsible for decoding messages, calculating
crc,
etc ... In order to do that I investigated packet_demod_base block from
main gnuradio branch,
and also packet_deframer from gr_extras group of blocks. I realized that
such kind of blocks consists of correlator, framer sink which acts like
message sink, and finally of some kind of message source. Framer sink
sends
messages to message
source and message source then does packet checking and everything.
I also wanted to design my block in that fashion, so I used correlator
and
framer sink and I wanted to design my own block which is able to receive
messages from packet framer and to check it. The code I provided in the
last post is my own, and not the part of gnuradio. Here is complete
source
file of my block:
import numpy
from math import pi
from gnuradio import gr
from gruel import pmt
from gnuradio.digital import packet_utils
import gnuradio.digital as gr_digital
class packet_tst(gr.hier_block2):
def __init__(self, access_code=None, threshold=-1):
gr.hier_block2.__init__(
self,
"packet_tst",
gr.io_signature(1, 1, 1), # Input signature
gr.io_signature(0, 0, 0) # Output signature
)
if not access_code:
access_code = packet_utils.default_access_code
if not packet_utils.is_1_0_string(access_code):
raise ValueError, "Invalid access_code %r. Must be string of
1's and 0's" % (access_code,)
if threshold == -1:
threshold = 12 # FIXME raise exception
msgq = gr.msg_queue(4) # holds packets from the PHY
self.correlator =
gr_digital.correlate_access_code_bb(access_code,
threshold)
self.framer_sink = gr.framer_sink_1(msgq)
self.connect(self, self.correlator, self.framer_sink)
self.hlp_blk = helper_block(msgq)
class helper_block(gr.basic_block):
def __init__(self, msgq):
gr.basic_block.__init__(
self, name = "helper_block",
in_sig = None, out_sig = None
# num_msg_outputs = 1
)
self._msgq = msgq
def work(self, input_items, output_items):
while True:
try: msg = self._msgq.delete_head()
except: return -1
print "Message received"
At the moment the block is designed only to write something to standard
output if it receives a message. The problem is gr.basic_block as I
described in previous post. Python interpreter doesn't complain about
gr.hier_block2, but only about gr.basic_block.
The tutorial for writing blocks in python is from gnuradio.org:
http://gnuradio.org/redmine/projects/gnuradio/wiki...
Hope this helps.
Thanks
on 2013-01-30 11:02
On Tue, Jan 29, 2013 at 7:00 AM, Nemanja Savic <vlasinac@gmail.com> wrote: > Guys, > > i am not able to load gr.basic_block and make signal processing block in > Python. Simplu, there is no binding within gnuradio/gr for that class. > It works perfectly for gr.hier)block2 class. > What might be the problem? > > Thanks > I'm not sure what you mean by "load gr.basic_block." Do you mean inherit from? For signal processing endpoints, you want to use either gr_block, gr_sync_block, gr_sync_decimator or gr_sync_interpolator. Tom
on 2013-01-31 06:26
Today I have tried again, but this time i used block as is designed by gr_modtool. It wont wen throught test, bu it reports: AttributeError: 'module' object has no attribute 'sync_block' It is becoming horror.
on 2013-01-31 06:39
On Wed, Jan 30, 2013 at 01:23:19PM +0100, Nemanja Savic wrote: > Today I have tried again, but this time i used block as is designed by > gr_modtool. It wont wen throught test, bu it reports: > > AttributeError: 'module' object has no attribute 'sync_block' > > > It is becoming horror. Nemanja, it seems like you haven't actually changed anything. To recap: - If you want Python blocks (gr.sync_block), you need > 3.6.3. - You're doing something with messages (right?) Perhaps you want msg_connect() rather than the old message queues (read Johnathan's release announcement) MB -- Karlsruhe Institute of Technology (KIT) Communications Engineering Lab (CEL) Dipl.-Ing. Martin Braun Research Associate Kaiserstraße 12 Building 05.01 76131 Karlsruhe Phone: +49 721 608-43790 Fax: +49 721 608-46071 www.cel.kit.edu KIT -- University of the State of Baden-Württemberg and National Laboratory of the Helmholtz Association
on 2013-01-31 09:16
In order to find which version I am using (since I have few build folders on my computer, and I don't know from which gnuradio was installed, because i tried a lot of times to install it without success (there were some problems since I am using RHEL6)) I decided to uninstall everything and make fresh new installation of gnuradio. I am receiving folloowing error from cmake: -- Uninstalling "/usr/local/share/doc/gnuradio-3.6.0/README" > CMake Error at cmake_uninstall.cmake:20 (ELSEIF): > had incorrect arguments: IS_SYMLINK "$ENV{DESTDIR}${file}" (Unknown > arguments specified). > > > make[3]: *** [CMakeFiles/uninstall] Error 1 > make[2]: *** [CMakeFiles/uninstall.dir/all] Error 2 > make[1]: *** [CMakeFiles/uninstall.dir/rule] Error 2 > make: *** [uninstall] Error 2 > I simply tried to make this file, but then there was another file missing, and so on. Is there any other way to uninstall gnuradio? Best
on 2013-01-31 11:36
Just install 3.6.3, you should be fine. Otherwise, manually browse through /usr/local and kill everything that looks GNU Radio-ish. MB On Wed, Jan 30, 2013 at 04:13:20PM +0100, Nemanja Savic wrote: > arguments specified). > > > Nemanja, > > > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio > > > > > > -- > Nemanja Savić > > _______________________________________________ > Discuss-gnuradio mailing list > Discuss-gnuradio@gnu.org > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio -- Karlsruhe Institute of Technology (KIT) Communications Engineering Lab (CEL) Dipl.-Ing. Martin Braun Research Associate Kaiserstraße 12 Building 05.01 76131 Karlsruhe Phone: +49 721 608-43790 Fax: +49 721 608-46071 www.cel.kit.edu KIT -- University of the State of Baden-Württemberg and National Laboratory of the Helmholtz Association
on 2013-01-31 14:50
I deleted everything that was Gnu Radio-ish and istalled fresh new version. But it doesn't work now. GRC won't start, it complains about environment variable, I checket, they are good. When I want to start uhd_fft I come the following error: Traceback (most recent call last): > "/usr/local/lib64/python2.6/site-packages/gnuradio/gr/gnuradio_core_runtime.py", > line 24, in <module> > _gnuradio_core_runtime = swig_import_helper() > File > "/usr/local/lib64/python2.6/site-packages/gnuradio/gr/gnuradio_core_runtime.py", > line 20, in swig_import_helper > _mod = imp.load_module('_gnuradio_core_runtime', fp, pathname, > description) > ImportError: libgnuradio-core-3.6.4git.so.0.0.0: cannot open shared object > fil > The problem is this objest does exist in this location: /usr/local/lib64 I am using RHEL6. Best On Thu, Jan 31, 2013 at 11:34 AM, Martin Braun (CEL)
on 2013-01-31 15:53
The problem was bad LD_LIBRARY_PATH. Can anybody explain: why with LD_LIBRARY_PATH=/usr/bin:usr/local/lib64:usr/local/lib, GRC won't run, and with LD_LIBRARY_PATH=/usr/local/lib64. it works?
on 2013-02-01 04:44
On Thu, Jan 31, 2013 at 9:52 AM, Nemanja Savic <vlasinac@gmail.com> wrote: > The problem was bad LD_LIBRARY_PATH. > Can anybody explain: > why with LD_LIBRARY_PATH=/usr/bin:usr/local/lib64:usr/local/lib, GRC won't > run, and with LD_LIBRARY_PATH=/usr/local/lib64. it works? > My only guess for that is you have something left over in one of those directories from a previous installation that's pointing to a wrong version. (Also, I wouldn't think that a bin directory ever needs to be in the library path.) Tom
on 2013-02-02 09:15
Guys,
As i told you my new installation works fine, I eve tested blocks in
python. Now, the problem is following:
I designed block in python which has None for both input and output
signature. I wanted to use such block only for receiving messages and
for
writing to terminal some information, etc.
The constructor of my new block, is executed, but the problem is work
function is never executed. I put some printing at the beginning of work
function and nothing happens. The work function looks like this:
def work(self, input_items, output_items):
> print "In work"
> while True:
> print "In loop"
> try: msg = self._msgq.delete_head()
> except: return -1
> print "Message received"
> return len(output_items[0])
>
In the flow graph, I have vector source and message sink which shares
message queue with my block. There are no errors.
Could the problem be no inputs and no outputs? Or maybe something else?
Best and thanks
Nemanja
on 2013-02-02 09:21
On Fri, Feb 1, 2013 at 10:12 AM, Nemanja Savic <vlasinac@gmail.com> wrote: > function and nothing happens. The work function looks like this: >> > > In the flow graph, I have vector source and message sink which shares > message queue with my block. There are no errors. > > Could the problem be no inputs and no outputs? Or maybe something else? > > Best and thanks > > Nemanja > If I recall... you have to connect /something/, so add a line 'self.connect(self)'. Tom
on 2013-02-02 09:24
> function and nothing happens. The work function looks like this: > > > Could the problem be no inputs and no outputs? Or maybe something else? > > Best and thanks > > Nemanja > Hi Nemanja, the work function is called by the scheduler, which only calls the work function, if it has some samples to process. So if your block is not part of the flow graph (which it isn't since you have no input or output stream) it will not get called. You could either create a Thread in the block's constructor which will call the work function (the start/stop functions seem to not being called either), or you could try the new message passing interface, where you can register a callback function that is called whenever a new message arrives. Yours Martin
on 2013-02-02 09:55
I am more than willing to try new message passing interface. The idea with the thread is a bit old, that's what I have heard, from more experienced guys. Are there any blocs that uses new message passing interface, so that I can take a look how it works? @Tom Nothing happened by adding self.connect(self) in top_block. This block design style i picked up from grExtras module. Maybe they use different "something", and their block is called even when it has no inputs/outputs. Best Nemanja
Please log in before posting. Registration is free and takes only a minute.
Existing account
(Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
Log in with Google account | Log in with Yahoo account
No account? Register here.