Fwd: Write a source block in python

Hi

I wrote a simple source block that reads a string (as a parameter) and
outputs the corresponding array of bytes.
Here is the code:

class myblock(gr.sync_block):

def __init__(self, helloMsg):
    gr.sync_block.__init__(self,
        name="myblock",
        in_sig=None,
        out_sig=[numpy.byte])
    self.helloMsg = helloMsg

def work(self, input_items, output_items):
    out = output_items[0]

    test = array.array('B',self.helloMsg)
    for j in range(len(test)):
       out[j] = test[j]
    return len(output_items[0][:len(test)])

In the output I repeatedly get the helloMsg. (it seems that the work()
function is always running)
Is it possible to get in the output my helloMsg only one time (or a
specific amount of times) and then stop the execution of the flowgraph?

Thank you in advance!
Thanasis

I think having the work fn return “-1” will cause the flowgraph to exit,
so you could potentially have a “self.count = 1” in init and then
when you’ve output >= self.count, have work return -1

-Doug

Douglas Anderson | Intern
DOC/NTIA/ITS-T | 325 Broadway St., Boulder, CO 80305 | P: 303 497 3582


From: discuss-gnuradio-bounces+danderson=removed_email_address@domain.invalid
[discuss-gnuradio-bounces+danderson=removed_email_address@domain.invalid] on behalf
of Thanasis B. [[email protected]]
Sent: Thursday, January 22, 2015 2:12 PM
To: [email protected]
Subject: [Discuss-gnuradio] Fwd: Write a source block in python

Hi

I wrote a simple source block that reads a string (as a parameter) and
outputs the corresponding array of bytes.
Here is the code:

class myblock(gr.sync_block):

def __init__(self, helloMsg):
    gr.sync_block.__init__(self,
        name="myblock",
        in_sig=None,
        out_sig=[numpy.byte])
    self.helloMsg = helloMsg

def work(self, input_items, output_items):
    out = output_items[0]

    test = array.array('B',self.helloMsg)
    for j in range(len(test)):
       out[j] = test[j]
    return len(output_items[0][:len(test)])

In the output I repeatedly get the helloMsg. (it seems that the work()
function is always running)
Is it possible to get in the output my helloMsg only one time (or a
specific amount of times) and then stop the execution of the flowgraph?

Thank you in advance!
Thanasis

Thank you Doug!

return -1 indeed cause the flowgraph to exit. Is there any trick to stop
also the execution on my program (after 1 sec)?
Another problem I have is that the output is always 32768 bytes
def work(self, input_items, output_items):

return len(output_items[0])

If I change it to this:
return len(output_items[0][:len(test)])
my output becomes empty
Is it possible to get in the output the exact number of bytes of my
helloMsg parameter?

2015-01-22 23:31 GMT+02:00 Anderson, Douglas J.
[email protected]:

On 01/22/2015 11:53 PM, Thanasis B. wrote:

Thank you Doug!

return -1 indeed cause the flowgraph to exit. Is there any trick to stop
also the execution on my program (after 1 sec)?

You can exit whenever you like. E.g. run a timer until 1 sec is over and
then return -1.

When you return -1, the FG should shut down by itself.

Another problem I have is that the output is always 32768 bytes

You have no problem: Your output buffer is of this size. Your output
size is whatever you return (something like return len(test) would be
what you want).

M

Hi,

I think having the work fn return “-1” will cause the flowgraph to exit,
so you could potentially have a “self.count = 1” in init and then
when you’ve output >= self.count, have work return -1

What exactly do you mean by output >= self.count? I understand the count
part obviously, but I didn’t quite get what we are comparing to the
count. Is it the len(output_items[0])? And if this is greater than or
equal to the count then work returns -1? Is that what you mean?

I’m trying to code a python source block myself and I’m facing a similar
issue, where I am getting a repeated output infinite times.

thanks a lot
AKY

Hi,

I am trying to create a similar source block using python. I am new to
Python and I have couple questions here:

  1. How do you change your work function in order to output the message
    only once? I get either 0 output (output file with 0 Bytes) or repeated
    output, I don’t know where should i put “return -1”.
  2. what is the difference between
    “for j in range(len(test)):
    out[j] = test[j]”
    and
    “out[:len(test)] = test” ?
  3. what is the difference between “return len(test)” and “return
    len(output_items[0])”? So the return value only determines the output
    size?

Thank you so much!

Hai

Martin B. wrote in post #1167125:

On 01/22/2015 11:53 PM, Thanasis B. wrote:

Thank you Doug!

return -1 indeed cause the flowgraph to exit. Is there any trick to stop
also the execution on my program (after 1 sec)?

You can exit whenever you like. E.g. run a timer until 1 sec is over and
then return -1.

When you return -1, the FG should shut down by itself.

Another problem I have is that the output is always 32768 bytes

You have no problem: Your output buffer is of this size. Your output
size is whatever you return (something like return len(test) would be
what you want).

M