diff --git a/src/unitdev01/unitdev01/gui.py b/src/unitdev01/unitdev01/gui.py index 5bc7213..e6e4d64 100644 --- a/src/unitdev01/unitdev01/gui.py +++ b/src/unitdev01/unitdev01/gui.py @@ -53,7 +53,7 @@ class DroneMonitor(Node): max_retries = 5 base_delay = 1.0 local = "ws://0.0.0.0:8765" # 本地 WebSocket 地址 - remote = "ws://140.120.31.123:8765" + remote = "ws://192.168.50.48:8756" while retry_count < max_retries: try: async with websockets.connect(local) as websocket: @@ -63,7 +63,6 @@ class DroneMonitor(Node): async for message in websocket: try: data = json.loads(message) - print(f"📡 Received: {data}") self.process_websocket_message(data) except json.JSONDecodeError as e: print(f"WebSocket JSON decode error: {e}") @@ -402,6 +401,13 @@ class ControlStationUI(QMainWindow): "loss_rate": 11, "ping": 12 } + self.socket_colors = { + '0': '#00BFFF', # DeepSkyBlue + '1': '#FFD700', # Gold + '2': '#FF69B4', # HotPink + '9': '#7CFC00', # LawnGreen + 'default': '#AAAAAA' + } self.drone_positions = {} self.drone_headings = {} self.map_loaded = False @@ -440,37 +446,47 @@ class ControlStationUI(QMainWindow): bottom_control = QWidget() bottom_layout = QVBoxLayout(bottom_control) + # 上方按鈕區域 + upper_buttons = QHBoxLayout() select_all_btn = QPushButton("全選") select_all_btn.clicked.connect(self.handle_select_all) - select_all_btn.setStyleSheet(""" - QPushButton { - background-color: #444; - color: #DDD; - border: none; - padding: 5px 10px; - border-radius: 4px; - min-width: 80px; - } - QPushButton:hover { background-color: #555; } - """) - arm_all_btn = QPushButton("批次解鎖") arm_all_btn.clicked.connect(self.handle_arm_selected) - arm_all_btn.setStyleSheet(""" - QPushButton { - background-color: #444; - color: #DDD; - border: none; - padding: 5px 10px; - border-radius: 4px; - min-width: 80px; - } - QPushButton:hover { background-color: #555; } - """) - takeoff_all_btn = QPushButton("批次起飛") takeoff_all_btn.clicked.connect(self.handle_takeoff_selected) - takeoff_all_btn.setStyleSheet(""" + for btn in [select_all_btn, arm_all_btn, takeoff_all_btn]: + btn.setStyleSheet(""" + QPushButton { + background-color: #444; + color: #DDD; + border: none; + padding: 5px 10px; + border-radius: 4px; + min-width: 80px; + } + QPushButton:hover { background-color: #555; } + """) + upper_buttons.addWidget(btn) + upper_buttons.addStretch() + + # --- 模式切換區域 --- + mode_layout = QHBoxLayout() + mode_layout.setContentsMargins(0, 0, 0, 0) + mode_layout.setSpacing(8) + mode_label = QLabel("模式:") + mode_label.setStyleSheet("color: #DDD; min-width: 40px;") + + from PyQt6.QtWidgets import QComboBox + self.mode_combo = QComboBox() + self.mode_combo.addItems(["AUTO", "GUIDED", "LOITER", "LAND"]) + self.mode_combo.setCurrentIndex(1) # 預設 GUIDED + self.mode_combo.setStyleSheet(""" + QComboBox { background-color: #333; color: #DDD; border-radius: 3px; padding: 2px 10px;} + """) + + batch_mode_btn = QPushButton("批次切換模式") + batch_mode_btn.clicked.connect(self.handle_batch_mode_change) + batch_mode_btn.setStyleSheet(""" QPushButton { background-color: #444; color: #DDD; @@ -481,7 +497,11 @@ class ControlStationUI(QMainWindow): } QPushButton:hover { background-color: #555; } """) - + mode_layout.addWidget(mode_label) + mode_layout.addWidget(self.mode_combo) + mode_layout.addWidget(batch_mode_btn) + mode_layout.addStretch() + # Add coordinate inputs coord_widget = QWidget() coord_layout = QHBoxLayout(coord_widget) @@ -525,29 +545,6 @@ class ControlStationUI(QMainWindow): QPushButton:hover { background-color: #555; } """) - # 上方按鈕區域 - upper_buttons = QHBoxLayout() - select_all_btn = QPushButton("全選") - select_all_btn.clicked.connect(self.handle_select_all) - arm_all_btn = QPushButton("批次解鎖") - arm_all_btn.clicked.connect(self.handle_arm_selected) - takeoff_all_btn = QPushButton("批次起飛") - takeoff_all_btn.clicked.connect(self.handle_takeoff_selected) - for btn in [select_all_btn, arm_all_btn, takeoff_all_btn]: - btn.setStyleSheet(""" - QPushButton { - background-color: #444; - color: #DDD; - border: none; - padding: 5px 10px; - border-radius: 4px; - min-width: 80px; - } - QPushButton:hover { background-color: #555; } - """) - upper_buttons.addWidget(btn) - upper_buttons.addStretch() - # 下方座標輸入區域 lower_control = QHBoxLayout() lower_control.addWidget(coord_widget) @@ -555,8 +552,9 @@ class ControlStationUI(QMainWindow): lower_control.addStretch() - # 將兩個區域加入底部控制區 + # 加入底部控制區 bottom_layout.addLayout(upper_buttons) + bottom_layout.addLayout(mode_layout) bottom_layout.addLayout(lower_control) # — 分頁 2:Overview Table @@ -595,9 +593,10 @@ class ControlStationUI(QMainWindow):