nickass писал(а): 29 окт 2023, 18:27
Решил в целях обучения создать блок...
В целях обучения лучше бы брать что попроще, ну что есть то есть.
nickass писал(а): 29 окт 2023, 18:27
...В секции декларирования ошибка Блок не корректен...
Вы здесь столкнулись с макросами, а FLProg (Basic редактор) их не понимает. Встроенная проверка синтаксиса штука, возможно, хорошая, но иногда очень мешает.
aidar_i писал(а): 29 окт 2023, 21:44
Превратить в функцию
В данном случае не вариант, т.к. макрос это не функция а "умная автозамена" для компилятора, т.е. один набор букв заменяется на другой с подстановкой аргументов.
Функция это программа, логически законченный набор операторов, символов и т.д. Макрос же - это, по сути, набор символов и просто так его в функцию не преобразовать.
Для данного случая:
1. В секциях программы заменить макросы на нужные участки кода.
для EVERY_MS(x):
[spoiler]
например:
в коде имеется участок
EVERY_MS(50) {
changeBright -= 5;
if (changeBright < 0) break;
strip.setBrightness(changeBright);
strip.show();
}
строку с EVERY_MS комментируем и добавляем (с соответствующей подстановкой) недостающее
// EVERY_MS(
50) {
//---- тело макроса, начало
static uint32_t tmr;
bool flag = millis() - tmr >= (
50);
if (flag) tmr = millis();
if (flag) {
//---- тело макроса, конец
changeBright -= 5;
if (changeBright < 0) break;
strip.setBrightness(changeBright);
strip.show();
}
ну и так далее.
Внимание на скобки!
!!!Обратите внимание!!! В строке 116 данный макрос закомментирован автором, подставлять ничего не надо, лучше просто удалить.
(в принципе, вместо EVERY_MS, можно вкрутить и родные FLProg_овские таймеры, но это, если кому то будет интересно, то он пусть и делает

)
[/spoiler]
Для FOR_
[spoiler]
строку
FOR_i(0, STEP_AMOUNT) {
комментируем, добавляем свою (с соответствующей подстановкой) и получаем
// FOR_i(
0,
STEP_AMOUNT) {
for(int i =
0; i < (
STEP_AMOUNT); i++) {
для остальных FOR_ аналогично.
[/spoiler]
само собой после этого строки декларирования макросов
[spoiler]
// ==== удобные макросы ====
#define FOR_i(from, to) for(int i = (from); i < (to); i++)
#define FOR_j(from, to) for(int j = (from); j < (to); j++)
#define FOR_k(from, to) for(int k = (from); k < (to); k++)
#define EVERY_MS(x) \
static uint32_t tmr;\
bool flag = millis() - tmr >= (x);\
if (flag) tmr = millis();\
if (flag)
//===========================
[/spoiler]
нужно закомментировать
[spoiler]
/*
// ==== удобные макросы ====
#define FOR_i(from, to) for(int i = (from); i < (to); i++)
#define FOR_j(from, to) for(int j = (from); j < (to); j++)
#define FOR_k(from, to) for(int k = (from); k < (to); k++)
#define EVERY_MS(x) \
static uint32_t tmr;\
bool flag = millis() - tmr >= (x);\
if (flag) tmr = millis();\
if (flag)
//===========================
*/
[/spoiler]
или убрать из скетча.
2. Далее, имеется файл effects.ino.
По моему мнению ВЕСЬ код из этого файла (предварительно проделав все аналогичные замены) желательно перенести в блок, раскидав по соответствующим секциям.
В теории, можно попробовать прикрепить отредактированный файл к скетчу, прописав его как библиотеку, но не пробовал, результат мне неизвестен.
Дальше, я думаю, справитесь.
Удачи.
P.S.
Этот скетч упаковывать в блок лучше в проф. редакторе.
Гораздо легче код разбить на отдельные участки и переносить в блок по очереди, на отдельные вкладки, проверяя на ошибки пробной поэтапной компиляцией.
Так же есть вероятность того, что если установить чекбокс "Запретить компилятору видеть #include" (проф. редактор) то и заменять в скетче ничего не нужно, но это надо проверять.