Добавить поддержку GAS 167 и УМП, улучшить обмен по CAN и последовательному порту

This commit is contained in:
2026-10-11 21:23:21 +03:00
parent 3c0f6fd9e6
commit 20454ff7fa
17 changed files with 1797 additions and 37 deletions
+16 -3
View File
@@ -206,10 +206,16 @@ class RawProtocolWidget(QWidget):
def init_ui(self):
layout = QVBoxLayout()
layout.setProperty("fixedPanelLayout", True)
layout.setContentsMargins(4, 4, 4, 4)
layout.setSpacing(4)
# Группа для ПРЯМОГО ДОСТУПА К ПАМЯТИ (PEEK/POKE)
mem_group = QGroupBox("Прямой доступ к памяти (PEEK/POKE)")
mem_group.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
mem_layout = QGridLayout()
mem_layout.setContentsMargins(6, 6, 6, 6)
mem_layout.setSpacing(4)
mem_layout.addWidget(QLabel("Адрес памяти (hex):"), 0, 0)
self.mem_addr_edit = QLineEdit("2000")
@@ -239,6 +245,9 @@ class RawProtocolWidget(QWidget):
# Группа для RAW отправки
raw_group = QGroupBox("RAW отправка/чтение")
raw_layout = QVBoxLayout()
raw_layout.setProperty("fixedPanelLayout", True)
raw_layout.setContentsMargins(6, 6, 6, 6)
raw_layout.setSpacing(4)
self.raw_send_edit = QLineEdit()
self.raw_send_edit.setPlaceholderText("Введите hex данные для отправки")
@@ -246,6 +255,7 @@ class RawProtocolWidget(QWidget):
raw_layout.addWidget(self.raw_send_edit)
hbox = QHBoxLayout()
hbox.setSpacing(4)
self.raw_send_btn = QPushButton("Отправить RAW")
self.raw_send_btn.clicked.connect(self.send_raw_data)
hbox.addWidget(self.raw_send_btn)
@@ -260,16 +270,19 @@ class RawProtocolWidget(QWidget):
self.raw_output = QTextEdit()
self.raw_output.setReadOnly(True)
self.raw_output.setMaximumHeight(100)
raw_layout.addWidget(self.raw_output)
self.raw_output.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
raw_layout.addWidget(self.raw_output, 1)
self.raw_clear_btn = QPushButton("Очистить логи")
self.raw_clear_btn.clicked.connect(self.clear_logs)
raw_layout.addWidget(self.raw_clear_btn, 0, Qt.AlignLeft)
for button in (self.mem_write_btn, self.mem_read_btn, self.raw_send_btn,
self.raw_read_btn, self.raw_clear_btn):
button.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Fixed)
raw_group.setLayout(raw_layout)
layout.addWidget(raw_group)
layout.addWidget(raw_group, 1)
self.setLayout(layout)
def memory_write(self):
+37 -23
View File
@@ -403,24 +403,38 @@ class SerialTab(QWidget):
button.setFixedHeight(30)
button.setStyleSheet("QPushButton { padding: 3px 10px; }")
# Прокручиваемая область для кнопок макросов
self.macros_scroll_area = QScrollArea()
self.macros_scroll_area.setWidgetResizable(True)
# Устанавливаем фиксированную высоту, чтобы вместить 3-4 строки макросов
self.macros_scroll_area.setMinimumHeight(120) # Высота для 3-4 строк
self.macros_scroll_content = QWidget()
self.macros_scroll_layout = QGridLayout()
self.macros_scroll_content.setLayout(self.macros_scroll_layout)
self.macros_scroll_area.setWidget(self.macros_scroll_content)
self.macros_scroll_layout.setAlignment(Qt.AlignTop | Qt.AlignLeft)
self.macros_scroll_layout.setContentsMargins(6, 6, 6, 6)
self.macros_scroll_layout.setHorizontalSpacing(8)
self.macros_scroll_layout.setVerticalSpacing(6)
macros_layout.addWidget(self.macros_scroll_area)
self.macros_splitter = QSplitter(Qt.Orientation.Horizontal)
self.macros_splitter.setObjectName("macrosSplitter")
self.macros_splitter.setChildrenCollapsible(False)
self.macros_splitter.setHandleWidth(8)
self.macros_splitter.setToolTip("Перетащите разделитель, чтобы изменить ширину панелей")
self.macros_scroll_areas = []
self.macros_scroll_layouts = []
for side in ("Левая", "Правая"):
area = QScrollArea()
area.setAccessibleName(f"{side} панель макросов")
area.setWidgetResizable(True)
area.setMinimumSize(120, 120)
content = QWidget()
grid = QGridLayout(content)
grid.setAlignment(Qt.AlignTop | Qt.AlignLeft)
grid.setContentsMargins(6, 6, 6, 6)
grid.setVerticalSpacing(6)
area.setWidget(content)
self.macros_splitter.addWidget(area)
self.macros_scroll_areas.append(area)
self.macros_scroll_layouts.append(grid)
self.macros_splitter.setStretchFactor(0, 1)
self.macros_splitter.setStretchFactor(1, 1)
self.macros_splitter.setSizes([1, 1])
# Keep the existing attributes available to terminal integrations.
self.macros_scroll_area = self.macros_scroll_areas[0]
self.macros_scroll_content = self.macros_scroll_area.widget()
self.macros_scroll_layout = self.macros_scroll_layouts[0]
macros_layout.addWidget(self.macros_splitter, 1)
macros_group.setLayout(macros_layout)
layout.addWidget(macros_group)
layout.addWidget(macros_group, 1)
# --- ВНЕ ГРУППЫ: Результаты чтения ---
results_layout = QGridLayout()
@@ -447,7 +461,6 @@ class SerialTab(QWidget):
results_frame.setLayout(results_layout)
layout.addWidget(results_frame)
layout.addStretch()
self.setLayout(layout)
# После создания интерфейса создаем кнопки для загруженных макросов
@@ -590,7 +603,7 @@ class SerialTab(QWidget):
container_layout.addWidget(delete_btn)
container.setLayout(container_layout)
self.macros_scroll_layout.addWidget(container, row, col, 1, 1) # span изменен на 1
self.macros_scroll_layouts[col].addWidget(container, row, 0)
self.macro_buttons.append(container)
@@ -680,7 +693,7 @@ class SerialTab(QWidget):
def _set_macro_controls(self, running):
self.stop_macro_btn.setEnabled(running)
for widget in (self.bus_write_btn, self.bus_read_btn, self.create_macro_btn,
self.macros_scroll_area, self.raw_widget):
self.macros_splitter, self.raw_widget):
widget.setEnabled(not running)
def _next_macro_command(self, generation):
@@ -748,10 +761,11 @@ class SerialTab(QWidget):
def rebuild_macros_layout(self):
"""Перестроить layout макросов"""
# Очищаем layout
for i in reversed(range(self.macros_scroll_layout.count())):
item = self.macros_scroll_layout.itemAt(i)
if item and item.widget():
item.widget().setParent(None)
for grid in self.macros_scroll_layouts:
while grid.count():
item = grid.takeAt(0)
if item.widget():
item.widget().deleteLater()
# Очищаем список кнопок
self.macro_buttons.clear()