using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine.Events;
namespace DanroJump.Hardware.Com
{
///
/// Единая точка доступа к COM-подсистеме автомата: кредиты, ввод, витрина призов и подсветка.
///
public interface IComSystem :
IComCreditWallet,
IComInputSource,
IPrizeShowcaseGateway,
IComLightingController
{
bool IsRunning { get; }
string MainDeviceId { get; }
string PrizeStandDeviceId { get; }
IReadOnlyCollection ConnectedDeviceIds { get; }
UnityEvent DeviceAuthorized { get; }
UnityEvent DeviceDisconnected { get; }
///
/// Запускает поиск, авторизацию и фоновые циклы обмена данными с COM-устройствами.
///
void StartSystem();
///
/// Останавливает COM-подсистему и при необходимости отправляет устройствам команды выключения.
///
void StopSystem(bool sendShutdownCommands);
bool SendToMain(string command);
bool SendToDevice(string deviceId, string command);
void SendToAll(string command);
string GetDeviceRole(string deviceId);
string GetDeviceMac(string deviceId);
}
///
/// Хранилище кредитов, полученных от монетоприемника или другой платежной периферии.
///
public interface IComCreditWallet
{
int Credits { get; }
UnityEvent CreditAdded { get; }
UnityEvent CreditRemoved { get; }
UnityEvent CreditsChanged { get; }
///
/// Добавляет кредиты и уведомляет подписчиков об изменении баланса.
///
void AddCredit(int amount = 1);
///
/// Пытается списать кредиты без ухода в отрицательный баланс.
///
bool TrySpendCredits(int amount = 1);
///
/// Принудительно выставляет текущий баланс кредитов.
///
void SetCredits(int value);
}
///
/// Источник аппаратного ввода с основной платы: кнопки, сенсоры и последние биты состояния.
///
public interface IComInputSource
{
string LastMainInputBits { get; }
string LastMainAdcValues { get; }
UnityEvent MainInputReceived { get; }
UnityEvent MainAdcReceived { get; }
UnityEvent HopperSensorTriggered { get; }
///
/// Возвращает последнее известное состояние входов конкретного устройства.
///
string GetLastInputBits(string deviceId);
///
/// Возвращает последние известные ADC-значения конкретного устройства.
///
string GetLastAdcValues(string deviceId);
}
///
/// Шлюз для работы с призовой витриной и выдачей призов через аппаратные ячейки.
///
public interface IPrizeShowcaseGateway
{
UnityEvent PrizeBoxOpened { get; }
///
/// Запрашивает текущие статусы всех ячеек призовой витрины.
///
UniTask> GetPrizeBoxStatusesAsync(
CancellationToken cancellationToken = default);
UniTask GetReadyPrizeBoxesAsync(CancellationToken cancellationToken = default);
UniTask OpenPrizeBoxAsync(int boxNumber, CancellationToken cancellationToken = default);
UniTask ForceOpenPrizeBoxAsync(int boxNumber, CancellationToken cancellationToken = default);
bool SetPrizeStandIdleLighting();
bool HighlightPrizeBox(int boxNumber);
}
///
/// Контроллер аппаратной подсветки платы, шляпы и связанных световых сценариев.
///
public interface IComLightingController
{
void PlayBoardLight(LightMode mode, float cycles = -1f);
void PlayBoardLightSequence(IReadOnlyList steps, bool loop);
void PlayDefaultBoardLight();
void StopBoardLightSequence();
void StopAllBoardEffects();
void BlinkHat();
void BlinkHat(float intervalSeconds);
void StopHatBlink(bool leaveHatEnabled = true);
void PauseLighting();
void ResumeLighting();
}
///
/// Поставщик имен доступных COM-портов, вынесенный для тестов и подмены транспорта.
///
public interface IComPortProvider
{
string[] GetPortNames();
}
///
/// Фабрика транспорта поверх конкретных serial-настроек.
///
public interface IComTransportFactory
{
IComTransport Create(SerialSettings settings);
}
///
/// Минимальный serial-транспорт, который скрывает реализацию System.IO.Ports от остального кода.
///
public interface IComTransport : IDisposable
{
bool IsOpen { get; }
void Open();
void Close();
void DiscardInBuffer();
void DiscardOutBuffer();
string ReadLine();
void WriteLine(string value);
}
}