тест конфигов (пока не работает)
This commit is contained in:
		
							parent
							
								
									99ec69324d
								
							
						
					
					
						commit
						fffd725d91
					
				
							
								
								
									
										121
									
								
								config_reader.asv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								config_reader.asv
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										147
									
								
								config_reader.m
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										
											BIN
										
									
								
								matlab.mat
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										14
									
								
								mycode.c
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								mycode.c
									
									
									
									
									
								
							@ -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
									
								
							
							
						
						
									
										26
									
								
								periph_config.asv
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										26
									
								
								periph_config.json
									
									
									
									
									
										Normal 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
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user