commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] [gnuradio] 16/101: Merge remote-tracking branch 'grcwg


From: git
Subject: [Commit-gnuradio] [gnuradio] 16/101: Merge remote-tracking branch 'grcwg/next_grcwg' into gtk3
Date: Thu, 16 Mar 2017 14:57:59 +0000 (UTC)

This is an automated email from the git hooks/post-receive script.

jcorgan pushed a commit to branch python3
in repository gnuradio.

commit 893b74c770b81f2c09094577e2de720155f84b61
Merge: 7ac7cf6 6fb0ff2
Author: Sebastian Koslowski <address@hidden>
Date:   Fri Jun 10 15:15:16 2016 +0200

    Merge remote-tracking branch 'grcwg/next_grcwg' into gtk3

 CMakeLists.txt                                     |   64 +-
 cmake/Modules/FindGSL.cmake                        |    2 +-
 cmake/Modules/FindGnuradio.cmake                   |    3 -
 cmake/Modules/FindQwt.cmake                        |    4 +-
 ...nuradioConfig.cmake => GnuradioConfig.cmake.in} |    5 +-
 cmake/Modules/GrBoost.cmake                        |    7 +-
 cmake/Packaging/Fedora-15.cmake                    |    3 +-
 cmake/Packaging/Fedora-16.cmake                    |    3 +-
 cmake/Packaging/Fedora-17.cmake                    |    1 +
 cmake/Packaging/Fedora-18.cmake                    |    1 +
 cmake/Packaging/Ubuntu-10.04.cmake                 |    1 +
 cmake/Packaging/Ubuntu-10.10.cmake                 |    1 +
 cmake/Packaging/Ubuntu-11.04.cmake                 |    1 +
 cmake/Packaging/Ubuntu-11.10.cmake                 |    1 +
 cmake/Packaging/Ubuntu-12.04.cmake                 |    1 +
 cmake/Packaging/Ubuntu-12.10.cmake                 |    1 +
 cmake/Packaging/Ubuntu-13.04.cmake                 |    1 +
 .../{Ubuntu-13.04.cmake => Ubuntu-15.10.cmake}     |    1 +
 cmake/msvc/config.h                                |    7 +
 docs/doxygen/Doxyfile.in                           |    8 -
 docs/doxygen/other/build_guide.dox                 |    1 +
 docs/doxygen/other/group_defs.dox                  |    5 -
 docs/sphinx/source/fcd_blocks.rst                  |    6 -
 docs/sphinx/source/noaa_blocks.rst                 |    8 -
 dtools/bin/install-tbb                             |   88 -
 gnuradio-runtime/examples/mp-sched/affinity_set.py |    8 +-
 gnuradio-runtime/examples/mp-sched/plot_flops.py   |   15 +-
 .../examples/mp-sched/run_synthetic.py             |   39 +-
 gnuradio-runtime/include/gnuradio/attributes.h     |   11 +
 gnuradio-runtime/include/gnuradio/high_res_timer.h |    2 +-
 gnuradio-runtime/include/gnuradio/types.h          |   23 -
 gnuradio-runtime/lib/CMakeLists.txt                |    8 +-
 gnuradio-runtime/lib/flat_flowgraph.cc             |    4 +-
 gnuradio-runtime/lib/math/random.cc                |    2 +-
 gnuradio-runtime/lib/realtime_impl.cc              |   70 +-
 gnuradio-runtime/lib/scheduler.h                   |    2 +-
 gnuradio-runtime/lib/thread/thread.cc              |   10 +-
 gnuradio-runtime/lib/thread/thread_body_wrapper.cc |    2 +-
 gnuradio-runtime/lib/tpb_thread_body.cc            |    4 +-
 gnuradio-runtime/python/gnuradio/__init__.py       |    3 -
 gnuradio-runtime/python/gnuradio/eng_option.py     |   16 -
 gr-analog/grc/analog_block_tree.xml                |    2 +-
 gr-atsc/CMakeLists.txt                             |  114 -
 gr-atsc/README                                     |   27 -
 gr-atsc/README.signal_flow                         |   41 -
 gr-atsc/gnuradio-atsc.pc.in                        |   11 -
 gr-atsc/include/gnuradio/atsc/CMakeLists.txt       |  103 -
 .../include/gnuradio/atsc/GrAtscBitTimingLoop.h    |   90 -
 .../include/gnuradio/atsc/GrAtscBitTimingLoop2.h   |   80 -
 .../include/gnuradio/atsc/GrAtscBitTimingLoop3.h   |   72 -
 .../include/gnuradio/atsc/GrAtscConvert2xTo20.h    |   50 -
 .../gnuradio/atsc/GrAtscDataSegToSoftDataSeg.h     |   50 -
 .../include/gnuradio/atsc/GrAtscDeinterleaver.h    |   51 -
 gr-atsc/include/gnuradio/atsc/GrAtscDerandomizer.h |   51 -
 gr-atsc/include/gnuradio/atsc/GrAtscEqualizer.h    |   59 -
 gr-atsc/include/gnuradio/atsc/GrAtscFPLL.h         |   88 -
 .../include/gnuradio/atsc/GrAtscFieldSyncChecker.h |   54 -
 .../gnuradio/atsc/GrAtscFieldSyncCorrelator.h      |   56 -
 .../include/gnuradio/atsc/GrAtscFieldSyncDemux.h   |   60 -
 gr-atsc/include/gnuradio/atsc/GrAtscFieldSyncMux.h |   58 -
 gr-atsc/include/gnuradio/atsc/GrAtscInterleaver.h  |   51 -
 gr-atsc/include/gnuradio/atsc/GrAtscRSDecoder.h    |   51 -
 gr-atsc/include/gnuradio/atsc/GrAtscRSEncoder.h    |   51 -
 gr-atsc/include/gnuradio/atsc/GrAtscRandomizer.h   |   55 -
 gr-atsc/include/gnuradio/atsc/GrAtscSegSymSync.h   |   64 -
 .../include/gnuradio/atsc/GrAtscSegSymSyncImpl.h   |   69 -
 .../gnuradio/atsc/GrAtscSegSymSyncImpl_export.h    |   26 -
 gr-atsc/include/gnuradio/atsc/GrAtscSymbolMapper.h |   97 -
 .../include/gnuradio/atsc/GrAtscTrellisEncoder.h   |   50 -
 .../include/gnuradio/atsc/GrAtscViterbiDecoder.h   |   51 -
 gr-atsc/include/gnuradio/atsc/api.h                |   33 -
 .../gnuradio/atsc/basic_trellis_encoder_impl.h     |   62 -
 gr-atsc/include/gnuradio/atsc/bit_timing_loop.h    |   89 -
 gr-atsc/include/gnuradio/atsc/consts.h             |   42 -
 .../gnuradio/atsc/convolutional_interleaver.h      |  126 -
 .../include/gnuradio/atsc/create_atsci_equalizer.h |   34 -
 .../gnuradio/atsc/create_atsci_fs_checker.h        |   36 -
 .../gnuradio/atsc/create_atsci_fs_correlator.h     |   36 -
 .../include/gnuradio/atsc/data_interleaver_impl.h  |   65 -
 gr-atsc/include/gnuradio/atsc/deinterleaver.h      |   58 -
 gr-atsc/include/gnuradio/atsc/depad.h              |   54 -
 gr-atsc/include/gnuradio/atsc/derandomizer.h       |   57 -
 gr-atsc/include/gnuradio/atsc/diag_output_impl.h   |   29 -
 gr-atsc/include/gnuradio/atsc/ds_to_softds.h       |   60 -
 gr-atsc/include/gnuradio/atsc/equalizer.h          |   71 -
 gr-atsc/include/gnuradio/atsc/equalizer_impl.h     |  169 -
 .../include/gnuradio/atsc/equalizer_lms2_impl.h    |   80 -
 gr-atsc/include/gnuradio/atsc/equalizer_lms_impl.h |   79 -
 gr-atsc/include/gnuradio/atsc/equalizer_nop_impl.h |   63 -
 gr-atsc/include/gnuradio/atsc/exp2_lp_impl.h       |   35 -
 .../gnuradio/atsc/fake_single_viterbi_impl.h       |   52 -
 gr-atsc/include/gnuradio/atsc/field_sync_demux.h   |   76 -
 gr-atsc/include/gnuradio/atsc/field_sync_mux.h     |   68 -
 gr-atsc/include/gnuradio/atsc/fpll.h               |   82 -
 gr-atsc/include/gnuradio/atsc/fs_checker.h         |   64 -
 gr-atsc/include/gnuradio/atsc/fs_checker_impl.h    |   70 -
 .../include/gnuradio/atsc/fs_checker_naive_impl.h  |   74 -
 gr-atsc/include/gnuradio/atsc/fs_correlator_impl.h |   66 -
 .../gnuradio/atsc/fs_correlator_naive_impl.h       |   70 -
 gr-atsc/include/gnuradio/atsc/interleaver.h        |   57 -
 gr-atsc/include/gnuradio/atsc/interleaver_fifo.h   |   86 -
 gr-atsc/include/gnuradio/atsc/pad.h                |   57 -
 gr-atsc/include/gnuradio/atsc/pnXXX_impl.h         |   26 -
 gr-atsc/include/gnuradio/atsc/randomizer.h         |   60 -
 gr-atsc/include/gnuradio/atsc/randomizer_impl.h    |   97 -
 gr-atsc/include/gnuradio/atsc/reed_solomon_impl.h  |   57 -
 .../atsc/root_raised_cosine_bandpass_impl.h        |   40 -
 .../gnuradio/atsc/root_raised_cosine_impl.h        |   36 -
 gr-atsc/include/gnuradio/atsc/rs_decoder.h         |   58 -
 gr-atsc/include/gnuradio/atsc/rs_encoder.h         |   58 -
 .../include/gnuradio/atsc/single_viterbi_impl.h    |   58 -
 gr-atsc/include/gnuradio/atsc/slicer_agc_impl.h    |   69 -
 .../gnuradio/atsc/sliding_correlator_impl.h        |   86 -
 gr-atsc/include/gnuradio/atsc/sssr_impl.h          |  241 -
 gr-atsc/include/gnuradio/atsc/syminfo_impl.h       |   58 -
 gr-atsc/include/gnuradio/atsc/sync_tag_impl.h      |   56 -
 gr-atsc/include/gnuradio/atsc/trellis_encoder.h    |   57 -
 .../include/gnuradio/atsc/trellis_encoder_impl.h   |   67 -
 gr-atsc/include/gnuradio/atsc/types.h              |  238 -
 gr-atsc/include/gnuradio/atsc/viterbi_decoder.h    |   62 -
 .../include/gnuradio/atsc/viterbi_decoder_impl.h   |   84 -
 gr-atsc/include/gnuradio/atsc/vsbtx_lp_impl.h      |   37 -
 gr-atsc/lib/CMakeLists.txt                         |  185 -
 gr-atsc/lib/GrAtscBitTimingLoop.cc                 |  223 -
 gr-atsc/lib/GrAtscBitTimingLoop2.cc                |  173 -
 gr-atsc/lib/GrAtscBitTimingLoop3.cc                |  106 -
 gr-atsc/lib/GrAtscConvert2xTo20.cc                 |  106 -
 gr-atsc/lib/GrAtscDataSegToSoftDataSeg.cc          |  101 -
 gr-atsc/lib/GrAtscDeinterleaver.cc                 |   92 -
 gr-atsc/lib/GrAtscDerandomizer.cc                  |  106 -
 gr-atsc/lib/GrAtscEqualizer.cc                     |  135 -
 gr-atsc/lib/GrAtscFPLL.cc                          |  150 -
 gr-atsc/lib/GrAtscFieldSyncChecker.cc              |  101 -
 gr-atsc/lib/GrAtscFieldSyncCorrelator.cc           |   95 -
 gr-atsc/lib/GrAtscFieldSyncDemux.cc                |  173 -
 gr-atsc/lib/GrAtscFieldSyncMux.cc                  |  246 -
 gr-atsc/lib/GrAtscInterleaver.cc                   |  101 -
 gr-atsc/lib/GrAtscRSDecoder.cc                     |   81 -
 gr-atsc/lib/GrAtscRSEncoder.cc                     |   84 -
 gr-atsc/lib/GrAtscRandomizer.cc                    |  110 -
 gr-atsc/lib/GrAtscSegSymSync.cc                    |   50 -
 gr-atsc/lib/GrAtscSegSymSyncImpl.cc                |  103 -
 gr-atsc/lib/GrAtscTrellisEncoder.cc                |  144 -
 gr-atsc/lib/GrAtscViterbiDecoder.cc                |  135 -
 gr-atsc/lib/atsc_bit_timing_loop.cc                |  125 -
 gr-atsc/lib/atsc_deinterleaver.cc                  |   59 -
 gr-atsc/lib/atsc_depad.cc                          |   61 -
 gr-atsc/lib/atsc_derandomizer.cc                   |   79 -
 gr-atsc/lib/atsc_ds_to_softds.cc                   |   73 -
 gr-atsc/lib/atsc_equalizer.cc                      |  105 -
 gr-atsc/lib/atsc_field_sync_demux.cc               |  209 -
 gr-atsc/lib/atsc_field_sync_mux.cc                 |  205 -
 gr-atsc/lib/atsc_fpll.cc                           |  137 -
 gr-atsc/lib/atsc_fs_checker.cc                     |   75 -
 gr-atsc/lib/atsc_interleaver.cc                    |   59 -
 gr-atsc/lib/atsc_pad.cc                            |   78 -
 gr-atsc/lib/atsc_randomizer.cc                     |   87 -
 gr-atsc/lib/atsc_rs_decoder.cc                     |   63 -
 gr-atsc/lib/atsc_rs_encoder.cc                     |   62 -
 gr-atsc/lib/atsc_trellis_encoder.cc                |   60 -
 gr-atsc/lib/atsc_viterbi_decoder.cc                |   86 -
 gr-atsc/lib/atsci_basic_trellis_encoder.cc         |   62 -
 gr-atsc/lib/atsci_data_interleaver.cc              |   61 -
 gr-atsc/lib/atsci_equalizer.cc                     |  248 -
 gr-atsc/lib/atsci_equalizer_lms.cc                 |  308 -
 gr-atsc/lib/atsci_equalizer_lms2.cc                |  376 -
 gr-atsc/lib/atsci_equalizer_nop.cc                 |  133 -
 gr-atsc/lib/atsci_exp2_lp.cc                       |   84 -
 gr-atsc/lib/atsci_exp2_lp20.dat                    |  178 -
 gr-atsc/lib/atsci_exp2_lp2x.dat                    |  196 -
 gr-atsc/lib/atsci_fake_single_viterbi.cc           |   69 -
 gr-atsc/lib/atsci_fs_checker.cc                    |   33 -
 gr-atsc/lib/atsci_fs_checker_naive.cc              |  140 -
 gr-atsc/lib/atsci_fs_correlator.cc                 |   33 -
 gr-atsc/lib/atsci_fs_correlator_naive.cc           |  125 -
 gr-atsc/lib/atsci_pnXXX.cc                         |   55 -
 gr-atsc/lib/atsci_randomizer.cc                    |  112 -
 gr-atsc/lib/atsci_reed_solomon.cc                  |   94 -
 gr-atsc/lib/atsci_root_raised_cosine.cc            |   36 -
 gr-atsc/lib/atsci_root_raised_cosine_bandpass.cc   |   51 -
 gr-atsc/lib/atsci_single_viterbi.cc                |  100 -
 gr-atsc/lib/atsci_sliding_correlator.cc            |   90 -
 gr-atsc/lib/atsci_sssr.cc                          |  297 -
 gr-atsc/lib/atsci_trellis_encoder.cc               |  208 -
 gr-atsc/lib/atsci_viterbi_decoder.cc               |  176 -
 gr-atsc/lib/atsci_viterbi_gen.cc                   |  267 -
 gr-atsc/lib/atsci_vsbtx_lp.cc                      |   59 -
 gr-atsc/lib/atsci_vsbtx_lp.dat                     |   49 -
 gr-atsc/lib/create_atsci_equalizer.cc              |   44 -
 gr-atsc/lib/create_atsci_fs_checker.cc             |   30 -
 gr-atsc/lib/create_atsci_fs_correlator.cc          |   30 -
 gr-atsc/lib/fpll_btloop_coupling.h                 |   38 -
 gr-atsc/lib/gen_encoder.py                         |   63 -
 gr-atsc/lib/gnuradio-atsc.rc.in                    |   55 -
 gr-atsc/lib/plinfo.cc                              |   59 -
 gr-atsc/lib/qa_atsci.cc                            |   63 -
 gr-atsc/lib/qa_atsci.h                             |   37 -
 gr-atsc/lib/qa_atsci_basic_trellis_encoder.cc      |   67 -
 gr-atsc/lib/qa_atsci_basic_trellis_encoder.h       |   44 -
 gr-atsc/lib/qa_atsci_data_interleaver.cc           |  197 -
 gr-atsc/lib/qa_atsci_data_interleaver.h            |   60 -
 gr-atsc/lib/qa_atsci_equalizer_nop.cc              |  247 -
 gr-atsc/lib/qa_atsci_equalizer_nop.h               |   51 -
 gr-atsc/lib/qa_atsci_fake_single_viterbi.cc        |  146 -
 gr-atsc/lib/qa_atsci_fake_single_viterbi.h         |   51 -
 gr-atsc/lib/qa_atsci_fs_correlator.cc              |  256 -
 gr-atsc/lib/qa_atsci_fs_correlator.h               |   58 -
 gr-atsc/lib/qa_atsci_randomizer.cc                 |  145 -
 gr-atsc/lib/qa_atsci_randomizer.h                  |   62 -
 gr-atsc/lib/qa_atsci_reed_solomon.cc               |  115 -
 gr-atsc/lib/qa_atsci_reed_solomon.h                |   43 -
 gr-atsc/lib/qa_atsci_single_viterbi.cc             |  286 -
 gr-atsc/lib/qa_atsci_single_viterbi.h              |   53 -
 gr-atsc/lib/qa_atsci_sliding_correlator.cc         |   51 -
 gr-atsc/lib/qa_atsci_sliding_correlator.h          |   52 -
 gr-atsc/lib/qa_atsci_trellis_encoder.cc            |  116 -
 gr-atsc/lib/qa_atsci_trellis_encoder.h             |   54 -
 gr-atsc/lib/qa_atsci_trellis_encoder_t1_input.dat  | 2484 -----
 gr-atsc/lib/qa_atsci_trellis_encoder_t1_output.dat | 9984 --------------------
 gr-atsc/lib/qa_atsci_viterbi_decoder.cc            |  178 -
 gr-atsc/lib/qa_atsci_viterbi_decoder.h             |   54 -
 gr-atsc/lib/qa_atsci_viterbi_decoder_t1_input.dat  | 9984 --------------------
 gr-atsc/lib/qa_atsci_viterbi_decoder_t1_output.dat | 2484 -----
 gr-atsc/lib/qa_convolutional_interleaver.cc        |  131 -
 gr-atsc/lib/qa_convolutional_interleaver.h         |   69 -
 gr-atsc/lib/qa_interleaver_fifo.cc                 |   58 -
 gr-atsc/lib/qa_interleaver_fifo.h                  |   57 -
 gr-atsc/lib/test_atsci.cc                          |   46 -
 gr-atsc/python/atsc/CMakeLists.txt                 |   63 -
 gr-atsc/python/atsc/README                         |   19 -
 gr-atsc/python/atsc/__init__.py                    |   34 -
 gr-atsc/python/atsc/atsc_rx.py                     |  134 -
 gr-atsc/python/atsc/atsc_utils.py                  |   75 -
 gr-atsc/python/atsc/qa_atsc.py                     |  225 -
 gr-atsc/swig/CMakeLists.txt                        |   59 -
 gr-atsc/swig/atsc_swig.i                           |  301 -
 gr-audio/grc/audio_sink.xml                        |    2 +-
 gr-audio/grc/audio_source.xml                      |    2 +-
 gr-audio/lib/portaudio/portaudio_sink.cc           |    3 +
 gr-audio/lib/portaudio/portaudio_source.cc         |    3 +
 gr-blocks/grc/blks2_error_rate.xml                 |    2 +-
 gr-blocks/grc/blks2_selector.xml                   |    2 +-
 gr-blocks/grc/blks2_tcp_sink.xml                   |    2 +-
 gr-blocks/grc/blks2_tcp_source.xml                 |    2 +-
 gr-blocks/grc/blks2_valve.xml                      |    2 +-
 gr-blocks/grc/blocks_block_tree.xml                |    9 +-
 gr-blocks/lib/ConfigChecks.cmake                   |    2 +-
 gr-blocks/lib/udp_source_impl.cc                   |    3 -
 gr-channels/grc/channels_block_tree.xml            |    2 +-
 gr-channels/lib/fading_model_impl.cc               |   11 -
 gr-channels/lib/flat_fader_impl.cc                 |   18 +-
 gr-digital/grc/blks2_packet_decoder.xml            |    2 +-
 gr-digital/grc/blks2_packet_encoder.xml            |    2 +-
 gr-digital/grc/digital_block_tree.xml              |    2 +-
 gr-digital/grc/digital_burst_shaper.xml            |    2 +-
 .../include/gnuradio/digital/ofdm_equalizer_base.h |    3 +-
 .../gnuradio/digital/ofdm_equalizer_simpledfe.h    |    3 +-
 .../gnuradio/digital/ofdm_equalizer_static.h       |    3 +-
 gr-dtv/grc/dtv_block_tree.xml                      |    2 +-
 gr-dtv/lib/CMakeLists.txt                          |   19 +-
 .../lib/dvbt/dvbt_bit_inner_deinterleaver_impl.cc  |    5 +-
 gr-dtv/lib/dvbt/dvbt_bit_inner_interleaver_impl.cc |    3 +-
 gr-dtv/lib/dvbt/dvbt_ofdm_sym_acquisition_impl.cc  |    6 +-
 gr-dtv/lib/dvbt/dvbt_reed_solomon.cc               |   14 +-
 gr-dtv/lib/dvbt/dvbt_viterbi_decoder_impl.cc       |   24 +-
 gr-fcd/AUTHORS                                     |    9 -
 gr-fcd/CMakeLists.txt                              |  134 -
 gr-fcd/doc/CMakeLists.txt                          |   23 -
 gr-fcd/doc/README.fcd                              |   13 -
 gr-fcd/doc/fcd.dox                                 |   29 -
 gr-fcd/examples/c++/CMakeLists.txt                 |   37 -
 gr-fcd/examples/c++/fcd_nfm_rx.cc                  |  115 -
 gr-fcd/examples/grc/CMakeLists.txt                 |   26 -
 gr-fcd/examples/grc/fcd_apt_rx.grc                 | 1080 ---
 gr-fcd/examples/grc/fcd_fft.grc                    |  564 --
 gr-fcd/examples/grc/fcd_nfm_rx.grc                 | 1399 ---
 gr-fcd/gnuradio-fcd.pc.in                          |   11 -
 gr-fcd/grc/CMakeLists.txt                          |   24 -
 gr-fcd/grc/fcd_source_c.xml                        |  117 -
 gr-fcd/include/gnuradio/fcd/CMakeLists.txt         |   28 -
 gr-fcd/include/gnuradio/fcd/api.h                  |   33 -
 gr-fcd/include/gnuradio/fcd/source_c.h             |  149 -
 gr-fcd/lib/CMakeLists.txt                          |   96 -
 gr-fcd/lib/fcd/CMakeLists.txt                      |   32 -
 gr-fcd/lib/fcd/COPYRIGHT                           |   23 -
 gr-fcd/lib/fcd/fcd.c                               |  895 --
 gr-fcd/lib/fcd/fcd.h                               |   79 -
 gr-fcd/lib/fcd/fcdhidcmd.h                         |  305 -
 gr-fcd/lib/gnuradio-fcd.rc.in                      |   55 -
 gr-fcd/lib/hid/CMakeLists.txt                      |   39 -
 gr-fcd/lib/hid/COPYRIGHT                           |   25 -
 gr-fcd/lib/hid/hid-libusb.c                        | 1427 ---
 gr-fcd/lib/hid/hidapi.h                            |  383 -
 gr-fcd/lib/hid/hidmac.c                            | 1122 ---
 gr-fcd/lib/hid/hidwin.c                            |  873 --
 gr-fcd/lib/source_c_impl.cc                        |  252 -
 gr-fcd/lib/source_c_impl.h                         |   55 -
 gr-fcd/python/fcd/CMakeLists.txt                   |   47 -
 gr-fcd/python/fcd/__init__.py                      |   33 -
 gr-fcd/python/fcd/qa_fcd.py                        |   38 -
 gr-fcd/python/fcd/run_tests.in                     |   10 -
 gr-fcd/swig/CMakeLists.txt                         |   61 -
 gr-fcd/swig/fcd_swig.i                             |   40 -
 gr-fec/grc/fec_block_tree.xml                      |    2 +-
 gr-fft/grc/fft_block_tree.xml                      |    2 +-
 gr-filter/grc/filter_block_tree.xml                |    2 +-
 gr-noaa/CMakeLists.txt                             |  111 -
 gr-noaa/README                                     |   67 -
 gr-noaa/examples/CMakeLists.txt                    |   29 -
 gr-noaa/examples/file_rx_hrpt.grc                  | 1139 ---
 gr-noaa/examples/hrpt_decode.grc                   |  428 -
 gr-noaa/examples/hrpt_demod.grc                    |  963 --
 gr-noaa/examples/usrp_rx_hrpt.grc                  | 2267 -----
 gr-noaa/examples/usrp_rx_hrpt_nogui.grc            | 1716 ----
 gr-noaa/gnuradio-noaa.pc.in                        |   11 -
 gr-noaa/grc/CMakeLists.txt                         |   26 -
 gr-noaa/grc/noaa_hrpt_decoder.xml                  |   25 -
 gr-noaa/grc/noaa_hrpt_deframer.xml                 |   16 -
 gr-noaa/grc/noaa_hrpt_pll_cf.xml                   |   34 -
 gr-noaa/include/gnuradio/noaa/CMakeLists.txt       |   31 -
 gr-noaa/include/gnuradio/noaa/api.h                |   33 -
 gr-noaa/include/gnuradio/noaa/hrpt.h               |   39 -
 gr-noaa/include/gnuradio/noaa/hrpt_decoder.h       |   51 -
 gr-noaa/include/gnuradio/noaa/hrpt_deframer.h      |   51 -
 gr-noaa/include/gnuradio/noaa/hrpt_pll_cf.h        |   52 -
 gr-noaa/lib/CMakeLists.txt                         |   92 -
 gr-noaa/lib/gnuradio-noaa.rc.in                    |   55 -
 gr-noaa/lib/hrpt_decoder_impl.cc                   |  206 -
 gr-noaa/lib/hrpt_decoder_impl.h                    |   75 -
 gr-noaa/lib/hrpt_deframer_impl.cc                  |  137 -
 gr-noaa/lib/hrpt_deframer_impl.h                   |   58 -
 gr-noaa/lib/hrpt_pll_cf_impl.cc                    |   93 -
 gr-noaa/lib/hrpt_pll_cf_impl.h                     |   56 -
 gr-noaa/oct/frames-to-png.sh                       |    9 -
 gr-noaa/oct/frames_to_ppm.m                        |   85 -
 gr-noaa/python/noaa/CMakeLists.txt                 |   49 -
 gr-noaa/python/noaa/__init__.py                    |   34 -
 gr-noaa/python/noaa/qa_noaa.py                     |   40 -
 gr-noaa/swig/CMakeLists.txt                        |   56 -
 gr-noaa/swig/noaa_swig.i                           |   42 -
 gr-pager/grc/pager_flex_deinterleave.xml           |    2 +-
 gr-pager/grc/pager_flex_sync.xml                   |    2 +-
 gr-pager/grc/pager_slicer_fb.xml                   |    2 +-
 gr-qtgui/grc/qtgui_block_tree.xml                  |    2 +-
 gr-qtgui/lib/CMakeLists.txt                        |    5 +
 gr-trellis/grc/trellis_encoder_xx.xml              |    2 +-
 gr-trellis/grc/trellis_metrics_x.xml               |    2 +-
 .../grc/trellis_pccc_decoder_combined_xx.xml       |    2 +-
 gr-trellis/grc/trellis_pccc_decoder_x.xml          |    2 +-
 gr-trellis/grc/trellis_pccc_encoder_xx.xml         |    2 +-
 gr-trellis/grc/trellis_permutation.xml             |    2 +-
 .../grc/trellis_sccc_decoder_combined_xx.xml       |    2 +-
 gr-trellis/grc/trellis_sccc_decoder_x.xml          |    2 +-
 gr-trellis/grc/trellis_sccc_encoder_xx.xml         |    2 +-
 gr-trellis/grc/trellis_siso_combined_f.xml         |    2 +-
 gr-trellis/grc/trellis_siso_f.xml                  |    2 +-
 gr-trellis/grc/trellis_viterbi_combined_xx.xml     |    2 +-
 gr-trellis/grc/trellis_viterbi_x.xml               |    2 +-
 gr-uhd/grc/gen_uhd_usrp_blocks.py                  |   92 +-
 gr-uhd/grc/uhd_block_tree.xml                      |    2 +-
 gr-uhd/include/gnuradio/uhd/usrp_source.h          |   77 +
 gr-uhd/lib/usrp_block_impl.h                       |    8 +
 gr-uhd/lib/usrp_sink_impl.cc                       |    8 +-
 gr-uhd/lib/usrp_source_impl.cc                     |  104 +-
 gr-uhd/lib/usrp_source_impl.h                      |    9 +
 gr-uhd/swig/uhd_swig.i                             |   12 +
 gr-utils/CMakeLists.txt                            |   10 +
 gr-utils/python/modtool/__init__.py                |    3 +-
 gr-utils/python/modtool/code_generator.py          |   60 +-
 gr-utils/python/modtool/gr-newmod/CMakeLists.txt   |    9 +-
 .../python/modtool/gr-newmod/lib/CMakeLists.txt    |   16 +-
 gr-utils/python/modtool/grc_xml_generator.py       |    2 +-
 gr-utils/python/modtool/modtool_add.py             |   37 +-
 gr-utils/python/modtool/modtool_rename.py          |    3 -
 gr-utils/python/modtool/templates.py               |  545 +-
 gr-utils/python/utils/grcc                         |   25 +-
 gr-video-sdl/grc/video_block_tree.xml              |    2 +-
 gr-vocoder/grc/vocoder_block_tree.xml              |    2 +-
 gr-vocoder/lib/codec2/fdmdv.c                      |    2 +-
 gr-wxgui/grc/notebook.xml                          |    2 +-
 gr-wxgui/grc/variable_check_box.xml                |    2 +-
 gr-wxgui/grc/variable_chooser.xml                  |    2 +-
 gr-wxgui/grc/variable_slider.xml                   |    2 +-
 gr-wxgui/grc/variable_static_text.xml              |    2 +-
 gr-wxgui/grc/variable_text_box.xml                 |    2 +-
 gr-wxgui/grc/wxgui_constellationsink2.xml          |    2 +-
 gr-wxgui/grc/wxgui_fftsink2.xml                    |    2 +-
 gr-wxgui/grc/wxgui_histosink2.xml                  |    2 +-
 gr-wxgui/grc/wxgui_numbersink2.xml                 |    2 +-
 gr-wxgui/grc/wxgui_scopesink2.xml                  |    2 +-
 gr-wxgui/grc/wxgui_termsink.xml                    |    2 +-
 gr-wxgui/grc/wxgui_waterfallsink2.xml              |    2 +-
 gr-zeromq/grc/zeromq_pub_msg_sink.xml              |    2 +-
 gr-zeromq/grc/zeromq_pub_sink.xml                  |    2 +-
 gr-zeromq/grc/zeromq_pull_msg_source.xml           |    2 +-
 gr-zeromq/grc/zeromq_pull_source.xml               |    2 +-
 gr-zeromq/grc/zeromq_push_msg_sink.xml             |    2 +-
 gr-zeromq/grc/zeromq_push_sink.xml                 |    2 +-
 gr-zeromq/grc/zeromq_rep_msg_sink.xml              |    2 +-
 gr-zeromq/grc/zeromq_rep_sink.xml                  |    2 +-
 gr-zeromq/grc/zeromq_req_msg_source.xml            |    2 +-
 gr-zeromq/grc/zeromq_req_source.xml                |    2 +-
 gr-zeromq/grc/zeromq_sub_msg_source.xml            |    2 +-
 gr-zeromq/grc/zeromq_sub_source.xml                |    2 +-
 gr-zeromq/lib/pull_msg_source_impl.cc              |    4 +-
 gr-zeromq/lib/req_msg_source_impl.cc               |    4 +-
 gr-zeromq/lib/sub_msg_source_impl.cc               |    4 +-
 grc/blocks/block_tree.xml                          |   11 +-
 grc/blocks/epy_block.xml                           |    1 -
 grc/blocks/epy_module.xml                          |    1 -
 grc/blocks/options.xml                             |    6 +-
 grc/blocks/parameter.xml                           |    6 +-
 grc/blocks/variable_function_probe.xml             |   18 +-
 grc/blocks/variable_struct.xml.py                  |    1 -
 grc/core/Block.py                                  |    8 +-
 grc/core/Constants.py                              |    1 +
 grc/core/Element.pyi                               |   54 +
 grc/core/Platform.py                               |   76 +-
 grc/core/generator/Generator.py                    |   35 +-
 grc/core/generator/flow_graph.tmpl                 |   23 +-
 grc/core/utils/expr_utils.py                       |   10 +-
 grc/gui/ActionHandler.py                           |    5 +-
 grc/gui/BlockTreeWindow.py                         |   82 +-
 grc/gui/Constants.py                               |    7 +
 grc/main.py                                        |   13 +-
 grc/test/.cache/v/cache/lastfailed                 |    3 +
 volk                                               |    2 +-
 427 files changed, 1184 insertions(+), 61171 deletions(-)

