#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# generated by wxGlade 0.3.5.1 on Mon Jun 13 13:18:34 2005

import wx, sys
from gnuradio import gr
from gnuradio.wxgui import powermate

ID_EXIT = wx.NewId()
ID_SLIDER_1 = wx.NewId()
ID_SLIDER_2 = wx.NewId()

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        
        # Menu Bar
        self.frame_1_menubar = wx.MenuBar()
        self.SetMenuBar(self.frame_1_menubar)
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(ID_EXIT, "Exit", "Exit", wx.ITEM_NORMAL)
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
        # Menu Bar end
        self.gauge_1 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_2 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_3 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_4 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_5 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_6 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_7 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_8 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_9 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_10 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_11 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_12 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_13 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_14 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_15 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.gauge_16 = wx.Gauge(self, -1, 100, style=wx.GA_VERTICAL)
        self.slider_1 = wx.Slider(self, ID_SLIDER_1, 0, -15999, 15999)
        self.slider_2 = wx.Slider(self, ID_SLIDER_2, 0, -15999, 15999)

        self.__set_properties()
        self.__do_layout()
        # end wxGlade

	self.fg = gr.flow_graph()
        sample_rate = 32000
	self.frequency_1 = 1000
	self.slider_1.SetValue(self.frequency_1)
	self.frequency_2 = -3000
	self.slider_2.SetValue(self.frequency_2)
	fft_size = 16

        self.src_1 = gr.sig_source_c (sample_rate,gr.GR_SIN_WAVE,self.frequency_1,.3,0)
	self.src_2 = gr.sig_source_c (sample_rate,gr.GR_SIN_WAVE,self.frequency_2,.3,0)
	self.src = gr.add_cc()
	self.fg.connect(self.src_1,(self.src,0))
	self.fg.connect(self.src_2,(self.src,1))
        s2v = gr.stream_to_vector (gr.sizeof_gr_complex, fft_size)
        fft = gr.fft_vcc (fft_size,True,False) # size, fwd, window
	v2s = gr.vector_to_stream(gr.sizeof_gr_complex, fft_size)
        s2ss = gr.stream_to_streams (gr.sizeof_gr_complex, fft_size)

	self.fg.connect(self.src,s2v,fft,v2s,s2ss)

	alpha = .001
	self.L0 = gr.signal_level_cc(1,alpha)
	self.L1 = gr.signal_level_cc(1,alpha)
	self.L2 = gr.signal_level_cc(1,alpha)
	self.L3 = gr.signal_level_cc(1,alpha)
        self.L4 = gr.signal_level_cc(1,alpha)
        self.L5 = gr.signal_level_cc(1,alpha)
        self.L6 = gr.signal_level_cc(1,alpha)
        self.L7 = gr.signal_level_cc(1,alpha)
        self.L8 = gr.signal_level_cc(1,alpha)
        self.L9 = gr.signal_level_cc(1,alpha)
        self.L10 = gr.signal_level_cc(1,alpha)
        self.L11 = gr.signal_level_cc(1,alpha)
        self.L12 = gr.signal_level_cc(1,alpha)
        self.L13 = gr.signal_level_cc(1,alpha)
        self.L14 = gr.signal_level_cc(1,alpha)
        self.L15 = gr.signal_level_cc(1,alpha)


	sink0 = gr.null_sink(gr.sizeof_gr_complex)
        sink1 = gr.null_sink(gr.sizeof_gr_complex)
        sink2 = gr.null_sink(gr.sizeof_gr_complex)
        sink3 = gr.null_sink(gr.sizeof_gr_complex)
        sink4 = gr.null_sink(gr.sizeof_gr_complex)
        sink5 = gr.null_sink(gr.sizeof_gr_complex)
        sink6 = gr.null_sink(gr.sizeof_gr_complex)
        sink7 = gr.null_sink(gr.sizeof_gr_complex)
        sink8 = gr.null_sink(gr.sizeof_gr_complex)
        sink9 = gr.null_sink(gr.sizeof_gr_complex)
        sink10 = gr.null_sink(gr.sizeof_gr_complex)
        sink11 = gr.null_sink(gr.sizeof_gr_complex)
        sink12 = gr.null_sink(gr.sizeof_gr_complex)
        sink13 = gr.null_sink(gr.sizeof_gr_complex)
        sink14 = gr.null_sink(gr.sizeof_gr_complex)
        sink15 = gr.null_sink(gr.sizeof_gr_complex)

	self.fg.connect((s2ss,0),self.L0,sink0)
	self.fg.connect((s2ss,1),self.L1,sink1)
        self.fg.connect((s2ss,2),self.L2,sink2)
        self.fg.connect((s2ss,3),self.L3,sink3)
        self.fg.connect((s2ss,4),self.L4,sink4)
        self.fg.connect((s2ss,5),self.L5,sink5)
        self.fg.connect((s2ss,6),self.L6,sink6)
        self.fg.connect((s2ss,7),self.L7,sink7)
        self.fg.connect((s2ss,8),self.L8,sink8)
        self.fg.connect((s2ss,9),self.L9,sink9)
        self.fg.connect((s2ss,10),self.L10,sink10)
        self.fg.connect((s2ss,11),self.L11,sink11)
        self.fg.connect((s2ss,12),self.L12,sink12)
        self.fg.connect((s2ss,13),self.L13,sink13)
        self.fg.connect((s2ss,14),self.L14,sink14)
        self.fg.connect((s2ss,15),self.L15,sink15)

	self.fg.start()

	POWERMATE = True
        try:
            self.pm = powermate.powermate(self)
        except:
            sys.stderr.write("Unable to find PowerMate or Contour Shuttle\n")
	    POWERMATE = False

	if POWERMATE:
          powermate.EVT_POWERMATE_ROTATE(self, self.on_rotate)
        wx.EVT_MENU(self, ID_EXIT,  self.TimeToQuit)
        wx.EVT_SLIDER(self,ID_SLIDER_1,self.slide_event)
        wx.EVT_SLIDER(self,ID_SLIDER_2,self.slide_event)


        self.timer = UpdateTimer(self, 30)


    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("Spectrum Gauges")
        self.slider_1.SetSize((400, 25))
        self.slider_2.SetSize((400, 25))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.GridSizer(1, 16, 0, 0)
        grid_sizer_1.Add(self.gauge_1, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_2, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_3, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_4, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_5, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_6, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_7, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_8, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_9, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_10, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_11, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_12, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_13, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_14, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_15, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.gauge_16, 0, wx.FIXED_MINSIZE, 0)
        sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0)
        sizer_3.Add(self.slider_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_3.Add(self.slider_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer_1)
        sizer_1.Fit(self)
        sizer_1.SetSizeHints(self)
        self.Layout()
        # end wxGlade

    def OnUpdate(self):
	self.gauge_1.SetValue(self.L0.level())
	self.gauge_2.SetValue(self.L1.level())
	self.gauge_3.SetValue(self.L2.level())
	self.gauge_4.SetValue(self.L3.level())
        self.gauge_5.SetValue(self.L4.level())
        self.gauge_6.SetValue(self.L5.level())
        self.gauge_7.SetValue(self.L6.level())
        self.gauge_8.SetValue(self.L7.level())
        self.gauge_9.SetValue(self.L8.level())
        self.gauge_10.SetValue(self.L9.level())
        self.gauge_11.SetValue(self.L10.level())
        self.gauge_12.SetValue(self.L11.level())
        self.gauge_13.SetValue(self.L12.level())
        self.gauge_14.SetValue(self.L13.level())
        self.gauge_15.SetValue(self.L14.level())
        self.gauge_16.SetValue(self.L15.level())

    def on_rotate(self, evt):
	self.frequency_1 += ( evt.delta * 10 )
	self.slider_1.SetValue(self.frequency_1)
	self.src_1.set_frequency(self.frequency_1)

    def slide_event(self,evt):
        value = evt.GetInt()
        id = evt.GetId()
	if id == ID_SLIDER_1:
	  self.frequency_1 = self.slider_1.GetValue()
	  self.src_1.set_frequency(self.frequency_1)
	elif id == ID_SLIDER_2:
	  self.frequency_2 = self.slider_2.GetValue()
	  self.src_2.set_frequency(self.frequency_2)

    # menubar events
    def TimeToQuit(self, event):
        self.fg.stop()
        self.Close(True)



class UpdateTimer(wx.Timer):
    def __init__(self, target, dur=1000):
        wx.Timer.__init__(self)
        self.target = target
        self.Start(dur)

    def Notify(self):
        """Called every timer interval"""
        if self.target:
            self.target.OnUpdate()



# end of class MyFrame

class MyApp(wx.App):
  def OnInit(self):
    frame = MyFrame(None, -1, "Spectrum Display")
    frame.Show(True)
    self.SetTopWindow(frame)
    return True

app = MyApp(0)
app.MainLoop()

