Hello

I am trying to write a GUI to do the transmissions made with the
benchmark_tx.py example. For some reason, after sending the 3rd packet, my
GUI would freeze and require force quit. I took code segments from GUI
examples and benchmark_tx.py and I am not understanding why the GUI is
freezing (and what causes it)

After importing the necessary libraries, I have a

*#gui class*
class benchmark_gui (stdgui2.std_top_block):

    def __init__(self,frame,panel,vbox,argv):
        stdgui2.std_top_block.__init__ (self,frame,panel,vbox,argv)

        *#define some paramters*
        self.panel= panel
        self.frame = frame

       * #build the gui*
        self._build_gui(vbox)

*#define the gui function*
    def _build_gui(self, vbox):

        self.myform = myform = form.form()

   *#function to begin the transmission (mostly from benchmark_tx)*
   def _form_set(kv):
            freq = kv['freq']
            mb = kv['mb']
            pktsize = kv['pktsize']

            mods = modulation_utils.type_1_mods()

                parser = OptionParser(option_class=eng_option,
conflict_handler="resolve")
                expert_grp = parser.add_option_group("Expert")

                parser.add_option("-m", "--modulation", type="choice",
choices=mods.keys(),
                      default='gmsk',
                      help="Select modulation from: %s [default=%%default]"
                            % (', '.join(mods.keys()),))
                parser.add_option("","--discontinuous", action="store_true",
default=False,
                      help="enable discontinous transmission (bursts of 5
packets)")
                parser.add_option("","--from-file", default=None,
                      help="use file for packet contents")

                transmit_path.add_options(parser, expert_grp)

                for mod in mods.values():
                    mod.add_options(expert_grp)

                (options, args) = parser.parse_args ()

           * #use the ones from form*
            options.tx_freq = freq
            options.megabytes = mb
            options.size = pktsize

            # build the graph
                tb = my_top_block(mods[options.modulation], options)

               r = gr.enable_realtime_scheduling()
                if r != gr.RT_OK:
                print "Warning: failed to enable realtime scheduling"

                tb.start()                       # start flow graph

            *#send packets*
            def send_pkt(payload='', eof=False):
                    return tb.txpath.send_pkt(payload, eof)

           * #generate and send packets*
            nbytes = int(1e6 * options.megabytes)
                n = 0
                pktno = 0
                pkt_size = int(options.size)

                while n < nbytes:
                if options.from_file is None:
                       data = (pkt_size - 2) * chr(pktno & 0xff)
                else:
                        data = source_file.read(pkt_size - 2)
                    if data == '':
                        break;

                payload = struct.pack('!H', pktno & 0xffff) + data
                send_pkt(payload)
                n += len(payload)
                self._set_status_msg("Sending %d packet of %d packets"%
(pktno,n), 0)
                if options.discontinuous and pktno % 5 == 4:
                        time.sleep(1)
                pktno += 1

                    send_pkt(eof=True)

                    tb.wait()                       # wait for it to finish

            self._set_status_msg("Done",0)

        hbox = wx.BoxSizer(wx.HORIZONTAL)
        hbox.Add((5,0), 0)
        myform['freq'] = form.float_field(
            parent=self.panel, sizer=hbox, label="Freq", weight=1,
            callback=myform.check_input_and_call(_form_set))
        vbox.Add(hbox, 0, wx.EXPAND)
        #number of packets
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        hbox2.Add((5,0), 0)
        myform['mb'] = form.float_field(
            parent=self.panel, sizer=hbox, label="MB to transmit", weight=1,
            callback=myform.check_input_and_call(_form_set))
        vbox.Add(hbox2, 0, wx.EXPAND)
        #packet size
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        hbox3.Add((5,0), 0)
        myform['pktsize'] = form.float_field(
            parent=self.panel, sizer=hbox, label="Packet Size", weight=1,
            callback=myform.check_input_and_call(_form_set))
        vbox.Add(hbox3, 0, wx.EXPAND)

        st1 = wx.StaticText(self.panel, -1, "Input settings and hit enter",
style=wx.ALIGN_CENTRE)
        vbox.Add(st1, 1, wx.EXPAND |  wx.TOP | wx.BOTTOM, 15)

    *#status reporting function*
    def _set_status_msg(self, msg, which=0):
        self.frame.GetStatusBar().SetStatusText(msg, which)

and I simply copied the class from benchmark_tx.py like so:

*#class for transmission*
class my_top_block(gr.top_block):
    def __init__(self, modulator, options):
        gr.top_block.__init__(self)
        self.txpath = transmit_path(modulator, options)
        self.connect(self.txpath)

Basically, the code flows (from what I am understanding) as: the
benchmark_gui is called, and then the user then input the settings, and upon
hitting Enter, the code goes into _form_set function which takes the
settings and then prepare the USRP to transmit at those settings, creates a
my_top_block object, and then generate and send packets. I thought that by
copying the settings i didnt touch from benchmark_tx, I should be able to
run my GUI. But after the 3rd packet, the GUI freezes.

Please help.
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
http://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to