matlab_stm_emulate/config_reader.m
Razvalyaev ead46d7d82 переделана структура задавания дефайнов
теперь для дефайна используется альтернативное имя alias. и есть функция, которая выставляет дефайн по chekcbox/edit и его альтернативной функции

для конфигов такая механика тоже реализована - и  она работает
2025-06-12 12:08:34 +03:00

135 lines
3.7 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

clear; clc; close all;
model = 'mcu_test_r2023';
block = [model '/MCU_UPP'];
load_system(model); % если модель ещё не загружена
config = load_periph_config();
update_mask_from_config(block, config);
disp('Маска обновлена по конфигу');
%% чтение конфигов
function config = load_periph_config()
jsonText = fileread('periph_config.json');
config = jsondecode(jsonText);
end
%% запись дефайнов по конфигу
%% обновление маски
function update_mask_from_config(blockPath, config)
mask = Simulink.Mask.get(blockPath);
tabName = 'configTab'; % Имя вкладки (Prompt)
allControls = mask.getDialogControls();
tabCtrl = find_tab_by_name(allControls, tabName);
if isempty(tabCtrl)
error('Вкладка с названием "%s" не найдена в маске', tabName);
end
% Удаляем все контролы внутри вкладки
children = tabCtrl.DialogControls;
while ~isempty(children)
mask.removeParameter(children(1).Name);
children = tabCtrl.DialogControls; % обновляем список после удаления
end
periphs = fieldnames(config);
for i = 1:numel(periphs)
periph = periphs{i};
defines = config.(periph).Defines;
defNames = fieldnames(defines);
for j = 1:numel(defNames)
defPrompt = defNames{j};
def = defines.(defPrompt);
% Обрабатываем только checkbox и edit
switch lower(def.Type)
case 'checkbox'
paramType = 'checkbox';
case 'edit'
paramType = 'edit';
otherwise
continue;
end
paramName = matlab.lang.makeValidName([defPrompt]);
val = def.Default;
if islogical(val)
if val
valStr = 'on';
else
valStr = 'off';
end
elseif isnumeric(val)
valStr = num2str(val);
elseif ischar(val)
valStr = val;
else
error('Unsupported default value type for %s.%s', periph, defPrompt);
end
% Добавляем параметр в маску (без TabName)
mask.addParameter(...
'Type', paramType, ...
'Prompt', defPrompt, ...
'Name', paramName, ...
'Value', valStr, ...
'Container', tabName);
param = mask.getParameter(paramName);
param.Alias = def.Def;
end
end
end
%% поиск вкладки
function tab = find_tab_by_name(controls, targetName)
tab = [];
for i = 1:numel(controls)
ctrl = controls(i);
% Проверяем, вкладка ли это и совпадает ли имя
if isa(ctrl, 'Simulink.dialog.Tab') && strcmp(ctrl.Name, targetName)
tab = ctrl;
return;
end
% Если это контейнер — обходим его детей
children = get_children(ctrl);
if ~isempty(children)
tab = find_tab_by_name(children, targetName);
if ~isempty(tab)
return;
end
end
end
end
function children = get_children(ctrl)
if isprop(ctrl, 'DialogControls')
children = ctrl.DialogControls;
elseif isprop(ctrl, 'Controls')
children = ctrl.Controls;
elseif isprop(ctrl, 'Children')
children = ctrl.Children;
else
children = [];
end
end