using System.Collections.Generic;
namespace RR.Common.Controls
{
///
/// Таблица длительности одного цикла каждого светового эффекта (в миллисекундах).
/// Используется в для пересчёта количества циклов в секунды.ё
/// Для запуска карусели использовать команду 855001
///
public static class LightCycleDurations
{
private static readonly Dictionary CycleMs = new()
{
{ LightMode.HorizontalWave, 1000 }, // 10
{ LightMode.VerticalWave, 1000 }, // 11
{ LightMode.DiagonalWave, 3000 }, // 12
{ LightMode.Rainbow, 3000 }, // 13
{ LightMode.WaveUp, 3000 }, // 14
{ LightMode.VerticalWaveUp, 1000 }, // 15
{ LightMode.FinalWave, 1000 }, // 16
{ LightMode.BlueWave, 1000 }, // 17
{ LightMode.DiagonalWave2, 5000 }, // 18
{ LightMode.FallingRows, 6000 }, // 19
{ LightMode.OrangeWave, 3000 }, // 20
{ LightMode.SeaWave, 3000 }, // 21
{ LightMode.DiagonalWave3, 4000 }, // 22
};
/// Длительность одного цикла в миллисекундах. Для возвращает 0.
public static int GetCycleMs(LightMode mode)
{
return CycleMs.TryGetValue(mode, out int ms) ? ms : 0;
}
/// Длительность одного цикла в секундах (float).
public static float GetCycleSeconds(LightMode mode)
{
return GetCycleMs(mode) / 1000f;
}
///
/// Пересчитывает количество циклов в целые секунды для COM-команды.
/// Дробные циклы поддерживаются (0.5 = половина цикла).
///
public static int CyclesToCommandSeconds(LightMode mode, float cycles)
{
float totalSeconds = GetCycleSeconds(mode) * cycles;
return (int)(totalSeconds + 0.5f); // округление до ближайшего целого
}
}
}