using UnityEngine; namespace DanroJump.Hardware.Com { /// /// Набор параметров serial-подключения к одному COM-устройству. /// public readonly struct SerialSettings { /// /// Имя COM-порта. /// public readonly string PortName; /// /// Скорость serial-подключения. /// public readonly int BaudRate; /// /// Количество бит данных в serial-пакете. /// public readonly int DataBits; /// /// Режим четности serial-порта. /// public readonly SerialParity Parity; /// /// Количество stop bits serial-порта. /// public readonly SerialStopBits StopBits; /// /// Таймаут чтения из serial-порта в миллисекундах. /// public readonly int ReadTimeoutMs; /// /// Таймаут записи в serial-порт в миллисекундах. /// public readonly int WriteTimeoutMs; /// /// Создает настройки порта с минимальной защитой таймаутов от нулевых значений. /// public SerialSettings( string portName, int baudRate, int dataBits, SerialParity parity, SerialStopBits stopBits, int readTimeoutMs, int writeTimeoutMs) { PortName = portName ?? ""; BaudRate = baudRate; DataBits = dataBits; Parity = parity; StopBits = stopBits; ReadTimeoutMs = Mathf.Max(1, readTimeoutMs); WriteTimeoutMs = Mathf.Max(1, writeTimeoutMs); } } /// /// Сообщение аппаратного ввода, привязанное к конкретному устройству. /// public readonly struct ComInputMessage { /// /// Идентификатор устройства-источника. /// public readonly string DeviceId; /// /// Биты аппаратного ввода. /// public readonly string InputBits; /// /// Создает снимок входных битов от устройства. /// public ComInputMessage(string deviceId, string inputBits) { DeviceId = deviceId ?? ""; InputBits = inputBits ?? ""; } } /// /// Сообщение аналоговых ADC-входов, привязанное к конкретному устройству. /// public readonly struct ComAdcMessage { /// /// Идентификатор устройства-источника. /// public readonly string DeviceId; /// /// Сырые значения ADC после префикса строки. /// public readonly string AdcValues; /// /// Создает снимок аналоговых ADC-входов от устройства. /// public ComAdcMessage(string deviceId, string adcValues) { DeviceId = deviceId ?? ""; AdcValues = adcValues ?? ""; } } /// /// Результат попытки открыть ячейку призовой витрины. /// public readonly struct PrizeOpenResult { /// /// Была ли выдача приза успешной. /// public readonly bool IsSuccess; /// /// Номер призовой ячейки. /// public readonly int BoxNumber; /// /// Сообщение о результате операции. /// public readonly string Message; private PrizeOpenResult(bool isSuccess, int boxNumber, string message) { IsSuccess = isSuccess; BoxNumber = boxNumber; Message = message ?? ""; } /// /// Создает успешный результат выдачи приза. /// public static PrizeOpenResult Success(int boxNumber) { return new PrizeOpenResult(true, boxNumber, $"Ячейка {boxNumber} успешно открыта."); } /// /// Создает результат с причиной отказа в выдаче. /// public static PrizeOpenResult Fail(int boxNumber, string message) { return new PrizeOpenResult(false, boxNumber, message); } } /// /// Один шаг световой последовательности на аппаратной плате. /// public readonly struct LightStep { /// /// Световой режим платы. /// public readonly LightMode Mode; /// /// Количество циклов эффекта. /// public readonly float Cycles; /// /// Создает шаг светового эффекта с безопасным числом циклов. /// public LightStep(LightMode mode, float cycles) { Mode = mode; Cycles = Mathf.Max(0f, cycles); } } /// /// Статус ячейки призовой витрины, полученный от контроллера. /// public enum PrizeBoxStatus { Ok, OkWithCard, Empty, Open, Opened, OpenError, ParsingError, NotFound, Error } /// /// Значения четности serial-порта, независимые от конкретной реализации System.IO.Ports. /// public enum SerialParity { None, Odd, Even, Mark, Space } /// /// Значения stop bits serial-порта, независимые от конкретной реализации System.IO.Ports. /// public enum SerialStopBits { None, One, Two, OnePointFive } /// /// Коды световых эффектов, которые понимает аппаратная плата. /// public enum LightMode { Off = -1, HorizontalWave = 40, VerticalWave = 41, DiagonalWave = 42, Rainbow = 43, WaveUp = 44, VerticalWaveUp = 45, FinalWave = 46, BlueWave = 47, DiagonalWave2 = 48, FallingRows = 49, OrangeWave = 50, SeaWave = 51, DiagonalWave3 = 52 } }