diff options
-rw-r--r-- | config/grc_grc.m4 | 2 | ||||
-rw-r--r-- | grc/base/Element.py | 3 | ||||
-rw-r--r-- | grc/gui/ActionHandler.py | 3 | ||||
-rw-r--r-- | grc/gui/Actions.py | 9 | ||||
-rw-r--r-- | grc/gui/Bars.py | 4 | ||||
-rw-r--r-- | grc/gui/Dialogs.py | 14 | ||||
-rw-r--r-- | grc/python/Param.py | 4 | ||||
-rw-r--r-- | vrt/include/vrt/quadradio.h | 12 | ||||
-rw-r--r-- | vrt/lib/quadradio.cc | 20 |
9 files changed, 53 insertions, 18 deletions
diff --git a/config/grc_grc.m4 b/config/grc_grc.m4 index ce23e3c25..7ee009fae 100644 --- a/config/grc_grc.m4 +++ b/config/grc_grc.m4 @@ -31,7 +31,7 @@ AC_DEFUN([GRC_GRC],[ if test $passed = yes; then PYTHON_CHECK_MODULE([sys],[Python >= 2.5],[],[passed=no],[sys.version.split()[[0]] >= "2.5"]) PYTHON_CHECK_MODULE([Cheetah],[Python Cheetah templates >= 2.0.0],[],[passed=no],[Cheetah.Version >= "2.0.0"]) - PYTHON_CHECK_MODULE([lxml.etree],[Python lxml wrappers >= 2.0.0],[],[passed=no],[lxml.etree.LXML_VERSION >= (2, 0, 0, 0)]) + PYTHON_CHECK_MODULE([lxml.etree],[Python lxml wrappers >= 1.3.6],[],[passed=no],[lxml.etree.LXML_VERSION >= (1, 3, 6, 0)]) PYTHON_CHECK_MODULE([gtk],[Python gtk wrappers >= 2.10.0],[],[passed=no],[gtk.pygtk_version >= (2, 10, 0)]) fi diff --git a/grc/base/Element.py b/grc/base/Element.py index e77e7ce08..a57090f3b 100644 --- a/grc/base/Element.py +++ b/grc/base/Element.py @@ -50,11 +50,12 @@ class Element(object): def get_error_messages(self): """ Get the list of error messages from this element and all of its children. + Do not include the error messages from disabled children. Cleverly indent the children error messages for printing purposes. @return a list of error message strings """ error_messages = list(self._error_messages) #make a copy - for child in self.get_children(): + for child in filter(lambda c: c.get_enabled(), self.get_children()): for msg in child.get_error_messages(): error_messages.append("%s:\n\t%s"%(child, msg.replace("\n", "\n\t"))) return error_messages diff --git a/grc/gui/ActionHandler.py b/grc/gui/ActionHandler.py index 361be1cf8..ee3e19a6c 100644 --- a/grc/gui/ActionHandler.py +++ b/grc/gui/ActionHandler.py @@ -210,6 +210,8 @@ class ActionHandler: Dialogs.HelpDialog() elif action == Actions.TYPES_WINDOW_DISPLAY: Dialogs.TypesDialog(self.get_flow_graph().get_parent()) + elif action == Actions.ERRORS_WINDOW_DISPLAY: + Dialogs.ErrorsDialog(self.get_flow_graph()) ################################################## # Param Modifications ################################################## @@ -307,6 +309,7 @@ class ActionHandler: # Global Actions for all States ################################################## #update general buttons + Actions.ERRORS_WINDOW_DISPLAY.set_sensitive(not self.get_flow_graph().is_valid()) Actions.ELEMENT_DELETE.set_sensitive(bool(self.get_flow_graph().get_selected_elements())) Actions.BLOCK_PARAM_MODIFY.set_sensitive(bool(self.get_flow_graph().get_selected_block())) Actions.BLOCK_ROTATE_CCW.set_sensitive(bool(self.get_flow_graph().get_selected_blocks())) diff --git a/grc/gui/Actions.py b/grc/gui/Actions.py index b22279c1d..f374efde1 100644 --- a/grc/gui/Actions.py +++ b/grc/gui/Actions.py @@ -215,6 +215,11 @@ BLOCK_PASTE = Action( stock_id=gtk.STOCK_PASTE, keypresses=(gtk.keysyms.v, gtk.gdk.CONTROL_MASK), ) +ERRORS_WINDOW_DISPLAY = Action( + label='_Errors', + tooltip='View flow graph errors', + stock_id=gtk.STOCK_DIALOG_ERROR, +) ABOUT_WINDOW_DISPLAY = Action( label='_About', tooltip='About this program', @@ -222,13 +227,13 @@ ABOUT_WINDOW_DISPLAY = Action( ) HELP_WINDOW_DISPLAY = Action( label='_Help', - tooltip='Usage Tips', + tooltip='Usage tips', stock_id=gtk.STOCK_HELP, keypresses=(gtk.keysyms.F1, NO_MODS_MASK), ) TYPES_WINDOW_DISPLAY = Action( label='_Types', - tooltip='Types Color Mapping', + tooltip='Types color mapping', stock_id=gtk.STOCK_DIALOG_INFO, ) FLOW_GRAPH_GEN = Action( diff --git a/grc/gui/Bars.py b/grc/gui/Bars.py index fff5ebc08..8fd167869 100644 --- a/grc/gui/Bars.py +++ b/grc/gui/Bars.py @@ -39,6 +39,7 @@ TOOLBAR_LIST = ( Actions.FLOW_GRAPH_UNDO, Actions.FLOW_GRAPH_REDO, None, + Actions.ERRORS_WINDOW_DISPLAY, Actions.FLOW_GRAPH_GEN, Actions.FLOW_GRAPH_EXEC, Actions.FLOW_GRAPH_KILL, @@ -81,6 +82,9 @@ MENU_BAR_LIST = ( None, Actions.BLOCK_PARAM_MODIFY, ]), + (gtk.Action('View', '_View', None, None), [ + Actions.ERRORS_WINDOW_DISPLAY, + ]), (gtk.Action('Build', '_Build', None, None), [ Actions.FLOW_GRAPH_GEN, Actions.FLOW_GRAPH_EXEC, diff --git a/grc/gui/Dialogs.py b/grc/gui/Dialogs.py index 3cf617b92..af40f47c0 100644 --- a/grc/gui/Dialogs.py +++ b/grc/gui/Dialogs.py @@ -57,6 +57,20 @@ def MessageDialogHelper(type, buttons, title=None, markup=None): message_dialog.destroy() return response + +ERRORS_MARKUP_TMPL="""\ +#for $i, $err_msg in enumerate($errors) +<b>Error $i:</b> +$encode($err_msg.replace('\t', ' ')) + +#end for""" +def ErrorsDialog(flowgraph): MessageDialogHelper( + type=gtk.MESSAGE_ERROR, + buttons=gtk.BUTTONS_CLOSE, + title='Flow Graph Errors', + markup=Utils.parse_template(ERRORS_MARKUP_TMPL, errors=flowgraph.get_error_messages()), +) + class AboutDialog(gtk.AboutDialog): """A cute little about dialog.""" diff --git a/grc/python/Param.py b/grc/python/Param.py index 387fab548..34d5ab116 100644 --- a/grc/python/Param.py +++ b/grc/python/Param.py @@ -254,7 +254,7 @@ class Param(_Param, _GUIParam): elif t in ('raw', 'complex', 'real', 'int', 'complex_vector', 'real_vector', 'int_vector', 'hex', 'bool'): #raise exception if python cannot evaluate this value try: e = self.get_parent().get_parent().evaluate(v) - except Exception, e: raise Exception, 'Value "%s" cannot be evaluated: %s'%(v, e) + except Exception, e: raise Exception, 'Value "%s" cannot be evaluated:\n%s'%(v, e) #raise an exception if the data is invalid if t == 'raw': return e elif t == 'complex': @@ -385,7 +385,7 @@ class Param(_Param, _GUIParam): try: notebook_block = filter(lambda b: b.get_id() == notebook_id, notebook_blocks)[0] except: raise Exception, 'Notebook id "%s" is not an existing notebook id.'%notebook_id #check that page index exists - try: assert int(page_index) in range(len(notebook_block.get_param('labels').get_evaluated())) + try: assert int(page_index) in range(len(notebook_block.get_param('labels').evaluate())) except: raise Exception, 'Page index "%s" is not a valid index number.'%page_index return notebook_id, page_index ######################### diff --git a/vrt/include/vrt/quadradio.h b/vrt/include/vrt/quadradio.h index 83323f093..d30ee14f1 100644 --- a/vrt/include/vrt/quadradio.h +++ b/vrt/include/vrt/quadradio.h @@ -72,12 +72,14 @@ namespace vrt { int *ctrl_fd_ptr, struct in_addr *ctrl_port_inaddr, int *data_fd_ptr, int *data_port_ptr); + // dsprxno selects the Rx DSP pipe (0 or 1) to configure static bool - send_rx_command(int ctrl_fd, bool start, - struct in_addr addr, int data_port, int samples_per_pkt, int siggen_param); + send_rx_command(int ctrl_fd, int rxdspno, bool start, + struct in_addr addr, int data_port, int samples_per_pkt); + // dsprxno selects the Rx DSP pipe (0 or 1) to stop static bool - send_stop_rx_command(int ctrl_fd); + send_stop_rx_command(int ctrl_fd, int rxdspno); static int control_port() { return 790; } int data_socket_fd() const { return d_data_fd; } @@ -94,9 +96,11 @@ namespace vrt { vrt::rx::sptr vrt_rx() const { return d_rx; } + // FIXME add rxdspno as the first parameter bool start_streaming(int samples_per_pkt = 0); - bool stop_streaming(); + // FIXME add rxdspno as the first parameter + bool stop_streaming(); /* convenience methods that ultimately write the dboard pins */ bool set_center_freq(double target_freq); diff --git a/vrt/lib/quadradio.cc b/vrt/lib/quadradio.cc index 8cf542e0f..a8bc3e525 100644 --- a/vrt/lib/quadradio.cc +++ b/vrt/lib/quadradio.cc @@ -76,14 +76,18 @@ vrt::quadradio::open(const char *ip) bool vrt::quadradio::start_streaming(int samples_per_pkt) { - return send_rx_command(d_ctrl_fd, true, d_ctrl_port_inaddr, - d_data_port, samples_per_pkt, 0); + int rxdspno = 0; // FIXME make it the first param + + return send_rx_command(d_ctrl_fd, rxdspno, true, d_ctrl_port_inaddr, + d_data_port, samples_per_pkt); } bool vrt::quadradio::stop_streaming() { - return send_stop_rx_command(d_ctrl_fd); + int rxdspno = 0; // FIXME make it the first param + + return send_stop_rx_command(d_ctrl_fd, rxdspno); } bool @@ -288,9 +292,9 @@ vrt::quadradio::open_sockets(const char *quad_radio_ip, int quad_radio_ctrl_port // ------------------------------------------------------------------------ bool -vrt::quadradio::send_rx_command(int ctrl_fd, bool start, +vrt::quadradio::send_rx_command(int ctrl_fd, int rxdspno, bool start, struct in_addr addr, int data_port, - int samples_per_pkt, int siggen_param) + int samples_per_pkt) { uint32_t cmd[7]; cmd[0] = htonl(0); // verb: set @@ -299,17 +303,17 @@ vrt::quadradio::send_rx_command(int ctrl_fd, bool start, cmd[3] = addr.s_addr; // ip address to send data to (already network endian) cmd[4] = htonl(data_port); // port to send data to cmd[5] = htonl(samples_per_pkt); - cmd[6] = htonl(siggen_param); + cmd[6] = htonl(rxdspno); // the DSP pipeline to configure return send_and_check(ctrl_fd, cmd, sizeof(cmd)); } bool -vrt::quadradio::send_stop_rx_command(int ctrl_fd) +vrt::quadradio::send_stop_rx_command(int ctrl_fd, int rxdspno) { struct in_addr in_addr; in_addr.s_addr = 0; - return send_rx_command(ctrl_fd, false, in_addr, 0, 0, 0); + return send_rx_command(ctrl_fd, rxdspno, false, in_addr, 0, 0); } bool |