From 0f94e7a0e00fed4dde18b3e77f48901e254a387f Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Sat, 15 Nov 2025 18:31:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=D1=81=D0=BA=D0=BE=D0=BB=D1=8C=D0=BA=D0=B8?= =?UTF-8?q?=D1=85=20=D0=B4=D0=B5=D1=84=D0=B0=D0=B9=D0=BD=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B2=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- McuLib/m/mexing.m | 43 ++++++++++++++++++++++++++++++++++++----- McuLib/m/periphConfig.m | 19 +++++++++++++++--- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/McuLib/m/mexing.m b/McuLib/m/mexing.m index a40e9c1..a9395a7 100644 --- a/McuLib/m/mexing.m +++ b/McuLib/m/mexing.m @@ -253,6 +253,38 @@ function definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, val_ return; end + % Вспомогательная функция для создания дефайнов + function newDefine = createDefine(def_name, val, isValueDefine) + if contains(def_name, '_MATDELIM_') + % Multiple values через пробел - создаем несколько дефайнов + def_names = strsplit(strtrim(def_name), '_MATDELIM_'); + newDefine = ''; + for i = 1:length(def_names) + single_def = strtrim(def_names{i}); + if ~isempty(single_def) + if isValueDefine + single_define = ['-D"' single_def '__EQ__' val '"']; + else + single_define = ['-D"' single_def '"']; + end + + if i == 1 + newDefine = single_define; + else + newDefine = [newDefine ' ' single_define]; + end + end + end + else + % Single value - создаем один дефайн + if isValueDefine + newDefine = ['-D"' def_name '__EQ__' val '"']; + else + newDefine = ['-D"' def_name '"']; + end + end + end + % Формирование дефайна в зависимости от типа параметра if val_define ~= 0 % Параметры с значениями @@ -261,27 +293,28 @@ function definesWrapperArg = addDefineByParam(definesWrapperArg, paramName, val_ val = evalin('base', val); % Вычисление выражений val = num2str(val); end - newDefine = ['-D"' def_name '__EQ__' val '"']; + newDefine = createDefine(def_name, val, true); + elseif ~strcmp(param.Type, 'popup') % Чекбоксы if mcuMask.read_checkbox(paramName) - newDefine = ['-D"' def_name '"']; + newDefine = createDefine(def_name, '', false); else newDefine = ''; end else % Выпадающие списки if strcmp(param.Alias, '') - newDefine = ['-D"' def_name '"']; + newDefine = createDefine(def_name, '', false); else - newDefine = ['-D"' def_name '__EQ__' val '"']; + newDefine = createDefine(def_name, val, true); end end % Добавление дефайна к результирующей строке if isempty(definesWrapperArg) || strlength(strtrim(definesWrapperArg)) == 0 definesWrapperArg = newDefine; - else + elseif ~isempty(newDefine) definesWrapperArg = definesWrapperArg + " " + newDefine; end end diff --git a/McuLib/m/periphConfig.m b/McuLib/m/periphConfig.m index c9e9dd0..bae9d6c 100644 --- a/McuLib/m/periphConfig.m +++ b/McuLib/m/periphConfig.m @@ -73,11 +73,10 @@ classdef periphConfig % Восстанавливаем таблицы после изменений customtable.restore_all_tables(tableNames, columns_backup); - catch + catch ME % В случае ошибки восстанавливаем таблицы customtable.restore_all_tables(tableNames, columns_backup); end - periphConfig.addUserFunctions(config.UserCode); end @@ -543,7 +542,7 @@ classdef periphConfig code = editCode.insertSection(code, '// PERIPH DEINIT', deinitFuncsText); % Записываем обновленный файл - fid = fopen(wrapPath, 'w', 'n', 'UTF-8'); + fid = fopen(wrapPath, 'w', 'n'); if fid == -1 error('Не удалось открыть файл для записи'); end @@ -667,9 +666,23 @@ classdef periphConfig param.TypeOptions = def.Options; end else + % Если def.Def - массив, записываем все элементы через пробел в Alias + if iscell(def.Def) || (isnumeric(def.Def) && numel(def.Def) > 1) + % Преобразуем массив в строку с элементами через пробел + if iscell(def.Def) + % Для cell-массива + aliasStr = strjoin(cellfun(@num2str, def.Def, 'UniformOutput', false), '_MATDELIM_'); + else + % Для числового массива + aliasStr = strjoin(arrayfun(@num2str, def.Def, 'UniformOutput', false), '_MATDELIM_'); + end + param.Alias = aliasStr; + else + % Одиночное значение param.Alias = def.Def; end end + end callback = sprintf('try periphConfig.periphParamCallback("%s"); catch end', paramName); param.Callback = callback;