battery_dash_widget.py
Go to the documentation of this file.
00001 # Software License Agreement (BSD License)
00002 #
00003 # Copyright (c) 2012, Willow Garage, Inc.
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 Willow Garage, Inc. 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 OWNER 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 
00034 import os
00035 import rospkg
00036 from python_qt_binding.QtCore import Signal, QSize
00037 from python_qt_binding.QtWidgets import QLabel
00038 from .util import IconHelper
00039 
00040 class BatteryDashWidget(QLabel):
00041     """
00042     A Widget which displays incremental battery state, including a status tip.
00043     To use this widget simply call :func:`update_perc` and :func:`update_time`
00044     to change the displayed charge percentage and time remaining, respectively.
00045 
00046     :param name: The name of this widget
00047     :type name: str
00048     """
00049     state_changed = Signal(int)
00050 
00051     def __init__(self, name='Battery', icons=None, charge_icons=None,
00052                  icon_paths=None, suppress_overlays=False, stale_icon=None):
00053         super(BatteryDashWidget, self).__init__()
00054         if not icons:
00055             icons = []
00056             charge_icons = []
00057             for x in range(6):
00058                 icons.append(['ic-battery-%s.svg' % (x * 20)])
00059                 charge_icons.append(['ic-battery-charge-%s.svg' % (x * 20)])
00060         if not stale_icon:
00061             stale_icon = ['ic-battery-0.svg', 'ol-stale-battery.svg']
00062         icon_paths = (icon_paths if icon_paths else []) + [['rqt_robot_dashboard', 'images']]
00063         paths = []
00064         rp = rospkg.RosPack()
00065         for path in icon_paths:
00066             paths.append(os.path.join(rp.get_path(path[0]), path[1]))
00067         self._icon_helper = IconHelper(paths, name)
00068         # Add stale icon at end of icons so that it gets composited
00069         icons.append(stale_icon)
00070         charge_icons.append(stale_icon) # Need icons and charge_icons length to be same
00071         converted_icons = self._icon_helper.set_icon_lists(icons, charge_icons, suppress_overlays)
00072         self._icons = converted_icons[0]
00073         self._charge_icons = converted_icons[1]
00074         self._name = name
00075         self._charging = False
00076         self._stale = True
00077         self.__state = 0
00078         self.setMargin(5)
00079         self.state_changed.connect(self._update_state)
00080         self.update_perc(0)
00081         self.update_time(0)
00082 
00083     def _update_state(self, state):
00084         if self._stale:
00085             self.setPixmap(self._icons[-1].pixmap(QSize(60, 100)))
00086         elif self._charging:
00087             self.setPixmap(self._charge_icons[state].pixmap(QSize(60, 100)))
00088         else:
00089             self.setPixmap(self._icons[state].pixmap(QSize(60, 100)))
00090 
00091     @property
00092     def state(self):
00093         """
00094         Read-only accessor for the widgets current state.
00095         """
00096         return self.__state
00097 
00098     def set_charging(self, value):
00099         self._charging = value
00100 
00101     def update_perc(self, val):
00102         """
00103         Update the displayed battery percentage.
00104         The default implementation of this method displays in 20% increments
00105 
00106         :param val: The new value to be displayed.
00107         :type val: int
00108         """
00109         self.update_state(round(val / 20.0))
00110 
00111     def update_state(self, state):
00112         """
00113         Set the state of this button.
00114         This will also update the icon for the button based on the ``self._icons`` list
00115 
00116         :raises IndexError: If state is not a proper index to ``self._icons``
00117 
00118         :param state: The state to set.
00119         :type state: int
00120         """
00121         if 0 <= state and state < len(self._icons):
00122             self.__state = state
00123             self.state_changed.emit(self.__state)
00124         else:
00125             raise IndexError("%s update_state received invalid state: %s" % (self._name, state))
00126 
00127     def update_time(self, value):
00128         try:
00129             fval = float(value)
00130             self.setToolTip("%s: %.2f%% remaining" % (self._name, fval))
00131         except ValueError:
00132             self.setToolTip("%s: %s%% remaining" % (self._name, value))
00133 
00134     def set_stale(self):
00135         """Set button to stale.
00136 
00137         Not used by base dashboard implementation.
00138         """
00139         self._charging = False
00140         self._stale = True
00141         self.setToolTip("%s: Stale" % self._name)
00142         # This triggers self.update_state which in turn will trigger _update_state
00143         self.update_perc(0)
00144 
00145     def unset_stale(self):
00146         self._stale = False


rqt_robot_dashboard
Author(s): Ze'ev Klapow
autogenerated on Wed May 3 2017 02:40:43