commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r9199 - gnuradio/branches/features/experimental-gui


From: jblum
Subject: [Commit-gnuradio] r9199 - gnuradio/branches/features/experimental-gui
Date: Wed, 6 Aug 2008 18:53:13 -0600 (MDT)

Author: jblum
Date: 2008-08-06 18:53:11 -0600 (Wed, 06 Aug 2008)
New Revision: 9199

Modified:
   gnuradio/branches/features/experimental-gui/grc_numbersink_test.py
   gnuradio/branches/features/experimental-gui/number_window.py
   gnuradio/branches/features/experimental-gui/numbersink.py
Log:
numbersink work

Modified: gnuradio/branches/features/experimental-gui/grc_numbersink_test.py
===================================================================
--- gnuradio/branches/features/experimental-gui/grc_numbersink_test.py  
2008-08-06 22:54:52 UTC (rev 9198)
+++ gnuradio/branches/features/experimental-gui/grc_numbersink_test.py  
2008-08-07 00:53:11 UTC (rev 9199)
@@ -43,15 +43,13 @@
                ##################################################
                # Blocks
                ##################################################
-               self.gr_sig_source_x = gr.sig_source_f(0, gr.GR_CONST_WAVE, 0, 
ampl, 0)
-               self.gr_throttle = gr.throttle(gr.sizeof_float*1, samp_rate)
-               self.wxgui_numbersink2 = numbersink.number_sink_f(
+               self.gr_sig_source_x = gr.sig_source_c(0, gr.GR_CONST_WAVE, 0, 
0, ampl+.5*ampl*1j)
+               self.gr_throttle = gr.throttle(gr.sizeof_gr_complex*1, 
samp_rate)
+               self.wxgui_numbersink2 = numbersink.number_sink_c(
                        self.GetWin(),
                        minval=0,
                        maxval=100,
-                       decimal_places=3,
                        sample_rate=samp_rate,
-                       title="Number Plot",
                )
                self.Add(self.wxgui_numbersink2.win)
 
@@ -66,7 +64,7 @@
 
        def set_ampl(self, ampl):
                self.ampl = ampl
-               self.gr_sig_source_x.set_amplitude(self.ampl)
+               self.gr_sig_source_x.set_offset(self.ampl+.5*self.ampl*1j)
 
 if __name__ == '__main__':
        tb = grc_numbersink_test()

Modified: gnuradio/branches/features/experimental-gui/number_window.py
===================================================================
--- gnuradio/branches/features/experimental-gui/number_window.py        
2008-08-06 22:54:52 UTC (rev 9198)
+++ gnuradio/branches/features/experimental-gui/number_window.py        
2008-08-07 00:53:11 UTC (rev 9199)
@@ -30,11 +30,53 @@
 ##################################################
 # Constants
 ##################################################
+SLIDER_STEPS = 100
+AVG_ALPHA_MIN_EXP, AVG_ALPHA_MAX_EXP = -3, 0
 DEFAULT_NUMBER_RATE = 2
 DEFAULT_WIN_SIZE = (300, 300)
 DEFAULT_GAUGE_RANGE = 1000
+PEAK_HOLD_KEY = 'peak_hold'
+RUNNING_KEY = 'running'
 
 ##################################################
+# Number window control panel
+##################################################
+class control_panel(wx.Panel):
+       """!
+       A control panel with wx widgits to control the averaging.
+       """
+
+       def __init__(self, parent):
+               """!
+               Create a new control panel.
+               @param parent the wx parent window
+               """
+               self.parent = parent
+               wx.Panel.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
+               control_box = wx.BoxSizer(wx.VERTICAL)
+               #checkboxes for average and peak hold
+               control_box.AddStretchSpacer()
+               control_box.Add(common.LabelText(self, 'Options'), 0, 
wx.ALIGN_CENTER)
+               self.average_check_box = common.CheckBoxController(self, 
'Average', parent.ext_controller, parent.average_key)
+               control_box.Add(self.average_check_box, 0, wx.EXPAND)
+               self.peak_hold_check_box = common.CheckBoxController(self, 
'Peak Hold', parent, PEAK_HOLD_KEY)
+               control_box.Add(self.peak_hold_check_box, 0, wx.EXPAND)
+               control_box.AddSpacer(2)
+               self.avg_alpha_slider = common.LogSliderController(
+                       self, 'Avg Alpha',
+                       AVG_ALPHA_MIN_EXP, AVG_ALPHA_MAX_EXP, SLIDER_STEPS,
+                       parent.ext_controller, parent.avg_alpha_key,
+               )
+               parent.ext_controller.subscribe(parent.average_key, 
self.avg_alpha_slider.Enable)
+               control_box.Add(self.avg_alpha_slider, 0, wx.EXPAND)
+               #run/stop
+               control_box.AddStretchSpacer()
+               self.run_button = common.RunStopButtonController(self, parent, 
RUNNING_KEY)
+               control_box.Add(self.run_button, 0, wx.EXPAND)
+               #set sizer
+               self.SetSizerAndFit(control_box)
+
+##################################################
 # Numbersink window with label and gauges
 ##################################################
 class number_window(wx.Panel, pubsub.pubsub, common.prop_setter):
@@ -44,38 +86,87 @@
                controller,
                size,
                title,
+               units,
                show_gauge,
+               real,
                minval,
                maxval,
                decimal_places,
+               average_key,
+               avg_alpha_key,
+               peak_hold,
                msg_key,
        ):
                pubsub.pubsub.__init__(self)
                wx.Panel.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
                #setup
