+ блокировка добавления структур и юнионов в переменные
+ запись return iq type в debug_vars.c + переход на русский в gui
This commit is contained in:
parent
07e42c774a
commit
c44216a450
BIN
DebugVarEdit.exe
BIN
DebugVarEdit.exe
Binary file not shown.
@ -26,6 +26,16 @@ from PySide2.QtGui import QTextCursor, QKeyEvent, QIcon
|
||||
from PySide2.QtCore import Qt, QProcess, QObject, Signal, QSettings
|
||||
|
||||
|
||||
var_edit_title = "Редактор переменных для отладки"
|
||||
xml_path_title = "Путь к XML:"
|
||||
proj_path_title = "Путь к проекту:"
|
||||
makefile_path_title = "Пусть к makefile (относительно проекта)"
|
||||
output_path_title = "Папка для debug_vars.c:"
|
||||
scan_title = "Обновить переменные"
|
||||
build_title = "Обновить файл"
|
||||
add_vars_title = "Добавить переменные"
|
||||
open_output_title = "Открыть файл"
|
||||
|
||||
# 3. UI: таблица с переменными
|
||||
class VarEditor(QWidget):
|
||||
def __init__(self):
|
||||
@ -44,7 +54,7 @@ class VarEditor(QWidget):
|
||||
self.initUI()
|
||||
|
||||
def initUI(self):
|
||||
self.setWindowTitle("Variable Editor")
|
||||
self.setWindowTitle(var_edit_title)
|
||||
|
||||
base_path = scanVars.get_base_path()
|
||||
icon_path = os.path.join(base_path, "icon.ico")
|
||||
@ -56,7 +66,7 @@ class VarEditor(QWidget):
|
||||
|
||||
# XML Output
|
||||
xml_layout = QHBoxLayout()
|
||||
xml_layout.addWidget(QLabel("XML Output:"))
|
||||
xml_layout.addWidget(QLabel(xml_path_title))
|
||||
self.xml_output_edit = QLineEdit()
|
||||
self.xml_output_edit.returnPressed.connect(self.update)
|
||||
self.xml_output_edit.textChanged.connect(self.__on_xml_path_changed)
|
||||
@ -68,7 +78,7 @@ class VarEditor(QWidget):
|
||||
|
||||
# Project Path
|
||||
proj_layout = QHBoxLayout()
|
||||
proj_layout.addWidget(QLabel("Project Path:"))
|
||||
proj_layout.addWidget(QLabel(proj_path_title))
|
||||
self.proj_path_edit = QLineEdit()
|
||||
self.proj_path_edit.returnPressed.connect(self.update)
|
||||
self.proj_path_edit.textChanged.connect(self.__on_proj_path_changed)
|
||||
@ -80,7 +90,7 @@ class VarEditor(QWidget):
|
||||
|
||||
# Makefile Path
|
||||
makefile_layout = QHBoxLayout()
|
||||
makefile_layout.addWidget(QLabel("Makefile Path (relative path):"))
|
||||
makefile_layout.addWidget(QLabel(makefile_path_title))
|
||||
self.makefile_edit = QLineEdit()
|
||||
self.makefile_edit.returnPressed.connect(self.update)
|
||||
self.makefile_edit.textChanged.connect(self.__on_makefile_path_changed)
|
||||
@ -94,7 +104,7 @@ class VarEditor(QWidget):
|
||||
|
||||
# Source Output File/Directory
|
||||
source_output_layout = QHBoxLayout()
|
||||
source_output_layout.addWidget(QLabel("Source Output File:"))
|
||||
source_output_layout.addWidget(QLabel(output_path_title))
|
||||
self.source_output_edit = QLineEdit()
|
||||
source_output_layout.addWidget(self.source_output_edit)
|
||||
btn_source_output_browse = QPushButton("...")
|
||||
@ -103,19 +113,19 @@ class VarEditor(QWidget):
|
||||
btn_source_output_browse.clicked.connect(self.__browse_source_output)
|
||||
|
||||
|
||||
self.btn_update_vars = QPushButton("Обновить данные о переменных")
|
||||
self.btn_update_vars = QPushButton(scan_title)
|
||||
self.btn_update_vars.clicked.connect(self.update_vars_data)
|
||||
|
||||
# Кнопка сохранения
|
||||
btn_save = QPushButton("Build")
|
||||
btn_save = QPushButton(build_title)
|
||||
btn_save.clicked.connect(self.save_build)
|
||||
|
||||
# Кнопка добавления переменных
|
||||
self.btn_add_vars = QPushButton("Add Variables")
|
||||
self.btn_add_vars = QPushButton(add_vars_title)
|
||||
self.btn_add_vars.clicked.connect(self.__open_variable_selector)
|
||||
|
||||
# Кнопка открыть output-файл с выбором программы
|
||||
btn_open_output = QPushButton("Открыть Output File...")
|
||||
btn_open_output = QPushButton(open_output_title)
|
||||
btn_open_output.clicked.connect(self.__open_output_file_with_program)
|
||||
# Таблица
|
||||
self.table = VariableTableWidget()
|
||||
|
@ -329,6 +329,7 @@ class VariableSelectorDialog(QDialog):
|
||||
for i in range(node.childCount()):
|
||||
stack.append(node.child(i))
|
||||
return None
|
||||
|
||||
def insert_completion(self, text):
|
||||
|
||||
node = self.find_node_by_fullname(text)
|
||||
@ -371,7 +372,6 @@ class VariableSelectorDialog(QDialog):
|
||||
self.filter_tree()
|
||||
|
||||
def on_add_clicked(self):
|
||||
print("on_add_clicked triggered")
|
||||
self.selected_names = []
|
||||
self.tree.setFocus()
|
||||
|
||||
@ -414,12 +414,10 @@ class VariableSelectorDialog(QDialog):
|
||||
self.all_vars.append(new_var)
|
||||
self.var_map[name] = new_var # Чтобы в будущем не добавлялось повторно
|
||||
|
||||
print("accept")
|
||||
self.done(QDialog.Accepted)
|
||||
|
||||
|
||||
def on_delete_clicked(self):
|
||||
print("on_delete_clicked triggered")
|
||||
selected_names = self._get_selected_var_names()
|
||||
if not selected_names:
|
||||
print("nothing selected")
|
||||
@ -468,7 +466,6 @@ class VariableSelectorDialog(QDialog):
|
||||
ET.ElementTree(root).write(self.xml_path, encoding="utf-8", xml_declaration=True)
|
||||
|
||||
self.populate_tree()
|
||||
print("accept")
|
||||
self.done(QDialog.Accepted)
|
||||
|
||||
|
||||
|
@ -67,11 +67,22 @@ class VariableTableWidget(QTableWidget):
|
||||
self.type_options = list(dict.fromkeys(type_map.values()))
|
||||
self.display_type_options = [t.replace('pt_', '') for t in self.type_options]
|
||||
iq_types = ['iq_none', 'iq'] + [f'iq{i}' for i in range(1, 31)]
|
||||
|
||||
# --- ДО: удаляем отображение структур и union-переменных
|
||||
for var in vars_list:
|
||||
pt_type = var.get('pt_type', '')
|
||||
if 'struct' in pt_type or 'union' in pt_type:
|
||||
var['show_var'] = 'false'
|
||||
var['enable'] = 'false'
|
||||
|
||||
|
||||
filtered_vars = [v for v in vars_list if v.get('show_var', 'false') == 'true']
|
||||
self.setRowCount(len(filtered_vars))
|
||||
self.verticalHeader().setVisible(False)
|
||||
style_with_padding = "padding-left: 5px; padding-right: 5px; font-size: 14pt;" # регулируй отступы по горизонтали
|
||||
|
||||
|
||||
|
||||
for row, var in enumerate(filtered_vars):
|
||||
# №
|
||||
no_item = QTableWidgetItem(str(row))
|
||||
@ -190,8 +201,8 @@ class VariableTableWidget(QTableWidget):
|
||||
'enable': cb.isChecked(),
|
||||
'name': name,
|
||||
'pt_type': f'pt_{pt}',
|
||||
'iq_type': iq,
|
||||
'return_type': ret,
|
||||
'iq_type': f't_{iq}',
|
||||
'return_type': f't_{ret}',
|
||||
'shortname': shortname,
|
||||
'type': origin_type,
|
||||
})
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -331,17 +331,25 @@ def generate_vars_file(proj_path, xml_path, output_dir):
|
||||
if not pt_type:
|
||||
pt_type = map_type_to_pt(vtype, vname)
|
||||
|
||||
|
||||
ret_type = info.get('pt_type')
|
||||
if not ret_type:
|
||||
pt_type = 't_iq_none'
|
||||
|
||||
# Дополнительные поля, например комментарий
|
||||
comment = info.get("comment", "")
|
||||
short_name = info.get("shortname", f'"{vname}"')
|
||||
short_trimmed = short_name[:10] # ограничиваем длину до 10
|
||||
short_str = f'"{short_trimmed}"' # оборачиваем в кавычки
|
||||
|
||||
if pt_type not in ('pt_struct', 'pt_union'):
|
||||
formated_name = f'"{vname}"'
|
||||
f_name = f'{vname},'
|
||||
f_type = f'{pt_type},'
|
||||
f_iq = f'{iq_type},'
|
||||
f_ret_iq = f'{ret_type},'
|
||||
f_short_name = f'"{short_trimmed}"' # оборачиваем в кавычки
|
||||
# Добавим комментарий после записи, если он есть
|
||||
comment_str = f' // {comment}' if comment else ''
|
||||
line = f'{{(char *)&{vname:<41} , {pt_type:<21} , {iq_type:<21} , {short_str:<20}}}, \\{comment_str}'
|
||||
line = f'{{(char *)&{f_name:<45} {f_type:<15} {f_iq:<15} {f_ret_iq:<15} {f_short_name:<21}}}, \\{comment_str}'
|
||||
new_debug_vars[vname] = line
|
||||
|
||||
else:
|
||||
|
@ -216,7 +216,7 @@ def analyze_variables_across_files(c_files, h_files, include_dirs):
|
||||
return vars_in_file
|
||||
|
||||
optional_printf(PRINT_STATUS, "Parsing header files (.h)...")
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Parsing variables from headers"')
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Parsing variables from headers..."')
|
||||
total_h = len(h_files)
|
||||
for i, h in enumerate(h_files, 1):
|
||||
vars_in_h = parse_file(h)
|
||||
@ -232,7 +232,7 @@ def analyze_variables_across_files(c_files, h_files, include_dirs):
|
||||
optional_printf(PRINT_STATUS, f"Progress: {i}/{total_h}")
|
||||
|
||||
optional_printf(PRINT_STATUS, "Parsing source files (.c)...")
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Parsing variables from sources files"')
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Parsing variables from sources files..."')
|
||||
total_c = len(c_files)
|
||||
for i, c in enumerate(c_files, 1):
|
||||
vars_in_c = parse_file(c)
|
||||
@ -255,7 +255,7 @@ def analyze_variables_across_files(c_files, h_files, include_dirs):
|
||||
optional_printf(PRINT_STATUS, f"Progress: {i}/{total_c}")
|
||||
|
||||
optional_printf(PRINT_STATUS, "Checking which variables need explicit extern declaration...")
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Checking extern declarations"')
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Checking extern declarations..."')
|
||||
total_vars = len(unique_vars)
|
||||
for i, (name, info) in enumerate(unique_vars.items(), 1):
|
||||
if not info["extern"] and not info["static"] and info["file"].endswith('.c'):
|
||||
@ -377,7 +377,7 @@ def analyze_typedefs_and_struct(typedefs, structs):
|
||||
substituted_structs[resolved_sname] = substituted_fields """
|
||||
|
||||
# Раскрываем typedef'ы
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Resolving typedefs"')
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Resolving typedefs..."')
|
||||
total_typedefs = len(typedefs)
|
||||
resolved_typedefs = {}
|
||||
for i, tname in enumerate(typedefs, 1):
|
||||
@ -387,7 +387,7 @@ def analyze_typedefs_and_struct(typedefs, structs):
|
||||
optional_printf(PRINT_STATUS, f"Progress: {i}/{total_typedefs}")
|
||||
|
||||
# Теперь раскрываем вложенные структуры
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Resolving structs"')
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Resolving structs..."')
|
||||
total_structs = len(structs)
|
||||
resolved_structs = {}
|
||||
for i, (sname, fields) in enumerate(structs.items(), 1):
|
||||
@ -507,7 +507,7 @@ def analyze_typedefs_and_structs_across_files(c_files, include_dirs):
|
||||
visit(tu.cursor)
|
||||
return typedefs, structs
|
||||
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Resolving structs and typedefs"')
|
||||
optional_printf(PRINT_STATUS, 'Progress: "Resolving structs and typedefs..."')
|
||||
total_files = len(c_files)
|
||||
for i, c_file in enumerate(c_files, 1):
|
||||
typedefs_in_file, structs_in_file = parse_file(c_file)
|
||||
|
33
debug_vars.c
33
debug_vars.c
@ -4,32 +4,32 @@
|
||||
|
||||
// Èíêëþäû äëÿ äîñòóïà ê ïåðåìåííûì
|
||||
#include "RS_Functions_modbus.h"
|
||||
#include "xp_project.h"
|
||||
#include "dq_to_alphabeta_cos.h"
|
||||
#include "errors.h"
|
||||
#include "v_pwm24.h"
|
||||
#include "rotation_speed.h"
|
||||
#include "log_can.h"
|
||||
#include "vector.h"
|
||||
#include "adc_tools.h"
|
||||
#include "f281xpwm.h"
|
||||
#include "pwm_vector_regul.h"
|
||||
#include "dq_to_alphabeta_cos.h"
|
||||
#include "xp_project.h"
|
||||
#include "xp_write_xpwm_time.h"
|
||||
#include "pwm_vector_regul.h"
|
||||
#include "log_can.h"
|
||||
#include "f281xpwm.h"
|
||||
#include "adc_tools.h"
|
||||
#include "rotation_speed.h"
|
||||
#include "teta_calc.h"
|
||||
#include "RS_Functions.h"
|
||||
#include "x_parallel_bus.h"
|
||||
#include "detect_phase_break2.h"
|
||||
#include "svgen_dq.h"
|
||||
#include "xp_rotation_sensor.h"
|
||||
#include "Spartan2E_Functions.h"
|
||||
#include "xPeriphSP6_loader.h"
|
||||
#include "x_serial_bus.h"
|
||||
#include "xp_controller.h"
|
||||
#include "detect_phase_break2.h"
|
||||
#include "svgen_dq.h"
|
||||
#include "x_serial_bus.h"
|
||||
#include "x_parallel_bus.h"
|
||||
#include "log_params.h"
|
||||
#include "log_to_memory.h"
|
||||
#include "global_time.h"
|
||||
#include "CRC_Functions.h"
|
||||
#include "CAN_Setup.h"
|
||||
#include "log_params.h"
|
||||
#include "global_time.h"
|
||||
#include "log_to_memory.h"
|
||||
#include "pid_reg3.h"
|
||||
#include "IQmathLib.h"
|
||||
#include "doors_control.h"
|
||||
@ -314,8 +314,9 @@ extern int zero_ADC[20];
|
||||
|
||||
|
||||
// Îïðåäåëåíèå ìàññèâà ñ óêàçàòåëÿìè íà ïåðåìåííûå äëÿ îòëàäêè
|
||||
int DebugVar_Qnt = 1;
|
||||
int DebugVar_Qnt = 2;
|
||||
#pragma DATA_SECTION(dbg_vars,".dbgvar_info")
|
||||
DebugVar_t dbg_vars[] = {\
|
||||
{(char *)&ADC0finishAddr , pt_uint8 , iq12 , Addr }, \
|
||||
{(char *)&ADC0finishAddr, pt_uint8, iq7, pt_uint8, "asdasjjjjj" }, \
|
||||
{(char *)&ADC1finishAddr, pt_int16, iq_none, pt_int16, "ADC1finish" }, \
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user