Пытается открыть ячейку по номеру (нумерация с 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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.