516 lines
20 KiB
C#
516 lines
20 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public static class BlinkController
|
|
{
|
|
// Èíòåðâàë ìèãàíèÿ ïî óìîë÷àíèþ (â ñåêóíäàõ)
|
|
public static float DefaultInterval = 0.5f;
|
|
|
|
// Âíóòðåííèé ðàííåð äëÿ çàïóñêà êîðóòèí (äèíàìè÷åñêè ñîçäà¸òñÿ ïðè ïåðâîì èñïîëüçîâàíèè)
|
|
private class Runner : MonoBehaviour {
|
|
// Ïðè âûõîäå èç ïðèëîæåíèÿ âûêëþ÷àåì âñå ïîäñâåòêè
|
|
private void OnApplicationQuit()
|
|
{
|
|
BlinkController.TurnAllOff();
|
|
}
|
|
}
|
|
private static Runner _runner;
|
|
|
|
// Õðàíèëèùå çàïóùåííûõ êîðóòèí: êëþ÷ ôîðìèðóåì êàê "A_1" (òèï_èãðîê)
|
|
private static readonly Dictionary<string, Coroutine> _coroutines = new Dictionary<string, Coroutine>();
|
|
|
|
// Óáåäèìñÿ, ÷òî ðàííåð ñóùåñòâóåò è æèâ¸ò íà ñöåíå
|
|
private static void EnsureRunner()
|
|
{
|
|
if (_runner != null) return;
|
|
var go = new GameObject("_BlinkControllerRunner");
|
|
Object.DontDestroyOnLoad(go);
|
|
_runner = go.AddComponent<Runner>();
|
|
go.hideFlags = HideFlags.HideAndDontSave;
|
|
}
|
|
|
|
// ---- Àäðåñíûå êîìàíäû äëÿ ïîäñâåòîê A è B (ïî èãðîêó) ----
|
|
public static void LightAOn(int playerId) => ComWrapper.Send("2171", playerId);
|
|
public static void LightAOff(int playerId) => ComWrapper.Send("2170", playerId);
|
|
|
|
public static void LightBOn(int playerId) => ComWrapper.Send("2131", playerId);
|
|
public static void LightBOff(int playerId) => ComWrapper.Send("2130", playerId);
|
|
|
|
// ---- Ãëîáàëüíàÿ ïîäñâåòêà C (broadcast) ----
|
|
public static void LightCOn() => ComWrapper.Send("401");
|
|
public static void LightCOff() => ComWrapper.Send("400");
|
|
|
|
// ---- Àäðåñíûå LED äèîäû (êîìàíäû 8xxx) ----
|
|
// 81õõ - êàíàë 1, 82õõ - êàíàë 2, 83õõ - êàíàë 3, 84õõ - êàíàë 4
|
|
// 80õõ - âñå êàíàëû ñðàçó
|
|
// Ïðîãðàììû: 0-None, 1-Repeat, 2-Off, 3-Red, 4-Green, 5-Blue, 6-Gray, 7-White, 9-Rainbow, 10+-Custom
|
|
|
|
/// <summary>Óñòàíîâèòü ïðîãðàììó íà êàíàëå LED (1-4) äëÿ êîíêðåòíîãî èãðîêà</summary>
|
|
public static void SetLEDChannel(int channel, int program, int playerId)
|
|
{
|
|
if (channel < 1 || channel > 4)
|
|
{
|
|
Debug.LogWarning($"BlinkController: Íåâåðíûé êàíàë LED {channel}. Äîïóñòèìî 1-4");
|
|
return;
|
|
}
|
|
if (program < 0 || program > 99)
|
|
{
|
|
Debug.LogWarning($"BlinkController: Íåâåðíàÿ ïðîãðàììà LED {program}. Äîïóñòèìî 0-99");
|
|
return;
|
|
}
|
|
string cmd = $"{80 + channel}{program:D2}";
|
|
ComWrapper.Send(cmd, playerId);
|
|
Debug.Log($"BlinkController: LED êàíàë {channel} -> ïðîãðàììà {program} äëÿ èãðîêà {playerId} (cmd: {cmd})");
|
|
}
|
|
|
|
/// <summary>Óñòàíîâèòü ïðîãðàììó íà âñåõ LED êàíàëàõ äëÿ êîíêðåòíîãî èãðîêà</summary>
|
|
public static void SetLEDAll(int program, int playerId)
|
|
{
|
|
if (program < 0 || program > 99)
|
|
{
|
|
Debug.LogWarning($"BlinkController: Íåâåðíàÿ ïðîãðàììà LED {program}. Äîïóñòèìî 0-99");
|
|
return;
|
|
}
|
|
string cmd = $"80{program:D2}";
|
|
ComWrapper.Send(cmd, playerId);
|
|
Debug.Log($"BlinkController: LED âñå êàíàëû -> ïðîãðàììà {program} äëÿ èãðîêà {playerId} (cmd: {cmd})");
|
|
}
|
|
|
|
/// <summary>Óñòàíîâèòü ïðîãðàììó íà âñåõ LED êàíàëàõ ãëîáàëüíî (broadcast)</summary>
|
|
public static void SetLEDAllGlobal(int program)
|
|
{
|
|
if (program < 0 || program > 99)
|
|
{
|
|
Debug.LogWarning($"BlinkController: Íåâåðíàÿ ïðîãðàììà LED {program}. Äîïóñòèìî 0-99");
|
|
return;
|
|
}
|
|
string cmd = $"80{program:D2}";
|
|
ComWrapper.Send(cmd);
|
|
Debug.Log($"BlinkController: LED âñå êàíàëû -> ïðîãðàììà {program} ãëîáàëüíî (cmd: {cmd})");
|
|
}
|
|
|
|
// Áûñòðûå êîìàíäû äëÿ LED (àäðåñíûå äëÿ èãðîêà)
|
|
public static void LEDOff(int channel, int playerId) => SetLEDChannel(channel, 2, playerId); // Ïîãàñèòü êàíàë
|
|
public static void LEDRed(int channel, int playerId) => SetLEDChannel(channel, 3, playerId); // Êðàñíûé
|
|
public static void LEDGreen(int channel, int playerId) => SetLEDChannel(channel, 4, playerId); // Çåëåíûé
|
|
public static void LEDBlue(int channel, int playerId) => SetLEDChannel(channel, 5, playerId); // Ñèíèé
|
|
public static void LEDWhite(int channel, int playerId) => SetLEDChannel(channel, 7, playerId); // Áåëûé
|
|
public static void LEDRainbow(int channel, int playerId) => SetLEDChannel(channel, 9, playerId); // Ðàäóãà
|
|
|
|
public static void LEDWave(int channel, int playerId) => SetLEDChannel(channel, 11, playerId); // âîëíà
|
|
|
|
public static void LEDOffAll(int playerId) => SetLEDAll(2, playerId); // Ïîãàñèòü âñå äëÿ èãðîêà
|
|
public static void LEDRedAll(int playerId) => SetLEDAll(3, playerId); // Êðàñíûé íà âñåõ äëÿ èãðîêà
|
|
public static void LEDGreenAll(int playerId) => SetLEDAll(4, playerId); // Çåëåíûé íà âñåõ äëÿ èãðîêà
|
|
public static void LEDBlueAll(int playerId) => SetLEDAll(5, playerId); // Ñèíèé íà âñåõ äëÿ èãðîêà
|
|
public static void LEDWhiteAll(int playerId) => SetLEDAll(7, playerId); // Áåëûé íà âñåõ äëÿ èãðîêà
|
|
public static void LEDRainbowAll(int playerId) => SetLEDAll(9, playerId); // Ðàäóãà íà âñåõ äëÿ èãðîêà
|
|
|
|
// Ãëîáàëüíûå êîìàíäû (broadcast äëÿ âñåõ èãðîêîâ)
|
|
public static void LEDOffAllGlobal() => SetLEDAllGlobal(2); // Ïîãàñèòü âñå ãëîáàëüíî
|
|
public static void LEDRedAllGlobal() => SetLEDAllGlobal(3); // Êðàñíûé íà âñåõ ãëîáàëüíî
|
|
public static void LEDGreenAllGlobal() => SetLEDAllGlobal(4); // Çåëåíûé íà âñåõ ãëîáàëüíî
|
|
public static void LEDBlueAllGlobal() => SetLEDAllGlobal(5); // Ñèíèé íà âñåõ ãëîáàëüíî
|
|
public static void LEDWhiteAllGlobal() => SetLEDAllGlobal(7); // Áåëûé íà âñåõ ãëîáàëüíî
|
|
public static void LEDRainbowAllGlobal() => SetLEDAllGlobal(9); // Ðàäóãà íà âñåõ ãëîáàëüíî
|
|
|
|
// ---- Ïåðåêëþ÷åíèå öâåòîâîãî ÷åðåäîâàíèÿ (êîìàíäû 89x) ----
|
|
public enum ColorSequence
|
|
{
|
|
RGB = 0, // 890 - Red, Green, Blue
|
|
RBG = 1, // 891 - Red, Blue, Green
|
|
BRG = 2, // 892 - Blue, Red, Green
|
|
BGR = 3, // 893 - Blue, Green, Red
|
|
GRB = 4, // 894 - Green, Red, Blue
|
|
GBR = 5 // 895 - Green, Blue, Red
|
|
}
|
|
|
|
/// <summary>Óñòàíîâèòü öâåòîâîå ÷åðåäîâàíèå. Åñëè playerId = 0 èëè íå óêàçàí - îòïðàâêà ãëîáàëüíî</summary>
|
|
public static void SetColorSequence(ColorSequence sequence, int playerId = 0)
|
|
{
|
|
string cmd = $"89{(int)sequence}";
|
|
|
|
if (playerId > 0)
|
|
{
|
|
ComWrapper.Send(cmd, playerId);
|
|
Debug.Log($"BlinkController: Öâåòîâîå ÷åðåäîâàíèå {sequence} äëÿ èãðîêà {playerId} (cmd: {cmd})");
|
|
}
|
|
else
|
|
{
|
|
ComWrapper.Send(cmd);
|
|
Debug.Log($"BlinkController: Öâåòîâîå ÷åðåäîâàíèå {sequence} ãëîáàëüíî (cmd: {cmd})");
|
|
}
|
|
}
|
|
|
|
// ---- Ïðîèçâîëüíûé RGB öâåò (êîìàíäà 08RRRGGGBBB) ----
|
|
|
|
/// <summary>Óñòàíîâèòü ïðîèçâîëüíûé RGB öâåò äëÿ LED. Åñëè playerId = 0 - îòïðàâêà ãëîáàëüíî</summary>
|
|
/// <param name="r">Êðàñíûé êàíàë (0-255)</param>
|
|
/// <param name="g">Çåëåíûé êàíàë (0-255)</param>
|
|
/// <param name="b">Ñèíèé êàíàë (0-255)</param>
|
|
/// <param name="playerId">ID èãðîêà (0 = ãëîáàëüíî)</param>
|
|
/// <summary>Óñòàíîâèòü ïðîèçâîëüíûé RGB öâåò íà êîíêðåòíûé êàíàë (81-84)</summary>
|
|
public static void SetLEDChannelCustomColor(int channel, int r, int g, int b, int playerId = 0)
|
|
{
|
|
// Îãðàíè÷èâàåì çíà÷åíèÿ
|
|
channel = Mathf.Clamp(channel, 81, 84);
|
|
r = Mathf.Clamp(r, 0, 255);
|
|
g = Mathf.Clamp(g, 0, 255);
|
|
b = Mathf.Clamp(b, 0, 255);
|
|
|
|
// Ôîðìàò: 8X (êàíàë) + 08 (ïðîãðàììà ïðîèçâîëüíûé öâåò) + RRRGGGBBB
|
|
string cmd = $"{channel}08{r:D3}{g:D3}{b:D3}";
|
|
|
|
if (playerId > 0)
|
|
{
|
|
ComWrapper.Send(cmd, playerId);
|
|
Debug.Log($"BlinkController: LED êàíàë {channel} ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) äëÿ èãðîêà {playerId} (cmd: {cmd})");
|
|
}
|
|
else
|
|
{
|
|
ComWrapper.Send(cmd);
|
|
Debug.Log($"BlinkController: LED êàíàë {channel} ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) ãëîáàëüíî (cmd: {cmd})");
|
|
}
|
|
}
|
|
|
|
/// <summary>Óñòàíîâèòü ïðîèçâîëüíûé RGB öâåò íà âñå êàíàëû (80)</summary>
|
|
public static void SetLEDCustomColor(int r, int g, int b, int playerId = 0)
|
|
{
|
|
// Îãðàíè÷èâàåì çíà÷åíèÿ 0-255
|
|
r = Mathf.Clamp(r, 0, 255);
|
|
g = Mathf.Clamp(g, 0, 255);
|
|
b = Mathf.Clamp(b, 0, 255);
|
|
|
|
// Ôîðìàò: 80 (âñå êàíàëû) + 08 (ïðîãðàììà ïðîèçâîëüíûé öâåò) + RRRGGGBBB
|
|
string cmd = $"8008{r:D3}{g:D3}{b:D3}";
|
|
|
|
if (playerId > 0)
|
|
{
|
|
ComWrapper.Send(cmd, playerId);
|
|
Debug.Log($"BlinkController: LED ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) äëÿ èãðîêà {playerId} (cmd: {cmd})");
|
|
}
|
|
else
|
|
{
|
|
ComWrapper.Send(cmd);
|
|
Debug.Log($"BlinkController: LED ïðîèçâîëüíûé öâåò RGB({r},{g},{b}) ãëîáàëüíî (cmd: {cmd})");
|
|
}
|
|
}
|
|
|
|
// Ïðåäóñòàíîâëåííûå öâåòà
|
|
public static void LEDGold(int playerId = 0) => SetLEDCustomColor(255, 215, 0, playerId); // Çîëîòîé
|
|
public static void LEDOrange(int playerId = 0) => SetLEDCustomColor(255, 165, 0, playerId); // Îðàíæåâûé
|
|
public static void LEDPurple(int playerId = 0) => SetLEDCustomColor(128, 0, 128, playerId); // Ôèîëåòîâûé
|
|
public static void LEDPink(int playerId = 0) => SetLEDCustomColor(255, 192, 203, playerId); // Ðîçîâûé
|
|
public static void LEDCyan(int playerId = 0) => SetLEDCustomColor(0, 255, 255, playerId); // Ãîëóáîé
|
|
public static void LEDYellow(int playerId = 0) => SetLEDCustomColor(255, 255, 0, playerId); // Æåëòûé
|
|
|
|
// ---- Ìèãàíèå LED ñ âîçâðàòîì ê áàçîâîìó öâåòó ----
|
|
private static readonly Dictionary<int, int> _playerBaseLEDColor = new Dictionary<int, int>();
|
|
|
|
// Õðàíèì êàñòîìíûå RGB öâåòà äëÿ êàæäîãî èãðîêà (åñëè óñòàíîâëåí)
|
|
private static readonly Dictionary<int, Vector3Int> _playerCustomLEDColor = new Dictionary<int, Vector3Int>();
|
|
|
|
/// <summary>Óñòàíîâèòü áàçîâûé öâåò LED äëÿ èãðîêà (ê êîòîðîìó âîçâðàùàåìñÿ ïîñëå ìèãàíèÿ)</summary>
|
|
public static void SetLEDBaseColor(int playerId, int program)
|
|
{
|
|
_playerBaseLEDColor[playerId] = program;
|
|
_playerCustomLEDColor.Remove(playerId); // Óáèðàåì êàñòîìíûé öâåò
|
|
SetLEDAll(program, playerId);
|
|
Debug.Log($"BlinkController: Áàçîâûé LED öâåò äëÿ èãðîêà {playerId} óñòàíîâëåí: {program}");
|
|
}
|
|
|
|
/// <summary>Óñòàíîâèòü áàçîâûé êàñòîìíûé RGB öâåò LED äëÿ èãðîêà</summary>
|
|
public static void SetLEDBaseCustomColor(int playerId, int r, int g, int b)
|
|
{
|
|
_playerBaseLEDColor[playerId] = -1; // Ìàðêåð êàñòîìíîãî öâåòà
|
|
_playerCustomLEDColor[playerId] = new Vector3Int(r, g, b);
|
|
SetLEDCustomColor(r, g, b, playerId);
|
|
Debug.Log($"BlinkController: Áàçîâûé êàñòîìíûé LED öâåò äëÿ èãðîêà {playerId} óñòàíîâëåí: RGB({r},{g},{b})");
|
|
}
|
|
|
|
/// <summary>Ïîëó÷èòü áàçîâûé öâåò LED äëÿ èãðîêà</summary>
|
|
public static int GetLEDBaseColor(int playerId)
|
|
{
|
|
return _playerBaseLEDColor.TryGetValue(playerId, out int color) ? color : 5; // Ïî óìîë÷àíèþ ñèíèé (5)
|
|
}
|
|
|
|
/// <summary>Âîññòàíîâèòü áàçîâûé öâåò LED äëÿ èãðîêà (âêëþ÷àÿ êàñòîìíûå RGB)</summary>
|
|
public static void RestoreLEDBaseColor(int playerId)
|
|
{
|
|
if (_playerCustomLEDColor.TryGetValue(playerId, out Vector3Int rgb))
|
|
{
|
|
// Âîññòàíàâëèâàåì êàñòîìíûé öâåò
|
|
SetLEDCustomColor(rgb.x, rgb.y, rgb.z, playerId);
|
|
}
|
|
else
|
|
{
|
|
// Âîññòàíàâëèâàåì îáû÷íûé öâåò ïî ïðîãðàììå
|
|
int baseColor = GetLEDBaseColor(playerId);
|
|
SetLEDAll(baseColor, playerId);
|
|
}
|
|
}
|
|
|
|
/// <summary>Ìèãàíèå LED N ðàç öâåòîì, çàòåì âîçâðàò ê áàçîâîìó öâåòó</summary>
|
|
public static void BlinkLED(int playerId, int colorProgram, int times, float interval = 0.3f)
|
|
{
|
|
EnsureRunner();
|
|
_runner.StartCoroutine(BlinkLEDRoutine(playerId, colorProgram, times, interval));
|
|
}
|
|
|
|
private static IEnumerator BlinkLEDRoutine(int playerId, int colorProgram, int times, float interval)
|
|
{
|
|
for (int i = 0; i < times; i++)
|
|
{
|
|
// Âêëþ÷èòü öâåò
|
|
SetLEDAll(colorProgram, playerId);
|
|
yield return new WaitForSeconds(interval);
|
|
|
|
// Âåðíóòü áàçîâûé öâåò (âêëþ÷àÿ êàñòîìíûå RGB)
|
|
RestoreLEDBaseColor(playerId);
|
|
|
|
// Ïàóçà ìåæäó ìèãàíèÿìè (êðîìå ïîñëåäíåãî)
|
|
if (i < times - 1)
|
|
yield return new WaitForSeconds(interval);
|
|
}
|
|
}
|
|
|
|
// Áûñòðûå êîìàíäû ìèãàíèÿ
|
|
public static void BlinkLEDRed(int playerId, int times = 1, float interval = 0.3f)
|
|
=> BlinkLED(playerId, 3, times, interval);
|
|
|
|
public static void BlinkLEDGreen(int playerId, int times = 1, float interval = 0.3f)
|
|
=> BlinkLED(playerId, 4, times, interval);
|
|
|
|
public static void BlinkLEDBlue(int playerId, int times = 1, float interval = 0.3f)
|
|
=> BlinkLED(playerId, 5, times, interval);
|
|
|
|
// ---- Start/Stop ìèãàíèÿ ----
|
|
public static void StartBlinkA(int playerId, float interval = -1f)
|
|
{
|
|
// Îñòàâëÿåì îáðàòíóþ ñîâìåñòèìîñòü: áåñêîíå÷íîå ìèãàíèå
|
|
StartBlinkATimes(playerId, -1, interval);
|
|
}
|
|
|
|
// Ìèãàíèå N ðàç (N <= 0 = áåñêîíå÷íî)
|
|
public static void StartBlinkATimes(int playerId, int times, float interval = -1f)
|
|
{
|
|
StopBlinkA(playerId);
|
|
EnsureRunner();
|
|
string key = KeyFor("A", playerId);
|
|
var coro = _runner.StartCoroutine(BlinkRoutinePlayer(key, playerId, "2170", "2171", interval > 0 ? interval : DefaultInterval, times));
|
|
_coroutines[key] = coro;
|
|
}
|
|
|
|
public static void StopBlinkA(int playerId)
|
|
{
|
|
string key = KeyFor("A", playerId);
|
|
StopAndRemove(key);
|
|
LightAOff(playerId);
|
|
}
|
|
|
|
public static void StartBlinkB(int playerId, float interval = -1f)
|
|
{
|
|
// Îñòàâëÿåì îáðàòíóþ ñîâìåñòèìîñòü: áåñêîíå÷íîå ìèãàíèå
|
|
StartBlinkBTimes(playerId, -1, interval);
|
|
}
|
|
|
|
// Ìèãàíèå N ðàç (N <= 0 = áåñêîíå÷íî)
|
|
public static void StartBlinkBTimes(int playerId, int times, float interval = -1f)
|
|
{
|
|
StopBlinkB(playerId);
|
|
EnsureRunner();
|
|
string key = KeyFor("B", playerId);
|
|
var coro = _runner.StartCoroutine(BlinkRoutinePlayer(key, playerId, "2130", "2131", interval > 0 ? interval : DefaultInterval, times));
|
|
_coroutines[key] = coro;
|
|
}
|
|
|
|
public static void StopBlinkB(int playerId)
|
|
{
|
|
string key = KeyFor("B", playerId);
|
|
StopAndRemove(key);
|
|
LightBOff(playerId);
|
|
}
|
|
|
|
// Ãëîáàëüíàÿ C
|
|
public static void StartBlinkC(float interval = -1f)
|
|
{
|
|
// Îñòàâëÿåì îáðàòíóþ ñîâìåñòèìîñòü: áåñêîíå÷íîå ìèãàíèå
|
|
StartBlinkCTimes(-1, interval);
|
|
}
|
|
|
|
// Ìèãàíèå N ðàç ãëîáàëüíî (N <= 0 = áåñêîíå÷íî)
|
|
public static void StartBlinkCTimes(int times, float interval = -1f)
|
|
{
|
|
StopBlinkC();
|
|
EnsureRunner();
|
|
string key = KeyFor("C", 0);
|
|
var coro = _runner.StartCoroutine(BlinkRoutineGlobal(key, "400", "401", interval > 0 ? interval : DefaultInterval, times));
|
|
_coroutines[key] = coro;
|
|
}
|
|
|
|
public static void StopBlinkC()
|
|
{
|
|
string key = KeyFor("C", 0);
|
|
StopAndRemove(key);
|
|
LightCOff();
|
|
}
|
|
|
|
private static void StopAndRemove(string key)
|
|
{
|
|
if (_coroutines.TryGetValue(key, out Coroutine c))
|
|
{
|
|
if (_runner != null && c != null) _runner.StopCoroutine(c);
|
|
_coroutines.Remove(key);
|
|
}
|
|
}
|
|
|
|
private static string KeyFor(string type, int playerId) => $"{type}_{playerId}";
|
|
|
|
private static IEnumerator BlinkRoutinePlayer(string key, int playerId, string onCmd, string offCmd, float interval, int repeatCount)
|
|
{
|
|
// repeatCount <= 0 => áåñêîíå÷íî
|
|
if (repeatCount <= 0)
|
|
{
|
|
while (true)
|
|
{
|
|
ComWrapper.Send(onCmd, playerId);
|
|
yield return new WaitForSeconds(interval);
|
|
ComWrapper.Send(offCmd, playerId);
|
|
yield return new WaitForSeconds(interval);
|
|
}
|
|
}
|
|
|
|
// Ïîâòîðÿåì çàäàííîå êîëè÷åñòâî ðàç
|
|
for (int i = 0; i < repeatCount; i++)
|
|
{
|
|
ComWrapper.Send(onCmd, playerId);
|
|
yield return new WaitForSeconds(interval);
|
|
ComWrapper.Send(offCmd, playerId);
|
|
// Ìåæäó èòåðàöèÿìè äåëàåì ïàóçó, êàê â îáû÷íîì ìèãàíèè, êðîìå ïîñëåäíåé
|
|
if (i < repeatCount - 1) yield return new WaitForSeconds(interval);
|
|
}
|
|
|
|
// Ãàðàíòèðóåì, ÷òî êîìàíäà âûêëþ÷åíèÿ ïîñëàíà
|
|
ComWrapper.Send(offCmd, playerId);
|
|
|
|
// Óäàëÿåì çàïèñü î êîðóòèíå
|
|
try { _coroutines.Remove(key); } catch { }
|
|
}
|
|
|
|
private static IEnumerator BlinkRoutineGlobal(string key, string onCmd, string offCmd, float interval, int repeatCount)
|
|
{
|
|
if (repeatCount <= 0)
|
|
{
|
|
while (true)
|
|
{
|
|
ComWrapper.Send(onCmd);
|
|
yield return new WaitForSeconds(interval);
|
|
ComWrapper.Send(offCmd);
|
|
yield return new WaitForSeconds(interval);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < repeatCount; i++)
|
|
{
|
|
ComWrapper.Send(onCmd);
|
|
yield return new WaitForSeconds(interval);
|
|
ComWrapper.Send(offCmd);
|
|
if (i < repeatCount - 1) yield return new WaitForSeconds(interval);
|
|
}
|
|
|
|
ComWrapper.Send(offCmd);
|
|
try { _coroutines.Remove(key); } catch { }
|
|
}
|
|
|
|
// Âñïîìîãàòåëüíûå: ìãíîâåííûé âêë/âûêë âñåõ
|
|
public static void StopAll()
|
|
{
|
|
var keys = new List<string>(_coroutines.Keys);
|
|
foreach (var k in keys) StopAndRemove(k);
|
|
}
|
|
|
|
// Âêëþ÷èòü âñå ïîäñâåòêè (A è B — äëÿ îáîèõ èãðîêîâ, C — ãëîáàëüíî)
|
|
public static void TurnAllOn()
|
|
{
|
|
Debug.Log("BlinkController: TurnAllOn");
|
|
// A è B àäðåñíûå — äëÿ èãðîêîâ 1 è 2
|
|
LightAOn(1);
|
|
LightAOn(2);
|
|
LightBOn(1);
|
|
LightBOn(2);
|
|
// C — ãëîáàëüíî
|
|
LightCOn();
|
|
|
|
// LED - ïðè ñòàðòå: êàíàë 1 âîëíà, êàíàë 2 ðàäóãà äëÿ îáîèõ èãðîêîâ
|
|
LEDWave(1, 1); // Èãðîê 1: êàíàë 1 -> âîëíà
|
|
LEDRainbow(2, 1); // Èãðîê 1: êàíàë 2 -> ðàäóãà
|
|
LEDWave(1, 2); // Èãðîê 2: êàíàë 1 -> âîëíà
|
|
LEDRainbow(2, 2); // Èãðîê 2: êàíàë 2 -> ðàäóãà
|
|
|
|
// Óñòàíàâëèâàåì áàçîâûé öâåò - ðàäóãà (äëÿ ìèãàíèÿ áóäåò âîçâðàò ê íåé)
|
|
_playerBaseLEDColor[1] = 9;
|
|
_playerBaseLEDColor[2] = 9;
|
|
}
|
|
|
|
// Âûêëþ÷èòü âñå ïîäñâåòêè (è îñòàíîâèòü êîðóòèíû)
|
|
public static void TurnAllOff()
|
|
{
|
|
Debug.Log("BlinkController: TurnAllOff");
|
|
// Îñòàíîâèì âñå ìèãàíèÿ
|
|
StopAll();
|
|
|
|
// Îòïðàâèì êîìàíäû âûêëþ÷åíèÿ àäðåñíî äëÿ èãðîêîâ 1 è 2
|
|
try
|
|
{
|
|
LightAOff(1);
|
|
LightAOff(2);
|
|
LightBOff(1);
|
|
LightBOff(2);
|
|
// C — ãëîáàëüíî
|
|
LightCOff();
|
|
// LED - âûêëþ÷èòü âñå êàíàëû ãëîáàëüíî
|
|
LEDOffAllGlobal();
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
Debug.LogWarning($"BlinkController: îøèáêà ïðè TurnAllOff: {e.Message}");
|
|
}
|
|
}
|
|
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
|
|
private static void OnRuntimeInitialized()
|
|
{
|
|
// Ïîäïèñûâàåìñÿ íà ñîáûòèå èíèöèàëèçàöèè ComWrapper — âêëþ÷èì ïîäñâåòêè, êîãäà COM áóäåò ãîòîâ
|
|
try
|
|
{
|
|
ComWrapper.OnInitialize += TurnAllOn;
|
|
// Ïîäïèñûâàåìñÿ, ÷òîáû âûêëþ÷èòü ïîäñâåòêè ÄÎ çàêðûòèÿ ïîðòîâ
|
|
ComWrapper.OnBeforeClose += TurnAllOff;
|
|
}
|
|
catch
|
|
{
|
|
// Åñëè ComWrapper åù¸ íå ñóùåñòâóåò èëè íå îïðåäåë¸í, ïðîèãíîðèðóåì — âûçîâ ïðîèçîéä¸ò ïðè èíèöèàëèçàöèè
|
|
}
|
|
|
|
// Ñîçäà¸ì ðàííåð çàðàíåå, ÷òîáû îí áûë äîñòóïåí è ãàðàíòèðîâàííî ñóùåñòâîâàë
|
|
EnsureRunner();
|
|
|
|
// Ïîäïèøåìñÿ íà ñîáûòèå âûõîäà ïðèëîæåíèÿ — ãàðàíòèðîâàííî âûêëþ÷èò ïîäñâåòêè è ïî÷èñòèò ïîäïèñêè
|
|
Application.quitting += OnApplicationQuitting;
|
|
}
|
|
|
|
// Îáðàáîò÷èê âûõîäà ïðèëîæåíèÿ: îòïèñûâàåìñÿ îò ñîáûòèé ComWrapper
|
|
private static void OnApplicationQuitting()
|
|
{
|
|
try { ComWrapper.OnInitialize -= TurnAllOn; } catch { }
|
|
try { ComWrapper.OnBeforeClose -= TurnAllOff; } catch { }
|
|
try { TurnAllOff(); } catch { }
|
|
if (_runner != null)
|
|
{
|
|
Object.Destroy(_runner.gameObject);
|
|
_runner = null;
|
|
}
|
|
}
|
|
}
|