+               self.peak_val_real = float('-inf')
+               self.peak_val_imag = float('-inf')
+               self.ext_controller = controller
+               self.real = real
+               self.units = units
                self.minval = minval
                self.maxval = maxval
                self.decimal_places = decimal_places
-               #gui setup
-               self.ext_controller = controller
+               self.average_key = average_key
+               self.avg_alpha_key = avg_alpha_key
+               #setup the box with display and controls
+               self.control_panel = control_panel(self)
+               main_box = wx.BoxSizer(wx.HORIZONTAL)
                sizer = wx.BoxSizer(wx.VERTICAL)
+               main_box.Add(sizer, 1, wx.EXPAND)
+               main_box.Add(self.control_panel, 0, wx.EXPAND)
                sizer.Add(common.LabelText(self, title), 1, wx.ALIGN_CENTER)
-               self.text = wx.StaticText(self)
+               self.text = wx.StaticText(self, size=(size[0], -1))
                sizer.Add(self.text, 1, wx.EXPAND)
-               self.gauge = wx.Gauge(self, range=DEFAULT_GAUGE_RANGE, 
style=wx.GA_HORIZONTAL)
-               if show_gauge: self.gauge.Show()
-               else: self.gauge.Hide()
-               sizer.Add(self.gauge, 1, wx.EXPAND)
-               self.SetSizerAndFit(sizer)
+               self.gauge_real = wx.Gauge(self, range=DEFAULT_GAUGE_RANGE, 
style=wx.GA_HORIZONTAL)
+               self.gauge_imag = wx.Gauge(self, range=DEFAULT_GAUGE_RANGE, 
style=wx.GA_HORIZONTAL)
+               #hide/show gauges
+               self.show_gauges(show_gauge)
+               sizer.Add(self.gauge_real, 1, wx.EXPAND)
+               sizer.Add(self.gauge_imag, 1, wx.EXPAND)
+               self.SetSizerAndFit(main_box)
+               #initial setup
+               self.ext_controller[self.average_key] = 
self.ext_controller[self.average_key]
+               self.ext_controller[self.avg_alpha_key] = 
self.ext_controller[self.avg_alpha_key]
+               self._register_set_prop(self, PEAK_HOLD_KEY, peak_hold)
+               self._register_set_prop(self, RUNNING_KEY, True)
                #register events
                self.ext_controller.subscribe(msg_key, self.handle_msg)
 
