Comment lire une valeur NVS ESP32 dans std::string

Dans notre post précédent, nous avons discuté de Comment obtenir la longueur / taille d’une valeur NVS sur ESP32. Sur cette base, nous pouvons lire une valeur NVS dans un std::string.

Stratégie

  1. Déterminer la taille de la valeur dans le NVS
  2. Allouer un buffer temporaire de la taille déterminée
  3. Lire la valeur depuis le NVS dans le buffer temporaire
  4. Créer le std::string depuis la valeur
  5. Nettoyer le buffer temporaire

Fonction utilitaire pour lire une valeur NVS comme std::string

Au cas où la clé n’existe pas dans le NVS, cette fonction retournera la chaîne vide ("").

read_nvs_to_stdstring.cpp
#include <nvs.h>
#include <string>

std::string ReadNVSValueAsStdString(nvs_handle_t nvs, const char* key) {
    /**
     * Stratégie :
     *  1. Déterminer la taille de la valeur dans le NVS
     *  2. Allouer un buffer temporaire de la taille déterminée
     *  3. Lire la valeur depuis le NVS dans le buffer temporaire
     *  4. Créer le std::string depuis la valeur
     *  5. Nettoyer
     */
    // Étape 1 : Obtenir la taille de la clé
    esp_err_t err;
    size_t value_size = 0;
    if((err = nvs_get_str(nvs, _key.c_str(), nullptr, &value_size)) != ESP_OK) {
        if(err == ESP_ERR_NVS_NOT_FOUND) {
            // Non trouvé, pas d'erreur
            return "";
        } else {
            printf("Échec de l'obtention de la taille de la clé NVS %s : %s\r\n", key, esp_err_to_name(err));
            return;
        }
    }
    // Étape 2 : Allouer un buffer temporaire pour lire depuis
    char* buf = (char*)malloc(value_size);
    // Étape 3 : Lire la valeur dans le buffer temporaire.
    esp_err_t err;
    if((err = nvs_get_str(nvs, _key.c_str(), buf, &value_size)) != ESP_OK) {
        // "N'existe pas" a déjà été géré avant, donc c'est une erreur réelle.
        // Nous supposons que la valeur n'a pas changé entre la lecture de la taille (étape 1) et maintenant.
        // Au cas où cette supposition est valide, ceci échouera avec ESP_ERR_NVS_INVALID_LENGTH.
        // Ceci est cependant extrêmement improbable dans tous les scénarios d'utilisation.
        printf("Échec de la lecture de la clé NVS %s : %s\r\n", key, esp_err_to_name(err));
        free(buf);
        return "";
    }
    // Étape 4 : Créer la chaîne
    std::string value = std::string(buf, value_size);
    // Étape 5 : nettoyage
    free(buf);

    return value;
}

Exemple d’utilisation

Ceci suppose que vous avez configuré myNvs comme nous l’avons montré dans notre post précédent Comment initialiser le NVS sur ESP32

example_usage.cpp
std::string value = ReadNVSValueAsStdString(myNvs, "MyKey");

Optimisations C++17

À partir de C++17, vous pouvez possiblement créer un std::string directement au lieu d’utiliser le buffer temporaire, puisqu’il y a une surcharge de .data() qui retourne un pointeur non-const - donc vous pouvez écrire directement dans le buffer du std::string.

Cependant, puisque ma chaîne d’outils basée sur PlatformIO ne supporte actuellement pas cela, je n’ai pas encore écrit ce code.


Consultez les articles similaires par catégorie : C/C++, ESP8266/ESP32