#!/usr/bin/env python

import cherrypy
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_usrp3 import *

class RC:
  def __init__(self, *args, **kwds):

	self.sname = 'http://192.168.0.18/'

        parser = OptionParser (option_class=eng_option)
        parser.add_option ("-c", "--ddc-freq", type="eng_float", default=3.9e6,
                           help="set Rx DDC frequency to FREQ", metavar="FREQ")
        parser.add_option ("-a", "--audio_file", default="",
                           help="audio output file", metavar="FILE")
        parser.add_option ("-r", "--radio_file", default="",
                           help="radio output file", metavar="FILE")
        parser.add_option ("-i", "--input_file", default="",
                           help="radio input file", metavar="FILE")
        parser.add_option ("-d", "--decim", type="int", default=250,
                           help="USRP decimation")
        (options, args) = parser.parse_args ()
        if options.input_file == "": self.PLAY_FROM_USRP = True
        else: self.PLAY_FROM_USRP = False
        self.usrp_center = options.ddc_freq
        usb_rate = 64e6 / options.decim

	self.frequency = self.usrp_center

        self.volume = 0

        self.filter = 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

        scale = self.volume / 10e3

	# gigantic call to radio module
        (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, options.decim, \
	self.usrp_center, options.audio_file, options.radio_file, \
	options.input_file)

	if self.PLAY_FROM_USRP:
	   self.src.set_pga(0,10)
        self.fg.start()



  def index(self):
    return '''
	<table border=2>
	<tr>
	<td><form action="up_5" method="GET"><input type="submit" value="up.5" /></form></td>
	<td><form action="up1" method="GET"><input type="submit" value="up 1" /></form></td>
	<td><form action="up3" method="GET"><input type="submit" value="up 3" /></form></td>
	<td><form action="up5" method="GET"><input type="submit" value="up 5" /></form></td>
	<td><form action="up10" method="GET"><input type="submit" value="up 10" /></form></tr>
	<tr></table>
	<table border=2>
	<tr><td><form action="input_f" method="GET">
	Frequency: <input type="text" name="freq" size=10 value=%s />
	<input type="submit" value="submit"/></form></td></tr>
	</table>
	<table border=2>
        <tr>
        <td><form action="dn_5" method="GET"><input type="submit" value="dn.5" /></form></td>
        <td><form action="dn1" method="GET"><input type="submit" value="dn 1" /></form></td>
        <td><form action="dn3" method="GET"><input type="submit" value="dn 3" /></form></td>
        <td><form action="dn5" method="GET"><input type="submit" value="dn 5" /></form></td>
        <td><form action="dn10" method="GET"><input type="submit" value="dn 10" /></form></td></tr>
        </table>
	<table border=2>
	<tr><td><form action="input_v" method="GET">
	Volume: <input type="text" name="vol" size=12 value=%s />
	<input type="submit" value="submit" /></form></td></tr>
	<tr><td><form action="input_l" method="GET">
	Filter: <input type="text" name="fil" size=10 value=%s />
	<input type="submit" value="submit" /></td></tr>
	</form></table>''' % (str(int(self.frequency)), str(self.volume), str(self.filter))
  index.exposed = True

  def input_f(self, freq):
	self.frequency = int(freq)
	self.ch_freq(0)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  input_f.exposed = True

  def input_v(self, vol):
	self.volume = int(vol)
        self.scale_L.set_k(self.volume/10e3)
        self.scale_U.set_k(self.volume/10e3)
        self.scale_am.set_k(self.volume/10e3)
	return '''<meta http-equiv="refresh" content="0;url=%s/">''' % self.sname
  input_v.exposed = True

  def input_l(self, fil):
	self.filter = int(fil)
        self.audio_lpf_L.set_taps(self.audio_lpf_x[self.filter])
        self.audio_lpf_U.set_taps(self.audio_lpf_x[self.filter])
	return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  input_l.exposed = True

  def dn_5(self):
	self.ch_freq(-500)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  dn_5.exposed = True

  def dn1(self):
	self.ch_freq(-1000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  dn1.exposed = True

  def dn3(self):
	self.ch_freq(-3000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  dn3.exposed = True

  def dn5(self):
        self.ch_freq(-5000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  dn5.exposed = True

  def dn10(self):
        self.ch_freq(-10000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  dn10.exposed = True

  def up_5(self):
        self.ch_freq(500)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  up_5.exposed = True


  def up1(self):
        self.ch_freq(1000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  up1.exposed = True

  def up3(self):
        self.ch_freq(3000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  up3.exposed = True

  def up5(self):
	self.ch_freq(5000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  up5.exposed = True

  def up10(self):
	self.ch_freq(10000)
        return '''<meta http-equiv="refresh" content="0;url=%s">''' % self.sname
  up10.exposed = True

  def ch_freq(self,delta):
	self.frequency += delta
        self.xlate_L.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) + 1.8e3 )
        self.xlate_U.set_center_freq ( self.usrp_center - ( self.frequency - self.tune_offset ) - 1.8e3 )



cherrypy.root = RC()

cherrypy.config.update(file = 'myconf.conf')
cherrypy.server.start()

