projet crepp_git/crepp-projects/station-meteo/firmware/receiver/v1.0 · branche main
UpdatableWidgets.h Voir sur GitLab
// UpdatableWidgets.h - Versions updatables des widgets principaux
#pragma once
#include "WidgetUpdater.h"
#include "Widget.h"
#include "Widgets.h"
#include "WeatherData.h"
#include "Theme.h"
#include "Tabs.h"  // Pour avoir la définition de IndoorSensor

// Pas besoin de redeclarer gSensors ici car il est dans Tabs.h
// Les déclarations externes sont déjà dans Tabs.h

// ════════════════════════════════════════════════════════════════════════════
// UpdatableMainTempWidget — version updatable du widget température principale
// ════════════════════════════════════════════════════════════════════════════
class UpdatableMainTempWidget : public WidgetMainTemp, public UpdatableWidget {
private:
    bool dirty;
    int lastTemp;
    int lastHumidity;
    unsigned long lastDataUpdate;
    
public:
    UpdatableMainTempWidget(int x, int y, int w, int h) 
        : WidgetMainTemp(x, y, w, h), dirty(true), lastTemp(-999), lastHumidity(-999), lastDataUpdate(0) {
        widgetX = x; widgetY = y; widgetW = w; widgetH = h;
    }
    
    void setDirty(bool d) override { dirty = d; }
    bool isDirty() override { return dirty; }
    
    bool needsUpdate() override {
        if (gWeather.temp != lastTemp || gWeather.humidity != lastHumidity) {
            lastTemp = gWeather.temp;
            lastHumidity = gWeather.humidity;
            lastDataUpdate = millis();
            return true;
        }
        if (millis() - lastDataUpdate > 10000) {
            lastDataUpdate = millis();
            return true;
        }
        return false;
    }
    
    void update(TFT_eSPI& tft, bool forceRedraw = false) override {
        if (forceRedraw || needsUpdate() || dirty) {
            tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
            draw(tft);
            dirty = false;
        }
    }
    
    void draw(TFT_eSPI& tft) override {
        WidgetMainTemp::draw(tft);
    }
};

// ════════════════════════════════════════════════════════════════════════════
// UpdatableForecastWidget — version updatable des prévisions
// ════════════════════════════════════════════════════════════════════════════
class UpdatableForecastWidget : public WidgetForecast, public UpdatableWidget {
private:
    bool dirty;
    unsigned long lastUpdate;
    
public:
    UpdatableForecastWidget(int x, int y, int w, int h) 
        : WidgetForecast(x, y, w, h), dirty(true), lastUpdate(0) {
        widgetX = x; widgetY = y; widgetW = w; widgetH = h;
    }
    
    void setDirty(bool d) override { dirty = d; }
    bool isDirty() override { return dirty; }
    
    bool needsUpdate() override {
        if (millis() - lastUpdate > 30000) {
            lastUpdate = millis();
            return true;
        }
        return false;
    }
    
    void update(TFT_eSPI& tft, bool forceRedraw = false) override {
        if (forceRedraw || needsUpdate() || dirty) {
            tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
            draw(tft);
            dirty = false;
        }
    }
    
    void draw(TFT_eSPI& tft) override {
        WidgetForecast::draw(tft);
    }
};

// ════════════════════════════════════════════════════════════════════════════
// UpdatableChartWidget — version updatable du graphique
// ════════════════════════════════════════════════════════════════════════════
class UpdatableChartWidget : public WidgetChart, public UpdatableWidget {
private:
    bool dirty;
    unsigned long lastUpdate;
    
public:
    UpdatableChartWidget(int x, int y, int w, int h) 
        : WidgetChart(x, y, w, h), dirty(true), lastUpdate(0) {
        widgetX = x; widgetY = y; widgetW = w; widgetH = h;
    }
    
    void setDirty(bool d) override { dirty = d; }
    bool isDirty() override { return dirty; }
    
    bool needsUpdate() override {
        if (millis() - lastUpdate > 60000) {
            lastUpdate = millis();
            return true;
        }
        return false;
    }
    
    void update(TFT_eSPI& tft, bool forceRedraw = false) override {
        if (forceRedraw || needsUpdate() || dirty) {
            tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
            draw(tft);
            dirty = false;
        }
    }
    
    void draw(TFT_eSPI& tft) override {
        WidgetChart::draw(tft);
    }
};

// ════════════════════════════════════════════════════════════════════════════
// UpdatableSunWidget — version updatable du widget soleil
// ════════════════════════════════════════════════════════════════════════════
class UpdatableSunWidget : public WidgetSun, public UpdatableWidget {
private:
    bool dirty;
    unsigned long lastUpdate;
    
public:
    UpdatableSunWidget(int x, int y, int w, int h) 
        : WidgetSun(x, y, w, h), dirty(true), lastUpdate(0) {
        widgetX = x; widgetY = y; widgetW = w; widgetH = h;
    }
    
    void setDirty(bool d) override { dirty = d; }
    bool isDirty() override { return dirty; }
    
    bool needsUpdate() override {
        if (millis() - lastUpdate > 60000) {
            lastUpdate = millis();
            return true;
        }
        return false;
    }
    
    void update(TFT_eSPI& tft, bool forceRedraw = false) override {
        if (forceRedraw || needsUpdate() || dirty) {
            tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
            draw(tft);
            dirty = false;
        }
    }
    
    void draw(TFT_eSPI& tft) override {
        WidgetSun::draw(tft);
    }
};

// ════════════════════════════════════════════════════════════════════════════
// UpdatableAQIWidget — version updatable du widget qualité d'air
// ════════════════════════════════════════════════════════════════════════════
class UpdatableAQIWidget : public WidgetAQI, public UpdatableWidget {
private:
    bool dirty;
    unsigned long lastUpdate;
    
public:
    UpdatableAQIWidget(int x, int y, int w, int h) 
        : WidgetAQI(x, y, w, h), dirty(true), lastUpdate(0) {
        widgetX = x; widgetY = y; widgetW = w; widgetH = h;
    }
    
    void setDirty(bool d) override { dirty = d; }
    bool isDirty() override { return dirty; }
    
    bool needsUpdate() override {
        if (millis() - lastUpdate > 60000) {
            lastUpdate = millis();
            return true;
        }
        return false;
    }
    
    void update(TFT_eSPI& tft, bool forceRedraw = false) override {
        if (forceRedraw || needsUpdate() || dirty) {
            tft.fillRect(widgetX, widgetY, widgetW, widgetH, C_BG);
            draw(tft);
            dirty = false;
        }
    }
    
    void draw(TFT_eSPI& tft) override {
        WidgetAQI::draw(tft);
    }
};