commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r8707 - gnuradio/branches/releases/3.1/gr-wxgui/src/py


From: jcorgan
Subject: [Commit-gnuradio] r8707 - gnuradio/branches/releases/3.1/gr-wxgui/src/python
Date: Wed, 25 Jun 2008 14:12:06 -0600 (MDT)

Author: jcorgan
Date: 2008-06-25 14:12:06 -0600 (Wed, 25 Jun 2008)
New Revision: 8707

Modified:
   gnuradio/branches/releases/3.1/gr-wxgui/src/python/fftsink2.py
   gnuradio/branches/releases/3.1/gr-wxgui/src/python/plot.py
Log:
Applied changesets r8581, r8584, r8585, and r8586 on trunk to release branch.

Modified: gnuradio/branches/releases/3.1/gr-wxgui/src/python/fftsink2.py
===================================================================
--- gnuradio/branches/releases/3.1/gr-wxgui/src/python/fftsink2.py      
2008-06-25 20:05:09 UTC (rev 8706)
+++ gnuradio/branches/releases/3.1/gr-wxgui/src/python/fftsink2.py      
2008-06-25 20:12:06 UTC (rev 8707)
@@ -23,11 +23,13 @@
 from gnuradio import gr, gru, window
 from gnuradio.wxgui import stdgui2
 import wx
-import gnuradio.wxgui.plot as plot
+import plot
 import numpy
 import threading
 import math    
 
+DIV_LEVELS = (1, 2, 5, 10, 20)
+
 default_fftsink_size = (640,240)
 default_fft_rate = gr.prefs().get_long('wxgui', 'fft_rate', 15)
 
@@ -68,8 +70,8 @@
             self.avg.set_taps(self.avg_alpha)
         else:
             self.avg.set_taps(1.0)
-       self.win.peak_vals = None
-       
+        self.win.peak_vals = None
+        
     def set_peak_hold(self, enable):
         self.peak_hold = enable
         self.win.set_peak_hold(enable)
@@ -120,17 +122,17 @@
 
         # FIXME  We need to add 3dB to all bins but the DC bin
         self.log = gr.nlog10_ff(20, self.fft_size,
-                               -10*math.log10(self.fft_size)           # 
Adjust for number of bins
-                              -10*math.log10(power/self.fft_size)      # 
Adjust for windowing loss
-                              -20*math.log10(ref_scale/2))             # 
Adjust for reference scale
-                              
+                               -10*math.log10(self.fft_size)                # 
Adjust for number of bins
+                               -10*math.log10(power/self.fft_size)        # 
Adjust for windowing loss
+                               -20*math.log10(ref_scale/2))                # 
Adjust for reference scale
+                               
         self.sink = gr.message_sink(gr.sizeof_float * self.fft_size, 
self.msgq, True)
-       self.connect(self, self.s2p, self.one_in_n, self.fft, self.c2mag, 
self.avg, self.log, self.sink)
+        self.connect(self, self.s2p, self.one_in_n, self.fft, self.c2mag, 
self.avg, self.log, self.sink)
 
         self.win = fft_window(self, parent, size=size)
         self.set_average(self.average)
+        self.set_peak_hold(self.peak_hold)
 
-
 class fft_sink_c(gr.hier_block2, fft_sink_base):
     def __init__(self, parent, baseband_freq=0, ref_scale=2.0,
                  y_per_div=10, y_divs=8, ref_level=50, sample_rate=1, 
fft_size=512,
@@ -163,15 +165,16 @@
 
         # FIXME  We need to add 3dB to all bins but the DC bin
         self.log = gr.nlog10_ff(20, self.fft_size,
-                                -10*math.log10(self.fft_size)          # 
Adjust for number of bins
-                               -10*math.log10(power/self.fft_size)     # 
Adjust for windowing loss
-                               -20*math.log10(ref_scale/2))            # 
Adjust for reference scale
-                               
+                                -10*math.log10(self.fft_size)                # 
Adjust for number of bins
+                                -10*math.log10(power/self.fft_size)        # 
Adjust for windowing loss
+                                -20*math.log10(ref_scale/2))                # 
Adjust for reference scale
+                                
         self.sink = gr.message_sink(gr.sizeof_float * self.fft_size, 
self.msgq, True)
-       self.connect(self, self.s2p, self.one_in_n, self.fft, self.c2mag, 
self.avg, self.log, self.sink)
+        self.connect(self, self.s2p, self.one_in_n, self.fft, self.c2mag, 
self.avg, self.log, self.sink)
 
         self.win = fft_window(self, parent, size=size)
         self.set_average(self.average)
