Игрался с Jinx!, захотел фейерверк из встроенных скриптов. Выглядит он примерно так (один канал):
Первым делом записал ролик с анимацей в файл, скинул на флешку, но захотелось большего: чтобы повторений не было, чтобы было отдельным эффектом и тому подобное. Пустил трансляцию из Jinx! напрямую на гирлянду, 600 светодиодов потребовали уменьшить скорость эффекта, но в целом выглядело прилично. Смущала лишь необходимость наличия компьютера
Попробовал сходу создать и добавить новый эффект прямо в прошивку, но столкнулся с кучей проблем из-за отсутствия отладчика. Чтобы исправлять одну опечатку нужно ждать пересборки и заливки, для понимания "да что ж тебе не нравится" нужно расставить кучу отладочных сообщений, понять что не так... В общем, долго и не эффективно.
Решил набросать эмулятор матрицы на Love2D (Lua(jit) под капотом, есть отладчик, перенос с C/C++ на Lua довольно простой). Набросал затычки и упрощённые функции вызываемые из FastLED, взял несколько эффектов из прошивки, чуток пошаманил - вуаля (
исходники для Love2D), эффекты очень почти похожи на реальные:
Заработали как простенькие снегопады и матрицы, так и эффекты на шуме Перлина (правда, генератор самого шума перенести из FastLED я не осилил, как-то там очень железозависимо, поэтому взял готовый из Love2D). А вот, собственно, и сам реализованный фейерверк, почти полностью повторяющий оригинальный из Jinx!:
Добавил пару мелочей для красоты, типа затухания частиц и обсчёта их за экраном (чтобы улетающие вверх могли упасть обратно вниз). Но опять появилось НО, Lua - язык без строгой типизации, все приведения типов автоматические. Если использовать возможности luajit, то можно делать примерно так:
local int_array = ffi.new("int[3]", {}) и быть уверенным, что любой элемент не станет внезапно
double, но "дословного" поведения C-кода, ессно, не будет. Да и обратно перенести код из Lua в C/C++ тот ещё гемор, массивы индексируются с 1, а не 0, циклы for итерируются включительно, а не i < max, и тд.
И тут вижу коммит с описанием "Совместимость проекта с FastLED 3.9.4". Полез трогать, что это такое и как-то прям сразу нагуглил (точнее, надакдачил) четырехлетний
fastled-wasm от jandelgado - модифицированные примеры для компиляции через WebAssymbly, то есть FastLED в браузере. Понял, что это то, что нужно, и чуть позже вышел на
https://pypi.org/project/fastled/ , питоновский модуль для компиляции своего кода и запуска его в браузере.
Из версии 3.9.4 взял пару 2D-примеров, сделал по инструкции
pip install fastled, в каталоге с примером просто запустил команду
fastled - оно живое и работает в браузере!! Меняешь пару строк в коде, тут же автоматически происходит перекомпиляция и через несколько секунд наблюдаешь обновлённый результат.
Я, наверное, сильно отстал от моды, но для меня это было просто волшебно. Ессно, тут же нашёл первый "косяк", по умолчанию код компилируется через веб-сервис, что немного удлинняет процесс и непонятно, сколько времени это будет ещё работать. Чтобы запустить собственный локальный компилятор нужно ставить локальный docker (минус 10-20 Гб на диске и 2-3 Гб оперативки). Но таки всё установил с такой-то матерью и начал переносить фейерверк для внедрения в прошивку. Собсно,
вот код, а вот и результат в виде веб-эмулятора (ссылка под картинкой):
Реально, с локальным компилятором любое изменение буквально через 5-10 секунд сразу же видно.
Сходу брать и добавлять эффект в прошивку я побоялся, поэтому прошу помощи.
Во-первых, я где-то накосячил и салют получился с "искорками", которых не планировалось (гифка не передаст, но в эмуляторе они очень заметны). Что-то с работой с цветом или адресацией светодиодов, может кто более в FastLED понимающий поправит.
Во-вторых, там всякие float-ы и прочие синусы. Оптимизировать под железо, память и архитектуру я совсем никак, поэтому в примерах и никакого контроля ресурсов и их освобождения. Может и тут кто поможет
Опус сей назначался теоретическим создателям новых и крутых эффектов, которых, как и меня, останавливало лишь отсутствие отладчиков.