diff --git a/MCU Wrapper.mltbx b/MCU Wrapper.mltbx index 64a60f7..f6b7b82 100644 Binary files a/MCU Wrapper.mltbx and b/MCU Wrapper.mltbx differ diff --git a/McuLib/m/mexing.m b/McuLib/m/mexing.m index 4524278..a9395a7 100644 --- a/McuLib/m/mexing.m +++ b/McuLib/m/mexing.m @@ -1,19 +1,18 @@ % Компилирует S-function для блока микроконтроллера в Simulink % compile_mode: 1 - компиляция, 0 - обновление конфигурации function res = mexing(compile_mode) - global Ts - Ts = 0.00001; % Установка глобального времени дискретизации if compile_mode == 1 + block = gcb; % === РЕЖИМ КОМПИЛЯЦИИ === setenv('VSLANG', '1033'); % Английский для Visual Studio % Обновление параметров блока - block = gcb; newName = get_param(block, 'sfuncName'); oldName = get_param(block, 'FunctionName'); if ~strcmp(newName, oldName) set_param(block, 'FunctionName', newName); % Обновление имени функции + mcuMask.setSFuncName(block); end newParam = get_param(block, 'sfuncParam'); @@ -254,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 % Параметры с значениями @@ -262,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 d89dcf5..bae9d6c 100644 --- a/McuLib/m/periphConfig.m +++ b/McuLib/m/periphConfig.m @@ -73,10 +73,11 @@ 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 function update() @@ -665,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; diff --git a/mcuwrapper.prj b/mcuwrapper.prj index 713f663..4681cec 100644 --- a/mcuwrapper.prj +++ b/mcuwrapper.prj @@ -7,7 +7,7 @@ Library for run MCU program in Simulink - 1.04 + 1.05 ${PROJECT_ROOT}\MCU Wrapper.mltbx @@ -100,12 +100,14 @@ - C:\Program Files\MATLAB\R2021b + C:\Program Files\MATLAB\R2023a + + @@ -127,6 +129,16 @@ true + + + true + + + + + true + + false