+        self.set_peak_hold(self.peak_hold)
 
 
 # ------------------------------------------------------------------------
@@ -218,54 +221,134 @@
             de = DataEvent (complex_data)
             wx.PostEvent (self.event_receiver, de)
             del de
+
+class control_panel(wx.Panel):
     
+    class LabelText(wx.StaticText):    
+        def __init__(self, window, label):
+            wx.StaticText.__init__(self, window, -1, label)
+            font = self.GetFont()
+            font.SetWeight(wx.FONTWEIGHT_BOLD)
+            font.SetUnderlined(True)
+            self.SetFont(font)
+    
+    def __init__(self, parent):
+        self.parent = parent
+        wx.Panel.__init__(self, parent, -1, style=wx.SIMPLE_BORDER)    
+        control_box = wx.BoxSizer(wx.VERTICAL)
+        
+        #checkboxes for average and peak hold
+        control_box.AddStretchSpacer()
+        control_box.Add(self.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, parent.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, parent.on_peak_hold) 
+        control_box.Add(self.peak_hold_check_box, 0, wx.EXPAND)
+       
+        #radio buttons for div size
+        control_box.AddStretchSpacer()
+        control_box.Add(self.LabelText(self, 'Set dB/div'), 0, wx.ALIGN_CENTER)
+        radio_box = wx.BoxSizer(wx.VERTICAL)
+        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)
+            self.radio_buttons.append(radio_button)
+            radio_box.Add(radio_button, 0, wx.ALIGN_LEFT)
+        control_box.Add(radio_box, 0, wx.EXPAND)
+        
+        #ref lvl buttons
+        control_box.AddStretchSpacer()
+        control_box.Add(self.LabelText(self, 'Adj Ref Lvl'), 0, 
wx.ALIGN_CENTER)
+        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, parent.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, parent.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()
+        #set sizer
+        self.SetSizerAndFit(control_box)
+        #update
+        self.update()
+        
+    def update(self):
+        """!
+        Read the state of the fft plot settings and update the control panel.
+        """
+        #update checkboxes
+        self.average_check_box.SetValue(self.parent.fftsink.average)
+        self.peak_hold_check_box.SetValue(self.parent.fftsink.peak_hold)
+        #update radio buttons    
+        try:
+            index = list(DIV_LEVELS).index(self.parent.fftsink.y_per_div)
+            self.radio_buttons[index].SetValue(True)
+        except: pass
+        
+    def on_radio_button_change(self, evt):
+        selected_radio_button = filter(lambda rb: rb.GetValue(), 
self.radio_buttons)[0] 
+        index = self.radio_buttons.index(selected_radio_button)
+        self.parent.fftsink.set_y_per_div(DIV_LEVELS[index])
 
-class fft_window (plot.PlotCanvas):
+class fft_window (wx.Panel):
     def __init__ (self, fftsink, parent, id = -1,
                   pos = wx.DefaultPosition, size = wx.DefaultSize,
                   style = wx.DEFAULT_FRAME_STYLE, name = ""):
-        plot.PlotCanvas.__init__ (self, parent, id, pos, size, style, name)
-
-        self.y_range = None
+        
         self.fftsink = fftsink
+        #init panel and plot 
+        wx.Panel.__init__(self, parent, -1)                  
+        self.plot = plot.PlotCanvas(self, id, pos, size, style, name)       
+        #setup the box with plot and controls
+        self.control_panel = control_panel(self)
+        main_box = wx.BoxSizer (wx.HORIZONTAL)
+        main_box.Add (self.plot, 1, wx.EXPAND)
+        main_box.Add (self.control_panel, 0, wx.EXPAND)
+        self.SetSizerAndFit(main_box)
+        
         self.peak_hold = False
         self.peak_vals = None
         
