#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# generated by wxGlade 0.3.5.1 on Tue Nov 22 10:35:57 2005

import sys, wx
from gnuradio import gr
from gnuradio import usrp
from gnuradio import audio_oss as audio
from gnuradio.eng_option import eng_option
from optparse import OptionParser
from gnuradio import eng_notation


ID_OPEN = wx.NewId()
ID_EXIT = wx.NewId()
ID_SLIDER_1 = wx.NewId()
ID_SLIDER_2 = wx.NewId()
ID_BUTTON_1 = wx.NewId()
ID_BUTTON_2 = wx.NewId()
ID_BUTTON_3 = wx.NewId()
ID_BUTTON_4 = 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()
        self.Open = wx.MenuItem(wxglade_tmp_menu, ID_OPEN, "Open", "Open audio file", wx.ITEM_NORMAL)
        wxglade_tmp_menu.AppendItem(self.Open)
        self.Exit = wx.MenuItem(wxglade_tmp_menu, ID_EXIT, "Exit", "Exit AM Transmitter", wx.ITEM_NORMAL)
        wxglade_tmp_menu.AppendItem(self.Exit)
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
        # Menu Bar end
        self.label_3 = wx.StaticText(self, -1, "\nNow Playing:\n")
        self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
        self.label_2 = wx.StaticText(self, -1, "             RF Level     ")
        self.slider_2 = wx.Slider(self, ID_SLIDER_2, 0, 0, 100, style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS)
        self.label_1 = wx.StaticText(self, -1, "    Modulation Level    ")
        self.slider_1 = wx.Slider(self, ID_SLIDER_1, 0, 0, 100, style=wx.SL_HORIZONTAL|wx.SL_AUTOTICKS|wx.SL_LABELS)
        self.panel_2 = wx.Panel(self, -1)
        self.panel_3 = wx.Panel(self, -1)
        self.panel_4 = wx.Panel(self, -1)
        self.panel_5 = wx.Panel(self, -1)
        self.panel_6 = wx.Panel(self, -1)
        self.button_1 = wx.Button(self, ID_BUTTON_1, "Rewind")
        self.button_2 = wx.Button(self, ID_BUTTON_2, "Forward")
        self.panel_11 = wx.Panel(self, -1)
        self.panel_7 = wx.Panel(self, -1)
        self.button_3 = wx.Button(self, ID_BUTTON_3, "Stop")
        self.button_4 = wx.Button(self, ID_BUTTON_4, "Run")
        self.panel_12 = wx.Panel(self, -1)
        self.panel_8 = wx.Panel(self, -1)
        self.panel_9 = wx.Panel(self, -1)
        self.panel_10 = wx.Panel(self, -1)
        self.panel_13 = wx.Panel(self, -1)
        self.panel_14 = wx.Panel(self, -1)

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

        wx.EVT_MENU(self, ID_EXIT, self.MenuExit)
        wx.EVT_MENU(self, ID_OPEN, self.MenuOpenFile)
	wx.EVT_BUTTON(self, ID_BUTTON_1, self.Rewind)
	wx.EVT_BUTTON(self, ID_BUTTON_2, self.Forward)
	wx.EVT_BUTTON(self, ID_BUTTON_3, self.Stop)
	wx.EVT_BUTTON(self, ID_BUTTON_4, self.Run)
	wx.EVT_SLIDER(self, ID_SLIDER_1, self.ModLevel)
	wx.EVT_SLIDER(self, ID_SLIDER_2, self.RFLevel)

        parser = OptionParser (option_class=eng_option)

        parser.add_option ("-f", "--freq", type="eng_float", default=10e3,
                       help="set frequency + 1080kHz")
        parser.add_option ("-a", "--amplitude", type="eng_float", default=2e3,
                       help="set RF amplitude", metavar="AMPL")
        (options, args) = parser.parse_args ()

	self.fileopen = False

	usrp_interp = 80
	usrp_duc = 1080e3
	self.sink = usrp.sink_c (0, usrp_interp)
	print "requesting: ", usrp_duc, "hz"
	self.sink.set_tx_freq(0, usrp_duc)
	# use usrp.tx_freq(0) to get actual freq, and use that
	# to set rf_LO
	actual_freq = self.sink.tx_freq(0)
	print "got ", actual_freq, "hz"
	self.sink.set_nchannels(1)
	self.sink.set_mux(0x98)

	rf_LO = options.freq

	af_sample_rate = 32000
	rf_sample_rate = 1600000
	fir_interp = rf_sample_rate / af_sample_rate

	self.fg = gr.flow_graph ()

	self.audio_conv = gr.short_to_float()
	self.slider_1.SetValue(30)
	self.ascale = gr.multiply_const_ff(.00003)
	self.src = gr.add_const_ff(1)

	lpf2_taps = gr.firdes.low_pass ( \
           fir_interp, rf_sample_rate, 14e3, 8e3, gr.firdes.WIN_HAMMING)
	self.lpf2c = gr.interp_fir_filter_fff (fir_interp, lpf2_taps)

	self.rf_loc = gr.sig_source_c (rf_sample_rate,gr.GR_SIN_WAVE,rf_LO,2,0)

	self.rf_mixc = gr.multiply_cc ()

	self.slider_2.SetValue(options.amplitude/100.)
	self.scale = gr.multiply_const_cc(options.amplitude)
	self.hilbert = gr.hilbert_fc(57)


    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("AM Transmitter")
        self.text_ctrl_1.SetSize((300, 50))
        self.slider_2.SetSize((200, 88))
        self.slider_1.SetSize((200, 88))
        # end wxGlade

    def __do_layout(self):
        # begin wxGlade: MyFrame.__do_layout
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_2 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_1 = wx.FlexGridSizer(4, 4, 0, 0)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.VERTICAL)
        sizer_5.Add(self.label_3, 0, wx.FIXED_MINSIZE, 0)
        sizer_5.Add(self.text_ctrl_1, 0, wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_5, 1, wx.EXPAND, 0)
        sizer_3.Add(self.label_2, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_3.Add(self.slider_2, 0, wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
        sizer_4.Add(self.label_1, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_4.Add(self.slider_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_4, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_2, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_3, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_4, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_5, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_6, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_1, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.button_2, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.panel_11, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_7, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.button_3, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.button_4, 0, wx.FIXED_MINSIZE, 0)
        grid_sizer_1.Add(self.panel_12, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_8, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_9, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_10, 1, wx.EXPAND, 0)
        grid_sizer_1.Add(self.panel_13, 1, wx.EXPAND, 0)
        sizer_2.Add(grid_sizer_1, 1, wx.EXPAND, 0)
        sizer_2.Add(self.panel_14, 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 MenuExit(self, event):
        self.Close()

    def MenuOpenFile(self,event):
	if self.fileopen:
	  self.fg.disconnect_all()
        fname = wx.GetTextFromUser("Enter Filename",caption="Enter *.sw audio file to open:",default_value="am_program.sw")
        if fname !='':
          self.audio_file = gr.file_source(gr.sizeof_short,fname)
	  self.fg.connect(self.audio_file, self.audio_conv, self.ascale, self.src, self.lpf2c, self.hilbert, (self.rf_mixc, 0))
	  self.fg.connect(self.rf_loc, (self.rf_mixc, 1))
	  self.fg.connect(self.rf_mixc, self.scale, self.sink)
	  self.fileopen = True
	  self.text_ctrl_1.SetValue(fname)

    def Stop(self, event):
	if self.fg.is_running():
	   self.fg.stop()

    def Run(self, event):
	if self.fileopen:
	   if not self.fg.is_running():
	      self.fg.start()

    def ModLevel(self, event):
	self.ascale.set_k(self.slider_1.GetValue()/1e6)

    def RFLevel(self, event):
	self.scale.set_k(self.slider_2.GetValue()*100.)

    def Forward(self, event):
	if self.fileopen:
	   self.audio_file.seek(1000000,gr.SEEK_CUR)

    def Rewind(self, event):
	if self.fileopen:
	   self.audio_file.seek(-1000000,gr.SEEK_CUR)

# end of class MyFrame

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

app = MyApp(0)
app.MainLoop()

