Metadata-Version: 2.4
Name: dubina
Version: 1.1.0
Summary: Библиотека для управления роботами-манипуляторами с очередью клиентов и веб-интерфейсом.
Author-email: p5ych0p41h <email@email.com>
License: MIT
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.9
Description-Content-Type: text/markdown
Requires-Dist: pyserial
Requires-Dist: colorama
Requires-Dist: Flask
Requires-Dist: Flask-SocketIO
Requires-Dist: eventlet

# Библиотека Dubina

Библиотека для централизованного управления роботами-манипуляторами с поддержкой электронной очереди клиентов и веб-интерфейсом для мониторинга.

## Установка

```bash
pip install dubina
```

## Возможности версии 1.1.0

- **Управление очередью без задержек**: мгновенный переход хода к следующему клиенту при завершении работы текущего.
- **Детекция отключений и очистка «призраков»**: мгновенное исключение клиентов, разорвавших соединение во время ожидания в очереди.
- **Поддержка нескольких манипуляторов (хаб на Raspberry Pi)**:
  - Возможность явного указания COM/Serial порта (`serial_port='/dev/manipulator1'`).
  - Эксклюзивный захват порта (`exclusive=True`), предотвращающий сброс и конфликты при параллельной работе нескольких манипуляторов.
- **Ограничение времени сессии (`max_session_time`)**: автоматическое освобождение манипулятора при зависании или отсутствии `close()`.
- **Оптимизация под слабые процессоры**: устранение 100% загрузки CPU в циклах ожидания пакетов.

## Пример использования

### Запуск сервера (на хабе / Raspberry Pi)
```python
from dubina import Server

# Запуск сервера для манипулятора SD1 на порту 5000
server = Server(
    manipulator_type="sd1",
    port=5000,
    serial_port="/dev/ttyUSB0",  # или явный путь /dev/manipulator1
    internal_port=50055,
    max_session_time=120
)
server.start()
```

### Запуск клиента
```python
from dubina import SD1

arm = SD1(host="192.168.1.50", port=5000, name="Ivanov Ivan")
arm.calibrate()
arm.move_to(100, 100, 50)
arm.close()
```