-        self.SetEnableGrid (True)
+        self.plot.SetEnableGrid (True)
         # self.SetEnableZoom (True)
         # self.SetBackgroundColour ('black')
         
         self.build_popup_menu()
-       self.set_baseband_freq(0.0)
-               
+        self.set_baseband_freq(0.0)
+                
         EVT_DATA_EVENT (self, self.set_data)
         wx.EVT_CLOSE (self, self.on_close_window)
-        self.Bind(wx.EVT_RIGHT_UP, self.on_right_click)
-        self.Bind(wx.EVT_MOTION, self.evt_motion)
-       
+        self.plot.Bind(wx.EVT_RIGHT_UP, self.on_right_click)
+        self.plot.Bind(wx.EVT_MOTION, self.evt_motion)
+        
         self.input_watcher = input_watcher(fftsink.msgq, fftsink.fft_size, 
self)
 
     def set_scale(self, freq):
-       x = max(abs(self.fftsink.sample_rate), abs(self.fftsink.baseband_freq)) 
+        x = max(abs(self.fftsink.sample_rate), 
abs(self.fftsink.baseband_freq))        
         if x >= 1e9:
             self._scale_factor = 1e-9
             self._units = "GHz"
-           self._format = "%3.6f"
+            self._format = "%3.6f"
         elif x >= 1e6:
             self._scale_factor = 1e-6
             self._units = "MHz"
-           self._format = "%3.3f"
+            self._format = "%3.3f"
         else:
             self._scale_factor = 1e-3
             self._units = "kHz"
-           self._format = "%3.3f"
+            self._format = "%3.3f"
 
     def set_baseband_freq(self, baseband_freq):
-       if self.peak_hold:
-           self.peak_vals = None
-       self.set_scale(baseband_freq)
-       self.fftsink.set_baseband_freq(baseband_freq)
-       
+        if self.peak_hold:
+            self.peak_vals = None
+        self.set_scale(baseband_freq)
+        self.fftsink.set_baseband_freq(baseband_freq)
+        
     def on_close_window (self, event):
         print "fft_window:on_close_window"
         self.keep_running = False
@@ -283,15 +366,15 @@
 
         if self.fftsink.input_is_real:     # only plot 1/2 the points
             x_vals = ((numpy.arange (L/2) * (self.fftsink.sample_rate 
-                      * self._scale_factor / L))
+                       * self._scale_factor / L))
                       + self.fftsink.baseband_freq * self._scale_factor)
             self._points = numpy.zeros((len(x_vals), 2), numpy.float64)
             self._points[:,0] = x_vals
             self._points[:,1] = dB[0:L/2]
