diff --git a/code/espurna/button.cpp b/code/espurna/button.cpp index 3a6b14b0..7327f2f1 100644 --- a/code/espurna/button.cpp +++ b/code/espurna/button.cpp @@ -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::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: { diff --git a/code/espurna/migrate.cpp b/code/espurna/migrate.cpp index a0ef32ea..2100b96f 100644 --- a/code/espurna/migrate.cpp +++ b/code/espurna/migrate.cpp @@ -15,8 +15,7 @@ Copyright (C) 2016-2019 by Xose Pérez void delSettingPrefix(const std::initializer_list& prefixes) { std::vector 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)) { diff --git a/code/espurna/ntp.cpp b/code/espurna/ntp.cpp index 9c3e23ea..3350d4f8 100644 --- a/code/espurna/ntp.cpp +++ b/code/espurna/ntp.cpp @@ -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; diff --git a/code/espurna/relay.cpp b/code/espurna/relay.cpp index 4ad193ef..81e90729 100644 --- a/code/espurna/relay.cpp +++ b/code/espurna/relay.cpp @@ -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; diff --git a/code/espurna/rfbridge.cpp b/code/espurna/rfbridge.cpp index b451d136..2f1b9294 100644 --- a/code/espurna/rfbridge.cpp +++ b/code/espurna/rfbridge.cpp @@ -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")) diff --git a/code/espurna/settings.cpp b/code/espurna/settings.cpp index fc860012..efb4f257 100644 --- a/code/espurna/settings.cpp +++ b/code/espurna/settings.cpp @@ -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 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 settingsKeys() { return keys; } - static std::vector _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()) { diff --git a/code/espurna/settings.h b/code/espurna/settings.h index c2670d0c..ed6c045d 100644 --- a/code/espurna/settings.h +++ b/code/espurna/settings.h @@ -51,8 +51,6 @@ void commit() { using kvs_type = embedis::KeyValueStore; -extern kvs_type kv_store; - } // namespace settings // -------------------------------------------------------------------------- @@ -82,6 +80,20 @@ using enable_if_arduino_string = std::enable_if::value>; template using enable_if_not_arduino_string = std::enable_if::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; +Keys keys(); + +size_t available(); +size_t size(); + +using KeyValueResultCallback = std::function; +void foreach(KeyValueResultCallback&& callback); + // -------------------------------------------------------------------------- template @@ -193,7 +205,7 @@ T getSetting(const SettingsKey& key, T defaultValue) __attribute__((noinline)); template ::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(result.ref()); } @@ -213,7 +225,7 @@ String getSetting(const SettingsKey& key, String&& defaultValue); template::type> bool setSetting(const SettingsKey& key, T&& value) { - return settings::kv_store.set(key.value(), value); + return settings::internal::set(key.value(), value); } template::type> diff --git a/code/espurna/web.cpp b/code/espurna/web.cpp index 8a8c1ff4..5361c131 100644 --- a/code/espurna/web.cpp +++ b/code/espurna/web.cpp @@ -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();