mcu_matlab/McuLib/m/compiler.m
Razvalyaev 4c78383edf чуть структурированго но надо еще
перенести работу с конфигом в отдельную папку и реализовать конфиг для всего симулятора. Чтобы можно было легко переносить настройки оболочки
2025-06-16 00:28:13 +03:00

140 lines
5.1 KiB
Matlab
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

classdef compiler
methods(Static)
function compile()
addpath(mcuPath.get('wrapperPath'));
mexing(1);
end
function get_availbe()
addpath(mcuPath.get('wrapperPath'));
mexing(1);
end
function choose()
addpath(mcuPath.get('wrapperPath'));
mexing(1);
end
function updateRunBat()
sources = {
'MCU.c'
'mcu_wrapper.c'
};
% Список заголовочных файлов (.h)
includes = { '.\'
};
wrapperPath = mcuPath.get('wrapperPath');
% [wrapperPath, ~, ~] = fileparts(wrapperPath);
% Формируем строки
wrapperSrcText = compiler.createSourcesBat('code_WRAPPER', sources, wrapperPath);
wrapperIncText = compiler.createIncludesBat('includes_WRAPPER', includes, wrapperPath);
% Записываем результат
res = compiler.updateRunMexBat(wrapperSrcText, wrapperIncText, ':: WRAPPER BAT'); % Всё прошло успешно
if res == 0
return
end
sources = {
'app_wrapper.c'
'app_init.c'
'app_io.c'
};
% Список заголовочных файлов (.h)
includes = { '.\'
};
periphPath = mcuPath.get('appWrapperPath');
% Формируем строки
wrapperSrcText = compiler.createSourcesBat('code_APP_WRAPPER', sources, periphPath);
wrapperIncText = compiler.createIncludesBat('includes_APP_WRAPPER', includes, periphPath);
% Записываем результат
res = compiler.updateRunMexBat(wrapperSrcText, wrapperIncText, ':: APP WRAPPER BAT'); % Всё прошло успешно
periphConfig.updatePeriphRunMexBat();
end
function res = updateRunMexBat(srcText, incText, Section)
% Входные параметры:
% srcText - текст для записи set code_...
% incText - текст для записи set includes_...
%
% Возвращает:
% res - 0 при успехе, 1 при ошибке
periphBat = [srcText '\n\n' incText];
batPath = fullfile(mcuPath.get('wrapperPath'), 'run_mex.bat');
res = 1;
try
code = fileread(batPath);
code = regexprep(code, '\r\n?', '\n');
% Записываем строки srcText и incText с переносами строк
code = editCode.insertSection(code, Section, periphBat);
fid = fopen(batPath, 'w', 'n', 'UTF-8');
if fid == -1
error('Не удалось открыть файл для записи');
end
fwrite(fid, code);
fclose(fid);
res = 1;
catch ME
mcuMask.disp(0, '\nОшибка: неудачная запись в файл при записи файла: %s', ME.message);
end
end
function srcText = createSourcesBat(prefix_name, sources, path)
srcList = {};
if nargin >= 2 && iscell(sources)
for i = 1:numel(sources)
fullPath = fullfile(path, sources{i});
srcList{end+1} = strrep(fullPath, '\', '\\');
end
end
% Формируем srcText с переносами строк и ^
srcText = '';
for i = 1:numel(srcList)
if i < numel(srcList)
srcText = [srcText srcList{i} '^' newline ' '];
else
srcText = [srcText srcList{i}];
end
end
% Добавляем префикс
srcText = ['set ' prefix_name '=' srcText];
end
function incText = createIncludesBat(prefix_name, includes, path)
incList = {};
if nargin >= 2 && iscell(includes)
for i = 1:numel(includes)
fullPath = fullfile(path, includes{i});
incList{end+1} = ['-I"' strrep(fullPath, '\', '\\') '"'];
end
end
% Формируем incText с переносами строк и ^
incText = '';
for i = 1:numel(incList)
if i == 1 && numel(incList) ~= 1
incText = [incText incList{i} '^' newline];
elseif i < numel(incList)
incText = [incText ' ' incList{i} '^' newline];
else
incText = [incText ' ' incList{i}];
end
end
% Добавляем префикс
incText = ['set ' prefix_name '=' incText];
end
end
end