тест конфигов (пока не работает)

This commit is contained in:
Razvalyaev 2025-06-12 07:48:50 +03:00
parent 99ec69324d
commit fffd725d91
7 changed files with 320 additions and 14 deletions

121
config_reader.asv Normal file
View File

@ -0,0 +1,121 @@
clear; clc; close all;
model = 'mcu_test_r2023';
block = [model '/MCU_UPP'];
load_system(model); % если модель ещё не загружена
update_mask_from_config(block);
disp('Маска обновлена по конфигу.');
function update_mask_from_config(blockPath)
config = load_periph_config();
mask = Simulink.Mask.get(blockPath);
tabPrompt = 'Config Peripheral'; % Название вкладки, как отображается в маске
controls = mask.getDialogControls();
% Выведем все контролы и их свойства для отладки
fprintf('Всего контролов: %d\n', numel(controls));
for k = 1:numel(controls)
ctrl = controls(k);
props = properties(ctrl);
fprintf('Контрол #%d: Name="%s", Prompt="%s", Style="%s"\n', ...
k, ctrl.Name, ctrl.Prompt, ctrl.Style);
end
% Ищем вкладку по Prompt
tabIdx = find(arrayfun(@(c) strcmp(c.Style,'tab') && strcmp(c.Prompt, tabPrompt), controls), 1);
if isempty(tabIdx)
error('Вкладка с названием "%s" не найдена.', tabPrompt);
end
tabName = controls(tabIdx).Name;
fprintf('Найдена вкладка: Name="%s"\n', tabName);
% Удаляем параметры из найденной вкладки
i = 1;
while i <= numel(mask.Parameters)
if strcmp(mask.Parameters(i).TabName, tabName)
mask.removeParameter(i);
else
i = i + 1;
end
end
% Добавляем параметры в эту вкладку
periphs = fieldnames(config);
for i = 1:numel(periphs)
periph = periphs{i};
defines = config.(periph).Defines;
defNames = fieldnames(defines);
for j = 1:numel(defNames)
defName = defNames{j};
def = defines.(defName);
val = def.Default;
if islogical(val)
valStr = mat2str(val);
elseif isnumeric(val)
valStr = num2str(val);
elseif ischar(val)
valStr = ['''' val ''''];
else
error('Unsupported default value type for %s.%s', periph, defName);
end
mask.addParameter( ...
'Type', def.Type, ...
'Prompt', [periph ' - ' defName], ...
'Name', [periph '_' defName], ...
'Value', valStr, ...
'TabName', tabName ...
);
end
end
end
function config = load_periph_config()
jsonText = fileread('periph_config.json');
config = jsondecode(jsonText);
end
function config = load_periph_config()
jsonText = fileread('periph_config.json');
config = jsondecode(jsonText);
end
function clear_params_from_tab(blockPath, tabPrompt)
mask = Simulink.Mask.get(blockPath);
controls = mask.getDialogControls;
tabs = controls(strcmp({controls.Type}, 'tab'));
tabName = '';
for i = 1:numel(tabs)
if strcmp(tabs(i).Prompt, tabPrompt)
tabName = tabs(i).Name; % внутреннее имя вкладки
break;
end
end
if isempty(tabName)
error('Вкладка с названием "%s" не найдена.', tabPrompt);
end
% Удаляем параметры с TabName == tabName
i = 1;
while i <= numel(mask.Parameters)
if strcmp(mask.Parameters(i).TabName, tabName)
mask.removeParameter(i);
else
i = i + 1;
end
end
end

147
config_reader.m Normal file
View File

@ -0,0 +1,147 @@
clear; clc; close all;
model = 'mcu_test_r2023';
block = [model '/MCU_UPP'];
load_system(model); % если модель ещё не загружена
update_mask_from_config(block);
disp('Маска обновлена по конфигу.');
function update_mask_from_config(blockPath)
config = load_periph_config();
mask = Simulink.Mask.get(blockPath);
tabPrompt = 'Config Peripheral'; % Название вкладки, как отображается в маске
controls = mask.getDialogControls();
allTabs = find_all_tabs(mask);
fprintf('Найдено вкладок: %d\n', numel(allTabs));
for i = 1:numel(allTabs)
fprintf('Tab %d: Name="%s", Prompt="%s"\n', i, allTabs(i).Name, allTabs(i).Prompt);
end
% Ищем вкладку по Prompt
tabIdx = find(arrayfun(@(c) strcmp(c.Style,'tab') && strcmp(c.Prompt, tabPrompt), controls), 1);
if isempty(tabIdx)
error('Вкладка с названием "%s" не найдена.', tabPrompt);
end
tabName = controls(tabIdx).Name;
fprintf('Найдена вкладка: Name="%s"\n', tabName);
% Удаляем параметры из найденной вкладки
i = 1;
while i <= numel(mask.Parameters)
if strcmp(mask.Parameters(i).TabName, tabName)
mask.removeParameter(i);
else
i = i + 1;
end
end
% Добавляем параметры в эту вкладку
periphs = fieldnames(config);
for i = 1:numel(periphs)
periph = periphs{i};
defines = config.(periph).Defines;
defNames = fieldnames(defines);
for j = 1:numel(defNames)
defName = defNames{j};
def = defines.(defName);
val = def.Default;
if islogical(val)
valStr = mat2str(val);
elseif isnumeric(val)
valStr = num2str(val);
elseif ischar(val)
valStr = ['''' val ''''];
else
error('Unsupported default value type for %s.%s', periph, defName);
end
mask.addParameter( ...
'Type', def.Type, ...
'Prompt', [periph ' - ' defName], ...
'Name', [periph '_' defName], ...
'Value', valStr, ...
'TabName', tabName ...
);
end
end
end
function tabs = find_all_tabs(mask)
controls = mask.getDialogControls();
tabs = find_tabs_recursive(controls);
end
function tabs = find_tabs_recursive(controls)
tabs = [];
for i = 1:numel(controls)
ctrl = controls(i);
% Проверяем тип контролла (у разных версий API может отличаться)
% Чтобы не упасть, проверяем, есть ли поле Type
if isprop(ctrl, 'Type')
if strcmp(ctrl.Type, 'tab')
tabs = [tabs, ctrl]; %#ok<AGROW>
elseif any(strcmp(ctrl.Type, {'tabcontainer', 'group', 'panel'}))
% В этих контролах могут быть свои Controls или Children
if isprop(ctrl, 'Controls')
subtabs = find_tabs_recursive(ctrl.Controls);
elseif isprop(ctrl, 'Children')
subtabs = find_tabs_recursive(ctrl.Children);
else
subtabs = [];
end
tabs = [tabs, subtabs]; %#ok<AGROW>
end
else
% Если у контролла нет свойства Type - игнорируем
end
end
end
function config = load_periph_config()
jsonText = fileread('periph_config.json');
config = jsondecode(jsonText);
end
function clear_params_from_tab(blockPath, tabPrompt)
mask = Simulink.Mask.get(blockPath);
controls = mask.getDialogControls;
tabs = controls(strcmp({controls.Type}, 'tab'));
tabName = '';
for i = 1:numel(tabs)
if strcmp(tabs(i).Prompt, tabPrompt)
tabName = tabs(i).Name; % внутреннее имя вкладки
break;
end
end
if isempty(tabName)
error('Вкладка с названием "%s" не найдена.', tabPrompt);
end
% Удаляем параметры с TabName == tabName
i = 1;
while i <= numel(mask.Parameters)
if strcmp(mask.Parameters(i).TabName, tabName)
mask.removeParameter(i);
else
i = i + 1;
end
end
end

BIN
matlab.mat Normal file

Binary file not shown.

Binary file not shown.

View File

@ -1,14 +0,0 @@
void app_init() {
// code of foo
}
void app_step() {
// code of foo
}
void app_readInputs() {
// code of foo
}
void app_writeOutputBuffer() {
// code of foo
}

26
periph_config.asv Normal file
View File

@ -0,0 +1,26 @@
{
"ADC1": {
"Defines": {
"ENABLE": {
"Type": "checkbox",
"Default": true
},
"SAMPLE_RATE": {
"Type": "edit",
"Default": 48000
}
}
},
"USART1": {
"Defines": {
"ENABLE": {
"Type": "checkbox",
"Default": false
},
"BAUDRATE": {
"Type": "edit",
"Default": 115200
}
}
}
}

26
periph_config.json Normal file
View File

@ -0,0 +1,26 @@
{
"ADC1": {
"Defines": {
"ENABLE": {
"Type": "checkbox",
"Default": true
},
"SAMPLE_RATE": {
"Type": "edit",
"Default": 48000
}
}
},
"USART1": {
"Defines": {
"ENABLE": {
"Type": "checkbox",
"Default": false
},
"BAUDRATE": {
"Type": "edit",
"Default": 115200
}
}
}
}