mirror of
https://github.com/xoseperez/espurna.git
synced 2026-03-14 20:27:09 +01:00
settings: hide kv_store from the public header
More concise foreach, generic template code also no longer expands down to ::_read_kv Also helps with needless inlining happening with recent gcc versions
This commit is contained in:
@@ -537,7 +537,7 @@ unsigned long _buttonGetDelay(const char* key, size_t index, unsigned long defau
|
||||
auto indexed = SettingsKey(key, index);
|
||||
auto global = String(key);
|
||||
|
||||
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
if (found) {
|
||||
return;
|
||||
}
|
||||
@@ -701,7 +701,7 @@ std::vector<AnalogPin*> AnalogPin::pins;
|
||||
BasePinPtr _buttonGpioPin(size_t index, ButtonProvider provider) {
|
||||
BasePinPtr result;
|
||||
|
||||
auto pin = getSetting({"btnGpio", index}, button::build::pin(index));
|
||||
auto pin [[gnu::unused]] = getSetting({"btnGpio", index}, button::build::pin(index));
|
||||
|
||||
switch (provider) {
|
||||
case ButtonProvider::Gpio: {
|
||||
|
||||
@@ -15,8 +15,7 @@ Copyright (C) 2016-2019 by Xose Pérez <xose dot perez at gmail dot com>
|
||||
void delSettingPrefix(const std::initializer_list<const char*>& prefixes) {
|
||||
std::vector<String> to_purge;
|
||||
|
||||
using namespace settings;
|
||||
kv_store.foreach([&](kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
auto key = kv.key.read();
|
||||
for (const auto* prefix : prefixes) {
|
||||
if (key.startsWith(prefix)) {
|
||||
|
||||
@@ -378,7 +378,7 @@ void _ntpConvertLegacyOffsets() {
|
||||
bool dst { true };
|
||||
int offset { 60 };
|
||||
|
||||
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
const auto key = kv.key.read();
|
||||
if (key == F("ntpTZ")) {
|
||||
save = false;
|
||||
|
||||
@@ -1522,7 +1522,7 @@ void _relayMqttSubscribeCustomTopics() {
|
||||
topics.emplace_back(relay::build::mqttTopicSub(id), relay::build::mqttTopicMode(id));
|
||||
}
|
||||
|
||||
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
const char* const SubPrefix = "relayTopicSub";
|
||||
const char* const ModePrefix = "relayTopicMode";
|
||||
|
||||
@@ -1648,7 +1648,7 @@ void _relayMqttHandleCustomTopic(const String& topic, const char* payload) {
|
||||
}
|
||||
|
||||
void _relayMqttHandleDisconnect() {
|
||||
settings::kv_store.foreach([](settings::kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([](settings::kvs_type::KeyValueResult&& kv) {
|
||||
const char* const prefix = "relayMqttDisc";
|
||||
if (kv.key.length <= strlen(prefix)) {
|
||||
return;
|
||||
|
||||
@@ -430,8 +430,7 @@ RfbRelayMatch _rfbMatch(const char* code) {
|
||||
// scan kvs only once, since we want both ON and OFF options and don't want to depend on the relayCount()
|
||||
RfbRelayMatch matched;
|
||||
|
||||
using namespace settings;
|
||||
kv_store.foreach([code, len, &matched](kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([code, len, &matched](settings::kvs_type::KeyValueResult&& kv) {
|
||||
const auto key = kv.key.read();
|
||||
PayloadStatus status = key.startsWith(F("rfbON"))
|
||||
? PayloadStatus::On : key.startsWith(F("rfbOFF"))
|
||||
|
||||
@@ -37,15 +37,45 @@ kvs_type kv_store(
|
||||
|
||||
} // namespace settings
|
||||
|
||||
size_t settingsSize() {
|
||||
return settings::kv_store.size() - settings::kv_store.available();
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
namespace settings {
|
||||
namespace internal {
|
||||
|
||||
ValueResult get(const String& key) {
|
||||
return kv_store.get(key);
|
||||
}
|
||||
|
||||
bool set(const String& key, const String& value) {
|
||||
return kv_store.set(key, value);
|
||||
}
|
||||
|
||||
bool del(const String& key) {
|
||||
return kv_store.del(key);
|
||||
}
|
||||
|
||||
bool has(const String& key) {
|
||||
return kv_store.has(key);
|
||||
}
|
||||
|
||||
Keys keys() {
|
||||
return kv_store.keys();
|
||||
}
|
||||
|
||||
size_t available() {
|
||||
return kv_store.available();
|
||||
}
|
||||
|
||||
size_t size() {
|
||||
return kv_store.size();
|
||||
}
|
||||
|
||||
void foreach(KeyValueResultCallback&& callback) {
|
||||
kv_store.foreach(callback);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
uint32_t u32fromString(const String& string, int base) {
|
||||
|
||||
const char *ptr = string.c_str();
|
||||
@@ -182,9 +212,13 @@ unsigned char convert(const String& value) {
|
||||
// Key-value API
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
size_t settingsSize() {
|
||||
return settings::internal::size() - settings::internal::available();
|
||||
}
|
||||
|
||||
// TODO: UI needs this to avoid showing keys in storage order
|
||||
std::vector<String> settingsKeys() {
|
||||
auto keys = settings::kv_store.keys();
|
||||
auto keys = settings::internal::keys();
|
||||
std::sort(keys.begin(), keys.end(), [](const String& rhs, const String& lhs) -> bool {
|
||||
return lhs.compareTo(rhs) > 0;
|
||||
});
|
||||
@@ -192,7 +226,6 @@ std::vector<String> settingsKeys() {
|
||||
return keys;
|
||||
}
|
||||
|
||||
|
||||
static std::vector<settings_key_match_t> _settings_matchers;
|
||||
|
||||
void settingsRegisterDefaults(const settings_key_match_t& matcher) {
|
||||
@@ -213,7 +246,7 @@ settings_move_key_t _moveKeys(const String& from, const String& to, size_t index
|
||||
}
|
||||
|
||||
void moveSetting(const String& from, const String& to) {
|
||||
auto result = settings::kv_store.get(from);
|
||||
auto result = settings::internal::get(from);
|
||||
if (result) {
|
||||
setSetting(to, result.ref());
|
||||
}
|
||||
@@ -223,7 +256,7 @@ void moveSetting(const String& from, const String& to) {
|
||||
void moveSetting(const String& from, const String& to, size_t index) {
|
||||
const auto keys = _moveKeys(from, to, index);
|
||||
|
||||
auto result = settings::kv_store.get(keys.first.value());
|
||||
auto result = settings::internal::get(keys.first.value());
|
||||
if (result) {
|
||||
setSetting(keys.second, result.ref());
|
||||
}
|
||||
@@ -234,7 +267,7 @@ void moveSetting(const String& from, const String& to, size_t index) {
|
||||
void moveSettings(const String& from, const String& to) {
|
||||
for (size_t index = 0; index < 100; ++index) {
|
||||
const auto keys = _moveKeys(from, to, index);
|
||||
auto result = settings::kv_store.get(keys.first.value());
|
||||
auto result = settings::internal::get(keys.first.value());
|
||||
if (!result) {
|
||||
break;
|
||||
}
|
||||
@@ -272,7 +305,7 @@ template
|
||||
double getSetting(const SettingsKey& key, double defaultValue);
|
||||
|
||||
String getSetting(const String& key) {
|
||||
return std::move(settings::kv_store.get(key)).get();
|
||||
return std::move(settings::internal::get(key)).get();
|
||||
}
|
||||
|
||||
String getSetting(const __FlashStringHelper* key) {
|
||||
@@ -297,7 +330,7 @@ String getSetting(const SettingsKey& key, const __FlashStringHelper* defaultValu
|
||||
}
|
||||
|
||||
String getSetting(const SettingsKey& key, const String& defaultValue) {
|
||||
auto result = settings::kv_store.get(key.value());
|
||||
auto result = settings::internal::get(key.value());
|
||||
if (result) {
|
||||
return std::move(result).get();
|
||||
}
|
||||
@@ -306,7 +339,7 @@ String getSetting(const SettingsKey& key, const String& defaultValue) {
|
||||
}
|
||||
|
||||
String getSetting(const SettingsKey& key, String&& defaultValue) {
|
||||
auto result = settings::kv_store.get(key.value());
|
||||
auto result = settings::internal::get(key.value());
|
||||
if (result) {
|
||||
return std::move(result).get();
|
||||
}
|
||||
@@ -315,7 +348,7 @@ String getSetting(const SettingsKey& key, String&& defaultValue) {
|
||||
}
|
||||
|
||||
bool delSetting(const String& key) {
|
||||
return settings::kv_store.del(key);
|
||||
return settings::internal::del(key);
|
||||
}
|
||||
|
||||
bool delSetting(const SettingsKey& key) {
|
||||
@@ -331,7 +364,7 @@ bool delSetting(const __FlashStringHelper* key) {
|
||||
}
|
||||
|
||||
bool hasSetting(const String& key) {
|
||||
return settings::kv_store.has(key);
|
||||
return settings::internal::has(key);
|
||||
}
|
||||
|
||||
bool hasSetting(const SettingsKey& key) {
|
||||
@@ -463,10 +496,10 @@ void _settingsInitCommands() {
|
||||
ctx.output.printf_P(PSTR("> %s => \"%s\"\n"), (keys[i]).c_str(), value.c_str());
|
||||
}
|
||||
|
||||
auto available [[gnu::unused]] = settings::kv_store.available();
|
||||
auto available [[gnu::unused]] = settings::internal::available();
|
||||
ctx.output.printf_P(PSTR("Number of keys: %u\n"), keys.size());
|
||||
ctx.output.printf_P(PSTR("Available: %u bytes (%u%%)\n"),
|
||||
available, (100 * available) / settings::kv_store.size());
|
||||
available, (100 * available) / settings::internal::size());
|
||||
|
||||
terminalOK(ctx);
|
||||
});
|
||||
@@ -479,7 +512,7 @@ void _settingsInitCommands() {
|
||||
|
||||
int result = 0;
|
||||
for (auto it = (ctx.argv.begin() + 1); it != ctx.argv.end(); ++it) {
|
||||
result += settings::kv_store.del(*it);
|
||||
result += settings::internal::del(*it);
|
||||
}
|
||||
|
||||
if (result) {
|
||||
@@ -495,7 +528,7 @@ void _settingsInitCommands() {
|
||||
return;
|
||||
}
|
||||
|
||||
if (settings::kv_store.set(ctx.argv[1], ctx.argv[2])) {
|
||||
if (settings::internal::set(ctx.argv[1], ctx.argv[2])) {
|
||||
terminalOK(ctx);
|
||||
return;
|
||||
}
|
||||
@@ -511,7 +544,7 @@ void _settingsInitCommands() {
|
||||
|
||||
for (auto it = (ctx.argv.begin() + 1); it != ctx.argv.end(); ++it) {
|
||||
const String& key = *it;
|
||||
auto result = settings::kv_store.get(key);
|
||||
auto result = settings::internal::get(key);
|
||||
if (!result) {
|
||||
const auto maybeDefault = settingsQueryDefaults(key);
|
||||
if (maybeDefault.length()) {
|
||||
|
||||
@@ -51,8 +51,6 @@ void commit() {
|
||||
|
||||
using kvs_type = embedis::KeyValueStore<EepromStorage>;
|
||||
|
||||
extern kvs_type kv_store;
|
||||
|
||||
} // namespace settings
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
@@ -82,6 +80,20 @@ using enable_if_arduino_string = std::enable_if<is_arduino_string<T>::value>;
|
||||
template <typename T>
|
||||
using enable_if_not_arduino_string = std::enable_if<!is_arduino_string<T>::value>;
|
||||
|
||||
ValueResult get(const String& key);
|
||||
bool set(const String& key, const String& value);
|
||||
bool del(const String& key);
|
||||
bool has(const String& key);
|
||||
|
||||
using Keys = std::vector<String>;
|
||||
Keys keys();
|
||||
|
||||
size_t available();
|
||||
size_t size();
|
||||
|
||||
using KeyValueResultCallback = std::function<void(settings::kvs_type::KeyValueResult&&)>;
|
||||
void foreach(KeyValueResultCallback&& callback);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
||||
template <typename T>
|
||||
@@ -193,7 +205,7 @@ T getSetting(const SettingsKey& key, T defaultValue) __attribute__((noinline));
|
||||
|
||||
template <typename T, typename = typename settings::internal::enable_if_not_arduino_string<T>::type>
|
||||
T getSetting(const SettingsKey& key, T defaultValue) {
|
||||
auto result = settings::kv_store.get(key.value());
|
||||
auto result = settings::internal::get(key.value());
|
||||
if (result) {
|
||||
return settings::internal::convert<T>(result.ref());
|
||||
}
|
||||
@@ -213,7 +225,7 @@ String getSetting(const SettingsKey& key, String&& defaultValue);
|
||||
|
||||
template<typename T, typename = typename settings::internal::enable_if_arduino_string<T>::type>
|
||||
bool setSetting(const SettingsKey& key, T&& value) {
|
||||
return settings::kv_store.set(key.value(), value);
|
||||
return settings::internal::set(key.value(), value);
|
||||
}
|
||||
|
||||
template<typename T, typename = typename settings::internal::enable_if_not_arduino_string<T>::type>
|
||||
|
||||
@@ -276,7 +276,7 @@ void _onGetConfig(AsyncWebServerRequest *request) {
|
||||
}
|
||||
out->concat(buffer, prefix_len);
|
||||
|
||||
settings::kv_store.foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
settings::internal::foreach([&](settings::kvs_type::KeyValueResult&& kv) {
|
||||
auto key = kv.key.read();
|
||||
auto value = kv.value.read();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user