[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r4785 - gnuradio/branches/developers/michaelld/scopesi
From: |
michaelld |
Subject: |
[Commit-gnuradio] r4785 - gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python |
Date: |
Mon, 19 Mar 2007 20:33:10 -0600 (MDT) |
Author: michaelld
Date: 2007-03-19 20:33:10 -0600 (Mon, 19 Mar 2007)
New Revision: 4785
Modified:
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/fftsink.py
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/form.py
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/scopesink.py
Log:
Work in progress to upgrade GUI components to pass through overall hbox.
Modified:
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/fftsink.py
===================================================================
---
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/fftsink.py
2007-03-20 02:13:06 UTC (rev 4784)
+++
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/fftsink.py
2007-03-20 02:33:10 UTC (rev 4785)
@@ -1,6 +1,6 @@
#!/usr/bin/env python
#
-# Copyright 2003,2004,2005,2006 Free Software Foundation, Inc.
+# Copyright 2003-2007 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -26,17 +26,25 @@
import gnuradio.wxgui.plot as plot
import Numeric
import threading
-import math
+import math
-default_fftsink_size = (640,240)
+default_fftsink_size = (640, 240)
default_fft_rate = gr.prefs().get_long('wxgui', 'fft_rate', 15)
-class fft_sink_base(object):
- def __init__(self, input_is_real=False, baseband_freq=0, y_per_div=10,
ref_level=50,
- sample_rate=1, fft_size=512,
- fft_rate=default_fft_rate,
- average=False, avg_alpha=None, title='', peak_hold=False):
+class fft_sink_base (object):
+ def __init__ (self, fg, parent, baseband_freq, y_per_div, ref_level,
+ sample_rate, fft_size, fft_rate, average, avg_alpha,
+ title, size, peak_hold, vbox, input_is_real=True):
+ if not vbox:
+ print ''
+ print "ERROR: A 'vbox' is required by 'fft_sink' for correct " + \
+ "functionality.\nPlease add it to the function call " + \
+ "and remove any calling function\nreferences " + \
+ "such as 'vbox.Add' of the returned 'fft_sink.win' ."
+ print ''
+ raise ValueError, vbox
+
# initialize common attributes
self.baseband_freq = baseband_freq
self.y_divs = 8
@@ -53,8 +61,42 @@
self.title = title
self.peak_hold = peak_hold
self.input_is_real = input_is_real
- self.msgq = gr.msg_queue(2) # queue that holds a maximum of 2
messages
+ # queue that holds a maximum of 2 messages
+ self.msgq = gr.msg_queue (2)
+ mywindow = window.blackmanharris (fft_size)
+ # find the window power
+ power = 0
+ for tap in mywindow:
+ power += (tap * tap)
+ if input_is_real:
+ local_el_size = gr.sizeof_float
+ fft = gr.fft_vfc (self.fft_size, True, mywindow)
+ else:
+ local_el_size = gr.sizeof_gr_complex
+ fft = gr.fft_vcc (self.fft_size, True, mywindow)
+
+ s2p = gr.stream_to_vector (local_el_size, fft_size)
+ self.one_in_n = gr.keep_one_in_n \
+ (local_el_size* fft_size,
+ max (1, int (sample_rate / fft_size / fft_rate)))
+ c2mag = gr.complex_to_mag (fft_size)
+ self.avg = gr.single_pole_iir_filter_ff (1.0, fft_size)
+ # FIXME? from REAL: We need to add 3dB to all bins but the DC bin
+ log = gr.nlog10_ff (20, self.fft_size,
+ (-20 * math.log10 (fft_size)) -
+ (10 * math.log10 (power / fft_size)))
+ sink = gr.message_sink (gr.sizeof_float * fft_size,
+ self.msgq, True)
+ fg.connect (s2p, self.one_in_n, fft, c2mag, self.avg, log, sink)
+ gr.hier_block.__init__ (self, fg, s2p, sink)
+ self.win = fft_window (self, parent, size=size)
+ self.set_average (self.average)
+
+ # add the new window Widget to the vbox
+ vbox.Add (self.win, 1, wx.EXPAND)
+ self.sizer = vbox
+
def set_y_per_div(self, y_per_div):
self.y_per_div = y_per_div
@@ -86,88 +128,39 @@
self._set_n()
def _set_n(self):
- self.one_in_n.set_n(max(1,
int(self.sample_rate/self.fft_size/self.fft_rate)))
-
+ n = int (self.sample_rate / self.fft_size / self.fft_rate)
+ self.one_in_n.set_n (max (1, n))
-class fft_sink_f(gr.hier_block, fft_sink_base):
- def __init__(self, fg, parent, baseband_freq=0,
- y_per_div=10, ref_level=50, sample_rate=1, fft_size=512,
- fft_rate=default_fft_rate, average=False, avg_alpha=None,
- title='', size=default_fftsink_size, peak_hold=False):
- fft_sink_base.__init__(self, input_is_real=True,
baseband_freq=baseband_freq,
- y_per_div=y_per_div, ref_level=ref_level,
- sample_rate=sample_rate, fft_size=fft_size,
- fft_rate=fft_rate,
- average=average, avg_alpha=avg_alpha,
title=title,
- peak_hold=peak_hold)
-
- s2p = gr.stream_to_vector(gr.sizeof_float, self.fft_size)
- self.one_in_n = gr.keep_one_in_n(gr.sizeof_float * self.fft_size,
- max(1,
int(self.sample_rate/self.fft_size/self.fft_rate)))
+class fft_sink_f (gr.hier_block, fft_sink_base):
+ def __init__ (self, fg, parent, baseband_freq=0, y_per_div=10,
+ ref_level=50, sample_rate=1, fft_size=512,
+ fft_rate=default_fft_rate, average=False, avg_alpha=None,
+ title='', size=default_fftsink_size, peak_hold=False,
+ vbox=None):
- mywindow = window.blackmanharris(self.fft_size)
- fft = gr.fft_vfc(self.fft_size, True, mywindow)
- power = 0
- for tap in mywindow:
- power += tap*tap
-
- c2mag = gr.complex_to_mag(self.fft_size)
- self.avg = gr.single_pole_iir_filter_ff(1.0, self.fft_size)
+ fft_sink_base.__init__ (self, fg, parent, baseband_freq, y_per_div,
+ ref_level, sample_rate, fft_size, fft_rate,
+ average, avg_alpha, title, size, peak_hold,
+ vbox, input_is_real=True)
- # FIXME We need to add 3dB to all bins but the DC bin
- log = gr.nlog10_ff(20, self.fft_size,
-
-20*math.log10(self.fft_size)-10*math.log10(power/self.fft_size))
- sink = gr.message_sink(gr.sizeof_float * self.fft_size, self.msgq,
True)
+class fft_sink_c (gr.hier_block, fft_sink_base):
+ def __init__ (self, fg, parent, baseband_freq=0,
+ y_per_div=10, ref_level=50, sample_rate=1, fft_size=512,
+ fft_rate=default_fft_rate, average=False, avg_alpha=None,
+ title='', size=default_fftsink_size, peak_hold=False,
+ vbox=None):
- fg.connect (s2p, self.one_in_n, fft, c2mag, self.avg, log, sink)
- gr.hier_block.__init__(self, fg, s2p, sink)
+ fft_sink_base.__init__ (self, fg, parent, baseband_freq, y_per_div,
+ ref_level, sample_rate, fft_size, fft_rate,
+ average, avg_alpha, title, size, peak_hold,
+ vbox, input_is_real=False)
- self.win = fft_window(self, parent, size=size)
- self.set_average(self.average)
-
-
-class fft_sink_c(gr.hier_block, fft_sink_base):
- def __init__(self, fg, parent, baseband_freq=0,
- y_per_div=10, ref_level=50, sample_rate=1, fft_size=512,
- fft_rate=default_fft_rate, average=False, avg_alpha=None,
- title='', size=default_fftsink_size, peak_hold=False):
-
- fft_sink_base.__init__(self, input_is_real=False,
baseband_freq=baseband_freq,
- y_per_div=y_per_div, ref_level=ref_level,
- sample_rate=sample_rate, fft_size=fft_size,
- fft_rate=fft_rate,
- average=average, avg_alpha=avg_alpha,
title=title,
- peak_hold=peak_hold)
-
- s2p = gr.stream_to_vector(gr.sizeof_gr_complex, self.fft_size)
- self.one_in_n = gr.keep_one_in_n(gr.sizeof_gr_complex * self.fft_size,
- max(1,
int(self.sample_rate/self.fft_size/self.fft_rate)))
- mywindow = window.blackmanharris(self.fft_size)
- power = 0
- for tap in mywindow:
- power += tap*tap
-
- fft = gr.fft_vcc(self.fft_size, True, mywindow)
- c2mag = gr.complex_to_mag(fft_size)
- self.avg = gr.single_pole_iir_filter_ff(1.0, fft_size)
- log = gr.nlog10_ff(20, self.fft_size,
-
-20*math.log10(self.fft_size)-10*math.log10(power/self.fft_size))
- sink = gr.message_sink(gr.sizeof_float * fft_size, self.msgq, True)
-
- fg.connect(s2p, self.one_in_n, fft, c2mag, self.avg, log, sink)
- gr.hier_block.__init__(self, fg, s2p, sink)
-
- self.win = fft_window(self, parent, size=size)
- self.set_average(self.average)
-
-
# ------------------------------------------------------------------------
myDATA_EVENT = wx.NewEventType()
EVT_DATA_EVENT = wx.PyEventBinder (myDATA_EVENT, 0)
-
class DataEvent(wx.PyEvent):
def __init__(self, data):
wx.PyEvent.__init__(self)
@@ -177,7 +170,6 @@
def Clone (self):
self.__class__ (self.GetId())
-
class input_watcher (threading.Thread):
def __init__ (self, msgq, fft_size, event_receiver, **kwds):
threading.Thread.__init__ (self, **kwds)
@@ -207,7 +199,6 @@
wx.PostEvent (self.event_receiver, de)
del de
-
class fft_window (plot.PlotCanvas):
def __init__ (self, fftsink, parent, id = -1,
pos = wx.DefaultPosition, size = wx.DefaultSize,
@@ -231,12 +222,10 @@
self.input_watcher = input_watcher(fftsink.msgq, fftsink.fft_size,
self)
-
def on_close_window (self, event):
- print "fft_window:on_close_window"
+# print "fft_window:on_close_window"
self.keep_running = False
-
def set_data (self, evt):
dB = evt.data
L = len (dB)
@@ -291,7 +280,8 @@
def update_y_range (self):
ymax = self.fftsink.ref_level
- ymin = self.fftsink.ref_level - self.fftsink.y_per_div *
self.fftsink.y_divs
+ ymin = self.fftsink.ref_level - (self.fftsink.y_per_div *
+ self.fftsink.y_divs)
self.y_range = self._axisInterval ('min', ymin, ymax)
def on_average(self, evt):
@@ -334,7 +324,6 @@
elif Id == self.id_y_per_div_20:
self.fftsink.set_y_per_div(20)
-
def on_right_click(self, event):
menu = self.popup_menu
for id, pred in self.checkmarks.items():
@@ -342,7 +331,6 @@
item.Check(pred())
self.PopupMenu(menu, event.GetPosition())
-
def build_popup_menu(self):
self.id_incr_ref_level = wx.NewId()
self.id_decr_ref_level = wx.NewId()
@@ -368,7 +356,6 @@
self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_10)
self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_20)
-
# make a menu
menu = wx.Menu()
self.popup_menu = menu
@@ -396,7 +383,6 @@
self.id_y_per_div_20 : lambda : self.fftsink.y_per_div == 20,
}
-
def next_up(v, seq):
"""
Return the first item in seq that is > v.
@@ -418,7 +404,6 @@
return s
return v
-
# ----------------------------------------------------------------
# Deprecated interfaces
# ----------------------------------------------------------------
@@ -457,26 +442,34 @@
input_rate = 20.48e3
# Generate a complex sinusoid
- #src1 = gr.sig_source_c (input_rate, gr.GR_SIN_WAVE, 2e3, 1)
- src1 = gr.sig_source_c (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1)
+ src1 = gr.sig_source_c (input_rate, gr.GR_SIN_WAVE, 2e3, 1)
+ #src1 = gr.sig_source_c (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1)
# We add these throttle blocks so that this demo doesn't
# suck down all the CPU available. Normally you wouldn't use these.
thr1 = gr.throttle(gr.sizeof_gr_complex, input_rate)
+ use_vbox = True
+ if not use_vbox:
+ l_vbox = None
+ else:
+ l_vbox = vbox
+
sink1 = fft_sink_c (self, panel, title="Complex Data",
fft_size=fft_size,
sample_rate=input_rate, baseband_freq=100e3,
- ref_level=0, y_per_div=20)
- vbox.Add (sink1.win, 1, wx.EXPAND)
+ ref_level=0, y_per_div=20, vbox=l_vbox)
+ if not use_vbox:
+ vbox.Add (sink1.win, 1, wx.EXPAND)
self.connect (src1, thr1, sink1)
- #src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 2e3, 1)
- src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1)
+ src2 = gr.sig_source_f (input_rate, gr.GR_SIN_WAVE, 2e3, 1)
+ #src2 = gr.sig_source_f (input_rate, gr.GR_CONST_WAVE, 5.75e3, 1)
thr2 = gr.throttle(gr.sizeof_float, input_rate)
sink2 = fft_sink_f (self, panel, title="Real Data",
fft_size=fft_size*2,
sample_rate=input_rate, baseband_freq=100e3,
- ref_level=0, y_per_div=20)
- vbox.Add (sink2.win, 1, wx.EXPAND)
+ ref_level=0, y_per_div=20, vbox=l_vbox)
+ if not use_vbox:
+ vbox.Add (sink2.win, 1, wx.EXPAND)
self.connect (src2, thr2, sink2)
def main ():
Modified:
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/form.py
===================================================================
---
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/form.py
2007-03-20 02:13:06 UTC (rev 4784)
+++
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/form.py
2007-03-20 02:33:10 UTC (rev 4785)
@@ -27,12 +27,13 @@
# Wrappers for certain widgets
# ----------------------------------------------------------------
-def button_with_callback(parent, label, callback):
- new_id = wx.NewId()
- btn = wx.Button(parent, new_id, label)
- wx.EVT_BUTTON(parent, new_id, lambda evt: callback())
+def button_with_callback (parent, label, callback, sizer,
+ sizer_add_flags=wx.CENTER):
+ new_id = wx.NewId ()
+ btn = wx.Button (parent, new_id, label)
+ wx.EVT_BUTTON (parent, new_id, lambda evt: callback ())
+ sizer.Add (btn, 0, sizer_add_flags)
return btn
-
# ----------------------------------------------------------------
# Format converters
@@ -41,13 +42,14 @@
class abstract_converter(object):
def value_to_prim(self, v):
"""
- Convert from user specified value to value acceptable to underlying
primitive.
- The underlying primitive usually expects strings.
+ Convert from user specified value to value acceptable to the
+ underlying primitive. The underlying primitive usually
+ expects strings.
"""
raise NotImplementedError
def prim_to_value(self, s):
"""
- Convert from underlying primitive value to user specified value.
+ Convert from the underlying primitive value to user specified value.
The underlying primitive usually expects strings.
"""
raise NotImplementedError
@@ -98,7 +100,8 @@
def get_value_with_check(self):
"""
- Returns (value, error_msg), where error_msg is not None if there was
problem
+ Returns (value, error_msg), where error_msg is not None
+ if there was problem
"""
try:
return (self.get_value(), None)
@@ -111,24 +114,17 @@
def _get_prim_value(self):
raise NotImplementedError
- def _pair_with_label(self, widget, parent=None, sizer=None, label=None,
weight=1):
+ def _pair_with_label(self, widget, parent, sizer, label=None, weight=1):
self.label = label
if label is None:
sizer.Add (widget, weight, wx.EXPAND)
return widget
- elif 0:
- hbox = wx.BoxSizer(wx.HORIZONTAL)
- label_widget = wx.StaticText(parent, -1, label + ': ')
- hbox.Add(label_widget, 0, wx.EXPAND)
- hbox.Add(widget, 1, wx.EXPAND)
- sizer.Add(hbox, weight, wx.EXPAND)
- return widget
else:
label_widget = wx.StaticText(parent, -1, label + ': ')
sizer.Add(label_widget, 0, wx.EXPAND)
sizer.Add(widget, weight, wx.EXPAND)
return widget
-
+
def _error_msg(self):
prefix = ''
if self.label:
@@ -142,7 +138,8 @@
def __init__(self, parent=None, sizer=None, label=None, value=None,
converter=identity_converter(), weight=0):
self.f = self._pair_with_label(wx.StaticText(parent, -1, ""),
- parent=parent, sizer=sizer,
label=label, weight=weight)
+ parent=parent, sizer=sizer,
+ label=label, weight=weight)
field.__init__(self, converter, value)
def _get_prim_value(self):
@@ -153,12 +150,16 @@
class static_int_field(static_text_field):
- def __init__(self, parent=None, sizer=None, label=None, value=None,
weight=0):
- static_text_field.__init__(self, parent, sizer, label, value,
int_converter(), weight)
+ def __init__(self, parent=None, sizer=None, label=None, value=None,
+ weight=0):
+ static_text_field.__init__(self, parent, sizer, label, value,
+ int_converter(), weight)
class static_float_field(static_text_field):
- def __init__(self, parent=None, sizer=None, label=None, value=None,
weight=0):
- static_text_field.__init__(self, parent, sizer, label, value,
float_converter(), weight)
+ def __init__(self, parent=None, sizer=None, label=None, value=None,
+ weight=0):
+ static_text_field.__init__(self, parent, sizer, label, value,
+ float_converter(), weight)
# editable text fields
@@ -172,7 +173,8 @@
new_id = wx.NewId()
w = wx.TextCtrl(parent, new_id, "", style=style)
- self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
label=label, weight=weight)
+ self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
+ label=label, weight=weight)
if callback:
wx.EVT_TEXT_ENTER(w, new_id, lambda evt: callback())
field.__init__(self, converter, value)
@@ -187,22 +189,27 @@
class int_field(text_field):
def __init__(self, parent=None, sizer=None, label=None, value=None,
callback=None, weight=1):
- text_field.__init__(self, parent, sizer, label, value,
int_converter(), callback, weight)
+ text_field.__init__(self, parent, sizer, label, value,
+ int_converter(), callback, weight)
class float_field(text_field):
def __init__(self, parent=None, sizer=None, label=None, value=None,
callback=None, weight=1):
- text_field.__init__(self, parent, sizer, label, value,
float_converter(), callback, weight)
+ text_field.__init__(self, parent, sizer, label, value,
+ float_converter(), callback, weight)
# other fields
class slider_field(field):
def __init__(self, parent=None, sizer=None, label=None, value=None,
- converter=identity_converter(), callback=None, min=0,
max=100, weight=1):
+ converter=identity_converter(), callback=None,
+ min=0, max=100, weight=1):
new_id = wx.NewId()
w = wx.Slider(parent, new_id, (max+min)/2, min, max,
- size=wx.Size(250, -1), style=wx.SL_HORIZONTAL |
wx.SL_LABELS)
- self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
label=label, weight=weight)
+ size=wx.Size(250, -1),
+ style=wx.SL_HORIZONTAL | wx.SL_LABELS)
+ self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
+ label=label, weight=weight)
if callback:
wx.EVT_COMMAND_SCROLL(w, new_id, lambda evt:
callback(evt.GetInt()))
field.__init__(self, converter, value)
@@ -215,7 +222,8 @@
class quantized_slider_field(field):
def __init__(self, parent=None, sizer=None, label=None, value=None,
- converter=identity_converter(), callback=None, range=None,
weight=1):
+ converter=identity_converter(), callback=None,
+ range=None, weight=1):
if not isinstance(range, (tuple, list)) or len(range) != 3:
raise ValueError, range
@@ -227,10 +235,11 @@
new_id = wx.NewId()
w = wx.Slider(parent, new_id, 0, 0, nsteps,
size=wx.Size(250, -1), style=wx.SL_HORIZONTAL)
- self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
label=label, weight=weight)
+ self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
+ label=label, weight=weight)
if callback:
- wx.EVT_COMMAND_SCROLL(w, new_id,
- lambda evt:
callback(self._map_out(evt.GetInt())))
+ wx.EVT_COMMAND_SCROLL(w, new_id, lambda evt: \
+ callback(self._map_out(evt.GetInt())))
field.__init__(self, converter, value)
def _get_prim_value(self):
@@ -250,7 +259,8 @@
converter=identity_converter(), callback=None, weight=1):
new_id = wx.NewId()
w = wx.CheckBox(parent, new_id, label, style=wx.CHK_2STATE)
- self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
label=None, weight=weight)
+ self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
+ label=None, weight=weight)
if callback:
wx.EVT_CHECKBOX(w, new_id, lambda evt: callback(evt.GetInt()))
field.__init__(self, converter, value)
@@ -261,7 +271,6 @@
def _set_prim_value(self, v):
self.f.SetValue(int(v))
-
class radiobox_field(field):
def __init__(self, parent=None, sizer=None, label="", value=None,
converter=identity_converter(), callback=None, weight=1,
@@ -273,11 +282,13 @@
else:
style=wx.RA_SPECIFY_COLS | wx.RA_HORIZONTAL
- w = wx.RadioBox(parent, new_id, label, style=style,
majorDimension=major_dimension,
- choices=choices)
- self.f = self._pair_with_label(w, parent=parent, sizer=sizer,
label=label, weight=weight)
+ w = wx.RadioBox (parent, new_id, label, style=style,
+ majorDimension=major_dimension,
+ choices=choices)
+ self.f = self._pair_with_label (w, parent=parent, sizer=sizer,
+ label=label, weight=weight)
if callback:
- wx.EVT_RADIOBOX(w, new_id, lambda evt: callback(evt.GetString()))
+ wx.EVT_RADIOBOX (w, new_id, lambda evt: callback(evt.GetString()))
field.__init__(self, converter, value)
def _get_prim_value(self):
@@ -301,20 +312,20 @@
"""
vals = [f.get_value_with_check() for f in self.values()]
return [t[1] for t in vals if t[1] is not None]
-
+
def get_key_vals(self):
d = {}
for (key, f) in self.items():
d[key] = f.get_value()
return d
+ def _nop(*args): pass
- def _nop(*args): pass
-
def check_input_and_call(self, callback, status_handler=_nop):
"""
- Return a function that checks the form for errors, and then if it's OK,
- invokes the user specified callback, passing it the form key/value
dictionary.
+ Return a function that checks the form for errors, and then if
+ it's OK, invokes the user specified callback, passing it the
+ form key/value dictionary.
status_handler is called with a string indicating results.
"""
def doit_callback(*ignore):
@@ -328,11 +339,8 @@
status_handler("OK")
else:
status_handler("Failed")
-
return doit_callback
-
-
# ----------------------------------------------------------------
# Stand-alone example code
# ----------------------------------------------------------------
@@ -341,47 +349,45 @@
from gnuradio.wxgui import stdgui
class demo_app_flow_graph (stdgui.gui_flow_graph):
- def __init__(self, frame, panel, vbox, argv):
+ def __init__ (self, frame, panel, vbox, argv):
stdgui.gui_flow_graph.__init__ (self, frame, panel, vbox, argv)
self.frame = frame
self.panel = panel
-
- def _print_kv(kv):
- print "kv =", kv
- return True
-
- self.form = form()
+ self.form = form ()
self.form['static1'] = \
- static_text_field(parent=panel, sizer=vbox,
- label="Static Text",
- value="The Static Value")
+ static_text_field (parent=panel, sizer=vbox,
+ label="Static Text",
+ value="The Static Value")
self.form['text1'] = \
- text_field(parent=panel, sizer=vbox,
- label="TextCtrl",
- value="The Editable Value")
+ text_field (parent=panel, sizer=vbox,
+ label="TextCtrl",
+ value="The Editable Value")
self.form['int1'] = \
- int_field(parent=panel, sizer=vbox,
- label="Int Field",
- value=1234)
+ int_field (parent=panel, sizer=vbox,
+ label="Int Field",
+ value=1234)
self.form['float1'] = \
- float_field(parent=panel, sizer=vbox,
- label="Float Field",
- value=3.14159)
+ float_field (parent=panel, sizer=vbox,
+ label="Float Field",
+ value=3.14159)
- self.doit = button_with_callback(
+ def _print_kv(kv):
+ print "kv =", kv
+ return True
+
+ self.doit = button_with_callback (
panel, "Do It!",
- self.form.check_input_and_call(_print_kv, self._set_status_msg))
+ self.form.check_input_and_call (_print_kv, self._set_status_msg),
+ vbox)
- vbox.Add(self.doit, 0, wx.CENTER)
+ def _set_status_msg (self, msg):
+ self.frame.GetStatusBar ().SetStatusText (msg, 0)
- def _set_status_msg(self, msg):
- self.frame.GetStatusBar().SetStatusText(msg, 0)
-
def main ():
app = stdgui.stdapp (demo_app_flow_graph, "wxgui form demo", nstatus=1)
Modified:
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/scopesink.py
===================================================================
---
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/scopesink.py
2007-03-20 02:13:06 UTC (rev 4784)
+++
gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python/scopesink.py
2007-03-20 02:33:10 UTC (rev 4785)
@@ -33,20 +33,41 @@
default_frame_decim = gr.prefs().get_long('wxgui', 'frame_decim', 1)
class scope_sink_base (gr.hier_block):
+ """
+ Base class that both the complex and float scope_sink's can derive
+ from. This class actually handles everything, using the input
+ argument 'do_complex' which if True indicates the complex scope_sink.
+ """
def __init__ (self, fg, parent, title, sample_rate, size,
- frame_decim, v_scale, t_scale, vbox, do_c2f=False):
+ frame_decim, v_scale, t_scale, vbox, input_is_real=True):
+ if not vbox:
+ print ''
+ print "ERROR: A 'vbox' is required by 'fft_sink' for correct " + \
+ "functionality.\nPlease add it to the function call " + \
+ "and remove any calling function\nreferences " + \
+ "such as 'vbox.Add' of the returned 'fft_sink.win' ."
+ print ''
+ raise ValueError, vbox
+
# message queue that holds at most 2 messages
msgq = gr.msg_queue (2)
+ # create the FG block oscope, which handles most of the data
+ # control, triggering, and such; uses the message queue
self.guts = gr.oscope_sink_f (sample_rate, msgq)
- if do_c2f:
+ self.input_is_real = input_is_real
+
+ if input_is_real:
+ # if doing real, just use the guts
+ gr.hier_block.__init__(self, fg, self.guts, self.guts)
+ else:
+ # if doing complex, map a "complex_to_float" into the guts
c2f = gr.complex_to_float ()
fg.connect((c2f, 0), (self.guts, 0))
fg.connect((c2f, 1), (self.guts, 1))
gr.hier_block.__init__(self, fg, c2f, self.guts)
- else:
- gr.hier_block.__init__(self, fg, self.guts, self.guts)
+ # form the window info: the data used by the oscope_sink
self.info = win_info (msgq, sample_rate, frame_decim,
v_scale, t_scale, self.guts, title)
self.graph = graph_window (self.info, parent, -1, size=size)
@@ -58,15 +79,10 @@
vbox.Add (self.make_control_box (parent), 0, wx.EXPAND)
vbox.Add (self.make_control2_box (parent), 0, wx.EXPAND)
-# for backwards compatibilty, sort of
- self.win = vbox
+ # for partial backwards-compability
+ self.win = self.graph
- if not vbox:
- self.sizer = vbox
- self.SetSizer (self.sizer)
- self.SetAutoLayout (True)
- self.sizer.Fit (self)
-
+ # set the oscope to the desired auto-range
self.set_autorange (self.info.autorange)
# second row of control buttons etc. appears BELOW control_box
@@ -198,8 +214,8 @@
self.inc_v_button.Enable(False)
self.dec_v_button.Enable(False)
else:
- if self.graph.y_range:
- (l,u) = self.graph.y_range # found by autorange
+ if self.win.y_range:
+ (l,u) = self.win.y_range # found by autorange
self.info.v_scale_cursor.set_index_by_value((u-l)/8.0)
self.update_v_scale_label()
self.info.autorange = False
@@ -265,7 +281,7 @@
v_scale=default_v_scale, t_scale=None, vbox=None):
scope_sink_base.__init__(self, fg, parent, title, sample_rate, size,
- frame_decim, v_scale, t_scale, vbox, False)
+ frame_decim, v_scale, t_scale, vbox, True)
class scope_sink_c (scope_sink_base):
def __init__(self, fg, parent, title="", sample_rate=1,
@@ -273,7 +289,7 @@
v_scale=default_v_scale, t_scale=None, vbox=None):
scope_sink_base.__init__(self, fg, parent, title, sample_rate, size,
- frame_decim, v_scale, t_scale, vbox, True)
+ frame_decim, v_scale, t_scale, vbox, False)
# ========================================================================
# This is the deprecated interface, retained for compatibility...
@@ -620,8 +636,8 @@
else:
t_scale = None # old behavior
- print "frame decim %s v_scale %s t_scale %s" % \
- (frame_decim,v_scale,t_scale)
+# print "frame decim %s v_scale %s t_scale %s" % \
+# (frame_decim,v_scale,t_scale)
input_rate = 1e6
@@ -631,11 +647,16 @@
# We add this throttle block so that this demo doesn't suck down
# all the CPU available. You normally wouldn't use it...
- throttle = gr.throttle (gr.sizeof_gr_complex, input_rate)
-
+ throttle = gr.throttle(gr.sizeof_gr_complex, input_rate)
+ use_vbox = True
+ if not use_vbox:
+ l_vbox = None
+ else:
+ l_vbox = vbox
scope = scope_sink_c (fg=self, parent=panel, title="Secret Data",
sample_rate=input_rate, frame_decim=frame_decim,
- v_scale=v_scale, t_scale=t_scale, vbox=vbox)
+ v_scale=v_scale, t_scale=t_scale, vbox=l_vbox,
+ size=(100,200))
# these would be nice for this demo,
# but they don't work until the FG is actually running
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r4785 - gnuradio/branches/developers/michaelld/scopesink/gr-wxgui/src/python,
michaelld <=