summaryrefslogtreecommitdiff
path: root/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
diff options
context:
space:
mode:
authorTom Rondeau <tom@trondeau.com>2015-02-26 11:59:03 -0500
committerTom Rondeau <tom@trondeau.com>2015-04-02 15:38:56 -0700
commit450f3471ebe36f80c05ddff242b8771dec891638 (patch)
tree6cfef8460b4f0514f25996cdb264d1987cdd7679 /gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
parentfe14ba8cadf3a691f459f0997e281b2d99b26b0e (diff)
controlport: reorg abstraction layers for RPC connections.
ThriftRadioClient has merged with and renamed to RPCConnectionThrift.
Diffstat (limited to 'gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py')
-rw-r--r--gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py257
1 files changed, 11 insertions, 246 deletions
diff --git a/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py b/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
index 8f8895916b..87d2cf5658 100644
--- a/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
+++ b/gnuradio-runtime/python/gnuradio/ctrlport/GNURadioControlPortClient.py
@@ -28,246 +28,7 @@ is currently the only supported transport.
"""
-"""
-RPCMethods is a dictionary listing RPC transports currently supported
-by this client.
-
-Args:
- function: the function whose parameter list will be examined
- excluded_args: function arguments that are NOT to be added to the dictionary (sequence of strings)
- options: result of command argument parsing (optparse.Values)
-"""
-
-RPCMethods = {'thrift': 'Apache Thrift',
- #'ice': 'Zeroc ICE'
- }
-
-import sys, exceptions
-
-"""
-Base class for RPC transport clients
-
-Methods that all RPC clients should implement include:
-
- def newConnection(host,port): Method for re-establishing a new client
- connection to a different host / port
-
- def properties([]): Given a list of ControlPort property names,
- or an empty list to specify all currently registered properties,
- this method returns a dictionary of metadata describing the
- the specified properties. The dictionary key contains the name
- of each returned properties.
-
- def getKnobs([]): Given a list of ControlPort property names,
- or an empty list to specify all currently registered properties,
- this method returns a dictionary of the current value of
- the specified properties.
-
- def getRe([]): Given a list of regular expression strings,
- this method returns a dictionary of the current value of
- the all properties with names that match the specified
- expressions.
-
- def setKnobs({}): Given a dictionary of ControlPort property
- key / value pairs, this method requests that ControlPort
- attempt to set the specified named properties to the
- value given. Success in setting each property to the
- value specified requires that the property be registered
- as a 'setable' ControlPort property, that the client have the
- requisite privilege level to set the property, and
- the underlying Block's implementation in handling
- the set request.
-
-Args:
- method: name of the RPC transport
- port: port number of the connection
- host: hostname of the connection
-"""
-
-class RPCConnection(object):
- def __init__(self, method, port, host=None):
- (self.method, self.port) = (method, port)
- if host is None: self.host = '127.0.0.1'
- else: self.host = host
-
- def __str__(self):
- return "%s connection on %s:%s"%(self.getName(), self.getHost(), self.getPort())
-
- def getName(self):
- return RPCMethods[self.method]
-
- def getHost(self):
- return self.host
-
- def getPort(self):
- return self.port
-
- def newConnection(self, host=None, port=None):
- raise exceptions.NotImplementedError()
-
- def properties(self, *args):
- raise exceptions.NotImplementedError()
-
- def getKnobs(self, *args):
- raise exceptions.NotImplementedError()
-
- def getRe(self,*args):
- raise exceptions.NotImplementedError()
-
- def setKnobs(self,*args):
- raise exceptions.NotImplementedError()
-
- def shutdown(self):
- raise exceptions.NotImplementedError()
-
- def printProperties(self, props):
- raise exceptions.NotImplementedError()
-
-"""
-RPC Client interface for the Apache Thrift middle-ware RPC transport.
-
-Args:
- port: port number of the connection
- host: hostname of the connection
-"""
-
-class RPCConnectionThrift(RPCConnection):
- class Knob():
- def __init__(self, key, value=None, ktype=0):
- (self.key, self.value, self.ktype) = (key, value, ktype)
-
- def __repr__(self):
- return "({0} = {1})".format(self.key, self.value)
-
- def __init__(self, host=None, port=None):
- from gnuradio.ctrlport.GNURadio import ttypes
- self.BaseTypes = ttypes.BaseTypes
- self.KnobBase = ttypes.KnobBase
-
- if port is None:
- port = 9090
- super(RPCConnectionThrift, self).__init__(method='thrift', port=port, host=host)
- self.newConnection(host, port)
-
- self.unpack_dict = {
- self.BaseTypes.BOOL: lambda k,b: self.Knob(k, b.value.a_bool, self.BaseTypes.BOOL),
- self.BaseTypes.BYTE: lambda k,b: self.Knob(k, b.value.a_byte, self.BaseTypes.BYTE),
- self.BaseTypes.SHORT: lambda k,b: self.Knob(k, b.value.a_short, self.BaseTypes.SHORT),
- self.BaseTypes.INT: lambda k,b: self.Knob(k, b.value.a_int, self.BaseTypes.INT),
- self.BaseTypes.LONG: lambda k,b: self.Knob(k, b.value.a_long, self.BaseTypes.LONG),
- self.BaseTypes.DOUBLE: lambda k,b: self.Knob(k, b.value.a_double, self.BaseTypes.DOUBLE),
- self.BaseTypes.STRING: lambda k,b: self.Knob(k, b.value.a_string, self.BaseTypes.STRING),
- self.BaseTypes.COMPLEX: lambda k,b: self.Knob(k, b.value.a_complex, self.BaseTypes.COMPLEX),
- self.BaseTypes.F32VECTOR: lambda k,b: self.Knob(k, b.value.a_f32vector, self.BaseTypes.F32VECTOR),
- self.BaseTypes.F64VECTOR: lambda k,b: self.Knob(k, b.value.a_f64vector, self.BaseTypes.F64VECTOR),
- self.BaseTypes.S64VECTOR: lambda k,b: self.Knob(k, b.value.a_s64vector, self.BaseTypes.S64VECTOR),
- self.BaseTypes.S32VECTOR: lambda k,b: self.Knob(k, b.value.a_s32vector, self.BaseTypes.S32VECTOR),
- self.BaseTypes.S16VECTOR: lambda k,b: self.Knob(k, b.value.a_s16vector, self.BaseTypes.S16VECTOR),
- self.BaseTypes.S8VECTOR: lambda k,b: self.Knob(k, b.value.a_s8vector, self.BaseTypes.S8VECTOR),
- self.BaseTypes.C32VECTOR: lambda k,b: self.Knob(k, b.value.a_c32vector, self.BaseTypes.C32VECTOR),
- }
-
- self.pack_dict = {
- self.BaseTypes.BOOL: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_bool = k.value)),
- self.BaseTypes.BYTE: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_byte = k.value)),
- self.BaseTypes.SHORT: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_short = k.value)),
- self.BaseTypes.INT: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_int = k.value)),
- self.BaseTypes.LONG: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_long = k.value)),
- self.BaseTypes.DOUBLE: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_double = k.value)),
- self.BaseTypes.STRING: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_string = k.value)),
- self.BaseTypes.COMPLEX: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_complex = k.value)),
- self.BaseTypes.F32VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_f32vector = k.value)),
- self.BaseTypes.F64VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_f64vector = k.value)),
- self.BaseTypes.S64VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_s64vector = k.value)),
- self.BaseTypes.S32VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_s32vector = k.value)),
- self.BaseTypes.S16VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_s16vector = k.value)),
- self.BaseTypes.S8VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_s8vector = k.value)),
- self.BaseTypes.C32VECTOR: lambda k: ttypes.Knob(type=k.ktype, value=ttypes.KnobBase(a_c32vector = k.value)),
- }
-
- def unpackKnob(self, key, knob):
- f = self.unpack_dict.get(knob.type, None)
- if(f):
- return f(key, knob)
- else:
- sys.stderr.write("unpackKnobs: Incorrect Knob type: {0}\n".format(knob.type))
- raise exceptions.ValueError
-
- def packKnob(self, knob):
- f = self.pack_dict.get(knob.ktype, None)
- if(f):
- return f(knob)
- else:
- sys.stderr.write("packKnobs: Incorrect Knob type: {0}\n".format(knob.type))
- raise exceptions.ValueError
-
- def newConnection(self, host=None, port=None):
- from gnuradio.ctrlport.ThriftRadioClient import ThriftRadioClient
- import thrift
- try:
- self.thriftclient = ThriftRadioClient(self.getHost(), self.getPort())
- except thrift.transport.TTransport.TTransportException:
- sys.stderr.write("Could not connect to ControlPort endpoint at {0}:{1}.\n\n".format(host, port))
- sys.exit(1)
-
- def properties(self, *args):
- knobprops = self.thriftclient.radio.properties(*args)
- for key, knobprop in knobprops.iteritems():
- #print("key:", key, "value:", knobprop, "type:", knobprop.type)
- knobprops[key].min = self.unpackKnob(key, knobprop.min)
- knobprops[key].max = self.unpackKnob(key, knobprop.max)
- knobprops[key].defaultvalue = self.unpackKnob(key, knobprop.defaultvalue)
- return knobprops
-
- def getKnobs(self, *args):
- result = {}
- for key, knob in self.thriftclient.radio.getKnobs(*args).iteritems():
- #print("key:", key, "value:", knob, "type:", knob.type)
- result[key] = self.unpackKnob(key, knob)
- return result
-
- def getKnobsRaw(self, *args):
- result = {}
- for key, knob in self.thriftclient.radio.getKnobs(*args).iteritems():
- #print("key:", key, "value:", knob, "type:", knob.type)
- result[key] = knob
- return result
-
- def getRe(self,*args):
- result = {}
- for key, knob in self.thriftclient.radio.getRe(*args).iteritems():
- result[key] = self.unpackKnob(key, knob)
- return result
-
- def setKnobs(self, *args):
- if(type(*args) == dict):
- a = dict(*args)
- result = {}
- for key, knob in a.iteritems():
- result[key] = self.packKnob(knob)
- self.thriftclient.radio.setKnobs(result)
- elif(type(*args) == list or type(*args) == tuple):
- a = list(*args)
- result = {}
- for k in a:
- result[k.key] = self.packKnob(k)
- self.thriftclient.radio.setKnobs(result)
- else:
- sys.stderr.write("setKnobs: Invalid type; must be dict, list, or tuple\n")
-
- def shutdown(self):
- self.thriftclient.radio.shutdown()
-
- def printProperties(self, props):
- info = ""
- info += "Item:\t\t{0}\n".format(props.description)
- info += "units:\t\t{0}\n".format(props.units)
- info += "min:\t\t{0}\n".format(props.min.value)
- info += "max:\t\t{0}\n".format(props.max.value)
- info += "default:\t\t{0}\n".format(props.defaultvalue.value)
- info += "Type Code:\t0x{0:x}\n".format(props.type)
- info += "Disp Code:\t0x{0:x}\n".format(props.display)
- return info
+import exceptions
"""
GNURadioControlPortClient is the main class for creating a GNU Radio
@@ -351,17 +112,21 @@ class GNURadioControlPortClient():
self.client = None
+ from gnuradio.ctrlport.RPCConnection import RPCMethods
if RPCMethods.has_key(rpcmethod):
+ from gnuradio.ctrlport.RPCConnectionThrift import RPCConnectionThrift
if rpcmethod == 'thrift':
-# print("making RPCConnectionThrift")
+ #print("making RPCConnectionThrift")
self.client = RPCConnectionThrift(host, port)
-# print("made %s" % self.client)
+ #print("made %s" % self.client)
-# print("making callback call")
- if not callback is None: callback(self.client)
+ #print("making callback call")
+ if not callback is None:
+ callback(self.client)
-# print("making blockingcallback call")
- if not blockingcallback is None: blockingcallback()
+ #print("making blockingcallback call")
+ if not blockingcallback is None:
+ blockingcallback()
else:
print("Unsupported RPC method: ", rpcmethod)
raise exceptions.ValueError()