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

#
# SPDX-License-Identifier: GPL-3.0
#
# GNU Radio Python Flow Graph
# Title: sit2086
# Author: Jan PE0SAT
# Description: Decode SIT-2086
# GNU Radio version: 3.10.12.0

from PyQt5 import Qt
from gnuradio import qtgui
from PyQt5 import QtCore
from gnuradio import analog
from gnuradio import blocks
from gnuradio import blocks, gr
from gnuradio import gr
from gnuradio.filter import firdes
from gnuradio.fft import window
import sys
import signal
from PyQt5 import Qt
from argparse import ArgumentParser
from gnuradio.eng_arg import eng_float, intx
from gnuradio import eng_notation
import cmath
import numpy as np
import satellites.components.datasinks
import satellites.core
import sip
import threading



class sit2086(gr.top_block, Qt.QWidget):

    def __init__(self):
        gr.top_block.__init__(self, "sit2086", catch_exceptions=True)
        Qt.QWidget.__init__(self)
        self.setWindowTitle("sit2086")
        qtgui.util.check_set_qss()
        try:
            self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc'))
        except BaseException as exc:
            print(f"Qt GUI: Could not set Icon: {str(exc)}", file=sys.stderr)
        self.top_scroll_layout = Qt.QVBoxLayout()
        self.setLayout(self.top_scroll_layout)
        self.top_scroll = Qt.QScrollArea()
        self.top_scroll.setFrameStyle(Qt.QFrame.NoFrame)
        self.top_scroll_layout.addWidget(self.top_scroll)
        self.top_scroll.setWidgetResizable(True)
        self.top_widget = Qt.QWidget()
        self.top_scroll.setWidget(self.top_widget)
        self.top_layout = Qt.QVBoxLayout(self.top_widget)
        self.top_grid_layout = Qt.QGridLayout()
        self.top_layout.addLayout(self.top_grid_layout)

        self.settings = Qt.QSettings("gnuradio/flowgraphs", "sit2086")

        try:
            geometry = self.settings.value("geometry")
            if geometry:
                self.restoreGeometry(geometry)
        except BaseException as exc:
            print(f"Qt GUI: Could not restore geometry: {str(exc)}", file=sys.stderr)
        self.flowgraph_started = threading.Event()

        ##################################################
        # Variables
        ##################################################
        self.fsk_rate = fsk_rate = 2400
        self.vfo_range = vfo_range = 850
        self.sps = sps = 4
        self.samp_rate = samp_rate = 48000
        self.freq = freq = 401.030e6
        self.cut_off = cut_off = (fsk_rate/2.0) * 1.12

        ##################################################
        # Blocks
        ##################################################

        self._vfo_range_range = qtgui.Range(-samp_rate/2, samp_rate/2, 100, 850, 200)
        self._vfo_range_win = qtgui.RangeWidget(self._vfo_range_range, self.set_vfo_range, "VFO", "counter_slider", float, QtCore.Qt.Horizontal)
        self.top_layout.addWidget(self._vfo_range_win)
        self.satellites_telemetry_parser_0 = satellites.components.datasinks.telemetry_parser('ax25', options="")
        self.satellites_satellite_decoder_0 = satellites.core.gr_satellites_flowgraph(file = 'SIT-2086.yml', samp_rate = samp_rate, grc_block = True, iq = True, options = "")
        self.qtgui_sink_x_0 = qtgui.sink_c(
            2048, #fftsize
            window.WIN_BLACKMAN_hARRIS, #wintype
            (freq+vfo_range), #fc
            (sps*fsk_rate), #bw
            "", #name
            True, #plotfreq
            True, #plotwaterfall
            True, #plottime
            True, #plotconst
            None # parent
        )
        self.qtgui_sink_x_0.set_update_time(1.0/10)
        self._qtgui_sink_x_0_win = sip.wrapinstance(self.qtgui_sink_x_0.qwidget(), Qt.QWidget)

        self.qtgui_sink_x_0.enable_rf_freq(True)

        self.top_layout.addWidget(self._qtgui_sink_x_0_win)
        self.blocks_wavfile_source_0_0 = blocks.wavfile_source('iq_14759908_401030000_48000.wav', False)
        self.blocks_throttle2_0_0 = blocks.throttle( gr.sizeof_gr_complex*1, (samp_rate*2), True, 0 if "auto" == "auto" else max( int(float(0.1) * (samp_rate*2)) if "auto" == "time" else int(0.1), 1) )
        self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
        self.blocks_message_debug_0 = blocks.message_debug(True, gr.log_levels.info)
        self.blocks_float_to_complex_0 = blocks.float_to_complex(1)
        self.analog_sig_source_x_0 = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, (-vfo_range), 1, 0, 0)


        ##################################################
        # Connections
        ##################################################
        self.msg_connect((self.satellites_satellite_decoder_0, 'out'), (self.blocks_message_debug_0, 'print'))
        self.msg_connect((self.satellites_satellite_decoder_0, 'out'), (self.satellites_telemetry_parser_0, 'in'))
        self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 0))
        self.connect((self.blocks_float_to_complex_0, 0), (self.blocks_multiply_xx_0, 1))
        self.connect((self.blocks_multiply_xx_0, 0), (self.blocks_throttle2_0_0, 0))
        self.connect((self.blocks_throttle2_0_0, 0), (self.qtgui_sink_x_0, 0))
        self.connect((self.blocks_throttle2_0_0, 0), (self.satellites_satellite_decoder_0, 0))
        self.connect((self.blocks_wavfile_source_0_0, 0), (self.blocks_float_to_complex_0, 0))
        self.connect((self.blocks_wavfile_source_0_0, 1), (self.blocks_float_to_complex_0, 1))


    def closeEvent(self, event):
        self.settings = Qt.QSettings("gnuradio/flowgraphs", "sit2086")
        self.settings.setValue("geometry", self.saveGeometry())
        self.stop()
        self.wait()

        event.accept()

    def get_fsk_rate(self):
        return self.fsk_rate

    def set_fsk_rate(self, fsk_rate):
        self.fsk_rate = fsk_rate
        self.set_cut_off((self.fsk_rate/2.0) * 1.12)
        self.qtgui_sink_x_0.set_frequency_range((self.freq+self.vfo_range), (self.sps*self.fsk_rate))

    def get_vfo_range(self):
        return self.vfo_range

    def set_vfo_range(self, vfo_range):
        self.vfo_range = vfo_range
        self.analog_sig_source_x_0.set_frequency((-self.vfo_range))
        self.qtgui_sink_x_0.set_frequency_range((self.freq+self.vfo_range), (self.sps*self.fsk_rate))

    def get_sps(self):
        return self.sps

    def set_sps(self, sps):
        self.sps = sps
        self.qtgui_sink_x_0.set_frequency_range((self.freq+self.vfo_range), (self.sps*self.fsk_rate))

    def get_samp_rate(self):
        return self.samp_rate

    def set_samp_rate(self, samp_rate):
        self.samp_rate = samp_rate
        self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate)
        self.blocks_throttle2_0_0.set_sample_rate((self.samp_rate*2))

    def get_freq(self):
        return self.freq

    def set_freq(self, freq):
        self.freq = freq
        self.qtgui_sink_x_0.set_frequency_range((self.freq+self.vfo_range), (self.sps*self.fsk_rate))

    def get_cut_off(self):
        return self.cut_off

    def set_cut_off(self, cut_off):
        self.cut_off = cut_off




def main(top_block_cls=sit2086, options=None):

    qapp = Qt.QApplication(sys.argv)

    tb = top_block_cls()

    tb.start()
    tb.flowgraph_started.set()

    tb.show()

    def sig_handler(sig=None, frame=None):
        tb.stop()
        tb.wait()

        Qt.QApplication.quit()

    signal.signal(signal.SIGINT, sig_handler)
    signal.signal(signal.SIGTERM, sig_handler)

    timer = Qt.QTimer()
    timer.start(500)
    timer.timeout.connect(lambda: None)

    qapp.exec_()

if __name__ == '__main__':
    main()