-           if self.peak_hold:
-               self._peak_points = numpy.zeros((len(x_vals), 2), numpy.float64)
-               self._peak_points[:,0] = x_vals
-               self._peak_points[:,1] = self.peak_vals[0:L/2]
+            if self.peak_hold:
+                self._peak_points = numpy.zeros((len(x_vals), 2), 
numpy.float64)
+                self._peak_points[:,0] = x_vals
+                self._peak_points[:,1] = self.peak_vals[0:L/2]
         else:
             # the "negative freqs" are in the second half of the array
             x_vals = ((numpy.arange (-L/2, L/2)
@@ -300,39 +383,37 @@
             self._points = numpy.zeros((len(x_vals), 2), numpy.float64)
             self._points[:,0] = x_vals
             self._points[:,1] = numpy.concatenate ((dB[L/2:], dB[0:L/2]))
-           if self.peak_hold:
-               self._peak_points = numpy.zeros((len(x_vals), 2), numpy.float64)
-               self._peak_points[:,0] = x_vals
-               self._peak_points[:,1] = numpy.concatenate 
((self.peak_vals[L/2:], self.peak_vals[0:L/2]))
+            if self.peak_hold:
+                self._peak_points = numpy.zeros((len(x_vals), 2), 
numpy.float64)
+                self._peak_points[:,0] = x_vals
+                self._peak_points[:,1] = numpy.concatenate 
((self.peak_vals[L/2:], self.peak_vals[0:L/2]))
 
         lines = [plot.PolyLine (self._points, colour='BLUE'),]
-       if self.peak_hold:
-           lines.append(plot.PolyLine (self._peak_points, colour='GREEN'))
+        if self.peak_hold:
+            lines.append(plot.PolyLine (self._peak_points, colour='GREEN'))
 
         graphics = plot.PlotGraphics (lines,
                                       title=self.fftsink.title,
                                       xLabel = self._units, yLabel = "dB")
+        x_range = x_vals[0], x_vals[-1]
+        ymax = self.fftsink.ref_level
+        ymin = self.fftsink.ref_level - self.fftsink.y_per_div * 
self.fftsink.y_divs
+        y_range = ymin, ymax
+        self.plot.Draw (graphics, xAxis=x_range, yAxis=y_range, 
step=self.fftsink.y_per_div)        
 
-        self.Draw (graphics, xAxis=None, yAxis=self.y_range)
-        self.update_y_range ()
-
-
     def set_peak_hold(self, enable):
         self.peak_hold = enable
         self.peak_vals = None
 
-    def update_y_range (self):
-        ymax = self.fftsink.ref_level
-        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):
         # print "on_average"
         self.fftsink.set_average(evt.IsChecked())
+        self.control_panel.update()
 
     def on_peak_hold(self, evt):
         # print "on_peak_hold"
         self.fftsink.set_peak_hold(evt.IsChecked())
+        self.control_panel.update()
 
     def on_incr_ref_level(self, evt):
         # print "on_incr_ref_level"
@@ -346,11 +427,13 @@
 
     def on_incr_y_per_div(self, evt):
         # print "on_incr_y_per_div"
-        self.fftsink.set_y_per_div(next_up(self.fftsink.y_per_div, 
(1,2,5,10,20)))
+        self.fftsink.set_y_per_div(next_up(self.fftsink.y_per_div, DIV_LEVELS))
+        self.control_panel.update()
 
     def on_decr_y_per_div(self, evt):
         # print "on_decr_y_per_div"
-        self.fftsink.set_y_per_div(next_down(self.fftsink.y_per_div, 
(1,2,5,10,20)))
+        self.fftsink.set_y_per_div(next_down(self.fftsink.y_per_div, 
DIV_LEVELS))
+        self.control_panel.update()
 
     def on_y_per_div(self, evt):
         # print "on_y_per_div"
@@ -365,20 +448,21 @@
             self.fftsink.set_y_per_div(10)
         elif Id == self.id_y_per_div_20:
             self.fftsink.set_y_per_div(20)
+        self.control_panel.update()
 
     def on_right_click(self, event):
         menu = self.popup_menu
         for id, pred in self.checkmarks.items():
             item = menu.FindItemById(id)
             item.Check(pred())
-        self.PopupMenu(menu, event.GetPosition())
+        self.plot.PopupMenu(menu, event.GetPosition())
 
     def evt_motion(self, event):
         if not hasattr(self, "_points"):
-           return # Got here before first window data update
-           
-       # Clip to plotted values
-        (ux, uy) = self.GetXY(event)      # Scaled position
+            return # Got here before first window data update
+            
+        # Clip to plotted values
+        (ux, uy) = self.plot.GetXY(event)      # Scaled position
         x_vals = numpy.array(self._points[:,0])
         if ux < x_vals[0] or ux > x_vals[-1]:
             tip = self.GetToolTip()
@@ -410,19 +494,19 @@
         self.id_y_per_div_20 = wx.NewId()
         self.id_average = wx.NewId()
         self.id_peak_hold = wx.NewId()
-       
-        self.Bind(wx.EVT_MENU, self.on_average, id=self.id_average)
-        self.Bind(wx.EVT_MENU, self.on_peak_hold, id=self.id_peak_hold)
-        self.Bind(wx.EVT_MENU, self.on_incr_ref_level, 
id=self.id_incr_ref_level)
-        self.Bind(wx.EVT_MENU, self.on_decr_ref_level, 
id=self.id_decr_ref_level)
-        self.Bind(wx.EVT_MENU, self.on_incr_y_per_div, 
id=self.id_incr_y_per_div)
-        self.Bind(wx.EVT_MENU, self.on_decr_y_per_div, 
id=self.id_decr_y_per_div)
-        self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_1)
-        self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_2)
-        self.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_5)
-        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)
         
