ConfigStore

data
data/ConfigStore.h
data beta beta

Tool: ConfigStore Stockage clé-valeur persistant en flash (émulation EEPROM), pour conserver des réglages entre deux redémarrages : identifiants WiFi, dernière couleur RGB choisie, calibration, etc. Fonctionnalités :

Méthodes publiques

Méthode Description Paramètres Retour
ConfigStore()
ConfigStore(uint16_t maxKeys = crepp::settings::storage::MAX_KEYS, uint16_t maxKeyLength = crepp::settings::storage::MAX_KEY_LENGTH, uint16_t maxValueLength = crepp::settings::storage::MAX_VALUE_LENGTH);
begin()
begin();
Initialise l'accès à la flash et recharge les valeurs déjà sauvegardées (le cas échéant). / true
true si l'initialisation a réussi. /
set()
set(const String& key, const String& value);
Définit (ou remplace) la valeur associée à une clé. Les clés et valeurs plus longues que les limites configurées sont tronquées silencieusement. Ne sauvegarde pas immédiatement en flash (voir update() / save()). /
get()
get(const String& key, const String& defaultValue = "") const;
Récupère la valeur associée à une clé. / defaultValue: Valeur renvoyée si la clé n'existe pas. /
has()
has(const String& key) const;
remove()
remove(const String& key);
save()
save();
Force une sauvegarde immédiate en flash (opération bloquante, de l'ordre de quelques millisecondes à quelques dizaines de ms selon la taille de la table). / true
true si la sauvegarde a réussi. /
update()
update();
A appeler régulièrement dans loop() : sauvegarde automatiquement si des changements sont en attente depuis plus de crepp::settings::storage::AUTO_SAVE_INTERVAL millisecondes. Ne fait rien si aucun changement n'est en attente (pas d'usure flash inutile).
getStatus()
getStatus() const {

Méthodes privées


            findIndex(const String& key) const;;
load();;
begin(115200);;
begin();;
get("nom_robot", "CREPP-01");;
println("Nom du robot : " + robotName);;
update();;
set("couleur_led", "#4CAF50");;

                    

Variables membres


            return _status;
String key;
String value;
uint16_t _maxKeys;
uint16_t _maxKeyLength;
uint16_t _maxValueLength;
size_t _eepromSize;

                    

Code source


        // ConfigStore.h
#pragma once

#include <Arduino.h>
#include <EEPROM.h>
#include <vector>
#include "../Settings.h"
#include "../StatusDevice.h"

namespace crepp::data {

/*
 * =========================
 * Tool: ConfigStore
 * -------------------------
 * Stockage clé-valeur persistant en flash (émulation EEPROM), pour
 * conserver des réglages entre deux redémarrages : identifiants WiFi,
 * dernière couleur RGB choisie, calibration, etc.
 *
 * @badge data
 * @badge beta
 *
 * Fonctionnalités :
 * - API simple set()/get()/has()/remove(), valeurs stockées en String
 * - Sauvegarde différée et automatique (update()) pour limiter l'usure de
 *   la flash : les écritures s'accumulent en RAM, puis sont regroupées en
 *   une seule sauvegarde toutes les crepp::settings::storage::AUTO_SAVE_INTERVAL
 *   millisecondes au lieu d'écrire à chaque set()
 * - Capacité configurable (nombre de clés, longueur max clé/valeur)
 *
 * @note Les tailles par défaut (crepp::settings::storage::MAX_KEYS = 50,
 *       MAX_KEY_LENGTH = 32, MAX_VALUE_LENGTH = 256) donnent une table
 *       d'environ 14.5 Ko en flash — plus grand que l'ancienne constante
 *       crepp::settings::system::EEPROM_SIZE (4096) prévue dans Settings.h,
 *       qui semble dater d'avant ces réglages de storage. begin() calcule
 *       lui-même la taille réellement nécessaire plutôt que d'utiliser
 *       EEPROM_SIZE, donc cela fonctionne, mais mieux vaut le savoir si
 *       votre flash est très contrainte : réduisez maxKeys/maxValueLength
 *       au constructeur si besoin.
 * =========================
 */
class ConfigStore {
public:
    /**
     * @brief Construit le magasin de configuration (ne touche pas encore à
     *        la flash tant que begin() n'est pas appelé).
     * @param maxKeys       Nombre maximal de clés stockables.
     * @param maxKeyLength  Longueur maximale d'une clé, en caractères.
     * @param maxValueLength Longueur maximale d'une valeur, en caractères.
     */
    explicit ConfigStore(uint16_t maxKeys = crepp::settings::storage::MAX_KEYS,
                          uint16_t maxKeyLength = crepp::settings::storage::MAX_KEY_LENGTH,
                          uint16_t maxValueLength = crepp::settings::storage::MAX_VALUE_LENGTH);

    /**
     * @brief Initialise l'accès à la flash et recharge les valeurs déjà
     *        sauvegardées (le cas échéant).
     * @return true si l'initialisation a réussi.
     */
    bool begin();

    /**
     * @brief Définit (ou remplace) la valeur associée à une clé. Les clés
     *        et valeurs plus longues que les limites configurées sont
     *        tronquées silencieusement. Ne sauvegarde pas immédiatement en
     *        flash (voir update() / save()).
     */
    void set(const String& key, const String& value);

    /**
     * @brief Récupère la valeur associée à une clé.
     * @param defaultValue Valeur renvoyée si la clé n'existe pas.
     */
    String get(const String& key, const String& defaultValue = "") const;

    /// Indique si une clé existe.
    bool has(const String& key) const;

    /// Supprime une clé (ne sauvegarde pas immédiatement, voir update()).
    void remove(const String& key);

    /**
     * @brief Force une sauvegarde immédiate en flash (opération bloquante,
     *        de l'ordre de quelques millisecondes à quelques dizaines de ms
     *        selon la taille de la table).
     * @return true si la sauvegarde a réussi.
     */
    bool save();

    /**
     * @brief A appeler régulièrement dans loop() : sauvegarde
     *        automatiquement si des changements sont en attente depuis plus
     *        de crepp::settings::storage::AUTO_SAVE_INTERVAL millisecondes.
     *        Ne fait rien si aucun changement n'est en attente (pas d'usure
     *        flash inutile).
     */
    void update();

    /// Etat du périphérique (OK une fois begin() appelé avec succès).
    StatusDevice getStatus() const { return _status; }

private:
    struct Entry {
        String key;
        String value;
        bool used = false;
    };

    uint16_t _maxKeys;
    uint16_t _maxKeyLength;
    uint16_t _maxValueLength;
    size_t _eepromSize;

    std::vector<Entry> _entries;
    bool _dirty = false;
    unsigned long _lastSave = 0;
    StatusDevice _status = StatusDevice::DEVICE_ERROR_INIT;

    int findIndex(const String& key) const;
    void load();
};

} // namespace crepp::data

/*
@example

@include
#include <crepp/data/ConfigStore.h>
@end_include

@instance
crepp::data::ConfigStore config;
@end_instance

@setup
  Serial.begin(115200);
  config.begin();

  // Première utilisation : valeur par défaut si la clé n'existe pas encore
  String robotName = config.get("nom_robot", "CREPP-01");
  Serial.println("Nom du robot : " + robotName);

  config.set("dernier_boot", String(millis()));
@end_setup

@loop
  config.update(); // sauvegarde différée, automatique

  // Exemple : mémoriser un réglage suite à une action utilisateur
  // config.set("couleur_led", "#4CAF50");
@end_loop

@end_example
*/