diff options
Diffstat (limited to 'gnuradio-runtime/python')
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") |