Commit as of 2026-02-18 17:04:59 by Dis_Bro (Данил)

This commit is contained in:
Данил Ярош 2026-02-18 17:04:59 +03:00
parent 89d6007dd8
commit 2f04363eff
10 changed files with 183 additions and 16 deletions

View File

@ -1,4 +1,2 @@
Файл для временного содержания
# Список установленных плагинов

View File

@ -0,0 +1,166 @@
#Периферия
by: \_sega
# Назначение
`PrizeStandController` — статический модуль для управления [[Витрина призов|призовой стойкой]] по COM-порту через `ComNativeWrapper`.
Поддерживается:
- Запрос статуса всех ячеек стойки (`25`)
- Автовыдача (открытие) конкретной ячейки (`2501XX`)
- Ожидание результата открытия по ответной строке устройства (`BOXn_OPENED / BOXn_OPEN_ERROR / BOXn_ERROR`)
Модуль рассчитан на **последовательное** выполнение операций: одновременно можно выполнять только одну выдачу.
## Внешние зависимости
- `ComNativeWrapper`:
    - `Serial_WriteStringUTF8(int handleId, string utf8, int appendNewline)`
    - `Serial_ReadLineUTF8_bytes(int handleId, byte[] buffer, int bufferLen)`
    - `GetLastError()`
- `ILogger` (опционально): интерфейс логгера с методом `.Log(string message)`
- Unity (используются `Task`, и общая логика под Unity runtime)
# Протокол периферийного устройства
## Запрос статуса:
- Команда: `25`
- Ответ: несколько строк, например:
    - `BOX1_OK`
    - `BOX2_OK+CARD`    
    - `BOX3_EMPTY`
    - `BOX4_OPEN`
    - `BOX5_ERROR`
## Открытие ячейки:
- Команда: `2501XX` (XX — номер ячейки, 2 знака, например `01`)
- Ответ (через 1–3 секунды): одна строка:
    - `BOX1_OPENED`
    - `BOX2_OPEN_ERROR`
    - `BOX5_ERROR`
## Статусы ячеек
Enum `BoxStatus` используется и для статусов “до открытия”, и для результата “после открытия”.
### Статусы до открытия:
- `OK` — можно выдавать
- `OKplusCard` — можно выдавать + активна выдача по карте
- `Empty` — пусто, выдавать нельзя
- `Open` — дверь уже открыта
- `Error` — ошибка/неисправность/недопустимое состояние
### Статусы после открытия:
- `OPENED` — успешно открылась
- `OPEN_ERROR` — ошибка открытия
### Служебные:
- `ParsingError` — пришёл неожиданный формат/статус
- `NotFound` — нужный бокс не найден в ответах или таймаут
# Публичное API
## События
### InitializationComplete(bool success, string message)
Вызывается после `Initialize`:
- `success == true` — инициализация успешна
- `message` — подробности (предупреждения/ошибки)
### OpeningFinished(bool success, string message)
Вызывается после попытки открыть ячейку (успех/ошибка):
- при успехе: `success == true`
- при ошибке: `success == false`, в message причина
## Методы
### Initialize(int handleId, int countOfBoxes, ILogger logger)
Инициализирует модуль.
Параметры:
- `handleId` — значение хэндла, полученное из `ComNativeWrapper.Serial_Open` (должно быть `> 0`)
- `countOfBoxes` — кол-во физ. ячеек стойки (должно быть `> 0`)
- `logger` — опциональный логгер
Поведение:
- Если входные параметры невалидны:
    - `initialized=false`, `handle=-1`, `boxesCount=0`
    - срабатывает `InitializationComplete(false, message)`
- Если валидны:
    - `initialized=true`
    - срабатывает `InitializationComplete(true, message)`
