From 6b3b5a5757bea2e89738aeaa6077abc9cb847b44 Mon Sep 17 00:00:00 2001
From: Tom Rondeau <trondeau@vt.edu>
Date: Sun, 17 Feb 2013 19:56:21 -0500
Subject: ctrlport: adding display type for stripchart as opposed to
 timeseries.

Stripcharts add data to the back of what's plotted; time series plots just plot the vector given. All single-value RPC vars have been converted to use stripchart mode.
---
 gnuradio-core/src/lib/general/gr_throttle.cc       |   4 +-
 gnuradio-core/src/lib/runtime/gnuradio.ice         |   2 +
 gnuradio-core/src/lib/runtime/gr_block.cc          |  20 ++--
 gnuradio-core/src/lib/runtime/nop_impl.cc          |   4 +-
 .../src/lib/runtime/rpccallbackregister_base.h     |   2 +
 gnuradio-core/src/lib/runtime/runtime.i            |   2 +
 .../src/python/gnuradio/ctrlport/GrDataPlotter.py  | 101 ++++++++++++---------
 .../python/gnuradio/ctrlport/gr-ctrlport-monitor   |  14 ++-
 8 files changed, 86 insertions(+), 63 deletions(-)

(limited to 'gnuradio-core/src')

diff --git a/gnuradio-core/src/lib/general/gr_throttle.cc b/gnuradio-core/src/lib/general/gr_throttle.cc
index f1faf5cff1..1915c686ce 100644
--- a/gnuradio-core/src/lib/general/gr_throttle.cc
+++ b/gnuradio-core/src/lib/general/gr_throttle.cc
@@ -89,12 +89,12 @@ private:
         rpcbasic_sptr(new rpcbasic_register_get<gr_throttle_impl, double>(
             alias(), "sample_rate", &gr_throttle_impl::sample_rate,
             pmt::mp(0.0), pmt::mp(100.0e6), pmt::mp(0.0),
-            "Hz", "Sample Rate", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+            "Hz", "Sample Rate", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
     d_rpc_vars.push_back(
         rpcbasic_sptr(new rpcbasic_register_set<gr_throttle_impl, double>(
             alias(), "sample_rate", &gr_throttle_impl::set_sample_rate,
             pmt::mp(0.0), pmt::mp(100.0e6), pmt::mp(0.0),
-            "Hz", "Sample Rate", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+            "Hz", "Sample Rate", RPC_PRIVLVL_MIN, DISPSTRIPCHARTFF)));
 #endif
         }
 };
diff --git a/gnuradio-core/src/lib/runtime/gnuradio.ice b/gnuradio-core/src/lib/runtime/gnuradio.ice
index 4ea8d7abed..8fa909417e 100644
--- a/gnuradio-core/src/lib/runtime/gnuradio.ice
+++ b/gnuradio-core/src/lib/runtime/gnuradio.ice
@@ -60,6 +60,8 @@ enum DisplayType {
   DISPXYLINE,
   DISPLOGTIMESERIESF,
   DISPLOGTIMESERIESC,
+  DISPSTRIPCHARTF,
+  DISPSTRIPCHARTC,
 };
 
 struct KnobProp {
diff --git a/gnuradio-core/src/lib/runtime/gr_block.cc b/gnuradio-core/src/lib/runtime/gr_block.cc
index c736d0f058..fb39909ab8 100644
--- a/gnuradio-core/src/lib/runtime/gr_block.cc
+++ b/gnuradio-core/src/lib/runtime/gr_block.cc
@@ -442,61 +442,61 @@ gr_block::setup_pc_rpc()
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
       alias(), "avg noutput_items", &gr_block::pc_noutput_items,
       pmt::mp(0), pmt::mp(32768), pmt::mp(0),
-      "", "Average noutput items", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Average noutput items", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
       alias(), "var noutput_items", &gr_block::pc_noutput_items_var,
       pmt::mp(0), pmt::mp(32768), pmt::mp(0),
-      "", "Var. noutput items", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Var. noutput items", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
       alias(), "avg nproduced", &gr_block::pc_nproduced,
       pmt::mp(0), pmt::mp(32768), pmt::mp(0),
-      "", "Average items produced", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Average items produced", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
       alias(), "var nproduced", &gr_block::pc_nproduced_var,
       pmt::mp(0), pmt::mp(32768), pmt::mp(0),
-      "", "Var. items produced", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Var. items produced", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
       alias(), "avg work time", &gr_block::pc_work_time,
       pmt::mp(0), pmt::mp(1e9), pmt::mp(0),
-      "", "Average clock cycles in call to work", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Average clock cycles in call to work", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, float>(
       alias(), "var work time", &gr_block::pc_work_time_var,
       pmt::mp(0), pmt::mp(1e9), pmt::mp(0),
-      "", "Var. clock cycles in call to work", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Var. clock cycles in call to work", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >(
       alias(), "avg input \% full", &gr_block::pc_input_buffers_full,
       pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0),
