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)

Reply via email to