diff --git a/GreatGamedevVault/TEMP.md b/GreatGamedevVault/TEMP.md index 9f2407e..87b0dd8 100644 --- a/GreatGamedevVault/TEMP.md +++ b/GreatGamedevVault/TEMP.md @@ -1,4 +1,2 @@ Файл для временного содержания -# Список установленных плагинов - diff --git a/GreatGamedevVault/Библиотека скриптов/2. Периферия/PrizeStandController.md b/GreatGamedevVault/Библиотека скриптов/2. Периферия/PrizeStandController.md new file mode 100644 index 0000000..26dc1a7 --- /dev/null +++ b/GreatGamedevVault/Библиотека скриптов/2. Периферия/PrizeStandController.md @@ -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<номер>_<статус>` \ No newline at end of file diff --git a/GreatGamedevVault/Библиотека скриптов/2. Периферия/Витрина призов.md b/GreatGamedevVault/Библиотека скриптов/2. Периферия/Витрина призов.md index b5e92ef..f008c87 100644 --- a/GreatGamedevVault/Библиотека скриптов/2. Периферия/Витрина призов.md +++ b/GreatGamedevVault/Библиотека скриптов/2. Периферия/Витрина призов.md @@ -1,3 +1,7 @@ +#Периферия + +by: Паша Николаевич + Дополнительные команды для призовой стойки # Описание витрины призов diff --git a/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md b/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md index 9adbba9..17b2e4f 100644 --- a/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md +++ b/GreatGamedevVault/Библиотека скриптов/2. Периферия/Система команд платы v2.x.md @@ -1,3 +1,7 @@ +#Периферия + +by: Паша Николаевич + >[!info] Информация >Это раздел с информацией о плате периферийного контроллера. >Информацию о плате для витрины призов смотреть в [[Витрина призов]] diff --git a/GreatGamedevVault/Библиотека скриптов/2. Периферия/🔒Защита от Кости (Лицензирование).md b/GreatGamedevVault/Библиотека скриптов/2. Периферия/🔒Защита от Кости (Лицензирование).md index 7d1b13a..6d5cb94 100644 --- a/GreatGamedevVault/Библиотека скриптов/2. Периферия/🔒Защита от Кости (Лицензирование).md +++ b/GreatGamedevVault/Библиотека скриптов/2. Периферия/🔒Защита от Кости (Лицензирование).md @@ -1,6 +1,7 @@ #Периферия by:kotovskij393 + >[!attention] ВНИМАНИЕ >В папку StreamingAssets положить лаунчер. Файл `.lic` ==не сливать== diff --git a/GreatGamedevVault/Организация/Добавление файла в библиотеку.md b/GreatGamedevVault/Организация/Добавление файла в библиотеку.md index b4aabe9..a0d411e 100644 --- a/GreatGamedevVault/Организация/Добавление файла в библиотеку.md +++ b/GreatGamedevVault/Организация/Добавление файла в библиотеку.md @@ -1,3 +1,5 @@ +#Организация + 1. Сначала добавляемый файл отправляется в папку [Карантин](file:///B:/!ФайлОбменник!/Юнити_Разработка/Библиотека/Карантин) 2. В эту базу пишется ридмишка со ссылкой на файл (что умеет, как работает, микро документация) 3. Добавленный файл подвергается жестокой критике. diff --git a/GreatGamedevVault/Организация/Организационная структура.md b/GreatGamedevVault/Организация/Организационная структура.md index 4019ea3..fd9c3c8 100644 --- a/GreatGamedevVault/Организация/Организационная структура.md +++ b/GreatGamedevVault/Организация/Организационная структура.md @@ -1,3 +1,5 @@ +#Организация + # Организация ## Текущие вопросы diff --git a/GreatGamedevVault/Организация/Стандарты.md b/GreatGamedevVault/Организация/Стандарты.md index 3d54d9c..626d6f9 100644 --- a/GreatGamedevVault/Организация/Стандарты.md +++ b/GreatGamedevVault/Организация/Стандарты.md @@ -1,3 +1,5 @@ +#Организация #Код + # C#/Unity ## 1. Именование и стиль C# diff --git a/GreatGamedevVault/Организация/Технологический доклад.md b/GreatGamedevVault/Организация/Технологический доклад.md deleted file mode 100644 index e7d2c03..0000000 --- a/GreatGamedevVault/Организация/Технологический доклад.md +++ /dev/null @@ -1,14 +0,0 @@ -## Текущее положение дел у программистов - - ---- - -## Как есть - - ---- -## Как должно быть - - - ---- diff --git a/GreatGamedevVault/Приколы(фичи)/Ссылка на папку вне хранилища.md b/GreatGamedevVault/Приколы(фичи)/Ссылка на папку вне хранилища.md index ec70abc..9ef2498 100644 --- a/GreatGamedevVault/Приколы(фичи)/Ссылка на папку вне хранилища.md +++ b/GreatGamedevVault/Приколы(фичи)/Ссылка на папку вне хранилища.md @@ -1,3 +1,5 @@ +#Гайды + ``` [Ссылка на билды фишки](file:///B:/!ФайлОбменник!/Юнити_Разработка/Builds/Conect4_builds) ```