Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
- Рефакторинг системы подсветки: вместо длительности в секундах теперь используется количество циклов (float). Добавлена таблица длительности циклов эффектов `LightCycleDurations` для пересчёта циклов в секунды. Префикс команд подсветки изменён с `85` на `86`. - `LightSequence`: добавлены `Pause()` / `Resume()` с запоминанием текущего шага последовательности; возобновление продолжает с сохранённой позиции. - `LightController`: добавлены `PauseAll()` / `ResumeAll()` для приостановки и восстановления подсветки и мигания шляпы при отключении/переподключении платы. Свойства `IsSequencePaused`, `IsBlinkPaused`. - `ComDeviceClient`: после успешной авторизации отправляются команды `890003` и `8600`. Добавлен запрос MAC-адреса через команду `06` (ответ — 12 hex-символов без префикса). Новое событие `ConnectionLost` при начале KeepAlive-реконнекта. - `ComHub`: очередь `_disconnectedQueue` с типом `DeviceDisconnectMessage` (DeviceId + Role + Mac) — сохраняет идентификатор устройства до его удаления из словаря. Подписка на `ConnectionLost`. Добавлен `GetDeviceMac()`. - `ComSystemManager`: при инициализации, если плата не обнаружена, подсветка сразу ставится на паузу. При отвале дефолтного устройства — `PauseAll()`, при переподключении — сравнение по MAC и роли через `IsSameDevice()`: та же плата → `ResumeAll()`, другая → `Blink()` с нуля. Добавлены событие `OnDeviceDisconnected` и метод `GetDeviceMac()`. - `COMInput`: при событии `OnDeviceDisconnected` сбрасываются все состояния кнопок через `ResetAllButtons()`, генерируя `buttonUp` для зажатых кнопок. Устраняет баг залипания управления после переподключения платы. - `GameManager`: расширена последовательность световых эффектов в меню (добавлены `DiagonalWave3`, `WaveUp`, `OrangeWave`); вызовы `SetLight` для game over/won переведены на float-циклы. - Обновлены `ARCHITECTURE.md` и `README.md`: переписана документация на актуальную структуру проекта и текущие возможности игры.
52 lines
2.3 KiB
C#
52 lines
2.3 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace RR.Common.Controls
|
|
{
|
|
/// <summary>
|
|
/// Таблица длительности одного цикла каждого светового эффекта (в миллисекундах).
|
|
/// Используется в <see cref="LightSequence"/> для пересчёта количества циклов в секунды.
|
|
/// </summary>
|
|
public static class LightCycleDurations
|
|
{
|
|
private static readonly Dictionary<LightMode, int> CycleMs = new()
|
|
{
|
|
{ LightMode.HorizontalWave, 1000 }, // 40
|
|
{ LightMode.VerticalWave, 1000 }, // 41
|
|
{ LightMode.DiagonalWave, 3000 }, // 42
|
|
{ LightMode.Rainbow, 3000 }, // 43
|
|
{ LightMode.WaveUp, 3000 }, // 44
|
|
{ LightMode.VerticalWaveUp, 1000 }, // 45
|
|
{ LightMode.FinalWave, 1000 }, // 46
|
|
{ LightMode.BlueWave, 1000 }, // 47
|
|
{ LightMode.DiagonalWave2, 5000 }, // 48
|
|
{ LightMode.FallingRows, 6000 }, // 49
|
|
{ LightMode.OrangeWave, 3000 }, // 50
|
|
{ LightMode.SeaWave, 3000 }, // 51
|
|
{ LightMode.DiagonalWave3, 4000 }, // 52
|
|
};
|
|
|
|
/// <summary>Длительность одного цикла в миллисекундах. Для <see cref="LightMode.Off"/> возвращает 0.</summary>
|
|
public static int GetCycleMs(LightMode mode)
|
|
{
|
|
return CycleMs.TryGetValue(mode, out int ms) ? ms : 0;
|
|
}
|
|
|
|
/// <summary>Длительность одного цикла в секундах (float).</summary>
|
|
public static float GetCycleSeconds(LightMode mode)
|
|
{
|
|
return GetCycleMs(mode) / 1000f;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Пересчитывает количество циклов в целые секунды для COM-команды.
|
|
/// Дробные циклы поддерживаются (0.5 = половина цикла).
|
|
/// </summary>
|
|
public static int CyclesToCommandSeconds(LightMode mode, float cycles)
|
|
{
|
|
float totalSeconds = GetCycleSeconds(mode) * cycles;
|
|
return (int)(totalSeconds + 0.5f); // округление до ближайшего целого
|
|
}
|
|
}
|
|
}
|
|
|