### Task OpenBoxAsync(int boxNumber)
Пытается открыть ячейку по номеру (нумерация с 1).
Этапы:
1. Проверяет, не выполняется ли уже выдача (через `SemaphoreSlim`).
2. Выполняет валидацию:
    - модуль инициализирован
    - номер ячейки в диапазоне `1..boxesCount`
    - отправляет `25`, читает статусы и проверяет, что статус ячейки один из:
        - `OK` / `OKplusCard`
3. Отправляет команду открытия `2501XX`
4. Ожидает ответ по результату открытия (таймаут `WAIT_OPEN_STATUS_TIMEOUT`)
5. Вызывает событие `OpeningFinished(...)`
Результат:
- Успех: если считан статус `OPENED`
- Неуспех: любые другие статусы или таймаут/ошибки чтения/парсинга
# Ограничения и важные замечания
## 1) Только одна операция выдачи одновременно
Модуль использует `_lock` (`SemaphoreSlim(1,1)`). Если попытаться вызвать `OpenBoxAsync` во время выполнения другой выдачи — придёт ошибка “Выдача уже в процессе”.  
## 2) Таймауты
Используются:
- `STATUS_REQUEST_TIMEOUT = 3s` — ожидание статусов после `25`
- `WAIT_OPEN_STATUS_TIMEOUT = 5s` — ожидание результата открытия после `2501XX`
Также важен **таймаут чтения** на уровне периферии/порта (рекомендуется ≥10 мс), иначе при `entryLength==0` возможен busy loop.
# Пример использования
```csharp
PrizeStandController.InitializationComplete += (ok, msg) =>
{
    Debug.Log($"Init: {ok}\n{msg}");
};
PrizeStandController.OpeningFinished += (ok, msg) =>
{
    Debug.Log($"Open result: {ok}\n{msg}");
};
// handleId получен из ComNativeWrapper.Serial_Open(...)
PrizeStandController.Initialize(handleId, 5, logger);
// Открыть ячейку №2
await PrizeStandController.OpenBoxAsync(2);
```
# Типичные ошибки и диагностика
- `InitializationComplete(false, ...)`:
    - `handleId <= 0` — порт не открыт
    - `countOfBoxes <= 0` — неверно задано количество ячеек
- `OpeningFinished(false, "Выдача уже в процессе")`:
    - параллельные вызовы `OpenBoxAsync`
- `BoxStatus.NotFound`:
    - таймаут ожидания ответа от устройства
    - устройство не прислало нужную строку
- `BoxStatus.ParsingError`:
    - ответ не соответствует формату `BOX<номер>_<статус>`

View File

@ -1,3 +1,7 @@
#Периферия
by: Паша Николаевич
Дополнительные команды для призовой стойки
# Описание витрины призов

View File

@ -1,3 +1,7 @@
#Периферия
by: Паша Николаевич
>[!info] Информация
>Это раздел с информацией о плате периферийного контроллера.
>Информацию о плате для витрины призов смотреть в [[Витрина призов]]

View File

@ -1,6 +1,7 @@
#Периферия
by:kotovskij393
>[!attention] ВНИМАНИЕ
>В папку StreamingAssets положить лаунчер. Файл `.lic` ==не сливать==

View File

@ -1,3 +1,5 @@
#Организация
1. Сначала добавляемый файл отправляется в папку [Карантин](file:///B:/!ФайлОбменник!/Юнити_Разработка/Библиотека/Карантин)
2. В эту базу пишется ридмишка со ссылкой на файл (что умеет, как работает, микро документация)
3. Добавленный файл подвергается жестокой критике.

View File

@ -1,3 +1,5 @@
#Организация
# Организация
## Текущие вопросы

View File

@ -1,3 +1,5 @@
#Организация #Код
# C#/Unity
## 1. Именование и стиль C#

View File

@ -1,14 +0,0 @@
## Текущее положение дел у программистов
---
## Как есть
---
## Как должно быть
---

View File

@ -1,3 +1,5 @@
#Гайды
```
[Ссылка на билды фишки](file:///B:/!ФайлОбменник!/Юнити_Разработка/Builds/Conect4_builds)
```