#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# generated by wxGlade 0.3.5.1 on Tue May 31 17:23:37 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.
#


import os, wx, sys
from gnuradio.wxgui import powermate
from gnuradio import gr
from gnuradio import audio
from gnuradio import eng_notation
from gnuradio.eng_option import eng_option
from optparse import OptionParser
from weaver_isb_am_usrp2 import * # main radio guts

ID_BUTTON_1 = wx.NewId()
ID_BUTTON_2 = wx.NewId()
ID_BUTTON_3 = wx.NewId()
ID_BUTTON_4 = wx.NewId()
ID_BUTTON_5 = wx.NewId()
ID_BUTTON_6 = wx.NewId()
ID_BUTTON_7 = wx.NewId()
ID_BUTTON_8 = wx.NewId()
ID_BUTTON_9 = wx.NewId()
ID_BUTTON_10 = wx.NewId()
ID_BUTTON_11 = wx.NewId()
ID_SLIDER_1 = wx.NewId()
ID_SLIDER_2 = wx.NewId()
ID_SLIDER_3 = wx.NewId()
ID_ABOUT = wx.NewId()
ID_EXIT = wx.NewId()
ID_SPINFREQ = wx.NewId()

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):

	# this will get changed below when edited in wxglade
	self.vol_max = 500 # in self.slider_2, change 100 => self.vol_max

        # begin wxGlade: MyFrame.__init__
        kwds["style"] = wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
       
	# cmd line opts - unfortunately this must come after wx.Frame.__init__
	# so will get clobbered when wxglade generates code 
        parser = OptionParser (option_class=eng_option)
        parser.add_option ("-c", "--ddc-freq", type="eng_float", default=1e6,
                           help="set Rx DDC frequency to FREQ", metavar="FREQ")
        (options, args) = parser.parse_args ()
        self.usrp_center = options.ddc_freq
        self.f_lo = self.usrp_center - 300000
        self.f_hi = self.usrp_center + 300000


        # Menu Bar
        self.frame_1_menubar = wx.MenuBar()
        self.SetMenuBar(self.frame_1_menubar)
        wxglade_tmp_menu = wx.Menu()
        wxglade_tmp_menu.Append(ID_ABOUT, "About", "About", wx.ITEM_NORMAL)
        wxglade_tmp_menu.Append(ID_EXIT, "Exit", "Exit", wx.ITEM_NORMAL)
        self.frame_1_menubar.Append(wxglade_tmp_menu, "File")
        # Menu Bar end
        self.frame_1_statusbar = self.CreateStatusBar(4, 0)
        self.button_1 = wx.ToggleButton(self, ID_BUTTON_1, "Frequency")
        self.slider_1 = wx.Slider(self, ID_SLIDER_1, 0, 0, 6000)
        self.spin_ctrl_1 = wx.SpinCtrl(self, ID_SPINFREQ, "", min=self.f_lo, max=self.f_hi, style=wx.SP_WRAP)
        self.button_2 = wx.ToggleButton(self, ID_BUTTON_2, "Volume")
        self.slider_2 = wx.Slider(self, ID_SLIDER_2, 0, 0, self.vol_max)
        self.panel_1 = wx.Panel(self, -1)
        self.button_7 = wx.ToggleButton(self, ID_BUTTON_7, "LSB")
        self.button_8 = wx.ToggleButton(self, ID_BUTTON_8, "USB")
        self.button_9 = wx.ToggleButton(self, ID_BUTTON_9, "AM")
        self.button_3 = wx.ToggleButton(self, ID_BUTTON_3, "Filter")
        self.slider_3 = wx.Slider(self, ID_SLIDER_3, 0, 0, 30)
        self.panel_2 = wx.Panel(self, -1)
        self.panel_3 = wx.Panel(self, -1)
        self.button_10 = wx.ToggleButton(self, ID_BUTTON_10, "ISB1")
        self.button_11 = wx.ToggleButton(self, ID_BUTTON_11, "ISB2")
        self.button_4 = wx.ToggleButton(self, ID_BUTTON_4, "Time")
        self.button_5 = wx.Button(self, ID_BUTTON_5, "Rewind")
        self.button_6 = wx.Button(self, ID_BUTTON_6, "Fast Fwd")
        self.panel_4 = wx.Panel(self, -1)
        self.panel_5 = wx.Panel(self, -1)
        self.panel_6 = wx.Panel(self, -1)

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

	self.active_button = 1
	self.button_1.SetValue(True)

	# radio variables, initial conditions
	self.frequency = self.usrp_center
        # these map the frequency slider (0-6000) to the actual range
        self.f_slider_offset = self.f_lo
        self.f_slider_scale = 100

	self.slider_1.SetValue((self.frequency-self.f_slider_offset)/self.f_slider_scale)
	self.spin_ctrl_1.SetValue(int(self.frequency))
	msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
	self.frame_1_statusbar.SetStatusText(msg,1)

	self.volume = 0
	self.slider_2.SetValue(self.volume)
	msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
	self.frame_1_statusbar.SetStatusText(msg,2)

	self.filter = 24
	self.slider_3.SetValue(24)
	# calculate filters
	af_sample_rate = 32e3
	filter=24
	self.audio_lpf_x = []
	self.fkey = []
	for co in range(600,3601,100):
	  self.fkey += [co]
	  fc=gr.firdes.low_pass(1.0,af_sample_rate,co,300,gr.firdes.WIN_HAMMING)
	  self.audio_lpf_x += [fc]
	# audio_lpf_x[0] is 600, [1] is 900, [2] is 1200, etc

	msg = "Filter: %s" % (eng_notation.num_to_str(self.fkey[self.filter]))
	self.frame_1_statusbar.SetStatusText(msg,3)
	# 0=usb, 1=lsb, 2=am, 3=isb1, 4=isb2
	self.mode = 1
	self.button_7.SetValue(True)

	# xlate_L taps for ssb or am modes
	usrp_decim = 100
	rf_sample_rate = 64000000 / usrp_decim
	self.xlate_taps_ssb = gr.firdes.low_pass ( \
	   1.0, rf_sample_rate, 20e3, 10e3, gr.firdes.WIN_HAMMING )
	self.xlate_taps_am = gr.firdes.low_pass ( \
	   1.0, rf_sample_rate, 6e3, 6e3, gr.firdes.WIN_HAMMING )
	# xlate_L offset for ssb or am modes
	self.ssb_offset = 1.8e3


	wx.EVT_SLIDER(self,ID_SLIDER_1,self.slide_event)
	wx.EVT_SLIDER(self,ID_SLIDER_2,self.slide_event)
	wx.EVT_SLIDER(self,ID_SLIDER_3,self.slide_event)
	wx.EVT_SPINCTRL(self, ID_SPINFREQ, self.spin_event)

        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_1, self.on_button)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_2, self.on_button)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_3, self.on_button)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_4, self.on_button)

        wx.EVT_BUTTON(self, ID_BUTTON_5, self.on_tbutton)
        wx.EVT_BUTTON(self, ID_BUTTON_6, self.on_tbutton)

        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_7, self.on_mbutton)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_8, self.on_mbutton)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_9, self.on_mbutton)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_10, self.on_mbutton)
        wx.EVT_TOGGLEBUTTON(self, ID_BUTTON_11, self.on_mbutton)

        wx.EVT_MENU(self, ID_EXIT,  self.TimeToQuit)
        wx.EVT_MENU(self, ID_ABOUT, self.OnAbout)

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

        self.brightness = 0
        powermate.EVT_POWERMATE_ROTATE(self, self.on_rotate)
        powermate.EVT_POWERMATE_BUTTON(self, self.on_pmButton)

	scale = self.volume / 10e3
	(self.fg, self.tune_offset, self.xlate_L, self.xlate_U, self.scale_L, self.scale_U, self.src, self.audio_lpf_L, self.audio_lpf_U, self.sel_lsb_0, self.sel_lsb_1, self.sel_usb_0, self.sel_usb_1, self.sel_am, self.scale_am) = build_graph (self.frequency, scale, self.usrp_center)
	if self.fg.is_running():
	  print "fg is running"

	# start a timer to check for web commands
        self.timer = UpdateTimer(self, 1000) # every 1000 mSec, 1 Sec

    def __set_properties(self):
        # begin wxGlade: MyFrame.__set_properties
        self.SetTitle("GNU Radio HF Explorer")
        self.SetSize((698, 300))
        self.frame_1_statusbar.SetStatusWidths([-1, -1, -1, -1])
        # statusbar fields
        frame_1_statusbar_fields = ["", "Frequency", "Volume", "Filter"]
        for i in range(len(frame_1_statusbar_fields)):
            self.frame_1_statusbar.SetStatusText(frame_1_statusbar_fields[i], i)
        self.slider_1.SetSize((500, 25))
        self.slider_2.SetSize((200, 25))
        self.slider_3.SetSize((200, 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_8 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_3.Add(self.button_1, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_3.Add(self.slider_1, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_3.Add(self.spin_ctrl_1, 0, wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_3, 1, wx.EXPAND, 0)
        sizer_5.Add(self.button_2, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_5.Add(self.slider_2, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_5.Add(self.panel_1, 1, wx.EXPAND, 0)
        sizer_5.Add(self.button_7, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_5.Add(self.button_8, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_5.Add(self.button_9, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_5, 1, wx.EXPAND, 0)
        sizer_7.Add(self.button_3, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_7.Add(self.slider_3, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_7.Add(self.panel_2, 1, wx.EXPAND, 0)
        sizer_7.Add(self.panel_3, 1, wx.EXPAND, 0)
        sizer_7.Add(self.button_10, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_7.Add(self.button_11, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_2.Add(sizer_7, 1, wx.EXPAND, 0)
        sizer_8.Add(self.button_4, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_8.Add(self.button_5, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_8.Add(self.button_6, 0, wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0)
        sizer_8.Add(self.panel_4, 1, wx.EXPAND, 0)
        sizer_8.Add(self.panel_5, 1, wx.EXPAND, 0)
        sizer_8.Add(self.panel_6, 1, wx.EXPAND, 0)
        sizer_2.Add(sizer_8, 1, wx.EXPAND, 0)
        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
        self.SetAutoLayout(True)
        self.SetSizer(sizer_1)
        self.Layout()
        # end wxGlade

    def slide_event(self,evt):
        value = evt.GetInt()
        id = evt.GetId()
        if id == ID_SLIDER_1:
	   self.frequency = (self.f_slider_scale * self.slider_1.GetValue()) + self.f_slider_offset
	   msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
	   self.frame_1_statusbar.SetStatusText (msg,1)
	   self.spin_ctrl_1.SetValue(self.frequency)
	   self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )
	   self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) - 1.8e3 )
        elif id == ID_SLIDER_2:
	   self.volume = self.slider_2.GetValue()
	   msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
	   self.frame_1_statusbar.SetStatusText (msg,2)
	   self.scale_L.set_k(self.volume/10e3)
	   self.scale_U.set_k(self.volume/10e3)
	   self.scale_am.set_k(self.volume/10e3)
        elif id == ID_SLIDER_3:
	   self.filter = self.slider_3.GetValue()
	   msg = "Filter: %s" % (eng_notation.num_to_str(self.fkey[self.filter]))
	   self.frame_1_statusbar.SetStatusText (msg,3)
	   self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
	   self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])


    def on_button(self, evt):
        id = evt.GetId()
        if id == ID_BUTTON_1:
            self.active_button = 1
            self.button_2.SetValue(False)
            self.button_3.SetValue(False)
	    self.button_4.SetValue(False)
        elif id == ID_BUTTON_2:
            self.active_button = 2
            self.button_1.SetValue(False)
            self.button_3.SetValue(False)
	    self.button_4.SetValue(False)
        elif id == ID_BUTTON_3:
            self.active_button = 3
            self.button_1.SetValue(False)
            self.button_2.SetValue(False)
	    self.button_4.SetValue(False)
	elif id == ID_BUTTON_4:
	    self.active_button = 4
	    self.button_1.SetValue(False)
	    self.button_2.SetValue(False)
	    self.button_3.SetValue(False)

    def on_tbutton(self, evt):
	id = evt.GetId()
	if id == ID_BUTTON_5:
	  self.src.seek(-10000000,gr.SEEK_CUR)
	elif id == ID_BUTTON_6:
	  self.src.seek(1000000,gr.SEEK_CUR)

    def on_mbutton(self, evt):
	id = evt.GetId()
	if id == ID_BUTTON_7:  # LSB in both ears
          self.mode = 1
          self.button_8.SetValue(False)
          self.button_9.SetValue(False)
          self.button_10.SetValue(False)
          self.button_11.SetValue(False)
          self.sel_lsb_0.set_k(1)
          self.sel_lsb_1.set_k(1)
          self.sel_usb_0.set_k(0)
          self.sel_usb_1.set_k(0)
          self.sel_am.set_k(0)
          self.xlate_L.set_taps(self.xlate_taps_ssb)
          self.ssb_offset = 1.8e3
          self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )


	elif id == ID_BUTTON_8:  # USB in both ears
          self.mode = 0
          self.button_7.SetValue(False)
          self.button_9.SetValue(False)
          self.button_10.SetValue(False)
          self.button_11.SetValue(False)
          self.sel_lsb_0.set_k(0)
          self.sel_lsb_1.set_k(0)
          self.sel_usb_0.set_k(1)
          self.sel_usb_1.set_k(1)
          self.sel_am.set_k(0)
          self.xlate_L.set_taps(self.xlate_taps_ssb)
          self.ssb_offset = 1.8e3
          self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )


	elif id == ID_BUTTON_9: # AM 
          self.mode = 2
          self.button_7.SetValue(False)
          self.button_8.SetValue(False)
          self.button_9.SetValue(True)
          self.button_10.SetValue(False)
          self.button_11.SetValue(False)
          self.sel_lsb_0.set_k(0)
          self.sel_lsb_1.set_k(0)
          self.sel_usb_0.set_k(0)
          self.sel_usb_1.set_k(0)
          self.sel_am.set_k(1)
          self.xlate_L.set_taps(self.xlate_taps_am)
          self.ssb_offset = 0
          self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )


	elif id == ID_BUTTON_10: # LSB in one ear and USB in the other
          self.mode = 3
          self.button_7.SetValue(False)
          self.button_8.SetValue(False)
          self.button_9.SetValue(False)
          self.button_11.SetValue(False)
          self.sel_lsb_0.set_k(1)
          self.sel_lsb_1.set_k(0)
          self.sel_usb_0.set_k(0)
          self.sel_usb_1.set_k(1)
          self.sel_am.set_k(0)
          self.xlate_L.set_taps(self.xlate_taps_ssb)
          self.ssb_offset = 1.8e3
          self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )


	elif id == ID_BUTTON_11: # USB in one ear and LSB in the other
          self.mode = 4
          self.button_7.SetValue(False)
          self.button_8.SetValue(False)
          self.button_9.SetValue(False)
          self.button_10.SetValue(False)
          self.sel_lsb_0.set_k(0)
          self.sel_lsb_1.set_k(1)
          self.sel_usb_0.set_k(1)
          self.sel_usb_1.set_k(0)
          self.sel_am.set_k(0)
          self.xlate_L.set_taps(self.xlate_taps_ssb)
          self.ssb_offset = 1.8e3
          self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )



    def on_rotate(self, evt):
        if self.active_button == 1:
            new = max(0, min(6000, self.slider_1.GetValue() + evt.delta))
            self.slider_1.SetValue(new)
	    self.frequency = (self.f_slider_scale * new) + self.f_slider_offset
	    self.spin_ctrl_1.SetValue(self.frequency)
	    msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
	    self.frame_1_statusbar.SetStatusText(msg,1)
	    self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )
	    self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) - 1.8e3 )

        elif self.active_button == 2:
            new = max(0, min(self.vol_max, self.slider_2.GetValue() + evt.delta))
            self.slider_2.SetValue(new)
	    self.volume = new
	    msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
	    self.frame_1_statusbar.SetStatusText(msg,2)
	    self.scale_L.set_k(self.volume/10e3)
	    self.scale_U.set_k(self.volume/10e3)
	    self.scale_am.set_k(self.volume/10e3)

        elif self.active_button == 3:
            new = max(0, min(30, self.slider_3.GetValue() + evt.delta))
            self.slider_3.SetValue(new)
	    self.filter = new
	    msg = "Filter: %s" % (eng_notation.num_to_str(self.fkey[self.filter]))
	    self.frame_1_statusbar.SetStatusText(msg,3)
	    self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
	    self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])

	elif self.active_button == 4:
	    if evt.delta == -1:
		self.src.seek(-1000000,gr.SEEK_CUR)
	    elif evt.delta == 1:
		self.src.seek(1000000,gr.SEEK_CUR)

    def on_pmButton(self, evt):
        if evt.value == 0:
          if self.active_button == 1:
            self.active_button = 2
            self.button_1.SetValue(False)
            self.button_2.SetValue(True)
            self.button_3.SetValue(False)
	    self.button_4.SetValue(False)
          elif self.active_button == 2:
            self.active_button = 3
            self.button_1.SetValue(False)
            self.button_2.SetValue(False)
            self.button_3.SetValue(True)
	    self.button_4.SetValue(False)
          elif self.active_button == 3:
            self.active_button = 4
            self.button_1.SetValue(False)
            self.button_2.SetValue(False)
            self.button_3.SetValue(False)
	    self.button_4.SetValue(True)
	  elif self.active_button == 4:
	    self.active_button = 1
	    self.button_1.SetValue(True)
	    self.button_2.SetValue(False)
	    self.button_3.SetValue(False)
	    self.button_4.SetValue(False)

    def spin_event(self, event):
	self.frequency = self.spin_ctrl_1.GetValue()
	self.slider_1.SetValue(int((self.frequency-self.f_slider_offset)/self.f_slider_scale))
	msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
	self.frame_1_statusbar.SetStatusText(msg,1)
	self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )
	self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) - 1.8e3 )

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

    def OnAbout(self, event):
        dlg = wx.MessageDialog(self, "Listen To\n"
                              "GNU/Radio live USRP\n"
                              "GNU/Radio Control Panel", wx.OK | wx.ICON_INFORMATION)
        dlg.ShowModal()
        dlg.Destroy()

    # timer events - check for web commands
    def OnUpdate(self):
      cmds = os.listdir("/var/www/cgi-bin/commands/")
      if cmds!=[]:
        if cmds[0]=='chfreq':
          fd=open("/var/www/cgi-bin/commands/chfreq","r")
          new=fd.readline()
          fd.close()
          if new!='':
            os.unlink("/var/www/cgi-bin/commands/chfreq")
	    if ( int(new) >= self.f_lo ) & ( int(new) <= self.f_hi ):
	       self.frequency = int(new)
               self.slider_1.SetValue(( self.frequency - self.f_slider_offset) / self.f_slider_scale )
               self.spin_ctrl_1.SetValue(self.frequency)
               msg = "Frequency: %s" % (eng_notation.num_to_str(self.frequency))
               self.frame_1_statusbar.SetStatusText(msg,1)
               self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )
               self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) - 1.8e3 )

        if cmds[0]=='chvolume':
          fd=open("/var/www/cgi-bin/commands/chvolume","r")
          new=fd.readline()
          fd.close()
          if new!='':
            os.unlink("/var/www/cgi-bin/commands/chvolume")
	    if ( int(new) >= 0 ) & ( int(new) <= self.vol_max ):
	       self.volume = int(new)
               self.slider_2.SetValue(self.volume)
               msg = "Volume: %s" % (eng_notation.num_to_str(self.volume))
               self.frame_1_statusbar.SetStatusText(msg,2)
               self.scale_L.set_k(self.volume/10e3)
               self.scale_U.set_k(self.volume/10e3)
               self.scale_am.set_k(self.volume/10e3)

        if cmds[0]=='chfilter':
          fd=open("/var/www/cgi-bin/commands/chfilter","r")
          new=fd.readline()
          fd.close()
          if new!='':
            os.unlink("/var/www/cgi-bin/commands/chfilter")
	    if ( int(new) >= 0 ) & ( int(new) <= 30 ):
	       self.filter = int(new)
               msg = "Filter: %s" % (eng_notation.num_to_str(self.fkey[self.filter]))
               self.frame_1_statusbar.SetStatusText(msg,3)
               self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
               self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])

        if cmds[0]=='chmode':
          fd=open("/var/www/cgi-bin/commands/chmode","r")
          new=fd.readline()
          fd.close()
          if new!='':
            os.unlink("/var/www/cgi-bin/commands/chmode")
            if new == 'LSB\n' :
              self.mode = 1
	      self.button_7.SetValue(True)
              self.button_8.SetValue(False)
              self.button_9.SetValue(False)
              self.button_10.SetValue(False)
              self.button_11.SetValue(False)
              self.sel_lsb_0.set_k(1)
              self.sel_lsb_1.set_k(1)
              self.sel_usb_0.set_k(0)
              self.sel_usb_1.set_k(0)
              self.sel_am.set_k(0)
              self.xlate_L.set_taps(self.xlate_taps_ssb)
              self.ssb_offset = 1.8e3
              self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )

	    elif new == 'USB\n':
              self.mode = 0
              self.button_7.SetValue(False)
	      self.button_8.SetValue(True)
              self.button_9.SetValue(False)
              self.button_10.SetValue(False)
              self.button_11.SetValue(False)
              self.sel_lsb_0.set_k(0)
              self.sel_lsb_1.set_k(0)
              self.sel_usb_0.set_k(1)
              self.sel_usb_1.set_k(1)
              self.sel_am.set_k(0)
              self.xlate_L.set_taps(self.xlate_taps_ssb)
              self.ssb_offset = 1.8e3
              self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )

	    elif new == 'AM\n':
              self.mode = 2
              self.button_7.SetValue(False)
              self.button_8.SetValue(False)
              self.button_9.SetValue(True)
              self.button_10.SetValue(False)
              self.button_11.SetValue(False)
              self.sel_lsb_0.set_k(0)
              self.sel_lsb_1.set_k(0)
              self.sel_usb_0.set_k(0)
              self.sel_usb_1.set_k(0)
              self.sel_am.set_k(1)
              self.xlate_L.set_taps(self.xlate_taps_am)
              self.ssb_offset = 0
              self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )

	    elif new == 'ISB1\n':
              self.mode = 3
              self.button_7.SetValue(False)
              self.button_8.SetValue(False)
              self.button_9.SetValue(False)
	      self.button_10.SetValue(True)
              self.button_11.SetValue(False)
              self.sel_lsb_0.set_k(1)
              self.sel_lsb_1.set_k(0)
              self.sel_usb_0.set_k(0)
              self.sel_usb_1.set_k(1)
              self.sel_am.set_k(0)
              self.xlate_L.set_taps(self.xlate_taps_ssb)
              self.ssb_offset = 1.8e3
              self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )

	    elif new == 'ISB2\n':
              self.mode = 4
              self.button_7.SetValue(False)
              self.button_8.SetValue(False)
              self.button_9.SetValue(False)
              self.button_10.SetValue(False)
	      self.button_11.SetValue(True)
              self.sel_lsb_0.set_k(0)
              self.sel_lsb_1.set_k(1)
              self.sel_usb_0.set_k(1)
              self.sel_usb_1.set_k(0)
              self.sel_am.set_k(0)
              self.xlate_L.set_taps(self.xlate_taps_ssb)
              self.ssb_offset = 1.8e3
              self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + self.ssb_offset )


# end of class MyFrame

# wx.Timer to check for web updates
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, "HF Explorer")
    frame.Show(True)
    self.SetTopWindow(frame)
    return True

app = MyApp(0)
app.MainLoop()

