Přeskočit obsah

Kořen kompozice

Produkt vytváří všechny objekty knihovny v main.cpp jako statické proměnné a předává závislosti skrze konstruktory. Bez továren, bez globálního registru — jen explicitní montáž.

Pořadí vytvoření objektů

Závislosti se budují zdola nahoru: nejdříve vrstva platformy, pak cloud stack, pak runtime.

// 1. Vrstva platformy
idryer::ArduinoWifiStore       s_wifiStore;      // NVS: SSID/password
idryer::ArduinoWifiManager     s_wifi;           // Správa WiFi
idryer::ArduinoCredentialStore s_credentials;    // NVS: serial/token/deviceId
idryer::ArduinoHttpClient      s_http;           // TLS HTTP pro provisioning

// 2. Cloud stack
idryer::cloud::HttpApi           s_api(&s_http, IDRYER_API_BASE);
idryer::MqttClient               s_mqtt;
idryer::cloud::CloudStateMachine s_cloud(&s_wifi, &s_credentials, &s_api, &s_mqtt);
idryer::ActionDispatcher         s_dispatcher;

// 3. Profil produktu (implementuje IProfile) — kód produktu, ne knihovny
LedStripProfile s_profile(&s_executor);

// 4. Runtime — spojuje všechno dohromady
idryer::IdryerRuntime s_runtime(&s_cloud, &s_dispatcher, &s_profile, &s_mqtt);

Co dělá setup()

void setup() {
    // HAL: logy jdou do /dev/null, zatímco Improv vlastní Serial
    idryer::hal::initArduinoHal(nullptr);

    // Obnovit uložené přihlašovací údaje WiFi
    char ssid[64], pass[64];
    if (s_wifiStore.load(ssid, sizeof(ssid), pass, sizeof(pass))) {
        s_wifi.begin(ssid, pass);
    }

    // Vygeneruj serial z MAC, pokud dosud není přítomen
    s_credentials.seedSerialFromMac();

    // Registruj obsluhy příkazů
    s_dispatcher.setInvokeHandler(onInvoke, nullptr);
    s_dispatcher.setSetCallback(onSetCommand, nullptr);

    // Volitelně: reaguj na přechody stavového stroje
    s_cloud.setStateChangeCallback([](auto prev, auto, void*) {
        if (prev == idryer::cloud::CloudState::WifiConnecting)
            configTime(0, 0, "pool.ntp.org", "time.google.com");
    }, nullptr);

    // Automatické claim pro samostatná zařízení
    s_cloud.setUnclaimedCallback([](void*) {
        s_cloud.requestClaim();
    }, nullptr);

    // Spustit runtime
    s_runtime.begin();
}

void loop() {
    s_runtime.loop();     // CloudStateMachine + IProfile::loop()
    // ... logika produktu (senzory, telemetrie)
}

Pravidla montáže

  • Všechny objekty knihovny jsou statické (static). Žádné new nebo malloc pro objekty nejvyšší úrovně.
  • runtime.begin() se volá poslední v setup(), po registraci všech handlerů.
  • runtime.loop() se volá první v loop().
  • Objekty produktu (senzory, telemetrie) se vytváří samostatně a připojují se přímo k s_mqtt — runtime o nich neví.

Úplný kořen kompozice Storage Link je v src/main.cpp v repozitáři iDryer-Storage (publikován samostatně).

Vrstvy zařízení v pořadí montáže:

Vrstva Objekty Zdroj
Platforma s_wifiStore, s_wifi, s_credentials, s_http idryer-core
Cloud s_api, s_mqtt, s_cloud, s_dispatcher idryer-core
Zařízení s_executor, s_profile src/storage/led_strip/
Runtime s_runtime idryer-core
Senzory s_sensor, s_telemetry src/storage/sensors/, src/storage/telemetry/