Мой блог
Как устроена подсветка Flydigi Charging Dock 2 Pro и почему сторонний редактор делает её лучше
Оригинальная подсветка док-станции Flydigi Charging Dock 2 Pro в связке с фирменным приложением Flydigi Space Station нередко выглядит ступенчатой и блеклой на переходах. Причина заключается не в аппаратных ограничениях светодиодной матрицы, а в программных алгоритмах рендеринга и передачи кадров, заложенных производителем.
Анализ прошивки и логики работы показал, что устройство функционирует исключительно как пассивный приемник готовых массивов данных. Чтобы исправить недочеты штатного софта, был создан открытый редактор подсветки FlyGlow, который рассчитывает анимацию в перцептивном цветовом пространстве и устраняет рывки при воспроизведении.
Как штатное ПО Space Station формирует эффекты
Фирменная экосистема Flydigi построена на разделении обязанностей: графическая оболочка Space Station работает на базе Electron, а взаимодействие с оборудованием обеспечивает системная служба на платформе .NET. Сами световые сценарии генерируются непосредственно в JavaScript-коде пользовательского интерфейса, после чего служба лишь транслирует сформированные байты на контроллер док-станции.
Изучение встроенных генераторов анимации выявило несколько фундаментальных проблем, влияющих на визуальное качество:
- Фиксированная длина цикла: каждый эффект жестко ограничен ровно 50 кадрами. При выборе низкой скорости анимации один кадр удерживается более 100 миллисекунд, из-за чего плавное движение превращается в заметное глазу слайд-шоу.
- Линейное смешивание в sRGB: интерполяция значений происходит напрямую в гамма-кодированном пространстве. Физически и перцептивно такой подход некорректен, поэтому в середине перехода между двумя яркими цветами появляется темный и ненасыщенный «грязный» провал.
- Построение градиентов через HSL: модель HSL неравномерна для человеческого зрения, в результате чего желтый и голубой секторы растягиваются в широкие полосы, а синие оттенки теряют глубину.
- Округление при затухании: расчет снижения яркости ведется по 8-битным целочисленным значениям с отсечением остатка вниз. На минимальных уровнях светимости разница даже в одну единицу отчетливо заметна, поэтому эффект пульсации обрывается резкими рывками.
Ключевая особенность док-станции заключается в том, что она не создает анимацию автономно. Аксессуар лишь последовательно выводит полученный набор кадров, а значит, подготовка более качественного потока данных полностью решает проблему плавности.

Технические возможности и протокол док-станции
Базовую расшифровку протокола связи устройства выполнили разработчики проекта OpenFlydigi, создававшие утилиту под Linux для геймпада Apex 5 и дока CD2. Проверка параметров проводилась на устройстве с прошивкой версии 0.0.3.9 через стандартный HID-интерфейс.
Аппаратная часть док-станции и спецификация обмена данными имеют следующие характеристики:
- Идентификаторы USB: VID 37D7, PID 6001, обмен через HID-отчеты размером по 64 байта.
- Матрица: 162 адресных RGB-светодиода, скомпонованных в треугольную шестиугольную сетку из 16 рядов (от 14 и 16 элементов в верхних рядах до 3 в основании).
- Буфер анимации: однобайтовый счетчик позволяет загружать до 255 кадров на цикл, хотя оригинальная программа Space Station задействует максимум 200.
- Временной шаг: задержка задается блоками по 20 миллисекунд, что обеспечивает предельную частоту обновления до 50 кадров в секунду.
- Уровни яркости: градация от 1 до 100 единиц.
- Процесс передачи: команда 97 инициирует сеанс загрузки, после чего команда 98 передает блоки данных по 50 байт с обязательным подтверждением приема.
Структура пакета лаконична: стартовые маркеры 0x5A 0xA5, идентификатор команды, размер полезной нагрузки, сами данные и однобайтная контрольная сумма (сумма байтов от команды до конца блока данных). Заголовок конфигурации занимает шесть байт (количество кадров, шаг по времени, яркость, режим, направление и объем палитры), за которыми следуют массивы цвета из расчета 486 байт на один кадр (162 диода по 3 байта RGB).
На отправку одного пакета с учетом подтверждения уходит около 9 миллисекунд, поэтому полный кадр заливается примерно за 85 миллисекунд, а загрузка цепочки из 200 кадров длится порядка 17 секунд. Такая скорость исключает интерактивное управление в реальном времени, как в OpenRGB, но полностью подходит для предварительно рассчитанных циклов.

