3 Commits

Author SHA1 Message Date
Razvalyaev
369cfa808c чистка для релиза
переструктурировано чуть

и всякие мелкие фиксы
2025-07-15 15:37:29 +03:00
Razvalyaev
c32dc161f8 переструктурирвоаны исходники проекта 2025-07-15 13:31:18 +03:00
Razvalyaev
abfc507e4e регулярнка не работает в clean_remp 2025-07-15 13:13:08 +03:00
16 changed files with 149 additions and 25504 deletions

Binary file not shown.

View File

@@ -1,10 +1,12 @@
# DebugVarEdit — Утилита для генерации отладочных переменных C-проекта # DebugVarEdit — Утилита для генерации переменных для отладки
**DebugVarEdit** — графическое приложение для Windows, предназначенное для настройки и генерации отладочных переменных (`debug_vars.c`) на основе исходного C-проекта. Работает с `makefile` проекта, сохраняет изменения в XML и позволяет удобно редактировать переменные и их типы через интерфейс. **DebugVarEdit** — графическое приложение для Windows, предназначенное для настройки и генерации отладочных переменных (`debug_vars.c`) на основе исходного C-проекта. Работает с `makefile` проекта, сохраняет изменения в XML и позволяет удобно редактировать переменные и их типы через интерфейс.
Программа — один исполняемый файл `DebugVarEdit.exe`, не требующий установки и дополнительных зависимостей. Программа — один исполняемый файл `DebugVarEdit.exe`, не требующий установки и дополнительных зависимостей.
> Требуется Windows 7 или новее. > Требуется Windows 7 или новее.
> [Для разработчиков](#для-разработчиков)
--- ---
## Как использовать ## Как использовать
@@ -85,20 +87,20 @@
```bash ```bash
Src Src
├── build/
│ └── build_and_clean.py # Билдинг проекта в .exe (через nuitka или pyinstaller)
├── DebugVarEdit_GUI.py # Главное окно ├── DebugVarEdit_GUI.py # Главное окно
├── VariableTable.py # Таблица выбранных переменных ├── var_table.py # Таблица выбранных переменных
├── VariableSelector.py # Окно выбора переменных ├── var_selector_window.py # Окно выбора переменных
├── selectTable.py # Таблица переменных в окне выбора переменных ├── var_selector_table.py # Таблица переменных в окне выбора переменных
├── scanVarGUI.py # Отображение процесса сканирования переменных ├── scan_progress_gui.py # Отображение процесса сканирования переменных
├── scanVar.py # Сканирование переменных среди .c/.h файлов ├── scan_vars.py # Сканирование переменных среди .c/.h файлов
├── generateVars.py # Генерация debug_vars.c ├── generate_debug_vars.py # Генерация debug_vars.c
├── myXML.py # Утилиты для XML ├── myXML.py # Утилиты для XML
├── parseMakefile.py # Парсинг makefile на .c/.h файлы ├── makefile_parser.py # Парсинг makefile на .c/.h файлы
├── setupVars.py # Подготовка переменных для окна выбора переменных ├── var_setup.py # Подготовка переменных для окна выбора переменных
├── libclang.dll # Бибилиотека clang ├── libclang.dll # Бибилиотека clang
├── icon.ico # Иконка ├── icon.ico # Иконка
build
├── build_and_clean.py # Билдинг проекта в .exe (через nuitka или pyinstaller)
``` ```
### Зависимости ### Зависимости

View File

@@ -1,19 +1,19 @@
# build command # build command
# pyinstaller --onefile --name DebugVarEdit --add-binary "build/libclang.dll;build" --distpath ./ --workpath ./build_temp --specpath ./build_temp setupVars_GUI.py # pyinstaller --onefile --name DebugVarEdit --add-binary "build/libclang.dll;build" --distpath ./ --workpath ./build_temp --specpath ./build_temp var_setup_GUI.py
import sys import sys
import os import os
import subprocess import subprocess
import lxml.etree as ET import lxml.etree as ET
from generateVars import type_map from generate_debug_vars import type_map
from enum import IntEnum from enum import IntEnum
import threading import threading
from generateVars import run_generate from generate_debug_vars import run_generate
import setupVars import var_setup
from VariableSelector import VariableSelectorDialog from var_selector_window import VariableSelectorDialog
from VariableTable import VariableTableWidget, rows from var_table import VariableTableWidget, rows
from scanVarGUI import ProcessOutputWindow from scan_progress_gui import ProcessOutputWindow
import scanVars import scan_vars
import myXML import myXML
import time import time
@@ -63,7 +63,7 @@ class VarEditor(QWidget):
def initUI(self): def initUI(self):
self.setWindowTitle(var_edit_title) self.setWindowTitle(var_edit_title)
base_path = scanVars.get_base_path() base_path = scan_vars.get_base_path()
icon_path = os.path.join(base_path, "icon.ico") icon_path = os.path.join(base_path, "icon.ico")
if os.path.exists(icon_path): if os.path.exists(icon_path):
self.setWindowIcon(QIcon(icon_path)) self.setWindowIcon(QIcon(icon_path))
@@ -208,7 +208,7 @@ class VarEditor(QWidget):
# Создаём окно с кнопкой "Готово" # Создаём окно с кнопкой "Готово"
self.proc_win = ProcessOutputWindow(self.proj_path, self.makefile_path, self.xml_path, self.proc_win = ProcessOutputWindow(self.proj_path, self.makefile_path, self.xml_path,
on_done_callback=self.__after_scanvars_finished) self.__after_scan_vars_finished, self)
self.proc_win.start_scan() self.proc_win.start_scan()
@@ -302,11 +302,11 @@ class VarEditor(QWidget):
structs_path_full = myXML.make_absolute_path(structs_path, self.proj_path) structs_path_full = myXML.make_absolute_path(structs_path, self.proj_path)
if structs_path_full and os.path.isfile(structs_path_full): if structs_path_full and os.path.isfile(structs_path_full):
self.structs_path = structs_path_full self.structs_path = structs_path_full
self.structs, self.typedef_map = setupVars.parse_structs(structs_path_full) self.structs, self.typedef_map = var_setup.parse_structs(structs_path_full)
else: else:
self.structs_path = None self.structs_path = None
self.vars_list = setupVars.parse_vars(self.xml_path, self.typedef_map) self.vars_list = var_setup.parse_vars(self.xml_path, self.typedef_map)
self.table.populate(self.vars_list, self.structs, self.write_to_xml) self.table.populate(self.vars_list, self.structs, self.write_to_xml)
except Exception as e: except Exception as e:
QMessageBox.warning(self, "Ошибка", f"Ошибка при чтении XML:\n{e}") QMessageBox.warning(self, "Ошибка", f"Ошибка при чтении XML:\n{e}")
@@ -404,7 +404,7 @@ class VarEditor(QWidget):
self.update() self.update()
def __after_scanvars_finished(self): def __after_scan_vars_finished(self):
if not os.path.isfile(self.xml_path): if not os.path.isfile(self.xml_path):
self.makefile_path = None self.makefile_path = None
self.structs_path = None self.structs_path = None
@@ -443,6 +443,7 @@ class VarEditor(QWidget):
QMessageBox.warning(self, "Нет переменных", f"Сначала загрузите переменные ({scan_title}).") QMessageBox.warning(self, "Нет переменных", f"Сначала загрузите переменные ({scan_title}).")
return return
self.update()
dlg = VariableSelectorDialog(self.table, self.vars_list, self.structs, self.typedef_map, self.xml_path, self) dlg = VariableSelectorDialog(self.table, self.vars_list, self.structs, self.typedef_map, self.xml_path, self)
if dlg.exec_(): if dlg.exec_():
self.write_to_xml() self.write_to_xml()

55
Src/README_DEVELOP.md Normal file
View File

@@ -0,0 +1,55 @@
# Для разработчиков
### Структура проекта:
```bash
Src
├── build/
│ └── build_and_clean.py # Билдинг проекта в .exe (через nuitka или pyinstaller)
├── DebugVarEdit_GUI.py # Главное окно
├── var_table.py # Таблица выбранных переменных
├── var_selector_window.py # Окно выбора переменных
├── var_selector_table.py # Таблица переменных в окне выбора переменных
├── scan_progress_gui.py # Отображение процесса сканирования переменных
├── scan_vars.py # Сканирование переменных среди .c/.h файлов
├── generate_debug_vars.py # Генерация debug_vars.c
├── myXML.py # Утилиты для XML
├── makefile_parser.py # Парсинг makefile на .c/.h файлы
├── var_setup.py # Подготовка переменных для окна выбора переменных
├── libclang.dll # Бибилиотека clang
├── icon.ico # Иконка
```
### Зависимости
Для запуска приложения:
- **Python 3.7+**
- **clang** — используется для парсинга C-кода (требуется `libclang.dll`)
- **PySide2** — GUI-фреймворк
- **lxml** — работа с XML
> Python 3.7 и PySide2 рекомендуется для совместимости с Windows 7
Для сборки `.exe`:
- **Nuitka** — создает полностью автономный `.exe` без внешних зависимостей
- **PyInstaller** — создает `.exe` с зависимостью от `pythonXX.dll` (Python должен быть установлен)
### Сборка:
Если вы хотите собрать `DebugVarEdit.exe` самостоятельно из исходников, используйте скрипт **build/build_and_clean.py**. Он автоматически собирает проект с помощью Nuitka или PyInstaller:
- Собирает проект в `DebugVarEdit.exe` в корневой папке.
- Включает:
- все необходимые `.dll` (например, `libclang.dll`),
- иконку (`icon.ico`),
- плагины PySide2.
- Очищает временные папки после сборки:
- `build_temp`
- `__pycache__`
- `DebugVarEdit_GUI.*`
> Все пути, имена файлов, временные папки и выбор между Nuitka и PyInstaller можно настроить в начале файла `build_and_clean.py`.
### Установка зависимостей
```bash
pip install PySide2 lxml nuitka pyinstaller
```

View File

@@ -26,7 +26,9 @@ ICON_ICO_PATH = SRC_PATH / "icon.ico"
TEMP_FOLDERS = [ TEMP_FOLDERS = [
"build_temp", "build_temp",
"__pycache__", "__pycache__",
"DebugVarEdit_GUI\..*$" "DebugVarEdit_GUI.build",
"DebugVarEdit_GUI.onefile-build",
"DebugVarEdit_GUI.dist"
] ]
# === Пути к DLL и прочим зависимостям === # === Пути к DLL и прочим зависимостям ===
LIBS = { LIBS = {

View File

@@ -1,7 +1,7 @@
# build command # build command
# pyinstaller --onefile --distpath . --workpath ./build --specpath ./build generateVars.py # pyinstaller --onefile --distpath . --workpath ./build --specpath ./build generate_debug_vars.py
# start script # start script
# generateVars.exe F:\Work\Projects\TMS\TMS_new_bus\ Src/DebugTools/vars.xml Src/DebugTools # generate_debug_vars.exe F:\Work\Projects\TMS\TMS_new_bus\ Src/DebugTools/vars.xml Src/DebugTools
import sys import sys
import os import os

View File

@@ -6,8 +6,8 @@ import sys
import contextlib import contextlib
import io import io
import json import json
from scanVars import run_scan from scan_vars import run_scan
from VariableTable import VariableTableWidget, rows from var_table import VariableTableWidget, rows
from PySide2.QtWidgets import ( from PySide2.QtWidgets import (
QApplication, QWidget, QTableWidget, QTableWidgetItem, QApplication, QWidget, QTableWidget, QTableWidgetItem,
@@ -73,13 +73,13 @@ class EmittingStream(QObject):
self._buffer = "" self._buffer = ""
class ProcessOutputWindow(QDialog): class ProcessOutputWindow(QDialog):
def __init__(self, proj_path, makefile_path, xml_path, on_done_callback=None): def __init__(self, proj_path, makefile_path, xml_path, on_done_callback=None, parent=None):
super().__init__() super().__init__(parent)
self.setWindowTitle("Поиск переменных...") self.setWindowTitle("Поиск переменных...")
self.resize(600, 480) self.resize(600, 480)
self.setModal(True) self.setModal(True)
self.setAttribute(Qt.WA_DeleteOnClose)
self.proj_path = proj_path self.proj_path = proj_path
self.makefile_path = makefile_path self.makefile_path = makefile_path

View File

@@ -1,7 +1,7 @@
# build command # build command
# pyinstaller --onefile scanVars.py --add-binary "F:\Work\Projects\TMS\TMS_new_bus\Src\DebugTools/build/libclang.dll;." --distpath . --workpath ./build --specpath ./build # pyinstaller --onefile scan_vars.py --add-binary "F:\Work\Projects\TMS\TMS_new_bus\Src\DebugTools/build/libclang.dll;." --distpath . --workpath ./build --specpath ./build
# start script # start script
# scanVars.exe F:\Work\Projects\TMS\TMS_new_bus\ F:\Work\Projects\TMS\TMS_new_bus\Debug\makefile # scan_vars.exe F:\Work\Projects\TMS\TMS_new_bus\ F:\Work\Projects\TMS\TMS_new_bus\Debug\makefile
import os import os
import sys import sys
@@ -11,7 +11,7 @@ from clang import cindex
from clang.cindex import Config from clang.cindex import Config
import lxml.etree as ET import lxml.etree as ET
from xml.dom import minidom from xml.dom import minidom
from parseMakefile import parse_makefile from makefile_parser import parse_makefile
from collections import deque from collections import deque
import argparse import argparse
import myXML import myXML

View File

@@ -244,7 +244,6 @@ class VariableSelectWidget(QWidget):
def filter_tree(self): def filter_tree(self):
text = self.search_input.text().strip().lower() text = self.search_input.text().strip().lower()
print(f"[{self.objectName()}] Filtering tree with text: '{text}'")
path_parts = split_path(text) if text else [] path_parts = split_path(text) if text else []
if '.' not in text and '->' not in text and '[' not in text and text != '': if '.' not in text and '->' not in text and '[' not in text and text != '':
@@ -358,8 +357,6 @@ class VariableSelectWidget(QWidget):
self.completer.setModel(QStringListModel(completions)) self.completer.setModel(QStringListModel(completions))
self.completer.complete() self.completer.complete()
print(f"[{self.objectName()}] Updating completions for text: '{text}' -> {len(completions)} completions found.")
print(f" Completions: {completions[:5]}") # Вывести первые 5 для проверки
return completions return completions
@@ -469,7 +466,6 @@ class VariableSelectWidget(QWidget):
def on_search_text_changed(self, text): def on_search_text_changed(self, text):
sender_widget = self.sender() sender_widget = self.sender()
sender_name = sender_widget.objectName() if sender_widget else "Unknown Sender" sender_name = sender_widget.objectName() if sender_widget else "Unknown Sender"
print(f"[{self.objectName()}] (Sender: {sender_name}) Search text changed: '{text}'")
self.completer.setWidget(self.search_input) self.completer.setWidget(self.search_input)
self.filter_tree() self.filter_tree()

View File

@@ -6,11 +6,11 @@ from PySide2.QtWidgets import (
) )
from PySide2.QtGui import QKeySequence, QKeyEvent from PySide2.QtGui import QKeySequence, QKeyEvent
from PySide2.QtCore import Qt, QStringListModel, QSettings from PySide2.QtCore import Qt, QStringListModel, QSettings
import VariableTable import var_table
import setupVars import var_setup
import myXML import myXML
import time import time
import selectTable import var_selector_table
array_re = re.compile(r'^(\w+)\[(\d+)\]$') array_re = re.compile(r'^(\w+)\[(\d+)\]$')
@@ -55,18 +55,36 @@ class VariableSelectorDialog(QDialog):
self.btn_accept = QPushButton("Применить") self.btn_accept = QPushButton("Применить")
# Создаем экземпляр вашего готового виджета # Создаем экземпляр вашего готового виджета
self.vars_widget = selectTable.VariableSelectWidget(self) self.vars_widget = var_selector_table.VariableSelectWidget(self)
self.vars_widget.tree.itemDoubleClicked.connect(self.on_left_tree_double_click) self.vars_widget.tree.itemDoubleClicked.connect(self.on_left_tree_double_click)
self.vars_widget.setObjectName("LeftTable") self.vars_widget.setObjectName("LeftTable")
self.selected_vars_widget = selectTable.VariableSelectWidget(self) self.selected_vars_widget = var_selector_table.VariableSelectWidget(self)
self.selected_vars_widget.tree.itemDoubleClicked.connect(self.on_rigth_tree_double_click) self.selected_vars_widget.tree.itemDoubleClicked.connect(self.on_rigth_tree_double_click)
self.selected_vars_widget.setObjectName("RightTable") self.selected_vars_widget.setObjectName("RightTable")
# Подписи над таблицами
label_all = QLabel("Все переменные")
label_all.setStyleSheet("font-weight: bold; font-size: 14px;")
label_selected = QLabel("Выбранные переменные")
label_selected.setStyleSheet("font-weight: bold; font-size: 14px;")
# --- Лэйауты --- # --- Лэйауты ---
main_layout = QVBoxLayout(self) # главный вертикальный layout окна main_layout = QVBoxLayout(self) # главный вертикальный layout окна
tables_layout = QHBoxLayout() # горизонтальный layout с таблицами и кнопками # Чекбокс автодополнения — первый в главном layout
main_layout.addWidget(self.autocomplete_checkbox)
# Подписи над таблицами
labels_layout = QHBoxLayout()
labels_layout.addWidget(label_all)
labels_layout.addStretch()
labels_layout.addWidget(label_selected)
main_layout.addLayout(labels_layout)
# Горизонтальный layout с таблицами и кнопками
tables_layout = QHBoxLayout()
# Левая таблица # Левая таблица
self.vars_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.vars_widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
@@ -101,13 +119,13 @@ class VariableSelectorDialog(QDialog):
self.btn_accept.clicked.connect(self.on_apply_clicked) self.btn_accept.clicked.connect(self.on_apply_clicked)
# Соединяем чекбокс с методом виджета # Соединяем чекбокс с методом виджета
self.autocomplete_checkbox.stateChanged.connect(self.vars_widget.set_autocomplete) self.autocomplete_checkbox.stateChanged.connect(self.set_autocomplete_tables)
# Устанавливаем начальное состояние автодополнения в виджете # Устанавливаем начальное состояние автодополнения в виджете
self.vars_widget.set_autocomplete(self.autocomplete_checkbox.isChecked()) self.vars_widget.set_autocomplete(self.autocomplete_checkbox.isChecked())
self.selected_vars_widget.set_autocomplete(self.autocomplete_checkbox.isChecked()) self.selected_vars_widget.set_autocomplete(self.autocomplete_checkbox.isChecked())
# --- Код в конце __init__ --- # --- Код в конце __init__ ---
self.expanded_vars = setupVars.expand_vars(self.all_vars, self.structs, self.typedefs) self.expanded_vars = var_setup.expand_vars(self.all_vars, self.structs, self.typedefs)
self.update_vars_widget() self.update_vars_widget()
def on_move_right(self): def on_move_right(self):
@@ -147,7 +165,7 @@ class VariableSelectorDialog(QDialog):
t_start = time.perf_counter() t_start = time.perf_counter()
t1 = time.perf_counter() t1 = time.perf_counter()
self.selected_vars, self.unselected_vars = setupVars.split_vars_by_show_flag(self.expanded_vars) self.selected_vars, self.unselected_vars = var_setup.split_vars_by_show_flag(self.expanded_vars)
t2 = time.perf_counter() t2 = time.perf_counter()
self.vars_widget.set_data(self.unselected_vars) self.vars_widget.set_data(self.unselected_vars)
@@ -224,13 +242,6 @@ class VariableSelectorDialog(QDialog):
self.accept() self.accept()
def save_checkbox_state(self):
self.settings.setValue("autocomplete_enabled", self.autocomplete_checkbox.isChecked())
# Обнови on_left_tree_double_click: # Обнови on_left_tree_double_click:
def on_left_tree_double_click(self, item, column): def on_left_tree_double_click(self, item, column):
selected_names = [item.text(0)] selected_names = [item.text(0)]
@@ -373,3 +384,9 @@ class VariableSelectorDialog(QDialog):
def save_checkbox_state(self): def save_checkbox_state(self):
self.settings.setValue("autocomplete_enabled", self.autocomplete_checkbox.isChecked()) self.settings.setValue("autocomplete_enabled", self.autocomplete_checkbox.isChecked())
def set_autocomplete_tables(self, state):
self.vars_widget.set_autocomplete(state)
self.selected_vars_widget.set_autocomplete(state)

View File

@@ -2,9 +2,9 @@ import sys
import os import os
import re import re
import lxml.etree as ET import lxml.etree as ET
from generateVars import map_type_to_pt, get_iq_define, type_map from generate_debug_vars import map_type_to_pt, get_iq_define, type_map
from enum import IntEnum from enum import IntEnum
import scanVars import scan_vars
import myXML import myXML
import pickle import pickle
@@ -291,7 +291,7 @@ def expand_struct_recursively(prefix, type_str, structs, typedefs, var_attrs, de
return process_array(prefix, type_str, structs, typedefs, var_attrs, depth) return process_array(prefix, type_str, structs, typedefs, var_attrs, depth)
# Ищем структуру по имени типа # Ищем структуру по имени типа
base_type = scanVars.strip_ptr_and_array(type_str) base_type = scan_vars.strip_ptr_and_array(type_str)
fields = structs.get(base_type) fields = structs.get(base_type)
if not isinstance(fields, dict): if not isinstance(fields, dict):
# Не структура и не массив — просто возвращаем пустой список # Не структура и не массив — просто возвращаем пустой список

View File

@@ -6,7 +6,7 @@ from PySide2.QtWidgets import (
from PySide2.QtGui import QColor, QBrush, QPalette from PySide2.QtGui import QColor, QBrush, QPalette
from PySide2.QtCore import Qt from PySide2.QtCore import Qt
from enum import IntEnum from enum import IntEnum
from generateVars import type_map from generate_debug_vars import type_map
import time import time
from typing import Dict, List from typing import Dict, List
@@ -60,6 +60,12 @@ class FilterDialog(QDialog):
return [cb.text() for cb in self.checkboxes if cb.isChecked()] return [cb.text() for cb in self.checkboxes if cb.isChecked()]
class CtrlScrollComboBox(QComboBox):
def wheelEvent(self, event):
if event.modifiers() & Qt.ControlModifier:
super().wheelEvent(event)
else:
event.ignore()
class VariableTableWidget(QTableWidget): class VariableTableWidget(QTableWidget):
def __init__(self, parent=None): def __init__(self, parent=None):
@@ -82,11 +88,12 @@ class VariableTableWidget(QTableWidget):
self.pt_types_all = [t.replace('pt_', '') for t in self.type_options] self.pt_types_all = [t.replace('pt_', '') for t in self.type_options]
self.iq_types_all = ['iq_none', 'iq'] + [f'iq{i}' for i in range(1, 31)] self.iq_types_all = ['iq_none', 'iq'] + [f'iq{i}' for i in range(1, 31)]
# Задаём базовые iq-типы (без префикса 'iq_') # Задаём базовые iq-типы (без префикса 'iq_')
self.iq_types = ['iq_none', 'iq24', 'iq19', 'iq15', 'iq10'] self.iq_types = ['iq_none', 'iq', 'iq10', 'iq15', 'iq19', 'iq24']
# Фильтруем типы из type_map.values() исключая те, что содержат 'arr' или 'ptr' # Фильтруем типы из type_map.values() исключая те, что содержат 'arr' или 'ptr'
self.type_options = [t for t in set(type_map.values()) if 'arr' not in t and 'ptr' not in t] type_options = [t for t in dict.fromkeys(type_map.values()) if 'arr' not in t and 'ptr' not in t and
'struct' not in t and 'union' not in t and '64' not in t]
# Формируем display_type_options без префикса 'pt_' # Формируем display_type_options без префикса 'pt_'
self.pt_types = [t.replace('pt_', '') for t in self.type_options] self.pt_types = [t.replace('pt_', '') for t in type_options]
self._iq_type_filter = list(self.iq_types) # Текущий фильтр iq типов (по умолчанию все) self._iq_type_filter = list(self.iq_types) # Текущий фильтр iq типов (по умолчанию все)
self._pt_type_filter = list(self.pt_types) self._pt_type_filter = list(self.pt_types)
@@ -117,9 +124,6 @@ class VariableTableWidget(QTableWidget):
def populate(self, vars_list, structs, on_change_callback): def populate(self, vars_list, structs, on_change_callback):
self.var_list = vars_list self.var_list = vars_list
self.type_options = list(dict.fromkeys(type_map.values()))
self.pt_types = [t.replace('pt_', '') for t in self.type_options]
iq_types = ['iq_none', 'iq'] + [f'iq{i}' for i in range(1, 31)]
# --- ДО: удаляем отображение структур и union-переменных # --- ДО: удаляем отображение структур и union-переменных
for var in vars_list: for var in vars_list:
@@ -168,7 +172,7 @@ class VariableTableWidget(QTableWidget):
self.setItem(row, rows.type, origin_item) self.setItem(row, rows.type, origin_item)
# pt_type # pt_type
pt_combo = QComboBox() pt_combo = CtrlScrollComboBox()
pt_combo.addItems(self.pt_types) pt_combo.addItems(self.pt_types)
value = var['pt_type'].replace('pt_', '') value = var['pt_type'].replace('pt_', '')
if value not in self.pt_types: if value not in self.pt_types:
@@ -176,11 +180,10 @@ class VariableTableWidget(QTableWidget):
pt_combo.setCurrentText(value) pt_combo.setCurrentText(value)
pt_combo.currentTextChanged.connect(on_change_callback) pt_combo.currentTextChanged.connect(on_change_callback)
pt_combo.setStyleSheet(style_with_padding) pt_combo.setStyleSheet(style_with_padding)
pt_combo.wheelEvent = lambda e: e.ignore()
self.setCellWidget(row, rows.pt_type, pt_combo) self.setCellWidget(row, rows.pt_type, pt_combo)
# iq_type # iq_type
iq_combo = QComboBox() iq_combo = CtrlScrollComboBox()
iq_combo.addItems(self.iq_types) iq_combo.addItems(self.iq_types)
value = var['iq_type'].replace('t_', '') value = var['iq_type'].replace('t_', '')
if value not in self.iq_types: if value not in self.iq_types:
@@ -188,17 +191,15 @@ class VariableTableWidget(QTableWidget):
iq_combo.setCurrentText(value) iq_combo.setCurrentText(value)
iq_combo.currentTextChanged.connect(on_change_callback) iq_combo.currentTextChanged.connect(on_change_callback)
iq_combo.setStyleSheet(style_with_padding) iq_combo.setStyleSheet(style_with_padding)
iq_combo.wheelEvent = lambda e: e.ignore()
self.setCellWidget(row, rows.iq_type, iq_combo) self.setCellWidget(row, rows.iq_type, iq_combo)
# return_type # return_type
ret_combo = QComboBox() ret_combo = CtrlScrollComboBox()
ret_combo.addItems(self.iq_types) ret_combo.addItems(self.iq_types)
value = var['return_type'].replace('t_', '') value = var['return_type'].replace('t_', '')
ret_combo.setCurrentText(value) ret_combo.setCurrentText(value)
ret_combo.currentTextChanged.connect(on_change_callback) ret_combo.currentTextChanged.connect(on_change_callback)
ret_combo.setStyleSheet(style_with_padding) ret_combo.setStyleSheet(style_with_padding)
ret_combo.wheelEvent = lambda e: e.ignore()
self.setCellWidget(row, rows.ret_type, ret_combo) self.setCellWidget(row, rows.ret_type, ret_combo)
# short_name # short_name
@@ -276,7 +277,7 @@ class VariableTableWidget(QTableWidget):
def on_header_clicked(self, logicalIndex): def on_header_clicked(self, logicalIndex):
if logicalIndex == rows.pt_type: if logicalIndex == rows.pt_type:
dlg = FilterDialog(self, self.pt_types_all, self._pt_type_filter, "Выберите Pointer Types") dlg = FilterDialog(self, self.pt_types_all, self._pt_type_filter, "Выберите базовые типы")
if dlg.exec_(): if dlg.exec_():
self._pt_type_filter = dlg.get_selected() self._pt_type_filter = dlg.get_selected()
self.update_comboboxes({rows.pt_type: self._pt_type_filter}) self.update_comboboxes({rows.pt_type: self._pt_type_filter})
@@ -309,6 +310,7 @@ class VariableTableWidget(QTableWidget):
current = combo.currentText() current = combo.currentText()
combo.blockSignals(True) combo.blockSignals(True)
combo.clear() combo.clear()
combo.addItems(allowed_items) combo.addItems(allowed_items)
if current in allowed_items: if current in allowed_items:
combo.setCurrentText(current) combo.setCurrentText(current)

View File

@@ -1,341 +0,0 @@
// Ýòîò ôàéë ñãåíåðèðîâàí àâòîìàòè÷åñêè
#include "debug_tools.h"
// Èíêëþäû äëÿ äîñòóïà ê ïåðåìåííûì
#include "vector.h"
#include "errors.h"
#include "RS_Functions_modbus.h"
#include "xp_project.h"
#include "adc_tools.h"
#include "pwm_vector_regul.h"
#include "log_can.h"
#include "f281xpwm.h"
#include "v_pwm24.h"
#include "xp_write_xpwm_time.h"
#include "dq_to_alphabeta_cos.h"
#include "teta_calc.h"
#include "rotation_speed.h"
#include "detect_phase_break2.h"
#include "RS_Functions.h"
#include "Spartan2E_Functions.h"
#include "xp_controller.h"
#include "xp_rotation_sensor.h"
#include "x_serial_bus.h"
#include "x_parallel_bus.h"
#include "xPeriphSP6_loader.h"
#include "log_params.h"
#include "CAN_Setup.h"
#include "CRC_Functions.h"
#include "log_to_memory.h"
#include "global_time.h"
#include "svgen_dq.h"
#include "pid_reg3.h"
#include "IQmathLib.h"
#include "doors_control.h"
#include "isolation.h"
#include "main22220.h"
#include "optical_bus.h"
#include "alarm_log_can.h"
#include "bender.h"
#include "can_watercool.h"
#include "detect_phase_break.h"
#include "modbus_read_table.h"
#include "rmp_cntl_my1.h"
// Ýêñòåðíû äëÿ äîñòóïà ê ïåðåìåííûì
extern int ADC0finishAddr;
extern int ADC0startAddr;
extern int ADC1finishAddr;
extern int ADC1startAddr;
extern int ADC2finishAddr;
extern int ADC2startAddr;
extern int ADC_f[2][16];
extern int ADC_sf[2][16];
extern int ADDR_FOR_ALL;
extern int BUSY;
extern BENDER Bender[2];
extern int CAN_answer_wait[32];
extern int CAN_count_cycle_input_units[8];
extern int CAN_no_answer[32];
extern int CAN_refresh_cicle[32];
extern int CAN_request_sent[32];
extern int CAN_timeout[32];
extern int CAN_timeout_cicle[32];
extern int CNTRL_ADDR;
extern const int CNTRL_ADDR_UNIVERSAL;
extern _iq CONST_15;
extern _iq CONST_23;
extern int CanOpenUnites[30];
extern int CanTimeOutErrorTR;
extern XControll_reg Controll;
extern int Dpwm;
extern int Dpwm2;
extern int Dpwm4;
extern int EvaTimer1InterruptCount;
extern int EvaTimer2InterruptCount;
extern int EvbTimer3InterruptCount;
extern int EvbTimer4InterruptCount;
extern int Fpwm;
extern int IN0finishAddr;
extern int IN0startAddr;
extern int IN1finishAddr;
extern int IN1startAddr;
extern int IN2finishAddr;
extern int IN2startAddr;
extern float IQ_OUT_NOM;
extern long I_OUT_1_6_NOMINAL_IQ;
extern long I_OUT_1_8_NOMINAL_IQ;
extern float I_OUT_NOMINAL;
extern long I_OUT_NOMINAL_IQ;
extern long I_ZPT_NOMINAL_IQ;
extern _iq Id_out_max_full;
extern _iq Id_out_max_low_speed;
extern _iq Iq_out_max;
extern _iq Iq_out_nom;
extern const unsigned long K_LEM_ADC[20];
extern float KmodTerm;
extern int ROTfinishAddr;
extern unsigned int RS_Len[70];
extern const unsigned int R_ADC[20];
extern int RotPlaneStartAddr;
extern _iq SQRT_32;
extern int Unites[8][128];
extern int VAR_FREQ_PWM_XTICS;
extern int VAR_PERIOD_MAX_XTICS;
extern int VAR_PERIOD_MIN_BR_XTICS;
extern int VAR_PERIOD_MIN_XTICS;
extern int Zpwm;
extern WINDING a;
extern volatile AddrToSent addrToSent;
extern unsigned int adr_read_from_modbus3;
extern ALARM_LOG_CAN alarm_log_can;
extern ALARM_LOG_CAN_SETUP alarm_log_can_setup;
extern ANALOG_VALUE analog;
extern int ar_sa_all[3][6][4][7];
extern _iq ar_tph[7];
extern int block_size_counter_fast;
extern int block_size_counter_slow;
extern _iq break_result_1;
extern _iq break_result_2;
extern _iq break_result_3;
extern _iq break_result_4;
extern Byte byte;
extern long c_s;
extern int calibration1;
extern int calibration2;
extern test_functions callfunc;
extern CANOPEN_CAN_SETUP canopen_can_setup;
extern unsigned int capnum0;
extern unsigned int capnum1;
extern unsigned int capnum2;
extern unsigned int capnum3;
extern unsigned int chNum;
extern BREAK_PHASE_I chanell1;
extern BREAK_PHASE_I chanell2;
extern int cmd_3_or_16;
extern int compress_size;
extern ControlReg controlReg;
extern COS_FI_STRUCT cos_fi;
extern unsigned int count_error_sync;
extern int count_modbus_table_changed;
extern int count_run_pch;
extern WORD crc_16_tab[256];
extern char crypt[34];
extern int cur_position_buf_modbus16_can;
extern CYCLE cycle[32];
extern int delta_capnum;
extern int delta_error;
extern volatile DOORS_STATUS doors;
extern int enable_can;
extern int enable_can_recive_after_units_box;
extern _iq err_level_adc;
extern _iq err_level_adc_on_go;
extern unsigned int err_main;
extern int err_modbus16;
extern int err_modbus3;
extern ERRORS errors;
extern FLAG f;
extern volatile int fail;
extern FAULTS faults;
extern FIFO fifo;
extern ANALOG_VALUE filter;
extern int flag_buf;
extern int flag_enable_can_from_mpu;
extern int flag_enable_can_from_terminal;
extern int flag_on_off_pch;
extern unsigned int flag_received_first_mess_from_MPU;
extern unsigned int flag_reverse;
extern unsigned int flag_send_answer_rs;
extern int flag_test_tabe_filled;
extern int flag_we_int_pwm_on;
extern _iq freq1;
extern float freqTerm;
extern GLOBAL_TIME global_time;
extern int hb_logs_data;
extern int i;
extern BREAK2_PHASE i1_out;
extern BREAK2_PHASE i2_out;
extern int init_log[3];
extern _iq19 iq19_k_norm_ADC[20];
extern _iq19 iq19_zero_ADC[20];
extern _iq iq_alfa_coef;
extern _iq iq_k_norm_ADC[20];
extern IQ_LOGSPARAMS iq_logpar;
extern _iq iq_max;
extern _iq iq_norm_ADC[20];
extern ISOLATION isolation1;
extern ISOLATION isolation2;
extern _iq k1;
extern float kI_D;
extern float kI_D_Inv31;
extern float kI_Q;
extern float kI_Q_Inv31;
extern float kP_D;
extern float kP_D_Inv31;
extern float kP_Q;
extern float kP_Q_Inv31;
extern _iq koef_Base_stop_run;
extern _iq koef_Iabc_filter;
extern _iq koef_Im_filter;
extern _iq koef_Im_filter_long;
extern _iq koef_K_stop_run;
extern _iq koef_Krecup;
extern _iq koef_Min_recup;
extern _iq koef_TemperBSU_long_filter;
extern _iq koef_Ud_fast_filter;
extern _iq koef_Ud_long_filter;
extern _iq koef_Wlong;
extern _iq koef_Wout_filter;
extern _iq koef_Wout_filter_long;
extern long koeff_Fs_filter;
extern long koeff_Idq_filter;
extern _iq koeff_Iq_filter;
extern long koeff_Iq_filter_slow;
extern long koeff_Ud_filter;
extern long koeff_Uq_filter;
extern volatile unsigned long length;
extern _iq level_on_off_break[13][2];
extern logcan_TypeDef log_can;
extern LOG_CAN_SETUP log_can_setup;
extern TYPE_LOG_PARAMS log_params;
extern long logbuf_sync1[10];
extern LOGSPARAMS logpar;
extern int m_PWM;
extern MAILBOXS_CAN_SETUP mailboxs_can_setup;
extern int manufactorerAndProductID;
extern MODBUS_REG_STRUCT * modbus_table_can_in;
extern MODBUS_REG_STRUCT * modbus_table_can_out;
extern MODBUS_REG_STRUCT modbus_table_in[450];
extern MODBUS_REG_STRUCT modbus_table_out[450];
extern MODBUS_REG_STRUCT * modbus_table_rs_in;
extern MODBUS_REG_STRUCT * modbus_table_rs_out;
extern MODBUS_REG_STRUCT modbus_table_test[450];
extern MPU_CAN_SETUP mpu_can_setup;
extern NEW_CYCLE_FIFO new_cycle_fifo;
extern int no_write;
extern int no_write_slow;
extern int number_modbus_table_changed;
extern OPTICAL_BUS_DATA optical_read_data;
extern OPTICAL_BUS_DATA optical_write_data;
extern MODBUS_REG_STRUCT options_controller[200];
extern _iq pidCur_Ki;
extern PIDREG3 pidD;
extern PIDREG3 pidD2;
extern PIDREG3 pidFvect;
extern int pidFvectKi_test;
extern int pidFvectKp_test;
extern PIDREG3 pidPvect;
extern PIDREG3 pidQ;
extern PIDREG3 pidQ2;
extern PIDREG_KOEFFICIENTS pidReg_koeffs;
extern PIDREG3 pidTetta;
extern POWER_RATIO power_ratio;
extern int prev_flag_buf;
extern unsigned int prev_status_received;
extern T_project project;
extern PWMGEND pwmd;
extern T_controller_read r_c_sbus;
extern T_controller_read r_controller;
extern FIFO refo;
extern TMS_TO_TERMINAL_STRUCT reply;
extern TMS_TO_TERMINAL_TEST_ALL_STRUCT reply_test_all;
extern RMP_MY1 rmp_freq;
extern RMP_MY1 rmp_wrot;
extern T_rotation_sensor rotation_sensor;
extern ROTOR_VALUE rotor;
extern RS_DATA_STRUCT rs_a;
extern RS_DATA_STRUCT rs_b;
extern unsigned int sincronisationFault;
extern char size_cmd15;
extern char size_cmd16;
extern int size_fast_done;
extern int size_slow_done;
extern int stop_log;
extern int stop_log_slow;
extern SVGENDQ svgen_dq_1;
extern SVGENDQ svgen_dq_2;
extern SVGEN_PWM24 svgen_pwm24_1;
extern SVGEN_PWM24 svgen_pwm24_2;
extern unsigned int temp;
extern _iq temperature_limit_koeff;
extern INVERTER_TEMPERATURES temperature_warning_BI1;
extern INVERTER_TEMPERATURES temperature_warning_BI2;
extern RECTIFIER_TEMPERATURES temperature_warning_BV1;
extern RECTIFIER_TEMPERATURES temperature_warning_BV2;
extern TERMINAL_CAN_SETUP terminal_can_setup;
extern TETTA_CALC tetta_calc;
extern int timCNT_alg;
extern int timCNT_prev;
extern unsigned int time;
extern float time_alg;
extern long time_pause_enable_can_from_mpu;
extern long time_pause_enable_can_from_terminal;
extern int time_pause_logs;
extern int time_pause_titles;
extern volatile int tryNumb;
extern UNITES_CAN_SETUP unites_can_setup;
extern VECTOR_CONTROL vect_control;
extern WaterCooler water_cooler;
extern _iq winding_displacement;
extern Word word;
extern WordReversed wordReversed;
extern WordToReverse wordToReverse;
extern X_PARALLEL_BUS x_parallel_bus_project;
extern X_SERIAL_BUS x_serial_bus_project;
extern unsigned int xeeprom_controll_fast;
extern unsigned int xeeprom_controll_store;
extern XPWM_TIME xpwm_time;
extern _iq zadan_Id_min;
extern int zero_ADC[20];
// Îïðåäåëåíèå ìàññèâà ñ óêàçàòåëÿìè íà ïåðåìåííûå äëÿ îòëàäêè
int DebugVar_Qnt = 23;
#pragma DATA_SECTION(dbg_vars,".dbgvar_info")
DebugVar_t dbg_vars[] = {\
{(char *)&ADC0finishAddr, pt_int16, t_iq_none, t_iq_none, "ADC0finish" }, \
{(char *)&IQ_OUT_NOM, pt_float, t_iq_none, t_iq10, "IQ_OUT_NOM" }, \
{(char *)&KmodTerm, pt_float, t_iq_none, t_iq10, "KmodTerm" }, \
{(char *)&freqTerm, pt_float, t_iq_none, t_iq10, "freqTerm" }, \
{(char *)&ADC_sf[0][0], pt_int16, t_iq_none, t_iq_none, "ADC_sf00" }, \
{(char *)&ADC_sf[0][1], pt_int16, t_iq_none, t_iq_none, "ADC_sf01" }, \
{(char *)&ADC_sf[0][2], pt_int16, t_iq_none, t_iq_none, "ADC_sf02" }, \
{(char *)&ADC_sf[0][3], pt_int16, t_iq_none, t_iq_none, "ADC_sf03" }, \
{(char *)&ADC_sf[0][4], pt_int16, t_iq_none, t_iq_none, "ADC_sf04" }, \
{(char *)&ADC_sf[0][5], pt_int16, t_iq_none, t_iq_none, "ADC_sf05" }, \
{(char *)&ADC_sf[0][6], pt_int16, t_iq_none, t_iq_none, "ADC_sf06" }, \
{(char *)&ADC_sf[0][7], pt_int16, t_iq_none, t_iq_none, "ADC_sf07" }, \
{(char *)&ADC_sf[0][8], pt_int16, t_iq_none, t_iq_none, "ADC_sf08" }, \
{(char *)&ADC_sf[0][9], pt_int16, t_iq_none, t_iq_none, "ADC_sf09" }, \
{(char *)&ADC_sf[0][10], pt_int16, t_iq_none, t_iq_none, "ADC_sf010" }, \
{(char *)&ADC_sf[0][11], pt_int16, t_iq_none, t_iq_none, "ADC_sf011" }, \
{(char *)&ADC_sf[0][12], pt_int16, t_iq_none, t_iq_none, "ADC_sf012" }, \
{(char *)&ADC_sf[0][13], pt_int16, t_iq_none, t_iq_none, "ADC_sf013" }, \
{(char *)&ADC_sf[0][14], pt_int16, t_iq_none, t_iq_none, "ADC_sf014" }, \
{(char *)&ADC_sf[0][15], pt_int16, t_iq_none, t_iq_none, "ADC_sf015" }, \
{(char *)&Bender[0].KOhms, pt_uint16, t_iq_none, t_iq_none, "Bend0.KOhm" }, \
{(char *)&Bender[0].Times, pt_uint16, t_iq_none, t_iq_none, "Bend0.Time" }, \
{(char *)&Bender[0].Error.all, pt_uint16, t_iq_none, t_iq_none, "Bend0.Err" }, \
};

20181
structs.xml

File diff suppressed because it is too large Load Diff

4908
vars.xml

File diff suppressed because it is too large Load Diff