Перейти к содержанию

Граница: библиотека и продукт

Что живёт в библиотеке

Библиотека (lib/idryer-core/) содержит:

  • Весь сетевой стек: WiFi, HTTP, MQTT, TLS.
  • Протокол provisioning/claiming.
  • Облачный стейт-машин (CloudStateMachine).
  • UART-бридж и протокол кадров.
  • Клиенты интеграций (Bambu, HA, Moonraker).
  • Интерфейсы устройства (IWifiManager, ICredentialStore, IHttpClient, IProfile).
  • Arduino-реализации этих интерфейсов.
  • Топики MQTT и логику подписки/публикации.

Признак кода в библиотеке: продукт с любым железом может подключить его без изменений.

Что живёт в продукте

Продукт (src/) содержит:

  • Реализацию IProfile — конфигурация, info-payload, applyConfig.
  • Бизнес-логику конкретного устройства (управление LED, сушка, нагрев).
  • Обработчики onInvoke / onSetCommand.
  • Продуктовые сенсоры и публикацию телеметрии.
  • Инициализацию периферии (FastLED, Wire, ImprovWiFi).
  • Composition root в main.cpp.

Признак кода в продукте: без замены железа или конфигурации он бессмысленен.

Конкретные примеры

Код Где живёт Почему
MqttClient библиотека любому продукту нужен MQTT
CloudStateMachine библиотека provisioning/claiming одинаков для всех
ArduinoWifiManager библиотека WiFi-подключение не зависит от продукта
LedStripProfile продукт специфика Storage Link TODO: общее название Storage во всем докумете
LedStripExecutor продукт управляет FastLED, не нужен другим устройствам
Sht31ClimateSensor продукт конкретный сенсор конкретного продукта
StorageTelemetryPublisher продукт знает о формате телеметрии Storage Link
IProfile библиотека контракт, который библиотека вызывает
BambuClient библиотека интеграция переиспользуется в iDryer и iHeater

Интерфейсы как граница

Библиотека знает о продукте только через IProfile. Всё взаимодействие идёт через пять методов:

profile->onOnline();               // библиотека → продукт: первый выход в онлайн
profile->loop();                   // библиотека → продукт: каждый цикл
profile->buildInfoJson(buf, len);  // библиотека → продукт: нужен info-payload
profile->getConfig(doc);           // библиотека → продукт: нужен конфиг
profile->applyConfig(id, val);     // библиотека → продукт: пришла команда set

Продукт знает о библиотеке через MqttClient (для публикации телеметрии/событий) и через колбэки ActionDispatcher (для команд).

Что не должно пересекать границу

  • Библиотека не должна включать продуктовые заголовки.
  • Продукт не должен вызывать CloudStateMachine::handleProvisioning() или другие приватные методы стека напрямую — только через публичный API.
  • Продуктовая телеметрия публикуется напрямую в s_mqtt.publishTelemetry() — рантайм её не видит.