-      "", "Average of how full input buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Average of how full input buffers are", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >(
       alias(), "var input \% full", &gr_block::pc_input_buffers_full_var,
       pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0),
-      "", "Var. of how full input buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Var. of how full input buffers are", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >(
       alias(), "avg output \% full", &gr_block::pc_output_buffers_full,
       pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0),
-      "", "Average of how full output buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Average of how full output buffers are", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
   d_rpc_vars.push_back(
     rpcbasic_sptr(new rpcbasic_register_get<gr_block, std::vector<float> >(
       alias(), "var output \% full", &gr_block::pc_output_buffers_full_var,
       pmt::make_c32vector(0,0), pmt::make_c32vector(0,1), pmt::make_c32vector(0,0),
-      "", "Var. of how full output buffers are", RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+      "", "Var. of how full output buffers are", RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 #endif /* GR_CTRLPORT */
 }
 
diff --git a/gnuradio-core/src/lib/runtime/nop_impl.cc b/gnuradio-core/src/lib/runtime/nop_impl.cc
index b6764c2257..6df2c0391d 100644
--- a/gnuradio-core/src/lib/runtime/nop_impl.cc
+++ b/gnuradio-core/src/lib/runtime/nop_impl.cc
@@ -91,14 +91,14 @@ namespace gr {
 			&nop_impl::a,
 			pmt::mp(-128), pmt::mp(127), pmt::mp(0),
 			"", "Value of a",
-			RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+			RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
       d_get_32i_rpcs.push_back(get_32i_sptr
 	 (new get_32i_t(d_name, "b", this, unique_id(),
 			&nop_impl::b,
 			pmt::mp(-128), pmt::mp(127), pmt::mp(0),
 			"", "Value of b",
-			RPC_PRIVLVL_MIN, DISPTIMESERIESF)));
+			RPC_PRIVLVL_MIN, DISPSTRIPCHARTF)));
 
       d_set_32i_rpcs.push_back(set_32i_sptr
 	 (new set_32i_t(d_name, "a", this, unique_id(),
diff --git a/gnuradio-core/src/lib/runtime/rpccallbackregister_base.h b/gnuradio-core/src/lib/runtime/rpccallbackregister_base.h
index c5b94cb757..a9a3925d94 100644
--- a/gnuradio-core/src/lib/runtime/rpccallbackregister_base.h
+++ b/gnuradio-core/src/lib/runtime/rpccallbackregister_base.h
@@ -34,6 +34,8 @@ enum DisplayType {
   DISPXYLINE,
   DISPLOGTIMESERIESF,
   DISPLOGTIMESERIESC,
+  DISPSTRIPCHARTF,
+  DISPSTRIPCHARTC,
 };
 
 enum priv_lvl_t {
diff --git a/gnuradio-core/src/lib/runtime/runtime.i b/gnuradio-core/src/lib/runtime/runtime.i
index 1a31cfbd73..ea6b7f79ac 100644
--- a/gnuradio-core/src/lib/runtime/runtime.i
+++ b/gnuradio-core/src/lib/runtime/runtime.i
@@ -79,6 +79,8 @@ enum DisplayType {
   DISPXYLINE,
   DISPLOGTIMESERIESF,
   DISPLOGTIMESERIESC,
+  DISPSTRIPCHARTF,
+  DISPSTRIPCHARTC,
 };
 
 enum priv_lvl_t {
diff --git a/gnuradio-core/src/python/gnuradio/ctrlport/GrDataPlotter.py b/gnuradio-core/src/python/gnuradio/ctrlport/GrDataPlotter.py
index b96a47e77f..1990e21aa4 100644
--- a/gnuradio-core/src/python/gnuradio/ctrlport/GrDataPlotter.py
+++ b/gnuradio-core/src/python/gnuradio/ctrlport/GrDataPlotter.py
@@ -32,9 +32,10 @@ except ImportError:
     sys.exit(1)
 
 class GrDataPlotterC(gr.top_block):
-    def __init__(self, name, rate, pmin=None, pmax=None):
+    def __init__(self, name, rate, pmin=None, pmax=None, stripchart=False):
         gr.top_block.__init__(self)
 
+        self._stripchart = stripchart
         self._name = name
         self._npts = 500
         samp_rate = 1.0
@@ -84,33 +85,39 @@ class GrDataPlotterC(gr.top_block):
             self._npts = npts
             self.snk.reset()
         
-        # Update the plot data depending on type
-        if(type(data) == list):
-            data_r = data[0::2]
-            data_i = data[1::2]
-            data = [complex(r,i) for r,i in zip(data_r, data_i)]
-            if(len(data) > self._npts):
-                self.src.set_data(data)
-                self._last_data = data[-self._npts:]
-            else:
-                newdata = self._last_data[-(self._npts-len(data)):]
-                newdata += data
-                self.src.set_data(newdata)
-                self._last_data = newdata
-
-        else: # single value update
-            if(self._data_len < self._npts):
-                self._last_data[self._data_len] = data
-                self._data_len += 1
-            else:
-                self._last_data = self._last_data[1:]
-                self._last_data.append(data)
-            self.src.set_data(self._last_data)
+        if(self._stripchart):
+            # Update the plot data depending on type
+            if(type(data) == list):
+                data_r = data[0::2]
+                data_i = data[1::2]
+                data = [complex(r,i) for r,i in zip(data_r, data_i)]
+                if(len(data) > self._npts):
+                    self.src.set_data(data)
+                    self._last_data = data[-self._npts:]
+                else:
+                    newdata = self._last_data[-(self._npts-len(data)):]
+                    newdata += data
+                    self.src.set_data(newdata)
+                    self._last_data = newdata
+
+            else: # single value update
+                if(self._data_len < self._npts):
+                    self._last_data[self._data_len] = data
+                    self._data_len += 1
+                else:
+                    self._last_data = self._last_data[1:]
+                    self._last_data.append(data)
+                self.src.set_data(self._last_data)
+        else:
+            if(type(data) != list):
+                data = [data,]
+            self.src.set_data(data)
 
 class GrDataPlotterF(gr.top_block):
-    def __init__(self, name, rate, pmin=None, pmax=None):
+    def __init__(self, name, rate, pmin=None, pmax=None, stripchart=False):
         gr.top_block.__init__(self)
 
+        self._stripchart = stripchart
         self._name = name
         self._npts = 500
         samp_rate = 1.0
@@ -156,28 +163,32 @@ class GrDataPlotterF(gr.top_block):
                 self._last_data += (npts - self._npts)*[0,]
             self._npts = npts
             self.snk.reset()
-        
-        # Update the plot data depending on type
-        if(type(data) == list):
-            if(len(data) > self._npts):
-                self.src.set_data(data)
-                self._last_data = data[-self._npts:]
-            else:
-                newdata = self._last_data[-(self._npts-len(data)):]
-                newdata += data
-                self.src.set_data(newdata)
-                self._last_data = newdata
-
-        else: # single value update
-            if(self._data_len < self._npts):
-                self._last_data[self._data_len] = data
-                self._data_len += 1
-            else:
-                self._last_data = self._last_data[1:]
-                self._last_data.append(data)
-            self.src.set_data(self._last_data)
-
 
+        if(self._stripchart):
+            # Update the plot data depending on type
+            if(type(data) == list):
+                if(len(data) > self._npts):
+                    self.src.set_data(data)
+                    self._last_data = data[-self._npts:]
+                else:
+                    newdata = self._last_data[-(self._npts-len(data)):]
+                    newdata += data
+                    self.src.set_data(newdata)
+                    self._last_data = newdata
+
+            else: # single value update
+                if(self._data_len < self._npts):
+                    self._last_data[self._data_len] = data
+                    self._data_len += 1
+                else:
+                    self._last_data = self._last_data[1:]
+                    self._last_data.append(data)
+                self.src.set_data(self._last_data)
+        else:
+            if(type(data) != list):
+                data = [data,]
+            self.src.set_data(data)
+            
 class GrDataPlotterConst(gr.top_block):
     def __init__(self, name, rate, pmin=None, pmax=None):
         gr.top_block.__init__(self)
diff --git a/gnuradio-core/src/python/gnuradio/ctrlport/gr-ctrlport-monitor b/gnuradio-core/src/python/gnuradio/ctrlport/gr-ctrlport-monitor
index 7e3384d017..4625a2d863 100755
--- a/gnuradio-core/src/python/gnuradio/ctrlport/gr-ctrlport-monitor
+++ b/gnuradio-core/src/python/gnuradio/ctrlport/gr-ctrlport-monitor
@@ -192,6 +192,10 @@ class MAINWindow(QtGui.QMainWindow):
             self.newPlotF(tag, uid, title, pmin, pmax, True)
         elif(knobprop.display == GNURadio.DisplayType.DISPLOGTIMESERIESC):
             self.newPlotC(tag, uid, title, pmin, pmax, True)
+        elif(knobprop.display == GNURadio.DisplayType.DISPSTRIPCHARTF):
+            self.newPlotC(tag, uid, title, pmin, pmax, False, True)
+        elif(knobprop.display == GNURadio.DisplayType.DISPSTRIPCHARTC):
+            self.newPlotC(tag, uid, title, pmin, pmax, False, True)
 
     def createPlot(self, plot, uid, title):
         plot.start()
@@ -216,13 +220,15 @@ class MAINWindow(QtGui.QMainWindow):
         plot = GrDataPlotterConst(tag, 32e6, pmin, pmax)
         self.createPlot(plot, uid, title)
     
-    def newPlotF(self, tag, uid, title="", pmin=None, pmax=None, logy=False):
-        plot = GrDataPlotterF(tag, 32e6, pmin, pmax)
+    def newPlotF(self, tag, uid, title="", pmin=None, pmax=None, 
+                 logy=False, stripchart=False):
+        plot = GrDataPlotterF(tag, 32e6, pmin, pmax, stripchart)
         plot.semilogy(logy)
         self.createPlot(plot, uid, title)
 
-    def newPlotC(self, tag, uid, title="", pmin=None, pmax=None, logy=False):
-        plot = GrDataPlotterC(tag, 32e6, pmin, pmax)
+    def newPlotC(self, tag, uid, title="", pmin=None, pmax=None,
+                 logy=False, stripchart=False):
+        plot = GrDataPlotterC(tag, 32e6, pmin, pmax, stripchart)
         plot.semilogy(logy)
         self.createPlot(plot, uid, title)
 
-- 
cgit v1.2.3