- сделан выбор папки с MCU Wrapper

- добавлен файл для работы с путями
- добавлен файл для работы с компилятором (не доделан)
This commit is contained in:
2025-06-15 10:25:24 +03:00
parent 966ddc3bac
commit 0a2fd71422
6 changed files with 423 additions and 296 deletions

168
McuLib/m/mcuPath.m Normal file
View File

@@ -0,0 +1,168 @@
classdef mcuPath
methods(Static)
function path = get(paramName)
blockPath = gcb;
path = get_param(blockPath, paramName);
end
function addSourceFileTable(targetParamName, message)
% Открываем проводник для выбора файлов
[files, pathstr] = uigetfile({ ...
'*.c;*.cpp', 'Исходные файлы (*.c, *.cpp)'; ...
'*.obj;*.lib', 'Библиотеки (*.obj, *.lib)'; ...
'*.*', 'Все файлы (*.*)'}, ...
message, ...
'MultiSelect', 'on');
if isequal(files, 0)
return; % Отмена выбора
end
if ischar(files)
files = {files}; % Один файл в cell
end
% Парсим строку в cell-массив
oldTable = customtable.parse(targetParamName);
% Добавляем новые пути, проверяя уникальность
for i = 1:numel(files)
fullpath = fullfile(pathstr, files{i});
rel = mcuPath.absoluteToRelativePath(fullpath);
if ~any(strcmp(rel, oldTable))
oldTable{end+1, 1} = rel;
end
end
% Парсим строку в cell-массив
customtable.collect(targetParamName, oldTable);
end
function addPathTable(targetParamName, message)
% Открываем проводник для выбора папок
pathstr = uigetdir(pwd, message);
if isequal(pathstr, 0)
return; % Отмена выбора
end
% Парсим таблицу
oldTable = customtable.parse(targetParamName);
rel = mcuPath.absoluteToRelativePath(pathstr);
% Проверяем наличие пути
if ~any(strcmp(rel, oldTable))
oldTable{end+1, 1} = rel;
end
% Собираем таблицу
customtable.collect(targetParamName, oldTable);
end
function addPath(targetParamName, message)
block = gcb;
mask = Simulink.Mask.get(block);
% Открываем окно выбора папки
folderPath = uigetdir('', 'Выберите папку');
% Проверка на отмену
if isequal(folderPath, 0)
return;
end
% Установка значения параметра маски
rel = mcuPath.absoluteToRelativePath(folderPath);
param = mask.getParameter(targetParamName);
param.Value = rel;
end
function addAnyFile(targetParamName, message)
block = gcbh;
mask = Simulink.Mask.get(block);
[file, path] = uigetfile({'*.*','Все файлы (*.*)'}, 'Выберите файл');
if isequal(file, 0) || isequal(path, 0)
% Отмена выбора ничего не делаем
return;
end
fullFilePath = fullfile(path, file);
rel = mcuPath.absoluteToRelativePath(fullFilePath);
param = mask.getParameter(targetParamName);
param.Value = rel;
end
function absPath = getAbsolutePath(relPath)
% relativeToAbsolutePath преобразует относительный путь в абсолютный.
%
% Если путь уже абсолютный возвращается он же, приведённый к канонической форме.
% Если путь относительный преобразуется относительно текущей директории.
% Проверка: абсолютный ли путь
if ispc
isAbsolute = ~isempty(regexp(relPath, '^[a-zA-Z]:[\\/]', 'once')) || startsWith(relPath, '\\');
else
isAbsolute = startsWith(relPath, '/');
end
if isAbsolute
% Канонизируем абсолютный путь (убираем ./, ../ и т.п.)
absPath = char(java.io.File(relPath).getCanonicalPath());
else
% Строим абсолютный путь от текущей директории
cwd = pwd;
combined = fullfile(cwd, relPath);
absPath = char(java.io.File(combined).getCanonicalPath());
end
end
function rel = absoluteToRelativePath(pathstr)
% absoluteToRelativePath преобразует абсолютный путь в относительный от текущей директории.
%
% Если путь находится в текущей директории или вложенной в неё добавляется префикс './'
% Если выше формируются переходы '..'
% Если путь совпадает с текущей директорией возвращается '.'
% Получаем текущую рабочую директорию
cwd = pwd;
% Преобразуем пути в канонические абсолютные пути
fullpath = char(java.io.File(pathstr).getCanonicalPath());
cwd = char(java.io.File(cwd).getCanonicalPath());
% Разбиваем пути на части
targetParts = strsplit(fullpath, filesep);
baseParts = strsplit(cwd, filesep);
% Находим длину общего префикса
j = 1;
while j <= min(length(targetParts), length(baseParts)) && strcmpi(targetParts{j}, baseParts{j})
j = j + 1;
end
% Формируем количество подъемов ".." из cwd
numUps = length(baseParts) - (j - 1);
ups = repmat({'..'}, 1, numUps);
% Оставшаяся часть пути после общего префикса
rest = targetParts(j:end);
% Объединяем для получения относительного пути
relParts = [ups, rest];
rel = fullfile(relParts{:});
% Если путь пустой это текущая директория
if isempty(rel)
rel = '.';
end
% Если путь не содержит ".." и начинается внутри текущей директории добавим './'
if ~isempty(rest) && isempty(ups)
rel = fullfile('.', rel);
end
end
end
end