From db2f8b765e982de1cfa4ccfd05f24d014e2fcefe Mon Sep 17 00:00:00 2001 From: csrichter Date: Fri, 15 Apr 2022 17:06:27 +0200 Subject: [PATCH] ifft hier block works on gnuradio 3.8 --- CMakeLists.txt | 2 +- apps/fft-multi-decoder_fixed_rtlsdr.grc | 4 +- apps/ifft-RDS-decoder_hier-block.grc | 4513 ++++---------------- apps/read_sync_decim.grc | 1005 ----- grc/CMakeLists.txt | 28 +- grc/multirds_decoder_compare.block.yml | 25 + grc/multirds_decoder_compare.xml | 28 - grc/multirds_pilot_SNR.block.yml | 57 + grc/multirds_pilot_SNR.xml | 84 - grc/multirds_qtgui_range.xml | 136 - grc/multirds_rds_decoder.block.yml | 23 + grc/multirds_rds_decoder.xml | 45 - grc/multirds_rds_decoder_redsea.block.yml | 23 + grc/multirds_rds_decoder_redsea.xml | 45 - grc/multirds_rds_parser_table_qt.block.yml | 86 + grc/multirds_rds_parser_table_qt.xml | 141 - grc/multirds_rds_table_qt.block.yml | 37 + grc/multirds_rds_table_qt.xml | 46 - grc/multirds_station_search.block.yml | 52 + grc/multirds_station_search.xml | 78 - grc/multirds_stream_router.block.yml | 29 + grc/multirds_stream_router.xml | 54 - grc/multirds_stream_selector.block.yml | 30 + grc/multirds_stream_selector.xml | 38 - grc/multirds_symbol_combiner.block.yml | 30 + grc/multirds_symbol_combiner.xml | 70 - grc/multirds_tmc_parser.block.yml | 62 + grc/multirds_tmc_parser.xml | 112 - grc/multirds_variable_setter.block.yml | 37 + grc/multirds_variable_setter.xml | 59 - grc/multirds_vector_cutter.block.yml | 55 + grc/multirds_vector_cutter.xml | 87 - python/CMakeLists.txt | 4 +- python/__init__.py | 25 +- python/qtgui_range.py | 279 -- 35 files changed, 1310 insertions(+), 6119 deletions(-) delete mode 100644 apps/read_sync_decim.grc create mode 100644 grc/multirds_decoder_compare.block.yml delete mode 100644 grc/multirds_decoder_compare.xml create mode 100644 grc/multirds_pilot_SNR.block.yml delete mode 100644 grc/multirds_pilot_SNR.xml delete mode 100644 grc/multirds_qtgui_range.xml create mode 100644 grc/multirds_rds_decoder.block.yml delete mode 100644 grc/multirds_rds_decoder.xml create mode 100644 grc/multirds_rds_decoder_redsea.block.yml delete mode 100644 grc/multirds_rds_decoder_redsea.xml create mode 100644 grc/multirds_rds_parser_table_qt.block.yml delete mode 100644 grc/multirds_rds_parser_table_qt.xml create mode 100644 grc/multirds_rds_table_qt.block.yml delete mode 100644 grc/multirds_rds_table_qt.xml create mode 100644 grc/multirds_station_search.block.yml delete mode 100644 grc/multirds_station_search.xml create mode 100644 grc/multirds_stream_router.block.yml delete mode 100644 grc/multirds_stream_router.xml create mode 100644 grc/multirds_stream_selector.block.yml delete mode 100644 grc/multirds_stream_selector.xml create mode 100644 grc/multirds_symbol_combiner.block.yml delete mode 100644 grc/multirds_symbol_combiner.xml create mode 100644 grc/multirds_tmc_parser.block.yml delete mode 100644 grc/multirds_tmc_parser.xml create mode 100644 grc/multirds_variable_setter.block.yml delete mode 100644 grc/multirds_variable_setter.xml create mode 100644 grc/multirds_vector_cutter.block.yml delete mode 100644 grc/multirds_vector_cutter.xml delete mode 100644 python/qtgui_range.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 17edf04..4290062 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -127,7 +127,7 @@ find_package(Doxygen) # caps such as FILTER or FFT) and change the version to the minimum # API compatible version required. set(GR_REQUIRED_COMPONENTS RUNTIME) -find_package(Gnuradio "3.7.2" REQUIRED) +find_package(Gnuradio "3.8" REQUIRED) list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_SOURCE_DIR}/cmake/Modules) include(GrVersion) diff --git a/apps/fft-multi-decoder_fixed_rtlsdr.grc b/apps/fft-multi-decoder_fixed_rtlsdr.grc index d1a5b13..45904d5 100644 --- a/apps/fft-multi-decoder_fixed_rtlsdr.grc +++ b/apps/fft-multi-decoder_fixed_rtlsdr.grc @@ -2282,7 +2282,7 @@ class blk(gr.sync_block): # other base classes are basic_block, decim_block, in workdir - /media/clemens/intdaten/uni_bulk/forschungsarbeit/data/ + /media/clemens/teratemp/tmp/gr-multirds/data/ writeDB @@ -2341,7 +2341,7 @@ class blk(gr.sync_block): # other base classes are basic_block, decim_block, in workdir - /media/clemens/intdaten/uni_bulk/forschungsarbeit/data/ + /media/clemens/teratemp/tmp/gr-multirds/data/ writeDB diff --git a/apps/ifft-RDS-decoder_hier-block.grc b/apps/ifft-RDS-decoder_hier-block.grc index e230bae..ebabfb3 100644 --- a/apps/ifft-RDS-decoder_hier-block.grc +++ b/apps/ifft-RDS-decoder_hier-block.grc @@ -1,3781 +1,732 @@ - - - - Fri Feb 3 10:49:49 2017 - - options - - author - - - - window_size - 2000,2000 - - - category - [GRC Hier Blocks] - - - comment - - - - description - - - - _enabled - True - - - _coordinate - (8, 8) - - - _rotation - 0 - - - generate_options - hb - - - hier_block_src_path - .: - - - id - hier_ifft_decoder - - - max_nouts - 0 - - - qt_qss_theme - - - - realtime_scheduling - - - - run_command - {python} -u {filename} - - - run_options - prompt - - - run - True - - - thread_safe_setters - - - - title - - - - - variable - - comment - - - - _enabled - True - - - _coordinate - (646, 3) - - - _rotation - 0 - - - id - audio_decim - - - value - 5 - - - - variable - - comment - - - - _enabled - True - - - _coordinate - (870, 3) - - - _rotation - 0 - - - id - audio_rate - - - value - 48000 - - - - variable - - comment - - - - _enabled - 1 - - - _coordinate - (359, 347) - - - _rotation - 0 - - - id - baseband_rate - - - value - audio_rate*audio_decim - - - - variable - - comment - - - - _enabled - True - - - _coordinate - (766, 3) - - - _rotation - 0 - - - id - bb_decim - - - value - 2 - - - - variable - - comment - - - - _enabled - 1 - - - _coordinate - (247, 395) - - - _rotation - 0 - - - id - chan_rate - - - value - audio_rate*audio_decim*bb_decim - - - - variable - - comment - - - - _enabled - 0 - - - _coordinate - (335, 419) - - - _rotation - 0 - - - id - chan_rate - - - value - int(600e3) - - - - variable - - comment - - - - _enabled - True - - - _coordinate - (1152, 132) - - - _rotation - 0 - - - id - fft19k_len - - - value - 2048 - - - - analog_wfm_rcv - - audio_decimation - bb_decim - - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (359, 155) - - - _rotation - 0 - - - id - analog_wfm_rcv_0_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - quad_rate - 2*baseband_rate - - - - blocks_complex_to_real - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (910, 223) - - - _rotation - 0 - - - id - blocks_complex_to_real_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - vlen - 1 - - - - blocks_complex_to_real - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (623, 646) - - - _rotation - 0 - - - id - blocks_complex_to_real_0_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - vlen - 1 - - - - blocks_complex_to_real - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (646, 910) - - - _rotation - 0 - - - id - blocks_complex_to_real_0_1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - vlen - 1 - - - - blocks_complex_to_real - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (638, 1150) - - - _rotation - 0 - - - id - blocks_complex_to_real_0_1_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - vlen - 1 - - - - blocks_file_sink - - append - False - - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - file - "/tmp/cr/fm_dec_240k_"+str(cutpoint) - - - _coordinate - (718, 355) - - - _rotation - 0 - - - id - blocks_file_sink_0 - - - type - float - - - unbuffered - False - - - vlen - 1 - - - - blocks_file_sink - - append - False - - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - file - "/tmp/cr/psk_out_2375_"+str(cutpoint) - - - _coordinate - (1030, 315) - - - _rotation - 0 - - - id - blocks_file_sink_0_0 - - - type - float - - - unbuffered - False - - - vlen - 1 - - - - blocks_file_sink - - append - False - - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - file - "/tmp/cr/symbol_combiner_out_"+str(cutpoint) - - - _coordinate - (1277, 435) - - - _rotation - 0 - - - id - blocks_file_sink_0_0_0 - - - type - float - - - unbuffered - False - - - vlen - 1 - - - - blocks_keep_one_in_n - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (1206, 335) - - - _rotation - 0 - - - id - blocks_keep_one_in_n_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - n - 2 - - - type - float - - - vlen - 1 - - - - blocks_null_sink - - alias - - - - bus_conns - [[0,],] - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (638, 543) - - - _rotation - 0 - - - id - blocks_null_sink_0 - - - type - complex - - - num_inputs - 1 - - - vlen - 1 - - - - blocks_null_source - - alias - - - - bus_conns - [[0,],] - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (638, 599) - - - _rotation - 0 - - - id - blocks_null_source_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - num_outputs - 1 - - - type - byte - - - vlen - 1 - - - - blocks_vector_to_stream - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (31, 139) - - - _rotation - 0 - - - id - blocks_vector_to_stream_0_0_1 - - - type - complex - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - num_items - chan_fft_len - - - vlen - 1 - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (343, 3) - - - _rotation - 0 - - - id - chan_fft_len - - - label - - - - short_id - - - - type - intx - - - value - 512 - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (375, 67) - - - _rotation - 0 - - - id - cutpoint - - - label - - - - short_id - - - - type - intx - - - value - 0 - - - - digital_binary_slicer_fb - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (1062, 479) - - - _rotation - 180 - - - id - digital_binary_slicer_fb_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - digital_binary_slicer_fb - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (854, 766) - - - _rotation - 180 - - - id - digital_binary_slicer_fb_0_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - digital_binary_slicer_fb - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (846, 1030) - - - _rotation - 180 - - - id - digital_binary_slicer_fb_0_1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - digital_binary_slicer_fb - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (894, 1262) - - - _rotation - 180 - - - id - digital_binary_slicer_fb_0_1_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - digital_clock_recovery_mm_xx - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (798, 279) - - - _rotation - 0 - - - gain_mu - 0.050 - - - gain_omega - 0.001 - - - id - digital_clock_recovery_mm_xx_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - mu - 0.5 - - - omega_relative_limit - 0.005 - - - omega - 16*(1+0.0) - - - type - complex - - - - digital_costas_loop_cc - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (543, 311) - - - _rotation - 0 - - - id - digital_costas_loop_cc_0 - - - w - loop_bw - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - order - 2 - - - use_snr - False - - - - digital_diff_decoder_bb - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (856, 468) - - - _rotation - 180 - - - id - digital_diff_decoder_bb_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - modulus - 2 - - - - digital_diff_decoder_bb - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (631, 762) - - - _rotation - 180 - - - id - digital_diff_decoder_bb_0_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - modulus - 2 - - - - digital_diff_decoder_bb - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (631, 1026) - - - _rotation - 180 - - - id - digital_diff_decoder_bb_0_1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - modulus - 2 - - - - digital_diff_decoder_bb - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (623, 1258) - - - _rotation - 180 - - - id - digital_diff_decoder_bb_0_1_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - modulus - 2 - - - - digital_mpsk_receiver_cc - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (686, 155) - - - _rotation - 0 - - - gain_mu - 0.05 - - - gain_omega - 0.001 - - - id - digital_mpsk_receiver_cc_0 - - - w - loop_bw - - - M - 2 - - - fmax - 0.06 - - - maxoutbuf - 0 - - - fmin - -0.06 - - - minoutbuf - 0 - - - mu - 0.5 - - - omega_relative_limit - 0.005 - - - omega - audio_rate / 2375.0 - - - theta - 0 - - - - digital_mpsk_receiver_cc - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (415, 611) - - - _rotation - 0 - - - gain_mu - 0.05 - - - gain_omega - 0.001 - - - id - digital_mpsk_receiver_cc_0_0 - - - w - loop_bw - - - M - 2 - - - fmax - 0.06 - - - maxoutbuf - 0 - - - fmin - -0.06 - - - minoutbuf - 0 - - - mu - 0.5 - - - omega_relative_limit - 0.005 - - - omega - 48000 / 2375.0 - - - theta - 0 - - - - digital_mpsk_receiver_cc - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (375, 898) - - - _rotation - 0 - - - gain_mu - 0.05 - - - gain_omega - 0.001 - - - id - digital_mpsk_receiver_cc_0_1 - - - w - loop_bw - - - M - 2 - - - fmax - 0.06 - - - maxoutbuf - 0 - - - fmin - -0.06 - - - minoutbuf - 0 - - - mu - 0.5 - - - omega_relative_limit - 0.005 - - - omega - 48000 / 2375.0 - - - theta - 0 - - - - digital_mpsk_receiver_cc - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (367, 1130) - - - _rotation - 0 - - - gain_mu - 0.05 - - - gain_omega - 0.001 - - - id - digital_mpsk_receiver_cc_0_1_0 - - - w - loop_bw - - - M - 2 - - - fmax - 0.06 - - - maxoutbuf - 0 - - - fmin - -0.06 - - - minoutbuf - 0 - - - mu - 0.5 - - - omega_relative_limit - 0.005 - - - omega - 48000 / 2375.0 - - - theta - 0 - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (247, 3) - - - _rotation - 0 - - - id - fft_len - - - label - - - - short_id - - - - type - intx - - - value - 1024*40 - - - - fft_vxx - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - fft_size - chan_fft_len - - - forward - False - - - _coordinate - (23, 183) - - - _rotation - 180 - - - id - fft_vxx_1_1 - - - type - complex - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - nthreads - 1 - - - shift - True - - - window - [] - - - - freq_xlating_fir_filter_xxx - - alias - - - - center_freq - 57e3 - - - comment - - - - affinity - - - - decim - audio_decim - - - _enabled - 1 - - - _coordinate - (463, 231) - - - _rotation - 270 - - - id - freq_xlating_fir_filter_xxx_1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - samp_rate - baseband_rate - - - taps - firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING) - - - type - fcc - - - - freq_xlating_fir_filter_xxx - - alias - - - - center_freq - 66.5e3 - - - comment - - - - affinity - - - - decim - audio_decim - - - _enabled - 0 - - - _coordinate - (175, 615) - - - _rotation - 270 - - - id - freq_xlating_fir_filter_xxx_1_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - samp_rate - baseband_rate - - - taps - firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING) - - - type - fcc - - - - freq_xlating_fir_filter_xxx - - alias - - - - center_freq - 71.25e3 - - - comment - - - - affinity - - - - decim - audio_decim - - - _enabled - 0 - - - _coordinate - (87, 910) - - - _rotation - 270 - - - id - freq_xlating_fir_filter_xxx_1_1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - samp_rate - baseband_rate - - - taps - firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING) - - - type - fcc - - - - freq_xlating_fir_filter_xxx - - alias - - - - center_freq - 76e3 - - - comment - - - - affinity - - - - decim - audio_decim - - - _enabled - 0 - - - _coordinate - (79, 1150) - - - _rotation - 270 - - - id - freq_xlating_fir_filter_xxx_1_1_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - samp_rate - baseband_rate - - - taps - firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING) - - - type - fcc - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (1056, 100) - - - _rotation - 0 - - - id - log - - - label - - - - short_id - - - - type - - - - value - False - - - - logpwrfft_x - - avg_alpha - 1.0 - - - average - False - - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - fft_size - fft19k_len - - - frame_rate - 30 - - - _coordinate - (1200, 8) - - - _rotation - 0 - - - id - logpwrfft_x_0 - - - type - float - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - ref_scale - 2 - - - sample_rate - baseband_rate - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (742, 71) - - - _rotation - 0 - - - id - loop_bw - - - label - - - - short_id - - - - type - eng_float - - - value - 3.14/150.0 - - - - multirds_pilot_SNR - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 1 - - - _coordinate - (1384, 16) - - - _rotation - 0 - - - id - multirds_pilot_SNR_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - carrier_freq - 19e3 - - - fft_len - fft19k_len - - - gap_width - 4e3 - - - msg_adr - 3 - - - samp_rate - baseband_rate - - - update_period - 0.4 - - - - multirds_rds_decoder - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 0 - - - _coordinate - (918, 587) - - - _rotation - 0 - - - id - multirds_rds_decoder_3 - - - log - False - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - multirds_rds_decoder - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 0 - - - _coordinate - (670, 690) - - - _rotation - 0 - - - id - multirds_rds_decoder_3_0 - - - log - True - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - multirds_rds_decoder - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 0 - - - _coordinate - (638, 954) - - - _rotation - 0 - - - id - multirds_rds_decoder_3_1 - - - log - True - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - multirds_rds_decoder - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 0 - - - _coordinate - (631, 1186) - - - _rotation - 0 - - - id - multirds_rds_decoder_3_1_0 - - - log - True - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - multirds_rds_decoder_redsea - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 1 - - - _coordinate - (1032, 532) - - - _rotation - 0 - - - id - multirds_rds_decoder_redsea_0 - - - log - False - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - multirds_symbol_combiner - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (1304, 260) - - - _rotation - 0 - - - id - multirds_symbol_combiner_0 - - - log - False - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - threshold - 1 - - - min_diff - 0.2 - - - - multirds_symbol_combiner - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (878, 650) - - - _rotation - 0 - - - id - multirds_symbol_combiner_0_0 - - - log - log - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - threshold - 0.25 - - - min_diff - 0.2 - - - - multirds_symbol_combiner - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (958, 914) - - - _rotation - 0 - - - id - multirds_symbol_combiner_0_1 - - - log - log - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - threshold - 0.25 - - - min_diff - 0.2 - - - - multirds_symbol_combiner - - alias - - - - comment - - - - affinity - - - - _enabled - 0 - - - _coordinate - (950, 1146) - - - _rotation - 0 - - - id - multirds_symbol_combiner_0_1_0 - - - log - log - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - threshold - 0.25 - - - min_diff - 0.2 - - - - multirds_vector_cutter - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - _coordinate - (39, 283) - - - _rotation - 0 - - - id - multirds_vector_cutter_0_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - cutpoint - cutpoint - - - insize - fft_len - - - zero_len - num_zeros - - - outsize - chan_fft_len - - - pad_out - False - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (159, 467) - - - _rotation - 0 - - - id - num_zeros - - - label - - - - short_id - - - - type - intx - - - value - 128 - - - - pad_sink - - comment - - - - _enabled - True - - - _coordinate - (544, 100) - - - _rotation - 0 - - - id - pad_sink_0 - - - type - float - - - label - audio - - - num_streams - 1 - - - optional - True - - - vlen - 1 - - - - pad_sink - - comment - - - - _enabled - 1 - - - _coordinate - (1624, 516) - - - _rotation - 0 - - - id - pad_sink_0_0 - - - type - message - - - label - rds - - - num_streams - 1 - - - optional - True - - - vlen - 1 - - - - pad_sink - - comment - - - - _enabled - True - - - _coordinate - (319, 243) - - - _rotation - 0 - - - id - pad_sink_0_1 - - - type - complex - - - label - out - - - num_streams - 1 - - - optional - True - - - vlen - 1 - - - - pad_sink - - comment - - - - _enabled - 1 - - - _coordinate - (934, 123) - - - _rotation - 0 - - - id - pad_sink_1 - - - type - complex - - - label - psk_out - - - num_streams - 1 - - - optional - True - - - vlen - 1 - - - - pad_source - - comment - - - - _enabled - True - - - _coordinate - (15, 427) - - - _rotation - 0 - - - id - pad_source_0 - - - label - in - - - num_streams - 1 - - - optional - False - - - type - complex - - - vlen - fft_len - - - - rational_resampler_xxx - - alias - - - - comment - firdes.low_pass(1.0,chan_rate,250e3,50e3,firdes.WIN_HAMMING) - - - affinity - - - - decim - chan_rate/120000 - - - _enabled - 2 - - - fbw - 0 - - - _coordinate - (167, 135) - - - _rotation - 0 - - - id - rational_resampler_xxx_0 - - - interp - baseband_rate*2/120000 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - taps - - - - type - ccc - - - - root_raised_cosine_filter - - alpha - 1 - - - alias - - - - comment - - - - affinity - - - - decim - 1 - - - _enabled - 1 - - - type - fir_filter_ccf - - - _coordinate - (551, 207) - - - _rotation - 90 - - - gain - 1 - - - id - root_raised_cosine_filter_0 - - - interp - 1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - ntaps - 100 - - - samp_rate - audio_rate - - - sym_rate - 2375 - - - - root_raised_cosine_filter - - alpha - 1 - - - alias - - - - comment - - - - affinity - - - - decim - 1 - - - _enabled - 0 - - - type - fir_filter_ccf - - - _coordinate - (271, 607) - - - _rotation - 90 - - - gain - 1 - - - id - root_raised_cosine_filter_0_0 - - - interp - 1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - ntaps - 100 - - - samp_rate - audio_rate - - - sym_rate - 2375 - - - - root_raised_cosine_filter - - alpha - 1 - - - alias - - - - comment - - - - affinity - - - - decim - 1 - - - _enabled - 0 - - - type - fir_filter_ccf - - - _coordinate - (199, 902) - - - _rotation - 90 - - - gain - 1 - - - id - root_raised_cosine_filter_0_1 - - - interp - 1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - ntaps - 100 - - - samp_rate - audio_rate - - - sym_rate - 2375 - - - - root_raised_cosine_filter - - alpha - 1 - - - alias - - - - comment - - - - affinity - - - - decim - 1 - - - _enabled - 0 - - - type - fir_filter_ccf - - - _coordinate - (191, 1142) - - - _rotation - 90 - - - gain - 1 - - - id - root_raised_cosine_filter_0_1_0 - - - interp - 1 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - ntaps - 100 - - - samp_rate - audio_rate - - - sym_rate - 2375 - - - - parameter - - alias - - - - comment - - - - _enabled - True - - - _coordinate - (239, 83) - - - _rotation - 0 - - - id - samp_rate - - - label - - - - short_id - - - - type - intx - - - value - 19200000 - - - - analog_wfm_rcv_0_0 - blocks_file_sink_0 - 0 - 0 - - - analog_wfm_rcv_0_0 - freq_xlating_fir_filter_xxx_1 - 0 - 0 - - - analog_wfm_rcv_0_0 - freq_xlating_fir_filter_xxx_1_0 - 0 - 0 - - - analog_wfm_rcv_0_0 - freq_xlating_fir_filter_xxx_1_1 - 0 - 0 - - - analog_wfm_rcv_0_0 - freq_xlating_fir_filter_xxx_1_1_0 - 0 - 0 - - - analog_wfm_rcv_0_0 - logpwrfft_x_0 - 0 - 0 - - - analog_wfm_rcv_0_0 - pad_sink_0 - 0 - 0 - - - blocks_complex_to_real_0 - blocks_file_sink_0_0 - 0 - 0 - - - blocks_complex_to_real_0 - blocks_keep_one_in_n_0 - 0 - 0 - - - blocks_complex_to_real_0 - multirds_symbol_combiner_0 - 0 - 0 - - - blocks_complex_to_real_0_0 - multirds_symbol_combiner_0_0 - 0 - 0 - - - blocks_complex_to_real_0_1 - multirds_symbol_combiner_0_1 - 0 - 0 - - - blocks_complex_to_real_0_1_0 - multirds_symbol_combiner_0_1_0 - 0 - 0 - - - blocks_keep_one_in_n_0 - blocks_file_sink_0_0_0 - 0 - 0 - - - blocks_keep_one_in_n_0 - digital_binary_slicer_fb_0 - 0 - 0 - - - blocks_null_source_0 - multirds_rds_decoder_3 - 0 - 0 - - - blocks_vector_to_stream_0_0_1 - rational_resampler_xxx_0 - 0 - 0 - - - digital_binary_slicer_fb_0 - digital_diff_decoder_bb_0 - 0 - 0 - - - digital_binary_slicer_fb_0_0 - digital_diff_decoder_bb_0_0 - 0 - 0 - - - digital_binary_slicer_fb_0_1 - digital_diff_decoder_bb_0_1 - 0 - 0 - - - digital_binary_slicer_fb_0_1_0 - digital_diff_decoder_bb_0_1_0 - 0 - 0 - - - digital_clock_recovery_mm_xx_0 - blocks_complex_to_real_0 - 0 - 0 - - - digital_clock_recovery_mm_xx_0 - pad_sink_1 - 0 - 0 - - - digital_costas_loop_cc_0 - digital_clock_recovery_mm_xx_0 - 0 - 0 - - - digital_diff_decoder_bb_0 - multirds_rds_decoder_3 - 0 - 0 - - - digital_diff_decoder_bb_0 - multirds_rds_decoder_redsea_0 - 0 - 0 - - - digital_diff_decoder_bb_0_0 - multirds_rds_decoder_3_0 - 0 - 0 - - - digital_diff_decoder_bb_0_1 - multirds_rds_decoder_3_1 - 0 - 0 - - - digital_diff_decoder_bb_0_1_0 - multirds_rds_decoder_3_1_0 - 0 - 0 - - - digital_mpsk_receiver_cc_0 - blocks_complex_to_real_0 - 0 - 0 - - - digital_mpsk_receiver_cc_0 - pad_sink_1 - 0 - 0 - - - digital_mpsk_receiver_cc_0_0 - blocks_complex_to_real_0_0 - 0 - 0 - - - digital_mpsk_receiver_cc_0_0 - blocks_null_sink_0 - 0 - 0 - - - digital_mpsk_receiver_cc_0_1 - blocks_complex_to_real_0_1 - 0 - 0 - - - digital_mpsk_receiver_cc_0_1_0 - blocks_complex_to_real_0_1_0 - 0 - 0 - - - fft_vxx_1_1 - blocks_vector_to_stream_0_0_1 - 0 - 0 - - - freq_xlating_fir_filter_xxx_1 - root_raised_cosine_filter_0 - 0 - 0 - - - freq_xlating_fir_filter_xxx_1_0 - root_raised_cosine_filter_0_0 - 0 - 0 - - - freq_xlating_fir_filter_xxx_1_1 - root_raised_cosine_filter_0_1 - 0 - 0 - - - freq_xlating_fir_filter_xxx_1_1_0 - root_raised_cosine_filter_0_1_0 - 0 - 0 - - - logpwrfft_x_0 - multirds_pilot_SNR_0 - 0 - 0 - - - multirds_pilot_SNR_0 - pad_sink_0_0 - out - in - - - multirds_rds_decoder_3 - multirds_symbol_combiner_0 - out - ctrl - - - multirds_rds_decoder_3 - pad_sink_0_0 - out - in - - - multirds_rds_decoder_3_0 - multirds_symbol_combiner_0_0 - out - ctrl - - - multirds_rds_decoder_3_1 - multirds_symbol_combiner_0_1 - out - ctrl - - - multirds_rds_decoder_3_1_0 - multirds_symbol_combiner_0_1_0 - out - ctrl - - - multirds_rds_decoder_redsea_0 - multirds_symbol_combiner_0 - out - ctrl - - - multirds_rds_decoder_redsea_0 - pad_sink_0_0 - out - in - - - multirds_symbol_combiner_0 - pad_sink_0_0 - ctrl - in - - - multirds_symbol_combiner_0 - blocks_file_sink_0_0_0 - 0 - 0 - - - multirds_symbol_combiner_0 - digital_binary_slicer_fb_0 - 0 - 0 - - - multirds_symbol_combiner_0_0 - digital_binary_slicer_fb_0_0 - 0 - 0 - - - multirds_symbol_combiner_0_1 - digital_binary_slicer_fb_0_1 - 0 - 0 - - - multirds_symbol_combiner_0_1_0 - digital_binary_slicer_fb_0_1_0 - 0 - 0 - - - multirds_vector_cutter_0_0 - fft_vxx_1_1 - 0 - 0 - - - pad_source_0 - multirds_vector_cutter_0_0 - 0 - 0 - - - rational_resampler_xxx_0 - analog_wfm_rcv_0_0 - 0 - 0 - - - rational_resampler_xxx_0 - pad_sink_0_1 - 0 - 0 - - - root_raised_cosine_filter_0 - digital_costas_loop_cc_0 - 0 - 0 - - - root_raised_cosine_filter_0 - digital_mpsk_receiver_cc_0 - 0 - 0 - - - root_raised_cosine_filter_0_0 - digital_mpsk_receiver_cc_0_0 - 0 - 0 - - - root_raised_cosine_filter_0_1 - digital_mpsk_receiver_cc_0_1 - 0 - 0 - - - root_raised_cosine_filter_0_1_0 - digital_mpsk_receiver_cc_0_1_0 - 0 - 0 - - +options: + parameters: + author: '' + category: '[GRC Hier Blocks]' + cmake_opt: '' + comment: '' + copyright: '' + description: '' + gen_cmake: 'On' + gen_linking: dynamic + generate_options: hb + hier_block_src_path: '.:' + id: hier_ifft_decoder + 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: '' + window_size: 2000,2000 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [8, 8] + rotation: 0 + state: enabled + +blocks: +- name: audio_decim + id: variable + parameters: + comment: '' + value: '5' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [646, 3] + rotation: 0 + state: enabled +- name: audio_rate + id: variable + parameters: + comment: '' + value: '48000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [870, 3] + rotation: 0 + state: enabled +- name: baseband_rate + id: variable + parameters: + comment: '' + value: audio_rate*audio_decim + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [359, 347] + rotation: 0 + state: enabled +- name: bb_decim + id: variable + parameters: + comment: '' + value: '2' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [766, 3] + rotation: 0 + state: enabled +- name: chan_rate + id: variable + parameters: + comment: '' + value: audio_rate*audio_decim*bb_decim + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [247, 395] + rotation: 0 + state: enabled +- name: chan_rate + id: variable + parameters: + comment: '' + value: int(600e3) + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [335, 419] + rotation: 0 + state: disabled +- name: fft19k_len + id: variable + parameters: + comment: '' + value: '2048' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1152, 132] + rotation: 0 + state: enabled +- name: analog_wfm_rcv_0_0 + id: analog_wfm_rcv + parameters: + affinity: '' + alias: '' + audio_decimation: bb_decim + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + quad_rate: 2*baseband_rate + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [359, 155] + rotation: 0 + state: enabled +- name: blocks_complex_to_real_0 + id: blocks_complex_to_real + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1128, 240.0] + rotation: 0 + state: disabled +- name: blocks_file_sink_0 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: '"/tmp/cr/fm_dec_240k_"+str(cutpoint)' + type: float + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [718, 355] + rotation: 0 + state: disabled +- name: blocks_file_sink_0_0 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: '"/tmp/cr/psk_out_2375_"+str(cutpoint)' + type: float + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1152, 340.0] + rotation: 0 + state: disabled +- name: blocks_file_sink_0_0_0 + id: blocks_file_sink + parameters: + affinity: '' + alias: '' + append: 'False' + comment: '' + file: '"/tmp/cr/symbol_combiner_out_"+str(cutpoint)' + type: float + unbuffered: 'False' + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1368, 444.0] + rotation: 0 + state: disabled +- name: blocks_keep_one_in_n_0 + id: blocks_keep_one_in_n + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + n: '2' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1376, 360.0] + rotation: 0 + state: disabled +- name: blocks_vector_to_stream_0_0_1 + id: blocks_vector_to_stream + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + num_items: chan_fft_len + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [31, 139] + rotation: 0 + state: enabled +- name: chan_fft_len + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: intx + value: '512' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [343, 3] + rotation: 0 + state: enabled +- name: cutpoint + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: intx + value: '0' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [408, 76.0] + rotation: 0 + state: enabled +- name: digital_binary_slicer_fb_0 + id: digital_binary_slicer_fb + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1112, 480.0] + rotation: 180 + state: disabled +- name: digital_clock_recovery_mm_xx_0 + id: digital_clock_recovery_mm_xx + parameters: + affinity: '' + alias: '' + comment: '' + gain_mu: '0.050' + gain_omega: '0.001' + maxoutbuf: '0' + minoutbuf: '0' + mu: '0.5' + omega: audio_rate / 2375.0 + omega_relative_limit: '0.005' + type: complex + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [888, 204.0] + rotation: 0 + state: disabled +- name: digital_costas_loop_cc_0 + id: digital_costas_loop_cc + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + order: '2' + use_snr: 'False' + w: loop_bw + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [704, 160.0] + rotation: 0 + state: disabled +- name: digital_diff_decoder_bb_0 + id: digital_diff_decoder_bb + parameters: + affinity: '' + alias: '' + comment: '' + maxoutbuf: '0' + minoutbuf: '0' + modulus: '2' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [920, 476.0] + rotation: 180 + state: disabled +- name: fft_len + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: intx + value: 1024*40 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [247, 3] + rotation: 0 + state: enabled +- name: fft_vxx_1_1 + id: fft_vxx + parameters: + affinity: '' + alias: '' + comment: '' + fft_size: chan_fft_len + forward: 'False' + maxoutbuf: '0' + minoutbuf: '0' + nthreads: '1' + shift: 'True' + type: complex + window: '[]' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [64, 204.0] + rotation: 180 + state: enabled +- name: freq_xlating_fir_filter_xxx_1 + id: freq_xlating_fir_filter_xxx + parameters: + affinity: '' + alias: '' + center_freq: 57e3 + comment: '' + decim: audio_decim + maxoutbuf: '0' + minoutbuf: '0' + samp_rate: baseband_rate + taps: firdes.low_pass(2500.0,baseband_rate,2.4e3,2e3,firdes.WIN_HAMMING) + type: fcc + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [463, 231] + rotation: 270 + state: disabled +- name: log + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: '' + value: 'False' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1056, 100] + rotation: 0 + state: enabled +- name: logpwrfft_x_0 + id: logpwrfft_x + parameters: + affinity: '' + alias: '' + average: 'False' + avg_alpha: '1.0' + comment: '' + fft_size: fft19k_len + frame_rate: '30' + maxoutbuf: '0' + minoutbuf: '0' + ref_scale: '2' + sample_rate: baseband_rate + type: float + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1200, 8] + rotation: 0 + state: enabled +- name: loop_bw + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: eng_float + value: 3.14/150.0 + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [742, 71] + rotation: 0 + state: enabled +- name: multirds_pilot_SNR_0 + id: multirds_pilot_SNR + parameters: + affinity: '' + alias: '' + carrier_freq: 19e3 + comment: '' + debug: 'False' + fft_len: fft19k_len + gap_width: 4e3 + maxoutbuf: '0' + minoutbuf: '0' + msg_adr: '3' + samp_rate: baseband_rate + update_period: '0.4' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1384, 16] + rotation: 0 + state: enabled +- name: multirds_rds_decoder_redsea_0 + id: multirds_rds_decoder_redsea + parameters: + affinity: '' + alias: '' + comment: '' + debug: 'False' + log: 'False' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1136, 548.0] + rotation: 0 + state: disabled +- name: multirds_symbol_combiner_0 + id: multirds_symbol_combiner + parameters: + affinity: '' + alias: '' + comment: '' + log: 'False' + maxoutbuf: '0' + min_diff: '0.2' + minoutbuf: '0' + threshold: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1376, 260.0] + rotation: 0 + state: disabled +- name: multirds_vector_cutter_0_0 + id: multirds_vector_cutter + parameters: + affinity: '' + alias: '' + comment: '' + cutpoint: cutpoint + insize: fft_len + maxoutbuf: '0' + minoutbuf: '0' + outsize: chan_fft_len + pad_out: 'False' + zero_len: num_zeros + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [160, 328.0] + rotation: 0 + state: enabled +- name: num_zeros + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: intx + value: '128' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [159, 467] + rotation: 0 + state: enabled +- name: pad_sink_0 + id: pad_sink + parameters: + affinity: '' + alias: '' + comment: '' + label: audio + num_streams: '1' + optional: 'True' + type: float + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [600, 100.0] + rotation: 0 + state: enabled +- name: pad_sink_0_0 + id: pad_sink + parameters: + affinity: '' + alias: '' + comment: '' + label: rds + num_streams: '1' + optional: 'True' + type: message + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [1624, 516] + rotation: 0 + state: enabled +- name: pad_sink_0_1 + id: pad_sink + parameters: + affinity: '' + alias: '' + comment: '' + label: out + num_streams: '1' + optional: 'True' + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [336, 260.0] + rotation: 0 + state: enabled +- name: pad_sink_1 + id: pad_sink + parameters: + affinity: '' + alias: '' + comment: '' + label: psk_out + num_streams: '1' + optional: 'True' + type: complex + vlen: '1' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [934, 123] + rotation: 0 + state: enabled +- name: pad_source_0 + id: pad_source + parameters: + affinity: '' + alias: '' + comment: '' + label: in + maxoutbuf: '0' + minoutbuf: '0' + num_streams: '1' + optional: 'False' + type: complex + vlen: fft_len + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [16, 412.0] + rotation: 0 + state: enabled +- name: rational_resampler_xxx_0 + id: rational_resampler_xxx + parameters: + affinity: '' + alias: '' + comment: firdes.low_pass(1.0,chan_rate,250e3,50e3,firdes.WIN_HAMMING) + decim: int(chan_rate/120000) + fbw: '0' + interp: int(baseband_rate*2/120000) + maxoutbuf: '0' + minoutbuf: '0' + taps: '' + type: ccc + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [184, 92.0] + rotation: 0 + state: bypassed +- name: root_raised_cosine_filter_0 + id: root_raised_cosine_filter + parameters: + affinity: '' + alias: '' + alpha: '1' + comment: '' + decim: '1' + gain: '1' + interp: '1' + maxoutbuf: '0' + minoutbuf: '0' + ntaps: '100' + samp_rate: audio_rate + sym_rate: '2375' + type: fir_filter_ccf + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [551, 207] + rotation: 90 + state: disabled +- name: samp_rate + id: parameter + parameters: + alias: '' + comment: '' + hide: none + label: '' + short_id: '' + type: intx + value: '19200000' + states: + bus_sink: false + bus_source: false + bus_structure: null + coordinate: [472, 4.0] + rotation: 0 + state: enabled + +connections: +- [analog_wfm_rcv_0_0, '0', blocks_file_sink_0, '0'] +- [analog_wfm_rcv_0_0, '0', freq_xlating_fir_filter_xxx_1, '0'] +- [analog_wfm_rcv_0_0, '0', logpwrfft_x_0, '0'] +- [analog_wfm_rcv_0_0, '0', pad_sink_0, '0'] +- [blocks_complex_to_real_0, '0', blocks_file_sink_0_0, '0'] +- [blocks_complex_to_real_0, '0', blocks_keep_one_in_n_0, '0'] +- [blocks_complex_to_real_0, '0', multirds_symbol_combiner_0, '0'] +- [blocks_keep_one_in_n_0, '0', blocks_file_sink_0_0_0, '0'] +- [blocks_keep_one_in_n_0, '0', digital_binary_slicer_fb_0, '0'] +- [blocks_vector_to_stream_0_0_1, '0', rational_resampler_xxx_0, '0'] +- [digital_binary_slicer_fb_0, '0', digital_diff_decoder_bb_0, '0'] +- [digital_clock_recovery_mm_xx_0, '0', blocks_complex_to_real_0, '0'] +- [digital_clock_recovery_mm_xx_0, '0', pad_sink_1, '0'] +- [digital_costas_loop_cc_0, '0', digital_clock_recovery_mm_xx_0, '0'] +- [digital_diff_decoder_bb_0, '0', multirds_rds_decoder_redsea_0, '0'] +- [fft_vxx_1_1, '0', blocks_vector_to_stream_0_0_1, '0'] +- [freq_xlating_fir_filter_xxx_1, '0', root_raised_cosine_filter_0, '0'] +- [logpwrfft_x_0, '0', multirds_pilot_SNR_0, '0'] +- [multirds_pilot_SNR_0, out, pad_sink_0_0, in] +- [multirds_vector_cutter_0_0, '0', fft_vxx_1_1, '0'] +- [pad_source_0, '0', multirds_vector_cutter_0_0, '0'] +- [rational_resampler_xxx_0, '0', analog_wfm_rcv_0_0, '0'] +- [rational_resampler_xxx_0, '0', pad_sink_0_1, '0'] +- [root_raised_cosine_filter_0, '0', digital_costas_loop_cc_0, '0'] + +metadata: + file_format: 1 diff --git a/apps/read_sync_decim.grc b/apps/read_sync_decim.grc deleted file mode 100644 index 9700c04..0000000 --- a/apps/read_sync_decim.grc +++ /dev/null @@ -1,1005 +0,0 @@ - - - - Fri Apr 28 11:07:37 2017 - - options - - author - - - - window_size - - - - category - [GRC Hier Blocks] - - - comment - - - - description - - - - _enabled - True - - - _coordinate - (8, 8) - - - _rotation - 0 - - - generate_options - qt_gui - - - hier_block_src_path - .: - - - id - top_block - - - max_nouts - 0 - - - qt_qss_theme - - - - realtime_scheduling - - - - run_command - {python} -u {filename} - - - run_options - prompt - - - run - True - - - thread_safe_setters - - - - title - - - - - variable_qtgui_range - - comment - SWR3 - - - value - 922e5 - - - _enabled - 0 - - - _coordinate - (479, 0) - - - gui_hint - tabs@0:0,1,1,1 - - - _rotation - 0 - - - id - freq1 - - - label - - - - min_len - 200 - - - orient - Qt.Horizontal - - - start - 86e6 - - - step - 1e5 - - - stop - 108e6 - - - rangeType - float - - - widget - counter_slider - - - - variable - - comment - - - - _enabled - True - - - _coordinate - (846, 247) - - - _rotation - 0 - - - id - freq1 - - - value - 92.2e6 - - - - variable_qtgui_range - - comment - - - - value - 98800000 - - - _enabled - 0 - - - _coordinate - (343, 0) - - - gui_hint - tabs@0:0,0,1,1 - - - _rotation - 0 - - - id - freq_tune - - - label - - - - min_len - 200 - - - orient - Qt.Horizontal - - - start - 86e6 - - - step - 1e5 - - - stop - 108e6 - - - rangeType - float - - - widget - counter_slider - - - - variable - - comment - - - - _enabled - True - - - _coordinate - (822, 151) - - - _rotation - 0 - - - id - freq_tune - - - value - 98.8e6 - - - - variable_qtgui_range - - comment - - - - value - 1200 - - - _enabled - True - - - _coordinate - (718, 0) - - - gui_hint - tabs@0 - - - _rotation - 0 - - - id - samp_rate - - - label - - - - min_len - 200 - - - orient - Qt.Horizontal - - - start - 500 - - - step - 100 - - - stop - 20000 - - - rangeType - float - - - widget - counter_slider - - - - blocks_file_source - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - file - /tmp/cr/rds-rec_sync-decim_170324_weekend/symbol_combiner_out_25941 - - - _coordinate - (63, 131) - - - _rotation - 0 - - - id - blocks_file_source_0 - - - maxoutbuf - 100000 - - - minoutbuf - 10000 - - - type - float - - - repeat - False - - - vlen - 1 - - - - blocks_skiphead - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - _coordinate - (287, 131) - - - _rotation - 0 - - - id - blocks_skiphead_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - num_items - 100000 - - - type - float - - - vlen - 1 - - - - blocks_throttle - - alias - - - - comment - - - - affinity - - - - _enabled - True - - - _coordinate - (455, 131) - - - _rotation - 0 - - - id - blocks_throttle_0 - - - ignoretag - True - - - maxoutbuf - 10 - - - minoutbuf - 0 - - - samples_per_second - samp_rate - - - type - float - - - vlen - 1 - - - - digital_binary_slicer_fb - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (455, 207) - - - _rotation - 180 - - - id - digital_binary_slicer_fb_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - digital_diff_decoder_bb - - alias - - - - comment - - - - affinity - - - - _enabled - 1 - - - _coordinate - (255, 203) - - - _rotation - 180 - - - id - digital_diff_decoder_bb_0 - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - modulus - 2 - - - - epy_block - - alias - - - - _io_cache - ('freq-setter', 'blk', [('freqlist', '[92200000, 94700000, 101300000, 102300000, 105700000, 107700000]')], [], [('out', 'message', None)], 'Embedded Python Block example - a simple multiply const', ['freqlist']) - - - _source_code - """ -Embedded Python Blocks: - -Each time this file is saved, GRC will instantiate the first class it finds -to get ports and parameters of your block. The arguments to __init__ will -be the parameters. All of them are required to have default values! -""" - -import numpy as np -from gnuradio import gr -import pmt -from threading import Timer -#import time -class blk(gr.sync_block): # other base classes are basic_block, decim_block, interp_block - """Embedded Python Block example - a simple multiply const""" - - def __init__(self, freqlist=[92200000,94700000,101300000,102300000,105700000,107700000]): # only default arguments here - """arguments to this function show up as parameters in GRC""" - gr.sync_block.__init__( - self, - name='freq-setter', # will show up in GRC - in_sig=None, - out_sig=None - ) - # if an attribute with the same name as a parameter is found, - # a callback is registered (properties work, too). - self._freqlist=freqlist - self.message_port_register_out(pmt.intern('out')) - self.send_msg() - Timer(3, self.send_msg).start() #after 3 seconds (when table initialized) - #self.time=time.time() - @property - def freqlist(self): - """I'm the 'freqlist' property.""" - return self._freqlist - - @freqlist.setter - def freqlist(self, value): - self._freqlist = value - self.send_msg() - - @freqlist.deleter - def freqlist(self): - del self._freqlist - def send_msg(self): - #print(self.freqlist) - for i,freq in enumerate(self.freqlist): - send_string=str(i+1)+" "+str(freq) - send_pmt = pmt.string_to_symbol(send_string) - self.message_port_pub(pmt.intern('out'), send_pmt) - #def work(self, input_items, output_items): - #print("work") - #now=time.time() - #if now-self.time >2: - #self.time=now - #self.send_msg() - #return len(input_items[0]) - - - comment - - - - _enabled - True - - - freqlist - [freq1] - - - _coordinate - (263, 395) - - - _rotation - 0 - - - id - epy_block_0 - - - - multirds_rds_decoder_redsea - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - True - - - _coordinate - (255, 307) - - - _rotation - 0 - - - id - multirds_rds_decoder_redsea_0 - - - log - False - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - - multirds_rds_parser_table_qt - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - True - - - _coordinate - (503, 351) - - - gui_hint - tabs@0 - - - _rotation - 0 - - - id - multirds_rds_parser_table_qt_0 - - - label - - - - log - True - - - maxoutbuf - 0 - - - minoutbuf - 0 - - - nPorts - 1 - - - freq_tune - freq_tune - - - workdir - /user/wire2/richter/data/ - - - writeDB - True - - - - multirds_tmc_parser - - alias - - - - comment - - - - affinity - - - - debug - False - - - _enabled - 1 - - - _coordinate - (726, 363) - - - gui_hint - tabs@0 - - - _rotation - 0 - - - id - multirds_tmc_parser_0 - - - label - - - - log - False - - - maxheight - 0 - - - workdir - /user/wire2/richter/data/ - - - writeDB - False - - - - qtgui_tab_widget - - alias - - - - comment - - - - _enabled - 1 - - - _coordinate - (0, 355) - - - gui_hint - - - - _rotation - 0 - - - id - tabs - - - label0 - table - - - label1 - graphs - - - label10 - Tab 10 - - - label11 - Tab 11 - - - label12 - Tab 12 - - - label13 - Tab 13 - - - label14 - Tab 14 - - - label15 - Tab 15 - - - label16 - Tab 16 - - - label17 - Tab 17 - - - label18 - Tab 18 - - - label19 - Tab 19 - - - label2 - Tab 2 - - - label3 - Tab 3 - - - label4 - Tab 4 - - - label5 - Tab 5 - - - label6 - Tab 6 - - - label7 - Tab 7 - - - label8 - Tab 8 - - - label9 - Tab 9 - - - num_tabs - 2 - - - - blocks_file_source_0 - blocks_skiphead_0 - 0 - 0 - - - blocks_skiphead_0 - blocks_throttle_0 - 0 - 0 - - - blocks_throttle_0 - digital_binary_slicer_fb_0 - 0 - 0 - - - digital_binary_slicer_fb_0 - digital_diff_decoder_bb_0 - 0 - 0 - - - digital_diff_decoder_bb_0 - multirds_rds_decoder_redsea_0 - 0 - 0 - - - epy_block_0 - multirds_rds_parser_table_qt_0 - out - freq - - - multirds_rds_decoder_redsea_0 - multirds_rds_parser_table_qt_0 - out - in - - - multirds_rds_parser_table_qt_0 - multirds_tmc_parser_0 - tmc_raw - in - - diff --git a/grc/CMakeLists.txt b/grc/CMakeLists.txt index 5a7c7a5..0c291d7 100644 --- a/grc/CMakeLists.txt +++ b/grc/CMakeLists.txt @@ -17,18 +17,18 @@ # the Free Software Foundation, Inc., 51 Franklin Street, # Boston, MA 02110-1301, USA. install(FILES - multirds_rds_table_qt.xml - multirds_rds_parser_table_qt.xml - multirds_rds_decoder.xml - multirds_station_search.xml - multirds_stream_selector.xml - multirds_vector_cutter.xml - multirds_decoder_compare.xml - multirds_symbol_combiner.xml - multirds_rds_decoder_redsea.xml - multirds_qtgui_range.xml - multirds_variable_setter.xml - multirds_tmc_parser.xml - multirds_pilot_SNR.xml - multirds_stream_router.xml DESTINATION share/gnuradio/grc/blocks + multirds_rds_table_qt.block.yml + multirds_rds_parser_table_qt.block.yml + multirds_rds_decoder.block.yml + multirds_station_search.block.yml + multirds_stream_selector.block.yml + multirds_vector_cutter.block.yml + multirds_decoder_compare.block.yml + multirds_symbol_combiner.block.yml + multirds_rds_decoder_redsea.block.yml + multirds_variable_setter.block.yml + multirds_tmc_parser.block.yml + multirds_pilot_SNR.block.yml + multirds_stream_router.block.yml + DESTINATION share/gnuradio/grc/blocks ) diff --git a/grc/multirds_decoder_compare.block.yml b/grc/multirds_decoder_compare.block.yml new file mode 100644 index 0000000..53045a9 --- /dev/null +++ b/grc/multirds_decoder_compare.block.yml @@ -0,0 +1,25 @@ +# auto-generated by grc.converter + +id: multirds_decoder_compare +label: decoder_compare +category: '[multirds]' + +parameters: +- id: nPorts + label: Number of Ports + dtype: int + default: '2' + hide: part + +inputs: +- domain: message + id: in + multiplicity: ${ nPorts } +asserts: +- ${ nPorts > 0 } + +templates: + imports: import multirds + make: multirds.decoder_compare(${nPorts}) + +file_format: 1 diff --git a/grc/multirds_decoder_compare.xml b/grc/multirds_decoder_compare.xml deleted file mode 100644 index 0d89b31..0000000 --- a/grc/multirds_decoder_compare.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - decoder_compare - multirds_decoder_compare - [multirds] - import multirds - multirds.decoder_compare($nPorts) - - - Number of Ports - nPorts - 2 - int - part - - - $nPorts > 0 - - in - message - $nPorts - - - diff --git a/grc/multirds_pilot_SNR.block.yml b/grc/multirds_pilot_SNR.block.yml new file mode 100644 index 0000000..fec7ca3 --- /dev/null +++ b/grc/multirds_pilot_SNR.block.yml @@ -0,0 +1,57 @@ +# auto-generated by grc.converter + +id: multirds_pilot_SNR +label: pilot_SNR +category: '[multirds]' + +parameters: +- id: debug + label: Debug + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] +- id: carrier_freq + label: carrier_freq + dtype: float + default: 19e3 +- id: gap_width + label: gap_width + dtype: float + default: 4e3 +- id: update_period + label: update_period + dtype: float + default: '0.2' +- id: samp_rate + label: samp_rate + dtype: int + default: '240000' +- id: fft_len + label: fft_len + dtype: int + default: '2048' +- id: msg_adr + label: msg_adr + dtype: int + default: '3' + +inputs: +- domain: stream + dtype: float + vlen: ${ fft_len } + +outputs: +- domain: message + id: out + optional: true + +templates: + imports: import multirds + make: multirds.pilot_SNR(${debug}, ${samp_rate}, ${fft_len}, ${carrier_freq},${gap_width}, + ${msg_adr},${update_period}) + +documentation: |- + outputs PMT pair of longs (msg_adr . SNR) SNR is calculated as difference (in dB) between the 19k carrier power and the average power between carrier_freq-gap_width and carrier_freq+gap_width \ + +file_format: 1 diff --git a/grc/multirds_pilot_SNR.xml b/grc/multirds_pilot_SNR.xml deleted file mode 100644 index 4831cc9..0000000 --- a/grc/multirds_pilot_SNR.xml +++ /dev/null @@ -1,84 +0,0 @@ - - - pilot_SNR - multirds_pilot_SNR - [multirds] - import multirds - multirds.pilot_SNR($debug, $samp_rate, $fft_len, $carrier_freq,$gap_width, $msg_adr,$update_period) - - - Debug - debug - False - bool - - - - - carrier_freq - carrier_freq - 19e3 - float - - - gap_width - gap_width - 4e3 - float - - - update_period - update_period - 0.2 - float - - - samp_rate - samp_rate - 240000 - int - - - fft_len - fft_len - 2048 - int - - - msg_adr - msg_adr - 3 - int - - - - in - float - $fft_len - - - out - message - 1 - - outputs PMT pair of longs (msg_adr . SNR) \ - SNR is calculated as difference (in dB)\ - between the 19k carrier power and the \ - average power between carrier_freq-gap_width and carrier_freq+gap_width \ - - - diff --git a/grc/multirds_qtgui_range.xml b/grc/multirds_qtgui_range.xml deleted file mode 100644 index 651333f..0000000 --- a/grc/multirds_qtgui_range.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - qtgui_range (cr) - variable_multirds_qtgui_range - [multirds] - import multirds - from multirds.qtgui_range import qtgui_range, RangeWidget - self.$(id) = $(id) = $value - #set $win = 'self._%s_win'%$id - #set $range = 'self.%s_range'%$id -#if not $label() - #set $label = '"%s"'%$id -#end if -$(range) = qtgui_range($start, $stop, $step, $value, $min_len) -$(win) = RangeWidget($range, self.set_$(id), $label, "$widget", $rangeType) -$(gui_hint()($win)) - - - - - - - - Label - label - - string - #if $label() then 'none' else 'part'# - - - - Type - rangeType - "float" - enum - part - - - - - - Default Value - value - 50 - $rangeType.type - - - - Start - start - 0 - $rangeType.type - - - - Stop - stop - 100 - $rangeType.type - - - - Step - step - 1 - $rangeType.type - - - - Widget - widget - counter_slider - enum - part - - - - - - - - Orientation - orient - Qt.Horizontal - enum - #if $widget() == "slider" then 'part' else 'all'# - - - - - - Minimum Length - min_len - 200 - int - part - - - - - GUI Hint - gui_hint - - gui_hint - part - - - $start <= $value <= $stop - $start < $stop - - - This block creates a variable with a slider. \ - Leave the label blank to use the variable id as the label. \ - The value must be a real number. \ - The value must be between the start and the stop. - - The GUI hint can be used to position the widget within the application. \ - The hint is of the form [tab_id@tab_index]: [row, col, row_span, col_span]. \ - Both the tab specification and the grid position are optional. - - diff --git a/grc/multirds_rds_decoder.block.yml b/grc/multirds_rds_decoder.block.yml new file mode 100644 index 0000000..770f34d --- /dev/null +++ b/grc/multirds_rds_decoder.block.yml @@ -0,0 +1,23 @@ +# auto-generated by grc.converter + +id: multirds_rds_decoder +label: Rds decoder +category: '[MULTIRDS]' + +parameters: +- id: log + label: Log + dtype: raw +- id: debug + label: Debug + dtype: raw + +inputs: +- domain: stream + dtype: byte + +templates: + imports: import multirds + make: multirds.rds_decoder(${log}, ${debug}) + +file_format: 1 diff --git a/grc/multirds_rds_decoder.xml b/grc/multirds_rds_decoder.xml deleted file mode 100644 index 08e355a..0000000 --- a/grc/multirds_rds_decoder.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - RDS Decoder (cr) - multirds_rds_decoder - [multirds] - import multirds - multirds.rds_decoder($log, $debug) - - Log - log - False - bool - - - - - Debug - debug - False - bool - - - - - in - byte - - - out - message - 1 - - diff --git a/grc/multirds_rds_decoder_redsea.block.yml b/grc/multirds_rds_decoder_redsea.block.yml new file mode 100644 index 0000000..e6c4c0c --- /dev/null +++ b/grc/multirds_rds_decoder_redsea.block.yml @@ -0,0 +1,23 @@ +# auto-generated by grc.converter + +id: multirds_rds_decoder_redsea +label: Rds decoder redsea +category: '[MULTIRDS]' + +parameters: +- id: log + label: Log + dtype: raw +- id: debug + label: Debug + dtype: raw + +inputs: +- domain: stream + dtype: byte + +templates: + imports: import multirds + make: multirds.rds_decoder_redsea(${log}, ${debug}) + +file_format: 1 diff --git a/grc/multirds_rds_decoder_redsea.xml b/grc/multirds_rds_decoder_redsea.xml deleted file mode 100644 index f766b6a..0000000 --- a/grc/multirds_rds_decoder_redsea.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - RDS Decoder (redsea) - multirds_rds_decoder_redsea - [multirds] - import multirds - multirds.rds_decoder_redsea($log, $debug) - - Log - log - False - bool - - - - - Debug - debug - False - bool - - - - - in - byte - - - out - message - 1 - - diff --git a/grc/multirds_rds_parser_table_qt.block.yml b/grc/multirds_rds_parser_table_qt.block.yml new file mode 100644 index 0000000..8a91fbf --- /dev/null +++ b/grc/multirds_rds_parser_table_qt.block.yml @@ -0,0 +1,86 @@ +# auto-generated by grc.converter + +id: multirds_rds_parser_table_qt +label: RDS Parser Table (qt) +category: '[multirds]' + +parameters: +- id: freq_tune + label: tuned frequency + dtype: float +- id: label + label: Label + dtype: string + hide: ${ ('none' if label else 'part') } +- id: workdir + label: work directory + dtype: string + hide: part +- id: gui_hint + label: GUI Hint + dtype: gui_hint + hide: part +- id: nPorts + label: Number of Ports + dtype: int + default: '2' + hide: part +- id: log + label: Log + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] +- id: debug + label: Debug + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] +- id: writeDB + label: write Database + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] + +inputs: +- domain: message + id: in + multiplicity: ${ nPorts } +- domain: message + id: freq + optional: true + +outputs: +- domain: message + id: ctrl + optional: true +- domain: message + id: tmc_raw + optional: true +asserts: +- ${ open(workdir+"pty-list.csv").close() or True } +- ${ open(workdir+"directory_writable","w").close() or True } +- ${ nPorts > 0 } + +templates: + imports: |- + import multirds + from multirds.rds_parser_table_qt import rds_parser_table_qt, rds_parser_table_qt_Widget,rds_parser_table_qt_Signals + make: "<% win = 'self._%s_win'%id %>\n\t\t<% signals = 'self._%s_signals'%id %>\n\ + % if not label:\n\t<% label = '\"%s\"'%id %>\n% endif\n${signals} = rds_parser_table_qt_Signals()\n\ + self.${id} = multirds.rds_parser_table_qt(${signals},${nPorts},self.set_${freq_tune},${freq_tune},${log},\ + \ ${debug},${workdir},${writeDB})\n${win} = rds_parser_table_qt_Widget(${signals},\ + \ ${label},self.${id})\n${gui_hint(in)}" + callbacks: + - set_freq_tune(${freq_tune}); + +documentation: "show RDS data from multiple stations in QT table input: raw group\ + \ data (array of ints) 4x2 raw block data, 4x1 offset chars, 1x1 number of valid\ + \ blocks (of last 50) [block1_upper,block1_lower,block2_upper,block2_lower,...,offset1,offset2,offset3,offset4,numerrors]\\\ + \ \n The GUI hint can be used to position the widget within the application.\ + \ The hint is of the form \"tab_id@tab_index: row, col, row_span, col_span\"\ + \ Both the tab specification and the grid position are optional." + +file_format: 1 diff --git a/grc/multirds_rds_parser_table_qt.xml b/grc/multirds_rds_parser_table_qt.xml deleted file mode 100644 index e41f884..0000000 --- a/grc/multirds_rds_parser_table_qt.xml +++ /dev/null @@ -1,141 +0,0 @@ - - - RDS Parser Table (qt) - multirds_rds_parser_table_qt - [multirds] - import multirds - from multirds.rds_parser_table_qt import rds_parser_table_qt, rds_parser_table_qt_Widget,rds_parser_table_qt_Signals - - #set $win = 'self._%s_win'%$id - #set $signals = 'self._%s_signals'%$id -#if not $label() - #set $label = '"%s"'%$id -#end if -$(signals) = rds_parser_table_qt_Signals() -self.$(id) = multirds.rds_parser_table_qt($(signals),$nPorts,self.set_$(freq_tune),$freq_tune,$log, $debug,$workdir,$writeDB) -$(win) = rds_parser_table_qt_Widget($signals, $label,self.$(id)) -$(gui_hint()($win)) - set_freq_tune($freq_tune); - - tuned frequency - freq_tune - - float - - - Label - label - - string - #if $label() then 'none' else 'part'# - - - work directory - workdir - - string - part - - - GUI Hint - gui_hint - - gui_hint - part - - - Number of Ports - nPorts - 2 - int - part - - - Log - log - False - bool - - - - - Debug - debug - False - bool - - - - - write Database - writeDB - False - bool - - - - - - - open($workdir+"pty-list.csv").close() or True - - open($workdir+"directory_writable","w").close() or True - $nPorts > 0 - - in - message - $nPorts - - - - freq - message - 1 - - - ctrl - message - 1 - - - tmc_raw - message - 1 - - show RDS data from multiple stations in QT table \ - input: raw group data (array of ints) \ - 4x2 raw block data, 4x1 offset chars, 1x1 number of valid blocks (of last 50) \ - [block1_upper,block1_lower,block2_upper,block2_lower,...,offset1,offset2,offset3,offset4,numerrors]\\ - - The GUI hint can be used to position the widget within the application. \ - The hint is of the form "tab_id@tab_index: row, col, row_span, col_span" \ - Both the tab specification and the grid position are optional. - - - diff --git a/grc/multirds_rds_table_qt.block.yml b/grc/multirds_rds_table_qt.block.yml new file mode 100644 index 0000000..9983a75 --- /dev/null +++ b/grc/multirds_rds_table_qt.block.yml @@ -0,0 +1,37 @@ +# auto-generated by grc.converter + +id: multirds_rds_table_qt +label: RDS Table (qt) +category: '[multirds]' + +parameters: +- id: label + label: Label + dtype: string + hide: ${ ('none' if label else 'part') } +- id: gui_hint + label: GUI Hint + dtype: gui_hint + hide: part +- id: nPorts + label: Number of Ports + dtype: int + default: '2' + hide: part + +inputs: +- domain: message + id: in + multiplicity: ${ nPorts } + +templates: + imports: |- + import multirds + from multirds.rds_table_qt import rds_table_qt, rds_table_qt_Widget,rds_table_qt_Signals + var_make: self.${id} = ${id} = ${value} + make: "<% win = 'self._%s_win'%id %>\n\t\t<% signals = 'self._%s_signals'%id %>\n\ + % if not label:\n\t<% label = '\"%s\"'%id %>\n% endif\n${signals} = rds_table_qt_Signals()\n\ + self.${id} = multirds.rds_table_qt(${signals},${nPorts})\n${win} = rds_table_qt_Widget(${signals},\ + \ ${label})\n${gui_hint(in)}" + +file_format: 1 diff --git a/grc/multirds_rds_table_qt.xml b/grc/multirds_rds_table_qt.xml deleted file mode 100644 index 7cfc1d9..0000000 --- a/grc/multirds_rds_table_qt.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - RDS Table (qt) - multirds_rds_table_qt - [multirds] - import multirds - from multirds.rds_table_qt import rds_table_qt, rds_table_qt_Widget,rds_table_qt_Signals - self.$(id) = $(id) = $value - #set $win = 'self._%s_win'%$id - #set $signals = 'self._%s_signals'%$id -#if not $label() - #set $label = '"%s"'%$id -#end if -$(signals) = rds_table_qt_Signals() -self.$(id) = multirds.rds_table_qt($(signals),$nPorts) -$(win) = rds_table_qt_Widget($signals, $label) -$(gui_hint()($win)) - - Label - label - - string - #if $label() then 'none' else 'part'# - - - GUI Hint - gui_hint - - gui_hint - part - - - Number of Ports - nPorts - 2 - int - part - - - in - message - $nPorts - - - - diff --git a/grc/multirds_station_search.block.yml b/grc/multirds_station_search.block.yml new file mode 100644 index 0000000..805be7f --- /dev/null +++ b/grc/multirds_station_search.block.yml @@ -0,0 +1,52 @@ +# auto-generated by grc.converter + +id: multirds_station_search +label: station_search +category: '[multirds]' + +parameters: +- id: fft_len + label: fft lenngth + dtype: int + hide: ${ 'part' if vlen == 1 else 'none' } +- id: round_to + label: round to (in hz) + dtype: int +- id: num_decoders + label: number of decoders + dtype: int + hide: part +- id: center_freq + label: center frequency + dtype: float +- id: samp_rate + label: sample rate + dtype: int +- id: debug + label: Debug + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] + hide: part + +inputs: +- domain: stream + dtype: float + vlen: ${ fft_len } +- domain: message + id: ctrl + optional: true + +outputs: +- domain: message + id: out + optional: true + +templates: + imports: import multirds + make: multirds.station_search(${fft_len}, ${num_decoders}, ${center_freq}, ${samp_rate},${round_to},${debug}) + callbacks: + - set_center_freq(${center_freq}); + +file_format: 1 diff --git a/grc/multirds_station_search.xml b/grc/multirds_station_search.xml deleted file mode 100644 index aacb8fb..0000000 --- a/grc/multirds_station_search.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - station_search - multirds_station_search - [multirds] - import multirds - multirds.station_search($fft_len, $num_decoders, $center_freq, $samp_rate,$round_to,$debug) - - set_center_freq($center_freq); - - fft lenngth - fft_len - int - - - round to (in hz) - round_to - int - - - number of decoders - num_decoders - int - part - - - center frequency - center_freq - float - - - sample rate - samp_rate - int - - - Debug - debug - False - bool - part - - - - - - - - in - float - $fft_len - - - ctrl - message - 1 - - - out - message - 1 - - - diff --git a/grc/multirds_stream_router.block.yml b/grc/multirds_stream_router.block.yml new file mode 100644 index 0000000..7b54768 --- /dev/null +++ b/grc/multirds_stream_router.block.yml @@ -0,0 +1,29 @@ +# auto-generated by grc.converter + +id: multirds_stream_router +label: Stream router +category: '[MULTIRDS]' + +parameters: +- id: ninputs + label: Ninputs + dtype: int +- id: noutputs + label: Noutputs + dtype: int + +inputs: +- domain: stream + dtype: float + multiplicity: '9' + +outputs: +- domain: stream + dtype: float + multiplicity: '3' + +templates: + imports: import multirds + make: multirds.stream_router(${ninputs}, ${noutputs}) + +file_format: 1 diff --git a/grc/multirds_stream_router.xml b/grc/multirds_stream_router.xml deleted file mode 100644 index 3b29719..0000000 --- a/grc/multirds_stream_router.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - stream_router - multirds_stream_router - [multirds] - import multirds - multirds.stream_router($ninputs, $noutputs) - - - Type - type - float - enum - - - - - Number of inputs - ninputs - 9 - int - - - Number of outputs - noutputs - 3 - int - - - - - in - $type - $ninputs - - - ctrl - message - - - - out - $type - $noutputs - - diff --git a/grc/multirds_stream_selector.block.yml b/grc/multirds_stream_selector.block.yml new file mode 100644 index 0000000..ee2d527 --- /dev/null +++ b/grc/multirds_stream_selector.block.yml @@ -0,0 +1,30 @@ +# auto-generated by grc.converter + +id: multirds_stream_selector +label: stream_selector +category: '[multirds]' + +inputs: +- label: in_re + domain: stream + dtype: float +- label: in_arg + domain: stream + dtype: float +- domain: message + id: rds_re + optional: true +- domain: message + id: rds_arg + optional: true + +outputs: +- domain: message + id: rds_out + optional: true + +templates: + imports: import multirds + make: multirds.stream_selector() + +file_format: 1 diff --git a/grc/multirds_stream_selector.xml b/grc/multirds_stream_selector.xml deleted file mode 100644 index 4427e19..0000000 --- a/grc/multirds_stream_selector.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - stream_selector - multirds_stream_selector - [multirds] - import multirds - multirds.stream_selector() - - - - - in_re - float - - - in_arg - float - - - rds_re - message - 1 - - - rds_arg - message - 1 - - - rds_out - message - 1 - - diff --git a/grc/multirds_symbol_combiner.block.yml b/grc/multirds_symbol_combiner.block.yml new file mode 100644 index 0000000..685a82c --- /dev/null +++ b/grc/multirds_symbol_combiner.block.yml @@ -0,0 +1,30 @@ +# auto-generated by grc.converter + +id: multirds_symbol_combiner +label: Symbol combiner +category: '[MULTIRDS]' + +parameters: +- id: threshold + label: Threshold + dtype: float +- id: min_diff + label: Min_diff + dtype: float +- id: log + label: Log + dtype: raw + +inputs: +- domain: stream + dtype: float + +outputs: +- domain: stream + dtype: float + +templates: + imports: import multirds + make: multirds.symbol_combiner(${threshold}, ${min_diff}, ${log}) + +file_format: 1 diff --git a/grc/multirds_symbol_combiner.xml b/grc/multirds_symbol_combiner.xml deleted file mode 100644 index ae8400c..0000000 --- a/grc/multirds_symbol_combiner.xml +++ /dev/null @@ -1,70 +0,0 @@ - - - symbol_combiner - multirds_symbol_combiner - [multirds] - import multirds - multirds.symbol_combiner($threshold, $min_diff, $log) - - - Log - log - False - bool - - - - - Threshold - threshold - 0.25 - float - - - min_diff - min_diff - 0.2 - float - - 0 < $min_diff < 1 - - - - in - float - - - ctrl - message - 1 - - - - - ctrl - message - 1 - - - out - float - - diff --git a/grc/multirds_tmc_parser.block.yml b/grc/multirds_tmc_parser.block.yml new file mode 100644 index 0000000..2b9ead6 --- /dev/null +++ b/grc/multirds_tmc_parser.block.yml @@ -0,0 +1,62 @@ +# auto-generated by grc.converter + +id: multirds_tmc_parser +label: tmc_parser +category: '[multirds]' + +parameters: +- id: maxheight + label: maxheight + dtype: int + default: '160' + hide: part +- id: workdir + label: work directory + dtype: string + hide: part +- id: label + label: Label + dtype: string + hide: ${ ('none' if label else 'part') } +- id: log + label: Log + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] +- id: debug + label: Debug + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] +- id: writeDB + label: write Database + dtype: bool + default: 'False' + options: ['True', 'False'] + option_labels: [Enable, Disable] +- id: gui_hint + label: GUI Hint + dtype: gui_hint + hide: part + +inputs: +- domain: message + id: in + optional: true +asserts: +- ${ open(workdir+"event-list_with_forecast_sort.csv").close() or True } +- ${ open(workdir+"directory_writable","w").close() or True } + +templates: + imports: import multirds + make: "<% win = 'self._%s_win'%id %>\n <% parser = 'self.%s_parser'%id\ + \ %>\n% if not label:\n\t<% label = '\"%s\"'%id %>\n% endif\n${parser} = multirds.tmc_parser(${workdir},\ + \ ${log}, ${debug}, ${writeDB},${maxheight})\n${win} = ${parser}.getqtwidget()\n\ + ${gui_hint(in)}\n " + +documentation: "maxheight = max height of widget in pixels\n\t maxheight == 0 ->\ + \ no restriction" + +file_format: 1 diff --git a/grc/multirds_tmc_parser.xml b/grc/multirds_tmc_parser.xml deleted file mode 100644 index ce2f26a..0000000 --- a/grc/multirds_tmc_parser.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - tmc_parser - multirds_tmc_parser - [multirds] - import multirds - #set $win = 'self._%s_win'%$id - #set $parser = 'self.%s_parser'%$id -#if not $label() - #set $label = '"%s"'%$id -#end if -$(parser) = multirds.tmc_parser($workdir, $log, $debug, $writeDB,$maxheight) -$(win) = $(parser).getqtwidget() -$(gui_hint()($win)) - - - - maxheight - maxheight - 160 - int - part - - - - work directory - workdir - - string - part - - - Label - label - - string - #if $label() then 'none' else 'part'# - - - Log - log - False - bool - - - - - Debug - debug - False - bool - - - - - write Database - writeDB - False - bool - - - - - - GUI Hint - gui_hint - - gui_hint - part - - - open($workdir+"event-list_with_forecast_sort.csv").close() or True - - - open($workdir+"directory_writable","w").close() or True - - - in - message - 1 - - - maxheight = max height of widget in pixels - maxheight == 0 -> no restriction - - diff --git a/grc/multirds_variable_setter.block.yml b/grc/multirds_variable_setter.block.yml new file mode 100644 index 0000000..bb8f9c5 --- /dev/null +++ b/grc/multirds_variable_setter.block.yml @@ -0,0 +1,37 @@ +# auto-generated by grc.converter + +id: multirds_variable_setter +label: variable_setter +category: '[multirds]' + +parameters: +- id: varname + label: varname + dtype: raw +- id: is_pair + label: Pair Mode + dtype: enum + default: 'False' + options: ['False', 'True'] +- id: msgkey + label: Key + dtype: string + hide: ${ ('none' if is_pair == 'True' else 'all') } + +inputs: +- domain: message + id: in + +templates: + imports: import multirds + make: |- + <% block = 'self.%s'%id %> + <% varsetter = 'self.set_%s'%varname %> + <% guiupdater = 'self._%s_win.update_gui'%varname %> + multirds.variable_setter("$varname",${varsetter},${guiupdater},${is_pair},${msgkey}) + +documentation: |- + in pair mode this block only accepts PMT pairs that have a matching CAR + no pair mode: block accepts pmt symbols directly + +file_format: 1 diff --git a/grc/multirds_variable_setter.xml b/grc/multirds_variable_setter.xml deleted file mode 100644 index 0c0f548..0000000 --- a/grc/multirds_variable_setter.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - variable_setter - multirds_variable_setter - [multirds] - import multirds - #set $block = 'self.%s'%$id - #set $varsetter = 'self.set_%s'%$varname - #set $guiupdater = 'self._%s_win.update_gui'%$varname - multirds.variable_setter("$varname",$varsetter,$guiupdater,$is_pair,$msgkey) - - - varname - varname - - raw - - - Pair Mode - is_pair - False - enum - - - - - Key - msgkey - - string - #if $is_pair() == 'True' then 'none' else 'all'# - - - - in - message - - - - - in pair mode this block only accepts PMT pairs that have a matching CAR - no pair mode: block accepts pmt symbols directly - - - diff --git a/grc/multirds_vector_cutter.block.yml b/grc/multirds_vector_cutter.block.yml new file mode 100644 index 0000000..300c94f --- /dev/null +++ b/grc/multirds_vector_cutter.block.yml @@ -0,0 +1,55 @@ +# auto-generated by grc.converter + +id: multirds_vector_cutter +label: vector_cutter +category: '[multirds]' + +parameters: +- id: pad_out + label: padded output + dtype: enum + default: 'False' + options: ['True', 'False'] + option_labels: ['Yes', 'No'] + hide: part +- id: zero_len + label: num-zeros + dtype: int + default: '0' +- id: insize + label: insize + dtype: int + default: '2048' +- id: outsize + label: outsize + dtype: int + default: '1024' +- id: cutpoint + label: cutpoint + dtype: int + default: '512' + +inputs: +- domain: stream + dtype: complex + vlen: ${ insize } + +outputs: +- domain: stream + dtype: complex + vlen: ${ outsize } +- label: out_padded + domain: stream + dtype: complex + vlen: ${ insize } + optional: true + hide: ${ ('False' if pad_out == 'True' else 'True') } + +templates: + imports: import multirds + make: multirds.vector_cutter(${insize}, ${outsize}, ${cutpoint},${pad_out},${zero_len}) + callbacks: + - set_cutpoint(${cutpoint}); + - set_zero_len(${zero_len}); + +file_format: 1 diff --git a/grc/multirds_vector_cutter.xml b/grc/multirds_vector_cutter.xml deleted file mode 100644 index c4ad7d7..0000000 --- a/grc/multirds_vector_cutter.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - vector_cutter - multirds_vector_cutter - [multirds] - import multirds - multirds.vector_cutter($insize, $outsize, $cutpoint,$pad_out,$zero_len) - - set_cutpoint($cutpoint); - set_zero_len($zero_len); - - - padded output - pad_out - False - enum - part - - - - - num-zeros - zero_len - 0 - int - - - insize - insize - 2048 - int - - - outsize - outsize - 1024 - int - - - cutpoint - cutpoint - 512 - int - - - - in - complex - $insize - - - out - complex - $outsize - - - out_padded - complex - $insize - #if $pad_out() == 'True' then 'False' else 'True'# - - #if $pad_out() == 'True' then 'False' else 'True'# - - diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 605a5d6..d9dbd70 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -38,11 +38,11 @@ GR_PYTHON_INSTALL( stream_selector.py vector_cutter.py decoder_compare.py - qtgui_range.py variable_setter.py tmc_classes.py tmc_parser.py - pilot_SNR.py DESTINATION ${GR_PYTHON_DIR}/multirds + pilot_SNR.py + DESTINATION ${GR_PYTHON_DIR}/multirds ) ######################################################################## diff --git a/python/__init__.py b/python/__init__.py index 4575e96..7d05617 100644 --- a/python/__init__.py +++ b/python/__init__.py @@ -33,16 +33,17 @@ except ImportError: # import any pure python here -from rds_table_qt import rds_table_qt -from rds_parser_table_qt import rds_parser_table_qt -from station_search import station_search - -from chart import Chart -from stream_selector import stream_selector -from vector_cutter import vector_cutter -from decoder_compare import decoder_compare -from qtgui_range import qtgui_range -from variable_setter import variable_setter -from tmc_parser import tmc_parser -from pilot_SNR import pilot_SNR +from .rds_table_qt import rds_table_qt +from .rds_parser_table_qt import rds_parser_table_qt +from .station_search import station_search + +from .chart import Chart +from .stream_selector import stream_selector +from .vector_cutter import vector_cutter +from .decoder_compare import decoder_compare + +from .variable_setter import variable_setter +from .tmc_parser import tmc_parser +from .pilot_SNR import pilot_SNR + # diff --git a/python/qtgui_range.py b/python/qtgui_range.py deleted file mode 100644 index fb50237..0000000 --- a/python/qtgui_range.py +++ /dev/null @@ -1,279 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2015 Free Software Foundation, Inc. -# -# This file is part of GNU Radio -# -# GNU Radio is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3, or (at your option) -# any later version. -# -# GNU Radio is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Radio; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -from PyQt4 import Qt, QtCore, QtGui -import pmt -from gnuradio import gr - -class qtgui_range(gr.basic_block): - def set_test(self,value): - print("test callback invoked") - print(value) - def __init__(self, minv, maxv, step, default, min_length): - gr.basic_block.__init__(self, - name="qtgui_range", - in_sig=None, - out_sig=None) - self.min = float(minv) - self.max = float(maxv) - self.step = float(step) - self.default = float(default) - self.min_length = min_length - self.find_precision() - self.find_nsteps() - def find_precision(self): - # Get the decimal part of the step - temp = str(float(self.step) - int(self.step))[2:] - precision = len(temp) if temp is not '0' else 0 - precision = min(precision, 13) - - if precision == 0 and self.max < 100: - self.precision = 1 # Always have a decimal in this case - else: - self.precision = (precision + 2) if precision > 0 else 0 - - def find_nsteps(self): - self.nsteps = (self.max + self.step - self.min)/self.step - - def demap_range(self, val): - if val > self.max: - val = self.max - if val < self.min: - val = self.min - return ((val-self.min)/self.step) - - def map_range(self, val): - if val > self.nsteps: - val = self.max - if val < 0: - val = 0 - return (val*self.step+self.min) - - -class RangeWidget(QtGui.QWidget): - def update_gui(self,value): - #print("update_gui called on widget %s"%self.label) - #print(value) - #self.d_widget.slider.setValue(value) - if self.range.min < value < self.range.max: - if self.style=="counter_slider": - self.d_widget.counter.setValue(value) - else: - self.d_widget.setValue(value) - else: - print("value %i not in range %i...%i"%(value,self.range.min,self.range.max)) - #self.notifyChanged(self.rangeType(value)) - def __init__(self, ranges, slot, label, style, rangeType=float): - """ Creates the QT Range widget """ - QtGui.QWidget.__init__(self) - - self.range = ranges - self.style = style - self.label=label - - # rangeType tells the block how to return the value as a standard - self.rangeType = rangeType - - # Top-block function to call when any value changes - # Some widgets call this directly when their value changes. - # Others have intermediate functions to map the value into the right range. - self.notifyChanged = slot - - layout = Qt.QHBoxLayout() - label = Qt.QLabel(label) - layout.addWidget(label) - - if style == "dial": - self.d_widget = self.Dial(self, self.range, self.notifyChanged, rangeType) - elif style == "slider": - self.d_widget = self.Slider(self, self.range, self.notifyChanged, rangeType) - elif style == "counter": - # The counter widget can be directly wired to the notifyChanged slot - self.d_widget = self.Counter(self, self.range, self.notifyChanged, rangeType) - else: - # The CounterSlider needs its own internal handlers before calling notifyChanged - self.d_widget = self.CounterSlider(self, self.range, self.notifyChanged, rangeType) - - layout.addWidget(self.d_widget) - self.setLayout(layout) - - class Dial(QtGui.QDial): - """ Creates the range using a dial """ - def __init__(self, parent, ranges, slot, rangeType=float): - QtGui.QDial.__init__(self, parent) - - self.rangeType = rangeType - - # Setup the dial - self.setRange(0, ranges.nsteps-1) - self.setSingleStep(1) - self.setNotchesVisible(True) - self.range = ranges - - # Round the initial value to the closest tick - temp = int(round(ranges.demap_range(ranges.default), 0)) - self.setValue(temp) - - # Setup the slots - self.valueChanged.connect(self.changed) - self.notifyChanged = slot - - def changed(self, value): - """ Handles maping the value to the right range before calling the slot. """ - val = self.range.map_range(value) - self.notifyChanged(self.rangeType(val)) - - class Slider(QtGui.QSlider): - """ Creates the range using a slider """ - def __init__(self, parent, ranges, slot, rangeType=float): - QtGui.QSlider.__init__(self, QtCore.Qt.Horizontal, parent) - - self.rangeType = rangeType - - # Setup the slider - #self.setFocusPolicy(QtCore.Qt.NoFocus) - self.setRange(0, ranges.nsteps - 1) - self.setTickPosition(2) - self.setSingleStep(1) - self.range = ranges - - # Round the initial value to the closest tick - temp = int(round(ranges.demap_range(ranges.default), 0)) - self.setValue(temp) - - if ranges.nsteps > ranges.min_length: - interval = int(ranges.nsteps/ranges.min_length) - self.setTickInterval(interval) - self.setPageStep(interval) - else: - self.setTickInterval(1) - self.setPageStep(1) - - # Setup the handler function - self.valueChanged.connect(self.changed) - self.notifyChanged = slot - - def changed(self, value): - """ Handle the valueChanged signal and map the value into the correct range """ - val = self.range.map_range(value) - self.notifyChanged(self.rangeType(val)) - - def mousePressEvent(self, event): - if((event.button() == QtCore.Qt.LeftButton)): - new = self.minimum() + ((self.maximum()-self.minimum()) * event.x()) / self.width() - self.setValue(new) - event.accept() - # Use repaint rather than calling the super mousePressEvent. - # Calling super causes issue where slider jumps to wrong value. - QtGui.QSlider.repaint(self) - - def mouseMoveEvent(self, event): - new = self.minimum() + ((self.maximum()-self.minimum()) * event.x()) / self.width() - self.setValue(new) - event.accept() - QtGui.QSlider.repaint(self) - - class Counter(QtGui.QDoubleSpinBox): - """ Creates the range using a counter """ - def __init__(self, parent, ranges, slot, rangeType=float): - QtGui.QDoubleSpinBox.__init__(self, parent) - - self.rangeType = rangeType - - # Setup the counter - self.setRange(ranges.min, ranges.max) - self.setValue(ranges.default) - self.setSingleStep(ranges.step) - self.setKeyboardTracking(False) - self.setDecimals(ranges.precision) - - # The counter already handles floats and can be connected directly. - self.valueChanged.connect(self.changed) - self.notifyChanged = slot - - def changed(self, value): - """ Handle the valueChanged signal by converting to the right type """ - self.notifyChanged(self.rangeType(value)) - - class CounterSlider(QtGui.QWidget): - """ Creates the range using a counter and slider """ - def __init__(self, parent, ranges, slot, rangeType=float): - QtGui.QWidget.__init__(self, parent) - - self.rangeType = rangeType - - # Slot to call in the parent - self.notifyChanged = slot - - self.slider = RangeWidget.Slider(parent, ranges, self.sliderChanged, rangeType) - self.counter = RangeWidget.Counter(parent, ranges, self.counterChanged, rangeType) - - # Need another horizontal layout to wrap the other widgets. - layout = Qt.QHBoxLayout() - layout.addWidget(self.slider) - layout.addWidget(self.counter) - self.setLayout(layout) - - # Flag to ignore the slider event caused by a change to the counter. - self.ignoreSlider = False - self.range = ranges - - def sliderChanged(self, value): - """ Handles changing the counter when the slider is updated """ - # If the counter was changed, ignore any of these events - if not self.ignoreSlider: - # Value is already float. Just set the counter - self.counter.setValue(self.rangeType(value)) - self.notifyChanged(self.rangeType(value)) - self.ignoreSlider = False - - def counterChanged(self, value): - """ Handles changing the slider when the counter is updated """ - # Get the current slider value and check to see if the new value changes it - current = self.slider.value() - new = int(round(self.range.demap_range(value), 0)) - - # If it needs to change, ignore the slider event - # Otherwise, the slider will cause the counter to round to the nearest tick - if current != new: - self.ignoreSlider = True - self.slider.setValue(new) - - self.notifyChanged(self.rangeType(value)) - - -if __name__ == "__main__": - from PyQt4 import Qt - import sys - - def valueChanged(frequency): - print("Value updated - " + str(frequency)) - - app = Qt.QApplication(sys.argv) - widget = RangeWidget(qtgui_range(0, 100, 10, 1, 100), valueChanged, "Test", "counter_slider", int) - - widget.show() - widget.setWindowTitle("Test Qt Range") - app.exec_() - - widget = None