Skip to content

Commit 2765fde

Browse files
authored
Merge pull request #187 from CWRUbotix/fancy-manips
Fancy manips
2 parents 3113613 + d485a90 commit 2765fde

File tree

3 files changed

+64
-8
lines changed

3 files changed

+64
-8
lines changed

src/surface/flight_control/flight_control/mavlink_control_node.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@
9090

9191
CONTROLLER_PROFILE_PARAM = 'controller_profile'
9292

93+
MANIP_TOGGLE_MODE = True
94+
9395

9496
@dataclass
9597
class ManipButton:
@@ -312,11 +314,15 @@ def manip_callback(self, joy_state: JoystickState) -> None:
312314
buttons = joy_state.buttons
313315
for button_id, manip_button in self.manip_buttons.items():
314316
just_pressed = buttons[button_id] == PRESSED
315-
if manip_button.last_button_state is False and just_pressed:
317+
318+
if MANIP_TOGGLE_MODE and manip_button.last_button_state is False and just_pressed:
316319
new_manip_state = not manip_button.is_active
317320
manip_button.is_active = new_manip_state
318-
manip_msg = Manip(manip_id=manip_button.claw, activated=manip_button.is_active)
319-
self.manip_publisher.publish(manip_msg)
321+
elif not MANIP_TOGGLE_MODE and manip_button.last_button_state != just_pressed:
322+
manip_button.is_active = just_pressed
323+
324+
manip_msg = Manip(manip_id=manip_button.claw, activated=manip_button.is_active)
325+
self.manip_publisher.publish(manip_msg)
320326

321327
manip_button.last_button_state = just_pressed
322328

src/surface/gui/gui/pilot_app.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
from PyQt6.QtCore import Qt
44
from PyQt6.QtGui import QScreen
5-
from PyQt6.QtWidgets import QHBoxLayout, QVBoxLayout
5+
from PyQt6.QtWidgets import QHBoxLayout, QVBoxLayout, QWidget
66

77
from gui.app import App
88
from gui.widgets.arm import Arm
99
from gui.widgets.flood_warning import FloodWarning
1010
from gui.widgets.livestream_header import LivestreamHeader
11+
from gui.widgets.manip_status import ManipStatus
1112
from gui.widgets.timer import TimerDisplay
1213
from gui.widgets.video_widget import (
1314
CameraDescription,
@@ -116,17 +117,23 @@ def make_bottom_bar() -> QHBoxLayout:
116117
"""
117118
bottom_screen_layout = QHBoxLayout()
118119

119-
timer = TimerDisplay()
120-
bottom_screen_layout.addWidget(timer)
120+
left_layout = QVBoxLayout()
121+
left_layout.addWidget(ManipStatus('left'))
122+
left_layout.addWidget(TimerDisplay())
123+
bottom_screen_layout.addLayout(left_layout)
121124

122125
flood_widget = FloodWarning()
123126
bottom_screen_layout.addWidget(
124127
flood_widget, alignment=Qt.AlignmentFlag.AlignHCenter | Qt.AlignmentFlag.AlignBottom
125128
)
126129

127-
arm = Arm()
130+
right_layout = QVBoxLayout()
131+
right_layout.addWidget(ManipStatus('right'))
132+
right_layout.addWidget(Arm())
133+
right_container = QWidget()
134+
right_container.setLayout(right_layout)
128135
bottom_screen_layout.addWidget(
129-
arm, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignBottom
136+
right_container, alignment=Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignBottom
130137
)
131138

132139
return bottom_screen_layout
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from PyQt6.QtCore import pyqtSignal, pyqtSlot
2+
from PyQt6.QtGui import QFont
3+
from PyQt6.QtWidgets import QHBoxLayout, QLabel, QWidget
4+
5+
from gui.gui_node import GUINode
6+
from gui.styles.custom_styles import WidgetState
7+
from gui.widgets.circle import CircleIndicator
8+
from rov_msgs.msg import Manip
9+
10+
11+
class ManipStatus(QWidget):
12+
signal = pyqtSignal(Manip)
13+
14+
def __init__(self, manip_name: str) -> None:
15+
super().__init__()
16+
17+
self.manip_id = manip_name
18+
19+
self.signal.connect(self.manip_callback)
20+
GUINode().create_signal_subscription(Manip, 'manipulator_control', self.signal)
21+
22+
root_layout = QHBoxLayout()
23+
24+
self.indicator_circle = CircleIndicator(radius=10)
25+
root_layout.addWidget(self.indicator_circle)
26+
27+
self.label = QLabel('')
28+
font = QFont('Arial', 14)
29+
self.label.setFont(font)
30+
root_layout.addWidget(self.label)
31+
32+
self.setLayout(root_layout)
33+
34+
self.update_gui(manip_on=False)
35+
36+
def update_gui(self, *, manip_on: bool) -> None:
37+
self.label.setText(f'{self.manip_id.capitalize()} manip {"ON" if manip_on else "OFF"}')
38+
self.indicator_circle.set_state(WidgetState.ON if manip_on else WidgetState.OFF)
39+
40+
@pyqtSlot(Manip)
41+
def manip_callback(self, msg: Manip) -> None:
42+
if msg.manip_id == self.manip_id:
43+
self.update_gui(manip_on=msg.activated)

0 commit comments

Comments
 (0)