#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: Simple I/Q Sender
# Author: Marcus Leech, Science Radio Laboratories
# Description: A Simple GUI-less I/Q Sender with no frills
# Generated: Tue Dec 27 20:55:28 2011
##################################################

from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import uhd
from gnuradio.eng_option import eng_option
from gnuradio.gr import firdes
from optparse import OptionParser
import math

class simple_sender(gr.top_block):

	def __init__(self, frequency=204.640e6, rate=2.0e6, devid="type=usrp1", subdev="A:0", dgain=0, scale=32768, rfgain=25.0, ant="TX/RX"):
		gr.top_block.__init__(self, "Simple I/Q Sender")

		##################################################
		# Parameters
		##################################################
		self.frequency = frequency
		self.rate = rate
		self.devid = devid
		self.subdev = subdev
		self.dgain = dgain
		self.scale = scale
		self.rfgain = rfgain
		self.ant = ant

		##################################################
		# Variables
		##################################################
		self.samp_rate = samp_rate = int(rate)
		self.dg = dg = math.sqrt(math.pow(10.0,dgain/10))

		##################################################
		# Blocks
		##################################################
		self.uhd_usrp_sink_0 = uhd.usrp_sink(
			device_addr=devid,
			stream_args=uhd.stream_args(
				cpu_format="fc32",
				channels=range(1),
			),
		)
		self.uhd_usrp_sink_0.set_subdev_spec(subdev, 0)
		self.uhd_usrp_sink_0.set_samp_rate(samp_rate)
		self.uhd_usrp_sink_0.set_center_freq(uhd.tune_request(frequency,0), 0)
		self.uhd_usrp_sink_0.set_gain(rfgain, 0)
		self.uhd_usrp_sink_0.set_antenna(ant, 0)
		self.gr_multiply_const_vxx_0 = gr.multiply_const_vcc(((1.0/(scale))*(dg), ))
		self.gr_file_source_0 = gr.file_source(gr.sizeof_gr_complex*1, "/dev/stdin", False)

		##################################################
		# Connections
		##################################################
		self.connect((self.gr_file_source_0, 0), (self.gr_multiply_const_vxx_0, 0))
		self.connect((self.gr_multiply_const_vxx_0, 0), (self.uhd_usrp_sink_0, 0))

	def get_frequency(self):
		return self.frequency

	def set_frequency(self, frequency):
		self.frequency = frequency
		self.uhd_usrp_sink_0.set_center_freq(uhd.tune_request(self.frequency,0), 0)

	def get_rate(self):
		return self.rate

	def set_rate(self, rate):
		self.rate = rate
		self.set_samp_rate(int(self.rate))

	def get_devid(self):
		return self.devid

	def set_devid(self, devid):
		self.devid = devid

	def get_subdev(self):
		return self.subdev

	def set_subdev(self, subdev):
		self.subdev = subdev

	def get_dgain(self):
		return self.dgain

	def set_dgain(self, dgain):
		self.dgain = dgain
		self.set_dg(math.sqrt(math.pow(10.0,self.dgain/10)))

	def get_scale(self):
		return self.scale

	def set_scale(self, scale):
		self.scale = scale
		self.gr_multiply_const_vxx_0.set_k(((1.0/(self.scale))*(self.dg), ))

	def get_rfgain(self):
		return self.rfgain

	def set_rfgain(self, rfgain):
		self.rfgain = rfgain
		self.uhd_usrp_sink_0.set_gain(self.rfgain, 0)

	def get_ant(self):
		return self.ant

	def set_ant(self, ant):
		self.ant = ant
		self.uhd_usrp_sink_0.set_antenna(self.ant, 0)

	def get_samp_rate(self):
		return self.samp_rate

	def set_samp_rate(self, samp_rate):
		self.samp_rate = samp_rate
		self.uhd_usrp_sink_0.set_samp_rate(self.samp_rate)

	def get_dg(self):
		return self.dg

	def set_dg(self, dg):
		self.dg = dg
		self.gr_multiply_const_vxx_0.set_k(((1.0/(self.scale))*(self.dg), ))

if __name__ == '__main__':
	parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
	parser.add_option("-f", "--frequency", dest="frequency", type="eng_float", default=eng_notation.num_to_str(204.640e6),
		help="Set Center Frequency of Transmitter [default=%default]")
	parser.add_option("-r", "--rate", dest="rate", type="eng_float", default=eng_notation.num_to_str(2.0e6),
		help="Set Sample Rate for USRP [default=%default]")
	parser.add_option("", "--devid", dest="devid", type="string", default="type=usrp1",
		help="Set UHD Device ID [default=%default]")
	parser.add_option("", "--subdev", dest="subdev", type="string", default="A:0",
		help="Set UHD Subdevice Name [default=%default]")
	parser.add_option("", "--dgain", dest="dgain", type="eng_float", default=eng_notation.num_to_str(0),
		help="Set Digital Gain (dB) [default=%default]")
	parser.add_option("", "--scale", dest="scale", type="eng_float", default=eng_notation.num_to_str(32768),
		help="Set Linear Scaling Value for Inputs to map into {-1,+1} [default=%default]")
	parser.add_option("", "--rfgain", dest="rfgain", type="eng_float", default=eng_notation.num_to_str(25.0),
		help="Set Analog RF Gain [default=%default]")
	parser.add_option("", "--ant", dest="ant", type="string", default="TX/RX",
		help="Set Antennna Port Name [default=%default]")
	(options, args) = parser.parse_args()
	if gr.enable_realtime_scheduling() != gr.RT_OK:
		print "Error: failed to enable realtime scheduling."
	tb = simple_sender(frequency=options.frequency, rate=options.rate, devid=options.devid, subdev=options.subdev, dgain=options.dgain, scale=options.scale, rfgain=options.rfgain, ant=options.ant)
	tb.run()

