Danil Iarosh 77186697f8 Prepare v0.1 gameplay and hardware foundation
Подробные изменения:

- Расширен основной gameplay loop: джетпак, новые платформы, оборудование, враги, прогрессия сложности и ограничения взаимодействий игрока.

- Добавлены Bootstrap-сервисы запуска приложения, защита, фокус окна, управление курсором и настройки сервисов через DI.

- Добавлена COM-интеграция с технической схемой Input System, обработкой кнопок/ADC, подсветкой и консольной диагностикой.

- Добавлен отдельный debug/logging модуль с каналами, обработчиками консоли и файловым выводом.

- Добавлены asmdef, link.xml, EditMode/PlayMode тесты и обновлена дорожная карта проекта.

Проверки:

- dotnet build .\\DanroJump.Runtime.csproj --no-restore

- dotnet build .\\DanroJump.Tests.EditMode.csproj --no-restore

- dotnet build .\\DanroJump.Tests.PlayMode.csproj --no-restore
2026-06-08 14:22:48 +03:00

246 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
namespace DanroJump.Hardware.Com
{
/// <summary>
/// Набор параметров serial-подключения к одному COM-устройству.
/// </summary>
public readonly struct SerialSettings
{
/// <summary>
/// Имя COM-порта.
/// </summary>
public readonly string PortName;
/// <summary>
/// Скорость serial-подключения.
/// </summary>
public readonly int BaudRate;
/// <summary>
/// Количество бит данных в serial-пакете.
/// </summary>
public readonly int DataBits;
/// <summary>
/// Режим четности serial-порта.
/// </summary>
public readonly SerialParity Parity;
/// <summary>
/// Количество stop bits serial-порта.
/// </summary>
public readonly SerialStopBits StopBits;
/// <summary>
/// Таймаут чтения из serial-порта в миллисекундах.
/// </summary>
public readonly int ReadTimeoutMs;
/// <summary>
/// Таймаут записи в serial-порт в миллисекундах.
/// </summary>
public readonly int WriteTimeoutMs;
/// <summary>
/// Создает настройки порта с минимальной защитой таймаутов от нулевых значений.
/// </summary>
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);
}
}
/// <summary>
/// Сообщение аппаратного ввода, привязанное к конкретному устройству.
/// </summary>
public readonly struct ComInputMessage
{
/// <summary>
/// Идентификатор устройства-источника.
/// </summary>
public readonly string DeviceId;
/// <summary>
/// Биты аппаратного ввода.
/// </summary>
public readonly string InputBits;
/// <summary>
/// Создает снимок входных битов от устройства.
/// </summary>
public ComInputMessage(string deviceId, string inputBits)
{
DeviceId = deviceId ?? "";
InputBits = inputBits ?? "";
}
}
/// <summary>
/// Сообщение аналоговых ADC-входов, привязанное к конкретному устройству.
/// </summary>
public readonly struct ComAdcMessage
{
/// <summary>
/// Идентификатор устройства-источника.
/// </summary>
public readonly string DeviceId;
/// <summary>
/// Сырые значения ADC после префикса строки.
/// </summary>
public readonly string AdcValues;
/// <summary>
/// Создает снимок аналоговых ADC-входов от устройства.
/// </summary>
public ComAdcMessage(string deviceId, string adcValues)
{
DeviceId = deviceId ?? "";
AdcValues = adcValues ?? "";
}
}
/// <summary>
/// Результат попытки открыть ячейку призовой витрины.
/// </summary>
public readonly struct PrizeOpenResult
{
/// <summary>
/// Была ли выдача приза успешной.
/// </summary>
public readonly bool IsSuccess;
/// <summary>
/// Номер призовой ячейки.
/// </summary>
public readonly int BoxNumber;
/// <summary>
/// Сообщение о результате операции.
/// </summary>
public readonly string Message;
private PrizeOpenResult(bool isSuccess, int boxNumber, string message)
{
IsSuccess = isSuccess;
BoxNumber = boxNumber;
Message = message ?? "";
}
/// <summary>
/// Создает успешный результат выдачи приза.
/// </summary>
public static PrizeOpenResult Success(int boxNumber)
{
return new PrizeOpenResult(true, boxNumber, $"Ячейка {boxNumber} успешно открыта.");
}
/// <summary>
/// Создает результат с причиной отказа в выдаче.
/// </summary>
public static PrizeOpenResult Fail(int boxNumber, string message)
{
return new PrizeOpenResult(false, boxNumber, message);
}
}
/// <summary>
/// Один шаг световой последовательности на аппаратной плате.
/// </summary>
public readonly struct LightStep
{
/// <summary>
/// Световой режим платы.
/// </summary>
public readonly LightMode Mode;
/// <summary>
/// Количество циклов эффекта.
/// </summary>
public readonly float Cycles;
/// <summary>
/// Создает шаг светового эффекта с безопасным числом циклов.
/// </summary>
public LightStep(LightMode mode, float cycles)
{
Mode = mode;
Cycles = Mathf.Max(0f, cycles);
}
}
/// <summary>
/// Статус ячейки призовой витрины, полученный от контроллера.
/// </summary>
public enum PrizeBoxStatus
{
Ok,
OkWithCard,
Empty,
Open,
Opened,
OpenError,
ParsingError,
NotFound,
Error
}
/// <summary>
/// Значения четности serial-порта, независимые от конкретной реализации System.IO.Ports.
/// </summary>
public enum SerialParity
{
None,
Odd,
Even,
Mark,
Space
}
/// <summary>
/// Значения stop bits serial-порта, независимые от конкретной реализации System.IO.Ports.
/// </summary>
public enum SerialStopBits
{
None,
One,
Two,
OnePointFive
}
/// <summary>
/// Коды световых эффектов, которые понимает аппаратная плата.
/// </summary>
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
}
}