#!/usr/bin/env python2 # -*- coding: utf-8 -*- ################################################## # GNU Radio Python Flow Graph # Title: Top Block # Generated: Tue Jun 26 13:45:40 2018 ################################################## if __name__ == '__main__': import ctypes import sys if sys.platform.startswith('linux'): try: x11 = ctypes.cdll.LoadLibrary('libX11.so') x11.XInitThreads() except: print "Warning: failed to XInitThreads()" from PyQt4 import Qt from PyQt4.QtCore import QObject, pyqtSlot from gnuradio import analog from gnuradio import audio from gnuradio import blocks from gnuradio import eng_notation from gnuradio import filter from gnuradio import gr from gnuradio import qtgui from gnuradio.eng_option import eng_option from gnuradio.filter import firdes from gnuradio.qtgui import Range, RangeWidget from optparse import OptionParser import hpsdr import sip import sys from gnuradio import qtgui class top_block(gr.top_block, Qt.QWidget): def __init__(self): gr.top_block.__init__(self, "Top Block") Qt.QWidget.__init__(self) self.setWindowTitle("Top Block") qtgui.util.check_set_qss() try: self.setWindowIcon(Qt.QIcon.fromTheme('gnuradio-grc')) except: pass 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("GNU Radio", "top_block") self.restoreGeometry(self.settings.value("geometry").toByteArray()) ################################################## # Variables ################################################## self.squelch = squelch = -150 self.samp_rate = samp_rate = 48000 self.drive = drive = 0 self.TxF = TxF = 7000000 self.Sideband = Sideband = -1 self.RxPre = RxPre = 0 self.RxF0 = RxF0 = 7000000 self.PTT = PTT = 0 self.FreqFine = FreqFine = 00000 ################################################## # Blocks ################################################## self._squelch_range = Range(-200, 0, 5, -150, 500) self._squelch_win = RangeWidget(self._squelch_range, self.set_squelch, "squelch", "counter_slider", float) self.top_grid_layout.addWidget(self._squelch_win, 1, 5, 1, 1) for r in range(1, 2): self.top_grid_layout.setRowStretch(r, 1) for c in range(5, 6): self.top_grid_layout.setColumnStretch(c, 1) self._samp_rate_options = (48000, 96000, 192000, 384000, ) self._samp_rate_labels = ('48 ks/s', '96 ks/s', '192 ks/s', '384 ks/s', ) self._samp_rate_group_box = Qt.QGroupBox('Rx Sample Rate') self._samp_rate_box = Qt.QVBoxLayout() class variable_chooser_button_group(Qt.QButtonGroup): def __init__(self, parent=None): Qt.QButtonGroup.__init__(self, parent) @pyqtSlot(int) def updateButtonChecked(self, button_id): self.button(button_id).setChecked(True) self._samp_rate_button_group = variable_chooser_button_group() self._samp_rate_group_box.setLayout(self._samp_rate_box) for i, label in enumerate(self._samp_rate_labels): radio_button = Qt.QRadioButton(label) self._samp_rate_box.addWidget(radio_button) self._samp_rate_button_group.addButton(radio_button, i) self._samp_rate_callback = lambda i: Qt.QMetaObject.invokeMethod(self._samp_rate_button_group, "updateButtonChecked", Qt.Q_ARG("int", self._samp_rate_options.index(i))) self._samp_rate_callback(self.samp_rate) self._samp_rate_button_group.buttonClicked[int].connect( lambda i: self.set_samp_rate(self._samp_rate_options[i])) self.top_grid_layout.addWidget(self._samp_rate_group_box, 1, 3, 1, 1) for r in range(1, 2): self.top_grid_layout.setRowStretch(r, 1) for c in range(3, 4): self.top_grid_layout.setColumnStretch(c, 1) self._drive_tool_bar = Qt.QToolBar(self) self._drive_tool_bar.addWidget(Qt.QLabel("drive"+": ")) self._drive_line_edit = Qt.QLineEdit(str(self.drive)) self._drive_tool_bar.addWidget(self._drive_line_edit) self._drive_line_edit.returnPressed.connect( lambda: self.set_drive(eval(str(self._drive_line_edit.text().toAscii())))) self.top_grid_layout.addWidget(self._drive_tool_bar, 1, 4, 1, 1) for r in range(1, 2): self.top_grid_layout.setRowStretch(r, 1) for c in range(4, 5): self.top_grid_layout.setColumnStretch(c, 1) self._TxF_range = Range(1000000, 54000000, 500000, 7000000, 500) self._TxF_win = RangeWidget(self._TxF_range, self.set_TxF, "TxF", "counter_slider", float) self.top_grid_layout.addWidget(self._TxF_win, 2, 1, 1, 2) for r in range(2, 3): self.top_grid_layout.setRowStretch(r, 1) for c in range(1, 3): self.top_grid_layout.setColumnStretch(c, 1) self._Sideband_options = (-1, 1, ) self._Sideband_labels = ('Lower', 'Upper', ) self._Sideband_group_box = Qt.QGroupBox("Sideband") self._Sideband_box = Qt.QVBoxLayout() class variable_chooser_button_group(Qt.QButtonGroup): def __init__(self, parent=None): Qt.QButtonGroup.__init__(self, parent) @pyqtSlot(int) def updateButtonChecked(self, button_id): self.button(button_id).setChecked(True) self._Sideband_button_group = variable_chooser_button_group() self._Sideband_group_box.setLayout(self._Sideband_box) for i, label in enumerate(self._Sideband_labels): radio_button = Qt.QRadioButton(label) self._Sideband_box.addWidget(radio_button) self._Sideband_button_group.addButton(radio_button, i) self._Sideband_callback = lambda i: Qt.QMetaObject.invokeMethod(self._Sideband_button_group, "updateButtonChecked", Qt.Q_ARG("int", self._Sideband_options.index(i))) self._Sideband_callback(self.Sideband) self._Sideband_button_group.buttonClicked[int].connect( lambda i: self.set_Sideband(self._Sideband_options[i])) self.top_grid_layout.addWidget(self._Sideband_group_box, 1, 2, 1, 1) for r in range(1, 2): self.top_grid_layout.setRowStretch(r, 1) for c in range(2, 3): self.top_grid_layout.setColumnStretch(c, 1) self._RxPre_options = (0, 1, ) self._RxPre_labels = ('Off', 'On', ) self._RxPre_tool_bar = Qt.QToolBar(self) self._RxPre_tool_bar.addWidget(Qt.QLabel("RxPre"+": ")) self._RxPre_combo_box = Qt.QComboBox() self._RxPre_tool_bar.addWidget(self._RxPre_combo_box) for label in self._RxPre_labels: self._RxPre_combo_box.addItem(label) self._RxPre_callback = lambda i: Qt.QMetaObject.invokeMethod(self._RxPre_combo_box, "setCurrentIndex", Qt.Q_ARG("int", self._RxPre_options.index(i))) self._RxPre_callback(self.RxPre) self._RxPre_combo_box.currentIndexChanged.connect( lambda i: self.set_RxPre(self._RxPre_options[i])) self.top_grid_layout.addWidget(self._RxPre_tool_bar, 2, 5, 1, 1) for r in range(2, 3): self.top_grid_layout.setRowStretch(r, 1) for c in range(5, 6): self.top_grid_layout.setColumnStretch(c, 1) self._RxF0_range = Range(0, 54000000, 500000, 7000000, 500) self._RxF0_win = RangeWidget(self._RxF0_range, self.set_RxF0, "RxF0", "counter_slider", float) self.top_grid_layout.addWidget(self._RxF0_win, 2, 3, 1, 2) for r in range(2, 3): self.top_grid_layout.setRowStretch(r, 1) for c in range(3, 5): self.top_grid_layout.setColumnStretch(c, 1) self._PTT_options = (0, 1, 2, ) self._PTT_labels = ('Off', 'Vox', 'On', ) self._PTT_group_box = Qt.QGroupBox("PTT") self._PTT_box = Qt.QVBoxLayout() class variable_chooser_button_group(Qt.QButtonGroup): def __init__(self, parent=None): Qt.QButtonGroup.__init__(self, parent) @pyqtSlot(int) def updateButtonChecked(self, button_id): self.button(button_id).setChecked(True) self._PTT_button_group = variable_chooser_button_group() self._PTT_group_box.setLayout(self._PTT_box) for i, label in enumerate(self._PTT_labels): radio_button = Qt.QRadioButton(label) self._PTT_box.addWidget(radio_button) self._PTT_button_group.addButton(radio_button, i) self._PTT_callback = lambda i: Qt.QMetaObject.invokeMethod(self._PTT_button_group, "updateButtonChecked", Qt.Q_ARG("int", self._PTT_options.index(i))) self._PTT_callback(self.PTT) self._PTT_button_group.buttonClicked[int].connect( lambda i: self.set_PTT(self._PTT_options[i])) self.top_grid_layout.addWidget(self._PTT_group_box, 1, 1, 1, 1) for r in range(1, 2): self.top_grid_layout.setRowStretch(r, 1) for c in range(1, 2): self.top_grid_layout.setColumnStretch(c, 1) self._FreqFine_range = Range(000000, 500000, 500, 00000, 500) self._FreqFine_win = RangeWidget(self._FreqFine_range, self.set_FreqFine, "FreqFine", "counter_slider", float) self.top_grid_layout.addWidget(self._FreqFine_win, 3, 1, 1, 5) for r in range(3, 4): self.top_grid_layout.setRowStretch(r, 1) for c in range(1, 6): self.top_grid_layout.setColumnStretch(c, 1) self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c( 1024, #size firdes.WIN_BLACKMAN_hARRIS, #wintype RxF0+FreqFine+(Sideband*1500), #fc samp_rate, #bw "", #name 2 #number of inputs ) self.qtgui_freq_sink_x_0.set_update_time(0.10) self.qtgui_freq_sink_x_0.set_y_axis(-140, 10) self.qtgui_freq_sink_x_0.set_y_label('Relative Gain', 'dB') self.qtgui_freq_sink_x_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "") self.qtgui_freq_sink_x_0.enable_autoscale(True) self.qtgui_freq_sink_x_0.enable_grid(False) self.qtgui_freq_sink_x_0.set_fft_average(1.0) self.qtgui_freq_sink_x_0.enable_axis_labels(True) self.qtgui_freq_sink_x_0.enable_control_panel(True) if not True: self.qtgui_freq_sink_x_0.disable_legend() if "complex" == "float" or "complex" == "msg_float": self.qtgui_freq_sink_x_0.set_plot_pos_half(not True) labels = ['', '', '', '', '', '', '', '', '', ''] widths = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] colors = ["blue", "red", "green", "black", "cyan", "magenta", "yellow", "dark red", "dark green", "dark blue"] alphas = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0] for i in xrange(2): if len(labels[i]) == 0: self.qtgui_freq_sink_x_0.set_line_label(i, "Data {0}".format(i)) else: self.qtgui_freq_sink_x_0.set_line_label(i, labels[i]) self.qtgui_freq_sink_x_0.set_line_width(i, widths[i]) self.qtgui_freq_sink_x_0.set_line_color(i, colors[i]) self.qtgui_freq_sink_x_0.set_line_alpha(i, alphas[i]) self._qtgui_freq_sink_x_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0.pyqwidget(), Qt.QWidget) self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win, 4, 1, 5, 5) for r in range(4, 9): self.top_grid_layout.setRowStretch(r, 1) for c in range(1, 6): self.top_grid_layout.setColumnStretch(c, 1) self.low_pass_filter_0 = filter.fir_filter_ccf(1, firdes.low_pass( 100, samp_rate, 1500, 200, firdes.WIN_BLACKMAN, 6.76)) self.hpsdr_hermesNB_0 = hpsdr.hermesNB(RxF0+Sideband*1500+FreqFine, 200000, 7200000, 7200000, 7200000, 7200000, 7200000, 7200000, TxF+FreqFine, RxPre, PTT, 1, 1, drive, samp_rate, "eth0", "0xF8", 0, 0, 0x00, 0x00, 0, 1, "*") self.blocks_multiply_xx_0 = blocks.multiply_vcc(1) self.blocks_keep_one_in_n_0 = blocks.keep_one_in_n(gr.sizeof_gr_complex*1, samp_rate/48000) self.blocks_complex_to_float_0 = blocks.complex_to_float(1) self.audio_sink_0 = audio.sink(48000, '', False) self.analog_sig_source_x_1 = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, Sideband*1000, 0.95, 0) self.analog_sig_source_x_0 = analog.sig_source_c(48000, analog.GR_COS_WAVE, Sideband*1500, 1, 0) self.analog_pwr_squelch_xx_0 = analog.pwr_squelch_cc(squelch, .00001, 1, False) self.analog_agc3_xx_0 = analog.agc3_cc(1, 1e-5, 0.5, 1.0, 1) self.analog_agc3_xx_0.set_max_gain(65536) ################################################## # Connections ################################################## self.connect((self.analog_agc3_xx_0, 0), (self.blocks_complex_to_float_0, 0)) self.connect((self.analog_pwr_squelch_xx_0, 0), (self.analog_agc3_xx_0, 0)) self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 1)) self.connect((self.analog_sig_source_x_1, 0), (self.hpsdr_hermesNB_0, 0)) self.connect((self.blocks_complex_to_float_0, 0), (self.audio_sink_0, 0)) self.connect((self.blocks_keep_one_in_n_0, 0), (self.blocks_multiply_xx_0, 0)) self.connect((self.blocks_multiply_xx_0, 0), (self.analog_pwr_squelch_xx_0, 0)) self.connect((self.hpsdr_hermesNB_0, 0), (self.low_pass_filter_0, 0)) self.connect((self.hpsdr_hermesNB_0, 0), (self.qtgui_freq_sink_x_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.blocks_keep_one_in_n_0, 0)) self.connect((self.low_pass_filter_0, 0), (self.qtgui_freq_sink_x_0, 1)) def closeEvent(self, event): self.settings = Qt.QSettings("GNU Radio", "top_block") self.settings.setValue("geometry", self.saveGeometry()) event.accept() def get_squelch(self): return self.squelch def set_squelch(self, squelch): self.squelch = squelch self.analog_pwr_squelch_xx_0.set_threshold(self.squelch) def get_samp_rate(self): return self.samp_rate def set_samp_rate(self, samp_rate): self.samp_rate = samp_rate self._samp_rate_callback(self.samp_rate) self.qtgui_freq_sink_x_0.set_frequency_range(self.RxF0+self.FreqFine+(self.Sideband*1500), self.samp_rate) self.low_pass_filter_0.set_taps(firdes.low_pass(100, self.samp_rate, 1500, 200, firdes.WIN_BLACKMAN, 6.76)) self.hpsdr_hermesNB_0.set_RxSampRate(self.samp_rate) self.blocks_keep_one_in_n_0.set_n(self.samp_rate/48000) self.analog_sig_source_x_1.set_sampling_freq(self.samp_rate) def get_drive(self): return self.drive def set_drive(self, drive): self.drive = drive Qt.QMetaObject.invokeMethod(self._drive_line_edit, "setText", Qt.Q_ARG("QString", repr(self.drive))) self.hpsdr_hermesNB_0.set_TxDrive(self.drive) def get_TxF(self): return self.TxF def set_TxF(self, TxF): self.TxF = TxF self.hpsdr_hermesNB_0.set_TransmitFrequency(self.TxF+self.FreqFine) def get_Sideband(self): return self.Sideband def set_Sideband(self, Sideband): self.Sideband = Sideband self._Sideband_callback(self.Sideband) self.qtgui_freq_sink_x_0.set_frequency_range(self.RxF0+self.FreqFine+(self.Sideband*1500), self.samp_rate) self.hpsdr_hermesNB_0.set_Receive0Frequency(self.RxF0+self.Sideband*1500+self.FreqFine) self.analog_sig_source_x_1.set_frequency(self.Sideband*1000) self.analog_sig_source_x_0.set_frequency(self.Sideband*1500) def get_RxPre(self): return self.RxPre def set_RxPre(self, RxPre): self.RxPre = RxPre self._RxPre_callback(self.RxPre) self.hpsdr_hermesNB_0.set_RxPreamp(self.RxPre) def get_RxF0(self): return self.RxF0 def set_RxF0(self, RxF0): self.RxF0 = RxF0 self.qtgui_freq_sink_x_0.set_frequency_range(self.RxF0+self.FreqFine+(self.Sideband*1500), self.samp_rate) self.hpsdr_hermesNB_0.set_Receive0Frequency(self.RxF0+self.Sideband*1500+self.FreqFine) def get_PTT(self): return self.PTT def set_PTT(self, PTT): self.PTT = PTT self._PTT_callback(self.PTT) self.hpsdr_hermesNB_0.set_PTTMode(self.PTT) def get_FreqFine(self): return self.FreqFine def set_FreqFine(self, FreqFine): self.FreqFine = FreqFine self.qtgui_freq_sink_x_0.set_frequency_range(self.RxF0+self.FreqFine+(self.Sideband*1500), self.samp_rate) self.hpsdr_hermesNB_0.set_Receive0Frequency(self.RxF0+self.Sideband*1500+self.FreqFine) self.hpsdr_hermesNB_0.set_TransmitFrequency(self.TxF+self.FreqFine) def main(top_block_cls=top_block, options=None): from distutils.version import StrictVersion if StrictVersion(Qt.qVersion()) >= StrictVersion("4.5.0"): style = gr.prefs().get_string('qtgui', 'style', 'raster') Qt.QApplication.setGraphicsSystem(style) qapp = Qt.QApplication(sys.argv) tb = top_block_cls() tb.start() tb.show() def quitting(): tb.stop() tb.wait() qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting) qapp.exec_() if __name__ == '__main__': main()