diff --cc grc/core/Block.py
index ff7f041,8a683a2..9fff5af
--- a/grc/core/Block.py
+++ b/grc/core/Block.py
@@@ -63,59 -59,92 +63,59 @@@ class Block(Element)
          Returns:
              block a new block
          """
 -        # Grab the data
 -        self._doc = (n.find('doc') or '').strip('\n').replace('\\\n', '')
 -        self._imports = map(lambda i: i.strip(), n.findall('import'))
 -        self._make = n.find('make')
 -        self._var_make = n.find('var_make')
 -        self._checks = n.findall('check')
 -        self._callbacks = n.findall('callback')
 -        self._bus_structure_source = n.find('bus_structure_source') or ''
 -        self._bus_structure_sink = n.find('bus_structure_sink') or ''
 -        self.port_counters = [itertools.count(), itertools.count()]
 +        Element.__init__(self, parent=flow_graph)
 +
 +        self._name = n['name']
 +        self._key = n['key']
-         self._category = n.get('category', '')
++        self.category = [cat.strip() for cat in n.get('category', 
'').split('/') if cat.strip()]
 +        self._flags = n.get('flags', '')
 +        self._doc = n.get('doc', '').strip('\n').replace('\\\n', '')
  
 -        # Build the block
 -        Element.__init__(self, flow_graph)
 -
 -        # Grab the data
 -        params = n.findall('param')
 -        sources = n.findall('source')
 -        sinks = n.findall('sink')
 -        self._name = n.find('name')
 -        self._key = n.find('key')
 -        category = (n.find('category') or '').split('/')
 -        self.category = [cat.strip() for cat in category if cat.strip()]
 -        self._flags = n.find('flags') or ''
          # Backwards compatibility
 -        if n.find('throttle') and BLOCK_FLAG_THROTTLE not in self._flags:
 +        if n.get('throttle') and BLOCK_FLAG_THROTTLE not in self._flags:
              self._flags += BLOCK_FLAG_THROTTLE
 -        self._grc_source = n.find('grc_source') or ''
 -        self._block_wrapper_path = n.find('block_wrapper_path')
 -        self._bussify_sink = n.find('bus_sink')
 -        self._bussify_source = n.find('bus_source')
 -        self._var_value = n.find('var_value') or '$value'
 +
 +        self._imports = [i.strip() for i in n.get('import', [])]
 +        self._make = n.get('make')
 +        self._var_make = n.get('var_make')
 +        self._var_value = n.get('var_value', '$value')
 +        self._checks = n.get('check', [])
 +        self._callbacks = n.get('callback', [])
 +
 +        self._grc_source = n.get('grc_source', '')
 +        self._block_wrapper_path = n.get('block_wrapper_path')
 +
 +        params_n = n.get('param', [])
 +        sources_n = n.get('source', [])
 +        sinks_n = n.get('sink', [])
  
          # Get list of param tabs
 -        n_tabs = n.find('param_tab_order') or None
 -        self._param_tab_labels = n_tabs.findall('tab') if n_tabs is not None 
else [DEFAULT_PARAM_TAB]
 -
 -        # Create the param objects
 -        self._params = list()
 -
 -        # Add the id param
 -        self.get_params().append(self.get_parent().get_parent().Param(
 -            block=self,
 -            n=odict({
 -                'name': 'ID',
 -                'key': 'id',
 -                'type': 'id',
 -            })
 -        ))
 -        self.get_params().append(self.get_parent().get_parent().Param(
 -            block=self,
 -            n=odict({
 -                'name': 'Enabled',
 -                'key': '_enabled',
 -                'type': 'raw',
 -                'value': 'True',
 -                'hide': 'all',
 -            })
 -        ))
 -        for param in itertools.imap(lambda n: 
self.get_parent().get_parent().Param(block=self, n=n), params):
 -            key = param.get_key()
 -            # Test against repeated keys
 -            if key in self.get_param_keys():
 -                raise Exception('Key "{}" already exists in 
params'.format(key))
 -            # Store the param
 -            self.get_params().append(param)
 -        # Create the source objects
 -        self._sources = list()
 -        for source in map(lambda n: 
self.get_parent().get_parent().Port(block=self, n=n, dir='source'), sources):
 -            key = source.get_key()
 -            # Test against repeated keys
 -            if key in self.get_source_keys():
 -                raise Exception('Key "{}" already exists in 
sources'.format(key))
 -            # Store the port
 -            self.get_sources().append(source)
 -        self.back_ofthe_bus(self.get_sources())
 -        # Create the sink objects
 -        self._sinks = list()
 -        for sink in map(lambda n: 
self.get_parent().get_parent().Port(block=self, n=n, dir='sink'), sinks):
 -            key = sink.get_key()
 -            # Test against repeated keys
 -            if key in self.get_sink_keys():
 -                raise Exception('Key "{}" already exists in 
sinks'.format(key))
 -            # Store the port
 -            self.get_sinks().append(sink)
 -        self.back_ofthe_bus(self.get_sinks())
 -        self.current_bus_structure = {'source': '', 'sink': ''}
 +        self._param_tab_labels = n.get('param_tab_order', {}).get('tab') or 
[DEFAULT_PARAM_TAB]
 +        self._params = []
 +        self._init_params(
 +            params_n=params_n,
 +            has_sinks=len(sinks_n),
 +            has_sources=len(sources_n)
 +        )
 +
 +        self.port_counters = [itertools.count(), itertools.count()]
 +        self._sources = self._init_ports(sources_n, direction='source')
 +        self._sinks = self._init_ports(sinks_n, direction='sink')
 +
 +        self._epy_source_hash = -1  # for epy blocks
 +        self._epy_reload_error = None
 +
 +        self._init_bus_ports(n)
 +
 +    def _add_param(self, key, name, value='', type='raw', **kwargs):
 +        n = {'key': key, 'name': name, 'value': value, 'type': type}
 +        n.update(kwargs)
 +        param = self.parent_platform.Param(block=self, n=n)
 +        self._params.append(param)
 +
 +    def _init_params(self, params_n, has_sources, has_sinks):
 +        self._add_param(key='id', name='ID', type='id')
 +        self._add_param(key='_enabled', name='Enabled', value='True', 
type='raw', hide='all')
  
          # Virtual source/sink and pad source/sink blocks are
          # indistinguishable from normal GR blocks. Make explicit
diff --cc grc/core/Platform.py
index 069870d,9b25e67..be7b60c
--- a/grc/core/Platform.py
+++ b/grc/core/Platform.py
@@@ -67,19 -63,19 +67,20 @@@ class Platform(Element)
          self._block_dtd = Constants.BLOCK_DTD
          self._default_flow_graph = Constants.DEFAULT_FLOW_GRAPH
  
 -        # Create a dummy flow graph for the blocks
 -        self._flow_graph = Element(self)
 -        self._flow_graph.connections = []
 -
 -        self.blocks = odict()
 -        self._blocks_n = odict()
 +        self.blocks = {}
 +        self._blocks_n = {}
-         self._category_trees_n = []
+         self._block_categories = {}
          self.domains = {}
          self.connection_templates = {}
  
          self._auto_hier_block_generate_chain = set()
  
 +        # Create a dummy flow graph for the blocks
 +        self._flow_graph = Element.__new__(FlowGraph)
 +        Element.__init__(self._flow_graph, self)
 +        self._flow_graph.connections = []
-         self.load_blocks()
++
+         self.build_block_library()
  
      def __str__(self):
          return 'Platform - {}({})'.format(self.config.key, self.config.name)
@@@ -134,13 -130,12 +135,13 @@@
              Messages.send('>>> Generate Error: {}: {}\n'.format(file_path, 
str(e)))
              return False
  
 -        self.load_block_xml(generator.get_file_path_xml())
 +        self.load_block_xml(generator.file_path_xml)
          return True
  
-     def load_blocks(self):
+     def build_block_library(self):
          """load the blocks and block tree from the search paths"""
          self._docstring_extractor.start()
 +
          # Reset
          self.blocks.clear()
          self._blocks_n.clear()
@@@ -162,9 -157,21 +163,21 @@@
                  # print >> sys.stderr, 'Warning: Block validation 
failed:\n\t%s\n\tIgnoring: %s' % (e, xml_file)
                  pass
              except Exception as e:
-                 raise
 -                print >> sys.stderr, 'Warning: XML parsing 
failed:\n\t%r\n\tIgnoring: %s' % (e, xml_file)
 +                print('Warning: XML parsing failed:\n\t%r\n\tIgnoring: %s' % 
(e, xml_file), file=sys.stderr)
  
+         # Add blocks to block tree
 -        for key, block in self.blocks.iteritems():
++        for key, block in six.iteritems(self.blocks):
+             category = self._block_categories.get(key, block.category)
+             # Blocks with empty categories are hidden
+             if not category:
+                 continue
+             root = category[0]
+             if root.startswith('[') and root.endswith(']'):
+                 category[0] = root[1:-1]
+             else:
+                 category.insert(0, Constants.DEFAULT_BLOCK_MODULE_NAME)
+             block.category = category
+ 
          self._docstring_extractor.finish()
          # self._docstring_extractor.wait()
  
@@@ -202,8 -209,19 +215,19 @@@
      def load_category_tree_xml(self, xml_file):
          """Validate and parse category tree file and add it to list"""
          ParseXML.validate_dtd(xml_file, Constants.BLOCK_TREE_DTD)
-         n = ParseXML.from_file(xml_file).get('cat', {})
-         self._category_trees_n.append(n)
+         xml = ParseXML.from_file(xml_file)
+         path = []
+ 
+         def load_category(cat_n):
 -            path.append(cat_n.find('name').strip())
 -            for block_key in cat_n.findall('block'):
++            path.append(cat_n.get('name').strip())
++            for block_key in cat_n.get('block', []):
+                 if block_key not in self._block_categories:
+                     self._block_categories[block_key] = list(path)
 -            for sub_cat_n in cat_n.findall('cat'):
++            for sub_cat_n in cat_n.get('cat', []):
+                 load_category(sub_cat_n)
+             path.pop()
+ 
 -        load_category(xml.find('cat'))
++        load_category(xml.get('cat', {}))
  
      def load_domain_xml(self, xml_file):
          """Load a domain properties and connection templates from XML"""
@@@ -234,61 -252,23 +258,23 @@@
                  color = None
  
          self.domains[key] = dict(
 -            name=n.find('name') or key,
 -            multiple_sinks=to_bool(n.find('multiple_sinks'), True),
 -            multiple_sources=to_bool(n.find('multiple_sources'), False),
 +            name=n.get('name') or key,
 +            multiple_sinks=to_bool(n.get('multiple_sinks'), True),
 +            multiple_sources=to_bool(n.get('multiple_sources'), False),
              color=color
          )
 -        for connection_n in n.findall('connection'):
 -            key = (connection_n.find('source_domain'), 
connection_n.find('sink_domain'))
 +        for connection_n in n.get('connection', []):
 +            key = (connection_n.get('source_domain'), 
connection_n.get('sink_domain'))
              if not all(key):
 -                print >> sys.stderr, 'Warning: Empty domain key(s) in 
connection template.\n\t{}'.format(xml_file)
 +                print('Warning: Empty domain key(s) in connection 
template.\n\t{}'.format(xml_file), file=sys.stderr)
              elif key in self.connection_templates:
 -                print >> sys.stderr, 'Warning: Connection template "{}" 
already exists.\n\t{}'.format(key, xml_file)
 +                print('Warning: Connection template "{}" already 
exists.\n\t{}'.format(key, xml_file), file=sys.stderr)
              else:
 -                self.connection_templates[key] = connection_n.find('make') or 
''
 +                self.connection_templates[key] = connection_n.get('make') or 
''
  
-     def load_block_tree(self, block_tree):
-         """
-         Load a block tree with categories and blocks.
-         Step 1: Load all blocks from the xml specification.
-         Step 2: Load blocks with builtin category specifications.
- 
-         Args:
-             block_tree: the block tree object
-         """
-         # Recursive function to load categories and blocks
-         def load_category(cat_n, parent=None):
-             # Add this category
-             parent = (parent or []) + [cat_n.get('name')]
-             block_tree.add_block(parent)
-             # Recursive call to load sub categories
-             for cat in cat_n.get('cat', []):
-                 load_category(cat, parent)
-             # Add blocks in this category
-             for block_key in cat_n.get('block', []):
-                 if block_key not in self.blocks:
-                     print('Warning: Block key "{}" not found when loading 
category tree.'.format(block_key), file=sys.stderr)
-                     continue
-                 block = self.blocks[block_key]
-                 # If it exists, the block's category shall not be overridden 
by the xml tree
-                 if not block.get_category():
-                     block.set_category(parent)
- 
-         # Recursively load the category trees and update the categories for 
each block
-         for category_tree_n in self._category_trees_n:
-             load_category(category_tree_n)
- 
-         # Add blocks to block tree
-         for block in six.itervalues(self.blocks):
-             # Blocks with empty categories are hidden
-             if not block.get_category():
-                 continue
-             block_tree.add_block(block.get_category(), block)
- 
      def _save_docstring_extraction_result(self, key, docstrings):
          docs = {}
 -        for match, docstring in docstrings.iteritems():
 +        for match, docstring in six.iteritems(docstrings):
              if not docstring or match.endswith('_sptr'):
                  continue
              docstring = docstring.replace('\n\n', '\n').strip()
diff --cc grc/core/generator/Generator.py
index c3308d6,fb7a3af..9c7d07e
--- a/grc/core/generator/Generator.py
+++ b/grc/core/generator/Generator.py
@@@ -144,16 -141,16 +144,16 @@@ class TopBlockGenerator(object)
                  pass
              return code
  
-         blocks = expr_utils.sort_objects(
+         blocks_all = expr_utils.sort_objects(
 -            filter(lambda b: b.get_enabled() and not b.get_bypassed(), 
fg.blocks),
 -            lambda b: b.get_id(), _get_block_sort_text
 +            [b for b in fg.blocks if b.get_enabled() and not 
b.get_bypassed()],
 +            operator.methodcaller('get_id'), _get_block_sort_text
          )
-         deprecated_block_keys = set(block.get_name() for block in blocks if 
block.is_deprecated)
 -        deprecated_block_keys = set(block.get_name() for block in blocks_all 
if block.is_deprecated)
++        deprecated_block_keys = set(b.get_name() for b in blocks_all if 
b.is_deprecated)
          for key in deprecated_block_keys:
              Messages.send_warning("The block {!r} is deprecated.".format(key))
  
          # List of regular blocks (all blocks minus the special ones)
-         blocks = [b for b in blocks if b not in imports and b not in 
parameters]
 -        blocks = filter(lambda b: b not in (imports + parameters), blocks_all)
++        blocks = [b for b in blocks_all if b not in imports and b not in 
parameters]
  
          for block in blocks:
              key = block.get_key()
@@@ -265,8 -264,9 +267,9 @@@ class HierBlockGenerator(TopBlockGenera
              file_path: where to write the py file (the xml goes into 
HIER_BLOCK_LIB_DIR)
          """
          TopBlockGenerator.__init__(self, flow_graph, file_path)
 -        platform = flow_graph.get_parent()
