#!/usr/bin/env python
#
# auto_rx debug utils - Plot an rtl_power output file.
#
# Usage: python plot_rtl_power.py log_power.csv
# Requires Numpy & Matplotlib
#
import matplotlib.pyplot as plt
import numpy as np
from StringIO import StringIO
import sys

# Need to keep this in sync with auto_rx.py as we're not set up to do relative imports yet.
def read_rtl_power(filename):
    """ Read in frequency samples from a single-shot log file produced by rtl_power """

    # Output buffers.
    freq = np.array([])
    power = np.array([])

    freq_step = 0


    # Open file.
    f = open(filename,'r')

    # rtl_power log files are csv's, with the first 6 fields in each line describing the time and frequency scan parameters
    # for the remaining fields, which contain the power samples. 

    for line in f:
        # Split line into fields.
        fields = line.split(',')

        if len(fields) < 6:
            logging.error("Invalid number of samples in input file - corrupt?")
            raise Exception("Invalid number of samples in input file - corrupt?")

        start_date = fields[0]
        start_time = fields[1]
        start_freq = float(fields[2])
        stop_freq = float(fields[3])
        freq_step = float(fields[4])
        n_samples = int(fields[5])

        #freq_range = np.arange(start_freq,stop_freq,freq_step)
        samples = np.loadtxt(StringIO(",".join(fields[6:])),delimiter=',')
        freq_range = np.linspace(start_freq,stop_freq,len(samples))

        # Add frequency range and samples to output buffers.
        freq = np.append(freq, freq_range)
        power = np.append(power, samples)

    f.close()

    # Sanitize power values, to remove the nan's that rtl_power puts in there occasionally.
    power = np.nan_to_num(power)

    return (freq, power, freq_step)


if __name__ == '__main__':
	filename = sys.argv[1]

	(freq, power, freq_step) = read_rtl_power(filename)

	plt.plot(freq/1e6, power)
	plt.xlabel("Frequency (MHz)")
	plt.ylabel("Power (dB?)")
	plt.title("rtl_power output: %s" % filename)
	plt.show()

