summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/python
diff options
context:
space:
mode:
Diffstat (limited to 'gnuradio-runtime/python')
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/RPCConnection.py3
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py17
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx23
-rw-r--r--gnuradio-runtime/python/gnuradio/gr/gateway.py7
-rw-r--r--gnuradio-runtime/python/gnuradio/gr/qa_random.py78
5 files changed, 119 insertions, 9 deletions
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnection.py b/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnection.py
index e14cc0cea7..1b129534c9 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnection.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnection.py
@@ -105,6 +105,9 @@ class RPCConnection(object):
def getRe(self,*args):
raise exceptions.NotImplementedError()
+ def postMessage(self,*args):
+ raise exceptions.NotImplementedError()
+
def setKnobs(self,*args):
raise exceptions.NotImplementedError()
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py b/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py
index 9a2a302af5..522c74117b 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/RPCConnectionThrift.py
@@ -27,6 +27,7 @@ from thrift.protocol import TBinaryProtocol
from gnuradio.ctrlport.GNURadio import ControlPort
from gnuradio.ctrlport import RPCConnection
from gnuradio import gr
+import pmt
import sys
class ThriftRadioClient:
@@ -196,6 +197,22 @@ class RPCConnectionThrift(RPCConnection.RPCConnection):
def shutdown(self):
self.thriftclient.radio.shutdown()
+ def postMessage(self, blk_alias, port, msg):
+ '''
+ blk_alias: the alias of the block we are posting the message
+ to; must have an open message port named 'port'.
+ Provide as a string.
+ port: The name of the message port we are sending the message to.
+ Provide as a string.
+ msg: The actual message. Provide this as a PMT of the form
+ right for the message port.
+ The alias and port names are converted to PMT symbols and
+ serialized. The msg is already a PMT and so just serialized.
+ '''
+ self.thriftclient.radio.postMessage(pmt.serialize_str(pmt.intern(blk_alias)),
+ pmt.serialize_str(pmt.intern(port)),
+ pmt.serialize_str(msg));
+
def printProperties(self, props):
info = ""
info += "Item:\t\t{0}\n".format(props.description)
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx b/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx
index a05ea3a28e..bb53e02cc4 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/gr-perf-monitorx
@@ -20,18 +20,23 @@
# Boston, MA 02110-1301, USA.
#
+import sys, time, re, pprint
import random,math,operator
-import networkx as nx
-import matplotlib
-matplotlib.use("QT4Agg")
-import matplotlib.pyplot as plt
-from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
-from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
-from matplotlib.figure import Figure
+try:
+ import networkx as nx
+ import matplotlib
+ matplotlib.use("QT4Agg")
+ import matplotlib.pyplot as plt
+ from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
+ from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
+ from matplotlib.figure import Figure
+except ImportError:
+ print sys.argv[0], "requires networkx and matplotlib.", \
+ "Please check that they are installed and try again."
+ sys.exit(1)
from PyQt4 import QtCore,Qt,Qwt5
import PyQt4.QtGui as QtGui
-import sys, time, re, pprint
import itertools
from gnuradio import gr, ctrlport
@@ -582,7 +587,7 @@ class MForm(QtGui.QWidget):
def pauseFlowgraph(self):
knobs = [self.radioclient.Knob(self.top_block + "::lock"),
- self.radioclient.Knob(self.top_block + "::stop")]
+ self.radioclient.Knob(self.top_block + "::stop")]
k = self.radioclient.setKnobs(knobs)
def unpauseFlowgraph(self):
diff --git a/gnuradio-runtime/python/gnuradio/gr/gateway.py b/gnuradio-runtime/python/gnuradio/gr/gateway.py
index 2a27b8a9e0..2e46bca430 100644
--- a/gnuradio-runtime/python/gnuradio/gr/gateway.py
+++ b/gnuradio-runtime/python/gnuradio/gr/gateway.py
@@ -201,6 +201,13 @@ class gateway_block(object):
# Save handler object in class so it's not garbage collected
self.__msg_handlers[which_port] = handler
+ def in_sig(self):
+ return self.__in_sig
+
+ def out_sig(self):
+ return self.__out_sig
+
+
########################################################################
# Wrappers for the user to inherit from
########################################################################
diff --git a/gnuradio-runtime/python/gnuradio/gr/qa_random.py b/gnuradio-runtime/python/gnuradio/gr/qa_random.py
new file mode 100644
index 0000000000..d3e5410454
--- /dev/null
+++ b/gnuradio-runtime/python/gnuradio/gr/qa_random.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+#
+# Copyright 2006,2007,2010,2015 Free Software Foundation, Inc.
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+from gnuradio import gr, gr_unittest
+import numpy as np
+
+
+class test_random(gr_unittest.TestCase):
+ # NOTE: For tests on the output distribution of the random numbers, see gnuradio-runtime/apps/evaluation_random_numbers.py.
+
+ # Check for range [0,1) of uniform distributed random numbers
+ def test_1(self):
+ num_tests = 10000
+ values = np.zeros(num_tests)
+ rndm = gr.random()
+ for k in range(num_tests):
+ values[k] = rndm.ran1()
+ for value in values:
+ self.assertLess(value, 1)
+ self.assertGreaterEqual(value, 0)
+
+ # Same seed should yield same random values.
+ def test_2_same_seed(self):
+ num = 5
+ # Init with fixed seed.
+ rndm0 = gr.random(42)
+ rndm1 = gr.random(42)
+ for k in range(num):
+ x = rndm0.ran1()
+ y = rndm1.ran1()
+ self.assertEqual(x, y)
+
+ # reseed should yield same numbers.
+ def test_003_reseed(self):
+ num = 5
+ x = np.zeros(num)
+ y = np.zeros(num)
+ rndm = gr.random(43) # init with fix seed 1
+ for k in range(num):
+ x[k] = rndm.ran1()
+ rndm.reseed(43) # init with fix seed 2
+ for k in range(num):
+ y[k] = rndm.ran1()
+ self.assertFloatTuplesAlmostEqual(x, y)
+
+ def test_004_integer(self):
+ nitems = 100000
+ minimum = 2
+ maximum = 42
+ rng = gr.random(1, minimum, maximum)
+ rnd_vals = np.zeros(nitems, dtype=int)
+ for i in range(nitems):
+ rnd_vals[i] = rng.ran_int()
+ self.assertGreaterEqual(minimum, np.min(rnd_vals))
+ self.assertLess(np.max(rnd_vals), maximum)
+
+
+if __name__ == '__main__':
+ gr_unittest.run(test_random, "test_random.xml")