[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r9199 - gnuradio/branches/features/experimental-gui,
jblum <=