[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r8742 - gnuradio/branches/developers/jblum/gr-wxglgui/
From: |
jblum |
Subject: |
[Commit-gnuradio] r8742 - gnuradio/branches/developers/jblum/gr-wxglgui/src/python |
Date: |
Fri, 27 Jun 2008 18:54:57 -0600 (MDT) |
Author: jblum
Date: 2008-06-27 18:54:55 -0600 (Fri, 27 Jun 2008)
New Revision: 8742
Added:
gnuradio/branches/developers/jblum/gr-wxglgui/src/python/scopesink.py
Modified:
gnuradio/branches/developers/jblum/gr-wxglgui/src/python/Makefile.am
gnuradio/branches/developers/jblum/gr-wxglgui/src/python/fftsink.py
Log:
work on wxgl scopesink
Modified: gnuradio/branches/developers/jblum/gr-wxglgui/src/python/Makefile.am
===================================================================
--- gnuradio/branches/developers/jblum/gr-wxglgui/src/python/Makefile.am
2008-06-27 21:40:03 UTC (rev 8741)
+++ gnuradio/branches/developers/jblum/gr-wxglgui/src/python/Makefile.am
2008-06-28 00:54:55 UTC (rev 8742)
@@ -33,4 +33,5 @@
gltext.py \
plotter.py \
common.py \
- fftsink.py
+ fftsink.py \
+ scopesink.py
Modified: gnuradio/branches/developers/jblum/gr-wxglgui/src/python/fftsink.py
===================================================================
--- gnuradio/branches/developers/jblum/gr-wxglgui/src/python/fftsink.py
2008-06-27 21:40:03 UTC (rev 8741)
+++ gnuradio/branches/developers/jblum/gr-wxglgui/src/python/fftsink.py
2008-06-28 00:54:55 UTC (rev 8742)
@@ -35,6 +35,8 @@
DEFAULT_FFT_RATE = gr.prefs().get_long('wxgui', 'fft_rate', 15)
DEFAULT_WIN_SIZE = (640, 240)
DIV_LEVELS = (1, 2, 5, 10, 20)
+FFT_PLOT_COLOR_SPEC = (0, 0, 1)
+PEAK_VALS_COLOR_SPEC = (0, 1, 0)
##################################################
# FFT window control panel
@@ -57,10 +59,10 @@
control_box.AddStretchSpacer()
control_box.Add(common.LabelText(self, 'Options'), 0,
wx.ALIGN_CENTER)
self.average_check_box = wx.CheckBox(parent=self,
style=wx.CHK_2STATE, label="Average")
- self.average_check_box.Bind(wx.EVT_CHECKBOX, self.on_average)
+ self.average_check_box.Bind(wx.EVT_CHECKBOX, self._on_average)
control_box.Add(self.average_check_box, 0, wx.EXPAND)
self.peak_hold_check_box = wx.CheckBox(parent=self,
style=wx.CHK_2STATE, label="Peak Hold")
- self.peak_hold_check_box.Bind(wx.EVT_CHECKBOX,
self.on_peak_hold)
+ self.peak_hold_check_box.Bind(wx.EVT_CHECKBOX,
self._on_peak_hold)
control_box.Add(self.peak_hold_check_box, 0, wx.EXPAND)
#radio buttons for div size
@@ -70,7 +72,7 @@
self.radio_buttons = list()
for y_per_div in DIV_LEVELS:
radio_button = wx.RadioButton(self, -1, "%d
dB/div"%y_per_div)
- radio_button.Bind(wx.EVT_RADIOBUTTON,
self.on_radio_button_change)
+ radio_button.Bind(wx.EVT_RADIOBUTTON,
self._on_radio_button_change)
self.radio_buttons.append(radio_button)
radio_box.Add(radio_button, 0, wx.ALIGN_LEFT)
control_box.Add(radio_box, 0, wx.EXPAND)
@@ -81,10 +83,10 @@
control_box.AddSpacer(2)
button_box = wx.BoxSizer(wx.HORIZONTAL)
self.ref_plus_button = wx.Button(self, -1, '+',
style=wx.BU_EXACTFIT)
- self.ref_plus_button.Bind(wx.EVT_BUTTON, self.on_incr_ref_level)
+ self.ref_plus_button.Bind(wx.EVT_BUTTON,
self._on_incr_ref_level)
button_box.Add(self.ref_plus_button, 0, wx.ALIGN_CENTER)
self.ref_minus_button = wx.Button(self, -1, ' - ',
style=wx.BU_EXACTFIT)
- self.ref_minus_button.Bind(wx.EVT_BUTTON,
self.on_decr_ref_level)
+ self.ref_minus_button.Bind(wx.EVT_BUTTON,
self._on_decr_ref_level)
button_box.Add(self.ref_minus_button, 0, wx.ALIGN_CENTER)
control_box.Add(button_box, 0, wx.ALIGN_CENTER)
control_box.AddStretchSpacer()
@@ -109,14 +111,14 @@
##################################################
# Event handlers
##################################################
- def on_radio_button_change(self, event):
+ def _on_radio_button_change(self, event):
selected_radio_button = filter(lambda rb: rb.GetValue(),
self.radio_buttons)[0]
index = self.radio_buttons.index(selected_radio_button)
self.parent.set_y_per_div(DIV_LEVELS[index])
- def on_average(self, event): self.parent.set_average(event.IsChecked())
- def on_peak_hold(self, event):
self.parent.set_peak_hold(event.IsChecked())
- def on_incr_ref_level(self, event): self.parent.incr_ref_level()
- def on_decr_ref_level(self, event): self.parent.decr_ref_level()
+ def _on_average(self, event): self.parent.set_average(event.IsChecked())
+ def _on_peak_hold(self, event):
self.parent.set_peak_hold(event.IsChecked())
+ def _on_incr_ref_level(self, event): self.parent.incr_ref_level()
+ def _on_decr_ref_level(self, event): self.parent.decr_ref_level()
##################################################
# FFT window with plotter and control panel
@@ -180,14 +182,14 @@
channel=1,
samples=samples,
offset=0.0,
- color_spec=(0, 0, 1),
+ color_spec=FFT_PLOT_COLOR_SPEC,
)
#plot the peak hold
self.plotter.set_waveform(
channel=2,
samples=self.peak_vals,
offset=0.0,
- color_spec=(0, 1, 0),
+ color_spec=PEAK_VALS_COLOR_SPEC,
)
#update the plotter
self.plotter.update()
Added: gnuradio/branches/developers/jblum/gr-wxglgui/src/python/scopesink.py
===================================================================
--- gnuradio/branches/developers/jblum/gr-wxglgui/src/python/scopesink.py
(rev 0)
+++ gnuradio/branches/developers/jblum/gr-wxglgui/src/python/scopesink.py
2008-06-28 00:54:55 UTC (rev 8742)
@@ -0,0 +1,219 @@
+#
+# Copyright 2008 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+##################################################
+# Imports
+##################################################
+from gnuradio import gr
+import plotter
+import common
+import wx
+import math
+import numpy
+
+##################################################
+# Constants
+##################################################
+DEFAULT_FRAME_DECIM = gr.prefs().get_long('wxgui', 'frame_decim', 15)
+DEFAULT_WIN_SIZE = (640, 240)
+DEFAULT_V_SCALE = 1000
+TRIGGER_MODES = (
+ ('Automatic', gr.gr_TRIG_AUTO),
+ ('Negative', gr.gr_TRIG_NEG_SLOPE),
+ ('Positive', gr.gr_TRIG_POS_SLOPE),
+)
+TRIGGER_LEVELS = (
+ ('Automatic', None),
+ ('Low', -0.5),
+ ('Medium', 0.0),
+ ('High', 0.5),
+)
+
+##################################################
+# Scope window control panel
+##################################################
+class control_panel(wx.Panel):
+ """!
+ A control panel with wx widgits to control the plotter and scope block.
+ """
+ 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.SIMPLE_BORDER)
+ control_box = wx.BoxSizer(wx.VERTICAL)
+
+ #begin control box
+ control_box.AddStretchSpacer()
+ control_box.Add(common.LabelText(self, 'Select Channel'), 0,
wx.ALIGN_CENTER)
+ control_box.AddSpacer(2)
+ #channel and trigger box
+ channel_trigger_box = wx.BoxSizer(wx.HORIZONTAL)
+ control_box.Add(channel_trigger_box, 0, wx.EXPAND)
+ #channel chooser drop down
+ self.channel_chooser = wx.Choice(self, -1, choices=map(lambda
ch: "Ch%d"%ch, range(1, parent.num_inputs+1)))
+ self.channel_chooser.Bind(wx.EVT_CHOICE, self._on_chooser)
+ channel_trigger_box.Add(self.channel_chooser, 0,
wx.ALIGN_CENTER)
+ #trigger button
+ self.trigger_button = wx.Button(self, -1, 'Trigger',
style=wx.BU_EXACTFIT)
+ self.trigger_button.Bind(wx.EVT_BUTTON, self._on_set_trigger)
+ channel_trigger_box.Add(self.trigger_button, 0, wx.ALIGN_CENTER)
+
+ #offset slider
+ control_box.AddStretchSpacer()
+ control_box.Add(common.LabelText(self, 'Channel Offset'), 0,
wx.ALIGN_CENTER)
+ control_box.AddSpacer(2)
+ self.offset_slider = wx.Slider(self, -1, style=wx.SL_HORIZONTAL)
+ control_box.Add(self.offset_slider, 0, wx.EXPAND)
+
+ #trigger mode
+ control_box.AddStretchSpacer()
+ control_box.Add(common.LabelText(self, 'Trigger Mode'), 0,
wx.ALIGN_CENTER)
+ control_box.AddSpacer(2)
+ self.trigger_mode_chooser = wx.Choice(self, -1, choices=[tm[0]
for tm in TRIGGER_MODES])
+ self.trigger_mode_chooser.Bind(wx.EVT_CHOICE, self._on_chooser)
+ control_box.Add(self.trigger_mode_chooser, 0, wx.ALIGN_CENTER)
+
+ #trigger level
+ control_box.AddStretchSpacer()
+ control_box.Add(common.LabelText(self, 'Trigger Level'), 0,
wx.ALIGN_CENTER)
+ control_box.AddSpacer(2)
+ self.trigger_level_chooser = wx.Choice(self, -1, choices=[tl[0]
for tl in TRIGGER_LEVELS])
+ self.trigger_level_chooser.Bind(wx.EVT_CHOICE, self._on_chooser)
+ control_box.Add(self.trigger_level_chooser, 0, wx.ALIGN_CENTER)
+
+ #setup axis boxes
+ axis_box = wx.BoxSizer(wx.HORIZONTAL)
+ x_axis_box = wx.BoxSizer(wx.VERTICAL)
+ y_axis_box = wx.BoxSizer(wx.VERTICAL)
+ axis_box.Add(x_axis_box, 1, wx.EXPAND)
+ axis_box.Add(y_axis_box, 1, wx.EXPAND)
+ control_box.AddStretchSpacer()
+ control_box.Add(axis_box, 0, wx.ALIGN_CENTER)
+
+ #x axis
+ x_axis_box.Add(common.LabelText(self, 'Time Axis'), 0,
wx.ALIGN_CENTER)
+ x_axis_box.AddSpacer(2)
+ button_box = wx.BoxSizer(wx.HORIZONTAL)
+ self.x_plus_button = wx.Button(self, -1, '+',
style=wx.BU_EXACTFIT)
+ #self.x_plus_button.Bind(wx.EVT_BUTTON, self.)
+ button_box.Add(self.x_plus_button, 0, wx.ALIGN_CENTER)
+ self.x_minus_button = wx.Button(self, -1, ' - ',
style=wx.BU_EXACTFIT)
+ #self.x_minus_button.Bind(wx.EVT_BUTTON, self.)
+ button_box.Add(self.x_minus_button, 0, wx.ALIGN_CENTER)
+ x_axis_box.Add(button_box, 0, wx.ALIGN_CENTER)
+
+ #y axis
+ y_axis_box.Add(common.LabelText(self, 'Y Axis'), 0,
wx.ALIGN_CENTER)
+ y_axis_box.AddSpacer(2)
+ button_box = wx.BoxSizer(wx.HORIZONTAL)
+ self.y_plus_button = wx.Button(self, -1, '+',
style=wx.BU_EXACTFIT)
+ #self.y_plus_button.Bind(wx.EVT_BUTTON, self.)
+ button_box.Add(self.y_plus_button, 0, wx.ALIGN_CENTER)
+ self.y_minus_button = wx.Button(self, -1, ' - ',
style=wx.BU_EXACTFIT)
+ #self.y_minus_button.Bind(wx.EVT_BUTTON, self.)
+ button_box.Add(self.y_minus_button, 0, wx.ALIGN_CENTER)
+ y_axis_box.Add(button_box, 0, wx.ALIGN_CENTER)
+
+ #autorange
+ control_box.AddSpacer(5)
+ self.autorange_check_box = wx.CheckBox(parent=self,
style=wx.CHK_2STATE, label="Autorange")
+ #self.autorange_check_box.Bind(wx.EVT_CHECKBOX, self.)
+ control_box.Add(self.autorange_check_box, 0, wx.ALIGN_LEFT)
+ control_box.AddStretchSpacer()
+
+ #set sizer
+ self.SetSizerAndFit(control_box)
+ #update
+ self.update()
+
+ def update(self):
+ """!
+ Read the state of the scope plot settings and update the
control panel.
+ """
+ #update the channel chooser
+ self.channel_chooser.SetSelection(self.parent.input_index)
+ #update the trigger button
+ if self.parent.trigger_index == self.parent.input_index:
+ self.trigger_button.Disable()
+ else: self.trigger_button.Enable()
+ #update the slider
+ #TODO
+ #update the trigger mode chooser
+
self.trigger_mode_chooser.SetSelection(self.parent.trigger_mode_index)
+
self.trigger_level_chooser.SetSelection(self.parent.trigger_level_index)
+
+ ##################################################
+ # Event handlers
+ ##################################################
+ def _on_chooser(self, event):
+ self.parent.input_index = self.channel_chooser.GetSelection()
+ self.parent.trigger_mode_index =
self.trigger_mode_chooser.GetSelection()
+ self.parent.trigger_level_index =
self.trigger_level_chooser.GetSelection()
+ self.update()
+ def _on_set_trigger(self, event):
+ self.parent.trigger_index = self.parent.input_index
+ self.update()
+
+##################################################
+# Scope window with plotter and control panel
+##################################################
+class scope_window(wx.Panel):
+ def __init__(
+ self,
+ parent,
+ size,
+ title,
+
+ num_inputs,
+ ):
+ #setup
+ self.num_inputs = num_inputs
+ self.input_index = 0
+ self.trigger_index = 0
+ self.trigger_mode_index = 0
+ self.trigger_level_index = 0
+ #init panel and plot
+ wx.Panel.__init__(self, parent, -1)
+ self.plotter = plotter.grid_plotter(self)
+ self.plotter.SetSize(wx.Size(*size))
+ self.plotter.set_title(title)
+ #setup the box with plot and controls
+ self.control_panel = control_panel(self)
+ main_box = wx.BoxSizer(wx.HORIZONTAL)
+ main_box.Add(self.plotter, 1, wx.EXPAND)
+ main_box.Add(self.control_panel, 0, wx.EXPAND)
+ self.SetSizerAndFit(main_box)
+
+def main():
+ app = wx.PySimpleApp()
+ frame = wx.Frame(None, -1, 'Demo', wx.DefaultPosition)
+ vbox = wx.BoxSizer(wx.VERTICAL)
+ win = scope_window(frame, DEFAULT_WIN_SIZE, 'Scope Demo', 4)
+ vbox.Add(win, 1, wx.EXPAND)
+ frame.SetSizerAndFit(vbox)
+ frame.Show()
+ app.MainLoop()
+
+if __name__ == '__main__':
+ main()
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r8742 - gnuradio/branches/developers/jblum/gr-wxglgui/src/python,
jblum <=