++        platform = flow_graph.parent
  
-         hier_block_lib_dir = 
flow_graph.parent_platform.config.hier_block_lib_dir
+         hier_block_lib_dir = platform.config.hier_block_lib_dir
          if not os.path.exists(hier_block_lib_dir):
              os.mkdir(hier_block_lib_dir)
  
diff --cc grc/core/utils/expr_utils.py
index 0577f06,2059cef..555bd70
--- a/grc/core/utils/expr_utils.py
+++ b/grc/core/utils/expr_utils.py
@@@ -104,9 -99,9 +104,9 @@@ def expr_replace(expr, replace_dict)
      Returns:
          a new expression with the prepend
      """
-     expr_splits = expr_split(expr)
+     expr_splits = expr_split(expr, var_chars=VAR_CHARS + '.')
      for i, es in enumerate(expr_splits):
 -        if es in replace_dict.keys():
 +        if es in list(replace_dict.keys()):
              expr_splits[i] = replace_dict[es]
      return ''.join(expr_splits)
  
@@@ -194,8 -189,3 +194,4 @@@ def sort_objects(objects, get_id, get_e
      sorted_ids = sort_variables(id2expr)
      # Return list of sorted objects
      return [id2obj[id] for id in sorted_ids]
 +
- 
- if __name__ == '__main__':
-     for i in sort_variables({'x': '1', 'y': 'x+1', 'a': 'x+y', 'b': 'y+1', 
'c': 'a+b+x+y'}):
-         print(i)
diff --cc grc/gui/BlockTreeWindow.py
index 26086f5,f49eb6c..89aac53
--- a/grc/gui/BlockTreeWindow.py
+++ b/grc/gui/BlockTreeWindow.py
@@@ -17,48 -17,71 +17,61 @@@ along with this program; if not, write 
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
  """
  
 -import pygtk
 -pygtk.require('2.0')
 -import gtk
 -import gobject
 +from __future__ import absolute_import
 +import six
 +
 +import gi
 +gi.require_version('Gtk', '3.0')
 +from gi.repository import Gtk
 +from gi.repository import Gdk
 +from gi.repository import GObject
  
  from . import Actions, Utils