+       def show_gauges(self, show_gauge):
+               if show_gauge: self.gauge_real.Show()
+               else: self.gauge_real.Hide()
+               if show_gauge and not self.real: self.gauge_imag.Show()
+               else: self.gauge_imag.Hide()
+
        def handle_msg(self, msg):
-               sample = numpy.fromstring(msg, numpy.float32)[0]
-               format = "%%.%df"%self.decimal_places
-               self.text.SetLabel(format%sample)
-               #set gauge value
-               gauge_val = 
DEFAULT_GAUGE_RANGE*(sample-self.minval)/(self.maxval-self.minval)
-               gauge_val = max(0, gauge_val) #clip
-               gauge_val = min(DEFAULT_GAUGE_RANGE, gauge_val) #clip
-               self.gauge.SetValue(gauge_val)
+               if not self[RUNNING_KEY]: return
+               #set text
+               format_string = "%%.%df"%self.decimal_places
+               if self.real:
+                       sample = numpy.fromstring(msg, numpy.float32)[0]
+                       if self[PEAK_HOLD_KEY]: sample = self.peak_val_real = 
max(self.peak_val_real, sample)
+                       else: self.peak_val_real = float('-inf')
+                       label_text = "%s %s"%(format_string%sample, self.units)
+               else:
+                       sample = numpy.fromstring(msg, numpy.complex64)[0]
+                       if self[PEAK_HOLD_KEY]:
+                               self.peak_val_real = max(self.peak_val_real, 
sample.real)
+                               self.peak_val_imag = max(self.peak_val_imag, 
sample.imag)
+                               sample = self.peak_val_real + 
self.peak_val_imag*1j
+                       else:
+                               self.peak_val_real = float('-inf')
+                               self.peak_val_imag = float('-inf')
+                       label_text = "%s + %sj %s"%(format_string%sample.real, 
format_string%sample.imag, self.units)
+               self.text.SetLabel(label_text)
+               #set gauge
+               def set_gauge_value(gauge, value):
+                       gauge_val = 
DEFAULT_GAUGE_RANGE*(value-self.minval)/(self.maxval-self.minval)
+                       gauge_val = max(0, gauge_val) #clip
+                       gauge_val = min(DEFAULT_GAUGE_RANGE, gauge_val) #clip
+                       gauge.SetValue(gauge_val)
+               if self.real: set_gauge_value(self.gauge_real, sample)
+               else:
+                       set_gauge_value(self.gauge_real, sample.real)
+                       set_gauge_value(self.gauge_imag, sample.imag)

Modified: gnuradio/branches/features/experimental-gui/numbersink.py
===================================================================
--- gnuradio/branches/features/experimental-gui/numbersink.py   2008-08-06 
22:54:52 UTC (rev 9198)
+++ gnuradio/branches/features/experimental-gui/numbersink.py   2008-08-07 
00:53:11 UTC (rev 9199)
@@ -31,12 +31,14 @@
 # Constants
 ##################################################
 SAMPLE_RATE_KEY = 'sample_rate'
+AVERAGE_KEY = 'average'
+AVG_ALPHA_KEY = 'avg_alpha'
 MSG_KEY = 'msg'
 
 ##################################################
 # Number sink block (wrapper for old wxgui)
 ##################################################
-class number_sink_f(gr.hier_block2, common.prop_setter):
+class _number_sink_base(gr.hier_block2, common.prop_setter):
        """!
        An decimator block with a number window display
        """
@@ -44,35 +46,60 @@
        def __init__(
                self,
                parent,
+               unit='units',
+               base_value=None, #ignore (old wrapper)
                minval=0,
                maxval=1,
+               factor=1,
                decimal_places=3,
-               show_gauge=True,
+               ref_level=0,
                sample_rate=1,
                number_rate=number_window.DEFAULT_NUMBER_RATE,
-               title='',
+               average=False,
+               avg_alpha=None,
+               label='Number Plot',
                size=number_window.DEFAULT_WIN_SIZE,
+               peak_hold=False,
+               show_gauge=True,
        ):
