Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package gnuradio for openSUSE:Factory checked in at 2021-06-14 23:11:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/gnuradio (Old) and /work/SRC/openSUSE:Factory/.gnuradio.new.32437 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "gnuradio" Mon Jun 14 23:11:05 2021 rev:44 rq:899878 version:3.8.3.1 Changes: -------- --- /work/SRC/openSUSE:Factory/gnuradio/gnuradio.changes 2021-04-14 10:10:58.733493671 +0200 +++ /work/SRC/openSUSE:Factory/.gnuradio.new.32437/gnuradio.changes 2021-06-14 23:11:34.772804026 +0200 @@ -1,0 +2,34 @@ +Fri Jun 11 19:00:29 UTC 2021 - Wojciech Kazubski <w...@ire.pw.edu.pl> + +- Update to version 3.8.3.1 + * This is a PATCH level revision. The API is compatible with C++ + code written for previous v3.8 releases. ABI (shared library + signature) is intended to be compatible, so code linked + against v3.8.3.0 should not require recompilation. + * Build system + + Improved messages related to dependencies MPIR and GMP. Only + one of these packages is required, and the previous error + messages were confusing. + * GRC + + Parameter expressions and/or values can be displayed in blocks + on the flowgraph. Previously, only values were displayed. + + Vector length is now correctly applied to all input ports. + + Validation has been improved. Raw types are validated. Port + connections are checked by type rather than by item size. + + Variable names that cause conflicts in Python code (e.g., + package names) are rejected. + + Bus logic fixes. + + Blocks can no longer be dragged off the screen and lost + forever. + * gr-dtv + + VL-SNR bugs fixed (incorrect constants). + * gr-qtgui + + Improve autoscaling for vector sinks. + * gr_filter_design + + "File/Save" is disabled until the taps have been computed, + and the GUI is reset after a save, to make it clearer which + data is being saved. + + Entries are hidden for parameters that do not apply to the + selected filter type. + +------------------------------------------------------------------- Old: ---- gnuradio-3.8.3.0.tar.gz New: ---- gnuradio-3.8.3.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ gnuradio.spec ++++++ --- /var/tmp/diff_new_pack.inMwwW/_old 2021-06-14 23:11:35.196804791 +0200 +++ /var/tmp/diff_new_pack.inMwwW/_new 2021-06-14 23:11:35.200804799 +0200 @@ -23,7 +23,7 @@ %endif %bcond_without docs Name: gnuradio -Version: 3.8.3.0 +Version: 3.8.3.1 Release: 0 Summary: GNU software radio License: GPL-3.0-or-later ++++++ gnuradio-3.8.3.0.tar.gz -> gnuradio-3.8.3.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/CHANGELOG.md new/gnuradio-3.8.3.1/CHANGELOG.md --- old/gnuradio-3.8.3.0/CHANGELOG.md 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/CHANGELOG.md 2021-06-10 22:31:35.000000000 +0200 @@ -7,6 +7,52 @@ Older Logs can be found in `docs/RELEASE-NOTES-*`. +## [3.8.3.1] - 2021-06-10 + +This is a PATCH level revision. The API is compatible with C++ code written for previous v3.8 releases. ABI (shared library signature) is intended to be compatible, so code linked against v3.8.3.0 should not require recompilation. + +### Changed + +#### Build system + +- Improved messages related to dependencies MPIR and GMP. Only one of these packages is required, and the previous error messages were confusing. + +#### GRC + +- Parameter expressions and/or values can be displayed in blocks on the flowgraph. Previously, only values were displayed. Look for the "Show Parameter ..." toggles under the View menu. +- Vector length is now correctly applied to all input ports. +- Validation has been improved. Raw types are validated. Port connections are checked by type rather than by item size. +- Variable names that cause conflicts in Python code (e.g., package names) are rejected. +- Bus logic fixes. +- Blocks can no longer be dragged off the screen and lost forever. + +#### gr-dtv + +- VL-SNR bugs fixed (incorrect constants). + +#### gr-qtgui + +- Improve autoscaling for vector sinks. + +#### gr_filter_design + +- "File/Save" is disabled until the taps have been computed, and the GUI is reset after a save, to make it clearer which data is being saved. +- Entries are hidden for parameters that do not apply to the selected filter type. + +At LEAST the following authors contributed to this release. + +- 0xloem <0xl...@gmail.com> +- Christophe Seguinot <christophe.segui...@univ-lille.fr> +- David Pi <david.pi...@gmail.com> +- Igor Freire <i...@blockstream.com> +- Jeff Long <willco...@gmail.com> +- Josh Morman <jmor...@perspectalabs.com> +- Marcus M??ller <mmuel...@gnuradio.org> +- Ron Economos <w...@comcast.net> +- Solomon Tan <solomonbsto...@yahoo.com.au> +- Volker Schroer +- Zackery Spytz <zsp...@gmail.com> + ## [3.8.3.0] - 2021-03-17 API is compatible with C++ code written against previous v3.8 releases. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/CMakeLists.txt new/gnuradio-3.8.3.1/CMakeLists.txt --- old/gnuradio-3.8.3.0/CMakeLists.txt 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/CMakeLists.txt 2021-06-10 22:31:35.000000000 +0200 @@ -53,7 +53,7 @@ SET(VERSION_MAJOR 3) SET(VERSION_API 8) SET(VERSION_ABI 3) -SET(VERSION_PATCH 0) +SET(VERSION_PATCH 1) include(GrVersion) #setup version info # Minimum dependency versions for central dependencies: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/cmake/Modules/FindMPLIB.cmake new/gnuradio-3.8.3.1/cmake/Modules/FindMPLIB.cmake --- old/gnuradio-3.8.3.0/cmake/Modules/FindMPLIB.cmake 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/cmake/Modules/FindMPLIB.cmake 2021-06-10 22:31:35.000000000 +0200 @@ -1,7 +1,7 @@ find_package(GMP) -find_package(MPIR) if(GMP_FOUND) + message(STATUS "Using GMP.") set(GR_MPLIB_GMP True) set(MPLIB_DEFINITIONS "-DGR_MPLIB_GMP" ${GMP_DEFINITIONS}) set(MPLIB_INCLUDE_DIR ${GMP_INCLUDE_DIR}) @@ -10,6 +10,9 @@ set(MPLIB_PC_ADD_CFLAGS ${GMP_PC_ADD_CFLAGS}) set(MPLIB_PC_ADD_LIBS ${GMP_PC_ADD_LIBS}) else(GMP_FOUND) + message(STATUS "GMP not found; this is not a problem if MPIR can be found.") + find_package(MPIR REQUIRED) + message(STATUS "MPIR found") set(GR_MPLIB_MPIR True) set(MPLIB_DEFINITIONS "-DGR_MPLIB_MPIR" ${MPIR_DEFINITIONS}) set(MPLIB_INCLUDE_DIR ${MPIR_INCLUDE_DIR}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gnuradio-runtime/python/gnuradio/gr/tag_utils.py new/gnuradio-3.8.3.1/gnuradio-runtime/python/gnuradio/gr/tag_utils.py --- old/gnuradio-3.8.3.0/gnuradio-runtime/python/gnuradio/gr/tag_utils.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gnuradio-runtime/python/gnuradio/gr/tag_utils.py 2021-06-10 22:31:35.000000000 +0200 @@ -20,15 +20,6 @@ newtag.srcid = pmt.to_python(tag.srcid) return newtag -def tag_to_pmt(tag): - """ Convert a Python-readable object to a stream tag """ - newtag = gr.tag_t() - newtag.offset = tag.offset - newtag.key = pmt.to_python(tag.key) - newtag.value = pmt.from_python(tag.value) - newtag.srcid = pmt.from_python(tag.srcid) - return newtag - def python_to_tag(tag_struct): """ Convert a Python list/tuple/dictionary to a stream tag. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-audio/lib/windows/windows_sink.cc new/gnuradio-3.8.3.1/gr-audio/lib/windows/windows_sink.cc --- old/gnuradio-3.8.3.0/gr-audio/lib/windows/windows_sink.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-audio/lib/windows/windows_sink.cc 2021-06-10 22:31:35.000000000 +0200 @@ -101,6 +101,10 @@ (wave_format.wBitsPerSample / 8); // room for 16-bit audio on two channels. d_wave_write_event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!d_wave_write_event) { + GR_LOG_ERROR(d_logger, "CreateEvent() failed"); + throw std::runtime_error("CreateEvent() failed"); + } if (open_waveout_device() < 0) { perror("audio_windows_sink:open_waveout_device() failed\n"); throw std::runtime_error("audio_windows_sink:open_waveout_device() failed"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-blocks/lib/message_debug_impl.cc new/gnuradio-3.8.3.1/gr-blocks/lib/message_debug_impl.cc --- old/gnuradio-3.8.3.0/gr-blocks/lib/message_debug_impl.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-blocks/lib/message_debug_impl.cc 2021-06-10 22:31:35.000000000 +0200 @@ -78,7 +78,11 @@ std::cout << "***********************************\n"; } -int message_debug_impl::num_messages() { return (int)d_messages.size(); } +int message_debug_impl::num_messages() +{ + gr::thread::scoped_lock guard(d_mutex); + return (int)d_messages.size(); +} pmt::pmt_t message_debug_impl::get_message(int i) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc new/gnuradio-3.8.3.1/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc --- old/gnuradio-3.8.3.0/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-dtv/lib/dvb/dvb_ldpc_bb_impl.cc 2021-06-10 22:31:35.000000000 +0200 @@ -279,7 +279,7 @@ break; case C1_5_VLSNR_SF2: nbch = 2680; - q_val = 135; + q_val = 36; frame_size -= SHORT_PUNCTURING_SET1; frame_size_real -= SHORT_PUNCTURING_SET1; Xs = 560; @@ -296,7 +296,7 @@ break; case C1_5_VLSNR: nbch = 3240; - q_val = 135; + q_val = 36; frame_size -= SHORT_PUNCTURING_SET2; frame_size_real -= SHORT_PUNCTURING_SET2; P = 10; @@ -312,7 +312,7 @@ break; case C1_3_VLSNR: nbch = 5400; - q_val = 120; + q_val = 30; frame_size -= SHORT_PUNCTURING_SET2; frame_size_real -= SHORT_PUNCTURING_SET2; P = 8; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc new/gnuradio-3.8.3.1/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc --- old/gnuradio-3.8.3.0/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-dtv/lib/dvbs2/dvbs2_physical_cc_impl.cc 2021-06-10 22:31:35.000000000 +0200 @@ -876,7 +876,7 @@ } else if (vlsnr_set == VLSNR_SET1) { for (int i = 0; i < noutput_items / 2; i += (((slots * 90) + 90) + pilot_symbols + VLSNR_HEADER_LENGTH + 36)) { - n = 0; + n = 900; slot_count = 10; group = 0; symbols = 0; @@ -1079,7 +1079,7 @@ } else { /* VL-SNR set 2 */ for (int i = 0; i < noutput_items / 2; i += (((slots * 90) + 90) + pilot_symbols + VLSNR_HEADER_LENGTH + 36)) { - n = 0; + n = 900; slot_count = 10; group = 0; symbols = 0; @@ -1608,15 +1608,15 @@ 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, - 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, - 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, - 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, - 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, - 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, - 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, - 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, + 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, + 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, + 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, + 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, @@ -1624,16 +1624,16 @@ 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, - 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, - 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, - 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, - 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, - 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, + 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, + 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, + 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, + 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, + 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, + 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-filter/grc/filter_rational_resampler_xxx.block.yml new/gnuradio-3.8.3.1/gr-filter/grc/filter_rational_resampler_xxx.block.yml --- old/gnuradio-3.8.3.0/gr-filter/grc/filter_rational_resampler_xxx.block.yml 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-filter/grc/filter_rational_resampler_xxx.block.yml 2021-06-10 22:31:35.000000000 +0200 @@ -51,7 +51,7 @@ % else: taps=None, % endif - % if float(fbw) != 0: + % if fbw: fractional_bw=${fbw}) % else: fractional_bw=None) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-filter/python/filter/design/filter_design.py new/gnuradio-3.8.3.1/gr-filter/python/filter/design/filter_design.py --- old/gnuradio-3.8.3.0/gr-filter/python/filter/design/filter_design.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-filter/python/filter/design/filter_design.py 2021-06-10 22:31:35.000000000 +0200 @@ -124,6 +124,7 @@ self.gui.fselectComboBox.removeItem(ind) self.gui.action_save.triggered.connect(self.action_save_dialog) + self.gui.action_save.setEnabled(False) self.gui.action_open.triggered.connect(self.action_open_dialog) self.gui.filterTypeComboBox.currentIndexChanged['const QString&'].connect(self.changed_filter_type) @@ -601,7 +602,6 @@ def changed_fselect(self, ftype): - strftype = ftype if(ftype == "FIR"): self.gui.iirfilterTypeComboBox.hide() self.gui.iirfilterBandComboBox.hide() @@ -630,42 +630,48 @@ #self.design() def set_order(self, ftype): - strftype = ftype if(ftype == "Bessel"): self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbesselPage) + self.changed_iirfilter_band(self.gui.iirfilterBandComboBox.currentText()) else: self.changed_iirfilter_band(self.gui.iirfilterBandComboBox.currentText()) #self.design() def changed_iirfilter_band(self, ftype): - strftype = ftype iirftype = self.gui.iirfilterTypeComboBox.currentText() if(ftype == "Low Pass"): if(iirftype == "Bessel"): self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbesselPage) + self.gui.iirbesselcritLabel2.hide() + self.gui.iirbesselcritEdit2.hide() else: self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirlpfPage) elif(ftype == "Band Pass"): if(iirftype == "Bessel"): self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbesselPage) + self.gui.iirbesselcritLabel2.show() + self.gui.iirbesselcritEdit2.show() else: self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbpfPage) elif(ftype == "Band Stop"): if(iirftype == "Bessel"): self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbesselPage) + self.gui.iirbesselcritLabel2.show() + self.gui.iirbesselcritEdit2.show() else: self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbsfPage) elif(ftype == "High Pass"): if(iirftype == "Bessel"): self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirbesselPage) + self.gui.iirbesselcritLabel2.hide() + self.gui.iirbesselcritEdit2.hide() else: self.gui.filterTypeWidget.setCurrentWidget(self.gui.iirhpfPage) #self.design() def changed_filter_type(self, ftype): - strftype = ftype if(ftype == "Low Pass"): self.gui.filterTypeWidget.setCurrentWidget(self.gui.firlpfPage) self.remove_bandview() @@ -836,6 +842,7 @@ self.gui.mpzPlot.insertZeros(zeros) self.gui.mpzPlot.insertPoles(poles) self.update_fcoeff() + self.gui.action_save.setEnabled(True) # self.set_drawideal() # Return taps if callback is enabled. if self.callback: @@ -947,7 +954,7 @@ self.update_fcoeff() self.gui.nTapsEdit.setText("-") self.params = iirparams - + self.gui.action_save.setEnabled(True) # Return api_object if callback is enabled. if self.callback: retobj = ApiObject() @@ -2001,6 +2008,16 @@ else: csvhandle.writerow(["taps",] + [str(_tap) for _tap in self.taps]) handle.close() + self.gui.action_save.setEnabled(False) + # Iterate through all plots and delete the curves + for window in self.plots.values(): + window.drop_plotdata() + # Clear filter coeffs + self.gui.filterCoeff.setText("") + self.gui.mfilterCoeff.setText("") + # Clear poles and zeros plot + self.gui.pzPlot.clear() + self.replot_all() def action_open_dialog(self): filename, _filter = QtGui.QFileDialog.getOpenFileName(self, "Open CSV Filter File", ".", "") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-filter/python/filter/gui/GrFilterPlotWidget.py new/gnuradio-3.8.3.1/gr-filter/python/filter/gui/GrFilterPlotWidget.py --- old/gnuradio-3.8.3.0/gr-filter/python/filter/gui/GrFilterPlotWidget.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-filter/python/filter/gui/GrFilterPlotWidget.py 2021-06-10 22:31:35.000000000 +0200 @@ -1,4 +1,4 @@ -from pyqtgraph import PlotWidget +from pyqtgraph import PlotWidget, graphicsItems from .CustomViewBox import CustomViewBox @@ -6,3 +6,7 @@ def __init__(self,parent=None, background='default', **kargs): PlotWidget.__init__(self,parent,background,enableMenu=False,viewBox=CustomViewBox()) + def drop_plotdata(self): + for plitem in self.items(): + if isinstance(plitem, (graphicsItems.PlotCurveItem.PlotCurveItem, graphicsItems.ScatterPlotItem.ScatterPlotItem,graphicsItems.PlotDataItem.PlotDataItem)): + plitem.clear() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-qtgui/lib/VectorDisplayPlot.cc new/gnuradio-3.8.3.1/gr-qtgui/lib/VectorDisplayPlot.cc --- old/gnuradio-3.8.3.0/gr-qtgui/lib/VectorDisplayPlot.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-qtgui/lib/VectorDisplayPlot.cc 2021-06-10 22:31:35.000000000 +0200 @@ -385,9 +385,10 @@ void VectorDisplayPlot::_autoScale(double bottom, double top) { - // Auto scale the y-axis with a margin of 10 dB on either side. - d_ymin = bottom - 10; - d_ymax = top + 10; + // Auto scale the y-axis with a margin of 1% on either side + double margin = (top - bottom) / 100; + d_ymin = bottom - margin; + d_ymax = top + margin; setYaxis(d_ymin, d_ymax); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-qtgui/lib/edit_box_msg_impl.cc new/gnuradio-3.8.3.1/gr-qtgui/lib/edit_box_msg_impl.cc --- old/gnuradio-3.8.3.0/gr-qtgui/lib/edit_box_msg_impl.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-qtgui/lib/edit_box_msg_impl.cc 2021-06-10 22:31:35.000000000 +0200 @@ -163,7 +163,6 @@ edit_box_msg_impl::~edit_box_msg_impl() { - delete d_argv; delete d_group; delete d_hlayout; delete d_vlayout; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/gr-qtgui/lib/number_sink_impl.cc new/gnuradio-3.8.3.1/gr-qtgui/lib/number_sink_impl.cc --- old/gnuradio-3.8.3.0/gr-qtgui/lib/number_sink_impl.cc 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/gr-qtgui/lib/number_sink_impl.cc 2021-06-10 22:31:35.000000000 +0200 @@ -89,13 +89,7 @@ initialize(); } -number_sink_impl::~number_sink_impl() -{ - // if(!d_main_gui->isClosed()) - // d_main_gui->close(); - - delete d_argv; -} +number_sink_impl::~number_sink_impl() {} bool number_sink_impl::check_topology(int ninputs, int noutputs) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/blocks/parameter.block.yml new/gnuradio-3.8.3.1/grc/blocks/parameter.block.yml --- old/gnuradio-3.8.3.0/grc/blocks/parameter.block.yml 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/blocks/parameter.block.yml 2021-06-10 22:31:35.000000000 +0200 @@ -7,10 +7,6 @@ label: Label dtype: string hide: ${ ('none' if label else 'part') } -- id: value - label: Value - dtype: ${ type.type } - default: '0' - id: type label: Type dtype: enum @@ -19,6 +15,10 @@ option_attributes: type: [raw, complex, real, int, int, string] hide: ${ ('none' if type else 'part') } +- id: value + label: Value + dtype: ${ type.type } + default: '0' - id: short_id label: Short ID dtype: string diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/Config.py new/gnuradio-3.8.3.1/grc/core/Config.py --- old/gnuradio-3.8.3.0/grc/core/Config.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/Config.py 2021-06-10 22:31:35.000000000 +0200 @@ -1,19 +1,7 @@ -"""Copyright 2016 Free Software Foundation, Inc. +"""Copyright 2021 The GNU Radio Contributors This file is part of GNU Radio -GNU Radio Companion 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 2 -of the License, or (at your option) any later version. - -GNU Radio Companion 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 this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +SPDX-License-Identifier: GPL-2.0-or-later """ from __future__ import absolute_import diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/Connection.py new/gnuradio-3.8.3.1/grc/core/Connection.py --- old/gnuradio-3.8.3.0/grc/core/Connection.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/Connection.py 2021-06-10 22:31:35.000000000 +0200 @@ -20,6 +20,7 @@ from __future__ import absolute_import from .base import Element +from .Constants import ALIAS_OF from .utils.descriptors import lazy_property @@ -102,6 +103,11 @@ self.add_error_message('No connection known between domains "{}" and "{}"' ''.format(*self.type)) + source_dtype = self.source_port.dtype + sink_dtype = self.sink_port.dtype + if source_dtype != sink_dtype and source_dtype != ALIAS_OF.get(sink_dtype): + self.add_error_message('Source IO type "{}" does not match sink IO type "{}".'.format(source_dtype, sink_dtype)) + source_size = self.source_port.item_size sink_size = self.sink_port.item_size if source_size != sink_size: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/Constants.py new/gnuradio-3.8.3.1/grc/core/Constants.py --- old/gnuradio-3.8.3.0/grc/core/Constants.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/Constants.py 2021-06-10 22:31:35.000000000 +0200 @@ -1,5 +1,6 @@ """ Copyright 2008-2016 Free Software Foundation, Inc. +Copyright 2021 GNU Radio contributors This file is part of GNU Radio GNU Radio Companion is free software; you can redistribute it and/or @@ -32,7 +33,7 @@ DEFAULT_FLOW_GRAPH = os.path.join(DATA_DIR, 'default_flow_graph.grc') DEFAULT_HIER_BLOCK_LIB_DIR = os.path.expanduser('~/.grc_gnuradio') -CACHE_FILE = os.path.expanduser('~/.cache/grc_gnuradio/cache.json') +CACHE_FILE = os.path.expanduser('~/.cache/grc_gnuradio/cache_v2.json') BLOCK_DESCRIPTION_FILE_FORMAT_VERSION = 1 # File format versions: @@ -127,5 +128,21 @@ 'bits': (1, GRC_COLOR_PURPLE_A100), } +ALIAS_OF = { + 'complex': 'fc32', + 'float': 'f32', + 'int': 's32', + 'short': 's16', + 'byte': 's8', + 'bits': 'bit', + + 'fc32': 'complex', + 'f32': 'float', + 's32': 'int', + 's16': 'short', + 's8': 'byte', + 'bit': 'bits', +} + TYPE_TO_SIZEOF = {key: sizeof for name, key, sizeof, color in CORE_TYPES} TYPE_TO_SIZEOF.update((key, sizeof) for key, (sizeof, _) in ALIAS_TYPES.items()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/FlowGraph.py new/gnuradio-3.8.3.1/grc/core/FlowGraph.py --- old/gnuradio-3.8.3.0/grc/core/FlowGraph.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/FlowGraph.py 2021-06-10 22:31:35.000000000 +0200 @@ -56,6 +56,7 @@ self._eval_cache = {} self.namespace = {} + self.imported_names = [] self.grc_file_path = '' @@ -202,6 +203,16 @@ except Exception as e: raise ValueError("Can't parse run command {!r}: {}".format(run_command, e)) + def get_imported_names(self): + """ + Get a lis of imported names. + These names may not be used as id's + + Returns: + a list of imported names + """ + return self.imported_names + ############################################## # Access Elements ############################################## @@ -241,6 +252,8 @@ log.exception('Failed to evaluate import expression "{0}"'.format(expr), exc_info=True) pass + self.imported_names = list(namespace.keys()) + for id, expr in self.get_python_modules(): try: module = types.ModuleType(id) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/base.py new/gnuradio-3.8.3.1/grc/core/base.py --- old/gnuradio-3.8.3.0/grc/core/base.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/base.py 2021-06-10 22:31:35.000000000 +0200 @@ -34,8 +34,6 @@ Validate this element and call validate on all children. Call this base method before adding error messages in the subclass. """ - del self._error_messages[:] - for child in self.children(): child.validate() @@ -88,6 +86,7 @@ Rewrite this element and call rewrite on all children. Call this base method before rewriting the element. """ + del self._error_messages[:] for child in self.children(): child.rewrite() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/blocks/_build.py new/gnuradio-3.8.3.1/grc/core/blocks/_build.py --- old/gnuradio-3.8.3.0/grc/core/blocks/_build.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/blocks/_build.py 2021-06-10 22:31:35.000000000 +0200 @@ -128,13 +128,13 @@ if param_id in params: raise Exception('Param id "{}" is not unique'.format(param_id)) - if 'option_attributes' in param_data: - _validate_option_attributes(param_data, block_id) - base_key = param_data.get('base_key', None) param_data_ext = base_params_n.get(base_key, {}).copy() param_data_ext.update(param_data) + if 'option_attributes' in param_data: + _validate_option_attributes(param_data_ext, block_id) + add_param(**param_data_ext) base_params_n[param_id] = param_data_ext diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/blocks/block.py new/gnuradio-3.8.3.1/grc/core/blocks/block.py --- old/gnuradio-3.8.3.0/grc/core/blocks/block.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/blocks/block.py 2021-06-10 22:31:35.000000000 +0200 @@ -214,8 +214,9 @@ # Re-enable the hidden property of the ports for port in ports: - port.hidden = port.stored_hidden_state - port.stored_hidden_state = None + if (port.stored_hidden_state is not None): + port.hidden = port.stored_hidden_state + port.stored_hidden_state = None @@ -223,6 +224,7 @@ for port in ports: if hasattr(port, 'master_port'): # Not a master port and no left-over clones port.dtype = port.master_port.dtype + port.vlen = port.master_port.vlen continue nports = port.multiplicity for clone in port.clones[nports-1:]: @@ -664,6 +666,8 @@ cnt = 0 idx = 0 for p in ports: + if p.domain == 'message': + continue if cnt > 0: cnt -= 1 continue diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/blocks/embedded_python.py new/gnuradio-3.8.3.1/grc/core/blocks/embedded_python.py --- old/gnuradio-3.8.3.0/grc/core/blocks/embedded_python.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/blocks/embedded_python.py 2021-06-10 22:31:35.000000000 +0200 @@ -81,6 +81,7 @@ key = 'epy_block' label = 'Python Block' + exempt_from_id_validation = True # Exempt epy block from blacklist id validation documentation = {'': DOC} parameters_data = build_params( @@ -209,6 +210,7 @@ class EPyModule(Block): key = 'epy_module' label = 'Python Module' + exempt_from_id_validation = True # Exempt epy module from blacklist id validation documentation = {'': dedent(""" This block lets you embed a python module in your flowgraph. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/cache.py new/gnuradio-3.8.3.1/grc/core/cache.py --- old/gnuradio-3.8.3.0/grc/core/cache.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/cache.py 2021-06-10 22:31:35.000000000 +0200 @@ -17,10 +17,10 @@ from __future__ import absolute_import, print_function, unicode_literals -from io import open import json import logging import os +import time import six @@ -31,9 +31,11 @@ class Cache(object): - def __init__(self, filename): + def __init__(self, filename, version = None): self.cache_file = filename + self.version = version self.cache = {} + self._cachetime = None self.need_cache_write = True self._accessed_items = set() try: @@ -47,24 +49,41 @@ def load(self): try: + self.need_cache_write = False logger.debug("Loading block cache from: {}".format(self.cache_file)) with open(self.cache_file, encoding='utf-8') as cache_file: - self.cache = json.load(cache_file) - self.need_cache_write = False + cache = json.load(cache_file) + cacheversion = cache.get("version", None) + logger.debug("Cache version {}".format(cacheversion)) + self._cachetime = cache.get("cached-at", 0) + if cacheversion == self.version: + logger.debug("Loaded block cache") + self.cache = cache["cache"] + else: + logger.info("Outdated cache found, will be overwritten.") + raise ValueError() except (IOError, ValueError): self.need_cache_write = True def get_or_load(self, filename): self._accessed_items.add(filename) - if os.path.getmtime(filename) <= self._converter_mtime: + modtime = os.path.getmtime(filename) + if modtime <= self._converter_mtime: try: - return self.cache[filename] + cached = self.cache[filename] + if int(cached["cached-at"]+0.5) >= modtime: + return cached["data"] + logger.info("Cache for {} outdated, loading yaml".format( + filename)) except KeyError: pass with open(filename, encoding='utf-8') as fp: data = yaml.safe_load(fp) - self.cache[filename] = data + self.cache[filename] = { + "cached-at": int(time.time()), + "data": data + } self.need_cache_write = True return data @@ -75,7 +94,13 @@ logger.debug('Saving %d entries to json cache', len(self.cache)) # Dumping to binary file is only supported for Python3 >= 3.6 with open(self.cache_file, 'w', encoding='utf8') as cache_file: - cache_file.write(json.dumps(self.cache, ensure_ascii=False)) + cache_content = { + "version": self.version, + "cached-at": self._cachetime, + "cache": self.cache + } + cache_file.write( + json.dumps(cache_content, ensure_ascii=False)) def prune(self): for filename in (set(self.cache) - self._accessed_items): @@ -87,14 +112,3 @@ def __exit__(self, exc_type, exc_val, exc_tb): self.save() - - -def byteify(data): - if isinstance(data, dict): - return {byteify(key): byteify(value) for key, value in six.iteritems(data)} - elif isinstance(data, list): - return [byteify(element) for element in data] - elif isinstance(data, six.text_type) and six.PY2: - return data.encode('utf-8') - else: - return data diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/generator/top_block.py new/gnuradio-3.8.3.1/grc/core/generator/top_block.py --- old/gnuradio-3.8.3.0/grc/core/generator/top_block.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/generator/top_block.py 2021-06-10 22:31:35.000000000 +0200 @@ -194,14 +194,6 @@ ] blocks = expr_utils.sort_objects(blocks, operator.attrgetter('name'), _get_block_sort_text) - - # Ordering blocks : blocks with GUI Hint must be processed first to avoid PyQT5 superposing blocks - def without_gui_hint(block): - hint = block.params.get('gui_hint') - return hint is None or not hint.get_value() - - blocks.sort(key=without_gui_hint) - blocks_make = [] for block in blocks: make = block.templates.render('make') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/params/dtypes.py new/gnuradio-3.8.3.1/grc/core/params/dtypes.py --- old/gnuradio-3.8.3.0/grc/core/params/dtypes.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/params/dtypes.py 2021-06-10 22:31:35.000000000 +0200 @@ -26,7 +26,7 @@ # Blacklist certain ids, its not complete, but should help -ID_BLACKLIST = ['self', 'options', 'gr', 'math', 'firdes', 'default'] + dir(builtins) +ID_BLACKLIST = ['self', 'default'] + dir(builtins) try: from gnuradio import gr ID_BLACKLIST.extend(attr for attr in dir(gr.top_block()) if not attr.startswith('_')) @@ -45,19 +45,21 @@ return func return decorator - class ValidateError(Exception): """Raised by validate functions""" @validates('id') -def validate_block_id(param): +def validate_block_id(param,black_listed_ids): value = param.value # Can python use this as a variable? + if not re.match(r'^[a-z|A-Z]\w*$', value): raise ValidateError('ID "{}" must begin with a letter and may contain letters, numbers, ' 'and underscores.'.format(value)) - if value in ID_BLACKLIST: + if value in (black_listed_ids + ID_BLACKLIST) and \ + not getattr(param.parent_block, 'exempt_from_id_validation', False): + # Grant blacklist exemption to epy blocks and modules raise ValidateError('ID "{}" is blacklisted.'.format(value)) block_names = [block.name for block in param.parent_flowgraph.iter_enabled_blocks()] # Id should only appear once, or zero times if block is disabled @@ -69,8 +71,8 @@ @validates('name') -def validate_name(param): - # Name of a function that will be generated literally not as a string +def validate_name(param,black_listed_ids): + # Name of a function or other block that will be generated literally not as a string value = param.value # Can python use this as a variable? if not re.match(r'^[a-z|A-Z]\w*$', value): @@ -80,7 +82,7 @@ @validates('stream_id') -def validate_stream_id(param): +def validate_stream_id(param,black_listed_ids): value = param.value stream_ids = [ block.params['stream_id'].value @@ -97,7 +99,7 @@ @validates('complex', 'real', 'float', 'int') -def validate_scalar(param): +def validate_scalar(param,black_listed_ids): valid_types = Constants.PARAM_TYPE_MAP[param.dtype] if not isinstance(param.get_evaluated(), valid_types): raise ValidateError('Expression {!r} is invalid for type {!r}.'.format( @@ -105,7 +107,7 @@ @validates('complex_vector', 'real_vector', 'float_vector', 'int_vector') -def validate_vector(param): +def validate_vector(param,black_listed_ids): # todo: check vector types if param.get_evaluated() is None: @@ -118,7 +120,7 @@ @validates('gui_hint') -def validate_gui_hint(param): +def validate_gui_hint(param,black_listed_ids): try: param.parse_gui_hint(param.value) except Exception as e: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/params/param.py new/gnuradio-3.8.3.1/grc/core/params/param.py --- old/gnuradio-3.8.3.0/grc/core/params/param.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/params/param.py 2021-06-10 22:31:35.000000000 +0200 @@ -171,7 +171,7 @@ validator = dtypes.validators.get(self.dtype, None) if self._init and validator: try: - validator(self) + validator(self,self.parent_flowgraph.get_imported_names()) except dtypes.ValidateError as e: self.add_error_message(str(e)) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/platform.py new/gnuradio-3.8.3.1/grc/core/platform.py --- old/gnuradio-3.8.3.0/grc/core/platform.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/platform.py 2021-06-10 22:31:35.000000000 +0200 @@ -149,7 +149,7 @@ # converter.run() # logging.info('XML converter done.') - with Cache(Constants.CACHE_FILE) as cache: + with Cache(Constants.CACHE_FILE, version = self.config.version) as cache: for file_path in self._iter_files_in_block_path(path): if file_path.endswith('.block.yml'): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/core/ports/port.py new/gnuradio-3.8.3.1/grc/core/ports/port.py --- old/gnuradio-3.8.3.0/grc/core/ports/port.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/core/ports/port.py 2021-06-10 22:31:35.000000000 +0200 @@ -104,6 +104,7 @@ return not self.dtype def validate(self): + del self._error_messages[:] Element.validate(self) platform = self.parent_platform diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/gui/Actions.py new/gnuradio-3.8.3.1/grc/gui/Actions.py --- old/gnuradio-3.8.3.0/grc/gui/Actions.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/gui/Actions.py 2021-06-10 22:31:35.000000000 +0200 @@ -406,7 +406,19 @@ preference_name='hide_variables', default=False, ) -TOGGLE_SHOW_BLOCK_IDS = actions.register("win.show_block_ids", +TOGGLE_SHOW_PARAMETER_EXPRESSION = actions.register( "win.show_param_expression", + label='Show parameter expressions in block', + tooltip='Display the expression that defines a parameter inside the block', + preference_name='show_param_expression', + default=False, +) +TOGGLE_SHOW_PARAMETER_EVALUATION = actions.register( "win.show_param_expression_value", + label='Show parameter value in block', + tooltip='Display the evaluated value of a parameter expressions inside the block', + preference_name='show_param_expression_value', + default=True, +) +TOGGLE_SHOW_BLOCK_IDS = actions.register( "win.show_block_ids", label='Show All Block IDs', tooltip='Show all the block IDs', preference_name='show_block_ids', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/gui/Application.py new/gnuradio-3.8.3.1/grc/gui/Application.py --- old/gnuradio-3.8.3.0/grc/gui/Application.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/gui/Application.py 2021-06-10 22:31:35.000000000 +0200 @@ -204,6 +204,8 @@ Actions.TOGGLE_FLOW_GRAPH_VAR_EDITOR, Actions.TOGGLE_FLOW_GRAPH_VAR_EDITOR_SIDEBAR, Actions.TOGGLE_HIDE_VARIABLES, + Actions.TOGGLE_SHOW_PARAMETER_EXPRESSION, + Actions.TOGGLE_SHOW_PARAMETER_EVALUATION, Actions.TOGGLE_SHOW_BLOCK_IDS, ): action.set_enabled(True) @@ -497,6 +499,14 @@ action.save_to_preferences() for page in main.get_pages(): flow_graph_update(page.flow_graph) + elif action == Actions.TOGGLE_SHOW_PARAMETER_EXPRESSION: + action.set_active(not action.get_active()) + action.save_to_preferences() + flow_graph_update() + elif action == Actions.TOGGLE_SHOW_PARAMETER_EVALUATION: + action.set_active(not action.get_active()) + action.save_to_preferences() + flow_graph_update() elif action == Actions.TOGGLE_HIDE_VARIABLES: action.set_active(not action.get_active()) active = action.get_active() @@ -551,7 +561,7 @@ response = self.dialog.run() if response in (Gtk.ResponseType.APPLY, Gtk.ResponseType.ACCEPT): page.state_cache.save_new_state(flow_graph.export_data()) - ### Following lines force an complete update of io ports + ### Following lines force an complete update of io ports n = page.state_cache.get_current_state() flow_graph.import_data(n) flow_graph_update() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/gui/Bars.py new/gnuradio-3.8.3.1/grc/gui/Bars.py --- old/gnuradio-3.8.3.0/grc/gui/Bars.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/gui/Bars.py 2021-06-10 22:31:35.000000000 +0200 @@ -82,8 +82,10 @@ ('_View', [ [Actions.TOGGLE_BLOCKS_WINDOW], [Actions.TOGGLE_CONSOLE_WINDOW, Actions.TOGGLE_SCROLL_LOCK, Actions.SAVE_CONSOLE, Actions.CLEAR_CONSOLE], - [Actions.TOGGLE_HIDE_VARIABLES, Actions.TOGGLE_FLOW_GRAPH_VAR_EDITOR, Actions.TOGGLE_FLOW_GRAPH_VAR_EDITOR_SIDEBAR], - [Actions.TOGGLE_HIDE_DISABLED_BLOCKS, Actions.TOGGLE_AUTO_HIDE_PORT_LABELS, Actions.TOGGLE_SNAP_TO_GRID, Actions.TOGGLE_SHOW_BLOCK_COMMENTS, Actions.TOGGLE_SHOW_BLOCK_IDS,], + [Actions.TOGGLE_HIDE_VARIABLES, Actions.TOGGLE_FLOW_GRAPH_VAR_EDITOR, Actions.TOGGLE_FLOW_GRAPH_VAR_EDITOR_SIDEBAR, + Actions.TOGGLE_SHOW_PARAMETER_EXPRESSION, Actions.TOGGLE_SHOW_PARAMETER_EVALUATION], + [Actions.TOGGLE_HIDE_DISABLED_BLOCKS, Actions.TOGGLE_AUTO_HIDE_PORT_LABELS, Actions.TOGGLE_SNAP_TO_GRID, + Actions.TOGGLE_SHOW_BLOCK_COMMENTS, Actions.TOGGLE_SHOW_BLOCK_IDS,], [Actions.TOGGLE_SHOW_CODE_PREVIEW_TAB], [Actions.ERRORS_WINDOW_DISPLAY, Actions.FIND_BLOCKS], ]), diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/gui/VariableEditor.py new/gnuradio-3.8.3.1/grc/gui/VariableEditor.py --- old/gnuradio-3.8.3.0/grc/gui/VariableEditor.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/gui/VariableEditor.py 2021-06-10 22:31:35.000000000 +0200 @@ -192,18 +192,7 @@ else: # Evaluate and show the value (if it is a variable) if block.is_variable: - # Evaluate the params - for key in block.params : - evaluated = str(block.params[key].evaluate()) - self.set_tooltip_text(evaluated) - - # Evaluate the block value - try: - evaluated = str( eval(block.value,block.parent.namespace,block.namespace)) - self.set_tooltip_text(evaluated) - except Exception as error: - self.set_tooltip_text(str(error)) - pass + value = str(block.evaluate(block.value)) # Always set the text value. sp('text', value) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/gui/canvas/flowgraph.py new/gnuradio-3.8.3.1/grc/gui/canvas/flowgraph.py --- old/gnuradio-3.8.3.0/grc/gui/canvas/flowgraph.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/gui/canvas/flowgraph.py 2021-06-10 22:31:35.000000000 +0200 @@ -359,7 +359,22 @@ Args: delta_coordinate: the change in coordinates """ - for selected_block in self.selected_blocks(): + + # Determine selected blocks top left coordinate + blocks = list(self.selected_blocks()) + if not blocks: + return + + min_x, min_y = self.selected_block.coordinate + for selected_block in blocks: + x, y = selected_block.coordinate + min_x, min_y = min(min_x, x), min(min_y, y) + + # Sanitize delta_coordinate so that blocks don't move to negative coordinate + delta_coordinate = max(delta_coordinate[0],-min_x), max(delta_coordinate[1], -min_y) + + # Move selected blocks + for selected_block in blocks: selected_block.move(delta_coordinate) self.element_moved = True diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/gnuradio-3.8.3.0/grc/gui/canvas/param.py new/gnuradio-3.8.3.1/grc/gui/canvas/param.py --- old/gnuradio-3.8.3.0/grc/gui/canvas/param.py 2021-03-22 23:35:33.000000000 +0100 +++ new/gnuradio-3.8.3.1/grc/gui/canvas/param.py 2021-06-10 22:31:35.000000000 +0200 @@ -20,7 +20,7 @@ import numbers from .drawable import Drawable -from .. import ParamWidgets, Utils, Constants +from .. import ParamWidgets, Utils, Constants, Actions from ...core.params import Param as CoreParam @@ -89,17 +89,12 @@ tooltip_lines.extend(' * ' + msg for msg in errors) return '\n'.join(tooltip_lines) - def pretty_print(self): - """ - Get the repr (nice string format) for this param. - Returns: - the string representation - """ + ################################################## # Truncate helper method ################################################## - def _truncate(string, style=0): + def truncate(self, string, style=0): max_len = max(27 - len(self.name), 3) if len(string) > max_len: if style < 0: # Front truncate @@ -110,12 +105,20 @@ string = string[:max_len-3] + '...' return string + def pretty_print(self): + """ + Get the repr (nice string format) for this param. + + Returns: + the string representation + """ + ################################################## # Simple conditions ################################################## value = self.get_value() if not self.is_valid(): - return _truncate(value) + return self.truncate(value) if value in self.options: return self.options[value] # its name @@ -147,7 +150,7 @@ dt_str = str(e) # Done - return _truncate(dt_str, truncate) + return self.truncate(dt_str, truncate) def format_block_surface_markup(self): """ @@ -156,7 +159,29 @@ Returns: a pango markup string """ + + # TODO: is this the correct way to do this? + is_evaluated = self.value != str(self.get_evaluated()) + show_value = Actions.TOGGLE_SHOW_PARAMETER_EVALUATION.get_active() + show_expr = Actions.TOGGLE_SHOW_PARAMETER_EXPRESSION.get_active() + + display_value = "" + + # Include the value defined by the user (after evaluation) + if not is_evaluated or show_value or not show_expr: + display_value += Utils.encode( + self.pretty_print().replace('\n', ' ')) + + # Include the expression that was evaluated to get the value + if is_evaluated and show_expr: + expr_string = "<i>" + \ + Utils.encode(self.truncate(self.value)) + "</i>" + + if display_value: # We are already displaying the value + display_value = expr_string + "=" + display_value + else: + display_value = expr_string + return '<span {foreground} font_desc="{font}"><b>{label}:</b> {value}</span>'.format( foreground='foreground="red"' if not self.is_valid() else '', font=Constants.PARAM_FONT, - label=Utils.encode(self.name), value=Utils.encode(self.pretty_print().replace('\n', ' ')) - ) + label=Utils.encode(self.name), value=display_value)