Skip to content

Commit 9988664

Browse files
author
jblum
committed
Merging r11186:11273 from grc branch.
Fixes, features, and reorganization for grc. Minor fixes and features for wxgui forms. git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@11274 221aa14e-8319-0410-a670-987f0aec2ac5
1 parent 885e6fe commit 9988664

File tree

301 files changed

+1397
-1238
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

301 files changed

+1397
-1238
lines changed

config/grc_grc.m4

+8-20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
dnl Copyright 2008 Free Software Foundation, Inc.
1+
dnl Copyright 2008, 2009 Free Software Foundation, Inc.
22
dnl
33
dnl This file is part of GNU Radio
44
dnl
@@ -47,27 +47,15 @@ AC_DEFUN([GRC_GRC],[
4747
AC_SUBST(PYTHONW)
4848
4949
AC_CONFIG_FILES([ \
50-
grc/src/grc_gnuradio/Makefile \
51-
grc/src/grc_gnuradio/wxgui/Makefile \
52-
grc/src/grc_gnuradio/blks2/Makefile \
53-
grc/src/grc_gnuradio/usrp/Makefile \
54-
grc/src/Makefile \
55-
grc/src/platforms/Makefile \
56-
grc/src/platforms/base/Makefile \
57-
grc/src/platforms/python/Makefile \
58-
grc/src/platforms/python/utils/Makefile \
59-
grc/src/platforms/gui/Makefile \
60-
grc/src/utils/Makefile \
61-
grc/src/gui/Makefile \
62-
grc/examples/Makefile \
6350
grc/Makefile \
64-
grc/data/Makefile \
65-
grc/data/platforms/Makefile \
66-
grc/data/platforms/base/Makefile \
67-
grc/data/platforms/python/Makefile \
68-
grc/data/platforms/python/blocks/Makefile \
69-
grc/scripts/Makefile \
51+
grc/base/Makefile \
52+
grc/blocks/Makefile \
53+
grc/examples/Makefile \
7054
grc/freedesktop/Makefile \
55+
grc/grc_gnuradio/Makefile \
56+
grc/gui/Makefile \
57+
grc/python/Makefile \
58+
grc/scripts/Makefile \
7159
])
7260
7361
GRC_BUILD_CONDITIONAL(grc)

gr-wxgui/src/python/forms/converters.py

+12-5
Original file line numberDiff line numberDiff line change
@@ -85,22 +85,28 @@ class eval_converter(abstract_converter):
8585
Possible uses, set a complex number, constellation points.
8686
Used in text box.
8787
"""
88-
def external_to_internal(self, s):
89-
return str(s)
88+
def __init__(self, formatter=lambda x: '%s'%(x)):
89+
self._formatter = formatter
90+
def external_to_internal(self, v):
91+
return self._formatter(v)
9092
def internal_to_external(self, s):
9193
return eval(s)
9294
def help(self):
9395
return "Value must be evaluatable by python's eval."
9496

9597
class str_converter(abstract_converter):
98+
def __init__(self, formatter=lambda x: '%s'%(x)):
99+
self._formatter = formatter
96100
def external_to_internal(self, v):
97-
return str(v)
101+
return self._formatter(v)
98102
def internal_to_external(self, s):
99103
return str(s)
100104

101105
class int_converter(abstract_converter):
106+
def __init__(self, formatter=lambda x: '%d'%round(x)):
107+
self._formatter = formatter
102108
def external_to_internal(self, v):
103-
return str(int(round(v)))
109+
return self._formatter(v)
104110
def internal_to_external(self, s):
105111
return int(s, 0)
106112
def help(self):
@@ -127,7 +133,8 @@ def __init__(self, minimum, maximum, num_steps, cast):
127133
self._scaler = float(maximum - minimum)/num_steps
128134
self._cast = cast
129135
def external_to_internal(self, v):
130-
return (v - self._offset)/self._scaler
136+
#slider's internal representation is an integer
137+
return int(round((v - self._offset)/self._scaler))
131138
def internal_to_external(self, v):
132139
return self._cast(v*self._scaler + self._offset)
133140
def help(self):

gr-wxgui/src/python/forms/forms.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ def _add_widget(self, widget, label='', flag=0, label_prop=0, widget_prop=1):
115115
self.subscribe(INT_KEY, update)
116116
self.subscribe(INT_KEY, self._translate_internal_to_external)
117117
self.subscribe(EXT_KEY, self._translate_external_to_internal)
118-
if self._callback: self.subscribe(EXT_KEY, self._callback)
119118

120119
def _translate_external_to_internal(self, external):
121120
try:
@@ -134,6 +133,7 @@ def _translate_internal_to_external(self, internal):
134133
except Exception, e:
135134
self._err_msg(internal, e)
136135
self[EXT_KEY] = self[EXT_KEY] #reset to last good setting
136+
if self._callback: self._callback(self[EXT_KEY])
137137

138138
def _err_msg(self, value, e):
139139
print >> sys.stderr, self, 'Error translating value: "%s"\n\t%s\n\t%s'%(value, e, self._converter.help())

grc/Makefile.am

+34-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Copyright 2008 Free Software Foundation, Inc.
2+
# Copyright 2008, 2009 Free Software Foundation, Inc.
33
#
44
# This file is part of GNU Radio
55
#
@@ -23,13 +23,43 @@ include $(top_srcdir)/grc/Makefile.inc
2323

2424
if PYTHON
2525
SUBDIRS = \
26-
data \
26+
base \
27+
blocks \
2728
examples \
28-
scripts \
29-
src
29+
grc_gnuradio \
30+
gui \
31+
python \
32+
scripts
3033

3134
## append freedesktop to the list of subdirs when xdg utils are present
3235
if XDG_UTILS
3336
SUBDIRS += freedesktop
3437
endif
38+
39+
ourpythondir = $(grc_src_prefix)
40+
ourpython_PYTHON = __init__.py
41+
42+
etcdir = $(gr_sysconfdir)
43+
dist_etc_DATA = grc.conf
44+
45+
EXTRA_DIST = \
46+
$(srcdir)/__init__.py.in \
47+
$(srcdir)/grc.conf.in
48+
49+
BUILT_SOURCES = \
50+
__init__.py \
51+
grc.conf
52+
53+
__init__.py: $(srcdir)/__init__.py.in Makefile
54+
sed \
55+
-e 's|@VERSION[@]|$(VERSION)|g' \
56+
$< > $@
57+
58+
grc.conf: $(srcdir)/grc.conf.in Makefile
59+
sed \
60+
-e 's|@pythonw[@]|$(PYTHONW)|g' \
61+
-e 's|@blocksdir[@]|$(grc_blocksdir)|g' \
62+
-e 's|@docdir[@]|$(gr_docdir)|g' \
63+
$< > $@
64+
3565
endif

grc/Makefile.inc

+1-4
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,5 @@
2020
#
2121

2222
include $(top_srcdir)/Makefile.common
23-
grc_gnuradio_prefix = $(pythondir)/grc_gnuradio
2423
grc_src_prefix = $(pythondir)/gnuradio/grc
25-
grc_base_data_reldir = grc/base
26-
grc_python_data_reldir = grc/python
27-
grc_blocks_data_reldir = grc/blocks
24+
grc_blocksdir = $(pkgdatadir)/grc/blocks
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Copyright 2008, 2009 Free Software Foundation, Inc.
2+
Copyright 2009 Free Software Foundation, Inc.
33
This file is part of GNU Radio
44

55
GNU Radio Companion is free software; you can redistribute it and/or
@@ -17,32 +17,5 @@
1717
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
1818
"""
1919

20-
import pygtk
21-
pygtk.require('2.0')
22-
import gtk
23-
import os
24-
25-
##default path for the open/save dialogs
26-
DEFAULT_FILE_PATH = os.getcwd()
27-
28-
##file extensions
29-
IMAGE_FILE_EXTENSION = '.png'
30-
31-
##name for new/unsaved flow graphs
32-
NEW_FLOGRAPH_TITLE = 'untitled'
33-
34-
##main window constraints
35-
MIN_WINDOW_WIDTH = 600
36-
MIN_WINDOW_HEIGHT = 400
37-
##dialog constraints
38-
MIN_DIALOG_WIDTH = 500
39-
MIN_DIALOG_HEIGHT = 500
40-
##default sizes
41-
DEFAULT_BLOCKS_WINDOW_WIDTH = 100
42-
DEFAULT_REPORTS_WINDOW_WIDTH = 100
43-
44-
##The size of the state saving cache in the flow graph (for undo/redo functionality)
45-
STATE_CACHE_SIZE = 42
46-
47-
##Shared targets for drag and drop of blocks
48-
DND_TARGETS = [('STRING', gtk.TARGET_SAME_APP, 0)]
20+
#package and version constants
21+
VERSION = '@VERSION@'

grc/src/platforms/base/Block.py grc/base/Block.py

+13-11
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
1818
"""
1919

20-
from ... utils import odict
20+
from . import odict
2121
from Element import Element
2222
from Param import Param
2323
from Port import Port
@@ -44,7 +44,7 @@ def __str__(self):
4444
return str(self._param.to_code())
4545

4646
def __call__(self):
47-
return self._param.evaluate()
47+
return self._param.get_evaluated()
4848

4949
class Block(Element):
5050

@@ -89,26 +89,26 @@ def __init__(self, flow_graph, n):
8989
for param in map(lambda n: self.get_parent().get_parent().Param(self, n), params):
9090
key = param.get_key()
9191
#test against repeated keys
92-
try: assert(key not in self.get_param_keys())
93-
except AssertionError: self._exit_with_error('Key "%s" already exists in params'%key)
92+
try: assert key not in self.get_param_keys()
93+
except AssertionError: raise Exception, 'Key "%s" already exists in params'%key
9494
#store the param
9595
self._params[key] = param
9696
#create the source objects
9797
self._sources = odict()
9898
for source in map(lambda n: self.get_parent().get_parent().Source(self, n), sources):
9999
key = source.get_key()
100100
#test against repeated keys
101-
try: assert(key not in self.get_source_keys())
102-
except AssertionError: self._exit_with_error('Key "%s" already exists in sources'%key)
101+
try: assert key not in self.get_source_keys()
102+
except AssertionError: raise Exception, 'Key "%s" already exists in sources'%key
103103
#store the port
104104
self._sources[key] = source
105105
#create the sink objects
106106
self._sinks = odict()
107107
for sink in map(lambda n: self.get_parent().get_parent().Sink(self, n), sinks):
108108
key = sink.get_key()
109109
#test against repeated keys
110-
try: assert(key not in self.get_sink_keys())
111-
except AssertionError: self._exit_with_error('Key "%s" already exists in sinks'%key)
110+
try: assert key not in self.get_sink_keys()
111+
except AssertionError: raise Exception, 'Key "%s" already exists in sinks'%key
112112
#store the port
113113
self._sinks[key] = sink
114114
#begin the testing
@@ -141,11 +141,14 @@ def validate(self):
141141
All ports and params must be valid.
142142
All checks must evaluate to true.
143143
"""
144+
Element.validate(self)
144145
for c in self.get_params() + self.get_ports() + self.get_connections():
145-
try: assert(c.is_valid())
146+
try:
147+
c.validate()
148+
assert c.is_valid()
146149
except AssertionError:
147150
for msg in c.get_error_messages():
148-
self._add_error_message('>>> %s:\n\t%s'%(c, msg))
151+
self.add_error_message('>>> %s:\n\t%s'%(c, msg))
149152

150153
def __str__(self): return 'Block - %s - %s(%s)'%(self.get_id(), self.get_name(), self.get_key())
151154

@@ -256,4 +259,3 @@ def import_data(self, n):
256259
#the key must exist in this block's params
257260
if key in self.get_param_keys():
258261
self.get_param(key).set_value(value)
259-
self.validate()

grc/src/platforms/base/Connection.py grc/base/Connection.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Copyright 2008 Free Software Foundation, Inc.
2+
Copyright 2008, 2009 Free Software Foundation, Inc.
33
This file is part of GNU Radio
44
55
GNU Radio Companion is free software; you can redistribute it and/or
@@ -18,7 +18,7 @@
1818
"""
1919

2020
from Element import Element
21-
from ... utils import odict
21+
from . import odict
2222

2323
class Connection(Element):
2424

@@ -59,10 +59,11 @@ def validate(self):
5959
Validate the connections.
6060
The ports must match in type.
6161
"""
62+
Element.validate(self)
6263
source_type = self.get_source().get_type()
6364
sink_type = self.get_sink().get_type()
6465
try: assert source_type == sink_type
65-
except AssertionError: self._add_error_message('Source type "%s" does not match sink type "%s".'%(source_type, sink_type))
66+
except AssertionError: self.add_error_message('Source type "%s" does not match sink type "%s".'%(source_type, sink_type))
6667

6768
def get_enabled(self):
6869
"""

grc/src/platforms/base/Constants.py.in grc/base/Constants.py

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
"""
2-
Copyright 2008 Free Software Foundation, Inc.
2+
Copyright 2008, 2009 Free Software Foundation, Inc.
33
This file is part of GNU Radio
44
55
GNU Radio Companion is free software; you can redistribute it and/or
@@ -19,12 +19,7 @@
1919

2020
import os
2121

22-
#package and version constants
23-
PACKAGE = '@PACKAGE@'
24-
VERSION = '@VERSION@'
25-
26-
#setup paths
27-
PKG_DIR = os.environ.get('GR_DATADIR', '@pkgdatadir@')
28-
DATA_DIR = os.path.join(PKG_DIR, '@reldatadir@')
22+
#data files
23+
DATA_DIR = os.path.dirname(__file__)
2924
FLOW_GRAPH_DTD = os.path.join(DATA_DIR, 'flow_graph.dtd')
3025
BLOCK_TREE_DTD = os.path.join(DATA_DIR, 'block_tree.dtd')

grc/src/platforms/base/Element.py grc/base/Element.py

+8-37
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ class Element(object):
2121

2222
def __init__(self, parent=None):
2323
self._parent = parent
24-
self._error_messages = []
2524
self.flag()
2625

2726
def test(self):
@@ -31,45 +30,17 @@ def test(self):
3130
"""
3231
pass
3332

34-
def validate(self):
35-
"""
36-
Validate the data in this element.
37-
Set the error message non blank for errors.
38-
Overload this method in sub-classes.
39-
"""
40-
pass
41-
42-
def is_valid(self):
43-
self._error_messages = []#reset err msgs
44-
if self.get_enabled():
45-
try: self.validate()
46-
except: pass
47-
return not self.get_error_messages()
33+
##################################################
34+
# Element Validation API
35+
##################################################
36+
def validate(self): self._error_messages = list()
37+
def is_valid(self): return not self.get_error_messages() or not self.get_enabled()
38+
def add_error_message(self, msg): self._error_messages.append(msg)
39+
def get_error_messages(self): return self._error_messages
4840

4941
def get_enabled(self): return True
5042

51-
def _add_error_message(self, msg):
52-
self._error_messages.append(msg)
53-
54-
def get_error_messages(self):
55-
return self._error_messages
56-
57-
def get_parent(self):
58-
return self._parent
59-
60-
def _exit_with_error(self, error):
61-
parent = self
62-
#build hier list of elements
63-
elements = list()
64-
while(parent):
65-
elements.insert(0, parent)
66-
parent = parent.get_parent()
67-
#build error string
68-
err_str = ">>> Error:"
69-
for i, element in enumerate(elements + [error]):
70-
err_str = err_str + '\n' + ''.join(' '*(i+2)) + str(element)
71-
err_str = err_str + '\n'
72-
exit(err_str)
43+
def get_parent(self): return self._parent
7344

7445
##############################################
7546
## Update flagging

0 commit comments

Comments
 (0)