+               #ensure avg alpha
+               if avg_alpha is None: avg_alpha = 2.0/number_rate
+               self._avg_alpha = avg_alpha
+               self.set_average(average)
+               self.set_avg_alpha(avg_alpha)
+               #init
                gr.hier_block2.__init__(
                        self,
                        "number_sink",
-                       gr.io_signature(1, 1, gr.sizeof_float),
+                       gr.io_signature(1, 1, self._item_size),
                        gr.io_signature(0, 0, 0),
                )
                #blocks
-               msgq = gr.msg_queue(2)
                sd = blks2.stream_to_vector_decimator(
-                       item_size=gr.sizeof_float,
+                       item_size=self._item_size,
                        sample_rate=sample_rate,
                        vec_rate=number_rate,
                        vec_len=1,
                )
-               sink = gr.message_sink(gr.sizeof_float, msgq, True)
+               if self._real:
+                       mult = gr.multiply_const_ff(factor)
+                       add = gr.add_const_ff(ref_level)
+                       self._avg = gr.single_pole_iir_filter_ff(1.0)
+               else:
+                       mult = gr.multiply_const_cc(factor)
+                       add = gr.add_const_cc(ref_level)
+                       self._avg = gr.single_pole_iir_filter_cc(1.0)
+               msgq = gr.msg_queue(2)
+               sink = gr.message_sink(self._item_size, msgq, True)
                #connect
-               self.connect(self, sd, sink)
+               self.connect(self, sd, mult, add, self._avg, sink)
                #controller
                self.controller = pubsub()
                self.controller.subscribe(SAMPLE_RATE_KEY, sd.set_sample_rate)
+               self.controller.subscribe(AVERAGE_KEY, self.set_average)
+               self.controller.publish(AVERAGE_KEY, self.get_average)
+               self.controller.subscribe(AVG_ALPHA_KEY, self.set_avg_alpha)
+               self.controller.publish(AVG_ALPHA_KEY, self.get_avg_alpha)
                #start input watcher
                def set_msg(msg): self.controller[MSG_KEY] = msg
                common.input_watcher(msgq, set_msg)
@@ -81,14 +108,39 @@
                        parent=parent,
                        controller=self.controller,
                        size=size,
-                       title=title,
+                       title=label,
+                       units=unit,
+                       real=self._real,
                        minval=minval,
                        maxval=maxval,
                        decimal_places=decimal_places,
                        show_gauge=show_gauge,
+                       average_key=AVERAGE_KEY,
+                       avg_alpha_key=AVG_ALPHA_KEY,
+                       peak_hold=peak_hold,
                        msg_key=MSG_KEY,
                )
                #register callbacks from window for external use
                for attr in filter(lambda a: a.startswith('set_'), 
dir(self.win)):
                        setattr(self, attr, getattr(self.win, attr))
                self._register_set_prop(self.controller, SAMPLE_RATE_KEY)
+
+       def get_average(self): return self._average
+       def set_average(self, average):
+               self._average = average
+               #FIXME 
+               #if self.get_average(): self._avg.set_taps(self.get_avg_alpha())
+               #else: self._avg.set_taps(1.0)
+
+       def get_avg_alpha(self): return self._avg_alpha
+       def set_avg_alpha(self, avg_alpha):
+               self._avg_alpha = avg_alpha
+               self.set_average(self.get_average())
+
+class number_sink_f(_number_sink_base):
+       _item_size = gr.sizeof_float
+       _real = True
+
+class number_sink_c(_number_sink_base):
+       _item_size = gr.sizeof_gr_complex
+       _real = False





reply via email to

[Prev in Thread] Current Thread [Next in Thread]