#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# generated by wxGlade 0.3.5.1 on Wed Sep  7 14:04:24 2005
#
# Copyright 2005 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 2, 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., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#


from gnuradio import gr
from gnuradio.wxgui import stdgui, fftsink, powermate
from gnuradio.wxgui import scopesink
import wx, math

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", "", wx.ITEM_NORMAL)
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
        # Menu Bar end
        self.panel_1 = wx.Panel(self, -1)
        self.label_1 = wx.StaticText(self, -1, "Phase")
        self.label_2 = wx.StaticText(self, -1, "Measured Phase")
        self.slider_1 = wx.Slider(self, ID_SLIDER_1, 0, 0, 100, style=wx.SL_HORIZONTAL|wx.SL_LABELS)
        self.text_ctrl_1 = wx.TextCtrl(self, -1, "")
        self.label_3 = wx.StaticText(self, -1, "Amplitude")
        self.panel_2 = wx.Panel(self, -1)
        self.slider_2 = wx.Slider(self, ID_SLIDER_2, 0, 0, 100, style=wx.SL_HORIZONTAL|wx.SL_LABELS)
        self.panel_3 = wx.Panel(self, -1)

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

        POWERMATE = True
        try:
            self.pm = powermate.powermate(self)
        except:
            POWERMATE = False

        if POWERMATE:
          powermate.EVT_POWERMATE_ROTATE(self, self.on_rotate)


	wx.EVT_MENU(self, ID_EXIT,  self.MenuExit)

	wx.EVT_SLIDER(self,ID_SLIDER_1,self.slider_phase)
	wx.EVT_SLIDER(self,ID_SLIDER_2,self.slider_amplitude)

	self.fg = gr.flow_graph()
        sample_freq = 1e6
        ampl = .1

        src0 = gr.sig_source_f (sample_freq, gr.GR_SIN_WAVE, 1e4, ampl)

        self.delay = 49
	self.slider_1.SetValue(self.delay)
        self.taps = [1]
        for delay in range (0,self.delay):
           self.taps.append(0)
        self.src1 = gr.fir_filter_fff(1, self.taps)
        self.fg.connect (src0, self.src1)


	mul1 = gr.multiply_ff()
	self.meter = gr.probe_signal_f()
	lp_taps = gr.firdes.low_pass ( 20, sample_freq, 1e4, 1e4, gr.firdes.WIN_HAMMING )
	lp = gr.fir_filter_fff(1,lp_taps)
	self.mul2 = gr.multiply_const_ff(2)
	self.slider_2.SetValue(50)

	# agc
	self.i_meter = gr.probe_avg_mag_sqrd_f(1,.001)
	self.o_meter = gr.probe_avg_mag_sqrd_f(1,.001)
	self.pga = gr.multiply_const_ff(1)


	self.fg.connect ( src0, self.i_meter )
	self.fg.connect ( src0, (mul1, 0) )
	self.fg.connect ( self.src1, self.mul2 )

        sink = scopesink.scope_sink_f (self, self.panel_1, "Rx Data", sample_freq, v_scale=.1, t_scale=1e-4)

	self.fg.connect (src0, (sink, 0))
	self.fg.connect (self.mul2, (sink, 1))
	self.fg.connect (self.mul2, self.o_meter)
	self.fg.connect (self.mul2, self.pga)
	self.fg.connect (self.pga, (mul1, 1)) # x20 was here
	self.fg.connect (self.pga, (sink, 2))

	self.fg.connect (mul1, lp, self.meter)
	self.fg.connect (lp, (sink, 3))

	self.fg.start()

	# start timer
        self.timer = UpdateTimer(self, 100) # every 100 mSec



    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("Phase Lab")
        self.SetSize((700, 480))
        self.panel_1.SetSize((640, 240))
        self.slider_1.SetSize((200, 38))
        self.text_ctrl_1.SetSize((150, 25))
        self.slider_2.SetSize((200, 38))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.FlexGridSizer(2, 1, 0, 0)
        grid_sizer_2 = wx.FlexGridSizer(4, 2, 0, 0)
        grid_sizer_1.Add(self.panel_1, 1, wx.EXPAND, 0)
        grid_sizer_2.Add(self.label_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
        grid_sizer_2.Add(self.label_2, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_2.Add(self.slider_1, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_2.Add(self.text_ctrl_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        grid_sizer_2.Add(self.label_3, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
        grid_sizer_2.Add(self.panel_2, 1, wx.EXPAND, 0)
        grid_sizer_2.Add(self.slider_2, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_2.Add(self.panel_3, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(grid_sizer_2, 1, wx.EXPAND, 0)
        sizer_1.Add(grid_sizer_1, 1, wx.EXPAND, 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer_1)
        self.Layout()
        # end wxGlade

    def MenuExit(self, event):
        self.Close(True)

    def slider_phase(self, event):
	self.delay = self.slider_1.GetValue()
	self.set_delay()


    def slider_amplitude(self, event):
	self.mul2.set_k(self.slider_2.GetValue()/25.)

    def on_rotate(self, evt):
	# self.delay = max(0, min(100, self.delay + evt.delta))
	self.delay = self.delay + evt.delta
	if self.delay == -1 : self.delay = 99
	if self.delay == 100 : self.delay = 0
	self.slider_1.SetValue(self.delay)
        self.set_delay()

    def set_delay(self):
	self.taps = [1]
        for delay in range (0,self.delay):
           self.taps.append(0)
        self.src1.set_taps(self.taps)

    def OnUpdate(self):
	self.text_ctrl_1.SetValue(str(self.meter.level()))
        in_level = self.i_meter.level()
        out_level = self.o_meter.level()
        if out_level > .000001 :
	   gain = math.sqrt(in_level/out_level)
           self.pga.set_k(gain)



# end of class MyFramei

# timer for output
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()


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

app = MyApp(0)
app.MainLoop()

