Встроенное программное обеспечение видеоларингоскопа «СЕНСАР»
Версия ПО: 1.15
Дата: 23.02.2026
Встроенное программное обеспечение видеоларингоскопа «СЕНСАР» является управляющим программным обеспечением видеоларингоскопа, предназначенного для визуализации дыхательных путей и голосовых связок во время эндотрахеальной интубации, а также для осмотра и обследования верхних дыхательных путей, в том числе при проведении отдельных ЛОР-процедур.
Программное обеспечение обеспечивает захват изображения с эндоскопической камеры в режиме реального времени, отображение видеопотока на встроенном дисплее, фотосъёмку и видеозапись, просмотр медиатеки, передачу видеопотока по сети, а также управление системными параметрами устройства.
Целевое аппаратное обеспечение: встраиваемая платформа на базе системы-на-кристалле Rockchip RV1126 с процессорным ядром ARM Cortex-A7 (4 ядра).
Программное обеспечение разработано на языке C++11 с применением фреймворка Qt версии 5.9.4 и декларативного языка разметки интерфейса QML.
Версия программного обеспечения: 1.15
Область применения: медицинские учреждения, скорая медицинская помощь, анестезиология и реаниматология.
Идентификационные наименования компонентов:
Исполняемый файл: sensar
Файл проекта Qt: src/sensar.pro
Точка входа: src/main.cpp
QML точка входа: qrc:/qml/main.qml
Программное обеспечение построено по модульной архитектуре. Ядро системы реализовано на языке C++11 и отвечает за бизнес-логику, взаимодействие с аппаратным обеспечением и управление ресурсами.
Пользовательский интерфейс реализован на декларативном языке QML с применением фреймворка Qt Quick.
Основной паттерн организации: синглтон — каждый функциональный модуль представлен единственным экземпляром объекта, созданным в функции main() и зарегистрированным в контексте QML.
Взаимодействие между модулями осуществляется через механизм сигналов и слотов Qt.
| Имя в QML | Класс C++11 | Описание |
|---|---|---|
| splashScreen | SplashScreen | Управление экраном загрузки |
| navigationController | NavigationController | Стековая навигация между экранами |
| cameraManager | CameraManager | Управление жизненным циклом камеры |
| mediaStorage | MediaStorage | Управление хранилищем медиафайлов |
| photoCapture | PhotoCapture | Фотосъёмка |
| videoEncoder | VideoEncoder | Видеозапись |
| inputHandler | InputHandler | Обработка аппаратных кнопок |
| galleryModel | GalleryModel | Модель фотогалереи |
| videoGalleryModel | VideoGalleryModel | Модель видеогалереи |
| systemMetrics | SystemMetrics | Сбор метрик производительности |
| diskSpaceMonitor | DiskSpaceMonitor | Мониторинг дискового пространства |
| batteryWarningController | BatteryWarningController | Предупреждения о заряде батареи |
| autoCleanup | AutoCleanup | Автоматическая очистка хранилища |
| settingsManager | SettingsManager | Управление настройками |
| wifiManager | WiFiManager | Управление Wi-Fi подключением |
| mjpegServer | MjpegStreamingServer | HTTP MJPEG стриминг |
| tcpStream | TcpStreamClient | TCP мониторинг |
| nfcReader | NfcConfigReader | Считывание конфигурации с NFC |
| Translations | Translations | Локализация интерфейса |
| brightnessController | BrightnessController | Управление яркостью |
| inactivityMonitor | InactivityMonitor | Мониторинг бездействия |
MjpegAviPlayer — воспроизведение видеозаписей в формате MJPEG AVI;
CameraPreviewItem — отображение кадров с камеры в режиме реального времени.
nfcReader → wifiManager: передача параметров Wi-Fi;
wifiManager → tcpStream: изменение состояния подключения;
nfcReader → tcpStream: передача TCP конфигурации;
cameraManager → tcpStream: передача JPEG кадров;
cameraManager → systemMetrics: подсчёт FPS.
| Компонент | Характеристика |
|---|---|
| Процессор | Rockchip RV1126, ARM Cortex-A7 x4 |
| ОЗУ | 1.75 ГБ DDR |
| Накопитель | eMMC |
| Дисплей | 4.5” IPS, 854×480 |
| Камера | USB UVC, до 1280×720 |
| Батарея | Li-ion |
| Wi-Fi | 802.11 b/g/n |
| NFC | FM17580 |
| Кнопки | 6 аппаратных |
| LED | work_led |
| USB | Type-C |
| Подсветка | 0–255 |
V4L2Camera — низкоуровневое взаимодействие с камерой через Video4Linux2;
CameraManager — управление жизненным циклом камеры;
CameraWatchdog — мониторинг подключения камеры.
При запуске выполняется сканирование устройств /dev/video0 — /dev/video9. После обнаружения камера инициализируется с выбором оптимального формата и разрешения.
CameraWatchdog работает в отдельном потоке и проверяет состояние камеры каждую секунду.
Приоритет форматов:
1. MJPEG
2. YUYV
3. RGB24
Разрешения:
1920×1080
1280×720
960×540
640×480
Используется V4L2 mmap:
VIDIOC_REQBUFS
VIDIOC_QBUF
VIDIOC_DQBUF
Используется libturbojpeg:
Формат: TJPF_BGRA
Флаг: TJFLAG_FASTDCT
Аппаратное ускорение: SIMD NEON
При 720p выполняется downscale до 640×360.
frameReady(QImage) — кадр для UI
rawFrameReady — JPEG данные
Класс: PhotoCapture
Формат: JPEG
Разрешение: максимальное
Имя файла: photo_yyyyMMdd_HHmmss.jpg
Путь: /userdata/media/photos/
После сохранения обновляется GalleryModel.
Класс: VideoEncoder
Контейнер: AVI
Кодек: MJPEG
Частота: 30 fps
Имя: video_yyyyMMdd_HHmmss.avi
Путь: /userdata/media/videos/
Создаётся thumbnail для галереи.
Запись управляется кнопкой SENSAR_TRIGGER.
Во время записи InactivityMonitor не даёт устройству уснуть.
MjpegAviPlayer — QML компонент
MjpegDecoderWorker — поток декодирования
Проверка RIFF сигнатуры.
Чтение usPerFrame (смещение 0x20).
Если отсутствует — используется 15 fps.
Используется chunk idx1.
При отсутствии — полный скан файла.
Файл мапится в память (mmap).
libturbojpeg:
TJPF_BGRA
TJFLAG_FASTDCT
При ширине ≥1280 выполняется downscale.
Цепочечный таймер — следующий кадр после рендера предыдущего.
Адаптивное планирование:
Компенсация задержек
Сброс при отставании >3 кадров
| Свойство / Метод | Тип | Описание |
|---|---|---|
| source | string | Путь к файлу |
| playing | bool | Состояние |
| duration | int | Длительность |
| position | int | Позиция |
| play() | метод | Запуск |
| pause() | метод | Пауза |
| stop() | метод | Стоп |
| seek(pos) | метод | Переход |
| seekRelative(delta) | метод | Относительный переход |
GalleryModel — модель фотогалереи
VideoGalleryModel — модель видеогалереи
Файлы: /userdata/media/photos/
Сортировка: от новых к старым
Файлы: /userdata/media/videos/
Отображается длительность
Сортировка: от новых к старым
Тип: in-memory
Размер: 50 элементов
Размер миниатюры: 210×155
CameraPreviewItem — отображение кадра
FrameProvider — поставщик изображений
Используется QPainter::drawImage.
Синхронизация через QMutex.
При отсутствии сигнала — чёрный экран.
Класс: WiFiManager
Интерфейс: wlan0
Стандарт: 802.11 b/g/n
Управление: wpa_cli
IP: udhcpc
iw dev wlan0 set power_save off
| Таймер | Интервал | Назначение |
|---|---|---|
| Статус подключения | 5 сек | Проверка состояния |
| Сигнал изменения | 10 сек | Уведомление UI |
| Сканирование | 3 сек | Чтение сетей |
| RSSI | Уровень |
|---|---|
| ≥ −50 | 4 (отличный) |
| −60 … −51 | 3 |
| −70 … −61 | 2 |
| −80 … −71 | 1 |
| < −80 | 0 |
Формат: bssid, freq, signal, flags, ssid
Класс: MjpegStreamingServer
Протокол: HTTP
GET /stream
Порт: 8080
Content-Type: multipart/x-mixed-replace
Каждый кадр:
Content-Type: image/jpeg
Content-Length + JPEG данные
Поддержка нескольких клиентов.
Стриминг активен при наличии Wi-Fi.
Класс: TcpStreamClient
Передача видеопотока по TCP (ImagePDU)
Порты: 6123, 1312
SO_SNDBUF 512 КБ
TCP_NODELAY
MSG_NOSIGNAL
Префикс: ##100006##
Длина: 4 байта
Данные: JPEG
1. Отправка ##100002##
2. Таймаут 3 сек
3. Проверка ответа
JPEG → quality=30
TJFLAG_FASTDCT
50 мс — отмена начала
500 мс — отмена отправки
Приоритетные хосты:
1, 100, 200, 50, 2, 254, 101, 10, 81
Таймауты:
150 мс — приоритет
100 мс — остальные
| Параметр | Значение |
|---|---|
| Задержка | 3 сек |
| Циклы | 5 |
| Пауза | 5 сек |
| Попытки | 10 |
| Пауза попыток | 1 сек |
Подключено — постоянный свет
Нет — мигание
Классы: NfcConfigReader, NfcUartWorker
Чип: FM17580
Интерфейс: UART (/dev/ttyS4)
Скорость: 115200 бод
Инициализация: 6 байт
Poll: 16 байт (каждую секунду)
SSID|PASSWORD
Минимум: 5 байт
Длина: recv_buf[3]
Отдельный поток pthread
select таймаут: 10 сек
tagRead → wifiConfigReceived → WiFiManager
Класс: SettingsManager
Формат: JSON
Путь: /userdata/settings.json
| Параметр | Тип | Значения | Описание |
|---|---|---|---|
| Wi-Fi | bool | true/false | Вкл/выкл |
| Дата/время | string | ISO 8601 | Системное время |
| Формат времени | enum | 24h/12h | Отображение |
| Яркость | int | 0–255 | Подсветка |
| Язык | enum | RU/EN | Интерфейс |
Debounce: запись через 500 мс после изменения
Класс: BrightnessController
Путь: /sys/class/backlight/backlight/brightness
Диапазон: 0–255
Значение сохраняется в SettingsManager.
Класс: InactivityMonitor
Активное
Ожидание
Сон
| Таймер | Интервал | Действие |
|---|---|---|
| Бездействие | 600000 мс | Сон |
| Обратный отсчёт | 10 сек | Переход |
| Автовыключение | 1800000 мс | poweroff |
Остановка камеры
Сохранение яркости
brightness = 0
LED off
Отключение питания
USB on
LED on
Восстановление яркости
execv() перезапуск
При видеозаписи сон отключён
InactivityMonitor::resetActivity()
Класс: BatteryWarningController
/sys/class/power_supply/rk-bat/capacity
| Уровень | Действие |
|---|---|
| 35% | Предупреждение |
| 30% | Предупреждение |
| 25% | Предупреждение |
| 20% | Предупреждение |
| 15% | Предупреждение |
| 10% | Предупреждение |
| 5% | Предупреждение |
| Заряд | Цвет |
|---|---|
| ≥ 60% | Зелёный |
| 40–59% | Жёлтый |
| 20–35% | Оранжевый |
| < 20% | Красный |
Классы: DiskSpaceMonitor, AutoCleanup
Интервал: 30 сек
| Заполненность | Цвет |
|---|---|
| < 70% | Зелёный |
| 70–89% | Жёлтый |
| ≥ 90% | Красный |
Запуск при >70%
Очистка до 30%
Удаляются старые файлы
Класс: InputHandler
/dev/input/event0–4
O_RDONLY | O_NONBLOCK
QSocketNotifier
EV_KEY
| Имя | Код | Значение | Назначение |
|---|---|---|---|
| SENSAR_TRIGGER | 59 | KEY_F1 | Фото/видео |
| SENSAR_OK | 30 | KEY_A | Подтверждение |
| SENSAR_UP | 103 | KEY_UP | Вверх |
| SENSAR_DOWN | 108 | KEY_DOWN | Вниз |
| SENSAR_MENU | 48 | KEY_B | Меню |
| SENSAR_POWER | 116 | KEY_POWER | Питание |
Удержание >2 сек:
Отключение подсветки
sync()
/sbin/poweroff
_exit(0)
InactivityMonitor::resetActivity()
Класс: Translations
Языки:
RU
EN
Хранение строк в C++.
Обновление без перезапуска.
Класс: Logger
Путь: /tmp/sensar.log
Пересоздаётся при запуске
Уровни:
DEBUG
INFO
WARNING
CRITICAL
Класс: SystemMetrics
Файл: /userdata/logs/sensar_metrics.csv
Формат: CSV
| Метрика | Источник |
|---|---|
| FPS | CameraManager |
| RAM | /proc/meminfo |
| CPU | /proc/stat |
| Температура | /sys/class/thermal |
| Диск | statvfs() |
| Батарея | /sys/class/power_supply |
Qt Quick / QML
854×480
Сенсор + кнопки
| Экран | Описание |
|---|---|
| SplashScreen | Загрузка |
| MainMenu | Меню |
| CameraView | Камера |
| PhotoGallery | Фото |
| PhotoViewer | Просмотр фото |
| VideoGallery | Видео |
| VideoPlayer | Плеер |
| GuideScreen | Инструкция |
| SettingsScreen | Настройки |
| WifiSettingsScreen | Wi-Fi |
| Оверлей | Назначение |
|---|---|
| StatusBar | Статус |
| BatteryWarning | Батарея |
| SleepCountdown | Сон |
| DiskWarning | Диск |
| NfcOverlay | NFC |
NavigationController
Стек экранов
Текст + изображения
Локализация
Язык
Яркость
Формат времени
Дата/время
Диск
Вкл/выкл
Сканирование
Подключение
Статус
| Тип | Формат | Расширение | Путь | Описание |
|---|---|---|---|---|
| Фото | JPEG | .jpg | /userdata/media/photos/ | Полное |
| Видео | MJPEG AVI | .avi | /userdata/media/videos/ | 30 fps |
| Настройки | JSON | .json | /userdata/settings.json | Параметры |
| Метрики | CSV | .csv | /userdata/logs/ | Данные |
| Лог | Text | .log | /tmp/ | Журнал |
| Библиотека | Назначение |
|---|---|
| Qt 5.9.4 | UI |
| FFmpeg | AVI |
| libturbojpeg | JPEG |
| POSIX | Системные API |
| wpa_supplicant | Wi-Fi |
| udhcpc | DHCP |
Компиляция: ARM Cortex-A7 (armhf), C++11
| Ресурс | Требование |
|---|---|
| ОЗУ | ~100 МБ |
| Диск | ≥ 500 МБ |
| CPU | ≥ 1 ГГц |
Нет H.264 — используется MJPEG
LED не отключается программно
Графика: linuxfb / DRM
Linux
V4L2, evdev, sysfs
wpa_supplicant
udhcpc
iw
Версия: 1.15
Дата: 23.02.2026
Разработчик: ООО «ШИФТАПП»
Обработка персональных данных на основании 152-ФЗ