You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.3 KiB
122 lines
4.3 KiB
# panel/connection_panel.py
|
|
from PyQt5.QtWidgets import (QGroupBox, QFormLayout, QHBoxLayout,
|
|
QComboBox, QPushButton, QLabel, QVBoxLayout)
|
|
from PyQt5.QtCore import Qt
|
|
from core.connection_manager import SerialManager
|
|
from utils.logger import logger
|
|
|
|
class ConnectionPanel(QGroupBox):
|
|
def __init__(self, serial_manager):
|
|
super().__init__("设备连接管理")
|
|
self.setTitle("🔗 设备连接")
|
|
|
|
# 实例化核心管理器
|
|
# self.serial_manager = SerialManager()
|
|
self.serial_manager = serial_manager
|
|
|
|
self.init_ui()
|
|
|
|
def init_ui(self):
|
|
# 主布局
|
|
main_layout = QVBoxLayout()
|
|
|
|
# 表单布局(用于参数行)
|
|
form_layout = QFormLayout()
|
|
|
|
# --- 1. 端口选择行 ---
|
|
self.port_combo = QComboBox()
|
|
self.refresh_btn = QPushButton("🔄 刷新")
|
|
self.refresh_btn.setFixedWidth(80)
|
|
|
|
port_hbox = QHBoxLayout()
|
|
port_hbox.addWidget(self.port_combo)
|
|
port_hbox.addWidget(self.refresh_btn)
|
|
|
|
form_layout.addRow("串口端口:", port_hbox)
|
|
|
|
# --- 2. 波特率选择 ---
|
|
self.baud_combo = QComboBox()
|
|
self.baud_combo.addItems(["9600", "19200", "38400", "115200"])
|
|
self.baud_combo.setCurrentText("9600")
|
|
form_layout.addRow("波特率:", self.baud_combo)
|
|
|
|
# --- 3. 连接状态行 ---
|
|
self.status_label = QLabel("●")
|
|
self.status_label.setStyleSheet("color: red; font-size: 20px;")
|
|
self.status_text = QLabel("离线")
|
|
|
|
status_hbox = QHBoxLayout()
|
|
status_hbox.addWidget(self.status_label)
|
|
status_hbox.addWidget(self.status_text)
|
|
form_layout.addRow("连接状态:", status_hbox)
|
|
|
|
# 将表单加入主布局
|
|
main_layout.addLayout(form_layout)
|
|
|
|
# --- 4. 连接按钮 ---
|
|
self.connect_btn = QPushButton("✅ 连接设备")
|
|
self.connect_btn.setStyleSheet("font-weight: bold; padding: 5px;")
|
|
main_layout.addWidget(self.connect_btn, alignment=Qt.AlignCenter)
|
|
|
|
self.setLayout(main_layout)
|
|
|
|
# --- 信号连接 ---
|
|
self.refresh_btn.clicked.connect(self.refresh_ports)
|
|
self.connect_btn.clicked.connect(self.toggle_connection)
|
|
|
|
# 初始化时自动扫描一次
|
|
self.refresh_ports()
|
|
|
|
def refresh_ports(self):
|
|
"""
|
|
刷新下拉框中的端口列表
|
|
"""
|
|
self.port_combo.clear()
|
|
ports = self.serial_manager.get_available_ports()
|
|
|
|
if ports:
|
|
self.port_combo.addItems(ports)
|
|
logger.debug(f"🔍 扫描到串口: {ports}")
|
|
else:
|
|
self.port_combo.addItem("未检测到设备")
|
|
logger.warning("⚠️ 未扫描到任何串口设备")
|
|
|
|
def toggle_connection(self):
|
|
"""
|
|
切换连接/断开状态
|
|
"""
|
|
# ... 连接成功后 ...
|
|
print(f"连接面板中的 serial_manager 对象: {id(self.serial_manager)}")
|
|
print(f"连接面板中的 is_connected 状态: {self.serial_manager.is_connected}")
|
|
|
|
if self.serial_manager.is_connected:
|
|
self.serial_manager.disconnect()
|
|
self.update_ui_state(False)
|
|
else:
|
|
port = self.port_combo.currentText()
|
|
baudrate = int(self.baud_combo.currentText())
|
|
|
|
if port == "未检测到设备":
|
|
logger.error("❌ 无法连接:请插入设备并点击刷新")
|
|
return
|
|
|
|
# 尝试连接
|
|
success = self.serial_manager.connect(port=port, baudrate=baudrate)
|
|
if success:
|
|
self.update_ui_state(True)
|
|
# 失败信息由 SerialManager 内部记录
|
|
|
|
def update_ui_state(self, connected):
|
|
"""
|
|
根据连接状态更新按钮和文字
|
|
"""
|
|
if connected:
|
|
self.status_label.setStyleSheet("color: green;")
|
|
self.status_text.setText("在线")
|
|
self.connect_btn.setText("🛑 断开连接")
|
|
self.connect_btn.setStyleSheet("font-weight: bold; background-color: #d3f3d3; padding: 5px;")
|
|
else:
|
|
self.status_label.setStyleSheet("color: red;")
|
|
self.status_text.setText("离线")
|
|
self.connect_btn.setText("✅ 连接设备")
|
|
self.connect_btn.setStyleSheet("font-weight: bold; padding: 5px;")
|