Почему дешёвая подсветка док-станции Flydigi заставила меня сделать свою собственную

Прокомментировать Просмотры: 0

В моём распоряжении имеется контроллер Flydigi Vader 5 Pro вместе с док-станцией Charging Dock 2 Pro, которая распознается операционной системой как «Flydigi CD2». Конструкция подставки включает 162 RGB-светодиода, объединенных в треугольную гексагональную матрицу. Сами по себе диоды весьма качественные: демонстрируют высокую яркость, равномерность свечения и отличную цветопередачу. Однако стоковые пресеты из фирменного ПО Flydigi Space Station производили удручающее впечатление: медленные переходы напоминали ступенчатое слайд-шоу, смешивание двух оттенков образовывало грязноватые грязно-серые участки, а переливы радуги распадались на резкие полосы.

Возникла необходимость выяснить, кроется ли корень проблемы в аппаратной части или же в софте. Спойлер: виновато программное обеспечение. В результате был разработан FlyGlow — альтернативный инструмент с открытым исходным кодом для тонкой настройки подсветки этой станции. Ниже подробно разобраны особенности штатных алгоритмов, принципы передачи кадров на устройство, недостатки заводской цветопередачи и способы добиться идеальной плавности.


Как Space Station генерирует визуальные эффекты

Утилита Space Station построена на базе Electron, а взаимодействие с железом возложено на фоновый сервис, написанный на .NET. Вся математика анимаций просчитывается непосредственно в JavaScript-интерпретаторе оболочки, после чего готовый фреймрейт транслируется в док. Анализ исходного кода генераторов выявляет ряд характерных изъянов:

  • Любая анимация жестко ограничена лимитом в 50 кадров за цикл. При пониженной скорости трансляции длительность отображения одного кадра превышает 100 мс, превращая плавное перетекание цветов в дискретную смену картинок.

  • Цветовые схемы смешиваются по линейному закону в пространстве sRGB. Из-за этого середина перехода между насыщенными тонами проваливается в темноту и грязь: линейная интерполяция гамма-корректированных величин противоречит как законам физики, так и особенностям человеческого восприятия.

  • Спектральная радуга рассчитывается в модели HSL. Поскольку данное цветовое пространство перцептивно неравномерно, желтые и голубые сектора растягиваются в широкие полосы, в то время как синий цвет визуально проседает.

  • Эффекты затухания вычисляются на основе 8-битных целых чисел с округлением вниз. На минимальных уровнях яркости изменение значения всего на единицу становится заметно невооруженным глазом, из-за чего «дыхание» подсветки угасает резкими рывками.

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

Аппаратные возможности док-станции

Первичным реверс-инжинирингом протокола занимался автор проекта OpenFlydigi (кроссплатформенная утилита для Apex 5 и CD2). Все данные были верифицированы на лим устройстве с версией микропрограммы 0.0.3.9.

Параметр

Спецификация

Интерфейс подключения

USB (VID 37D7, PID 6001), HID-протокол, размер отчетов 64 байта

Матрица диодов

162 светодиода, структура из 16 рядов: 14, 15, 16, 15, 14, 13 … 3

Емкость анимации

до 255 кадров (однобайтовый счетчик), фирменный софт задействует до 200

Дискретность кадров

шаг тайминга кратен 20 мс, теоретический предел — 50 кадров/с

Регулировка яркости

в диапазоне от 1 до 100

Процесс прошивки буфера

команда 97 инициализирует сессию, команда 98 передает блоки по 50 байт с обязательным подтверждением

Структура пакета предельно лаконична: 5A A5 <команда> <длина> <данные> <контрольная сумма>. Контрольная сумма представляет собой сумму всех байтов (modulo 256) от идентификатора команды до завершения блока данных. Конфигурация подсветки стартует с шестибайтного хедера (общей емкости кадров, периода, уровня яркости, пресета, вектора направления и размера палитры), за которым следует массив из 486 байт на каждый кадр (162 светодиода × 3 канала RGB).

