37 from python_qt_binding
import loadUi
38 from python_qt_binding.QtWidgets
import QWidget, QGraphicsScene, QLabel, QGraphicsEllipseItem, QGraphicsLineItem, QGraphicsTextItem
39 from python_qt_binding.QtCore
import Qt, Signal, QTimer, QDateTime, QDate, QTime, QPoint, QEvent, QObject, pyqtSignal
40 from python_qt_binding.QtGui
import QPixmap, QFont, QPen, QColor, QBrush, QImage
44 from rospy.rostime
import Time
45 from numpy
import isfinite
47 from dataspeed_pds_msgs.msg
import Status, Channel, Relay, Mode, Script
52 class Filter(QObject):
53 clicked = pyqtSignal()
54 def eventFilter(self, obj, event):
57 if event.type() == QEvent.MouseButtonRelease:
58 if obj.rect().contains(event.pos()):
65 filter = Filter(widget)
66 widget.installEventFilter(filter)
70 gui_update_timer = QTimer()
78 is_currently_tab =
False 84 super(PowerDistributionGui, self).
__init__(context)
96 if gui_type ==
'full':
103 for index
in range(0, 24):
104 channelStatusName =
"NONE" 107 if self.current_status.chan[index].status == Channel.ON:
108 buttonStyle +=
'background-color: rgb(78, 154, 6);' 109 channelStatusName =
"ON" 110 elif self.current_status.chan[index].status == Channel.NO_LOAD:
111 buttonStyle +=
'background-color: rgb(78, 154, 6);' 112 channelStatusName =
"NO LOAD" 113 elif self.current_status.chan[index].status == Channel.OVER_CURRENT:
114 buttonStyle +=
'background-color: rgb(252, 175, 62);' 115 channelStatusName =
"OVER CURRENT" 116 elif self.current_status.chan[index].status == Channel.OFF:
117 buttonStyle +=
'background-color: rgb(130, 130, 130);' 118 channelStatusName =
"OFF" 119 elif self.current_status.chan[index].status == Channel.BAD_RELAY:
120 buttonStyle +=
'background-color: rgb(229, 90, 90);' 121 channelStatusName =
"BAD RELAY" 122 elif self.current_status.chan[index].status == Channel.BAD_FUSE:
123 buttonStyle +=
'background-color: rgb(229, 90, 90);' 124 channelStatusName =
"BAD FUSE" 126 buttonText =
'<html><head/><body><p align="center"><span style=" font-size:12pt;">' 127 buttonText +=
'#{} {}'.format(index + 1, channelStatusName)
128 buttonText +=
'</span></p><p align="center"><span style=" font-size:28pt;">' 129 buttonText +=
'{0:.2f} A'.format(self.current_status.chan[index].current)
130 buttonText +=
'</span></p><p align="center"><span style=" font-size:8pt;">' 131 buttonText +=
'</span></p></body></html>' 132 getattr(self.
_widget,
"buttonChannel{:0>2d}".format(index + 1)).setText(buttonText)
134 buttonStyle +=
'color: rgb(0, 0, 0);' 135 buttonStyle +=
'border-radius: 12px;' 136 buttonStyle +=
'padding: 12px;' 137 getattr(self.
_widget,
"buttonChannel{:0>2d}".format(index + 1)).setStyleSheet(buttonStyle)
141 buttonTextMaster =
'<html><head/><body><p align="center"><span style=" font-size:20pt;">Toggle Master</span></p><p align="center"><span style=" font-size:28pt;">' 142 buttonTextMaster +=
'ON' if self.current_status.master.inverter.status
else 'OFF' 143 buttonTextMaster +=
'</span></p></body></html>' 144 self._widget.buttonInverterMaster.setText(buttonTextMaster)
147 buttonStyleMaster =
'color: rgb(0, 0, 0);' 148 buttonStyleMaster +=
'border-radius: 12px;' 149 buttonStyleMaster +=
'padding: 12px;' 150 buttonStyleMaster +=
'background-color: rgb(78, 154, 6);' if self.current_status.master.inverter.status
else 'background-color: rgb(229, 90, 90);' 151 self._widget.buttonInverterMaster.setStyleSheet(buttonStyleMaster)
154 buttonTextSlave =
'<html><head/><body><p align="center"><span style=" font-size:20pt;">Toggle Slave</span></p><p align="center"><span style=" font-size:28pt;">' 155 buttonTextSlave +=
'ON' if self.current_status.slave[0].inverter.status
else 'OFF' 156 buttonTextSlave +=
'</span></p></body></html>' 157 self._widget.buttonInverterSlave.setText(buttonTextSlave)
160 buttonStyleSlave =
'color: rgb(0, 0, 0);' 161 buttonStyleSlave +=
'border-radius: 12px;' 162 buttonStyleSlave +=
'padding: 12px;' 163 buttonStyleSlave +=
'background-color: rgb(78, 154, 6);' if self.current_status.slave[0].inverter.status
else 'background-color: rgb(229, 90, 90);' 164 self._widget.buttonInverterSlave.setStyleSheet(buttonStyleSlave)
167 self._widget.radioButtonAuto.setChecked(self.current_status.mode.mode == Mode.AUTO)
168 self._widget.radioButtonManual.setChecked(self.current_status.mode.mode == Mode.MANUAL)
169 self._widget.radioButtonValet.setChecked(self.current_status.mode.mode == Mode.VALET)
173 out_msg.mode = Mode.AUTO
174 self.pub_cmd_mode.publish(out_msg)
178 out_msg.mode = Mode.MANUAL
179 self.pub_cmd_mode.publish(out_msg)
183 out_msg.mode = Mode.VALET
184 self.pub_cmd_mode.publish(out_msg)
191 sub_status = rospy.Subscriber(
'/pds/status', Status, self.
recv_status)
200 self.gui_update_timer.setInterval(100)
201 self.gui_update_timer.setSingleShot(
False)
202 self.gui_update_timer.timeout.connect(
lambda: self.
update_gui_cb())
203 self.gui_update_timer.start()
207 out_msg.script = Script.NONE
208 self.pub_cmd_script.publish(out_msg)
212 out_msg.script = Script.STARTUP
213 self.pub_cmd_script.publish(out_msg)
217 out_msg.script = Script.SHUTDOWN
218 self.pub_cmd_script.publish(out_msg)
224 out_msg.request = Relay.TOGGLE
225 self.pub_cmd_request.publish(out_msg)
231 out_msg.request = Relay.TOGGLE
232 self.pub_cmd_request.publish(out_msg)
236 self._widget.labelNoData.move(
237 self._widget.width()/2 - self._widget.labelNoData.width()/2,
238 self._widget.height()/2 - self._widget.labelNoData.height()/2)
244 self._widget.labelNoData.show()
247 self._widget.labelNoData.hide()
253 print(str(widget.width()) +
"," + str(widget.height()))
258 self.setObjectName(
'PowerDistributionGui')
264 ui_file = os.path.join(rospkg.RosPack().get_path(
'dataspeed_pds_rqt'),
'resource',
'PowerDistributionGui.ui')
268 self._widget.setObjectName(
'PowerDistributionGui' + str(self.
widget_count))
271 self.context_.add_widget(self.
_widget)
276 self.setObjectName(
'PowerDistributionGui')
282 ui_file = os.path.join(rospkg.RosPack().get_path(
'dataspeed_pds_rqt'),
'resource',
'PowerDistributionGuiTabs.ui')
286 self._widget.setObjectName(
'PowerDistributionGui' + str(self.
widget_count))
289 self.context_.add_widget(self.
_widget)
295 out_msg.channel = number - 1
296 out_msg.request = Relay.TOGGLE
297 self.pub_cmd_request.publish(out_msg)
310 for index
in range(1, 24 + 1):
315 group = parser.add_argument_group(
'Options for dataspeed_pds_rqt plugin')
def update_inverter_buttons(self)
def advertise_topics(self)
def click_mode_auto(self)
def click_script_stop(self)
def reset_gui_timer(self)
def subscribe_topics(self)
def __init__(self, context)
def click_script_startup(self)
def recv_status(self, msg)
def get_size(self, widget)
def create_click_channel(self, number)
def shutdown_plugin(self)
def init_gui(self, gui_type)
def click_mode_manual(self)
def click_script_shutdown(self)
def update_channel_buttons(self)
def add_arguments(parser)
def click_inverter_slave(self)
def click_mode_valet(self)
def click_inverter_master(self)