- from .Constants import DEFAULT_BLOCKS_WINDOW_WIDTH, DND_TARGETS
+ from . import Constants
+ 
  
 -NAME_INDEX = 0
 -KEY_INDEX = 1
 -DOC_INDEX = 2
 -
 -DOC_MARKUP_TMPL = """\
 -#set $docs = []
 -#if $doc.get('')
 -    #set $docs += $doc.pop('').splitlines() + ['']
 -#end if
 -#for b, d in $doc.iteritems()
 -    #set $docs += ['--- {0} ---'.format(b)] + d.splitlines() + ['']
 -#end for
 -#set $len_out = 0
 -#for $n, $line in $enumerate($docs[:-1])
 -#if $n
 -
 -#end if
 -$encode($line)#slurp
 -#set $len_out += $len($line)
 -#if $n > 10 or $len_out > 500
 -
 -...#slurp
 -#break
 -#end if
 -#end for
 -#if $len_out == 0
 -undocumented#slurp
 -#end if"""
 -
 -CAT_MARKUP_TMPL = """
 -#set $name = $cat[-1]
 -#if len($cat) > 1
 -Category: $cat[-1]
 -##
 -#elif $name == 'Core'
 -Module: Core
 -
 -This subtree is meant for blocks included with GNU Radio (in-tree).
 -##
 -#elif $name == $default_module
 -This subtree holds all blocks (from OOT modules) that specify no module name. 
\
 -The module name is the root category enclosed in square brackets.
 -
 -Please consider contacting OOT module maintainer for any block in here \
 -and kindly ask to update their GRC Block Descriptions or Block Tree to 
include a module name.
 -#else
 -Module: $name
 -##
 -#end if
 -""".strip()
 -
 -
 -class BlockTreeWindow(gtk.VBox):
 +NAME_INDEX, KEY_INDEX, DOC_INDEX = range(3)
 +
 +
 +def _format_doc(doc):
 +    docs = []
 +    if doc.get(''):
 +        docs += doc.pop('').splitlines() + ['']
 +    for block_name, docstring in six.iteritems(doc):
 +        docs.append('--- {0} ---'.format(block_name))
 +        docs += docstring.splitlines()
 +        docs.append('')
 +    out = ''
 +    for n, line in enumerate(docs[:-1]):
 +        if n:
 +            out += '\n'
 +        out += Utils.encode(line)
 +        if n > 10 or len(out) > 500:
 +            out += '\n...'
 +            break
 +    return out or 'undocumented'
 +
 +