Практические нюансы эксплуатации:

  • Обработка одного пакета с подтверждением отнимает около 9 мс. Загрузка единичного кадра занимает порядка 85 мс, а полный цикл из 200 кадров передается около 17 секунд. Для динамического реторганинга в реальном времени в стиле OpenRGB этот подход не годится, но для предварительно отрендеренных сцен подходит идеально.

    Аппаратный буфер кадров не стирается перед записью: если указать в заголовке больший объем кадров, чем было отправлено фактически, станция начнет циклично миксовать новую анимацию с остатками предыдущих данных вперемешку с мусором.

  • В алгоритмах Space Station заложена архитектурная ошибка при подсчете фрагментов: размерность определяется как
    длина / 50 + 1 пакетов, тогда как фактически отсылается ceil(длина / 50). Возникает рассинхронизация при кратностях 50, а именно когда остаток от деления общего числа кадров на 25 равен четырем. Разработчики FlyGlow просто исключили такие объемы из сценариев.

Цветовая модель: линейный свет и пространство OKLab

Величины в палитре sRGB отражают не физическую интенсивность света, а гамма-скорректированные цифры. Так, 50% шкалы sRGB выдают лишь около 21% реального светового потока. По этой причине FlyGlow оперирует исключительно в пространстве линейной яркости, обеспечивая естественное наложение и смешивание световых слоев.

Тем не менее, для создания идеальных градиентов одной линейности недостаточно: человеческий глаз реагирует на свет нелинейно, поэтому переходы в линейном RGB кажутся неравномерными. Для перцептивно точной интерполяции применяется цветовое пространство OKLab, разработанное Бьёрном Оттоссоном, где равноудаленные отрезки воспринимаются одинаково. Пример программной реализации смешивания:

Rgb mix(const Rgb& a, const Rgb& b, float t)
{
    const Lab la = toOklab(a), lb = toOklab(b);
    return fromOklab({la.L + (lb.L - la.L) * t,
                      la.a + (lb.a - la.a) * t,
                      la.b + (lb.b - la.b) * t});
}

Внедрены еще три ключевых улучшения:

  • Затухание на основе зрительного восприятия. Глаз оценивает интенсивность свечения примерно по закону кубического корня (что заложено в ось L модели OKLab). Для достижения равномерного затухания яркость задается в перцептивных величинах и переводится в линейный свет путем возведения в куб. Эффект «дыхания» избавлен от резких обрывов в минимальных точках.

  • Радужные переходы формируются из насыщенных базовых оттенков с интерполяцией в OKLab, где опорные точки распределены пропорционально реальному перцептивному расстоянию. Цветовой тон изменяется с постоянной скоростью, устраняя паразитные широкие полосы желтого и голубого.

  • Гибкая настройка гаммы вывода. Поскольку ШИМ-контроллер светодиодов управляет излучением линейно относительно поданного сигнала, по умолчанию на устройство уходят линейные данные, гарантируя совпадение яркости с превью. Для приверженцев заводской цветопередачи Space Station предусмотрен отдельный регулятор.

Восьмибитное ограничение и темпоральный дизеринг

Линейные значения идеальны во всем, кроме работы с глубокими тенями: в рамках 8-битного диапазона минимальная ступень яркости составляет 1/255, из-за чего затухание в абсолютную темноту неизбежно скатывается в лесенку. Проблема решается внедрением временного дизеринга (temporal dithering), при котором погрешность округления для каждого светодиода транслируется на следующий кадр. Поскольку цикл зациклен, рендеринг просчитывается дважды, а за основу берется результат второй итерации — это позволяет компенсировать погрешность, накопившуюся к финалу анимации.

Бесшовное зацикливание анимаций

Поскольку док-станция воспроизводит контент по кругу, любые несостыковки между финальным и начальным фреймами сразу бросаются в глаза. В архитектуре FlyGlow каждый эффект спроектирован как чистая математическая функция от фазы цикла в интервале [0, 1) — без внутренних состояний или привязки к системному времени. Скорость вращения регулируется целочисленным множителем повторов вместо плавающей частоты.

