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