From 449d66be742b4c4acde29aab92f47e481799339a Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 30 Sep 2023 14:59:55 -0400 Subject: [PATCH 01/27] Ben, cope and seethe --- src/surface/gui/gui/widgets/flood_visual.py | 38 +++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/surface/gui/gui/widgets/flood_visual.py diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py new file mode 100644 index 00000000..d6eebf86 --- /dev/null +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -0,0 +1,38 @@ + +import rclpy +from std_msgs.msg import Bool +from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel +from PyQt5.QtGui import QColor, QPalette + +## /flooding (boolean) (True is flooding) + + +class FloodVisual(QWidget): + def __init__(self): + super().__init__() + + rclpy.init() + self.node = rclpy.create_node('flood_warning') + self.subscription = self.node.create_subscription(Bool, '/flooding', self.callback, 10) + + # GUI initialization + self.init_ui() + + def init_ui(self): + self.layout = QVBoxLayout() + self.label = QLabel('Indicator') + self.layout.addWidget(self.label) + self.set_palette_color(QColor(255, 0, 0)) # Default color is red + self.setLayout(self.layout) + + def set_palette_color(self, color): + palette = QPalette() + palette.setColor(QPalette.Window, color) + self.label.setAutoFillBackground(True) + self.label.setPalette(palette) + + def callback(self, msg): + if msg.data: + self.set_palette_color(QColor(0, 255, 0)) # Green when the topic is true + else: + self.set_palette_color(QColor(255, 0, 0)) # Red when the topic is false \ No newline at end of file From 8b0c5e7dcc4b65d49648603b6cf72c796f565faa Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 30 Sep 2023 15:30:24 -0400 Subject: [PATCH 02/27] New things --- src/rov_msgs/CMakeLists.txt | 1 + src/rov_msgs/msg/Flooding.msg | 2 + src/surface/gui/gui/pilot_app.py | 5 ++ src/surface/gui/gui/widgets/arm.py | 1 - src/surface/gui/gui/widgets/flood_visual.py | 57 ++++++++++++--------- 5 files changed, 40 insertions(+), 26 deletions(-) create mode 100644 src/rov_msgs/msg/Flooding.msg diff --git a/src/rov_msgs/CMakeLists.txt b/src/rov_msgs/CMakeLists.txt index 64407199..61a0c5d1 100644 --- a/src/rov_msgs/CMakeLists.txt +++ b/src/rov_msgs/CMakeLists.txt @@ -32,6 +32,7 @@ rosidl_generate_interfaces(${PROJECT_NAME} "msg/TaskFeedback.msg" "msg/Manip.msg" "msg/CameraControllerSwitch.msg" + "msg/Flooding.msg" DEPENDENCIES std_msgs ) diff --git a/src/rov_msgs/msg/Flooding.msg b/src/rov_msgs/msg/Flooding.msg new file mode 100644 index 00000000..ce5dd7ee --- /dev/null +++ b/src/rov_msgs/msg/Flooding.msg @@ -0,0 +1,2 @@ +# True means the robot is actively flooding +bool flooding \ No newline at end of file diff --git a/src/surface/gui/gui/pilot_app.py b/src/surface/gui/gui/pilot_app.py index 92723d26..278d759d 100644 --- a/src/surface/gui/gui/pilot_app.py +++ b/src/surface/gui/gui/pilot_app.py @@ -1,6 +1,7 @@ from gui.app import App from gui.widgets.arm import Arm from gui.widgets.video_widget import SwitchableVideoWidget +from gui.widgets.flood_visual import FloodVisual from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QHBoxLayout @@ -23,6 +24,10 @@ def __init__(self): "/camera_switch") layout.addWidget(self.video_area, alignment=Qt.AlignmentFlag.AlignCenter) + # self.floodWidget: FloodVisual = FloodVisual() + + # layout.addWidget(self.floodWidget, alignment= Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop) + self.arm: Arm = Arm() layout.addWidget(self.arm, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignBottom) diff --git a/src/surface/gui/gui/widgets/arm.py b/src/surface/gui/gui/widgets/arm.py index 74819791..1c962ae8 100644 --- a/src/surface/gui/gui/widgets/arm.py +++ b/src/surface/gui/gui/widgets/arm.py @@ -17,7 +17,6 @@ class Arm(QWidget): signal: pyqtSignal = pyqtSignal(CommandBool.Response) def __init__(self): - super().__init__() layout: QHBoxLayout = QHBoxLayout() diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index d6eebf86..c46d13fe 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -1,38 +1,45 @@ - +## /flooding (boolean) (True is flooding) import rclpy -from std_msgs.msg import Bool +from rov_msgs.msg import Flooding from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel -from PyQt5.QtGui import QColor, QPalette - -## /flooding (boolean) (True is flooding) - +from PyQt5.QtGui import QPainter, QColor +from gui.event_nodes.subscriber import GUIEventSubscriber +from PyQt6.QtCore import pyqtSignal class FloodVisual(QWidget): def __init__(self): super().__init__() - - rclpy.init() - self.node = rclpy.create_node('flood_warning') - self.subscription = self.node.create_subscription(Bool, '/flooding', self.callback, 10) - # GUI initialization - self.init_ui() - - def init_ui(self): + self.signal: pyqtSignal = pyqtSignal(Flooding.flooding) + self.signal.connect(self.refresh) + self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, '/flooding', signal, 10) + + self.indicator = IndicatorWidget(self) self.layout = QVBoxLayout() self.label = QLabel('Indicator') self.layout.addWidget(self.label) - self.set_palette_color(QColor(255, 0, 0)) # Default color is red + self.layout.addWidget(self.indicator) self.setLayout(self.layout) - def set_palette_color(self, color): - palette = QPalette() - palette.setColor(QPalette.Window, color) - self.label.setAutoFillBackground(True) - self.label.setPalette(palette) + def refresh(self, msg): + self.indicator.set_status(msg.flooding) + +class IndicatorWidget(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + self.status = False + + def set_status(self, status): + self.status = status + self.update() # Redraw the widget + + def paintEvent(self, event): + painter = QPainter(self) + painter.setRenderHint(QPainter.Antialiasing) + rect = self.contentsRect() + color = QColor(0, 255, 0) if self.status else QColor(255, 0, 0) - def callback(self, msg): - if msg.data: - self.set_palette_color(QColor(0, 255, 0)) # Green when the topic is true - else: - self.set_palette_color(QColor(255, 0, 0)) # Red when the topic is false \ No newline at end of file + # Draw the circular light + painter.setBrush(color) + painter.drawEllipse(rect) + painter.end() \ No newline at end of file From 9dfab19128333becc1d8ba670a397c334ca4b501 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 30 Sep 2023 16:20:26 -0400 Subject: [PATCH 03/27] It's not working today <3 --- src/surface/gui/gui/pilot_app.py | 5 +- src/surface/gui/gui/widgets/flood_visual.py | 69 ++++++++++++--------- 2 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/surface/gui/gui/pilot_app.py b/src/surface/gui/gui/pilot_app.py index 278d759d..7863cecf 100644 --- a/src/surface/gui/gui/pilot_app.py +++ b/src/surface/gui/gui/pilot_app.py @@ -24,9 +24,8 @@ def __init__(self): "/camera_switch") layout.addWidget(self.video_area, alignment=Qt.AlignmentFlag.AlignCenter) - # self.floodWidget: FloodVisual = FloodVisual() - - # layout.addWidget(self.floodWidget, alignment= Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop) + self.floodWidget: FloodVisual = FloodVisual() + layout.addWidget(self.floodWidget, alignment= Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop) self.arm: Arm = Arm() layout.addWidget(self.arm, diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index c46d13fe..8a04b7d8 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -1,45 +1,56 @@ ## /flooding (boolean) (True is flooding) -import rclpy from rov_msgs.msg import Flooding -from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel -from PyQt5.QtGui import QPainter, QColor +from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel +from PyQt6.QtGui import QPainter, QColor from gui.event_nodes.subscriber import GUIEventSubscriber -from PyQt6.QtCore import pyqtSignal +from PyQt6.QtCore import pyqtSignal, pyqtSlot class FloodVisual(QWidget): + signal: pyqtSignal = pyqtSignal(Flooding) + def __init__(self): super().__init__() - - self.signal: pyqtSignal = pyqtSignal(Flooding.flooding) self.signal.connect(self.refresh) - self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, '/flooding', signal, 10) - - self.indicator = IndicatorWidget(self) + self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, '/flooding', self.signal, 10) self.layout = QVBoxLayout() - self.label = QLabel('Indicator') + self.label = QLabel('Flooding Indicator') self.layout.addWidget(self.label) - self.layout.addWidget(self.indicator) + + # self.indicator = Indicator() + # self.layout.addWidget(self.indicator) + self.setLayout(self.layout) - def refresh(self, msg): - self.indicator.set_status(msg.flooding) + @pyqtSlot(Flooding) + def refresh(self, msg: Flooding): + self.indicator.setBooleanValue(msg.flooding) -class IndicatorWidget(QWidget): - def __init__(self, parent=None): - super().__init__(parent) - self.status = False +# class Indicator(QWidget): +# def __init__(self, parent=None): +# super().__init__(parent) +# self.setFixedSize(100, 100) +# self.boolean_value = False +# self.update() - def set_status(self, status): - self.status = status - self.update() # Redraw the widget +# def setBooleanValue(self, value): +# self.boolean_value = value +# self.update() # Trigger a repaint when the boolean value changes - def paintEvent(self, event): - painter = QPainter(self) - painter.setRenderHint(QPainter.Antialiasing) - rect = self.contentsRect() - color = QColor(0, 255, 0) if self.status else QColor(255, 0, 0) +# def update(self): +# painter = QPainter(self) +# painter.begin(self) +# painter.setRenderHint(QPainter.RenderHint.Antialiasing) + +# # Set the circle color based on the boolean value +# if self.boolean_value: +# circle_color = QColor(0, 255, 0) # Green +# else: +# circle_color = QColor(255, 0, 0) # Red + +# # Draw the colored circle +# painter.setBrush(circle_color) +# painter.drawEllipse(self.rect()) +# painter.end() + + - # Draw the circular light - painter.setBrush(color) - painter.drawEllipse(rect) - painter.end() \ No newline at end of file From 459c7efd962ea63558dd7c0b7f57ac6b558ada85 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 16 Dec 2023 14:22:02 -0500 Subject: [PATCH 04/27] God please let this pass the linter --- src/surface/gui/gui/widgets/flood_visual.py | 41 ++++----------------- 1 file changed, 7 insertions(+), 34 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 8a04b7d8..5e05ed39 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -1,7 +1,7 @@ ## /flooding (boolean) (True is flooding) from rov_msgs.msg import Flooding from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel -from PyQt6.QtGui import QPainter, QColor +from PyQt6.QtGui import QFont from gui.event_nodes.subscriber import GUIEventSubscriber from PyQt6.QtCore import pyqtSignal, pyqtSlot @@ -15,42 +15,15 @@ def __init__(self): self.layout = QVBoxLayout() self.label = QLabel('Flooding Indicator') self.layout.addWidget(self.label) - - # self.indicator = Indicator() - # self.layout.addWidget(self.indicator) - + self.indicator = QLabel("🟢") + font = QFont("Arial", 40) # Set font and size + self.indicator.setFont(font) + self.layout.addWidget(self.indicator) self.setLayout(self.layout) @pyqtSlot(Flooding) def refresh(self, msg: Flooding): - self.indicator.setBooleanValue(msg.flooding) - -# class Indicator(QWidget): -# def __init__(self, parent=None): -# super().__init__(parent) -# self.setFixedSize(100, 100) -# self.boolean_value = False -# self.update() - -# def setBooleanValue(self, value): -# self.boolean_value = value -# self.update() # Trigger a repaint when the boolean value changes - -# def update(self): -# painter = QPainter(self) -# painter.begin(self) -# painter.setRenderHint(QPainter.RenderHint.Antialiasing) - -# # Set the circle color based on the boolean value -# if self.boolean_value: -# circle_color = QColor(0, 255, 0) # Green -# else: -# circle_color = QColor(255, 0, 0) # Red - -# # Draw the colored circle -# painter.setBrush(circle_color) -# painter.drawEllipse(self.rect()) -# painter.end() + if Flooding.flooding: + self.indicator.setText("🔴") - From 05f4c3b323b8f582284a4f48d1cdbe1d378396de Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 16 Dec 2023 14:27:59 -0500 Subject: [PATCH 05/27] making things pass the linter --- src/surface/gui/gui/widgets/flood_visual.py | 26 ++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 5e05ed39..235d7236 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -1,29 +1,43 @@ -## /flooding (boolean) (True is flooding) +# /flooding (boolean) (True is flooding) from rov_msgs.msg import Flooding from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel from PyQt6.QtGui import QFont from gui.event_nodes.subscriber import GUIEventSubscriber from PyQt6.QtCore import pyqtSignal, pyqtSlot + class FloodVisual(QWidget): + signal: pyqtSignal = pyqtSignal(Flooding) def __init__(self): super().__init__() + # Boilerplate PyQt Setup to link to ROS through a signal/subscriber self.signal.connect(self.refresh) - self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, '/flooding', self.signal, 10) + self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, + '/flooding', + self.signal, + 10) + # Create basic 2 vertical stacked boxes layout self.layout = QVBoxLayout() + # Create the label that tells us what this is self.label = QLabel('Flooding Indicator') + # Set font and size + font = QFont("Arial", 14) + self.label.setFont(font) + self.layout.addWidget(self.label) + # Create the Indicator with a default state of green circle (green = good) self.indicator = QLabel("🟢") - font = QFont("Arial", 40) # Set font and size + # Set font and size + font = QFont("Arial", 36) self.indicator.setFont(font) - self.layout.addWidget(self.indicator) + + self.layout.addWidget(self.indicator) + self.setLayout(self.layout) @pyqtSlot(Flooding) def refresh(self, msg: Flooding): if Flooding.flooding: self.indicator.setText("🔴") - - From 3f141c929d5b6735a5ef894defeed0bb0f058ceb Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 16 Dec 2023 14:33:58 -0500 Subject: [PATCH 06/27] stupid linter, it should work now --- src/surface/gui/gui/pilot_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/surface/gui/gui/pilot_app.py b/src/surface/gui/gui/pilot_app.py index 7863cecf..60082ba1 100644 --- a/src/surface/gui/gui/pilot_app.py +++ b/src/surface/gui/gui/pilot_app.py @@ -25,7 +25,8 @@ def __init__(self): layout.addWidget(self.video_area, alignment=Qt.AlignmentFlag.AlignCenter) self.floodWidget: FloodVisual = FloodVisual() - layout.addWidget(self.floodWidget, alignment= Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop) + layout.addWidget(self.floodWidget, alignment=Qt.AlignmentFlag.AlignRight + | Qt.AlignmentFlag.AlignTop) self.arm: Arm = Arm() layout.addWidget(self.arm, From e59693f06c1c70e8a20a7a7a464eb8dd062071ce Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 16 Dec 2023 14:44:02 -0500 Subject: [PATCH 07/27] Resolving a lingering merge conflict --- src/surface/gui/gui/widgets/arm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/arm.py b/src/surface/gui/gui/widgets/arm.py index 1c962ae8..9df8fb6c 100644 --- a/src/surface/gui/gui/widgets/arm.py +++ b/src/surface/gui/gui/widgets/arm.py @@ -16,7 +16,7 @@ class Arm(QWidget): signal: pyqtSignal = pyqtSignal(CommandBool.Response) - def __init__(self): + def __init__(self) -> None: super().__init__() layout: QHBoxLayout = QHBoxLayout() From 9fab6898b76ddeb8630911add59b625cec129857 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 16 Dec 2023 14:55:18 -0500 Subject: [PATCH 08/27] resolving that lingering merge conflict pt 2 electric bugaloo --- src/surface/gui/gui/widgets/arm.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/surface/gui/gui/widgets/arm.py b/src/surface/gui/gui/widgets/arm.py index 9df8fb6c..340805e1 100644 --- a/src/surface/gui/gui/widgets/arm.py +++ b/src/surface/gui/gui/widgets/arm.py @@ -17,6 +17,7 @@ class Arm(QWidget): signal: pyqtSignal = pyqtSignal(CommandBool.Response) def __init__(self) -> None: + super().__init__() layout: QHBoxLayout = QHBoxLayout() From d45533f86329ddf1f8ef3eace6b8d71534bff19b Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 20 Jan 2024 16:33:23 -0500 Subject: [PATCH 09/27] It's not actively erroring but it doesn't work yet --- src/surface/gui/gui/widgets/flood_visual.py | 39 +++++++++++++-------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 235d7236..7c5d069d 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -1,7 +1,7 @@ -# /flooding (boolean) (True is flooding) +# flooding (boolean) (True is flooding) from rov_msgs.msg import Flooding from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel -from PyQt6.QtGui import QFont +from PyQt6.QtGui import QFont, QColor, QPalette from gui.event_nodes.subscriber import GUIEventSubscriber from PyQt6.QtCore import pyqtSignal, pyqtSlot @@ -15,29 +15,38 @@ def __init__(self): # Boilerplate PyQt Setup to link to ROS through a signal/subscriber self.signal.connect(self.refresh) self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, - '/flooding', + 'flooding', self.signal, 10) # Create basic 2 vertical stacked boxes layout - self.layout = QVBoxLayout() + self.layout: QVBoxLayout = QVBoxLayout() + self.layout.setContentsMargins(0,0,0,0) + self.layout.setSpacing(20) # Create the label that tells us what this is - self.label = QLabel('Flooding Indicator') + self.label: QLabel = QLabel('Flooding Indicator') # Set font and size - font = QFont("Arial", 14) + font: QFont = QFont("Arial", 14) self.label.setFont(font) - self.layout.addWidget(self.label) - # Create the Indicator with a default state of green circle (green = good) - self.indicator = QLabel("🟢") - # Set font and size - font = QFont("Arial", 36) - self.indicator.setFont(font) - + + self.indicator: Color = Color("green") self.layout.addWidget(self.indicator) - self.setLayout(self.layout) @pyqtSlot(Flooding) def refresh(self, msg: Flooding): + palette = self.palette() if Flooding.flooding: - self.indicator.setText("🔴") + palette.setColor(QPalette.ColorRole.Window, QColor("red")) + self.indicator.setPalette(palette) + + +class Color(QWidget): + + def __init__(self, color): + super(Color, self).__init__() + self.setAutoFillBackground(True) + + palette = self.palette() + palette.setColor(QPalette.ColorRole.Window, QColor(color)) + self.setPalette(palette) From c6bf7dfcd7818167483045173bd4e2fb20fb5909 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 08:54:32 -0500 Subject: [PATCH 10/27] Linter please let this pass --- src/surface/gui/gui/widgets/flood_visual.py | 29 +++++++-------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 7c5d069d..094ac298 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -1,7 +1,7 @@ # flooding (boolean) (True is flooding) from rov_msgs.msg import Flooding from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel -from PyQt6.QtGui import QFont, QColor, QPalette +from PyQt6.QtGui import QFont from gui.event_nodes.subscriber import GUIEventSubscriber from PyQt6.QtCore import pyqtSignal, pyqtSlot @@ -20,33 +20,22 @@ def __init__(self): 10) # Create basic 2 vertical stacked boxes layout self.layout: QVBoxLayout = QVBoxLayout() - self.layout.setContentsMargins(0,0,0,0) - self.layout.setSpacing(20) # Create the label that tells us what this is self.label: QLabel = QLabel('Flooding Indicator') # Set font and size font: QFont = QFont("Arial", 14) self.label.setFont(font) self.layout.addWidget(self.label) - - self.indicator: Color = Color("green") + + # Text Indicator + self.indicator: QLabel = QLabel('No Water present') + self.indicator.setFOnt(font) self.layout.addWidget(self.indicator) self.setLayout(self.layout) @pyqtSlot(Flooding) def refresh(self, msg: Flooding): - palette = self.palette() - if Flooding.flooding: - palette.setColor(QPalette.ColorRole.Window, QColor("red")) - self.indicator.setPalette(palette) - - -class Color(QWidget): - - def __init__(self, color): - super(Color, self).__init__() - self.setAutoFillBackground(True) - - palette = self.palette() - palette.setColor(QPalette.ColorRole.Window, QColor(color)) - self.setPalette(palette) + if msg.flooding: + self.indicator.setText('FLOODING') + font: QFont = QFont("Arial", 28) + self.indicator.setFont(font) From 0cca867b50c2a78a15a9a2065e6f185933213591 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 14:07:49 -0500 Subject: [PATCH 11/27] everything actually works supposedly --- src/surface/gui/gui/widgets/flood_visual.py | 4 ++-- src/surface/gui/launch/pilot_launch.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 094ac298..12cb88bd 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -29,13 +29,13 @@ def __init__(self): # Text Indicator self.indicator: QLabel = QLabel('No Water present') - self.indicator.setFOnt(font) + self.indicator.setFont(font) self.layout.addWidget(self.indicator) self.setLayout(self.layout) @pyqtSlot(Flooding) def refresh(self, msg: Flooding): - if msg.flooding: + if Flooding.flooding: self.indicator.setText('FLOODING') font: QFont = QFont("Arial", 28) self.indicator.setFont(font) diff --git a/src/surface/gui/launch/pilot_launch.py b/src/surface/gui/launch/pilot_launch.py index feffc3d0..cc5a4a7e 100644 --- a/src/surface/gui/launch/pilot_launch.py +++ b/src/surface/gui/launch/pilot_launch.py @@ -13,7 +13,8 @@ def generate_launch_description() -> LaunchDescription: remappings=[("/surface/gui/mavros/cmd/arming", "/tether/mavros/cmd/arming"), ("/surface/gui/camera_switch", "/surface/camera_switch"), ("/surface/gui/bottom_cam/image_raw", "/tether/bottom_cam/image_raw"), - ("/surface/gui/front_cam/image_raw", "/tether/front_cam/image_raw")], + ("/surface/gui/front_cam/image_raw", "/tether/front_cam/image_raw"), + ("/surface/gui/flooding", "/tether/flooding")], emulate_tty=True, output='screen' ) From c49bed235a0d7b1350a6426f3f13c321050e6d0b Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 14:47:44 -0500 Subject: [PATCH 12/27] stupid linter --- src/surface/gui/gui/widgets/flood_visual.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 12cb88bd..e1bc4fb1 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -10,14 +10,13 @@ class FloodVisual(QWidget): signal: pyqtSignal = pyqtSignal(Flooding) - def __init__(self): + def __init__(self) -> None: super().__init__() # Boilerplate PyQt Setup to link to ROS through a signal/subscriber self.signal.connect(self.refresh) self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, 'flooding', - self.signal, - 10) + self.signal) # Create basic 2 vertical stacked boxes layout self.layout: QVBoxLayout = QVBoxLayout() # Create the label that tells us what this is @@ -34,7 +33,7 @@ def __init__(self): self.setLayout(self.layout) @pyqtSlot(Flooding) - def refresh(self, msg: Flooding): + def refresh(self, msg: Flooding) -> None: if Flooding.flooding: self.indicator.setText('FLOODING') font: QFont = QFont("Arial", 28) From 61572e4ba1e988dff3a9489259af5400faf5b143 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 14:54:48 -0500 Subject: [PATCH 13/27] owo --- src/surface/gui/gui/widgets/flood_visual.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index e1bc4fb1..5ce7d3d6 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -18,19 +18,19 @@ def __init__(self) -> None: 'flooding', self.signal) # Create basic 2 vertical stacked boxes layout - self.layout: QVBoxLayout = QVBoxLayout() + self.mylayout = QVBoxLayout() # Create the label that tells us what this is self.label: QLabel = QLabel('Flooding Indicator') # Set font and size font: QFont = QFont("Arial", 14) self.label.setFont(font) - self.layout.addWidget(self.label) + self.mylayout.addWidget(self.label) # Text Indicator self.indicator: QLabel = QLabel('No Water present') self.indicator.setFont(font) - self.layout.addWidget(self.indicator) - self.setLayout(self.layout) + self.mylayout.addWidget(self.indicator) + self.setLayout(self.mylayout) @pyqtSlot(Flooding) def refresh(self, msg: Flooding) -> None: From 8a706f7ac0e77d369189a1d0bed873dce0e14ab3 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 15:09:02 -0500 Subject: [PATCH 14/27] Added error spam --- src/surface/gui/gui/widgets/flood_visual.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 5ce7d3d6..25fcadee 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -36,5 +36,6 @@ def __init__(self) -> None: def refresh(self, msg: Flooding) -> None: if Flooding.flooding: self.indicator.setText('FLOODING') - font: QFont = QFont("Arial", 28) + font: QFont = QFont("Arial", 14) self.indicator.setFont(font) + self.subscription.get_logger().error("Robot is actively flooding, please do something!") From b7467738cf17ac613737fc400e62f0f30daf0043 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 15:14:55 -0500 Subject: [PATCH 15/27] losing kindness because the linter dislikes me --- src/surface/gui/gui/widgets/flood_visual.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 25fcadee..062031cf 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -38,4 +38,4 @@ def refresh(self, msg: Flooding) -> None: self.indicator.setText('FLOODING') font: QFont = QFont("Arial", 14) self.indicator.setFont(font) - self.subscription.get_logger().error("Robot is actively flooding, please do something!") + self.subscription.get_logger().error("Robot is actively flooding, do something!") From d217ea4e7b27a9fc2994833d603ad17573100b32 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 15:18:25 -0500 Subject: [PATCH 16/27] Updating the Readme --- src/surface/gui/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/surface/gui/README.md b/src/surface/gui/README.md index b159a5d6..bdb68619 100644 --- a/src/surface/gui/README.md +++ b/src/surface/gui/README.md @@ -64,6 +64,16 @@ Has two buttons for arming and disarming the pixhawk. Sends a request to arm or disarm the pixhawk. Receives a confirmation about the success of the arm or disarm. +### Flood Visualization + +Shows whether the robot is flooding or not on the GUI + +#### Subscribed Topics + +* **`/tether/flooding`** ([rov_msgs/msg/Flooding]) + + A custom message for whether the robot is actively flooding + ### Logger Reads ROS logging information and displays it on the gui. From ba671739b7394a127812c6fe0d212441c8717263 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 15:57:44 -0500 Subject: [PATCH 17/27] Doing updates --- src/surface/gui/gui/pilot_app.py | 4 ++-- src/surface/gui/gui/widgets/flood_visual.py | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/surface/gui/gui/pilot_app.py b/src/surface/gui/gui/pilot_app.py index 0bf04cc0..cbedae3c 100644 --- a/src/surface/gui/gui/pilot_app.py +++ b/src/surface/gui/gui/pilot_app.py @@ -1,7 +1,7 @@ from gui.app import App from gui.widgets.arm import Arm from gui.widgets.video_widget import SwitchableVideoWidget -from gui.widgets.flood_visual import FloodVisual +from gui.widgets.flood_visual import FloodWarning from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QHBoxLayout @@ -24,7 +24,7 @@ def __init__(self) -> None: "camera_switch") layout.addWidget(self.video_area, alignment=Qt.AlignmentFlag.AlignCenter) - self.floodWidget: FloodVisual = FloodVisual() + self.floodWidget: FloodWarning = FloodWarning() layout.addWidget(self.floodWidget, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignTop) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 062031cf..c6f31e48 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -6,7 +6,7 @@ from PyQt6.QtCore import pyqtSignal, pyqtSlot -class FloodVisual(QWidget): +class FloodWarning(QWidget): signal: pyqtSignal = pyqtSignal(Flooding) @@ -18,19 +18,17 @@ def __init__(self) -> None: 'flooding', self.signal) # Create basic 2 vertical stacked boxes layout - self.mylayout = QVBoxLayout() + self.flood_layour = QVBoxLayout() # Create the label that tells us what this is self.label: QLabel = QLabel('Flooding Indicator') - # Set font and size font: QFont = QFont("Arial", 14) self.label.setFont(font) - self.mylayout.addWidget(self.label) + self.flood_layour.addWidget(self.label) - # Text Indicator self.indicator: QLabel = QLabel('No Water present') self.indicator.setFont(font) - self.mylayout.addWidget(self.indicator) - self.setLayout(self.mylayout) + self.flood_layour.addWidget(self.indicator) + self.setLayout(self.flood_layour) @pyqtSlot(Flooding) def refresh(self, msg: Flooding) -> None: @@ -39,3 +37,6 @@ def refresh(self, msg: Flooding) -> None: font: QFont = QFont("Arial", 14) self.indicator.setFont(font) self.subscription.get_logger().error("Robot is actively flooding, do something!") + else: + self.indicator.setText('FLOODING') + self.subscription.get_logger().warning("Robot flooding has reset itself.") \ No newline at end of file From 77267541ad77276907798d2995c0ee5acd381f20 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 15:58:04 -0500 Subject: [PATCH 18/27] oops --- src/surface/gui/gui/widgets/flood_visual.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index c6f31e48..2764a679 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -38,5 +38,5 @@ def refresh(self, msg: Flooding) -> None: self.indicator.setFont(font) self.subscription.get_logger().error("Robot is actively flooding, do something!") else: - self.indicator.setText('FLOODING') + self.indicator.setText('No Water present') self.subscription.get_logger().warning("Robot flooding has reset itself.") \ No newline at end of file From 78033d62bde112b644cebfae26885251f5044026 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:00:04 -0500 Subject: [PATCH 19/27] removing fonts --- src/surface/gui/gui/widgets/flood_visual.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 2764a679..06d269dc 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -34,8 +34,6 @@ def __init__(self) -> None: def refresh(self, msg: Flooding) -> None: if Flooding.flooding: self.indicator.setText('FLOODING') - font: QFont = QFont("Arial", 14) - self.indicator.setFont(font) self.subscription.get_logger().error("Robot is actively flooding, do something!") else: self.indicator.setText('No Water present') From 175888fc1e0fee10cf1e48e0410d68f815eb9668 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:04:02 -0500 Subject: [PATCH 20/27] Adding Latch variable hehe --- src/surface/gui/gui/widgets/flood_visual.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 06d269dc..520e5637 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -17,6 +17,8 @@ def __init__(self) -> None: self.subscription: GUIEventSubscriber = GUIEventSubscriber(Flooding, 'flooding', self.signal) + # Create a latch variable + self.latch: bool = False # Create basic 2 vertical stacked boxes layout self.flood_layour = QVBoxLayout() # Create the label that tells us what this is @@ -35,6 +37,9 @@ def refresh(self, msg: Flooding) -> None: if Flooding.flooding: self.indicator.setText('FLOODING') self.subscription.get_logger().error("Robot is actively flooding, do something!") + self.latch = True else: self.indicator.setText('No Water present') - self.subscription.get_logger().warning("Robot flooding has reset itself.") \ No newline at end of file + if self.latch: + self.subscription.get_logger().warning("Robot flooding has reset itself.") + self.latch = False From a7996ff20fd290948e1290df588e1e02a12a036d Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:05:19 -0500 Subject: [PATCH 21/27] changing the latch name --- src/surface/gui/gui/widgets/flood_visual.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index 520e5637..d6cc0a97 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -18,7 +18,7 @@ def __init__(self) -> None: 'flooding', self.signal) # Create a latch variable - self.latch: bool = False + self.warningMsgLatch: bool = False # Create basic 2 vertical stacked boxes layout self.flood_layour = QVBoxLayout() # Create the label that tells us what this is @@ -37,9 +37,9 @@ def refresh(self, msg: Flooding) -> None: if Flooding.flooding: self.indicator.setText('FLOODING') self.subscription.get_logger().error("Robot is actively flooding, do something!") - self.latch = True + self.warningMsgLatch = True else: self.indicator.setText('No Water present') - if self.latch: + if self.warningMsgLatch: self.subscription.get_logger().warning("Robot flooding has reset itself.") - self.latch = False + self.warningMsgLatch = False From ff1aa0d77c288f00fbe958f0bdfcc26fbd9e4687 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:09:10 -0500 Subject: [PATCH 22/27] making things camelcase --- src/surface/gui/gui/widgets/flood_visual.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_visual.py index d6cc0a97..2bc66eb7 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_visual.py @@ -18,7 +18,7 @@ def __init__(self) -> None: 'flooding', self.signal) # Create a latch variable - self.warningMsgLatch: bool = False + self.warning_msg_latch: bool = False # Create basic 2 vertical stacked boxes layout self.flood_layour = QVBoxLayout() # Create the label that tells us what this is @@ -37,9 +37,9 @@ def refresh(self, msg: Flooding) -> None: if Flooding.flooding: self.indicator.setText('FLOODING') self.subscription.get_logger().error("Robot is actively flooding, do something!") - self.warningMsgLatch = True + self.warning_msg_latch = True else: self.indicator.setText('No Water present') - if self.warningMsgLatch: + if self.warning_msg_latch: self.subscription.get_logger().warning("Robot flooding has reset itself.") - self.warningMsgLatch = False + self.warning_msg_latch = False From 164d5d32d638a88285f4b158fcba6378dec1e383 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:14:58 -0500 Subject: [PATCH 23/27] updating names to match --- src/surface/gui/README.md | 2 +- src/surface/gui/gui/pilot_app.py | 2 +- .../gui/gui/widgets/{flood_visual.py => flood_warning.py} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/surface/gui/gui/widgets/{flood_visual.py => flood_warning.py} (97%) diff --git a/src/surface/gui/README.md b/src/surface/gui/README.md index bdb68619..29414b03 100644 --- a/src/surface/gui/README.md +++ b/src/surface/gui/README.md @@ -64,7 +64,7 @@ Has two buttons for arming and disarming the pixhawk. Sends a request to arm or disarm the pixhawk. Receives a confirmation about the success of the arm or disarm. -### Flood Visualization +### Flood Warnng Shows whether the robot is flooding or not on the GUI diff --git a/src/surface/gui/gui/pilot_app.py b/src/surface/gui/gui/pilot_app.py index cbedae3c..1d6af439 100644 --- a/src/surface/gui/gui/pilot_app.py +++ b/src/surface/gui/gui/pilot_app.py @@ -1,7 +1,7 @@ from gui.app import App from gui.widgets.arm import Arm from gui.widgets.video_widget import SwitchableVideoWidget -from gui.widgets.flood_visual import FloodWarning +from gui.widgets.flood_warning import FloodWarning from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QHBoxLayout diff --git a/src/surface/gui/gui/widgets/flood_visual.py b/src/surface/gui/gui/widgets/flood_warning.py similarity index 97% rename from src/surface/gui/gui/widgets/flood_visual.py rename to src/surface/gui/gui/widgets/flood_warning.py index 2bc66eb7..6031ce09 100644 --- a/src/surface/gui/gui/widgets/flood_visual.py +++ b/src/surface/gui/gui/widgets/flood_warning.py @@ -1,4 +1,3 @@ -# flooding (boolean) (True is flooding) from rov_msgs.msg import Flooding from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel from PyQt6.QtGui import QFont @@ -7,6 +6,7 @@ class FloodWarning(QWidget): + # flooding (boolean) (True is flooding) signal: pyqtSignal = pyqtSignal(Flooding) From e94bd01c6b4f22b74e6a86f4c68cbaef34202912 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:17:18 -0500 Subject: [PATCH 24/27] changing one word --- src/surface/gui/gui/widgets/flood_warning.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/flood_warning.py b/src/surface/gui/gui/widgets/flood_warning.py index 6031ce09..3c236b93 100644 --- a/src/surface/gui/gui/widgets/flood_warning.py +++ b/src/surface/gui/gui/widgets/flood_warning.py @@ -34,7 +34,7 @@ def __init__(self) -> None: @pyqtSlot(Flooding) def refresh(self, msg: Flooding) -> None: - if Flooding.flooding: + if msg.flooding: self.indicator.setText('FLOODING') self.subscription.get_logger().error("Robot is actively flooding, do something!") self.warning_msg_latch = True From 98ff7ffc811c2fbf34ce2e54ba0a582e5db7e9b4 Mon Sep 17 00:00:00 2001 From: Tyler Zupfer Date: Sat, 27 Jan 2024 16:27:40 -0500 Subject: [PATCH 25/27] removing a comment because ben is mean --- src/surface/gui/gui/widgets/flood_warning.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/surface/gui/gui/widgets/flood_warning.py b/src/surface/gui/gui/widgets/flood_warning.py index 3c236b93..54dd369d 100644 --- a/src/surface/gui/gui/widgets/flood_warning.py +++ b/src/surface/gui/gui/widgets/flood_warning.py @@ -6,7 +6,6 @@ class FloodWarning(QWidget): - # flooding (boolean) (True is flooding) signal: pyqtSignal = pyqtSignal(Flooding) From a191feed97ccf42a32424e07e795e8268e9390fb Mon Sep 17 00:00:00 2001 From: benjaminwp18 <90342856+benjaminwp18@users.noreply.github.com> Date: Sat, 27 Jan 2024 16:31:08 -0500 Subject: [PATCH 26/27] Organize imports --- src/surface/gui/gui/widgets/flood_warning.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/surface/gui/gui/widgets/flood_warning.py b/src/surface/gui/gui/widgets/flood_warning.py index 3c236b93..7e5750b6 100644 --- a/src/surface/gui/gui/widgets/flood_warning.py +++ b/src/surface/gui/gui/widgets/flood_warning.py @@ -1,8 +1,9 @@ -from rov_msgs.msg import Flooding -from PyQt6.QtWidgets import QWidget, QVBoxLayout, QLabel -from PyQt6.QtGui import QFont from gui.event_nodes.subscriber import GUIEventSubscriber from PyQt6.QtCore import pyqtSignal, pyqtSlot +from PyQt6.QtGui import QFont +from PyQt6.QtWidgets import QLabel, QVBoxLayout, QWidget + +from rov_msgs.msg import Flooding class FloodWarning(QWidget): From 020426de3b884a8c36e227f970923cd02a247438 Mon Sep 17 00:00:00 2001 From: benjaminwp18 <90342856+benjaminwp18@users.noreply.github.com> Date: Sat, 27 Jan 2024 16:33:13 -0500 Subject: [PATCH 27/27] Organize more imports --- src/surface/gui/gui/pilot_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/surface/gui/gui/pilot_app.py b/src/surface/gui/gui/pilot_app.py index 1d6af439..71cffb8f 100644 --- a/src/surface/gui/gui/pilot_app.py +++ b/src/surface/gui/gui/pilot_app.py @@ -1,7 +1,7 @@ from gui.app import App from gui.widgets.arm import Arm -from gui.widgets.video_widget import SwitchableVideoWidget from gui.widgets.flood_warning import FloodWarning +from gui.widgets.video_widget import SwitchableVideoWidget from PyQt6.QtCore import Qt from PyQt6.QtWidgets import QHBoxLayout