[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r7535 - in grc/branches/grc_reloaded/src/grc: . elemen
From: |
jblum |
Subject: |
[Commit-gnuradio] r7535 - in grc/branches/grc_reloaded/src/grc: . elements platforms/gnuradio_python platforms/gnuradio_python/blocks platforms/gnuradio_python/blocks/operators |
Date: |
Thu, 31 Jan 2008 20:23:22 -0700 (MST) |
Author: jblum
Date: 2008-01-31 20:23:21 -0700 (Thu, 31 Jan 2008)
New Revision: 7535
Removed:
grc/branches/grc_reloaded/src/grc/Colors.py
Modified:
grc/branches/grc_reloaded/src/grc/elements/Block.py
grc/branches/grc_reloaded/src/grc/elements/Connection.py
grc/branches/grc_reloaded/src/grc/elements/Element.py
grc/branches/grc_reloaded/src/grc/elements/FlowGraph.py
grc/branches/grc_reloaded/src/grc/elements/Param.py
grc/branches/grc_reloaded/src/grc/elements/Port.py
grc/branches/grc_reloaded/src/grc/elements/Range.py
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Block.py
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/FlowGraph.py
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Port.py
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/block.dtd
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add.xml
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add_const.xml
Log:
validation in element classes
Deleted: grc/branches/grc_reloaded/src/grc/Colors.py
Modified: grc/branches/grc_reloaded/src/grc/elements/Block.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/Block.py 2008-02-01 02:39:30 UTC
(rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/Block.py 2008-02-01 03:23:21 UTC
(rev 7535)
@@ -59,7 +59,7 @@
try: assert(key not in self.get_source_keys())
except AssertionError: self._exit_with_error('Key "%s"
already exists in sources'%key)
#store the port
- self._sources[key] = source
+ self._sources[key] = source
#create the sink objects
self._sinks = odict()
for sink in map(self.Sink, sinks):
@@ -68,17 +68,9 @@
try: assert(key not in self.get_sink_keys())
except AssertionError: self._exit_with_error('Key "%s"
already exists in sinks'%key)
#store the port
- self._sinks[key] = sink
+ self._sinks[key] = sink
#begin the testing
self.test()
- #work the enums
- for param in filter(lambda p: p.get_type() == 'enum',
self.get_params()):
- orig_value = param.get_value()
- #set each option key and run the build
- for option_key in param.get_option_keys():
- param.set_value(option_key)
- self.test()
- param.set_value(orig_value)
def test(self):
"""!
@@ -86,6 +78,15 @@
"""
map(lambda c: c.test(), self.get_params() + self.get_sinks() +
self.get_sources())
+ def validate(self):
+ """
+ Validate the block.
+ All ports and params must be valid.
+ """
+ for c in self.get_params() + self.get_sinks() +
self.get_sources():
+ try: assert(c.is_valid())
+ except AssertionError: self._add_error_message('Element
"%s" is not valid.'%c)
+
def __str__(self): return 'Block: %s(%s)'%(self.get_name(),
self.get_key())
def get_doc(self): return self._doc
@@ -117,7 +118,7 @@
def get_source(self, key): return self._sources[key]
def get_sources(self): return self._sources.values()
- def resolve_dependency(self, dep):
+ def resolve_dependencies(self, string):
"""
Resolve a paramater dependency.
Dependencies are simple strings.
@@ -125,24 +126,20 @@
Without the $, dependencies are evaluated as is.
Dependencies are specified as $param_key where param_key is an
existing parameter.
For enumerated parameters, dependencies are $param_key:opt_key
where opt_key is an existing opt key.
- @param dep the dependency string
+ @param string the string with dependencies
@return the resolved value
"""
- dep = str(dep).strip()
- if dep.startswith('$'):
- dep = dep[1:]
- keys = dep.split(':')
- try: assert(keys[0] in self.get_param_keys())
- except AssertionError: self._exit_with_error('Cannot
find param for dependency "%s".'%dep)
- param = self.get_param(keys[0])
- if len(keys) == 1:
- return param.get_value()
- elif len(keys) == 2:
- try: assert(keys[1] in param.get_opt_keys())
- except AssertionError:
self._exit_with_error('Cannot find opt for dependency "%s".'%dep)
- return param.get_opt(keys[1])
- else: self._exit_with_error('Dependency "%s" cannot be
resolved.'%dep)
- else: return dep
+ #create a dictionary of all possible dependency strings
+ deps = dict()
+ for param in self.get_params():
+ if param.is_enum():
+ for key in param.get_opt_keys():
+ deps['$'+param.get_key()+':'+key] =
param.get_opt(key)
+ else: deps['$'+param.get_key()] = param.get_value()
+ #replace any dependencies with actual values
+ for key,value in deps.iteritems():
+ string = string.replace(key, value)
+ return string
##############################################
## Import/Export Methods
Modified: grc/branches/grc_reloaded/src/grc/elements/Connection.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/Connection.py 2008-02-01
02:39:30 UTC (rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/Connection.py 2008-02-01
03:23:21 UTC (rev 7535)
@@ -29,6 +29,16 @@
def __str__(self): return 'Connection: %s -> %s'%(self.get_source(),
self.get_sink())
+ def validate(self):
+ """
+ Validate the connections.
+ The ports must match in type.
+ """
+ source_type = self.get_source().get_type()
+ sink_type = self.get_sink().get_type()
+ try: assert(source_type == sink_type)
+ except AssertionError: self._add_error_message('Source type
"%s" does not match sink type "%s".'%(source_type, sink_type))
+
#############################
# Access Ports
#############################
Modified: grc/branches/grc_reloaded/src/grc/elements/Element.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/Element.py 2008-02-01
02:39:30 UTC (rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/Element.py 2008-02-01
03:23:21 UTC (rev 7535)
@@ -24,6 +24,7 @@
def __init__(self, parent=None):
self._parent = parent
+ self._error_messages = []
def test(self):
"""
@@ -32,6 +33,25 @@
"""
pass
+ def validate(self):
+ """
+ Validate the data in this element.
+ Set the error message non blank for errors.
+ Overload this method in sub-classes.
+ """
+ pass
+
+ def is_valid(self):
+ self._error_messages = []#reset err msgs
+ self.validate()
+ return not self.get_error_message()
+
+ def _add_error_message(self, msg):
+ self._error_messages.append(msg)
+
+ def get_error_messages(self):
+ return self._error_messages
+
def get_parent(self):
return self._parent
Modified: grc/branches/grc_reloaded/src/grc/elements/FlowGraph.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/FlowGraph.py 2008-02-01
02:39:30 UTC (rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/FlowGraph.py 2008-02-01
03:23:21 UTC (rev 7535)
@@ -52,6 +52,22 @@
def __str__(self): return 'FlowGraph: %s'%self.get_platform_keys()
+ def evaluate(self, expr):
+ """
+ Evaluate the expression.
+ @param expr the string expression
+ @throw Exception bad expression
+ @return the evaluated data
+ """
+ return eval(expr, {}, {})
+
+ def validate(self):
+ """
+ Validate the flow graph.
+ All connections and blocks must be valid.
+ """
+ #TODO
+
##############################################
# Access Platforms
##############################################
Modified: grc/branches/grc_reloaded/src/grc/elements/Param.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/Param.py 2008-02-01 02:39:30 UTC
(rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/Param.py 2008-02-01 03:23:21 UTC
(rev 7535)
@@ -81,6 +81,9 @@
class Param(Element):
+ ##possible param types
+ TYPES = ['enum']
+
def __init__(self, block, name, key, value, type, range, options):
Element.__init__(self, block)
self._name = name
@@ -97,11 +100,11 @@
#store the option
self._options[key] = option
#test the enum options
- if self._options or self._type == 'enum':
+ if self._options or self.is_enum():
#test against bad combos of type and enum
try: assert(self._options)
except AssertionError: self._exit_with_error('At least
one option must exist when type "enum" is set.')
- try: assert(self._type == 'enum')
+ try: assert(self.is_enum())
except AssertionError: self._exit_with_error('Type
"enum" must be set when options are present.')
#test against options with identical keys
try: assert(len(set(self.get_option_keys())) ==
len(self._options))
@@ -122,9 +125,16 @@
call test on all children
"""
map(lambda c: c.test(), [self.get_range()] + self.get_options())
- #test get type
- self.get_type()
- #TODO: assert type in enum or allowed in datatype
+
+ def validate(self):
+ """
+ Validate the param.
+ The value must be evaluated and type must a possible type.
+ """
+ try: self.evaluate()
+ except: self._add_error_message('Value "%s" cannot be
evaluated.'%self.get_value())
+ try: assert(self.get_type() in self.TYPES)
+ except AssertionError: self._add_error_message('Type "%s" is
not a possible type.'%type)
def __str__(self): return 'Param: %s(%s)'%(self.get_name(),
self.get_key())
@@ -136,8 +146,10 @@
def set_value(self, value): self._value = value
- def get_type(self): return
self.get_parent().resolve_dependency(self._type)
+ def get_type(self): return
self.get_parent().resolve_dependencies(self._type)
+ def is_enum(self): return self._type == 'enum'
+
def get_range(self): return self._range
##############################################
Modified: grc/branches/grc_reloaded/src/grc/elements/Port.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/Port.py 2008-02-01 02:39:30 UTC
(rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/Port.py 2008-02-01 03:23:21 UTC
(rev 7535)
@@ -25,17 +25,29 @@
class Port(Element):
+ ##possible port types
+ TYPES = []
+
def __init__(self, block, name, key, type):
Element.__init__(self, block)
self._name = name
self._key = key
self._type = type
-
- def test(self):
- self.get_type()
+
+ def validate(self):
+ """!
+ Validate the port.
+ The port must be non-empty and type must a possible type.
+ """
+ try: assert(not self.is_empty())
+ except AssertionError: self._add_error_message('Port "%s" is
empty.'%self)
+ try: assert(self.get_type() in self.TYPES)
+ except AssertionError: self._add_error_message('Type "%s" is
not a possible type.'%type)
def __str__(self): return 'Port: %s(%s)'%(self.get_name(),
self.get_key())
+ def get_color(self): return '#FFFFFF'
+
def get_name(self): return self._name
def get_key(self): return self._key
@@ -44,7 +56,7 @@
def is_source(self): return self in self.get_parent().get_sources()
- def get_type(self): return
self.get_parent().resolve_dependency(self._type)
+ def get_type(self): return
self.get_parent().resolve_dependencies(self._type)
def get_connections(self):
"""!
Modified: grc/branches/grc_reloaded/src/grc/elements/Range.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/elements/Range.py 2008-02-01 02:39:30 UTC
(rev 7534)
+++ grc/branches/grc_reloaded/src/grc/elements/Range.py 2008-02-01 03:23:21 UTC
(rev 7535)
@@ -46,17 +46,28 @@
except: self._exit_with_error('Range "%s" cannot be parsed to
"min, max"'%range)
def __str__(self): return 'Range: %s'%self._range
-
- def test(self):
- #test get min and get max
- self.get_min()
- self.get_max()
+
+ def validate(self):
+ """
+ Validate this range.
+ Min and max must be eval.
+ """
+ #test min
+ try: self.get_min()
+ except ValueError: self._add_error_message('The min "%s" is not
a number'%self.get_min())
+ #test max
+ try: self.get_max()
+ except ValueError: self._add_error_message('The max "%s" is not
a number'%self.get_max())
+ #test min <= max
+ if self.is_valid():
+ try: assert(self.get_min() <= self.get_max())
+ except AssertionError: self._add_error_message('The max
"%s" is less than the min: "%s".'%(self.get_max(), self.get_min()))
def get_min(self):
- return
float(self.get_parent().get_parent().resolve_dependency(self._min))
+ return
float(self.get_parent().get_parent().resolve_dependencies(self._min))
def get_max(self):
- return
float(self.get_parent().get_parent().resolve_dependency(self._max))
+ return
float(self.get_parent().get_parent().resolve_dependencies(self._max))
def in_range(self, num):
"""
Modified: grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Block.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Block.py
2008-02-01 02:39:30 UTC (rev 7534)
+++ grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Block.py
2008-02-01 03:23:21 UTC (rev 7535)
@@ -22,15 +22,23 @@
from grc.elements.Block import Block as _Block
from Port import Port
+from Param import Param
from grc import Utils
class Block(_Block):
+ ##override static constructor for param
+ Param = Param.make_param_from_n
##override static constructor for source
Source = Port.make_source_from_n
##override static constructor for sink
Sink = Port.make_sink_from_n
+ ##for make source to keep track of indexes
+ _source_count = 0
+ ##for make sink to keep track of indexes
+ _sink_count = 0
+
def __init__(self, flow_graph, doc, name, key, cat, deps, fcn,
callbacks, params, sources, sinks):
_Block.__init__(
self,
@@ -89,4 +97,4 @@
sinks=sinks,
)
make_block_from_n = staticmethod(make_block_from_n)
-
\ No newline at end of file
+
Modified:
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/FlowGraph.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/FlowGraph.py
2008-02-01 02:39:30 UTC (rev 7534)
+++ grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/FlowGraph.py
2008-02-01 03:23:21 UTC (rev 7535)
@@ -22,9 +22,36 @@
from grc.elements.FlowGraph import FlowGraph as _FlowGraph
from Block import Block
+from Connection import Connection
class FlowGraph(_FlowGraph):
##override static constructor for block
Block = Block.make_block_from_n
-
\ No newline at end of file
+ ##override static constructor for connection
+ Connection = Connection.make_connection_from_n
+
+ def evaluate(self, expr):
+ """
+ Evaluate the expression.
+ @param expr the string expression
+ @throw Exception bad expression
+ @return the evaluated data
+ """
+ #bring in gnuradio modules
+ from gnuradio import gr
+ from gnuradio.gr import firdes
+ import math
+ import cmath
+ my_eval = lambda exp: eval(exp, {
+ '__builtins__': __builtins__,
+ 'gr': gr,
+ 'firdes': firdes,
+ 'math': math,
+ 'cmath': cmath,
+ #TODO add varables here
+ }
+ )
+ return my_eval(expr)
+
+
Modified: grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Port.py
===================================================================
--- grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Port.py
2008-02-01 02:39:30 UTC (rev 7534)
+++ grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/Port.py
2008-02-01 03:23:21 UTC (rev 7535)
@@ -25,7 +25,10 @@
class Port(_Port):
- def __init__(self, block, name, key, type, vec_len, num_ports,
optional):
+ ##possible port types
+ TYPES = ['complex', 'float', 'int', 'short', 'byte']
+
+ def __init__(self, block, name, key, type, vlen, nports, optional):
_Port.__init__(
self,
block=block,
@@ -33,27 +36,76 @@
key=key,
type=type,
)
- self._num_ports = num_ports
- self._vec_len = vec_len
+ self._nports = nports
+ self._vlen = vlen
self._optional = bool(optional)
def test(self):
_Port.test(self)
- if self.get_num_ports():
+ if self.get_nports():
try: assert(int(self.get_key()) == 0)
except (AssertionError,ValueError):
self._exit_with_error('Port key must be "0" when num ports is specified.')
try:
if self.is_sink():
assert(len(self.get_parent().get_sinks()) == 1)
elif self.is_source():
assert(len(self.get_parent().get_sources()) == 1)
except AssertionError: self._exit_with_error('Other
ports not allowed when num ports is specified.')
- self.get_vec_len()
- def get_vec_len(self): return
self.get_parent().resolve_dependency(self._vec_len)
+ def get_vlen(self):
+ """
+ Get the vector length.
+ If the evaluation of vlen cannot be cast to an integer, return
1.
+ @return the vector length or 1
+ """
+ vlen = self.get_parent().resolve_dependencies(self._vlen)
+ try: return int(self.get_parent().get_parent().evaluate(vlen))
+ except: return 1
- def get_num_ports(self): return
self.get_parent().resolve_dependency(self._num_ports)
+ def get_nports(self):
+ """
+ Get the number of ports.
+ If already blank, return a blank
+ If the evaluation of nports cannot be cast to an integer,
return 1.
+ @return the number of ports or 1
+ """
+ nports = self.get_parent().resolve_dependencies(self._nports)
+ #return blank if nports is blank
+ if not nports: return ''
+ try: return int(self.get_parent().get_parent().evaluate(nports))
+ except: return 1
- def get_optional(self): return
self.get_parent().resolve_dependency(self._optional)
+ def get_optional(self): return
self.get_parent().resolve_dependencies(self._optional)
+
+ def get_color(self):
+ """
+ Get the color that represents this port's type.
+ Codes differ for ports where the vec length is 1 or greater
than 1.
+ @return a hex color code.
+ """
+ if self.get_vlen() == 1:
+ return {#vlen is 1
+ 'complex': '#3399FF',
+ 'float': '#FF8C69',
+ 'int': '#00FF99',
+ 'short': '#FFFF66',
+ 'byte': '#FF66FF',
+ }[self.get_type()]
+ return {#vlen is non 1
+ 'complex': '#3399AA',
+ 'float': '#CC8C69',
+ 'int': '#00CC99',
+ 'short': '#CCCC33',
+ 'byte': '#CC66CC',
+ }[self.get_type()]
+ def is_empty(self):
+ """!
+ Is this port empty?
+ An empty port has no connections.
+ Not empty of optional is set.
+ @return true if empty
+ """
+ return not self.get_optional() and not self.get_connections()
+
##############################################
## Static Make Methods
##############################################
@@ -67,19 +119,20 @@
#grab the data
name = n['name']
type = n['type']
- vec_len = Utils.exists_or_else(n, 'vec_len', '')
- num_ports = Utils.exists_or_else(n, 'num_ports', '')
+ vlen = Utils.exists_or_else(n, 'vlen', '')
+ nports = Utils.exists_or_else(n, 'nports', '')
optional = Utils.exists_or_else(n, 'optional', '')
#key is port index
- key = str(len(block.get_sources()))
+ key = str(block._source_count)
+ block._source_count = block._source_count + 1
#build the port
return Port(
block=block,
name=name,
key=key,
type=type,
- vec_len=vec_len,
- num_ports=num_ports,
+ vlen=vlen,
+ nports=nports,
optional=optional,
)
make_source_from_n = staticmethod(make_source_from_n)
@@ -94,21 +147,22 @@
#grab the data
name = n['name']
type = n['type']
- vec_len = Utils.exists_or_else(n, 'vec_len', '')
- num_ports = Utils.exists_or_else(n, 'num_ports', '')
+ vlen = Utils.exists_or_else(n, 'vlen', '1')
+ nports = Utils.exists_or_else(n, 'nports', '')
optional = Utils.exists_or_else(n, 'optional', '')
#key is port index
- key = str(len(block.get_sinks()))
+ key = str(block._sink_count)
+ block._sink_count = block._sink_count + 1
#build the port
return Port(
block=block,
name=name,
key=key,
type=type,
- vec_len=vec_len,
- num_ports=num_ports,
+ vlen=vlen,
+ nports=nports,
optional=optional,
)
make_sink_from_n = staticmethod(make_sink_from_n)
-
\ No newline at end of file
+
Modified:
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/block.dtd
===================================================================
---
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/block.dtd
2008-02-01 02:39:30 UTC (rev 7534)
+++
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/block.dtd
2008-02-01 03:23:21 UTC (rev 7535)
@@ -32,8 +32,8 @@
-->
<!ELEMENT param (name, key, value?, type, range?, option*)>
<!ELEMENT option (name, key, opt*)>
-<!ELEMENT sink (name, type, vec_len?, num_ports?, optional?)>
-<!ELEMENT source (name, type, vec_len?, num_ports?, optional?)>
+<!ELEMENT sink (name, type, vlen?, nports?, optional?)>
+<!ELEMENT source (name, type, vlen?, nports?, optional?)>
<!--
Bottom level elements.
Character data only.
@@ -46,8 +46,8 @@
<!ELEMENT range (#PCDATA)>
<!ELEMENT opt (#PCDATA)>
<!ELEMENT type (#PCDATA)>
-<!ELEMENT vec_len (#PCDATA)>
-<!ELEMENT num_ports (#PCDATA)>
+<!ELEMENT vlen (#PCDATA)>
+<!ELEMENT nports (#PCDATA)>
<!ELEMENT fcn (#PCDATA)>
<!ELEMENT value (#PCDATA)>
<!ELEMENT callback (#PCDATA)>
Modified:
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add.xml
===================================================================
---
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add.xml
2008-02-01 02:39:30 UTC (rev 7534)
+++
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add.xml
2008-02-01 03:23:21 UTC (rev 7535)
@@ -58,12 +58,12 @@
<sink>
<name>in</name>
<type>$type:type</type>
- <vec_len>$vec_len</vec_len>
- <num_ports>$num_inputs</num_ports>
+ <vlen>$vec_len</vlen>
+ <nports>$num_inputs</nports>
</sink>
<source>
<name>out</name>
<type>$type:type</type>
- <vec_len>$vec_len</vec_len>
+ <vlen>$vec_len</vlen>
</source>
</block>
Modified:
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add_const.xml
===================================================================
---
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add_const.xml
2008-02-01 02:39:30 UTC (rev 7534)
+++
grc/branches/grc_reloaded/src/grc/platforms/gnuradio_python/blocks/operators/add_const.xml
2008-02-01 03:23:21 UTC (rev 7535)
@@ -63,11 +63,11 @@
<sink>
<name>in</name>
<type>$type:type</type>
- <vec_len>$vec_len</vec_len>
+ <vlen>$vec_len</vlen>
</sink>
<source>
<name>out</name>
<type>$type:type</type>
- <vec_len>$vec_len</vec_len>
+ <vlen>$vec_len</vlen>
</source>
</block>
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7535 - in grc/branches/grc_reloaded/src/grc: . elements platforms/gnuradio_python platforms/gnuradio_python/blocks platforms/gnuradio_python/blocks/operators,
jblum <=