Sync from fork #1

Open
CommanderRedYT wants to merge 2 commits from CommanderRedYT/main into main
6 changed files with 38 additions and 27 deletions

View File

@ -36,7 +36,6 @@ set(dependencies
espwifistack
date
espchrono
fmt
nvs_flash
)

View File

@ -3,9 +3,7 @@
// system includes
#include <string>
#include <expected>
// 3rdparty lib includes
#include <fmt/core.h>
#include <format>
// local includes
#include "configwrapper.h"
@ -16,7 +14,7 @@ template<int MAX_LENGTH>
ConfigConstraintReturnType StringMaxSize(const std::string &str)
{
if (str.size() > MAX_LENGTH)
return std::unexpected(fmt::format("String length {} exceeds maximum {}", str.size(), MAX_LENGTH));
return std::unexpected(std::format("String length {} exceeds maximum {}", str.size(), MAX_LENGTH));
return {};
}
@ -24,7 +22,7 @@ template<int MIN_LENGTH, int MAX_LENGTH>
ConfigConstraintReturnType StringMinMaxSize(const std::string &str)
{
if (str.size() < MIN_LENGTH || str.size() > MAX_LENGTH)
return std::unexpected(fmt::format("String length {} exceeds range {} to {}", str.size(), MIN_LENGTH, MAX_LENGTH));
return std::unexpected(std::format("String length {} exceeds range {} to {}", str.size(), MIN_LENGTH, MAX_LENGTH));
return {};
}
@ -49,7 +47,7 @@ ConfigConstraintReturnType StringOr(const std::string &str)
const auto result1 = callback1(str);
if (result1)
return {};
return std::unexpected(fmt::format("None of the following 2 constraints succeded: {} | {}", result0.error(), result1.error()));
return std::unexpected(std::format("None of the following 2 constraints succeded: {} | {}", result0.error(), result1.error()));
}
template<ConfigWrapper<std::string>::ConstraintCallback callback0, ConfigWrapper<std::string>::ConstraintCallback callback1, ConfigWrapper<std::string>::ConstraintCallback callback2>
@ -64,7 +62,7 @@ ConfigConstraintReturnType StringOr(const std::string &str)
const auto result2 = callback2(str);
if (result2)
return {};
return std::unexpected(fmt::format("None of the following 3 constraints succeded: {} | {} | {}", result0.error(), result1.error(), result2.error()));
return std::unexpected(std::format("None of the following 3 constraints succeded: {} | {} | {}", result0.error(), result1.error(), result2.error()));
}
template<ConfigWrapper<std::string>::ConstraintCallback callback0, ConfigWrapper<std::string>::ConstraintCallback callback1>
@ -101,7 +99,7 @@ template<typename T, T MIN_VALUE>
ConfigConstraintReturnType MinValue(typename ConfigWrapper<T>::value_t val)
{
if (val < MIN_VALUE)
return std::unexpected(fmt::format("Value {} exceeds minimum {}", val, MIN_VALUE));
return std::unexpected(std::format("Value {} exceeds minimum {}", val, MIN_VALUE));
return {};
}
@ -109,7 +107,7 @@ template<typename T, T MAX_VALUE>
ConfigConstraintReturnType MaxValue(typename ConfigWrapper<T>::value_t val)
{
if (val > MAX_VALUE)
return std::unexpected(fmt::format("Value {} exceeds maximum {}", val, MAX_VALUE));
return std::unexpected(std::format("Value {} exceeds maximum {}", val, MAX_VALUE));
return {};
}
@ -117,7 +115,7 @@ template<typename T, T MIN_VALUE, T MAX_VALUE>
ConfigConstraintReturnType MinMaxValue(typename ConfigWrapper<T>::value_t val)
{
if (val < MIN_VALUE || val > MAX_VALUE)
return std::unexpected(fmt::format("Value {} exceeds range {} to {}", val, MIN_VALUE, MAX_VALUE));
return std::unexpected(std::format("Value {} exceeds range {} to {}", val, MIN_VALUE, MAX_VALUE));
return {};
}
@ -125,7 +123,7 @@ template<typename T>
ConfigConstraintReturnType MinMaxValue(typename ConfigWrapper<T>::value_t val, T MIN_VALUE, T MAX_VALUE)
{
if (val < MIN_VALUE || val > MAX_VALUE)
return std::unexpected(fmt::format("Value {} exceeds range {} to {}", val, MIN_VALUE, MAX_VALUE));
return std::unexpected(std::format("Value {} exceeds range {} to {}", val, MIN_VALUE, MAX_VALUE));
return {};
}
@ -133,7 +131,7 @@ template<typename T, T MIN_VALUE, T MAX_VALUE>
ConfigConstraintReturnType MinMaxOrZeroValue(typename ConfigWrapper<T>::value_t val)
{
if (val != 0 && (val < MIN_VALUE || val > MAX_VALUE))
return std::unexpected(fmt::format("Value {} exceeds constraint 0 or range {} to {}", val, MIN_VALUE, MAX_VALUE));
return std::unexpected(std::format("Value {} exceeds constraint 0 or range {} to {}", val, MIN_VALUE, MAX_VALUE));
return {};
}
} // namespace espconfig

