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.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
00069 icons.append(stale_icon)
00070 charge_icons.append(stale_icon)
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
00143 self.update_perc(0)
00144
00145 def unset_stale(self):
00146 self._stale = False