laforge has submitted this change. (
https://gerrit.osmocom.org/c/osmo-tetra/+/34222 )
Change subject: add the gnuradio 3.10 demodulator and receiver from telive
......................................................................
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(-)
Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, approved
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(a)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
https://gerrit.osmocom.org/c/osmo-tetra/+/34222
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-tetra
Gerrit-Branch: master
Gerrit-Change-Id: I81f20fa115822b3ad642b638f6414d8249a8ac6a
Gerrit-Change-Number: 34222
Gerrit-PatchSet: 2
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: tnt <tnt(a)246tNt.com>
Gerrit-Reviewer: wbokslag <w.bokslag(a)midnightblue.nl>
Gerrit-MessageType: merged