++def _format_cat_tooltip(category):
++    tooltip = '{}: {}'.format('Category' if len(category) > 1 else 'Module', 
category[-1])
++
++    if category == ('Core',):
++        tooltip += '\n\nThis subtree is meant for blocks included with GNU 
Radio (in-tree).'
++
++    elif category == (Constants.DEFAULT_BLOCK_MODULE_NAME,):
++        tooltip += '\n\n' + Constants.DEFAULT_BLOCK_MODULE_TOOLTIP
++
++    return tooltip
++
++
 +class BlockTreeWindow(Gtk.VBox):
      """The block selection panel."""
  
 -    def __init__(self, platform, get_flow_graph):
 +    __gsignals__ = {
 +        'create_new_block': (GObject.SIGNAL_RUN_FIRST, None, (str,))
 +    }
 +
 +    def __init__(self, platform):
          """
          BlockTreeWindow constructor.
          Create a tree view of the possible blocks in the platform.
@@@ -96,37 -121,49 +109,45 @@@
          self.treeview.connect('button-press-event', 
self._handle_mouse_button_press)
          self.treeview.connect('key-press-event', 
self._handle_search_key_press)
  
 -        self.treeview.get_selection().set_mode('single')
 -        renderer = gtk.CellRendererText()
 -        column = gtk.TreeViewColumn('Blocks', renderer, text=NAME_INDEX)
 +        self.treeview.get_selection().set_mode(Gtk.SelectionMode.SINGLE)
 +        renderer = Gtk.CellRendererText()
 +        column = Gtk.TreeViewColumn('Blocks', renderer, text=NAME_INDEX)
          self.treeview.append_column(column)
--        # try to enable the tooltips (available in pygtk 2.12 and above)
--        try:
--            self.treeview.set_tooltip_column(DOC_INDEX)
--        except:
--            pass
++        self.treeview.set_tooltip_column(DOC_INDEX)
          # setup sort order
          column.set_sort_column_id(0)
 -        self.treestore.set_sort_column_id(0, gtk.SORT_ASCENDING)
 +        self.treestore.set_sort_column_id(0, Gtk.SortType.ASCENDING)
          # setup drag and drop
-         self.treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, 
DND_TARGETS, Gdk.DragAction.COPY)
 -        self.treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK, 
Constants.DND_TARGETS, gtk.gdk.ACTION_COPY)
++        self.treeview.enable_model_drag_source(Gdk.ModifierType.BUTTON1_MASK, 
Constants.DND_TARGETS, Gdk.DragAction.COPY)
          self.treeview.connect('drag-data-get', self._handle_drag_get_data)
          # make the scrolled window to hold the tree view
 -        scrolled_window = gtk.ScrolledWindow()
 -        scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
 +        scrolled_window = Gtk.ScrolledWindow()
 +        scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, 
Gtk.PolicyType.AUTOMATIC)
          scrolled_window.add_with_viewport(self.treeview)
-         scrolled_window.set_size_request(DEFAULT_BLOCKS_WINDOW_WIDTH, -1)
+         
scrolled_window.set_size_request(Constants.DEFAULT_BLOCKS_WINDOW_WIDTH, -1)
 -        self.pack_start(scrolled_window)
 +        self.pack_start(scrolled_window, True, True, 0)
          # map categories to iters, automatic mapping for root
          self._categories = {tuple(): None}
          self._categories_search = {tuple(): None}
-         # add blocks and categories
-         self.platform.load_block_tree(self)
          self.platform.block_docstrings_loaded_callback = self.update_docs
+         self.repopulate()
  
      def clear(self):
-         self.treestore.clear();
-         self._categories = {tuple(): None}
+         self.treestore.clear()
+         self._categories = {(): None}
+ 
+     def repopulate(self):
+         self.clear()
 -        for block in self.platform.blocks.itervalues():
++        for block in six.itervalues(self.platform.blocks):
+             if block.category:
+                 self.add_block(block)
+         self.expand_module_in_tree()
+ 
+     def expand_module_in_tree(self, module_name='Core'):
+         self.treeview.collapse_all()
+         core_module_iter = self._categories.get((module_name,))
+         if core_module_iter:
+             
self.treeview.expand_row(self.treestore.get_path(core_module_iter), False)
  
      ############################################################
      ## Block Tree Methods
@@@ -137,29 -174,25 +158,23 @@@
          Add only the category when block is None.
  
          Args:
-             category: the category list or path string
              block: the block object or None
          """