Стоит отметить поведение встроенной памяти устройства: при записи она не затирается. Если в заголовке указать объем кадров больший, чем передано фактически, контроллер начнет циклически воспроизводить мусор и фрагменты старой анимации. Кроме того, в официальном клиенте обнаружена ошибка смещения на единицу при подсчете числа пакетов, если длина массива кратна 50. В кастомном редакторе такие объемы кадров исключены на этапе генерации.
Работа с цветом: переход на линейный свет и OKLab
Значения цвета в стандартном sRGB не отражают реальный световой поток из-за гамма-компенсации: например, уровень 50% по шкале sRGB эквивалентен всего примерно 21% фактической мощности излучения. Редактор FlyGlow переводит все внутренние расчеты и наложение слоев в линейное пространство, благодаря чему смешивание цветов соответствует физике распространения света.
Для создания градиентов простого линейного пространства недостаточно, так как зрение воспринимает приращение яркости нелинейно. Чтобы исключить неравномерности, используется цветовая модель OKLab, созданная Бьёрном Оттоссоном. В ней перцептивные расстояния между оттенками сбалансированы, а расчет перехода между точками происходит равномерно по координатам светлоты и хроматических осей.
Дополнительно в генераторе реализованы следующие принципы:
- Затухание по шкале восприятия: поскольку человеческий глаз оценивает яркость пропорционально кубическому корню из светового потока, параметр интенсивности задается в относительных единицах восприятия и переводится в линейные значения возведением в куб, устраняя резкое гашение на темном конце.
- Равномерный радужный спектр: ключевые спектральные точки расставляются пропорционально дистанциям в OKLab, исключая раздутые желто-голубые участки.
- Настройка гаммы: так как светодиоды с широтно-импульсной модуляцией светят линейно входному сигналу, в память устройства передаются линейные величины, а для любителей картинки штатного софта предусмотрен отдельный регулятор гаммы.
Проблема 8 бит и реализация временного дизеринга
При использовании линейного пространства возникает сложность в диапазоне около нуля: минимальный уровень свечения в 8-битном канале составляет 1/255 от максимума, что приводит к ступенчатому угасанию светодиодов в темноте.

Эту проблему решает временной дизеринг. Ошибка квантования, возникающая при округлении значений каждого отдельного светодиода, накапливается и переносится в следующий кадр. Поскольку воспроизведение закольцовано, генерация выполняется в два полных прохода. Для финальной записи сохраняются данные только второго цикла: в этом случае ошибка, приходящая на первый кадр, точно соответствует погрешности, накопившейся к завершению анимации.
Бесшовное зацикливание процедурной анимации
Любой скачок между финальным и начальным кадром циклично проигрываемой сцены сразу бросается в глаза. В архитектуре FlyGlow каждый алгоритмический эффект представляет собой чистую математическую функцию от относительной фазы цикла в пределах от 0 до 1, исключая внутренние таймеры и накапливаемые состояния.
Для создания органических текстур, таких как сияние, пламя или плазма, применяется четырехмерный процедурный шум. Временная шкала сворачивается в окружность в двух дополнительных измерениях: при значениях фазы 0 и 1 координаты на окружности строго совпадают, что гарантирует абсолютную бесшовность цикла без искусственного сглаживания на краях. Стабильность работы всех встроенных эффектов контролируется автотестами, проверяющими отсутствие неопределенных значений NaN и резких перепадов между соседями.
Параллельная работа с фирменной службой Windows
Первоначальный прототип утилиты передавал готовые массивы через локальный именованный канал системной службы Flydigi по протоколу Protobuf. Однако служба поддерживает подключение только одного клиента: при открытом окне Space Station канал оказывался занят.

Решением стало совместное открытие низкоуровневого дескриптора HID-устройства в Windows с флагами FILE_SHARE_READ и FILE_SHARE_WRITE. В таком режиме операционная система передает входящие отчеты контроллера во все задействованные дескрипторы. Утилита фильтрует чужие пакеты по идентификаторам команд и отслеживает собственные квитанции, благодаря чему кастомный софт может напрямую шить анимацию в док, пока оригинальная программа управляет подключенным геймпадом.
Возможности редактора FlyGlow
Интерфейс приложения разработан на базе C++20 и Qt 6 Widgets. Он ориентирован на ручную компоновку и точную настройку световых схем:
- Многослойный рендеринг: поддерживаются режимы наложения «Обычный», «Сложение», «Экран», «Умножение» и «Замена светлым» с индивидуальной настройкой прозрачности и масками, нарисованными кистью.
- Покадровая анимация: рисование привязано к гексагональной сетке матрицы, размер кисти измеряется кольцами ячеек, а между ключевыми кадрами на шкале времени применяется интерполяция в OKLab.
- Импорт медиафайлов: видео и GIF-анимации декодируются встроенными средствами Media Foundation без внешних кодеков. Для исключения мерцания мелких деталей каждый светодиод вычисляет цвет усреднением по 19 точкам внутри своей шестиугольной области в линейном свете.
- Двуязычный интерфейс: переключение между русским и английским языками происходит мгновенно без перезапуска программы.
Перспективы развития проекта
В дальнейшем планируется исследовать алгоритмы подсветки непосредственно для геймпадов Vader 5 Pro и Apex 5. Их контроллеры поддерживают короткие циклы примерно по 10 кадров, поэтому основной упор будет сделан на улучшение цветовых переходов, а не на микрошаги по времени.

Кроме того, в прошивке док-станции обнаружена сервисная команда прямой записи единичного кадра, не задействованная производителем. Если время ее исполнения окажется минимальным, это позволит реализовать режим фоновой синхронизации с монитором, визуализацию музыки и интеграцию со сторонними экосистемами вроде OpenRGB.
