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