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
}
}