diff options
author | jblum | 2009-06-13 21:26:25 +0000 |
---|---|---|
committer | jblum | 2009-06-13 21:26:25 +0000 |
commit | 51af4269d3eebd3d611be918f8c799c96c650496 (patch) | |
tree | 2b21822a1bdcf3d39e935ac0943c760315088ec4 /gr-wxgui/src/python/number_window.py | |
parent | a1cc77945109dc15a97072107af6ae74c7ac65d5 (diff) | |
download | gnuradio-51af4269d3eebd3d611be918f8c799c96c650496.tar.gz gnuradio-51af4269d3eebd3d611be918f8c799c96c650496.tar.bz2 gnuradio-51af4269d3eebd3d611be918f8c799c96c650496.zip |
Merged wxgui/forms branch r11124:11183
The forms module is set of wxgui forms wrapped in pubsub aware convenience classes.
The forms module will be used by the wxgui window classes (fft, scope, waterfall...)
The forms module will be used in grc generated flowgraphs.
The forms module will be used by future gui apps (usrp siggen...).
Tasks:
Moved forms module into wxgui.
Modified *_window classes to use the forms module.
Added features to forms as required.
Removed pubsub aware forms in common.py.
Switched grc to use the forms module in wxgui.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11184 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'gr-wxgui/src/python/number_window.py')
-rw-r--r-- | gr-wxgui/src/python/number_window.py | 128 |
1 files changed, 71 insertions, 57 deletions
diff --git a/gr-wxgui/src/python/number_window.py b/gr-wxgui/src/python/number_window.py index f12a18248..8a8249764 100644 --- a/gr-wxgui/src/python/number_window.py +++ b/gr-wxgui/src/python/number_window.py @@ -28,6 +28,7 @@ import wx import pubsub from constants import * from gnuradio import gr #for gr.prefs +import forms ################################################## # Constants @@ -38,6 +39,9 @@ AVG_ALPHA_MIN_EXP, AVG_ALPHA_MAX_EXP = -3, 0 DEFAULT_NUMBER_RATE = gr.prefs().get_long('wxgui', 'number_rate', 5) DEFAULT_WIN_SIZE = (300, 300) DEFAULT_GAUGE_RANGE = 1000 +VALUE_REPR_KEY = 'value_repr' +VALUE_REAL_KEY = 'value_real' +VALUE_IMAG_KEY = 'value_imag' ################################################## # Number window control panel @@ -53,28 +57,45 @@ class control_panel(wx.Panel): @param parent the wx parent window """ self.parent = parent - wx.Panel.__init__(self, parent, style=wx.SUNKEN_BORDER) + wx.Panel.__init__(self, parent) 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.peak_hold_check_box = common.CheckBoxController(self, 'Peak Hold', parent, PEAK_HOLD_KEY) - control_box.Add(self.peak_hold_check_box, 0, wx.EXPAND) - self.average_check_box = common.CheckBoxController(self, 'Average', parent, AVERAGE_KEY) - control_box.Add(self.average_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, AVG_ALPHA_KEY, - formatter=lambda x: ': %.4f'%x, + options_box = forms.static_box_sizer( + parent=self, sizer=control_box, label='Options', + bold=True, orient=wx.VERTICAL, + ) + forms.check_box( + sizer=options_box, parent=self, label='Peak Hold', + ps=parent, key=PEAK_HOLD_KEY, + ) + forms.check_box( + sizer=options_box, parent=self, label='Average', + ps=parent, key=AVERAGE_KEY, + ) + #static text and slider for averaging + avg_alpha_text = forms.static_text( + sizer=options_box, parent=self, label='Avg Alpha', + converter=forms.float_converter(lambda x: '%.4f'%x), + ps=parent, key=AVG_ALPHA_KEY, width=50, + ) + avg_alpha_slider = forms.log_slider( + sizer=options_box, parent=self, + min_exp=AVG_ALPHA_MIN_EXP, + max_exp=AVG_ALPHA_MAX_EXP, + num_steps=SLIDER_STEPS, + ps=parent, key=AVG_ALPHA_KEY, ) - parent.subscribe(AVERAGE_KEY, self.avg_alpha_slider.Enable) - control_box.Add(self.avg_alpha_slider, 0, wx.EXPAND) + for widget in (avg_alpha_text, avg_alpha_slider): + parent.subscribe(AVERAGE_KEY, widget.Enable) + widget.Enable(parent[AVERAGE_KEY]) #run/stop control_box.AddStretchSpacer() - self.run_button = common.ToggleButtonController(self, parent, RUNNING_KEY, 'Stop', 'Run') - control_box.Add(self.run_button, 0, wx.EXPAND) + forms.toggle_button( + sizer=control_box, parent=self, + true_label='Stop', false_label='Run', + ps=parent, key=RUNNING_KEY, + ) #set sizer self.SetSizerAndFit(control_box) @@ -107,38 +128,47 @@ class number_window(wx.Panel, pubsub.pubsub): self.peak_val_imag = NEG_INF self.real = real self.units = units - self.minval = minval - self.maxval = maxval self.decimal_places = decimal_places #proxy the keys self.proxy(MSG_KEY, controller, msg_key) self.proxy(AVERAGE_KEY, controller, average_key) self.proxy(AVG_ALPHA_KEY, controller, avg_alpha_key) self.proxy(SAMPLE_RATE_KEY, controller, sample_rate_key) + #initialize values + self[PEAK_HOLD_KEY] = peak_hold + self[RUNNING_KEY] = True + self[VALUE_REAL_KEY] = minval + self[VALUE_IMAG_KEY] = minval #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) + sizer = forms.static_box_sizer( + parent=self, sizer=main_box, label=title, + bold=True, orient=wx.VERTICAL, proportion=1, + ) main_box.Add(self.control_panel, 0, wx.EXPAND) - sizer.Add(common.LabelText(self, title), 1, wx.ALIGN_CENTER) - self.text = wx.StaticText(self, size=(size[0], -1)) - sizer.Add(self.text, 1, wx.EXPAND) - 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) + sizer.AddStretchSpacer() + forms.static_text( + parent=self, sizer=sizer, + ps=self, key=VALUE_REPR_KEY, width=size[0], + converter=forms.str_converter(), + ) + sizer.AddStretchSpacer() + self.gauge_real = forms.gauge( + parent=self, sizer=sizer, style=wx.GA_HORIZONTAL, + ps=self, key=VALUE_REAL_KEY, length=size[0], + minimum=minval, maximum=maxval, num_steps=DEFAULT_GAUGE_RANGE, + ) + self.gauge_imag = forms.gauge( + parent=self, sizer=sizer, style=wx.GA_HORIZONTAL, + ps=self, key=VALUE_IMAG_KEY, length=size[0], + minimum=minval, maximum=maxval, num_steps=DEFAULT_GAUGE_RANGE, + ) #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) - #initialize values - self[PEAK_HOLD_KEY] = peak_hold - self[RUNNING_KEY] = True - self[AVERAGE_KEY] = self[AVERAGE_KEY] - self[AVG_ALPHA_KEY] = self[AVG_ALPHA_KEY] #register events self.subscribe(MSG_KEY, self.handle_msg) - self.Bind(common.EVT_DATA, self.update) def show_gauges(self, show_gauge): """ @@ -146,21 +176,11 @@ class number_window(wx.Panel, pubsub.pubsub): If this is real, never show the imaginary gauge. @param show_gauge true to show """ - 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() + self.gauge_real.ShowItems(show_gauge) + self.gauge_imag.ShowItems(show_gauge and not self.real) def handle_msg(self, msg): """ - Post this message into a data event. - Allow wx to handle the event to avoid threading issues. - @param msg the incoming numbersink data - """ - wx.PostEvent(self, common.DataEvent(msg)) - - def update(self, event): - """ Handle a message from the message queue. Convert the string based message into a float or complex. If more than one number was read, only take the last number. @@ -168,29 +188,23 @@ class number_window(wx.Panel, pubsub.pubsub): @param event event.data is the number sample as a character array """ if not self[RUNNING_KEY]: return - #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) format_string = "%%.%df"%self.decimal_places if self.real: - sample = numpy.fromstring(event.data, numpy.float32)[-1] + sample = numpy.fromstring(msg, numpy.float32)[-1] if self[PEAK_HOLD_KEY]: sample = self.peak_val_real = max(self.peak_val_real, sample) label_text = "%s %s"%(format_string%sample, self.units) - set_gauge_value(self.gauge_real, sample) + self[VALUE_REAL_KEY] = sample else: - sample = numpy.fromstring(event.data, numpy.complex64)[-1] + sample = numpy.fromstring(msg, numpy.complex64)[-1] 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 label_text = "%s + %sj %s"%(format_string%sample.real, format_string%sample.imag, self.units) - set_gauge_value(self.gauge_real, sample.real) - set_gauge_value(self.gauge_imag, sample.imag) + self[VALUE_REAL_KEY] = sample.real + self[VALUE_IMAG_KEY] = sample.imag #set label text - self.text.SetLabel(label_text) + self[VALUE_REPR_KEY] = label_text #clear peak hold if not self[PEAK_HOLD_KEY]: self.peak_val_real = NEG_INF |