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). / | truetrue 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). / | truetrue 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
*/