View File

@ -1,12 +1,8 @@
#pragma once
// system includes
#include <string>
#include <expected>
// 3rdparty lib includes
#include <fmt/core.h>
// local includes
#include "configwrapper.h"
#include "espchrono.h"

View File

@ -2,12 +2,15 @@
#include "configmanager.h"
// system includes
#include <format>
// esp-idf includes
#include <esp_log.h>
#include <nvs_flash.h>
// local includes
#include "espchrono.h"
// 3rdparty lib includes
#include <espchrono.h>
#define INSTANTIATE_CONFIGMANAGER_TEMPLATES(Type) \
namespace espconfig { \
@ -45,7 +48,7 @@ esp_err_t ConfigManager<ConfigContainer>::init(const char *ns)
return result;
}
#endif
#else
#else // CONFIG_NVS_ENCRYPTION
const esp_partition_t *key_part = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS_KEYS, NULL);
if (!key_part)
{
@ -87,7 +90,7 @@ esp_err_t ConfigManager<ConfigContainer>::init(const char *ns)
return result;
}
#endif
#endif
#endif // CONFIG_NVS_ENCRYPTION
{
const auto result = nvs_open_from_partition("nvs", ns, NVS_READWRITE, &nvs_handle_user);
@ -119,12 +122,19 @@ esp_err_t ConfigManager<ConfigContainer>::loadFromFlash()
bool success = true;
ConfigContainer::callForEveryConfig([&](ConfigWrapperInterface &config){
if (strlen(config.nvsName()) > 15)
{
ESP_LOGW(TAG, "config key '%s' is longer than 15 characters", config.nvsName());
success = false;
return false; // don't abort loop
}
if (const auto result = config.loadFromFlash(nvs_handle_user); !result)
{
ESP_LOGE(TAG, "config parameter %s failed to load: %.*s", config.nvsName(), result.error().size(), result.error().data());
success = false;
}
return false; // dont abort the loop
return false; // don't abort the loop
});
const auto after = espchrono::millis_clock::now();
@ -160,7 +170,7 @@ ConfigStatusReturnType ConfigManager<ConfigContainer>::reset()
{
if (!message.empty())
message.append(", ");
message.append(fmt::format("reset of {} failed: {}", config.nvsName(), result.error()));
message.append(std::format("reset of {} failed: {}", config.nvsName(), result.error()));
}
return false; // dont abort loop
});

View File

@ -39,7 +39,17 @@ public:
virtual ConfigConstraintReturnType checkValue(value_t value) const = 0;
const T &value() const { return m_value; }
const T &value() const
{
#if defined(CONFIG_COMPILER_CXX_EXCEPTIONS) && CONFIG_COMPILER_CXX_EXCEPTIONS != 0
if (!m_loaded)
throw std::runtime_error("ConfigWrapper::value() called without loading first");
#else
#warning "COMPILER_CXX_EXCEPTIONS disabled, ConfigWrapper::value() called without loading first will assert"
assert(m_loaded);
#endif
return m_value;
}
private:
ConfigStatusReturnType writeToFlash(nvs_handle_t nvsHandle, value_t value);

View File

@ -9,13 +9,11 @@
// system includes
#include <utility>
#include <cassert>
#include <format>
// esp-idf includes
#include <esp_log.h>
// 3rdparty lib includes
#include <fmt/core.h>
// local includes
#include "configwrapper.h"
#include "cpputils.h"