-         if treestore is None:
-             treestore = self.treestore
-         if categories is None:
-             categories = self._categories
- 
-         if isinstance(category, (str, six.text_type)):
-             category = category.split('/')
-         category = tuple(x for x in category if x)  # tuple is hashable
+         treestore = treestore or self.treestore
+         categories = categories or self._categories
+ 
+         category = tuple(filter(str, block.category))  # tuple is hashable, 
remove empty cats
+ 
          # add category and all sub categories
-         for i, cat_name in enumerate(category):
-             sub_category = category[:i+1]
-             if sub_category not in categories:
-                 iter_ = 
treestore.insert_before(categories[sub_category[:-1]], None)
-                 treestore.set_value(iter_, NAME_INDEX, cat_name)
+         for level, parent_cat_name in enumerate(category, 1):
+             parent_category = category[:level]
+             if parent_category not in categories:
+                 iter_ = 
treestore.insert_before(categories[parent_category[:-1]], None)
+                 treestore.set_value(iter_, NAME_INDEX, parent_cat_name)
                  treestore.set_value(iter_, KEY_INDEX, '')
-                 treestore.set_value(iter_, DOC_INDEX, 'Category: ' + 
Utils.encode(cat_name))
-                 categories[sub_category] = iter_
 -                treestore.set_value(iter_, DOC_INDEX, Utils.parse_template(
 -                    CAT_MARKUP_TMPL, cat=parent_category, 
default_module=Constants.DEFAULT_BLOCK_MODULE_NAME))
++                treestore.set_value(iter_, DOC_INDEX, 
_format_cat_tooltip(parent_cat_name))
+                 categories[parent_category] = iter_
 -
          # add block
