Verze 1.0.0 - nevraci se kod chyby pri cteni, ale je mozne vydefinovat default hodnotu (breaking change). Pouziva nove TRACEPLUS() pro pripadne ladeni.
This commit is contained in:
parent
a578569b6c
commit
736350ae17
@ -12,7 +12,7 @@
|
|||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://git.xpablo.cz/xPablo.cz/sysvars.git"
|
"url": "https://git.xpablo.cz/xPablo.cz/sysvars.git"
|
||||||
},
|
},
|
||||||
"version": "0.0.3",
|
"version": "1.0.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"frameworks": "arduino",
|
"frameworks": "arduino",
|
||||||
"platforms": ["espressif8266", "espressif32"],
|
"platforms": ["espressif8266", "espressif32"],
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
name=sysvars
|
name=sysvars
|
||||||
version=0.0.2
|
version=1.0.0
|
||||||
author=Pavel Brychta
|
author=Pavel Brychta
|
||||||
maintainer=Pavel Brychta <pablo@xpablo.cz>
|
maintainer=Pavel Brychta <pablo@xpablo.cz>
|
||||||
sentence=Key-Value JSON file storage library.
|
sentence=Key-Value JSON file storage library.
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
#ifndef USEDFS
|
#ifndef USEDFS
|
||||||
# if defined(ESP32)
|
# if defined(ESP32)
|
||||||
# ifdef USE_LITTLEFS
|
# ifdef USE_LITTLEFS
|
||||||
# if ESP_IDF_VERSION_MAJOR < 4
|
//# if ESP_IDF_VERSION_MAJOR < 4
|
||||||
# include <LITTLEFS.h>
|
//# include <LITTLEFS.h>
|
||||||
# define USEDFS LITTLEFS
|
//# define USEDFS LITTLEFS
|
||||||
# else
|
//# else
|
||||||
# include <LittleFS.h>
|
# include <LittleFS.h>
|
||||||
# define USEDFS LittleFS
|
# define USEDFS LittleFS
|
||||||
# endif
|
//# endif
|
||||||
# else
|
# else
|
||||||
# include <SPIFFS.h>
|
# include <SPIFFS.h>
|
||||||
# define USEDFS SPIFFS
|
# define USEDFS SPIFFS
|
||||||
|
159
src/sysvars.cpp
Normal file
159
src/sysvars.cpp
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/** Sysvars library
|
||||||
|
* Copyright (c) 2018-2024 Pavel Brychta, pablo@xpablo.cz
|
||||||
|
*
|
||||||
|
* Key-value store/load library with JSON file using internal filesystem
|
||||||
|
**/
|
||||||
|
|
||||||
|
#include "definefs.hpp"
|
||||||
|
#include "sysvars.hpp"
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
#include <FS.h>
|
||||||
|
#include <trace.h>
|
||||||
|
|
||||||
|
#ifndef TRACE_SYSVARS
|
||||||
|
# define TRACE_SYSVARS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if not defined(SYSVAR_FILE)
|
||||||
|
#define SYSVAR_FILE "/cfg.json"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T svGetV(const String & name, const T deflt)
|
||||||
|
{
|
||||||
|
T rv = deflt;
|
||||||
|
|
||||||
|
File f = USEDFS.open(F(SYSVAR_FILE), "r");
|
||||||
|
if (f) {
|
||||||
|
JsonDocument doc;
|
||||||
|
DeserializationError err = deserializeJson(doc, f);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
TRACEPLUS(TRACE_SYSVARS, TRACE_ERROR, "SV: Deserialize error '%s'", err.c_str()); // wrong JSON file (malformed)
|
||||||
|
} else {
|
||||||
|
if (!doc.containsKey(name)) {
|
||||||
|
TRACEPLUS(TRACE_SYSVARS, TRACE_ERROR, "SV: Key '%s' not found", name.c_str());
|
||||||
|
} else {
|
||||||
|
rv = doc[name].as<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TRACEPLUS(TRACE_SYSVARS, TRACE_ERROR, "SV: File not found");
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T svGetVFile(const String & name, const String & fname, const T deflt)
|
||||||
|
{
|
||||||
|
T rv = deflt;
|
||||||
|
File f = USEDFS.open(fname, "r");
|
||||||
|
|
||||||
|
if (f) {
|
||||||
|
JsonDocument doc;
|
||||||
|
DeserializationError err = deserializeJson(doc, f);
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
TRACEPLUS(TRACE_SYSVARS, TRACE_ERROR, "SV: Deserialize error '%s'", err.c_str()); // wrong JSON file (malformed)
|
||||||
|
} else {
|
||||||
|
if (!doc.containsKey(name)) {
|
||||||
|
TRACEPLUS(TRACE_SYSVARS, TRACE_ERROR, "SV: Key '%s' not found", name.c_str());
|
||||||
|
} else {
|
||||||
|
rv = doc[name].as<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
TRACEPLUS(TRACE_SYSVARS, TRACE_ERROR, "SV: File not found '%s'", fname.c_str());
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Store value for the key
|
||||||
|
*
|
||||||
|
* @param[in] name Key name
|
||||||
|
* @param[in] value New value
|
||||||
|
*
|
||||||
|
* @tparam T Type of the value
|
||||||
|
*
|
||||||
|
* @return Result (SV_...)
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
int svSetV(const String & name, T value)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
JsonDocument doc;
|
||||||
|
File f = USEDFS.open(F(SYSVAR_FILE), "r");
|
||||||
|
|
||||||
|
if (f) {
|
||||||
|
DeserializationError err = deserializeJson(doc, f);
|
||||||
|
if (err) {
|
||||||
|
res = SV_DESERIALIZE_ERROR; // wrong (malformed) JSON file
|
||||||
|
}
|
||||||
|
f.close();
|
||||||
|
}
|
||||||
|
doc[name] = value;
|
||||||
|
|
||||||
|
f = USEDFS.open(SYSVAR_FILE, "w");
|
||||||
|
if (f) {
|
||||||
|
serializeJson(doc, f);
|
||||||
|
res = SV_OK;
|
||||||
|
} else {
|
||||||
|
res = SV_FILE_WRITE_ERROR;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Store value for the key
|
||||||
|
*
|
||||||
|
* @param[in] name Key name
|
||||||
|
* @param[in] value New value
|
||||||
|
* @param[in] fname JSON file name
|
||||||
|
*
|
||||||
|
* @tparam T Type of the value
|
||||||
|
*
|
||||||
|
* @return Result (SV_...)
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
int svSetVFile(const String & name, T value, const String & fname)
|
||||||
|
{
|
||||||
|
int res = SV_UNSPECIFIED_ERROR;
|
||||||
|
JsonDocument doc;
|
||||||
|
File f = USEDFS.open(fname, "r");
|
||||||
|
|
||||||
|
if (f) {
|
||||||
|
DeserializationError err = deserializeJson(doc, f);
|
||||||
|
if (err) {
|
||||||
|
res = SV_DESERIALIZE_ERROR; // wrong (malformed) JSON file
|
||||||
|
}
|
||||||
|
f.close();
|
||||||
|
}
|
||||||
|
doc[name] = value;
|
||||||
|
|
||||||
|
f = USEDFS.open(fname, "w");
|
||||||
|
if (f) {
|
||||||
|
serializeJson(doc, f);
|
||||||
|
res = SV_OK;
|
||||||
|
} else {
|
||||||
|
res = SV_FILE_WRITE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
template int svGetV(const String & name, const int deflt);
|
||||||
|
template String svGetV(const String & name, const String deflt);
|
||||||
|
template unsigned svGetV(const String & name, const unsigned deflt);
|
||||||
|
|
||||||
|
template int svGetVFile(const String & name, const String & fname, const int deflt);
|
||||||
|
template String svGetVFile(const String & name, const String & fname, const String deflt);
|
||||||
|
template unsigned svGetVFile(const String & name, const String & fname, const unsigned deflt);
|
||||||
|
|
||||||
|
template int svSetV(const String & name, int value);
|
||||||
|
template int svSetV(const String & name, unsigned value);
|
||||||
|
template int svSetV(const String & name, String value);
|
||||||
|
|
||||||
|
template int svSetVFile(const String & name, int value, const String & fname);
|
||||||
|
template int svSetVFile(const String & name, unsigned value, const String & fname);
|
||||||
|
template int svSetVFile(const String & name, String value, const String & fname);
|
122
src/sysvars.hpp
122
src/sysvars.hpp
@ -1,14 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
/** Sysvars library
|
/** Sysvars library
|
||||||
* Copyright (c) 2018-2023 Pavel Brychta, pablo@xpablo.cz
|
* Copyright (c) 2018-2024 Pavel Brychta, pablo@xpablo.cz
|
||||||
*
|
*
|
||||||
* Key-value store/load library with JSON file using internal filesystem
|
* Key-value store/load library with JSON file using internal filesystem
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include "definefs.hpp"
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoJson.h>
|
|
||||||
#include <FS.h>
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
SV_OK = 0,
|
SV_OK = 0,
|
||||||
@ -20,88 +17,32 @@ enum {
|
|||||||
SV_KEY_NOT_FOUND = -6,
|
SV_KEY_NOT_FOUND = -6,
|
||||||
};
|
};
|
||||||
|
|
||||||
#if not defined(SYSVAR_FILE)
|
|
||||||
#define SYSVAR_FILE "/cfg.json"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get value
|
* @brief Get value
|
||||||
*
|
*
|
||||||
* @param[in] name Name of the key
|
* @param[in] name Name of the key
|
||||||
* @param result Status variable (SV_...)
|
* @param deflt Default value
|
||||||
*
|
*
|
||||||
* @tparam T result type
|
* @tparam T result type
|
||||||
*
|
*
|
||||||
* @return Value for the key given
|
* @return Value for the key given
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T svGetV(const String & name, int * result = nullptr)
|
T svGetV(const String & name, const T deflt = {});
|
||||||
{
|
|
||||||
T rv{};
|
|
||||||
int res;
|
|
||||||
JsonDocument doc;
|
|
||||||
File f;
|
|
||||||
|
|
||||||
f = USEDFS.open(F(SYSVAR_FILE), "r");
|
|
||||||
if (f) {
|
|
||||||
DeserializationError err = deserializeJson(doc, f);
|
|
||||||
if (err) {
|
|
||||||
res = SV_DESERIALIZE_ERROR; // wrong JSON file (malformed)
|
|
||||||
} else {
|
|
||||||
if (!doc.containsKey(name)) {
|
|
||||||
res = SV_KEY_NOT_FOUND; // key not found
|
|
||||||
} else {
|
|
||||||
rv = doc[name].as<T>();
|
|
||||||
res = SV_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res = SV_FILE_NOT_FOUND; // file not found
|
|
||||||
}
|
|
||||||
if (result)
|
|
||||||
*result = res; // result code if we are interested
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get value
|
* @brief Get value
|
||||||
*
|
*
|
||||||
* @param[in] name Name of the key
|
* @param[in] name Name of the key
|
||||||
* @param result Status variable (SV_....)
|
|
||||||
* @param[in] fname Used JSON file name
|
* @param[in] fname Used JSON file name
|
||||||
|
* @param deflt Default value
|
||||||
*
|
*
|
||||||
* @tparam T Result type
|
* @tparam T Result type
|
||||||
*
|
*
|
||||||
* @return Value for the key given
|
* @return Value for the key given
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T svGetV(const String & name, int * result, const String & fname)
|
T svGetVFile(const String & name, const String & fname, const T deflt = {});
|
||||||
{
|
|
||||||
T rv{};
|
|
||||||
int res;
|
|
||||||
JsonDocument doc;
|
|
||||||
File f;
|
|
||||||
|
|
||||||
f = USEDFS.open(fname, "r");
|
|
||||||
if (f) {
|
|
||||||
DeserializationError err = deserializeJson(doc, f);
|
|
||||||
if (err) {
|
|
||||||
res = SV_DESERIALIZE_ERROR; // wrong (malformed) JSON file
|
|
||||||
} else {
|
|
||||||
if (!doc.containsKey(name)) {
|
|
||||||
res = SV_KEY_NOT_FOUND; // key not found
|
|
||||||
} else {
|
|
||||||
rv = doc[name].as<T>();
|
|
||||||
res = SV_OK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res = SV_FILE_NOT_FOUND; // file not found
|
|
||||||
}
|
|
||||||
if (result)
|
|
||||||
*result = res; // result code if we are interested
|
|
||||||
return rv;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Store value for the key
|
* @brief Store value for the key
|
||||||
@ -114,31 +55,7 @@ T svGetV(const String & name, int * result, const String & fname)
|
|||||||
* @return Result (SV_...)
|
* @return Result (SV_...)
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
int svSetV(const String & name, T value)
|
int svSetV(const String & name, T value);
|
||||||
{
|
|
||||||
int res;
|
|
||||||
JsonDocument doc;
|
|
||||||
File f;
|
|
||||||
|
|
||||||
f = USEDFS.open(F(SYSVAR_FILE), "r");
|
|
||||||
if (f) {
|
|
||||||
DeserializationError err = deserializeJson(doc, f);
|
|
||||||
if (err) {
|
|
||||||
res = SV_DESERIALIZE_ERROR; // wrong (malformed) JSON file
|
|
||||||
}
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
doc[name] = value;
|
|
||||||
|
|
||||||
f = USEDFS.open(SYSVAR_FILE, "w");
|
|
||||||
if (f) {
|
|
||||||
serializeJson(doc, f);
|
|
||||||
res = SV_OK;
|
|
||||||
} else {
|
|
||||||
res = SV_FILE_WRITE_ERROR;
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Store value for the key
|
* @brief Store value for the key
|
||||||
@ -152,29 +69,4 @@ int svSetV(const String & name, T value)
|
|||||||
* @return Result (SV_...)
|
* @return Result (SV_...)
|
||||||
*/
|
*/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
int svSetV(const String & name, T value, const String & fname)
|
int svSetVFile(const String & name, T value, const String & fname);
|
||||||
{
|
|
||||||
int res = SV_UNSPECIFIED_ERROR;
|
|
||||||
JsonDocument doc;
|
|
||||||
File f;
|
|
||||||
|
|
||||||
f = USEDFS.open(fname, "r");
|
|
||||||
if (f) {
|
|
||||||
DeserializationError err = deserializeJson(doc, f);
|
|
||||||
if (err) {
|
|
||||||
res = SV_DESERIALIZE_ERROR; // wrong (malformed) JSON file
|
|
||||||
}
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
doc[name] = value;
|
|
||||||
|
|
||||||
f = USEDFS.open(fname, "w");
|
|
||||||
if (f) {
|
|
||||||
serializeJson(doc, f);
|
|
||||||
res = SV_OK;
|
|
||||||
} else {
|
|
||||||
res = SV_FILE_WRITE_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user