mcu_matlab/McuLib/m/appWrap.m
2025-06-19 13:29:33 +03:00

154 lines
8.1 KiB
Matlab
Raw Permalink 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 appWrap
methods(Static)
function appWrapperFunc()
block = gcb;
% Получаем имя функции и путь к файлам
[filename, section, tool, example]= appWrap.getAppWrapperUserFile(block);
mcuMask.tool(tool, example);
% Загружаем содержимое файла
set_param(block, 'appWrapperCode', '');
try
code = fileread(filename);
code = regexprep(code, '\r\n?', '\n'); % нормализуем окончания строк
includesText = editCode.extractSection(code, section);
set_param(block, 'appWrapperCode', includesText);
catch
end
% % Поиск тела обычной функции
% expr = sprintf('void %s()', sel);
% funcBody = editCode.extractSection(code, expr);
% set_param(block, 'wrapperCode', funcBody);
end
function saveAppWrapperCode()
block = gcb;
% Получаем имя функции и путь к файлам
[filename, section] = appWrap.getAppWrapperUserFile(block);
if ~isfile(filename)
errordlg(['Файл не найден: ', filename]);
return;
end
sel = get_param(block, 'appWrapperFunc');
basePath = get_param(block, 'appWrapperPath');
if isempty(basePath)
errordlg('Не указан путь к файлам обёртки (wrapperPath).');
return;
end
newBody = get_param(block, 'appWrapperCode');
code = fileread(filename);
code = regexprep(code, '\r\n?', '\n');
newBody = strrep(newBody, '\', '\\');
code = editCode.insertSection(code, section, newBody);
% else
% % Обновляем тело функции
% expr = sprintf('void %s()', sel);
% code = editCode.insertSection(code, expr, newBody);
% end
fid = fopen(filename, 'w', 'n', 'UTF-8');
if fid == -1
errordlg('Не удалось открыть файл для записи');
return;
end
fwrite(fid, code);
fclose(fid);
mcuMask.disp(1, ['Обновлено: ' sel]);
end
function openAppWrapperCode()
block = gcb;
% Получаем имя функции и путь к файлам
filename = mcuPath.getAbsolutePath(appWrap.getAppWrapperUserFile(block));
if exist(filename, 'file') == 2
% Формируем команду без кавычек
cmd = sprintf('rundll32.exe shell32.dll,OpenAs_RunDLL %s', filename);
status = system(cmd);
if status ~= 0
errordlg('Не удалось открыть окно выбора приложения.');
end
else
errordlg('Файл не найден');
end
end
%% SPECIFIC TOOLS
function [filename, section, tool, example] = getAppWrapperUserFile(block, sel)
if (nargin < 2)
sel = get_param(block, 'appWrapperFunc');
end
basePath = mcuPath.get('appWrapperPath');
if isempty(basePath)
errordlg('Не указан путь к файлам обёртки (wrapperPath).');
return;
end
% Формируем путь к файлу в зависимости от типа запроса
if strcmp(sel, 'Includes')
filename = fullfile(basePath, 'app_includes.h');
section = '// INCLUDES';
tool = 'Инклюды для доступа к коду МК в коде оболочке';
example = '#include "main.h"';
elseif strcmp(sel, 'Dummy')
filename = fullfile(basePath, 'app_wrapper.c');
section = '// DUMMY';
tool = 'Заглушки для различных функций и переменных';
example = ['CAN_HandleTypeDef hcan = {0};' newline...
'void hardware_func(handle *huart) {}' newline...
'int wait_for_hardware_flag(int *flag) {' newline...
' return 1;' newline...
'}' newline...
''];
elseif strcmp(sel, 'App Init')
filename = fullfile(basePath, 'app_init.c');
section = '// USER APP INIT';
tool = ['Код для инициализации приложения МК.' newline newline...
'Вызов функций инициализации, если не используется отдельный поток для main().'];
example = 'init_func();';
elseif strcmp(sel, 'App Step')
filename = fullfile(basePath, 'app_wrapper.c');
section = '// USER APP STEP';
tool = ['Код приложения МК для вызова в шаге симуляции.' newline newline ...
'Вызов функций программы МК, если не используется отдельный поток для main().'];
example = 'step_func();';
elseif strcmp(sel, 'App Inputs')
filename = fullfile(basePath, 'app_io.c');
section = '// USER APP INPUT';
tool = ['Работа с буффером для портов S-Function' newline newline ...
'Буфер в начале хранит входные порты S-Function, далее идут выходные порты:' newline ...
'Buffer[0:15] - входной порт, Buffer[16:31] - входной 1 порт, ' newline ...
'Buffer[32:47] - выходной 1 порт, Buffer[48:63] - выходной 2 порт'];
example = ['// чтение 1-го элемента 0-го входного массива' newline...
'app_variable_2 = ReadInputArray(0, 1);' newline newline...
'// запись в буфер выходов' newline ...
'app_variable_2 = Buffer[10];'];
elseif strcmp(sel, 'App Outputs')
filename = fullfile(basePath, 'app_io.c');
section = '// USER APP OUTPUT';
tool = ['Работа с буффером для портов S-Function' newline newline ...
'Буфер в начале хранит входные порты S-Function, далее идут выходные порты:' newline ...
'Buffer[0:15] - входной порт, Buffer[16:31] - входной 1 порт, ' newline ...
'Buffer[32:47] - выходной 1 порт, Buffer[48:63] - выходной 2 порт'];
example = ['// запись в 1-й элемент 0-го выходного массива' newline...
'WriteOutputArray(app_variable, 0, 1);' newline newline ...
'// запись в буфер выходов' newline ...
'Buffer[XD_OUTPUT_START + 10] = app_variable_2;'];
elseif strcmp(sel, 'App Deinit')
filename = fullfile(basePath, 'app_init.c');
section = '// USER APP DEINIT';
tool = ['Код для деинициализации приложения МК.' newline newline ...
'Можно деинициализировать приложение МК, для повторного запуска.'];
example = 'memset(&htim1, sizeof(htim1), 0;';
else
tool = '';
mcuMask.disp(0, '\nОшибка выбора типа секции кода: неизвестное значение');
end
end
end
end