316 lines
14 KiB
Python
316 lines
14 KiB
Python
|
#!/usr/bin/env python2
|
||
|
# -*- coding: utf-8 -*-
|
||
|
##################################################
|
||
|
# GNU Radio Python Flow Graph
|
||
|
# Title: Downlink from TVAC (This should run all the time)
|
||
|
# Author: Sebastian Rückerl
|
||
|
# Generated: Wed Feb 26 01:20:37 2020
|
||
|
##################################################
|
||
|
|
||
|
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 gnuradio import analog
|
||
|
from gnuradio import blocks
|
||
|
from gnuradio import digital
|
||
|
from gnuradio import digital;import cmath
|
||
|
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 ccsds
|
||
|
import math
|
||
|
import osmosdr
|
||
|
import sip
|
||
|
import sys
|
||
|
import time
|
||
|
from gnuradio import qtgui
|
||
|
|
||
|
|
||
|
class downlink(gr.top_block, Qt.QWidget):
|
||
|
|
||
|
def __init__(self):
|
||
|
gr.top_block.__init__(self, "Downlink from TVAC (This should run all the time)")
|
||
|
Qt.QWidget.__init__(self)
|
||
|
self.setWindowTitle("Downlink from TVAC (This should run all the time)")
|
||
|
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", "downlink")
|
||
|
self.restoreGeometry(self.settings.value("geometry").toByteArray())
|
||
|
|
||
|
|
||
|
##################################################
|
||
|
# Variables
|
||
|
##################################################
|
||
|
self.block_len_enc = block_len_enc = 1024/8*2
|
||
|
|
||
|
self.variable_constellation_0 = variable_constellation_0 = digital.constellation_calcdist(([-1, 1]), ([0, 1]), 4, 1).base()
|
||
|
|
||
|
self.samp_rate_factor = samp_rate_factor = 5
|
||
|
self.samp_rate = samp_rate = 250000
|
||
|
self.rgain = rgain = 0
|
||
|
self.payload = payload = block_len_enc+4
|
||
|
self.freq_offset_flag = freq_offset_flag = 0
|
||
|
self.freq_offset = freq_offset = 0
|
||
|
|
||
|
##################################################
|
||
|
# Blocks
|
||
|
##################################################
|
||
|
self._rgain_range = Range(0, 11, 1, 0, 200)
|
||
|
self._rgain_win = RangeWidget(self._rgain_range, self.set_rgain, 'RX Gain', "counter_slider", float)
|
||
|
self.top_grid_layout.addWidget(self._rgain_win)
|
||
|
self._freq_offset_range = Range(-400e3, 400e3, 1.5e3, 0, 200)
|
||
|
self._freq_offset_win = RangeWidget(self._freq_offset_range, self.set_freq_offset, 'Frequency Offset', "counter_slider", float)
|
||
|
self.top_grid_layout.addWidget(self._freq_offset_win)
|
||
|
self.rational_resampler_xxx_1 = filter.rational_resampler_ccc(
|
||
|
interpolation=1,
|
||
|
decimation=5,
|
||
|
taps=None,
|
||
|
fractional_bw=None,
|
||
|
)
|
||
|
self.qtgui_sink_x_1 = qtgui.sink_c(
|
||
|
1024, #fftsize
|
||
|
firdes.WIN_BLACKMAN_hARRIS, #wintype
|
||
|
0, #fc
|
||
|
samp_rate, #bw
|
||
|
"", #name
|
||
|
False, #plotfreq
|
||
|
False, #plotwaterfall
|
||
|
False, #plottime
|
||
|
True, #plotconst
|
||
|
)
|
||
|
self.qtgui_sink_x_1.set_update_time(1.0/10)
|
||
|
self._qtgui_sink_x_1_win = sip.wrapinstance(self.qtgui_sink_x_1.pyqwidget(), Qt.QWidget)
|
||
|
self.top_grid_layout.addWidget(self._qtgui_sink_x_1_win)
|
||
|
|
||
|
self.qtgui_sink_x_1.enable_rf_freq(False)
|
||
|
|
||
|
|
||
|
|
||
|
self.qtgui_sink_x_0_0_1 = qtgui.sink_c(
|
||
|
1024, #fftsize
|
||
|
firdes.WIN_BLACKMAN_hARRIS, #wintype
|
||
|
0, #fc
|
||
|
samp_rate, #bw
|
||
|
"Vor Sync", #name
|
||
|
True, #plotfreq
|
||
|
True, #plotwaterfall
|
||
|
True, #plottime
|
||
|
True, #plotconst
|
||
|
)
|
||
|
self.qtgui_sink_x_0_0_1.set_update_time(1.0/10)
|
||
|
self._qtgui_sink_x_0_0_1_win = sip.wrapinstance(self.qtgui_sink_x_0_0_1.pyqwidget(), Qt.QWidget)
|
||
|
self.top_grid_layout.addWidget(self._qtgui_sink_x_0_0_1_win)
|
||
|
|
||
|
self.qtgui_sink_x_0_0_1.enable_rf_freq(False)
|
||
|
|
||
|
|
||
|
|
||
|
self.qtgui_sink_x_0_0 = qtgui.sink_c(
|
||
|
1024, #fftsize
|
||
|
firdes.WIN_BLACKMAN_hARRIS, #wintype
|
||
|
0, #fc
|
||
|
samp_rate*samp_rate_factor, #bw
|
||
|
"Vor Sync", #name
|
||
|
True, #plotfreq
|
||
|
True, #plotwaterfall
|
||
|
True, #plottime
|
||
|
True, #plotconst
|
||
|
)
|
||
|
self.qtgui_sink_x_0_0.set_update_time(1.0/10)
|
||
|
self._qtgui_sink_x_0_0_win = sip.wrapinstance(self.qtgui_sink_x_0_0.pyqwidget(), Qt.QWidget)
|
||
|
self.top_grid_layout.addWidget(self._qtgui_sink_x_0_0_win)
|
||
|
|
||
|
self.qtgui_sink_x_0_0.enable_rf_freq(False)
|
||
|
|
||
|
|
||
|
|
||
|
self.osmosdr_source_0 = osmosdr.source( args="numchan=" + str(1) + " " + 'rtl=0' )
|
||
|
self.osmosdr_source_0.set_sample_rate(samp_rate*samp_rate_factor)
|
||
|
self.osmosdr_source_0.set_center_freq(145.79e6, 0)
|
||
|
self.osmosdr_source_0.set_freq_corr(0, 0)
|
||
|
self.osmosdr_source_0.set_dc_offset_mode(0, 0)
|
||
|
self.osmosdr_source_0.set_iq_balance_mode(0, 0)
|
||
|
self.osmosdr_source_0.set_gain_mode(False, 0)
|
||
|
self.osmosdr_source_0.set_gain(rgain, 0)
|
||
|
self.osmosdr_source_0.set_if_gain(0, 0)
|
||
|
self.osmosdr_source_0.set_bb_gain(0, 0)
|
||
|
self.osmosdr_source_0.set_antenna('', 0)
|
||
|
self.osmosdr_source_0.set_bandwidth(0, 0)
|
||
|
|
||
|
self._freq_offset_flag_range = Range(0, 1, 1, 0, 200)
|
||
|
self._freq_offset_flag_win = RangeWidget(self._freq_offset_flag_range, self.set_freq_offset_flag, 'Enable flatsat freq', "counter_slider", float)
|
||
|
self.top_grid_layout.addWidget(self._freq_offset_flag_win)
|
||
|
self.fir_filter_xxx_0 = filter.fir_filter_ccc(samp_rate_factor, (1, ))
|
||
|
self.fir_filter_xxx_0.declare_sample_delay(0)
|
||
|
self.digital_mpsk_receiver_cc_0_0 = digital.mpsk_receiver_cc(2, 0, cmath.pi/100.0, -0.05, 0.05, 0.25, 0.05, 4, 4, 0.005)
|
||
|
self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(variable_constellation_0)
|
||
|
self.ccsds_softbits_msg_to_bytes_b_0 = ccsds.softbits_msg_to_bytes_b()
|
||
|
self.ccsds_randomiser_softbits_0 = ccsds.randomiser_softbits(0x95,0xFF)
|
||
|
self.ccsds_mpsk_ambiguity_resolver_f_0 = ccsds.mpsk_ambiguity_resolver_f(2,'49E0DCC7',32,1,0.8,block_len_enc,0)
|
||
|
self.ccsds_message_info_0 = ccsds.message_info("Block received and sent to Nanolink: ", 10)
|
||
|
self.ccsds_ldpc_decoder_0 = ccsds.ldpc_decoder('/app/gnuradio/AR4JA_r12_k1024n.a', ccsds.LDPC_SYS_FRONT, ccsds.LDPC_PUNCT_BACK, 512, tuple(([])), False)
|
||
|
self.ccsds_blob_msg_sink_b_0 = ccsds.blob_msg_sink_b(256/2)
|
||
|
self.blocks_udp_sink_0_1 = blocks.udp_sink(gr.sizeof_char*1, '127.0.0.1', 5431, 256, True)
|
||
|
self.blocks_udp_sink_0_0 = blocks.udp_sink(gr.sizeof_char*1, '127.0.0.1', 5433, 1472, True)
|
||
|
self.blocks_udp_sink_0 = blocks.udp_sink(gr.sizeof_gr_complex*1, '127.0.0.1', 5435, 1472, True)
|
||
|
self.blocks_null_sink_1 = blocks.null_sink(gr.sizeof_char*1)
|
||
|
self.blocks_multiply_xx_0_0 = blocks.multiply_vcc(1)
|
||
|
self.blocks_multiply_xx_0 = blocks.multiply_vcc(1)
|
||
|
self.blocks_char_to_float_0 = blocks.char_to_float(1, 0.5)
|
||
|
self.blocks_add_const_vxx_0 = blocks.add_const_vff((-1, ))
|
||
|
self.band_pass_filter_0 = filter.fir_filter_ccc(1, firdes.complex_band_pass(
|
||
|
1, samp_rate*samp_rate_factor, 40e3, 60e3, 6e3, firdes.WIN_HAMMING, 6.76))
|
||
|
self.analog_sig_source_x_0_0 = analog.sig_source_c(samp_rate*samp_rate_factor, analog.GR_COS_WAVE, -freq_offset, 1, 0)
|
||
|
self.analog_sig_source_x_0 = analog.sig_source_c(samp_rate, analog.GR_COS_WAVE, -50000, 1, 0)
|
||
|
self.analog_agc_xx_0 = analog.agc_cc(1e-4, 0.5, 1.0)
|
||
|
self.analog_agc_xx_0.set_max_gain(65536)
|
||
|
|
||
|
|
||
|
|
||
|
##################################################
|
||
|
# Connections
|
||
|
##################################################
|
||
|
self.msg_connect((self.ccsds_blob_msg_sink_b_0, 'out'), (self.ccsds_message_info_0, 'in'))
|
||
|
self.msg_connect((self.ccsds_ldpc_decoder_0, 'out'), (self.ccsds_softbits_msg_to_bytes_b_0, 'in'))
|
||
|
self.msg_connect((self.ccsds_mpsk_ambiguity_resolver_f_0, 'out'), (self.ccsds_randomiser_softbits_0, 'in'))
|
||
|
self.msg_connect((self.ccsds_randomiser_softbits_0, 'out'), (self.ccsds_ldpc_decoder_0, 'in'))
|
||
|
self.connect((self.analog_agc_xx_0, 0), (self.rational_resampler_xxx_1, 0))
|
||
|
self.connect((self.analog_sig_source_x_0, 0), (self.blocks_multiply_xx_0, 0))
|
||
|
self.connect((self.analog_sig_source_x_0_0, 0), (self.blocks_multiply_xx_0_0, 0))
|
||
|
self.connect((self.band_pass_filter_0, 0), (self.fir_filter_xxx_0, 0))
|
||
|
self.connect((self.blocks_add_const_vxx_0, 0), (self.ccsds_mpsk_ambiguity_resolver_f_0, 0))
|
||
|
self.connect((self.blocks_char_to_float_0, 0), (self.blocks_add_const_vxx_0, 0))
|
||
|
self.connect((self.blocks_multiply_xx_0, 0), (self.analog_agc_xx_0, 0))
|
||
|
self.connect((self.blocks_multiply_xx_0, 0), (self.qtgui_sink_x_0_0_1, 0))
|
||
|
self.connect((self.blocks_multiply_xx_0_0, 0), (self.band_pass_filter_0, 0))
|
||
|
self.connect((self.ccsds_softbits_msg_to_bytes_b_0, 0), (self.blocks_null_sink_1, 0))
|
||
|
self.connect((self.ccsds_softbits_msg_to_bytes_b_0, 0), (self.blocks_udp_sink_0_1, 0))
|
||
|
self.connect((self.ccsds_softbits_msg_to_bytes_b_0, 0), (self.ccsds_blob_msg_sink_b_0, 0))
|
||
|
self.connect((self.digital_constellation_decoder_cb_0, 0), (self.blocks_char_to_float_0, 0))
|
||
|
self.connect((self.digital_constellation_decoder_cb_0, 0), (self.blocks_udp_sink_0_0, 0))
|
||
|
self.connect((self.digital_mpsk_receiver_cc_0_0, 0), (self.digital_constellation_decoder_cb_0, 0))
|
||
|
self.connect((self.digital_mpsk_receiver_cc_0_0, 0), (self.qtgui_sink_x_1, 0))
|
||
|
self.connect((self.fir_filter_xxx_0, 0), (self.blocks_multiply_xx_0, 1))
|
||
|
self.connect((self.osmosdr_source_0, 0), (self.blocks_multiply_xx_0_0, 1))
|
||
|
self.connect((self.osmosdr_source_0, 0), (self.blocks_udp_sink_0, 0))
|
||
|
self.connect((self.osmosdr_source_0, 0), (self.qtgui_sink_x_0_0, 0))
|
||
|
self.connect((self.rational_resampler_xxx_1, 0), (self.digital_mpsk_receiver_cc_0_0, 0))
|
||
|
|
||
|
def closeEvent(self, event):
|
||
|
self.settings = Qt.QSettings("GNU Radio", "downlink")
|
||
|
self.settings.setValue("geometry", self.saveGeometry())
|
||
|
event.accept()
|
||
|
|
||
|
def get_block_len_enc(self):
|
||
|
return self.block_len_enc
|
||
|
|
||
|
def set_block_len_enc(self, block_len_enc):
|
||
|
self.block_len_enc = block_len_enc
|
||
|
self.set_payload(self.block_len_enc+4)
|
||
|
|
||
|
def get_variable_constellation_0(self):
|
||
|
return self.variable_constellation_0
|
||
|
|
||
|
def set_variable_constellation_0(self, variable_constellation_0):
|
||
|
self.variable_constellation_0 = variable_constellation_0
|
||
|
|
||
|
def get_samp_rate_factor(self):
|
||
|
return self.samp_rate_factor
|
||
|
|
||
|
def set_samp_rate_factor(self, samp_rate_factor):
|
||
|
self.samp_rate_factor = samp_rate_factor
|
||
|
self.qtgui_sink_x_0_0.set_frequency_range(0, self.samp_rate*self.samp_rate_factor)
|
||
|
self.osmosdr_source_0.set_sample_rate(self.samp_rate*self.samp_rate_factor)
|
||
|
self.band_pass_filter_0.set_taps(firdes.complex_band_pass(1, self.samp_rate*self.samp_rate_factor, 40e3, 60e3, 6e3, firdes.WIN_HAMMING, 6.76))
|
||
|
self.analog_sig_source_x_0_0.set_sampling_freq(self.samp_rate*self.samp_rate_factor)
|
||
|
|
||
|
def get_samp_rate(self):
|
||
|
return self.samp_rate
|
||
|
|
||
|
def set_samp_rate(self, samp_rate):
|
||
|
self.samp_rate = samp_rate
|
||
|
self.qtgui_sink_x_1.set_frequency_range(0, self.samp_rate)
|
||
|
self.qtgui_sink_x_0_0_1.set_frequency_range(0, self.samp_rate)
|
||
|
self.qtgui_sink_x_0_0.set_frequency_range(0, self.samp_rate*self.samp_rate_factor)
|
||
|
self.osmosdr_source_0.set_sample_rate(self.samp_rate*self.samp_rate_factor)
|
||
|
self.band_pass_filter_0.set_taps(firdes.complex_band_pass(1, self.samp_rate*self.samp_rate_factor, 40e3, 60e3, 6e3, firdes.WIN_HAMMING, 6.76))
|
||
|
self.analog_sig_source_x_0_0.set_sampling_freq(self.samp_rate*self.samp_rate_factor)
|
||
|
self.analog_sig_source_x_0.set_sampling_freq(self.samp_rate)
|
||
|
|
||
|
def get_rgain(self):
|
||
|
return self.rgain
|
||
|
|
||
|
def set_rgain(self, rgain):
|
||
|
self.rgain = rgain
|
||
|
self.osmosdr_source_0.set_gain(self.rgain, 0)
|
||
|
|
||
|
def get_payload(self):
|
||
|
return self.payload
|
||
|
|
||
|
def set_payload(self, payload):
|
||
|
self.payload = payload
|
||
|
|
||
|
def get_freq_offset_flag(self):
|
||
|
return self.freq_offset_flag
|
||
|
|
||
|
def set_freq_offset_flag(self, freq_offset_flag):
|
||
|
self.freq_offset_flag = freq_offset_flag
|
||
|
|
||
|
def get_freq_offset(self):
|
||
|
return self.freq_offset
|
||
|
|
||
|
def set_freq_offset(self, freq_offset):
|
||
|
self.freq_offset = freq_offset
|
||
|
self.analog_sig_source_x_0_0.set_frequency(-self.freq_offset)
|
||
|
|
||
|
|
||
|
def main(top_block_cls=downlink, 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(2080)
|
||
|
tb.show()
|
||
|
|
||
|
def quitting():
|
||
|
tb.stop()
|
||
|
tb.wait()
|
||
|
qapp.connect(qapp, Qt.SIGNAL("aboutToQuit()"), quitting)
|
||
|
qapp.exec_()
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|