#!/usr/bin/env python
##################################################
# Gnuradio Python Flow Graph
# Title: capture_dual_chan_B210
# Author: Martin Dudok van Heel
# Description: timed dual channel usrp B210 capturing 
# Generated: Sat Feb 21 20:01:47 2015
##################################################

from gnuradio import blocks
from gnuradio import eng_notation
from gnuradio import gr
from gnuradio import uhd
from gnuradio.eng_option import eng_option
from gnuradio.filter import firdes
from optparse import OptionParser
import numpy
import os
import time

class capture_dual_chan_B210(gr.top_block):

    def __init__(self, rx_device_address="", rx_base_filename="capture", rx_subdev_spec0="A:A", rx_subdev_spec1="A:B", rx_bw=0, rx_device_arguments="", rx_rate=1.0e6, rx_gain=60.0, rx_freq=1.0e9, verbose=False, time=10.0, delay=1.0):
        gr.top_block.__init__(self, "capture_dual_chan_B210")

        ##################################################
        # Parameters
        ##################################################
        self.rx_device_address = rx_device_address
        self.rx_base_filename = rx_base_filename
        self.rx_subdev_spec0 = rx_subdev_spec0
        self.rx_subdev_spec1 = rx_subdev_spec1
        self.rx_bw = rx_bw
        self.rx_device_arguments = rx_device_arguments
        self.rx_rate = rx_rate
        self.rx_gain = rx_gain
        self.rx_freq = rx_freq
        self.verbose = verbose
        self.time = time
        self.delay = delay

        ##################################################
        # Variables
        ##################################################
        self.num_samples = num_samples = int(float(time * rx_rate))

        ##################################################
        # Blocks
        ##################################################
        self.uhd_usrp_source = uhd.usrp_source(
        	",".join((rx_device_address, rx_device_arguments)),
        	uhd.stream_args(
        		cpu_format="fc32",
        		channels=range(2),
        	),
        )
        self.uhd_usrp_source.set_subdev_spec(rx_subdev_spec0 + " " + rx_subdev_spec1, 0)
        self.uhd_usrp_source.set_samp_rate(rx_rate)
        self.uhd_usrp_source.set_center_freq(rx_freq, 0)
        self.uhd_usrp_source.set_gain(rx_gain, 0)
        self.uhd_usrp_source.set_antenna("RX2", 0)
        self.uhd_usrp_source.set_center_freq(rx_freq, 1)
        self.uhd_usrp_source.set_gain(rx_gain, 1)
        self.uhd_usrp_source.set_antenna("RX2", 1)
        self.rx_head1 = blocks.head(gr.sizeof_gr_complex*1, num_samples)
        self.rx_head0 = blocks.head(gr.sizeof_gr_complex*1, num_samples)
        self.file_sink1 = blocks.file_sink(gr.sizeof_gr_complex*1, rx_base_filename + "1_cfloat.raw", False)
        self.file_sink1.set_unbuffered(False)
        self.file_sink0 = blocks.file_sink(gr.sizeof_gr_complex*1, rx_base_filename + "0_cfloat.raw", False)
        self.file_sink0.set_unbuffered(False)

        ##################################################
        # Connections
        ##################################################
        self.connect((self.rx_head0, 0), (self.file_sink0, 0))    
        self.connect((self.rx_head1, 0), (self.file_sink1, 0))    
        self.connect((self.uhd_usrp_source, 0), (self.rx_head0, 0))    
        self.connect((self.uhd_usrp_source, 1), (self.rx_head1, 0))    


    def get_rx_device_address(self):
        return self.rx_device_address

    def set_rx_device_address(self, rx_device_address):
        self.rx_device_address = rx_device_address

    def get_rx_base_filename(self):
        return self.rx_base_filename

    def set_rx_base_filename(self, rx_base_filename):
        self.rx_base_filename = rx_base_filename
        self.file_sink1.open(self.rx_base_filename + "1_cfloat.raw")
        self.file_sink0.open(self.rx_base_filename + "0_cfloat.raw")

    def get_rx_subdev_spec0(self):
        return self.rx_subdev_spec0

    def set_rx_subdev_spec0(self, rx_subdev_spec0):
        self.rx_subdev_spec0 = rx_subdev_spec0

    def get_rx_subdev_spec1(self):
        return self.rx_subdev_spec1

    def set_rx_subdev_spec1(self, rx_subdev_spec1):
        self.rx_subdev_spec1 = rx_subdev_spec1

    def get_rx_bw(self):
        return self.rx_bw

    def set_rx_bw(self, rx_bw):
        self.rx_bw = rx_bw
        self.uhd_usrp_source.set_bandwidth(self.rx_bw, 0)

    def get_rx_device_arguments(self):
        return self.rx_device_arguments

    def set_rx_device_arguments(self, rx_device_arguments):
        self.rx_device_arguments = rx_device_arguments

    def get_rx_rate(self):
        return self.rx_rate

    def set_rx_rate(self, rx_rate):
        self.rx_rate = rx_rate
        self.set_num_samples(int(float(self.time * self.rx_rate)))
        self.uhd_usrp_source.set_samp_rate(self.rx_rate)

    def get_rx_gain(self):
        return self.rx_gain

    def set_rx_gain(self, rx_gain):
        self.rx_gain = rx_gain
        self.uhd_usrp_source.set_gain(self.rx_gain, 0)
        self.uhd_usrp_source.set_gain(self.rx_gain, 1)

    def get_rx_freq(self):
        return self.rx_freq

    def set_rx_freq(self, rx_freq):
        self.rx_freq = rx_freq
        self.uhd_usrp_source.set_center_freq(self.rx_freq, 0)
        self.uhd_usrp_source.set_center_freq(self.rx_freq, 1)

    def get_verbose(self):
        return self.verbose

    def set_verbose(self, verbose):
        self.verbose = verbose

    def get_time(self):
        return self.time

    def set_time(self, time):
        self.time = time
        self.set_num_samples(int(float(self.time * self.rx_rate)))

    def get_delay(self):
        return self.delay

    def set_delay(self, delay):
        self.delay = delay

    def get_num_samples(self):
        return self.num_samples

    def set_num_samples(self, num_samples):
        self.num_samples = num_samples
        self.rx_head1.set_length(self.num_samples)
        self.rx_head0.set_length(self.num_samples)