Для генерации «органических» текстур вроде открытого огня, плазмы или северного сияния требуется закольцованный шум. Применяется классический прием: четырехмерный шум Перлина/Симплекса, где координата времени закольцована по окружности в двух дополнительных плоскостях.

double loopNoise(double x, double y, double phase, uint32_t seed, double radius)
{
    const double a = 2.0 * std::numbers::pi * phase;
    return valueNoise4(x, y, radius * std::cos(a), radius * std::sin(a), seed);
}

В точках phase = 0 и phase = 1 координаты на окружности полностью совпадают, поэтому шов исчезает на фундаментальном уровне без необходимости ручной подгонки. Автоматизированные тесты прогоняют все 21 доступный эффект, контролируя отсутствие недопустимых значений (NaN), тождественное совпадение первого и последнего кадров, а также отсутствие резких перепадов между соседними шагами.

Параллельное сосуществование со Space Station

На раннем этапе разработки FlyGlow транслировал кадры через фоновый демон Space Station, чей управляющий интерфейс взаимодействует со службой посредством именованного канала \\.\pipe\fcs.sock на базе сообщений protobuf с текстовым префиксом. Схема работала, но вскрылся неприятный нюанс: служба обслуживает исключительно одного клиента единовременно, поэтому при запущенном окне Space Station канал оказывается заблокирован.

Инженерное решение оказалось элегантнее: подсистему HID док-станции в Windows можно открыть в режиме совместного доступа (FILE_SHARE_READ | FILE_SHARE_WRITE), даже если ее удерживает штатный демон. Ответные сигналы устройства транслируются во все открытые дескрипторы, поэтому собственные пакеты подтверждения приходится фильтровать по ID команды, игнорируя чужие. Теперь FlyGlow напрямую взаимодействует с девайсом, позволяя штатной утилита спокойно функционировать в фоне для обслуживания геймпада. Демон же остался в роли резервного шлюза.

Интерфейс и редактор

Графическая оболочка написана на современном стекe C++20 и Qt 6 Widgets, предлагая следующий инструментарий:

  • Многослойная структура со стандартными режимами наложения («Нормальный», «Сложение», «Экран», «Умножение», «Замена светлым»), настройкой прозрачности и масками, создаваемыми вручную кистью.

    Собственный инструмент анимации. Кисть жестко привязана к ближайшему светодиоду, а диаметр исчисляется кольцами гексагональной сетки (размер 1 соответствует ровно одному диоду). На временной шкале расставляются ключевые кадры с автоматической промежуточной интерполяцией в OKLab. ЛКМ отвечает за рисование, ПКМ — за стирание.

  • Импортирование GIF-анимаций и видеороликов. Видеопоток декодируется силами Windows Media Foundation без задействования тяжелых сторонних библиотек. Каждый диод вычисляет среднее значение для своей гексагональной ячейки на основе выборки из 19 точек в пространстве линейного света вместо банального захвата одного пикселя, предотвращая мерцание мелких деталей.

  • Кнопка отправки данных на устройство с визуальным индикатором прогресса (около 85 мс на один кадр).

  • Двуязычный интерфейс (русский и английский) с поддержкой мгновенного переключения на лету.

Планы на будущее

  • Реализация кастомизации подсветки самих геймпадов. Модели Apex 5 и Vader 5 Pro используют собственную конфигурацию иллюминации, однако лимит в примерно 10 кадров за цикл позволит улучшить разве что точность цветопередачи, но не плавность.

  • В прошивке док-станции обнаружена недокументированная команда быстрой записи одиночного кадра, которую игнорирует Space Station. Если ее быстродействие окажется достаточным, появится интерактивный режим реального времени: реакция на воспроизводимую музыку или захват видеоряда экрана, что откроет путь к интеграции с Ecosystem OpenRGB. Исходный код проекта распространяется под лицензией MIT, а готовые установщики и portable-сборки доступны в разделе релизов. Обратная связь от владельцев аналогичных док-станций с иными версиями прошивок будет крайне полезна.

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов