projet crepp_git/crepp-projects/station-meteo/firmware/receiver/v1.0 · branche main
TabManager.cpp Voir sur GitLab
//TabManager.cpp - Gestion des onglets de l'interface
#include "TabManager.h"
#include "Tabs.h"
#include "WeatherData.h"

// Définition des onglets avec leurs fonctions
Tab TabManager::tabs[TAB_COUNT] = {
    {TAB_WEATHER,     "Meteo",       drawWeatherTab,  updateWeatherTab},
    {TAB_DEBUG,       "Debug",       drawDebugTab,    updateDebugTab},
    {TAB_INDOOR_TEMP, "Interieur",   drawIndoorTab,   updateIndoorTab},
    {TAB_STATS,       "Statistiques",drawStatsTab,    updateStatsTab}
};

int TabManager::currentTab = TAB_WEATHER;
int TabManager::lastTab = -1;
bool TabManager::needsRedraw = true;
unsigned long TabManager::lastButtonTime = 0;

void TabManager::init() {
    currentTab = TAB_WEATHER;
    lastTab = -1;
    needsRedraw = true;
    lastButtonTime = 0;
    
    // Initialiser les widgets météo
    initWeatherTab();
}

void TabManager::nextTab() {
    currentTab = (currentTab + 1) % TAB_COUNT;
    needsRedraw = true;
    
    // Ajouter un message de debug
    addDebugMessage("Changement onglet -> %s", tabs[currentTab].name);
}

void TabManager::previousTab() {
    currentTab = (currentTab - 1 + TAB_COUNT) % TAB_COUNT;
    needsRedraw = true;
    
    // Ajouter un message de debug
    addDebugMessage("Changement onglet <- %s", tabs[currentTab].name);
}

void TabManager::handleButton(int buttonId, bool longPress) {
    unsigned long now = millis();
    if (now - lastButtonTime < BUTTON_DEBOUNCE) return;
    lastButtonTime = now;
    
    switch(buttonId) {
        case 0: // LEFT
            previousTab();
            break;
        case 1: // RIGHT
            nextTab();
            break;
        case 2: // UP
            // Action spécifique pour l'onglet courant
            switch(currentTab) {
                case TAB_WEATHER:
                    // Forcer la mise à jour des widgets météo
                    if (mainTempWidget) mainTempWidget->markDirty();
                    if (forecastWidget) forecastWidget->markDirty();
                    if (chartWidget) chartWidget->markDirty();
                    if (sunWidget) sunWidget->markDirty();
                    if (aqiWidget) aqiWidget->markDirty();
                    break;
                case TAB_INDOOR_TEMP:
                    // Force une lecture immédiate des capteurs
                    break;
                default:
                    break;
            }
            needsRedraw = true;
            break;
        case 3: // DOWN
            // Action spécifique pour l'onglet courant
            switch(currentTab) {
                case TAB_INDOOR_TEMP:
                    // Force une lecture immédiate des capteurs
                    break;
                default:
                    break;
            }
            needsRedraw = true;
            break;
        case 4: // CENTER
            // Action centrale : rafraîchit immédiatement l'onglet courant
            addDebugMessage("Rafraichissement manuel -> %s", tabs[currentTab].name);
            needsRedraw = true;
            break;
    }
}

void TabManager::draw(TFT_eSPI& tft) {
    if (!needsRedraw && currentTab == lastTab) return;

    // Effacer l'écran seulement au changement d'onglet : chaque onglet efface
    // désormais lui-même toute sa zone de contenu (fillRect en tête de
    // drawDebugTab/drawIndoorTab/drawStatsTab), donc ce fillScreen répété à
    // chaque rafraîchissement de données n'est plus nécessaire.
    if (currentTab != lastTab) {
        tft.fillScreen(C_BG);
    }
    
    // Dessiner la barre d'onglets
    drawTabBar(tft, currentTab);
    
    // Dessiner le contenu de l'onglet courant
    if (tabs[currentTab].drawFunction) {
        tabs[currentTab].drawFunction(tft);
    }
    
    lastTab = currentTab;
    needsRedraw = false;
}

void TabManager::update() {
    // Mettre à jour l'onglet courant
    if (tabs[currentTab].updateFunction) {
        tabs[currentTab].updateFunction();
    }
}