if __name__ == '__main__':
    parser = OptionParser(option_class=eng_option, usage="%prog: [options]")
    parser.add_option("-a", "--rx-device-address", dest="rx_device_address", type="string", default="",
        help="Set rx_device_address [default=%default]")
    parser.add_option("-n", "--rx-base-filename", dest="rx_base_filename", type="string", default="capture",
        help="Set rx_base_filename [default=%default]")
    parser.add_option("-s", "--rx-subdev-spec0", dest="rx_subdev_spec0", type="string", default="A:A",
        help="Set rx_subdev_spec0 [default=%default]")
    parser.add_option("-S", "--rx-subdev-spec1", dest="rx_subdev_spec1", type="string", default="A:B",
        help="Set rx_subdev_spec1 [default=%default]")
    parser.add_option("-b", "--rx-bw", dest="rx_bw", type="eng_float", default=eng_notation.num_to_str(0),
        help="Set rx_bw [default=%default]")
    parser.add_option("-d", "--rx-device-arguments", dest="rx_device_arguments", type="string", default="",
        help="Set rx_device_arguments [default=%default]")
    parser.add_option("-r", "--rx-rate", dest="rx_rate", type="eng_float", default=eng_notation.num_to_str(1.0e6),
        help="Set rx_rate [default=%default]")
    parser.add_option("-g", "--rx-gain", dest="rx_gain", type="eng_float", default=eng_notation.num_to_str(60.0),
        help="Set rx_gain [default=%default]")
    parser.add_option("-f", "--rx-freq", dest="rx_freq", type="eng_float", default=eng_notation.num_to_str(1.0e9),
        help="Set rx_freq [default=%default]")
    parser.add_option("-v", "--verbose", dest="verbose", type="intx", default=False,
        help="Set verbose [default=%default]")
    parser.add_option("-t", "--time", dest="time", type="eng_float", default=eng_notation.num_to_str(10.0),
        help="Set capture time in seconds [default=%default]")
    parser.add_option("-w", "--delay", dest="delay", type="eng_float", default=eng_notation.num_to_str(1.0),
        help="Set streamstart delay in seconds [default=%default]")
    (options, args) = parser.parse_args()
    tb = capture_dual_chan_B210(rx_device_address=options.rx_device_address, rx_base_filename=options.rx_base_filename, rx_subdev_spec0=options.rx_subdev_spec0, rx_subdev_spec1=options.rx_subdev_spec1, rx_bw=options.rx_bw, rx_device_arguments=options.rx_device_arguments, rx_rate=options.rx_rate, rx_gain=options.rx_gain, rx_freq=options.rx_freq, verbose=options.verbose, time=options.time, delay=options.delay)
    tb.start()
    tb.wait()