+        self.plot.Bind(wx.EVT_MENU, self.on_average, id=self.id_average)
+        self.plot.Bind(wx.EVT_MENU, self.on_peak_hold, id=self.id_peak_hold)
+        self.plot.Bind(wx.EVT_MENU, self.on_incr_ref_level, 
id=self.id_incr_ref_level)
+        self.plot.Bind(wx.EVT_MENU, self.on_decr_ref_level, 
id=self.id_decr_ref_level)
+        self.plot.Bind(wx.EVT_MENU, self.on_incr_y_per_div, 
id=self.id_incr_y_per_div)
+        self.plot.Bind(wx.EVT_MENU, self.on_decr_y_per_div, 
id=self.id_decr_y_per_div)
+        self.plot.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_1)
+        self.plot.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_2)
+        self.plot.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_5)
+        self.plot.Bind(wx.EVT_MENU, self.on_y_per_div, id=self.id_y_per_div_10)
+        self.plot.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
@@ -496,20 +580,20 @@
 
         sink1 = fft_sink_c (panel, title="Complex Data", fft_size=fft_size,
                             sample_rate=input_rate, baseband_freq=100e3,
-                            ref_level=0, y_per_div=20)
+                            ref_level=0, y_per_div=20, y_divs=10)
         vbox.Add (sink1.win, 1, wx.EXPAND)
 
-       self.connect(src1, thr1, sink1)
+        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)
         thr2 = gr.throttle(gr.sizeof_float, input_rate)
         sink2 = fft_sink_f (panel, title="Real Data", fft_size=fft_size*2,
                             sample_rate=input_rate, baseband_freq=100e3,
-                            ref_level=0, y_per_div=20)
+                            ref_level=0, y_per_div=20, y_divs=10)
         vbox.Add (sink2.win, 1, wx.EXPAND)
 
-       self.connect(src2, thr2, sink2)
+        self.connect(src2, thr2, sink2)
 
 def main ():
     app = stdgui2.stdapp (test_app_block, "FFT Sink Test App")

Modified: gnuradio/branches/releases/3.1/gr-wxgui/src/python/plot.py
===================================================================
--- gnuradio/branches/releases/3.1/gr-wxgui/src/python/plot.py  2008-06-25 
20:05:09 UTC (rev 8706)
+++ gnuradio/branches/releases/3.1/gr-wxgui/src/python/plot.py  2008-06-25 
20:12:06 UTC (rev 8707)
@@ -767,7 +767,7 @@
     def GetXUseScopeTicks(self):
         return self._xUseScopeTicks
 
-    def Draw(self, graphics, xAxis = None, yAxis = None, dc = None):
+    def Draw(self, graphics, xAxis = None, yAxis = None, dc = None, step=None):
         """Draw objects in graphics with specified x and y axis.
         graphics- instance of PlotGraphics with list of PolyXXX objects
         xAxis - tuple with (min, max) axis range to view
@@ -829,7 +829,7 @@
             xticks = None
             xTextExtent= (0,0) # No text for ticks
         if self._ySpec is not 'none':
-            yticks = self._ticks(yAxis[0], yAxis[1])
+            yticks = self._ticks(yAxis[0], yAxis[1], step)
             yTextExtentBottom= dc.GetTextExtent(yticks[0][1])
             yTextExtentTop   = dc.GetTextExtent(yticks[-1][1])
             yTextExtent= (max(yTextExtentBottom[0],yTextExtentTop[0]),
@@ -1277,7 +1277,7 @@
                                     pt[1]-0.5*h)
                 text = 0    # axis values not drawn on right side
 
-    def _ticks(self, lower, upper):
+    def _ticks(self, lower, upper, step=None):
         ideal = (upper-lower)/7.
         log = _numpy.log10(ideal)
         power = _numpy.floor(log)
@@ -1298,9 +1298,12 @@
         else:
             digits = -int(power)
             format = '%'+`digits+2`+'.'+`digits`+'f'
+        #force grid when step is not None
+        if step is not None: grid = step
         ticks = []
         t = -grid*_numpy.floor(-lower/grid)
         while t <= upper:
+            if t == -0: t = 0 #remove neg zero condition
             ticks.append( (t, format % (t,)) )
             t = t + grid
         return ticks





reply via email to

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