-         if block is None:
-             return
          iter_ = treestore.insert_before(categories[category], None)
          treestore.set_value(iter_, NAME_INDEX, block.get_name())
          treestore.set_value(iter_, KEY_INDEX, block.get_key())
@@@ -212,10 -256,10 +227,10 @@@
          key = widget.get_text().lower()
          if not key:
              self.treeview.set_model(self.treestore)
-             self.treeview.collapse_all()
+             self.expand_module_in_tree()
          else:
 -            matching_blocks = filter(lambda b: key in b.get_key().lower() or 
key in b.get_name().lower(),
 -                                     self.platform.blocks.values())
 +            matching_blocks = [b for b in list(self.platform.blocks.values())
 +                               if key in b.get_key().lower() or key in 
b.get_name().lower()]
  
              self.treestore_search.clear()
              self._categories_search = {tuple(): None}
diff --cc grc/gui/Constants.py
index 8bb15ac,022564c..035a7f8
--- a/grc/gui/Constants.py
+++ b/grc/gui/Constants.py
@@@ -96,6 -96,6 +96,13 @@@ SCROLL_DISTANCE = 1
  # How close the mouse click can be to a line and register a connection select.
  LINE_SELECT_SENSITIVITY = 5
  
++DEFAULT_BLOCK_MODULE_TOOLTIP = """\
++This subtree holds all blocks (from OOT modules) that specify no module name. 
\
++The module name is the root category enclosed in square brackets.
++
++Please consider contacting OOT module maintainer for any block in here \
++and kindly ask to update their GRC Block Descriptions or Block Tree to 
include a module name."""
++
  
  def update_font_size(font_size):
      global PORT_SEPARATION, BLOCK_FONT, PORT_FONT, PARAM_FONT, FONT_SIZE
