publisher_widget.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 
00003 # Copyright (c) 2011, Dorian Scholz, TU Darmstadt
00004 # All rights reserved.
00005 #
00006 # Redistribution and use in source and binary forms, with or without
00007 # modification, are permitted provided that the following conditions
00008 # are met:
00009 #
00010 #   * Redistributions of source code must retain the above copyright
00011 #     notice, this list of conditions and the following disclaimer.
00012 #   * Redistributions in binary form must reproduce the above
00013 #     copyright notice, this list of conditions and the following
00014 #     disclaimer in the documentation and/or other materials provided
00015 #     with the distribution.
00016 #   * Neither the name of the TU Darmstadt nor the names of its
00017 #     contributors may be used to endorse or promote products derived
00018 #     from this software without specific prior written permission.
00019 #
00020 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00028 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00030 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00031 # POSSIBILITY OF SUCH DAMAGE.
00032 
00033 from __future__ import division
00034 import os
00035 
00036 from python_qt_binding import loadUi
00037 from python_qt_binding.QtCore import Signal, Slot
00038 from python_qt_binding.QtGui import QIcon, QWidget
00039 
00040 import roslib
00041 import rosmsg
00042 import rospkg
00043 import rospy
00044 
00045 from qt_gui_py_common.worker_thread import WorkerThread
00046 from rqt_py_common.extended_combo_box import ExtendedComboBox
00047 from .publisher_tree_widget import PublisherTreeWidget
00048 
00049 
00050 # main class inherits from the ui window class
00051 class PublisherWidget(QWidget):
00052     add_publisher = Signal(str, str, float, bool)
00053     change_publisher = Signal(int, str, str, str, object)
00054     publish_once = Signal(int)
00055     remove_publisher = Signal(int)
00056     clean_up_publishers = Signal()
00057 
00058     def __init__(self, parent=None):
00059         super(PublisherWidget, self).__init__(parent)
00060         self._topic_dict = {}
00061         self._update_thread = WorkerThread(self._update_thread_run, self._update_finished)
00062 
00063         self._rospack = rospkg.RosPack()
00064         ui_file = os.path.join(self._rospack.get_path('rqt_publisher'), 'resource', 'Publisher.ui')
00065         loadUi(ui_file, self, {'ExtendedComboBox': ExtendedComboBox, 'PublisherTreeWidget': PublisherTreeWidget})
00066         self.refresh_button.setIcon(QIcon.fromTheme('view-refresh'))
00067         self.refresh_button.clicked.connect(self.refresh_combo_boxes)
00068         self.add_publisher_button.setIcon(QIcon.fromTheme('add'))
00069         self.remove_publisher_button.setIcon(QIcon.fromTheme('remove'))
00070         self.clear_button.setIcon(QIcon.fromTheme('edit-clear'))
00071 
00072         self.refresh_combo_boxes()
00073 
00074         self.publisher_tree_widget.model().item_value_changed.connect(self.change_publisher)
00075         self.publisher_tree_widget.remove_publisher.connect(self.remove_publisher)
00076         self.publisher_tree_widget.publish_once.connect(self.publish_once)
00077         self.remove_publisher_button.clicked.connect(self.publisher_tree_widget.remove_selected_publishers)
00078         self.clear_button.clicked.connect(self.clean_up_publishers)
00079 
00080     def shutdown_plugin(self):
00081         self._update_thread.kill()
00082 
00083     @Slot()
00084     def refresh_combo_boxes(self):
00085         self._update_thread.kill()
00086         self.type_combo_box.setEnabled(False)
00087         self.topic_combo_box.setEnabled(False)
00088         self.type_combo_box.setEditText('updating...')
00089         self.topic_combo_box.setEditText('updating...')
00090         self._update_thread.start()
00091 
00092     # this runs in a non-gui thread, so don't access widgets here directly
00093     def _update_thread_run(self):
00094         # update type_combo_box
00095         message_type_names = []
00096         try:
00097             # this only works on fuerte and up
00098             packages = sorted([pkg_tuple[0] for pkg_tuple in rosmsg.iterate_packages(self._rospack, rosmsg.MODE_MSG)])
00099         except:
00100             # this works up to electric
00101             packages = sorted(rosmsg.list_packages())
00102         for package in packages:
00103             for base_type_str in rosmsg.list_msgs(package, rospack=self._rospack):
00104                 message_class = roslib.message.get_message_class(base_type_str)
00105                 if message_class is not None:
00106                     message_type_names.append(base_type_str)
00107 
00108         self.type_combo_box.setItems.emit(sorted(message_type_names))
00109 
00110         # update topic_combo_box
00111         _, _, topic_types = rospy.get_master().getTopicTypes()
00112         self._topic_dict = dict(topic_types)
00113         self.topic_combo_box.setItems.emit(sorted(self._topic_dict.keys()))
00114 
00115     @Slot()
00116     def _update_finished(self):
00117         self.type_combo_box.setEnabled(True)
00118         self.topic_combo_box.setEnabled(True)
00119 
00120     @Slot(str)
00121     def on_topic_combo_box_currentIndexChanged(self, topic_name):
00122         if topic_name in self._topic_dict:
00123             self.type_combo_box.setEditText(self._topic_dict[topic_name])
00124 
00125     @Slot()
00126     def on_add_publisher_button_clicked(self):
00127         topic_name = str(self.topic_combo_box.currentText())
00128         type_name = str(self.type_combo_box.currentText())
00129         rate = float(self.frequency_combo_box.currentText())
00130         enabled = False
00131         self.add_publisher.emit(topic_name, type_name, rate, enabled)


rqt_publisher
Author(s): Dorian Scholz
autogenerated on Mon Oct 6 2014 07:15:34