diff --git a/Src/VariableSelector.py b/Src/VariableSelector.py index 556e273..7c8f0dd 100644 --- a/Src/VariableSelector.py +++ b/Src/VariableSelector.py @@ -149,7 +149,6 @@ class VariableSelectorDialog(QDialog): self.selected_vars_widget.filter_tree() - def on_add_clicked(self): # Получаем все переменные из правой таблицы (selected_vars_widget) var_names = self.selected_vars_widget.get_all_var_names() diff --git a/Src/VariableTable.py b/Src/VariableTable.py index 21eeeea..e22ce9e 100644 --- a/Src/VariableTable.py +++ b/Src/VariableTable.py @@ -123,6 +123,7 @@ class VariableTableWidget(QTableWidget): pt_combo.setCurrentText(value) pt_combo.currentTextChanged.connect(on_change_callback) pt_combo.setStyleSheet(style_with_padding) + pt_combo.wheelEvent = lambda e: e.ignore() self.setCellWidget(row, rows.pt_type, pt_combo) # iq_type diff --git a/Src/selectTable.py b/Src/selectTable.py index 6300323..c9983fb 100644 --- a/Src/selectTable.py +++ b/Src/selectTable.py @@ -5,6 +5,8 @@ from PySide2.QtWidgets import ( ) from PySide2.QtGui import QKeyEvent from PySide2.QtCore import Qt, QStringListModel +import pickle +import time # Вспомогательные функции, которые теперь будут использоваться виджетом def split_path(path): @@ -183,59 +185,30 @@ class VariableSelectWidget(QWidget): def set_data(self, vars_list): """Основной метод для загрузки данных в виджет.""" - self.expanded_vars = vars_list + self.expanded_vars = pickle.loads(pickle.dumps(vars_list, protocol=pickle.HIGHEST_PROTOCOL)) # self.build_completion_list() # Если нужна полная перестройка списка self.populate_tree() - def _get_internal_selected_items(self): - """Возвращает выделенные элементы и всех их потомков.""" - selected = self.tree.selectedItems() - all_items = [] - - def collect_children(item): - items = [item] - for i in range(item.childCount()): - child = item.child(i) - items.extend(collect_children(child)) - return items - - for item in selected: - all_items.extend(collect_children(item)) - - return all_items - - def _get_internal_selected_var_names(self): - """Возвращает имена выделенных переменных.""" - return [item.text(0) for item in self._get_internal_selected_items() if item.text(0)] - - def get_selected_items(self): - """Возвращает только конечные (leaf) выделенные элементы, исключая bitfield.""" - selected = self.tree.selectedItems() - leaf_items = [] - for item in selected: - # Проверка: если нет выбранных/видимых детей — это лист - if all(item.child(i).isHidden() or not item.child(i).isSelected() for i in range(item.childCount())): - item_type = item.data(0, Qt.UserRole) - if item_type and 'bitfield' in str(item_type).lower(): - continue # Пропускаем битовые поля - leaf_items.append(item) - return leaf_items - - - - def get_selected_var_names(self): - """Возвращает имена только конечных (leaf) переменных из выделенных.""" - return [item.text(0) for item in self.get_selected_items() if item.text(0)] - def populate_tree(self, vars_list=None): if vars_list is None: vars_list = self.expanded_vars + self.tree.setUpdatesEnabled(False) + self.tree.blockSignals(True) self.tree.clear() self.node_index.clear() + start_add = time.perf_counter() + stats = {'count': 0, 'time': 0.0} for var in vars_list: - self.add_tree_item_recursively(None, var) + self.add_tree_item_recursively(None, var, stats) + end_add = time.perf_counter() + print(f" add items: {end_add - start_add:.6f} s") + print(f" └ recursive only: {stats['time']:.6f} s") + print(f" └ total items: {stats['count']} шт") + + self.tree.setUpdatesEnabled(True) + self.tree.blockSignals(False) header = self.tree.header() header.setSectionResizeMode(QHeaderView.Interactive) # вручную можно менять self.tree.setColumnWidth(0, 400) @@ -253,41 +226,42 @@ class VariableSelectWidget(QWidget): return fullname - def add_tree_item_recursively(self, parent, var): - """ - Рекурсивно добавляет переменную и её дочерние поля в дерево. - Если parent == None, добавляет на верхний уровень. - """ - name = var['name'] - type_str = var.get('type', '') - show_var = var.get('show_var', 'false') == 'true' + def add_tree_item_recursively(self, parent, var, stats=None, parent_path=""): + if stats is None: + stats = {'count': 0, 'time': 0.0} + start = time.perf_counter() + + name = var['name'] + full_name = f"{parent_path}.{name}" if parent_path else name + full_name = full_name.replace('->', '.') # если нужно + + type_str = var.get('type', '') item = QTreeWidgetItem([name, type_str]) item.setData(0, Qt.UserRole, name) - full_name = self.get_full_item_name(item) self.node_index[full_name.lower()] = item - # Делаем bitfield-поля неактивными if "(bitfield:" in type_str: - item.setDisabled(True) + item.setDisabled(True) self.set_tool(item, "Битовые поля недоступны для выбора") for i, attr in enumerate(['file', 'extern', 'static']): item.setData(0, Qt.UserRole + 1 + i, var.get(attr)) - if show_var: - item.setForeground(0, Qt.gray) - item.setForeground(1, Qt.gray) - self.set_tool(item, "Уже добавлена") - if parent is None: self.tree.addTopLevelItem(item) else: parent.addChild(item) + stats['count'] += 1 + for child in var.get('children', []): - self.add_tree_item_recursively(item, child) - + self.add_tree_item_recursively(item, child, stats, parent_path=full_name) + + end = time.perf_counter() + stats['time'] += end - start + return stats + def filter_tree(self): text = self.search_input.text().strip().lower() @@ -309,8 +283,6 @@ class VariableSelectWidget(QWidget): - - def find_node_by_path(self, root_vars, path_list): current_level = root_vars node = None @@ -574,3 +546,45 @@ class VariableSelectWidget(QWidget): def get_all_var_names(self): """Возвращает имена всех конечных (leaf) переменных, исключая битовые поля и группы.""" return [item.text(0) for item in self.get_all_items() if item.text(0)] + + + def _get_internal_selected_items(self): + """Возвращает выделенные элементы и всех их потомков.""" + selected = self.tree.selectedItems() + all_items = [] + + def collect_children(item): + items = [item] + for i in range(item.childCount()): + child = item.child(i) + items.extend(collect_children(child)) + return items + + for item in selected: + all_items.extend(collect_children(item)) + + return all_items + + def _get_internal_selected_var_names(self): + """Возвращает имена выделенных переменных.""" + return [item.text(0) for item in self._get_internal_selected_items() if item.text(0)] + + def get_selected_items(self): + """Возвращает только конечные (leaf) выделенные элементы, исключая bitfield.""" + selected = self.tree.selectedItems() + leaf_items = [] + for item in selected: + # Проверка: если нет выбранных/видимых детей — это лист + if all(item.child(i).isHidden() or not item.child(i).isSelected() for i in range(item.childCount())): + item_type = item.data(0, Qt.UserRole) + if item_type and 'bitfield' in str(item_type).lower(): + continue # Пропускаем битовые поля + leaf_items.append(item) + return leaf_items + + + + def get_selected_var_names(self): + """Возвращает имена только конечных (leaf) переменных из выделенных.""" + return [item.text(0) for item in self.get_selected_items() if item.text(0)] + diff --git a/Src/setupVars.py b/Src/setupVars.py index 04e9e5d..de5180f 100644 --- a/Src/setupVars.py +++ b/Src/setupVars.py @@ -6,6 +6,8 @@ from generateVars import map_type_to_pt, get_iq_define, type_map from enum import IntEnum import scanVars import myXML +import pickle + # Вспомогательные функции, которые теперь будут использоваться виджетом def split_path(path): @@ -543,9 +545,7 @@ def add_to_nested_tree(tree, var, path_parts, full_names=None, depth=0, source_t def split_vars_by_show_flag(expanded_vars): - from copy import deepcopy - - unselected_vars = deepcopy(expanded_vars) + unselected_vars = pickle.loads(pickle.dumps(expanded_vars, protocol=pickle.HIGHEST_PROTOCOL)) selected_vars = [] def find_and_remove(var_list, target_name): diff --git a/debug_vars.c b/debug_vars.c index ae85ba8..bcb640c 100644 --- a/debug_vars.c +++ b/debug_vars.c @@ -3,34 +3,34 @@ // -#include "vector.h" -#include "RS_Functions_modbus.h" +#include "v_pwm24.h" #include "f281xpwm.h" #include "xp_project.h" -#include "adc_tools.h" -#include "errors.h" -#include "xp_write_xpwm_time.h" -#include "log_can.h" +#include "RS_Functions_modbus.h" #include "pwm_vector_regul.h" +#include "errors.h" #include "rotation_speed.h" #include "teta_calc.h" -#include "v_pwm24.h" +#include "vector.h" +#include "adc_tools.h" +#include "log_can.h" +#include "xp_write_xpwm_time.h" #include "dq_to_alphabeta_cos.h" -#include "RS_Functions.h" -#include "x_serial_bus.h" +#include "svgen_dq.h" #include "x_parallel_bus.h" +#include "x_serial_bus.h" +#include "xPeriphSP6_loader.h" #include "Spartan2E_Functions.h" #include "xp_controller.h" #include "xp_rotation_sensor.h" -#include "xPeriphSP6_loader.h" +#include "RS_Functions.h" #include "detect_phase_break2.h" -#include "CRC_Functions.h" -#include "CAN_Setup.h" -#include "log_params.h" -#include "log_to_memory.h" -#include "global_time.h" #include "pid_reg3.h" -#include "svgen_dq.h" +#include "log_params.h" +#include "CRC_Functions.h" +#include "global_time.h" +#include "CAN_Setup.h" +#include "log_to_memory.h" #include "IQmathLib.h" #include "doors_control.h" #include "isolation.h" @@ -261,6 +261,7 @@ 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 long return_var; extern RMP_MY1 rmp_freq; extern RMP_MY1 rmp_wrot; extern T_rotation_sensor rotation_sensor; @@ -296,6 +297,7 @@ extern int time_pause_logs; extern int time_pause_titles; extern volatile int tryNumb; extern UNITES_CAN_SETUP unites_can_setup; +extern long var_numb; extern VECTOR_CONTROL vect_control; extern WaterCooler water_cooler; extern _iq winding_displacement; @@ -312,26 +314,33 @@ extern int zero_ADC[20]; // -int DebugVar_Qnt = 19; +int DebugVar_Qnt = 26; #pragma DATA_SECTION(dbg_vars,".dbgvar_info") DebugVar_t dbg_vars[] = {\ -{(char *)&ADC0finishAddr, pt_int16, t_iq_none, t_iq_none, "ADC0EndAdr" }, \ -{(char *)&ADC_f[0][0], pt_int16, t_iq_none, t_iq_none, "ADC_f00" }, \ -{(char *)&ADC_f[0][1], pt_int16, t_iq_none, t_iq_none, "ADC_f01" }, \ -{(char *)&ADC_f[0][2], pt_int16, t_iq_none, t_iq_none, "ADC_f02" }, \ -{(char *)&ADC_f[0][3], pt_int16, t_iq_none, t_iq_none, "ADC_f03" }, \ -{(char *)&ADC_f[0][4], pt_int16, t_iq_none, t_iq_none, "ADC_f04" }, \ -{(char *)&ADC_f[0][5], pt_int16, t_iq_none, t_iq_none, "ADC_f05" }, \ -{(char *)&ADC_f[0][6], pt_int16, t_iq_none, t_iq_none, "ADC_f06" }, \ -{(char *)&ADC_f[0][7], pt_int16, t_iq, t_iq_none, "ADC_f07" }, \ -{(char *)&ADC_f[0][8], pt_int16, t_iq_none, t_iq_none, "ADC_f08" }, \ -{(char *)&ADC_f[0][9], pt_int16, t_iq_none, t_iq_none, "ADC_f09" }, \ -{(char *)&ADC_f[0][10], pt_int16, t_iq_none, t_iq_none, "ADC_f010" }, \ -{(char *)&ADC_f[0][11], pt_int16, t_iq_none, t_iq_none, "ADC_f011" }, \ -{(char *)&ADC_f[0][12], pt_int16, t_iq_none, t_iq_none, "ADC_f012" }, \ -{(char *)&ADC_f[0][13], pt_int16, t_iq_none, t_iq_none, "ADC_f013" }, \ -{(char *)&ADC_f[0][14], pt_int16, t_iq_none, t_iq_none, "ADC_f014" }, \ -{(char *)&ADC_f[0][15], pt_int16, t_iq_none, t_iq_none, "ADC_f015" }, \ -{(char *)&project.cds_tk[2].read.sbus.mask_protect_tk.all, pt_uint16, t_iq_none, t_iq_none, "tk2_ackcur" }, \ -{(char *)&project.cds_tk[1].plane_address, pt_uint16, t_iq_none, t_iq_none, "tk1_adr" }, \ +{(char *)&ADC0finishAddr, pt_int16, t_iq_none, t_iq_none, "ADC0finish" }, \ +{(char *)&ADC_f[0][11], pt_int32, t_iq_none, t_iq_none, "ADC_f[0][1" }, \ +{(char *)&ADC_f[0][12], pt_int16, t_iq_none, t_iq_none, "ADC_f[0][1" }, \ +{(char *)&ADC_f[0][13], pt_int32, t_iq_none, t_iq_none, "ADC_f[0][1" }, \ +{(char *)&ADC_f[0][14], pt_int16, t_iq_none, t_iq_none, "ADC_f[0][1" }, \ +{(char *)&ADC_f[0][15], pt_int16, t_iq_none, t_iq_none, "ADC_f[0][1" }, \ +{(char *)&ADC_f[1][0], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][0" }, \ +{(char *)&ADC_f[1][1], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&ADC_f[1][2], pt_int64, t_iq_none, t_iq_none, "ADC_f[1][2" }, \ +{(char *)&ADC_f[1][3], pt_int32, t_iq_none, t_iq_none, "ADC_f[1][3" }, \ +{(char *)&ADC_f[1][4], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][4" }, \ +{(char *)&ADC_f[1][5], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][5" }, \ +{(char *)&ADC_f[1][6], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][6" }, \ +{(char *)&ADC_f[1][7], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][7" }, \ +{(char *)&ADC_f[1][8], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][8" }, \ +{(char *)&ADC_f[1][9], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][9" }, \ +{(char *)&ADC_f[1][10], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&ADC_f[1][11], pt_int16, t_iq1, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&ADC_f[1][12], pt_int32, t_iq_none, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&ADC_f[1][13], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&ADC_f[1][14], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&ADC_f[1][15], pt_int16, t_iq_none, t_iq_none, "ADC_f[1][1" }, \ +{(char *)&project.cds_in[0].plane_address, pt_uint16, t_iq_none, t_iq_none, "project.cd" }, \ +{(char *)&Bender[0].KOhms, pt_uint16, t_iq_none, t_iq_none, "Bender[0]." }, \ +{(char *)&Bender[0].Times, pt_uint16, t_iq_none, t_iq_none, "Bender[0]." }, \ +{(char *)&Bender[0].Error.all, pt_uint16, t_iq_none, t_iq_none, "Bender[0]." }, \ }; diff --git a/vars.xml b/vars.xml index 90cfc1c..6090252 100644 --- a/vars.xml +++ b/vars.xml @@ -2,12 +2,12 @@ - false - false + true + true ADC0finishAddr pt_int16 t_iq_none - int + t_iq_none int Src/myXilinx/x_example_all.c false @@ -3737,7 +3737,7 @@ true true ADC_f[0][13] - pt_int32 + pt_int16 t_iq_none t_iq_none int @@ -3797,7 +3797,7 @@ true true ADC_f[1][2] - pt_int64 + pt_int16 t_iq_none t_iq_none int @@ -3809,7 +3809,7 @@ true true ADC_f[1][3] - pt_int32 + pt_int16 t_iq_none t_iq_none int @@ -3906,7 +3906,7 @@ true ADC_f[1][11] pt_int16 - t_iq1 + t_iq_none t_iq_none int Src/main/adc_tools.c @@ -3917,7 +3917,7 @@ true true ADC_f[1][12] - pt_int32 + pt_int16 t_iq_none t_iq_none int