diff --cc grc/main.py
index 810ac7c,0edab40..ff0811e
--- a/grc/main.py
+++ b/grc/main.py
@@@ -15,13 -15,9 +15,12 @@@
  # along with this program; if not, write to the Free Software
  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA
  
- from __future__ import absolute_import
- import optparse
+ import argparse
  
 -import gtk
 +import gi
 +gi.require_version('Gtk', '3.0')
 +from gi.repository import Gtk
 +
  from gnuradio import gr
  
  from .gui.Platform import Platform
@@@ -38,13 -34,13 +37,13 @@@ This is free software, and you are welc
  
  
  def main():
-     parser = optparse.OptionParser(
-         usage='usage: %prog [options] [saved flow graphs]',
-         version=VERSION_AND_DISCLAIMER_TEMPLATE % gr.version())
-     options, args = parser.parse_args()
+     parser = argparse.ArgumentParser(
+         description=VERSION_AND_DISCLAIMER_TEMPLATE % gr.version())
+     parser.add_argument('flow_graphs', nargs='*')
+     args = parser.parse_args()
  
      try:
 -        gtk.window_set_default_icon(gtk.IconTheme().load_icon('gnuradio-grc', 
256, 0))
 +        Gtk.window_set_default_icon(Gtk.IconTheme().load_icon('gnuradio-grc', 
256, 0))
      except:
          pass
  
@@@ -54,6 -50,6 +53,6 @@@
          version_parts=(gr.major_version(), gr.api_version(), 
gr.minor_version()),
          install_prefix=gr.prefix()
      )
-     ActionHandler(args, platform)
+     ActionHandler(args.flow_graphs, platform)
 -    gtk.main()
 +    Gtk.main()
  



reply via email to

[Prev in Thread] Current Thread [Next in Thread]