laforge submitted this change.
add the gnuradio 3.10 demodulator and receiver from telive
Change-Id: I81f20fa115822b3ad642b638f6414d8249a8ac6a
---
A src/demod/simdemod3.grc
A src/demod/simdemod3.py
A src/demod/telive_1ch_simple_gr310_udp.grc
A src/demod/telive_1ch_simple_gr310_udp.py
A src/receiver1udp
5 files changed, 2,115 insertions(+), 0 deletions(-)
diff --git a/src/demod/simdemod3.grc b/src/demod/simdemod3.grc
new file mode 100644
index 0000000..18bcce2
--- /dev/null
+++ b/src/demod/simdemod3.grc
@@ -0,0 +1,498 @@
+options:
+ parameters:
+ author: Jacek Lipkowski SQ5BPF
+ catch_exceptions: 'True'
+ category: '[GRC Hier Blocks]'
+ cmake_opt: ''
+ comment: ''
+ copyright: ''
+ description: cqpsk demodulator for tetra. based on pi4dqpsk_rx.grc (by 'Luca
+ Bortolotti' @optiluca) from https://gitlab.com/larryth/tetra-kit/ . It is meant
+ as a replacement for simdemod2.py, taked the data from stdin, and dumpd demodulated
+ data to STDOUT. Also sends via UDP the information how much the signal is mistuned
+ (this option is disabled for the version committed to osmo-tetra)
+ gen_cmake: 'On'
+ gen_linking: dynamic
+ generate_options: no_gui
+ hier_block_src_path: '.:'
+ id: simdemod3
+ max_nouts: '0'
+ output_language: python
+ placement: (0,0)
+ qt_qss_theme: ''
+ realtime_scheduling: ''
+ run: 'True'
+ run_command: '{python} -u {filename}'
+ run_options: run
+ sizing_mode: fixed
+ thread_safe_setters: ''
+ title: DQPSK demodulator for Telive, with the AFC packet sending option disabled
+ window_size: (1000,1000)
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [8, 8]
+ rotation: 0
+ state: enabled
+
+blocks:
+- name: TETRA_HACK_IP
+ id: variable
+ parameters:
+ comment: ''
+ value: os.getenv('TETRA_HACK_IP') if os.getenv('TETRA_HACK_IP') else "127.0.0.1"
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [304, 92.0]
+ rotation: 0
+ state: disabled
+- name: TETRA_HACK_PORT
+ id: variable
+ parameters:
+ comment: ''
+ value: int(os.getenv('TETRA_HACK_PORT')) if os.getenv('TETRA_HACK_PORT') else
+ 7379
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [416, 92.0]
+ rotation: 0
+ state: disabled
+- name: TETRA_HACK_RXID
+ id: variable
+ parameters:
+ comment: ''
+ value: int(os.getenv('TETRA_HACK_RXID')) if os.getenv('TETRA_HACK_RXID') else
+ 0
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [176, 92.0]
+ rotation: 0
+ state: disabled
+- name: arity
+ id: variable
+ parameters:
+ comment: ''
+ value: '4'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [560, 12]
+ rotation: 0
+ state: enabled
+- name: channel_rate
+ id: variable
+ parameters:
+ comment: ''
+ value: '36000'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [288, 12]
+ rotation: 0
+ state: enabled
+- name: constel
+ id: variable_constellation
+ parameters:
+ comment: ''
+ const_points: '[1-1j, 1+1j, -1-1j, 1-1j]'
+ dims: '1'
+ normalization: digital.constellation.AMPLITUDE_NORMALIZATION
+ precision: '8'
+ rot_sym: '4'
+ soft_dec_lut: '''auto'''
+ sym_map: '[0, 1, 3, 2]'
+ type: dqpsk
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [768, 452.0]
+ rotation: 0
+ state: enabled
+- name: decim
+ id: variable
+ parameters:
+ comment: ''
+ value: '32'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [808, 12]
+ rotation: 0
+ state: enabled
+- name: nfilts
+ id: variable
+ parameters:
+ comment: ''
+ value: '32'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [400, 12]
+ rotation: 0
+ state: enabled
+- name: rrc_taps
+ id: variable
+ parameters:
+ comment: ''
+ value: firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 11*sps*nfilts)
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [640, 12]
+ rotation: 0
+ state: enabled
+- name: samp_rate
+ id: variable
+ parameters:
+ comment: ''
+ value: '2000000'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [184, 12]
+ rotation: 0
+ state: enabled
+- name: sps
+ id: variable
+ parameters:
+ comment: ''
+ value: '2'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [480, 12]
+ rotation: 0
+ state: enabled
+- name: variable_adaptive_algorithm_0
+ id: variable_adaptive_algorithm
+ parameters:
+ comment: ''
+ cons: constel
+ delta: '10.0'
+ ffactor: '0.99'
+ modulus: '1'
+ step_size: 10e-3
+ type: cma
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [904, 444.0]
+ rotation: 0
+ state: true
+- name: Author_note
+ id: note
+ parameters:
+ alias: ''
+ comment: ''
+ note: 'This is originally part of the telive software: https://github.com/sq5bpf/telive '
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [8, 156.0]
+ rotation: 0
+ state: true
+- name: analog_feedforward_agc_cc_0
+ id: analog_feedforward_agc_cc
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ num_samples: '8'
+ reference: '1'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [312, 220.0]
+ rotation: 0
+ state: enabled
+- name: blocks_file_descriptor_source_0
+ id: blocks_file_descriptor_source
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ fd: '0'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ repeat: 'False'
+ type: complex
+ vlen: '1'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [112, 220.0]
+ rotation: 0
+ state: true
+- name: blocks_null_sink_0
+ id: blocks_null_sink
+ parameters:
+ affinity: ''
+ alias: ''
+ bus_structure_sink: '[[0,],]'
+ comment: ''
+ num_inputs: '3'
+ type: float
+ vlen: '1'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [800, 224.0]
+ rotation: 0
+ state: true
+- name: blocks_unpack_k_bits_bb_0
+ id: blocks_unpack_k_bits_bb
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ k: constel.bits_per_symbol()
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [752, 564.0]
+ rotation: 0
+ state: enabled
+- name: digital_constellation_decoder_cb_0
+ id: digital_constellation_decoder_cb
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ constellation: constel
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [576, 452.0]
+ rotation: 0
+ state: enabled
+- name: digital_diff_phasor_cc_0
+ id: digital_diff_phasor_cc
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [624, 356.0]
+ rotation: 0
+ state: enabled
+- name: digital_fll_band_edge_cc_0
+ id: digital_fll_band_edge_cc
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ filter_size: '45'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ rolloff: '0.35'
+ samps_per_sym: sps
+ type: cc
+ w: cmath.pi/100.0
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [544, 192.0]
+ rotation: 0
+ state: enabled
+- name: digital_linear_equalizer_0
+ id: digital_linear_equalizer
+ parameters:
+ adapt_after_training: 'True'
+ affinity: ''
+ alg: variable_adaptive_algorithm_0
+ alias: ''
+ comment: ''
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ num_taps: '15'
+ sps: sps
+ training_sequence: '[ ]'
+ training_start_tag: corr_est
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [368, 360.0]
+ rotation: 0
+ state: true
+- name: digital_map_bb_0
+ id: digital_map_bb
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ map: constel.pre_diff_code()
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [576, 564.0]
+ rotation: 0
+ state: enabled
+- name: digital_pfb_clock_sync_xxx_0
+ id: digital_pfb_clock_sync_xxx
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ filter_size: nfilts
+ init_phase: nfilts/2
+ loop_bw: 2*cmath.pi/100.0
+ max_dev: '1.5'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ osps: sps
+ sps: sps
+ taps: rrc_taps
+ type: ccf
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [128, 344.0]
+ rotation: 0
+ state: enabled
+- name: import_0
+ id: import
+ parameters:
+ alias: ''
+ comment: ''
+ imports: import cmath
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [944, 12.0]
+ rotation: 0
+ state: enabled
+- name: import_1
+ id: import
+ parameters:
+ alias: ''
+ comment: ''
+ imports: import os
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1040, 12.0]
+ rotation: 0
+ state: true
+- name: send_udp_to_telive
+ id: epy_block
+ parameters:
+ _source_code: "\"\"\"\nEmbedded Python Blocks:\n\nEach time this file is saved,\
+ \ GRC will instantiate the first class it finds\nto get ports and parameters\
+ \ of your block. The arguments to __init__ will\nbe the parameters. All of\
+ \ them are required to have default values!\n\"\"\"\n\nimport numpy as np\n\
+ from gnuradio import gr\nimport socket\n\nclass blk(gr.sync_block): # other\
+ \ base classes are basic_block, decim_block, interp_block\n \"\"\"Embedded\
+ \ Python Block - periodically send UDP packet to telive\"\"\"\n\n def __init__(self,\
+ \ ntimes=10, rxid=0, port=7379, ip=\"127.0.0.1\",scaling=10): # only default\
+ \ arguments here\n \"\"\"arguments to this function show up as parameters\
+ \ in GRC\"\"\"\n gr.sync_block.__init__(\n self,\n \
+ \ name='Send UDP messages to telive', # will show up in GRC\n \
+ \ in_sig=[np.float32],\n out_sig=None\n )\n # if\
+ \ an attribute with the same name as a parameter is found,\n # a callback\
+ \ is registered (properties work, too).\n self.sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)\n\
+ \ self.counter=0\n self.ntimes=ntimes\n self.tetra_hack_rxid=int(rxid)\n\
+ \ self.tetra_hack_ip=str(ip)\n self.tetra_hack_port=int(port)\n\
+ \ self.tetra_hack_scaling=scaling\n \n \n\n def work(self,\
+ \ input_items, output_items):\n \"\"\"example: multiply with constant\"\
+ \"\"\n self.counter=(self.counter+1)%self.ntimes\n if self.counter==0:\n\
+ \ mmm=\"TETMON_begin FUNC:AFCVAL AFC:%i RX:%i TETMON_end\" % ( int\
+ \ (input_items[0][0] * self.tetra_hack_scaling * - 1.0), self.tetra_hack_rxid)\n\
+ \ message=bytes(mmm, \"utf-8\")\n self.sock.sendto(message,\
+ \ (self.tetra_hack_ip, self.tetra_hack_port))\n return len(input_items\
+ \ [0])\n"
+ affinity: ''
+ alias: ''
+ comment: ''
+ ip: TETRA_HACK_IP
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ ntimes: '5'
+ port: TETRA_HACK_PORT
+ rxid: TETRA_HACK_RXID
+ scaling: '100'
+ states:
+ _io_cache: ('Send UDP messages to telive', 'blk', [('ntimes', '10'), ('rxid',
+ '0'), ('port', '7379'), ('ip', "'127.0.0.1'"), ('scaling', '10')], [('0', 'float',
+ 1)], [], 'Embedded Python Block - periodically send UDP packet to telive', ['ntimes'])
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [960, 140.0]
+ rotation: 0
+ state: disabled
+- name: stdout_sink
+ id: blocks_file_descriptor_sink
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ fd: '1'
+ type: byte
+ vlen: '1'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [960, 564.0]
+ rotation: 0
+ state: true
+
+connections:
+- [analog_feedforward_agc_cc_0, '0', digital_fll_band_edge_cc_0, '0']
+- [blocks_file_descriptor_source_0, '0', analog_feedforward_agc_cc_0, '0']
+- [blocks_unpack_k_bits_bb_0, '0', stdout_sink, '0']
+- [digital_constellation_decoder_cb_0, '0', digital_map_bb_0, '0']
+- [digital_diff_phasor_cc_0, '0', digital_constellation_decoder_cb_0, '0']
+- [digital_fll_band_edge_cc_0, '0', digital_pfb_clock_sync_xxx_0, '0']
+- [digital_fll_band_edge_cc_0, '1', blocks_null_sink_0, '0']
+- [digital_fll_band_edge_cc_0, '1', send_udp_to_telive, '0']
+- [digital_fll_band_edge_cc_0, '2', blocks_null_sink_0, '1']
+- [digital_fll_band_edge_cc_0, '3', blocks_null_sink_0, '2']
+- [digital_linear_equalizer_0, '0', digital_diff_phasor_cc_0, '0']
+- [digital_map_bb_0, '0', blocks_unpack_k_bits_bb_0, '0']
+- [digital_pfb_clock_sync_xxx_0, '0', digital_linear_equalizer_0, '0']
+
+metadata:
+ file_format: 1
+ grc_version: 3.10.5.1
diff --git a/src/demod/simdemod3.py b/src/demod/simdemod3.py
new file mode 100755
index 0000000..13f5997
--- /dev/null
+++ b/src/demod/simdemod3.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+#
+# SPDX-License-Identifier: GPL-3.0
+#
+# GNU Radio Python Flow Graph
+# Title: DQPSK demodulator for Telive, with the AFC packet sending option disabled
+# Author: Jacek Lipkowski SQ5BPF
+# Description: cqpsk demodulator for tetra. based on pi4dqpsk_rx.grc (by 'Luca Bortolotti' @optiluca) from https://gitlab.com/larryth/tetra-kit/ . It is meant as a replacement for simdemod2.py, taked the data from stdin, and dumpd demodulated data to STDOUT. Also sends via UDP the information how much the signal is mistuned (this option is disabled for the version committed to osmo-tetra)
+# GNU Radio version: 3.10.5.1
+
+from gnuradio import analog
+from gnuradio import blocks
+from gnuradio import digital
+from gnuradio import gr
+from gnuradio.filter import firdes
+from gnuradio.fft import window
+import sys
+import signal
+from argparse import ArgumentParser
+from gnuradio.eng_arg import eng_float, intx
+from gnuradio import eng_notation
+import cmath
+import os
+
+
+
+
+class simdemod3(gr.top_block):
+
+ def __init__(self):
+ gr.top_block.__init__(self, "DQPSK demodulator for Telive, with the AFC packet sending option disabled", catch_exceptions=True)
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.sps = sps = 2
+ self.nfilts = nfilts = 32
+ self.constel = constel = digital.constellation_dqpsk().base()
+ self.constel.gen_soft_dec_lut(8)
+ self.variable_adaptive_algorithm_0 = variable_adaptive_algorithm_0 = digital.adaptive_algorithm_cma( constel, 10e-3, 1).base()
+ self.samp_rate = samp_rate = 2000000
+ self.rrc_taps = rrc_taps = firdes.root_raised_cosine(nfilts, nfilts, 1.0/float(sps), 0.35, 11*sps*nfilts)
+ self.decim = decim = 32
+ self.channel_rate = channel_rate = 36000
+ self.arity = arity = 4
+
+ ##################################################
+ # Blocks
+ ##################################################
+
+ self.stdout_sink = blocks.file_descriptor_sink(gr.sizeof_char*1, 1)
+ self.digital_pfb_clock_sync_xxx_0 = digital.pfb_clock_sync_ccf(sps, (2*cmath.pi/100.0), rrc_taps, nfilts, (nfilts/2), 1.5, sps)
+ self.digital_map_bb_0 = digital.map_bb(constel.pre_diff_code())
+ self.digital_linear_equalizer_0 = digital.linear_equalizer(15, sps, variable_adaptive_algorithm_0, True, [ ], 'corr_est')
+ self.digital_fll_band_edge_cc_0 = digital.fll_band_edge_cc(sps, 0.35, 45, (cmath.pi/100.0))
+ self.digital_diff_phasor_cc_0 = digital.diff_phasor_cc()
+ self.digital_constellation_decoder_cb_0 = digital.constellation_decoder_cb(constel)
+ self.blocks_unpack_k_bits_bb_0 = blocks.unpack_k_bits_bb(constel.bits_per_symbol())
+ self.blocks_null_sink_0 = blocks.null_sink(gr.sizeof_float*1)
+ self.blocks_file_descriptor_source_0 = blocks.file_descriptor_source(gr.sizeof_gr_complex*1, 0, False)
+ self.analog_feedforward_agc_cc_0 = analog.feedforward_agc_cc(8, 1)
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.connect((self.analog_feedforward_agc_cc_0, 0), (self.digital_fll_band_edge_cc_0, 0))
+ self.connect((self.blocks_file_descriptor_source_0, 0), (self.analog_feedforward_agc_cc_0, 0))
+ self.connect((self.blocks_unpack_k_bits_bb_0, 0), (self.stdout_sink, 0))
+ self.connect((self.digital_constellation_decoder_cb_0, 0), (self.digital_map_bb_0, 0))
+ self.connect((self.digital_diff_phasor_cc_0, 0), (self.digital_constellation_decoder_cb_0, 0))
+ self.connect((self.digital_fll_band_edge_cc_0, 2), (self.blocks_null_sink_0, 1))
+ self.connect((self.digital_fll_band_edge_cc_0, 3), (self.blocks_null_sink_0, 2))
+ self.connect((self.digital_fll_band_edge_cc_0, 1), (self.blocks_null_sink_0, 0))
+ self.connect((self.digital_fll_band_edge_cc_0, 0), (self.digital_pfb_clock_sync_xxx_0, 0))
+ self.connect((self.digital_linear_equalizer_0, 0), (self.digital_diff_phasor_cc_0, 0))
+ self.connect((self.digital_map_bb_0, 0), (self.blocks_unpack_k_bits_bb_0, 0))
+ self.connect((self.digital_pfb_clock_sync_xxx_0, 0), (self.digital_linear_equalizer_0, 0))
+
+
+ def get_sps(self):
+ return self.sps
+
+ def set_sps(self, sps):
+ self.sps = sps
+ self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), 0.35, 11*self.sps*self.nfilts))
+
+ def get_nfilts(self):
+ return self.nfilts
+
+ def set_nfilts(self, nfilts):
+ self.nfilts = nfilts
+ self.set_rrc_taps(firdes.root_raised_cosine(self.nfilts, self.nfilts, 1.0/float(self.sps), 0.35, 11*self.sps*self.nfilts))
+
+ def get_constel(self):
+ return self.constel
+
+ def set_constel(self, constel):
+ self.constel = constel
+
+ def get_variable_adaptive_algorithm_0(self):
+ return self.variable_adaptive_algorithm_0
+
+ def set_variable_adaptive_algorithm_0(self, variable_adaptive_algorithm_0):
+ self.variable_adaptive_algorithm_0 = variable_adaptive_algorithm_0
+
+ def get_samp_rate(self):
+ return self.samp_rate
+
+ def set_samp_rate(self, samp_rate):
+ self.samp_rate = samp_rate
+
+ def get_rrc_taps(self):
+ return self.rrc_taps
+
+ def set_rrc_taps(self, rrc_taps):
+ self.rrc_taps = rrc_taps
+ self.digital_pfb_clock_sync_xxx_0.update_taps(self.rrc_taps)
+
+ def get_decim(self):
+ return self.decim
+
+ def set_decim(self, decim):
+ self.decim = decim
+
+ def get_channel_rate(self):
+ return self.channel_rate
+
+ def set_channel_rate(self, channel_rate):
+ self.channel_rate = channel_rate
+
+ def get_arity(self):
+ return self.arity
+
+ def set_arity(self, arity):
+ self.arity = arity
+
+
+
+
+def main(top_block_cls=simdemod3, options=None):
+ tb = top_block_cls()
+
+ def sig_handler(sig=None, frame=None):
+ tb.stop()
+ tb.wait()
+
+ sys.exit(0)
+
+ signal.signal(signal.SIGINT, sig_handler)
+ signal.signal(signal.SIGTERM, sig_handler)
+
+ tb.start()
+
+ tb.wait()
+
+
+if __name__ == '__main__':
+ main()
diff --git a/src/demod/telive_1ch_simple_gr310_udp.grc b/src/demod/telive_1ch_simple_gr310_udp.grc
new file mode 100644
index 0000000..00a1130
--- /dev/null
+++ b/src/demod/telive_1ch_simple_gr310_udp.grc
@@ -0,0 +1,936 @@
+options:
+ parameters:
+ author: Jacek Lipkowski SQ5BPF
+ catch_exceptions: 'True'
+ category: Custom
+ cmake_opt: ''
+ comment: ''
+ copyright: ''
+ description: This is a receiver flowgraph, uses a rtl-sdr dongle, and outputs
+ a downsampled stream to 127.0.0.1 42001/udp. This can be used with telive, or
+ just osmo-tetra
+ gen_cmake: 'On'
+ gen_linking: dynamic
+ generate_options: qt_gui
+ hier_block_src_path: '.:'
+ id: telive_1ch_simple_gr310_udp
+ max_nouts: '0'
+ output_language: python
+ placement: (0,0)
+ qt_qss_theme: ''
+ realtime_scheduling: ''
+ run: 'True'
+ run_command: '{python} -u {filename}'
+ run_options: prompt
+ sizing_mode: fixed
+ thread_safe_setters: ''
+ title: SQ5BPF Tetra live receiver 1ch simple UDP demo with fixed offset (gnuradio
+ 3.10 version) xmlrpc
+ window_size: 2048, 2048
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [10, 10]
+ rotation: 0
+ state: enabled
+
+blocks:
+- name: first_decim
+ id: variable
+ parameters:
+ comment: ''
+ value: '32'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [547, 15]
+ rotation: 0
+ state: enabled
+- name: first_port
+ id: variable
+ parameters:
+ comment: ''
+ value: '42000'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1080, 85]
+ rotation: 0
+ state: enabled
+- name: freq
+ id: variable_qtgui_entry
+ parameters:
+ comment: ''
+ gui_hint: 0,0,1,2
+ label: Frequency
+ type: real
+ value: 438.0125e6
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [40, 404.0]
+ rotation: 0
+ state: true
+- name: if_samp_rate
+ id: variable
+ parameters:
+ comment: ''
+ value: samp_rate/first_decim
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [315, 18]
+ rotation: 0
+ state: enabled
+- name: options_low_pass
+ id: variable
+ parameters:
+ comment: ''
+ value: '12500'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [654, 18]
+ rotation: 0
+ state: enabled
+- name: out_sample_rate
+ id: variable
+ parameters:
+ comment: ''
+ value: '36000'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [419, 18]
+ rotation: 0
+ state: enabled
+- name: ppm_corr
+ id: variable_qtgui_range
+ parameters:
+ comment: ''
+ gui_hint: 0,5,1,3
+ label: ppm
+ min_len: '200'
+ orient: QtCore.Qt.Horizontal
+ rangeType: float
+ start: '-100'
+ step: '0.5'
+ stop: '100'
+ value: '0'
+ widget: counter_slider
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [360, 420.0]
+ rotation: 0
+ state: true
+- name: samp_rate
+ id: variable
+ parameters:
+ comment: ''
+ value: '2000000'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [223, 19]
+ rotation: 0
+ state: enabled
+- name: sdr_gain
+ id: variable_qtgui_range
+ parameters:
+ comment: ''
+ gui_hint: 0,8,1,2
+ label: gain
+ min_len: '200'
+ orient: QtCore.Qt.Horizontal
+ rangeType: int
+ start: '0'
+ step: '1'
+ stop: '50'
+ value: '30'
+ widget: counter_slider
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [448, 420.0]
+ rotation: 0
+ state: true
+- name: sdr_ifgain
+ id: variable
+ parameters:
+ comment: ''
+ value: '20'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [56, 628.0]
+ rotation: 0
+ state: enabled
+- name: telive_receiver_channels
+ id: variable
+ parameters:
+ comment: ''
+ value: '1'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1160, 396.0]
+ rotation: 0
+ state: enabled
+- name: telive_receiver_name
+ id: variable
+ parameters:
+ comment: ''
+ value: '''SQ5BPF 1-channel rx for telive'''
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1192, 332.0]
+ rotation: 0
+ state: enabled
+- name: udp_dest_addr
+ id: variable
+ parameters:
+ comment: ''
+ value: '"127.0.0.1"'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1056, 157]
+ rotation: 0
+ state: enabled
+- name: udp_packet_size
+ id: variable
+ parameters:
+ comment: ''
+ value: '1472'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [1072, 229]
+ rotation: 0
+ state: enabled
+- name: variable_qtgui_label_0_0
+ id: variable_qtgui_label
+ parameters:
+ comment: ''
+ formatter: 'lambda x: f''{x/1000000:.4f} MHz'''
+ gui_hint: ''
+ label: 'Receive frequency: '
+ type: real
+ value: freq+xlate_offset_fine1
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [176, 636.0]
+ rotation: 0
+ state: true
+- name: xlate_offset1
+ id: variable
+ parameters:
+ comment: ''
+ value: '500000'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [464, 652.0]
+ rotation: 0
+ state: enabled
+- name: xlate_offset_fine1
+ id: variable_qtgui_range
+ parameters:
+ comment: ''
+ gui_hint: 0,2,1,3
+ label: Fine tune1
+ min_len: '200'
+ orient: QtCore.Qt.Horizontal
+ rangeType: float
+ start: -5e3
+ step: '1'
+ stop: +5e3
+ value: '0'
+ widget: counter_slider
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [168, 404.0]
+ rotation: 0
+ state: true
+- name: analog_agc3_xx_0
+ id: analog_agc3_xx
+ parameters:
+ affinity: ''
+ alias: ''
+ attack_rate: 1e-3
+ comment: ''
+ decay_rate: 1e-4
+ gain: '1.0'
+ iir_update_decim: '1'
+ max_gain: '65536'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ reference: '1.0'
+ type: complex
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [568, 392.0]
+ rotation: 0
+ state: enabled
+- name: freq_xlating_fir_filter_xxx_0
+ id: freq_xlating_fir_filter_xxx
+ parameters:
+ affinity: ''
+ alias: ''
+ center_freq: xlate_offset1+xlate_offset_fine1
+ comment: ''
+ decim: first_decim
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ samp_rate: samp_rate
+ taps: firdes.low_pass(1, samp_rate, options_low_pass, options_low_pass*0.2)
+ type: ccc
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [520, 95]
+ rotation: 0
+ state: enabled
+- name: mmse_resampler_xx_0
+ id: mmse_resampler_xx
+ parameters:
+ affinity: ''
+ alias: ''
+ comment: ''
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ phase_shift: '0'
+ resamp_ratio: float(float(if_samp_rate)/float(out_sample_rate))
+ type: complex
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [760, 440.0]
+ rotation: 0
+ state: true
+- name: network_udp_sink_0
+ id: network_udp_sink
+ parameters:
+ addr: udp_dest_addr
+ affinity: ''
+ alias: ''
+ comment: ''
+ header: '0'
+ payloadsize: udp_packet_size
+ port: first_port+1
+ send_eof: 'False'
+ type: complex
+ vlen: '1'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [952, 428.0]
+ rotation: 0
+ state: true
+- name: note_0
+ id: note
+ parameters:
+ alias: ''
+ comment: ''
+ note: 'The xmlrpc server is disabled, so that it doesn''t confuse anyone. You
+ can enable it when gnuradio bug #6766 is fixed'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [896, 20.0]
+ rotation: 0
+ state: true
+- name: osmosdr_source_0
+ id: osmosdr_source
+ parameters:
+ affinity: ''
+ alias: ''
+ ant0: ''
+ ant1: ''
+ ant10: ''
+ ant11: ''
+ ant12: ''
+ ant13: ''
+ ant14: ''
+ ant15: ''
+ ant16: ''
+ ant17: ''
+ ant18: ''
+ ant19: ''
+ ant2: ''
+ ant20: ''
+ ant21: ''
+ ant22: ''
+ ant23: ''
+ ant24: ''
+ ant25: ''
+ ant26: ''
+ ant27: ''
+ ant28: ''
+ ant29: ''
+ ant3: ''
+ ant30: ''
+ ant31: ''
+ ant4: ''
+ ant5: ''
+ ant6: ''
+ ant7: ''
+ ant8: ''
+ ant9: ''
+ args: ''
+ bb_gain0: '20'
+ bb_gain1: '20'
+ bb_gain10: '20'
+ bb_gain11: '20'
+ bb_gain12: '20'
+ bb_gain13: '20'
+ bb_gain14: '20'
+ bb_gain15: '20'
+ bb_gain16: '20'
+ bb_gain17: '20'
+ bb_gain18: '20'
+ bb_gain19: '20'
+ bb_gain2: '20'
+ bb_gain20: '20'
+ bb_gain21: '20'
+ bb_gain22: '20'
+ bb_gain23: '20'
+ bb_gain24: '20'
+ bb_gain25: '20'
+ bb_gain26: '20'
+ bb_gain27: '20'
+ bb_gain28: '20'
+ bb_gain29: '20'
+ bb_gain3: '20'
+ bb_gain30: '20'
+ bb_gain31: '20'
+ bb_gain4: '20'
+ bb_gain5: '20'
+ bb_gain6: '20'
+ bb_gain7: '20'
+ bb_gain8: '20'
+ bb_gain9: '20'
+ bw0: '0'
+ bw1: '0'
+ bw10: '0'
+ bw11: '0'
+ bw12: '0'
+ bw13: '0'
+ bw14: '0'
+ bw15: '0'
+ bw16: '0'
+ bw17: '0'
+ bw18: '0'
+ bw19: '0'
+ bw2: '0'
+ bw20: '0'
+ bw21: '0'
+ bw22: '0'
+ bw23: '0'
+ bw24: '0'
+ bw25: '0'
+ bw26: '0'
+ bw27: '0'
+ bw28: '0'
+ bw29: '0'
+ bw3: '0'
+ bw30: '0'
+ bw31: '0'
+ bw4: '0'
+ bw5: '0'
+ bw6: '0'
+ bw7: '0'
+ bw8: '0'
+ bw9: '0'
+ clock_source0: ''
+ clock_source1: ''
+ clock_source2: ''
+ clock_source3: ''
+ clock_source4: ''
+ clock_source5: ''
+ clock_source6: ''
+ clock_source7: ''
+ comment: ''
+ corr0: ppm_corr
+ corr1: '0'
+ corr10: '0'
+ corr11: '0'
+ corr12: '0'
+ corr13: '0'
+ corr14: '0'
+ corr15: '0'
+ corr16: '0'
+ corr17: '0'
+ corr18: '0'
+ corr19: '0'
+ corr2: '0'
+ corr20: '0'
+ corr21: '0'
+ corr22: '0'
+ corr23: '0'
+ corr24: '0'
+ corr25: '0'
+ corr26: '0'
+ corr27: '0'
+ corr28: '0'
+ corr29: '0'
+ corr3: '0'
+ corr30: '0'
+ corr31: '0'
+ corr4: '0'
+ corr5: '0'
+ corr6: '0'
+ corr7: '0'
+ corr8: '0'
+ corr9: '0'
+ dc_offset_mode0: '0'
+ dc_offset_mode1: '0'
+ dc_offset_mode10: '0'
+ dc_offset_mode11: '0'
+ dc_offset_mode12: '0'
+ dc_offset_mode13: '0'
+ dc_offset_mode14: '0'
+ dc_offset_mode15: '0'
+ dc_offset_mode16: '0'
+ dc_offset_mode17: '0'
+ dc_offset_mode18: '0'
+ dc_offset_mode19: '0'
+ dc_offset_mode2: '0'
+ dc_offset_mode20: '0'
+ dc_offset_mode21: '0'
+ dc_offset_mode22: '0'
+ dc_offset_mode23: '0'
+ dc_offset_mode24: '0'
+ dc_offset_mode25: '0'
+ dc_offset_mode26: '0'
+ dc_offset_mode27: '0'
+ dc_offset_mode28: '0'
+ dc_offset_mode29: '0'
+ dc_offset_mode3: '0'
+ dc_offset_mode30: '0'
+ dc_offset_mode31: '0'
+ dc_offset_mode4: '0'
+ dc_offset_mode5: '0'
+ dc_offset_mode6: '0'
+ dc_offset_mode7: '0'
+ dc_offset_mode8: '0'
+ dc_offset_mode9: '0'
+ freq0: freq-xlate_offset1
+ freq1: 100e6
+ freq10: 100e6
+ freq11: 100e6
+ freq12: 100e6
+ freq13: 100e6
+ freq14: 100e6
+ freq15: 100e6
+ freq16: 100e6
+ freq17: 100e6
+ freq18: 100e6
+ freq19: 100e6
+ freq2: 100e6
+ freq20: 100e6
+ freq21: 100e6
+ freq22: 100e6
+ freq23: 100e6
+ freq24: 100e6
+ freq25: 100e6
+ freq26: 100e6
+ freq27: 100e6
+ freq28: 100e6
+ freq29: 100e6
+ freq3: 100e6
+ freq30: 100e6
+ freq31: 100e6
+ freq4: 100e6
+ freq5: 100e6
+ freq6: 100e6
+ freq7: 100e6
+ freq8: 100e6
+ freq9: 100e6
+ gain0: sdr_gain
+ gain1: '10'
+ gain10: '10'
+ gain11: '10'
+ gain12: '10'
+ gain13: '10'
+ gain14: '10'
+ gain15: '10'
+ gain16: '10'
+ gain17: '10'
+ gain18: '10'
+ gain19: '10'
+ gain2: '10'
+ gain20: '10'
+ gain21: '10'
+ gain22: '10'
+ gain23: '10'
+ gain24: '10'
+ gain25: '10'
+ gain26: '10'
+ gain27: '10'
+ gain28: '10'
+ gain29: '10'
+ gain3: '10'
+ gain30: '10'
+ gain31: '10'
+ gain4: '10'
+ gain5: '10'
+ gain6: '10'
+ gain7: '10'
+ gain8: '10'
+ gain9: '10'
+ gain_mode0: 'False'
+ gain_mode1: 'False'
+ gain_mode10: 'False'
+ gain_mode11: 'False'
+ gain_mode12: 'False'
+ gain_mode13: 'False'
+ gain_mode14: 'False'
+ gain_mode15: 'False'
+ gain_mode16: 'False'
+ gain_mode17: 'False'
+ gain_mode18: 'False'
+ gain_mode19: 'False'
+ gain_mode2: 'False'
+ gain_mode20: 'False'
+ gain_mode21: 'False'
+ gain_mode22: 'False'
+ gain_mode23: 'False'
+ gain_mode24: 'False'
+ gain_mode25: 'False'
+ gain_mode26: 'False'
+ gain_mode27: 'False'
+ gain_mode28: 'False'
+ gain_mode29: 'False'
+ gain_mode3: 'False'
+ gain_mode30: 'False'
+ gain_mode31: 'False'
+ gain_mode4: 'False'
+ gain_mode5: 'False'
+ gain_mode6: 'False'
+ gain_mode7: 'False'
+ gain_mode8: 'False'
+ gain_mode9: 'False'
+ if_gain0: sdr_ifgain
+ if_gain1: '20'
+ if_gain10: '20'
+ if_gain11: '20'
+ if_gain12: '20'
+ if_gain13: '20'
+ if_gain14: '20'
+ if_gain15: '20'
+ if_gain16: '20'
+ if_gain17: '20'
+ if_gain18: '20'
+ if_gain19: '20'
+ if_gain2: '20'
+ if_gain20: '20'
+ if_gain21: '20'
+ if_gain22: '20'
+ if_gain23: '20'
+ if_gain24: '20'
+ if_gain25: '20'
+ if_gain26: '20'
+ if_gain27: '20'
+ if_gain28: '20'
+ if_gain29: '20'
+ if_gain3: '20'
+ if_gain30: '20'
+ if_gain31: '20'
+ if_gain4: '20'
+ if_gain5: '20'
+ if_gain6: '20'
+ if_gain7: '20'
+ if_gain8: '20'
+ if_gain9: '20'
+ iq_balance_mode0: '0'
+ iq_balance_mode1: '0'
+ iq_balance_mode10: '0'
+ iq_balance_mode11: '0'
+ iq_balance_mode12: '0'
+ iq_balance_mode13: '0'
+ iq_balance_mode14: '0'
+ iq_balance_mode15: '0'
+ iq_balance_mode16: '0'
+ iq_balance_mode17: '0'
+ iq_balance_mode18: '0'
+ iq_balance_mode19: '0'
+ iq_balance_mode2: '0'
+ iq_balance_mode20: '0'
+ iq_balance_mode21: '0'
+ iq_balance_mode22: '0'
+ iq_balance_mode23: '0'
+ iq_balance_mode24: '0'
+ iq_balance_mode25: '0'
+ iq_balance_mode26: '0'
+ iq_balance_mode27: '0'
+ iq_balance_mode28: '0'
+ iq_balance_mode29: '0'
+ iq_balance_mode3: '0'
+ iq_balance_mode30: '0'
+ iq_balance_mode31: '0'
+ iq_balance_mode4: '0'
+ iq_balance_mode5: '0'
+ iq_balance_mode6: '0'
+ iq_balance_mode7: '0'
+ iq_balance_mode8: '0'
+ iq_balance_mode9: '0'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ nchan: '1'
+ num_mboards: '1'
+ sample_rate: samp_rate
+ sync: sync
+ time_source0: ''
+ time_source1: ''
+ time_source2: ''
+ time_source3: ''
+ time_source4: ''
+ time_source5: ''
+ time_source6: ''
+ time_source7: ''
+ type: fc32
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [32, 136.0]
+ rotation: 0
+ state: enabled
+- name: qtgui_freq_sink_x_0
+ id: qtgui_freq_sink_x
+ parameters:
+ affinity: ''
+ alias: ''
+ alpha1: '1.0'
+ alpha10: '1.0'
+ alpha2: '1.0'
+ alpha3: '1.0'
+ alpha4: '1.0'
+ alpha5: '1.0'
+ alpha6: '1.0'
+ alpha7: '1.0'
+ alpha8: '1.0'
+ alpha9: '1.0'
+ autoscale: 'False'
+ average: '0.2'
+ axislabels: 'True'
+ bw: samp_rate
+ color1: '"blue"'
+ color10: '"dark blue"'
+ color2: '"red"'
+ color3: '"green"'
+ color4: '"black"'
+ color5: '"cyan"'
+ color6: '"magenta"'
+ color7: '"yellow"'
+ color8: '"dark red"'
+ color9: '"dark green"'
+ comment: ''
+ ctrlpanel: 'True'
+ fc: freq-xlate_offset1
+ fftsize: '1024'
+ freqhalf: 'True'
+ grid: 'False'
+ gui_hint: 1,0,1,6
+ label: Relative Gain
+ label1: ''
+ label10: ''''''
+ label2: ''''''
+ label3: ''''''
+ label4: ''''''
+ label5: ''''''
+ label6: ''''''
+ label7: ''''''
+ label8: ''''''
+ label9: ''''''
+ legend: 'True'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ name: '""'
+ nconnections: '1'
+ norm_window: 'False'
+ showports: 'False'
+ tr_chan: '0'
+ tr_level: '0.0'
+ tr_mode: qtgui.TRIG_MODE_FREE
+ tr_tag: '""'
+ type: complex
+ units: dB
+ update_time: '0.10'
+ width1: '1'
+ width10: '1'
+ width2: '1'
+ width3: '1'
+ width4: '1'
+ width5: '1'
+ width6: '1'
+ width7: '1'
+ width8: '1'
+ width9: '1'
+ wintype: window.WIN_BLACKMAN_hARRIS
+ ymax: '10'
+ ymin: '-140'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [280, 284.0]
+ rotation: 0
+ state: true
+- name: qtgui_freq_sink_x_0_0
+ id: qtgui_freq_sink_x
+ parameters:
+ affinity: ''
+ alias: ''
+ alpha1: '1.0'
+ alpha10: '1.0'
+ alpha2: '1.0'
+ alpha3: '1.0'
+ alpha4: '1.0'
+ alpha5: '1.0'
+ alpha6: '1.0'
+ alpha7: '1.0'
+ alpha8: '1.0'
+ alpha9: '1.0'
+ autoscale: 'True'
+ average: '1.0'
+ axislabels: 'True'
+ bw: if_samp_rate
+ color1: '"blue"'
+ color10: '"dark blue"'
+ color2: '"red"'
+ color3: '"green"'
+ color4: '"black"'
+ color5: '"cyan"'
+ color6: '"magenta"'
+ color7: '"yellow"'
+ color8: '"dark red"'
+ color9: '"dark green"'
+ comment: ''
+ ctrlpanel: 'True'
+ fc: '0'
+ fftsize: '256'
+ freqhalf: 'True'
+ grid: 'True'
+ gui_hint: 1,6,1,6
+ label: Relative Gain
+ label1: ''
+ label10: ''''''
+ label2: ''''''
+ label3: ''''''
+ label4: ''''''
+ label5: ''''''
+ label6: ''''''
+ label7: ''''''
+ label8: ''''''
+ label9: ''''''
+ legend: 'True'
+ maxoutbuf: '0'
+ minoutbuf: '0'
+ name: '"IF"'
+ nconnections: '1'
+ norm_window: 'False'
+ showports: 'True'
+ tr_chan: '0'
+ tr_level: '0.0'
+ tr_mode: qtgui.TRIG_MODE_FREE
+ tr_tag: '""'
+ type: complex
+ units: dB
+ update_time: '0.01'
+ width1: '1'
+ width10: '1'
+ width2: '1'
+ width3: '1'
+ width4: '1'
+ width5: '1'
+ width6: '1'
+ width7: '1'
+ width8: '1'
+ width9: '1'
+ wintype: window.WIN_BLACKMAN_hARRIS
+ ymax: '-30'
+ ymin: '-180'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [832, 156.0]
+ rotation: 0
+ state: true
+- name: xlate_offset_fine1
+ id: variable_slider
+ parameters:
+ alias: ''
+ comment: ''
+ converver: float_converter
+ grid_pos: 3,1,1,4
+ label: Fine Tune
+ max: '10000'
+ min: '-10000'
+ notebook: ''
+ num_steps: '200'
+ style: wx.SL_HORIZONTAL
+ value: '0'
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [144, 770]
+ rotation: 0
+ state: enabled
+- name: xmlrpc_server_0
+ id: xmlrpc_server
+ parameters:
+ addr: 0.0.0.0
+ alias: ''
+ comment: ''
+ port: first_port
+ states:
+ bus_sink: false
+ bus_source: false
+ bus_structure: null
+ coordinate: [800, 20.0]
+ rotation: 0
+ state: disabled
+
+connections:
+- [analog_agc3_xx_0, '0', mmse_resampler_xx_0, '0']
+- [freq_xlating_fir_filter_xxx_0, '0', analog_agc3_xx_0, '0']
+- [freq_xlating_fir_filter_xxx_0, '0', qtgui_freq_sink_x_0_0, '0']
+- [mmse_resampler_xx_0, '0', network_udp_sink_0, '0']
+- [osmosdr_source_0, '0', freq_xlating_fir_filter_xxx_0, '0']
+- [osmosdr_source_0, '0', qtgui_freq_sink_x_0, '0']
+
+metadata:
+ file_format: 1
+ grc_version: 3.10.5.1
diff --git a/src/demod/telive_1ch_simple_gr310_udp.py b/src/demod/telive_1ch_simple_gr310_udp.py
new file mode 100755
index 0000000..22990c0
--- /dev/null
+++ b/src/demod/telive_1ch_simple_gr310_udp.py
@@ -0,0 +1,438 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+#
+# SPDX-License-Identifier: GPL-3.0
+#
+# GNU Radio Python Flow Graph
+# Title: SQ5BPF Tetra live receiver 1ch simple UDP demo with fixed offset (gnuradio 3.10 version) xmlrpc
+# Author: Jacek Lipkowski SQ5BPF
+# Description: This is a receiver flowgraph, uses a rtl-sdr dongle, and outputs a downsampled stream to 127.0.0.1 42001/udp. This can be used with telive, or just osmo-tetra
+# GNU Radio version: 3.10.5.1
+
+from packaging.version import Version as StrictVersion
+
+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 PyQt5 import Qt
+from gnuradio import eng_notation
+from gnuradio import qtgui
+from gnuradio.filter import firdes
+import sip
+from gnuradio import analog
+from gnuradio import filter
+from gnuradio import gr
+from gnuradio.fft import window
+import sys
+import signal
+from argparse import ArgumentParser
+from gnuradio.eng_arg import eng_float, intx
+from gnuradio import network
+from gnuradio.qtgui import Range, RangeWidget
+from PyQt5 import QtCore
+import osmosdr
+import time
+
+
+
+from gnuradio import qtgui
+
+class telive_1ch_simple_gr310_udp(gr.top_block, Qt.QWidget):
+
+ def __init__(self):
+ gr.top_block.__init__(self, "SQ5BPF Tetra live receiver 1ch simple UDP demo with fixed offset (gnuradio 3.10 version) xmlrpc", catch_exceptions=True)
+ Qt.QWidget.__init__(self)
+ self.setWindowTitle("SQ5BPF Tetra live receiver 1ch simple UDP demo with fixed offset (gnuradio 3.10 version) xmlrpc")
+ 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", "telive_1ch_simple_gr310_udp")
+
+ try:
+ if StrictVersion(Qt.qVersion()) < StrictVersion("5.0.0"):
+ self.restoreGeometry(self.settings.value("geometry").toByteArray())
+ else:
+ self.restoreGeometry(self.settings.value("geometry"))
+ except:
+ pass
+
+ ##################################################
+ # Variables
+ ##################################################
+ self.xlate_offset_fine1 = xlate_offset_fine1 = 0
+ self.samp_rate = samp_rate = 2000000
+ self.freq = freq = 438.0125e6
+ self.first_decim = first_decim = 32
+ self.xlate_offset1 = xlate_offset1 = 500000
+ self.variable_qtgui_label_0_0 = variable_qtgui_label_0_0 = (freq+xlate_offset_fine1)
+ self.udp_packet_size = udp_packet_size = 1472
+ self.udp_dest_addr = udp_dest_addr = "127.0.0.1"
+ self.telive_receiver_name = telive_receiver_name = 'SQ5BPF 1-channel rx for telive'
+ self.telive_receiver_channels = telive_receiver_channels = 1
+ self.sdr_ifgain = sdr_ifgain = 20
+ self.sdr_gain = sdr_gain = 30
+ self.ppm_corr = ppm_corr = 0
+ self.out_sample_rate = out_sample_rate = 36000
+ self.options_low_pass = options_low_pass = 12500
+ self.if_samp_rate = if_samp_rate = samp_rate/first_decim
+ self.first_port = first_port = 42000
+
+ ##################################################
+ # Blocks
+ ##################################################
+
+ self._xlate_offset_fine1_range = Range(-5e3, +5e3, 1, 0, 200)
+ self._xlate_offset_fine1_win = RangeWidget(self._xlate_offset_fine1_range, self.set_xlate_offset_fine1, "Fine tune1", "counter_slider", float, QtCore.Qt.Horizontal)
+ self.top_grid_layout.addWidget(self._xlate_offset_fine1_win, 0, 2, 1, 3)
+ for r in range(0, 1):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(2, 5):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self._sdr_gain_range = Range(0, 50, 1, 30, 200)
+ self._sdr_gain_win = RangeWidget(self._sdr_gain_range, self.set_sdr_gain, "gain", "counter_slider", int, QtCore.Qt.Horizontal)
+ self.top_grid_layout.addWidget(self._sdr_gain_win, 0, 8, 1, 2)
+ for r in range(0, 1):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(8, 10):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self._ppm_corr_range = Range(-100, 100, 0.5, 0, 200)
+ self._ppm_corr_win = RangeWidget(self._ppm_corr_range, self.set_ppm_corr, "ppm", "counter_slider", float, QtCore.Qt.Horizontal)
+ self.top_grid_layout.addWidget(self._ppm_corr_win, 0, 5, 1, 3)
+ for r in range(0, 1):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(5, 8):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self._freq_tool_bar = Qt.QToolBar(self)
+ self._freq_tool_bar.addWidget(Qt.QLabel("Frequency" + ": "))
+ self._freq_line_edit = Qt.QLineEdit(str(self.freq))
+ self._freq_tool_bar.addWidget(self._freq_line_edit)
+ self._freq_line_edit.returnPressed.connect(
+ lambda: self.set_freq(eng_notation.str_to_num(str(self._freq_line_edit.text()))))
+ self.top_grid_layout.addWidget(self._freq_tool_bar, 0, 0, 1, 2)
+ for r in range(0, 1):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(0, 2):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self._variable_qtgui_label_0_0_tool_bar = Qt.QToolBar(self)
+
+ if lambda x: f'{x/1000000:.4f} MHz':
+ self._variable_qtgui_label_0_0_formatter = lambda x: f'{x/1000000:.4f} MHz'
+ else:
+ self._variable_qtgui_label_0_0_formatter = lambda x: eng_notation.num_to_str(x)
+
+ self._variable_qtgui_label_0_0_tool_bar.addWidget(Qt.QLabel("Receive frequency: "))
+ self._variable_qtgui_label_0_0_label = Qt.QLabel(str(self._variable_qtgui_label_0_0_formatter(self.variable_qtgui_label_0_0)))
+ self._variable_qtgui_label_0_0_tool_bar.addWidget(self._variable_qtgui_label_0_0_label)
+ self.top_layout.addWidget(self._variable_qtgui_label_0_0_tool_bar)
+ self.qtgui_freq_sink_x_0_0 = qtgui.freq_sink_c(
+ 256, #size
+ window.WIN_BLACKMAN_hARRIS, #wintype
+ 0, #fc
+ if_samp_rate, #bw
+ "IF", #name
+ 1,
+ None # parent
+ )
+ self.qtgui_freq_sink_x_0_0.set_update_time(0.01)
+ self.qtgui_freq_sink_x_0_0.set_y_axis((-180), (-30))
+ self.qtgui_freq_sink_x_0_0.set_y_label('Relative Gain', 'dB')
+ self.qtgui_freq_sink_x_0_0.set_trigger_mode(qtgui.TRIG_MODE_FREE, 0.0, 0, "")
+ self.qtgui_freq_sink_x_0_0.enable_autoscale(True)
+ self.qtgui_freq_sink_x_0_0.enable_grid(True)
+ self.qtgui_freq_sink_x_0_0.set_fft_average(1.0)
+ self.qtgui_freq_sink_x_0_0.enable_axis_labels(True)
+ self.qtgui_freq_sink_x_0_0.enable_control_panel(True)
+ self.qtgui_freq_sink_x_0_0.set_fft_window_normalized(False)
+
+
+
+ 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 range(1):
+ if len(labels[i]) == 0:
+ self.qtgui_freq_sink_x_0_0.set_line_label(i, "Data {0}".format(i))
+ else:
+ self.qtgui_freq_sink_x_0_0.set_line_label(i, labels[i])
+ self.qtgui_freq_sink_x_0_0.set_line_width(i, widths[i])
+ self.qtgui_freq_sink_x_0_0.set_line_color(i, colors[i])
+ self.qtgui_freq_sink_x_0_0.set_line_alpha(i, alphas[i])
+
+ self._qtgui_freq_sink_x_0_0_win = sip.wrapinstance(self.qtgui_freq_sink_x_0_0.qwidget(), Qt.QWidget)
+ self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_0_win, 1, 6, 1, 6)
+ for r in range(1, 2):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(6, 12):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self.qtgui_freq_sink_x_0 = qtgui.freq_sink_c(
+ 1024, #size
+ window.WIN_BLACKMAN_hARRIS, #wintype
+ (freq-xlate_offset1), #fc
+ samp_rate, #bw
+ "", #name
+ 1,
+ None # parent
+ )
+ 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(False)
+ self.qtgui_freq_sink_x_0.enable_grid(False)
+ self.qtgui_freq_sink_x_0.set_fft_average(0.2)
+ self.qtgui_freq_sink_x_0.enable_axis_labels(True)
+ self.qtgui_freq_sink_x_0.enable_control_panel(True)
+ self.qtgui_freq_sink_x_0.set_fft_window_normalized(False)
+
+
+
+ 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 range(1):
+ 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.qwidget(), Qt.QWidget)
+ self.top_grid_layout.addWidget(self._qtgui_freq_sink_x_0_win, 1, 0, 1, 6)
+ for r in range(1, 2):
+ self.top_grid_layout.setRowStretch(r, 1)
+ for c in range(0, 6):
+ self.top_grid_layout.setColumnStretch(c, 1)
+ self.osmosdr_source_0 = osmosdr.source(
+ args="numchan=" + str(1) + " " + ''
+ )
+ self.osmosdr_source_0.set_time_unknown_pps(osmosdr.time_spec_t())
+ self.osmosdr_source_0.set_sample_rate(samp_rate)
+ self.osmosdr_source_0.set_center_freq((freq-xlate_offset1), 0)
+ self.osmosdr_source_0.set_freq_corr(ppm_corr, 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(sdr_gain, 0)
+ self.osmosdr_source_0.set_if_gain(sdr_ifgain, 0)
+ self.osmosdr_source_0.set_bb_gain(20, 0)
+ self.osmosdr_source_0.set_antenna('', 0)
+ self.osmosdr_source_0.set_bandwidth(0, 0)
+ self.network_udp_sink_0 = network.udp_sink(gr.sizeof_gr_complex, 1, udp_dest_addr, (first_port+1), 0, udp_packet_size, False)
+ self.mmse_resampler_xx_0 = filter.mmse_resampler_cc(0, (float(float(if_samp_rate)/float(out_sample_rate))))
+ self.freq_xlating_fir_filter_xxx_0 = filter.freq_xlating_fir_filter_ccc(first_decim, firdes.low_pass(1, samp_rate, options_low_pass, options_low_pass*0.2), (xlate_offset1+xlate_offset_fine1), samp_rate)
+ self.analog_agc3_xx_0 = analog.agc3_cc((1e-3), (1e-4), 1.0, 1.0, 1)
+ self.analog_agc3_xx_0.set_max_gain(65536)
+
+
+ ##################################################
+ # Connections
+ ##################################################
+ self.connect((self.analog_agc3_xx_0, 0), (self.mmse_resampler_xx_0, 0))
+ self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.analog_agc3_xx_0, 0))
+ self.connect((self.freq_xlating_fir_filter_xxx_0, 0), (self.qtgui_freq_sink_x_0_0, 0))
+ self.connect((self.mmse_resampler_xx_0, 0), (self.network_udp_sink_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.freq_xlating_fir_filter_xxx_0, 0))
+ self.connect((self.osmosdr_source_0, 0), (self.qtgui_freq_sink_x_0, 0))
+
+
+ def closeEvent(self, event):
+ self.settings = Qt.QSettings("GNU Radio", "telive_1ch_simple_gr310_udp")
+ self.settings.setValue("geometry", self.saveGeometry())
+ self.stop()
+ self.wait()
+
+ event.accept()
+
+ def get_xlate_offset_fine1(self):
+ return self.xlate_offset_fine1
+
+ def set_xlate_offset_fine1(self, xlate_offset_fine1):
+ self.xlate_offset_fine1 = xlate_offset_fine1
+ self.set_variable_qtgui_label_0_0((self.freq+self.xlate_offset_fine1))
+ self.freq_xlating_fir_filter_xxx_0.set_center_freq((self.xlate_offset1+self.xlate_offset_fine1))
+
+ def get_samp_rate(self):
+ return self.samp_rate
+
+ def set_samp_rate(self, samp_rate):
+ self.samp_rate = samp_rate
+ self.set_if_samp_rate(self.samp_rate/self.first_decim)
+ self.freq_xlating_fir_filter_xxx_0.set_taps(firdes.low_pass(1, self.samp_rate, self.options_low_pass, self.options_low_pass*0.2))
+ self.osmosdr_source_0.set_sample_rate(self.samp_rate)
+ self.qtgui_freq_sink_x_0.set_frequency_range((self.freq-self.xlate_offset1), self.samp_rate)
+
+ def get_freq(self):
+ return self.freq
+
+ def set_freq(self, freq):
+ self.freq = freq
+ Qt.QMetaObject.invokeMethod(self._freq_line_edit, "setText", Qt.Q_ARG("QString", eng_notation.num_to_str(self.freq)))
+ self.set_variable_qtgui_label_0_0((self.freq+self.xlate_offset_fine1))
+ self.osmosdr_source_0.set_center_freq((self.freq-self.xlate_offset1), 0)
+ self.qtgui_freq_sink_x_0.set_frequency_range((self.freq-self.xlate_offset1), self.samp_rate)
+
+ def get_first_decim(self):
+ return self.first_decim
+
+ def set_first_decim(self, first_decim):
+ self.first_decim = first_decim
+ self.set_if_samp_rate(self.samp_rate/self.first_decim)
+
+ def get_xlate_offset1(self):
+ return self.xlate_offset1
+
+ def set_xlate_offset1(self, xlate_offset1):
+ self.xlate_offset1 = xlate_offset1
+ self.freq_xlating_fir_filter_xxx_0.set_center_freq((self.xlate_offset1+self.xlate_offset_fine1))
+ self.osmosdr_source_0.set_center_freq((self.freq-self.xlate_offset1), 0)
+ self.qtgui_freq_sink_x_0.set_frequency_range((self.freq-self.xlate_offset1), self.samp_rate)
+
+ def get_variable_qtgui_label_0_0(self):
+ return self.variable_qtgui_label_0_0
+
+ def set_variable_qtgui_label_0_0(self, variable_qtgui_label_0_0):
+ self.variable_qtgui_label_0_0 = variable_qtgui_label_0_0
+ Qt.QMetaObject.invokeMethod(self._variable_qtgui_label_0_0_label, "setText", Qt.Q_ARG("QString", str(self._variable_qtgui_label_0_0_formatter(self.variable_qtgui_label_0_0))))
+
+ def get_udp_packet_size(self):
+ return self.udp_packet_size
+
+ def set_udp_packet_size(self, udp_packet_size):
+ self.udp_packet_size = udp_packet_size
+
+ def get_udp_dest_addr(self):
+ return self.udp_dest_addr
+
+ def set_udp_dest_addr(self, udp_dest_addr):
+ self.udp_dest_addr = udp_dest_addr
+
+ def get_telive_receiver_name(self):
+ return self.telive_receiver_name
+
+ def set_telive_receiver_name(self, telive_receiver_name):
+ self.telive_receiver_name = telive_receiver_name
+
+ def get_telive_receiver_channels(self):
+ return self.telive_receiver_channels
+
+ def set_telive_receiver_channels(self, telive_receiver_channels):
+ self.telive_receiver_channels = telive_receiver_channels
+
+ def get_sdr_ifgain(self):
+ return self.sdr_ifgain
+
+ def set_sdr_ifgain(self, sdr_ifgain):
+ self.sdr_ifgain = sdr_ifgain
+ self.osmosdr_source_0.set_if_gain(self.sdr_ifgain, 0)
+
+ def get_sdr_gain(self):
+ return self.sdr_gain
+
+ def set_sdr_gain(self, sdr_gain):
+ self.sdr_gain = sdr_gain
+ self.osmosdr_source_0.set_gain(self.sdr_gain, 0)
+
+ def get_ppm_corr(self):
+ return self.ppm_corr
+
+ def set_ppm_corr(self, ppm_corr):
+ self.ppm_corr = ppm_corr
+ self.osmosdr_source_0.set_freq_corr(self.ppm_corr, 0)
+
+ def get_out_sample_rate(self):
+ return self.out_sample_rate
+
+ def set_out_sample_rate(self, out_sample_rate):
+ self.out_sample_rate = out_sample_rate
+ self.mmse_resampler_xx_0.set_resamp_ratio((float(float(self.if_samp_rate)/float(self.out_sample_rate))))
+
+ def get_options_low_pass(self):
+ return self.options_low_pass
+
+ def set_options_low_pass(self, options_low_pass):
+ self.options_low_pass = options_low_pass
+ self.freq_xlating_fir_filter_xxx_0.set_taps(firdes.low_pass(1, self.samp_rate, self.options_low_pass, self.options_low_pass*0.2))
+
+ def get_if_samp_rate(self):
+ return self.if_samp_rate
+
+ def set_if_samp_rate(self, if_samp_rate):
+ self.if_samp_rate = if_samp_rate
+ self.mmse_resampler_xx_0.set_resamp_ratio((float(float(self.if_samp_rate)/float(self.out_sample_rate))))
+ self.qtgui_freq_sink_x_0_0.set_frequency_range(0, self.if_samp_rate)
+
+ def get_first_port(self):
+ return self.first_port
+
+ def set_first_port(self, first_port):
+ self.first_port = first_port
+
+
+
+
+def main(top_block_cls=telive_1ch_simple_gr310_udp, options=None):
+
+ if StrictVersion("4.5.0") <= StrictVersion(Qt.qVersion()) < StrictVersion("5.0.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 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()
diff --git a/src/receiver1udp b/src/receiver1udp
new file mode 100755
index 0000000..7f60a7b
--- /dev/null
+++ b/src/receiver1udp
@@ -0,0 +1,73 @@
+#!/bin/bash
+#
+# receiver1udp (c) 2023 Jacek Lipkowski SQ5BPF <sq5bpf@lipkowski.org>
+#
+# This is an example how to get I/Q data via udp packets,
+# feed them to a qpsk demodulator, and feed the result to tetra-rx
+#
+# Originally this was developed to work with the osmo-tetra-sq5bpf tree
+# but will work with original osmo-tetra too
+#
+#
+# To use with an rtl-sdr dongle:
+#
+# - run the demod/telive_1ch_simple_gr310_udp.py (you can also use the telive_1ch_simple_gr310_udp.grc in gnuradio-companion)
+#
+# - run ./receiver1udp
+#
+# - enter the frequency in the receiver window, set the ppm (frequency correction) and the gain
+#
+
+
+if [ "$1" ]; then
+ RXID=$1
+else
+ RXID=1
+fi
+
+
+# you can also set GR_VERSION yourself outside of this script --sq5bpf
+[ "$GR_VERSION" ] || GR_VERSION=`gnuradio-config-info -v|cut -d . -f 1-2|tr -d v`
+case $GR_VERSION in
+ 3.6)
+ GR_DIR=gnuradio-3.6
+ PYT=2
+ ;;
+ 3.7)
+ GR_DIR=gnuradio-3.7
+ PYT=2
+ ;;
+ 3.10)
+ GR_DIR=gnuradio-3.10
+ PYT=3
+ ;;
+ *)
+ echo "Unsupported gnuradio version $GR_VERSION"
+ exit 1
+ ;;
+esac
+
+UDP_PORT=42001
+
+
+ulimit -c unlimited
+
+#tetra-rx args: -a turns on pseudo-afc , -i uses an internal float_t_bits
+# -r turns on fragment reassembly, -s tries to dump unknown SDS protocols as text
+#
+#if you have problems with the receiver, then try to remove -a
+
+case "$PYT" in
+ 2)
+ socat -b 4096 UDP-RECV:${UDP_PORT} STDOUT | demod/simdemod2.py -o /dev/stdout -i /dev/stdin | ./float_to_bits -a /dev/stdin /dev/stdout | ./tetra-rx /dev/stdin
+ ;;
+ 3)
+ socat -b 4096 UDP-RECV:${UDP_PORT} STDOUT | demod/simdemod3.py | ./tetra-rx /dev/stdin
+ ;;
+ *)
+ echo "Dont know how to handle pythin version [$PYT]"
+ exit 1
+esac
+
+
+
To view, visit change 34222. To unsubscribe, or for help writing mail filters, visit settings.