#!/usr/bin/python3
# -*- coding: utf-8 -*-

# Remember, pyqt5 only works under Python3

import numpy as np
from rtlsdr import *
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout
from PyQt5.QtGui import QIcon
import pyqtgraph as pg
import threading
import time

# Parameters
ffts_to_avg = 300
fft_size = 512

# Initialize RTL-SDR
sdr = RtlSdr()

# configure RTL-SDR
sdr.sample_rate = 1.0e6
sdr.center_freq = 100e6
sdr.gain = 40

# house keeping
sample_period = 1.0/sdr.sample_rate
samples_per_loop = fft_size*ffts_to_avg*2
time_per_loop = samples_per_loop * sample_period

class Example(QWidget):
    def __init__(self):
        super().__init__()
        
        grid = QGridLayout()
        self.setLayout(grid)
        
        self.time_plot = pg.PlotWidget()
        self.time_plot_curve1 = self.time_plot.plot([]) 
        grid.addWidget(self.time_plot, 0, 0)

        self.setGeometry(300, 300, 300, 220)
        self.setWindowTitle('RTL-SDR Demo')
    
        self.show() # not blocking
       
        
def rx_thread(rtl, ex):
    while True:
        fft_running_avg = np.zeros(fft_size)
        rtl.read_samples(fft_size*ffts_to_avg)
        samples = rtl.read_samples(fft_size*ffts_to_avg) # causes 50% duty cycle in terms of processing
        t0 = time.time()
        for i in range(ffts_to_avg):
            fft = np.abs(np.fft.fft(samples[i*fft_size:(i+1)*fft_size]))
            fft_running_avg += fft
        results = 10.0*np.log10(np.fft.fftshift(fft_running_avg/ffts_to_avg))
        ex.time_plot_curve1.setData(results)
        print((time.time() - t0)/time_per_loop)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    rx_loop = threading.Thread(target=rx_thread, args=(sdr, ex))
    rx_loop.start()
    sys.exit(app.exec_())
    
    #rx_loop.join()
    sdr.close()