Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 import os
00035 import rospkg
00036 from python_qt_binding.QtCore import Signal, QSize
00037 from python_qt_binding.QtGui import QIcon, 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, icon_paths=None, suppress_overlays=False):
00052 super(BatteryDashWidget, self).__init__()
00053 if icons == None:
00054 icons = []
00055 charge_icons = []
00056 for x in range(6):
00057 icons.append(['ic-battery-%s.svg' % (x * 20)])
00058 charge_icons.append(['ic-battery-charge-%s.svg' % (x * 20)])
00059 icon_paths = (icon_paths if icon_paths else []) + [['rqt_robot_dashboard', 'images']]
00060 paths = []
00061 rp = rospkg.RosPack()
00062 for path in icon_paths:
00063 paths.append(os.path.join(rp.get_path(path[0]), path[1]))
00064 self._icon_helper = IconHelper(paths, name)
00065 converted_icons = self._icon_helper.set_icon_lists(icons, charge_icons, suppress_overlays)
00066 self._icons = converted_icons[0]
00067 self._charge_icons = converted_icons[1]
00068 self._name = name
00069 self._charging = False
00070 self.__state = 0
00071 self.setMargin(5)
00072 self.state_changed.connect(self._update_state)
00073 self.update_perc(0)
00074 self.update_time(0)
00075
00076 def _update_state(self, state):
00077 if self._charging:
00078 self.setPixmap(self._charge_icons[state].pixmap(QSize(60, 100)))
00079 else:
00080 self.setPixmap(self._icons[state].pixmap(QSize(60, 100)))
00081
00082 @property
00083 def state(self):
00084 """
00085 Read-only accessor for the widgets current state.
00086 """
00087 return self.__state
00088
00089 def set_charging(self, value):
00090 self._charging = value
00091
00092 def update_perc(self, val):
00093 """
00094 Update the displayed battery percentage.
00095 The default implementation of this method displays in 20% increments
00096
00097 :param val: The new value to be displayed.
00098 :type val: int
00099 """
00100 self.update_state(round(val / 20.0))
00101
00102 def update_state(self, state):
00103 """
00104 Set the state of this button.
00105 This will also update the icon for the button based on the ``self._icons`` list
00106
00107 :raises IndexError: If state is not a proper index to ``self._icons``
00108
00109 :param state: The state to set.
00110 :type state: int
00111 """
00112 if 0 <= state and state < len(self._icons):
00113 self.__state = state
00114 self.state_changed.emit(self.__state)
00115 else:
00116 raise IndexError("%s update_state received invalid state: %s" % (self._name, state))
00117
00118 def update_time(self, value):
00119 try:
00120 fval = float(value)
00121 self.setToolTip("%s: %.2f%% remaining" % (self._name, fval))
00122 except ValueError:
00123 self.setToolTip("%s: %s%% remaining" % (self._name, value))