2 Commits

Author SHA1 Message Date
Razvalyaev
194ca126fb release 1.05
Добавлена поддержка нескольких дефайнов в конфиге
Фикс обновления имени S-Function
2026-04-22 15:58:16 +03:00
Razvalyaev
0b6807bd2c release 1.04.1
фикс кривой записи файлов для matlab 2021
2025-11-12 15:59:30 +03:00
9 changed files with 64 additions and 17 deletions

Binary file not shown.

View File

@@ -74,7 +74,7 @@ classdef appWrap
code = editCode.insertSection(code, section, newBody);
% Сохраняем изменения прямо из MATLAB без внешних редакторов
fid = fopen(filename, 'w', 'n', 'UTF-8');
fid = fopen(filename, 'w', 'n');
if fid == -1
errordlg('Не удалось сохранить файл из MATLAB', 'Ошибка записи');
return;

View File

@@ -89,7 +89,7 @@ classdef compiler
code = editCode.insertSection(code, Section, periphBat);
% Записываем обновленный BAT-файл
fid = fopen(batPath, 'w', 'n', 'UTF-8');
fid = fopen(batPath, 'w', 'n');
if fid == -1
error('Не удалось открыть файл для записи');
end

View File

@@ -105,7 +105,7 @@ classdef configJs
jsonText = jsonencode(config, 'PrettyPrint', true);
% Записываем JSON в файл
fid = fopen(config_path, 'w', 'n', 'UTF-8');
fid = fopen(config_path, 'w', 'n');
if fid == -1
error('Не удалось открыть файл periph_config.json для записи.');
end

View File

@@ -167,7 +167,7 @@ classdef mcuMask
updatedText = regexprep(fileText, pattern, newLine);
% Запись изменений обратно в файл
fid = fopen(cFilePath, 'w', 'n', 'UTF-8');
fid = fopen(cFilePath, 'w', 'n');
if fid == -1
error('Не удалось открыть файл для записи.');
end

View File

@@ -46,7 +46,7 @@ classdef mcuPorts
code = editCode.insertSection(code, '// INPUT/OUTPUTS AUTO-PARAMS', headerText.AUTO_PARAMS);
% Записываем обновленный заголовочный файл
fid = fopen(hPath, 'w', 'n', 'UTF-8');
fid = fopen(hPath, 'w', 'n');
if fid == -1
error('Не удалось открыть файл для записи');
end
@@ -57,7 +57,7 @@ classdef mcuPorts
code = editCode.insertSection(cCode, '// INPUT/OUTPUTS AUTO-PARAMS', cText);
% Записываем обновленный файл реализации
fid = fopen(cPath, 'w', 'n', 'UTF-8');
fid = fopen(cPath, 'w', 'n');
if fid == -1
error('Не удалось открыть файл для записи');
end

View File

@@ -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

View File

@@ -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()
@@ -541,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
@@ -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;

View File

@@ -7,7 +7,7 @@
<param.summary>Library for run MCU program in Simulink</param.summary>
<param.description />
<param.screenshot />
<param.version>1.04</param.version>
<param.version>1.05</param.version>
<param.output>${PROJECT_ROOT}\MCU Wrapper.mltbx</param.output>
<param.products.name />
<param.products.id />