From 0a4a87038ec3e1187c780e8365f96e34e86ee045 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 12 Jun 2025 19:50:54 +0300 Subject: [PATCH] =?UTF-8?q?=D1=87=D1=83=D1=82=D1=8C=20=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=BB=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=B4=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE,=20=D0=BD?= =?UTF-8?q?=D0=BE=20=D1=89=D0=B0=20=D1=80=D0=B5=D1=88=D0=B8=D0=BB=20=D1=81?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20=D0=BF=D0=B0=D1=80=D1=81?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B0=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=B2=D0=BA=D0=BB=D0=B0=D0=B4=D0=BA=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config_reader.asv | 159 -------------- config_reader.m | 134 ------------ mcu_test_r2023.slx | Bin 67826 -> 68374 bytes mexing.asv | 513 ++++++++++++++++++++++++++++++--------------- mexing.m | 511 ++++++++++++++++++++++++++++++-------------- periph_config.asv | 38 ---- 6 files changed, 701 insertions(+), 654 deletions(-) delete mode 100644 config_reader.asv delete mode 100644 config_reader.m delete mode 100644 periph_config.asv diff --git a/config_reader.asv b/config_reader.asv deleted file mode 100644 index bd9c938..0000000 --- a/config_reader.asv +++ /dev/null @@ -1,159 +0,0 @@ -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'; % Имя вкладки (Prompt) - - allControls = mask.getDialogControls(); - tabCtrl = find_tab_by_prompt(allControls, tabPrompt); - - if isempty(tabCtrl) - error('Вкладка с названием "%s" не найдена в маске', tabPrompt); - end - - % Удаляем все контролы внутри вкладки - children = tabCtrl.DialogControls; - while ~isempty(children) - tabCtrl.removeControl(children(1)); - 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([periph '_' 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', tabPrompt); - - disp(['paramType = ', paramType]); - disp(['paramName = ', paramName]); - 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 - - -%% поиск вкладки -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 - diff --git a/config_reader.m b/config_reader.m deleted file mode 100644 index 5915015..0000000 --- a/config_reader.m +++ /dev/null @@ -1,134 +0,0 @@ -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 - diff --git a/mcu_test_r2023.slx b/mcu_test_r2023.slx index 2e50257579797f33b842bb4d762a87947071c3f6..07ba88c2a90d8907dfa7380850346998fe2b5b4c 100644 GIT binary patch delta 47394 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 G0RMk-KmG9l diff --git a/mexing.asv b/mexing.asv index 1f19a0c..384b703 100644 --- a/mexing.asv +++ b/mexing.asv @@ -1,59 +1,54 @@ % Компилирует S-function -clear, clc -close; - - -Ts = 0.00001; - -delete("*.mexw64") -delete("*.mexw64.pdb") -delete(".\MCU_Wrapper\Outputs\*.*"); -set_param(gcb, 'consoleOutput', ''); - -% Флаг режима отладки -definesWrapperArg = buildWrapperDefinesString(); -definesUserArg = parseDefinesMaskText(); -definesConfigArg = buildConfigDefinesString(); -definesAllArg = [definesUserArg + " " + definesWrapperArg + " " + definesConfigArg]; - - -if read_checkbox('enableDebug') - modeArg = "debug"; -else - modeArg = "release"; +function mexing(compile_mode) + global Ts + Ts = 0.00001; + + if compile_mode == 1 + delete("*.mexw64") + delete("*.mexw64.pdb") + delete(".\MCU_Wrapper\Outputs\*.*"); + set_param(gcb, 'consoleOutput', ''); + % Дефайны + definesWrapperArg = buildWrapperDefinesString(); + definesUserArg = parseDefinesMaskText(); + definesConfigArg = buildConfigDefinesString(); + definesAllArg = [definesUserArg + " " + definesWrapperArg + " " + definesConfigArg]; + + %режимы компиляции + if read_checkbox('enableDebug') + modeArg = "debug"; + else + modeArg = "release"; + end + if read_checkbox('fullOutput') || read_checkbox('extConsol') + echoArg = 'echo_enable'; + else + echoArg = 'echo_disable'; + end + + [includesArg, codeArg] = make_mex_arguments('incTable', 'srcTable'); + + % Вызов батника с двумя параметрами: includes и code + cmd = sprintf('.\\MCU_Wrapper\\run_mex.bat "%s" "%s" "%s" %s %s', includesArg, codeArg, definesAllArg, modeArg, echoArg); + + if read_checkbox('extConsol') + cmdout = runBatAndShowOutput(cmd); + else + [status, cmdout]= system(cmd); + end + + % Сохраним вывод в параметр маски с именем 'consoleOutput' + set_param(gcb, 'consoleOutput', cmdout); + + beep + else + blockPath = bdroot; + config = load_periph_config(); + update_mask_from_config(blockPath, config); + % set_param(gcb, 'consoleOutput', 'Peripheral configuration file loaded. Re-open Block Parameters'); + end end -if read_checkbox('fullOutput') || read_checkbox('extConsol') - echoArg = 'echo_enable'; -else - echoArg = 'echo_disable'; - -end - -[includesArg, codeArg] = make_mex_arguments('incTable', 'srcTable'); - -% Вызов батника с двумя параметрами: includes и code -cmd = sprintf('.\\MCU_Wrapper\\run_mex.bat "%s" "%s" "%s" %s %s', includesArg, codeArg, definesAllArg, modeArg, echoArg); - - - -if read_checkbox('extConsol') - cmdout = runBatAndShowOutput(cmd); -else - [status, cmdout]= system(cmd); -end - -% Сохраним вывод в параметр маски с именем 'consoleOutput' -set_param(gcb, 'consoleOutput', cmdout); - -% % Обновим Mask Display для показа -% maskDisplayStr = sprintf('disp(''%s'')', cmdout); -% set_param(gcb, 'MaskDisplay', maskDisplayStr); - -beep - - - %% COMPILE PARAMS @@ -103,45 +98,11 @@ function definesWrapperArg = buildWrapperDefinesString() definesWrapperArg = addDefineByParam(definesWrapperArg, 'enableDeinit', 0); definesWrapperArg = addDefineByParam(definesWrapperArg, 'threadCycles', 1); definesWrapperArg = addDefineByParam(definesWrapperArg, 'mcuClk', 1); - - % blockHandle = gcbh; - % - % % Получаем MaskValues и MaskNames - % maskValues = get_param(blockHandle, 'MaskValues'); - % paramNames = get_param(blockHandle, 'MaskNames'); - % - % % Индексы параметров - % idxCycles = find(strcmp(paramNames, 'threadCycles')); - % idxClk = find(strcmp(paramNames, 'mcuClk')); - % - % % Значения - % cyclesVal = maskValues{idxCycles}; - % clkMHz = str2double(maskValues{idxClk}); - % clkHz = round(clkMHz * 1e6); - % - % % Формируем defines в формате: -D"NAME=VALUE" - % if read_checkbox('enableThreading') - % def1 = ['-D"RUN_APP_MAIN_FUNC_THREAD"']; - % else - % def1 = ['']; - % end - % - % if read_checkbox('enableDeinit') - % def2 = ['-D"DEINITIALIZE_AFTER_SIM"']; - % else - % def2 = ['']; - % end - % - % def3 = ['-D"DEKSTOP_CYCLES_FOR_MCU_APP__EQ__' cyclesVal '"']; - % def4 = ['-D"MCU_CORE_CLOCK__EQ__' num2str(clkHz) '"']; - % - % definesWrapperArg = strjoin({def1, def2, def3, def4}, ' '); end function definesUserArg = parseDefinesMaskText() blockHandle = gcbh; - % Получаем MaskValues и MaskNames maskValues = get_param(blockHandle, 'MaskValues'); paramNames = get_param(blockHandle, 'MaskNames'); @@ -208,52 +169,25 @@ function definesWrapperArg = buildConfigDefinesString() children = tabCtrl.DialogControls; for i = 1:numel(children) ctrl = children(i); -isprop(ctrl, 'Type') -isprop(ctrl, 'Name') - if isprop(ctrl, 'Type') && isprop(ctrl, 'Name') - switch lower(ctrl.Type) - case 'checkbox' - definesWrapperArg = addDefineByParam(definesWrapperArg, ctrl.ParameterName, 0); - case 'edit' - definesWrapperArg = addDefineByParam(definesWrapperArg, ctrl.ParameterName, 1); - otherwise - % Пропускаем другие типы + % Получаем имя параметра из контрола + paramName = ctrl.Name; + try + % Получаем объект параметра по имени + param = mask.getParameter(paramName); + + % Определяем тип параметра + switch lower(param.Type) + case 'checkbox' + definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 0); + case 'edit' + definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, 1); + otherwise + % Необрабатываемые типы + end + catch ME + warning('Не удалось получить параметр "%s": %s', paramName, ME.message); end - end end - - % blockHandle = gcbh; - % - % % Получаем MaskValues и MaskNames - % maskValues = get_param(blockHandle, 'MaskValues'); - % paramNames = get_param(blockHandle, 'MaskNames'); - % - % % Индексы параметров - % idxCycles = find(strcmp(paramNames, 'threadCycles')); - % idxClk = find(strcmp(paramNames, 'mcuClk')); - % - % % Значения - % cyclesVal = maskValues{idxCycles}; - % clkMHz = str2double(maskValues{idxClk}); - % clkHz = round(clkMHz * 1e6); - % - % % Формируем defines в формате: -D"NAME=VALUE" - % if read_checkbox('enableThreading') - % def1 = ['-D"RUN_APP_MAIN_FUNC_THREAD"']; - % else - % def1 = ['']; - % end - % - % if read_checkbox('enableDeinit') - % def2 = ['-D"DEINITIALIZE_AFTER_SIM"']; - % else - % def2 = ['']; - % end - % - % def3 = ['-D"DEKSTOP_CYCLES_FOR_MCU_APP__EQ__' cyclesVal '"']; - % def4 = ['-D"MCU_CORE_CLOCK__EQ__' num2str(clkHz) '"']; - % - % definesWrapperArg = strjoin({def1, def2, def3, def4}, ' '); end @@ -344,42 +278,6 @@ function checkbox_state = read_checkbox(checkboxName) 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 - %% CONSOLE FUNCTIONS function cmdret = runBatAndShowOutput(cmd) @@ -456,3 +354,284 @@ function logWindow_append(line) jTextArea.setCaretPosition(jTextArea.getDocument.getLength); drawnow; end + + +%% READ CONFIGS +function config = load_periph_config() + jsonText = fileread('periph_config.json'); + config = jsondecode(jsonText); +end + +%% CONFIG MASK TOOLS +function update_mask_from_config(blockPath, config) + blockPath = [blockPath '/MCU']; + + % Проверяем, была ли маска открыта + wasOpen = isMaskDialogOpen(blockPath); + close_system(blockPath, 0); + mask = Simulink.Mask.get(blockPath); + + tableNames = {'incTable', 'srcTable'}; + columns_backup = clear_tables(blockPath, tableNames); + + containerName = 'configTabAll'; + clear_all_from_container(mask, containerName); + + % Ищем контейнер, в который будем добавлять вкладки + allControls = mask.getDialogControls(); + container = find_container_by_name(allControls, containerName); + if isempty(container) + error('Контейнер "%s" не найден в маске.', containerName); + end + + % Проходим по каждому модулю (ADC, TIM...) + periphs = fieldnames(config); + for i = 1:numel(periphs) + periph = periphs{i}; + defines = config.(periph).Defines; + defNames = fieldnames(defines); + + % Создаём вкладку для модуля + tabCtrl = mask.addDialogControl( ... + 'Type', 'Tab', ... + 'Prompt', periph, ... + 'Name', [periph '_Tab'], ... + 'Container', containerName ... + ); + + 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) + valStr = logical(val) * "on" + ~val * "off"; + elseif isnumeric(val) + valStr = num2str(val); + elseif ischar(val) + valStr = val; + else + error('Unsupported default value type for %s.%s', periph, defPrompt); + end + + % Добавляем параметр в соответствующую вкладку + mask.addParameter( ... + 'Type', paramType, ... + 'Prompt', defPrompt, ... + 'Name', paramName, ... + 'Value', valStr, ... + 'Container', periph ... + ); + + param = mask.getParameter(paramName); + param.Alias = def.Def; + end + end + + % Восстанавливаем таблицы + restore_tables(blockPath, tableNames, columns_backup); + + % Повторно открываем маску, если она была открыта + if wasOpen + open_system(blockPath, 'mask'); + end +end + + + +function clear_all_from_container(mask, containerName) +% Очищает все параметры и вкладки внутри указанного контейнера + + allControls = mask.getDialogControls(); + container = find_container_by_name(allControls, containerName); + + if isempty(container) + error('Контейнер с именем "%s" не найден.', containerName); + end + + children = container.DialogControls; + + for i = numel(children):-1:1 + ctrl = children(i); + try + % Пытаемся удалить как контрол (вкладка, контейнер и пр.) + mask.removeDialogControl(ctrl.Name); + catch + try + % Если не получилось — пробуем как параметр + res = mask.removeParameter(ctrl.Name); + catch + warning('Не удалось удалить "%s".', ctrl.Name); + end + end + end +end + + +function isOpen = isMaskDialogOpen(blockPath) + isOpen = false; + + try + % Получаем имя блока + blockName = get_param(blockPath, 'Name'); + + % Получаем список окон MATLAB GUI + jWindows = java.awt.Window.getWindows(); + + for i = 1:numel(jWindows) + win = jWindows(i); + + % Проверка, что окно видимое и активно + if win.isShowing() + try + title = char(win.getTitle()); + % Проверка по ключевому слову, соответствующему заголовку маски + if contains(title, ['Mask Editor: ' blockName]) || ... + contains(title, ['Mask: ' blockName]) || ... + contains(title, blockName) + isOpen = true; + return; + end + catch + % Окно не имеет заголовка — пропускаем + end + end + end + catch + isOpen = false; + end +end + + + +function column_titles = clear_tables(block, table_names) + % Очищает столбцы в каждой таблице из массива имен table_names + % Возвращает cell-массив с названиями первых столбцов каждой таблицы + + % Получить объект маски блока + maskObj = Simulink.Mask.get(block); + + % Инициализировать cell-массив для хранения названий столбцов + column_titles = cell(size(table_names)); + + for k = 1:numel(table_names) + table_name = table_names{k}; + + % Получить объект управления таблицей + tableControl = maskObj.getDialogControl(table_name); + + % Получить количество столбцов + nCols = tableControl.getNumberOfColumns; + + if nCols > 0 + % Получить первый столбец (который будем удалять) + column = tableControl.getColumn(1); + column_titles{k} = column.Name; + + % Удаляем все столбцы + % Важно: при удалении столбцов индексы меняются, + % поэтому удаляем всегда первый столбец nCols раз + for i = 1:nCols + tableControl.removeColumn(1); + end + else + % Если столбцов нет, возвращаем пустую строку + column_titles{k} = ''; + end + end +end + +function restore_tables(block, table_names, column_titles) + % Восстанавливает первый столбец в каждой таблице из массива имен + % Использует массив column_titles для установки имени столбца + + % Получить объект маски блока + maskObj = Simulink.Mask.get(block); + + for k = 1:numel(table_names) + table_name = table_names{k}; + title = column_titles{k}; + + % Получить объект управления таблицей + tableControl = maskObj.getDialogControl(table_name); + + % Добавить новый столбец + column = tableControl.addColumn(Name='title', Type='edit'); + column.Name = title; + 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 container = find_container_by_name(controls, targetName) + container = []; + + for i = 1:numel(controls) + ctrl = controls(i); + + % Проверяем, контейнер ли это и совпадает ли имя + if isa(ctrl, 'Simulink.dialog.Container') && strcmp(ctrl.Name, targetName) + container = ctrl; + return; + end + + % Если это вложенный контрол — обходим его детей + children = get_children(ctrl); + if ~isempty(children) + container = find_container_by_name(children, targetName); + if ~isempty(container) + 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 diff --git a/mexing.m b/mexing.m index dae1b07..3be5e77 100644 --- a/mexing.m +++ b/mexing.m @@ -1,59 +1,54 @@ % Компилирует S-function -clear, clc -close; - - -Ts = 0.00001; - -delete("*.mexw64") -delete("*.mexw64.pdb") -delete(".\MCU_Wrapper\Outputs\*.*"); -set_param(gcb, 'consoleOutput', ''); - -% Флаг режима отладки -definesWrapperArg = buildWrapperDefinesString(); -definesUserArg = parseDefinesMaskText(); -definesConfigArg = buildConfigDefinesString(); -definesAllArg = [definesUserArg + " " + definesWrapperArg + " " + definesConfigArg]; - - -if read_checkbox('enableDebug') - modeArg = "debug"; -else - modeArg = "release"; +function mexing(compile_mode) + global Ts + Ts = 0.00001; + + if compile_mode == 1 + delete("*.mexw64") + delete("*.mexw64.pdb") + delete(".\MCU_Wrapper\Outputs\*.*"); + set_param(gcb, 'consoleOutput', ''); + % Дефайны + definesWrapperArg = buildWrapperDefinesString(); + definesUserArg = parseDefinesMaskText(); + definesConfigArg = buildConfigDefinesString(); + definesAllArg = [definesUserArg + " " + definesWrapperArg + " " + definesConfigArg]; + + %режимы компиляции + if read_checkbox('enableDebug') + modeArg = "debug"; + else + modeArg = "release"; + end + if read_checkbox('fullOutput') || read_checkbox('extConsol') + echoArg = 'echo_enable'; + else + echoArg = 'echo_disable'; + end + + [includesArg, codeArg] = make_mex_arguments('incTable', 'srcTable'); + + % Вызов батника с двумя параметрами: includes и code + cmd = sprintf('.\\MCU_Wrapper\\run_mex.bat "%s" "%s" "%s" %s %s', includesArg, codeArg, definesAllArg, modeArg, echoArg); + + if read_checkbox('extConsol') + cmdout = runBatAndShowOutput(cmd); + else + [status, cmdout]= system(cmd); + end + + % Сохраним вывод в параметр маски с именем 'consoleOutput' + set_param(gcb, 'consoleOutput', cmdout); + + beep + else + blockPath = bdroot; + config = load_periph_config(); + update_mask_from_config(blockPath, config); + % set_param(gcb, 'consoleOutput', 'Peripheral configuration file loaded. Re-open Block Parameters'); + end end -if read_checkbox('fullOutput') || read_checkbox('extConsol') - echoArg = 'echo_enable'; -else - echoArg = 'echo_disable'; - -end - -[includesArg, codeArg] = make_mex_arguments('incTable', 'srcTable'); - -% Вызов батника с двумя параметрами: includes и code -cmd = sprintf('.\\MCU_Wrapper\\run_mex.bat "%s" "%s" "%s" %s %s', includesArg, codeArg, definesAllArg, modeArg, echoArg); - - - -if read_checkbox('extConsol') - cmdout = runBatAndShowOutput(cmd); -else - [status, cmdout]= system(cmd); -end - -% Сохраним вывод в параметр маски с именем 'consoleOutput' -set_param(gcb, 'consoleOutput', cmdout); - -% % Обновим Mask Display для показа -% maskDisplayStr = sprintf('disp(''%s'')', cmdout); -% set_param(gcb, 'MaskDisplay', maskDisplayStr); - -beep - - - %% COMPILE PARAMS @@ -103,45 +98,11 @@ function definesWrapperArg = buildWrapperDefinesString() definesWrapperArg = addDefineByParam(definesWrapperArg, 'enableDeinit', 0); definesWrapperArg = addDefineByParam(definesWrapperArg, 'threadCycles', 1); definesWrapperArg = addDefineByParam(definesWrapperArg, 'mcuClk', 1); - - % blockHandle = gcbh; - % - % % Получаем MaskValues и MaskNames - % maskValues = get_param(blockHandle, 'MaskValues'); - % paramNames = get_param(blockHandle, 'MaskNames'); - % - % % Индексы параметров - % idxCycles = find(strcmp(paramNames, 'threadCycles')); - % idxClk = find(strcmp(paramNames, 'mcuClk')); - % - % % Значения - % cyclesVal = maskValues{idxCycles}; - % clkMHz = str2double(maskValues{idxClk}); - % clkHz = round(clkMHz * 1e6); - % - % % Формируем defines в формате: -D"NAME=VALUE" - % if read_checkbox('enableThreading') - % def1 = ['-D"RUN_APP_MAIN_FUNC_THREAD"']; - % else - % def1 = ['']; - % end - % - % if read_checkbox('enableDeinit') - % def2 = ['-D"DEINITIALIZE_AFTER_SIM"']; - % else - % def2 = ['']; - % end - % - % def3 = ['-D"DEKSTOP_CYCLES_FOR_MCU_APP__EQ__' cyclesVal '"']; - % def4 = ['-D"MCU_CORE_CLOCK__EQ__' num2str(clkHz) '"']; - % - % definesWrapperArg = strjoin({def1, def2, def3, def4}, ' '); end function definesUserArg = parseDefinesMaskText() blockHandle = gcbh; - % Получаем MaskValues и MaskNames maskValues = get_param(blockHandle, 'MaskValues'); paramNames = get_param(blockHandle, 'MaskNames'); @@ -227,39 +188,6 @@ function definesWrapperArg = buildConfigDefinesString() warning('Не удалось получить параметр "%s": %s', paramName, ME.message); end end - - % blockHandle = gcbh; - % - % % Получаем MaskValues и MaskNames - % maskValues = get_param(blockHandle, 'MaskValues'); - % paramNames = get_param(blockHandle, 'MaskNames'); - % - % % Индексы параметров - % idxCycles = find(strcmp(paramNames, 'threadCycles')); - % idxClk = find(strcmp(paramNames, 'mcuClk')); - % - % % Значения - % cyclesVal = maskValues{idxCycles}; - % clkMHz = str2double(maskValues{idxClk}); - % clkHz = round(clkMHz * 1e6); - % - % % Формируем defines в формате: -D"NAME=VALUE" - % if read_checkbox('enableThreading') - % def1 = ['-D"RUN_APP_MAIN_FUNC_THREAD"']; - % else - % def1 = ['']; - % end - % - % if read_checkbox('enableDeinit') - % def2 = ['-D"DEINITIALIZE_AFTER_SIM"']; - % else - % def2 = ['']; - % end - % - % def3 = ['-D"DEKSTOP_CYCLES_FOR_MCU_APP__EQ__' cyclesVal '"']; - % def4 = ['-D"MCU_CORE_CLOCK__EQ__' num2str(clkHz) '"']; - % - % definesWrapperArg = strjoin({def1, def2, def3, def4}, ' '); end @@ -350,42 +278,6 @@ function checkbox_state = read_checkbox(checkboxName) 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 - %% CONSOLE FUNCTIONS function cmdret = runBatAndShowOutput(cmd) @@ -462,3 +354,310 @@ function logWindow_append(line) jTextArea.setCaretPosition(jTextArea.getDocument.getLength); drawnow; end + + +%% READ CONFIGS +function config = load_periph_config() + jsonText = fileread('periph_config.json'); + config = jsondecode(jsonText); +end + +%% CONFIG MASK TOOLS +function update_mask_from_config(blockPath, config) + blockPath = [blockPath '/MCU']; + + % Проверяем, была ли маска открыта + wasOpen = isMaskDialogOpen(blockPath); + close_system(blockPath, 0); + mask = Simulink.Mask.get(blockPath); + + tableNames = {'incTable', 'srcTable'}; + columns_backup = clear_tables(blockPath, tableNames); + + containerName = 'configTabAll'; + clear_all_from_container(mask, containerName); + + % Ищем контейнер, в который будем добавлять вкладки + allControls = mask.getDialogControls(); + container = find_container_by_name(allControls, containerName); + if isempty(container) + error('Контейнер "%s" не найден в маске.', containerName); + end + + % Проходим по каждому модулю (ADC, TIM...) + periphs = fieldnames(config); + for i = 1:numel(periphs) + periph = periphs{i}; + defines = config.(periph).Defines; + defNames = fieldnames(defines); + + % Создаём вкладку для модуля + tabCtrl = mask.addDialogControl( ... + 'Type', 'Tab', ... + 'Prompt', periph, ... + 'Name', [periph '_Tab'], ... + 'Container', containerName ... + ); + + 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) + valStr = logical(val) * "on" + ~val * "off"; + elseif isnumeric(val) + valStr = num2str(val); + elseif ischar(val) + valStr = val; + else + error('Unsupported default value type for %s.%s', periph, defPrompt); + end + + % Добавляем параметр в соответствующую вкладку + mask.addParameter( ... + 'Type', paramType, ... + 'Prompt', defPrompt, ... + 'Name', paramName, ... + 'Value', valStr, ... + 'Container', periph ... + ); + + param = mask.getParameter(paramName); + param.Alias = def.Def; + end + end + + % Восстанавливаем таблицы + restore_tables(blockPath, tableNames, columns_backup); + + % Повторно открываем маску, если она была открыта + if wasOpen + open_system(blockPath, 'mask'); + end +end + +function clear_all_from_container(mask, containerName) + allControls = mask.getDialogControls(); + container = find_container_by_name(allControls, containerName); + if isempty(container) + warning('Контейнер "%s" не найден.', containerName); + return; + end + + % Рекурсивно собрать все параметры (не вкладки) + paramsToDelete = collect_all_parameters(container); + + % Удаляем все параметры + for i = 1:numel(paramsToDelete) + try + mask.removeParameter(paramsToDelete{i}); + catch + warning('Не удалось удалить параметр %s', paramsToDelete{i}); + end + end + + % Рекурсивно удалить все вкладки внутри контейнера + delete_all_tabs(mask, container); +end + +function params = collect_all_parameters(container) + params = {}; + children = container.DialogControls; + for i = 1:numel(children) + ctrl = children(i); + if isa(ctrl, 'Simulink.dialog.Tab') + % Если вкладка — рекурсивно собираем параметры внутри неё + params = [params, collect_all_parameters(ctrl)]; + else + % Иначе это параметр — добавляем имя + params{end+1} = ctrl.Name; %#ok + end + end +end + +function delete_all_tabs(mask, container) + children = container.DialogControls; + % Идём в обратном порядке, чтобы безопасно удалять + for i = numel(children):-1:1 + ctrl = children(i); + if isa(ctrl, 'Simulink.dialog.Tab') + % Рекурсивно удаляем вкладки внутри текущей вкладки + delete_all_tabs(mask, ctrl); + try + mask.removeParameter(ctrl.Name); + catch + warning('Не удалось удалить вкладку %s', ctrl.Name); + end + end + end +end + + +function isOpen = isMaskDialogOpen(blockPath) + isOpen = false; + + try + % Получаем имя блока + blockName = get_param(blockPath, 'Name'); + + % Получаем список окон MATLAB GUI + jWindows = java.awt.Window.getWindows(); + + for i = 1:numel(jWindows) + win = jWindows(i); + + % Проверка, что окно видимое и активно + if win.isShowing() + try + title = char(win.getTitle()); + % Проверка по ключевому слову, соответствующему заголовку маски + if contains(title, ['Mask Editor: ' blockName]) || ... + contains(title, ['Mask: ' blockName]) || ... + contains(title, blockName) + isOpen = true; + return; + end + catch + % Окно не имеет заголовка — пропускаем + end + end + end + catch + isOpen = false; + end +end + + + +function column_titles = clear_tables(block, table_names) + % Очищает столбцы в каждой таблице из массива имен table_names + % Возвращает cell-массив с названиями первых столбцов каждой таблицы + + % Получить объект маски блока + maskObj = Simulink.Mask.get(block); + + % Инициализировать cell-массив для хранения названий столбцов + column_titles = cell(size(table_names)); + + for k = 1:numel(table_names) + table_name = table_names{k}; + + % Получить объект управления таблицей + tableControl = maskObj.getDialogControl(table_name); + + % Получить количество столбцов + nCols = tableControl.getNumberOfColumns; + + if nCols > 0 + % Получить первый столбец (который будем удалять) + column = tableControl.getColumn(1); + column_titles{k} = column.Name; + + % Удаляем все столбцы + % Важно: при удалении столбцов индексы меняются, + % поэтому удаляем всегда первый столбец nCols раз + for i = 1:nCols + tableControl.removeColumn(1); + end + else + % Если столбцов нет, возвращаем пустую строку + column_titles{k} = ''; + end + end +end + +function restore_tables(block, table_names, column_titles) + % Восстанавливает первый столбец в каждой таблице из массива имен + % Использует массив column_titles для установки имени столбца + + % Получить объект маски блока + maskObj = Simulink.Mask.get(block); + + for k = 1:numel(table_names) + table_name = table_names{k}; + title = column_titles{k}; + + % Получить объект управления таблицей + tableControl = maskObj.getDialogControl(table_name); + + % Добавить новый столбец + column = tableControl.addColumn(Name='title', Type='edit'); + column.Name = title; + 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 container = find_container_by_name(controls, targetName) + container = []; + + for i = 1:numel(controls) + ctrl = controls(i); + + % Проверяем, контейнер ли это и совпадает ли имя + if isa(ctrl, 'Simulink.dialog.Container') && strcmp(ctrl.Name, targetName) + container = ctrl; + return; + end + + % Если это вложенный контрол — обходим его детей + children = get_children(ctrl); + if ~isempty(children) + container = find_container_by_name(children, targetName); + if ~isempty(container) + 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 diff --git a/periph_config.asv b/periph_config.asv deleted file mode 100644 index 2b420ab..0000000 --- a/periph_config.asv +++ /dev/null @@ -1,38 +0,0 @@ -{ - "ADC": { - "Defines": { - "ADC1 Enable": { - "Def": "ADC1_ENABLE", - "Type": "checkbox", - "Default": true - }, - "ADC2 Enable": { - "Def": "ADC2_ENABLE", - "Type": "checkbox", - "Default": true - }, - "SAMPLE_RATE": { - "Type": "edit", - "Default": 48000 - } - } - }, - "TIM": { - "Defines": { - "TIM1 Enable": { - "Def": "ADC1_ENABLE", - "Type": "checkbox", - "Default": true - }, - "TIM2 Enable": { - "Def": "ADC2_ENABLE", - "Type": "checkbox", - "Default": true - }, - "AHB Buf Clock Rate": { - "Type": "edit", - "Default": 72 - } - } - } -}