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