Skip to content

Commit

Permalink
settings: query for setting, not value
Browse files Browse the repository at this point in the history
  • Loading branch information
mcspr committed Apr 14, 2024
1 parent dd6bede commit 07743c5
Show file tree
Hide file tree
Showing 15 changed files with 126 additions and 100 deletions.
6 changes: 3 additions & 3 deletions code/espurna/button.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -833,15 +833,15 @@ bool checkSamePrefix(StringView key) {
return key.startsWith(espurna::button::settings::Prefix);
}

String findValueFrom(StringView key) {
return espurna::settings::query::findValueFrom(
espurna::settings::query::Result findFrom(StringView key) {
return espurna::settings::query::findFrom(
button::internal::buttons.size(), IndexedSettings, key);
}

void setup() {
settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findValueFrom
.get = findFrom,
});
}

Expand Down
6 changes: 3 additions & 3 deletions code/espurna/homeassistant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,14 @@ bool checkSamePrefix(espurna::StringView key) {
return key.startsWith(Prefix);
}

String findValueFrom(espurna::StringView key) {
return espurna::settings::query::findValueFrom(Settings, key);
espurna::settings::query::Result findFrom(StringView key) {
return espurna::settings::query::findFrom(Settings, key);
}

void setup() {
::settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findValueFrom,
.get = findFrom,
});
}

Expand Down
6 changes: 3 additions & 3 deletions code/espurna/led.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -634,15 +634,15 @@ bool checkSamePrefix(StringView key) {
return key.startsWith(Prefix);
}

String findValueFrom(StringView key) {
return espurna::settings::query::findValueFrom(
espurna::settings::query::Result findFrom(StringView key) {
return espurna::settings::query::findFrom(
::espurna::led::internal::leds.size(), IndexedSettings, key);
}

void setup() {
::settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findValueFrom
.get = findFrom,
});
}

Expand Down
6 changes: 3 additions & 3 deletions code/espurna/mqtt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -410,14 +410,14 @@ bool checkSamePrefix(espurna::StringView key) {
return key.startsWith(settings::Prefix);
}

String findValueFrom(espurna::StringView key) {
return espurna::settings::query::findValueFrom(Settings, key);
espurna::settings::query::Result findFrom(espurna::StringView key) {
return espurna::settings::query::findFrom(Settings, key);
}

void setup() {
::settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findValueFrom
.get = findFrom,
});
}

Expand Down
24 changes: 7 additions & 17 deletions code/espurna/relay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3321,33 +3321,23 @@ bool checkSamePrefix(StringView key) {
return key.startsWith(Prefix);
}

String findIndexedValueFrom(StringView key) {
return espurna::settings::query::findValueFrom(_relays.size(), IndexedSettings, key);
espurna::settings::query::Result findFromIndexed(StringView key) {
return espurna::settings::query::findFrom(_relays.size(), IndexedSettings, key);
}

bool checkExact(StringView key) {
for (const auto& setting : Settings) {
if (key == setting.key()) {
return true;
}
}

return false;
}

String findValueFrom(StringView key) {
return espurna::settings::query::findValueFrom(Settings, key);
espurna::settings::query::Result findFrom(StringView key) {
return espurna::settings::query::findFrom(Settings, key);
}

void setup() {
::settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findIndexedValueFrom
.get = findFromIndexed,
});

::settingsRegisterQueryHandler({
.check = checkExact,
.get = findValueFrom
.check = nullptr,
.get = findFrom,
});
}

Expand Down
6 changes: 3 additions & 3 deletions code/espurna/scheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -420,14 +420,14 @@ bool checkSamePrefix(StringView key) {
return key.startsWith(Prefix);
}

String findIndexedValueFrom(StringView key) {
return espurna::settings::query::findValueFrom(count(), IndexedSettings, key);
espurna::settings::query::Result findFrom(StringView key) {
return espurna::settings::query::findFrom(count(), IndexedSettings, key);
}

void setup() {
settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findIndexedValueFrom
.get = findFrom,
});
}

Expand Down
75 changes: 52 additions & 23 deletions code/espurna/sensor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3096,8 +3096,35 @@ void setup(const Magnitude& magnitude) {

namespace settings {
namespace query {

#define EXACT_VALUE(NAME, FUNC)\
String NAME () {\
return espurna::settings::internal::serialize(FUNC());\
}

EXACT_VALUE(readInterval, settings::readInterval);
EXACT_VALUE(initInterval, settings::initInterval);
EXACT_VALUE(reportEvery, settings::reportEvery);
EXACT_VALUE(saveEvery, settings::saveEvery);
EXACT_VALUE(realTimeValues, settings::realTimeValues);

static constexpr espurna::settings::query::Setting Settings[] {
{keys::ReadInterval, readInterval},
{keys::InitInterval, initInterval},
{keys::ReportEvery, reportEvery},
{keys::SaveEvery, saveEvery},
{keys::RealTimeValues, realTimeValues},
};

#undef EXACT_VALUE

namespace getter {

#define EXACT_VALUE(NAME)\
String NAME (const Magnitude& magnitude) {\
return espurna::settings::internal::serialize(magnitude.NAME);\
}

struct Type {
using Check = bool(*)(unsigned char);
using Get = String(*)(const Magnitude&);
Expand All @@ -3107,11 +3134,6 @@ struct Type {
Get get;
};

#define EXACT_VALUE(NAME)\
String NAME (const Magnitude& magnitude) {\
return espurna::settings::internal::serialize(magnitude.NAME);\
}

EXACT_VALUE(correction)
EXACT_VALUE(decimals)
EXACT_VALUE(filter_type)
Expand All @@ -3135,17 +3157,19 @@ static constexpr std::array<Type, 5> List PROGMEM {{

} // namespace getter

bool check(StringView key) {
if (key.length() < 3) {
return false;
}
using espurna::settings::query::Result;

if (key.startsWith(settings::prefix::Sensor)) {
return true;
}
bool checkSensor(StringView key) {
return key.startsWith(settings::prefix::Sensor);
}

if (key.startsWith(settings::prefix::Power)) {
return true;
Result findFrom(StringView key) {
return espurna::settings::query::findFrom(Settings, key);
}

bool checkMagnitude(StringView key) {
if (key.length() < 3) {
return false;
}

return magnitude::forEachCountedCheck(
Expand All @@ -3154,9 +3178,7 @@ bool check(StringView key) {
});
}

String get(StringView key) {
String out;

Result findMagnitudeFrom(StringView key) {
for (auto& magnitude : magnitude::internal::magnitudes) {
for (const auto& type : getter::List) {
if (type.check && !type.check(magnitude.type)) {
Expand All @@ -3165,20 +3187,27 @@ String get(StringView key) {

const auto expected = keys::get(magnitude, type.suffix);
if (key == expected.value()) {
out = type.get(magnitude);
goto out;
return Result(type.get(magnitude));
}
}
}

out:
return out;
return Result(nullptr);
}

bool check(StringView key) {
return checkSensor(key) || checkMagnitude(key);
}

void setup() {
settingsRegisterQueryHandler({
.check = check,
.get = get,
.check = checkMagnitude,
.get = findMagnitudeFrom,
});

settingsRegisterQueryHandler({
.check = checkSensor,
.get = findFrom,
});
}

Expand Down
12 changes: 6 additions & 6 deletions code/espurna/sensors/DigitalSensor.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,9 @@ STRING_VIEW_INLINE(Prefix, "digital");

namespace keys {

STRING_VIEW_INLINE(Pin, "dgtlsPin");
STRING_VIEW_INLINE(Mode, "dgtlsPinMode");
STRING_VIEW_INLINE(State, "dgtlsDefState");
STRING_VIEW_INLINE(Pin, "digitalPin");
STRING_VIEW_INLINE(Mode, "digitalPinMode");
STRING_VIEW_INLINE(State, "digitalDefState");

} // namespace keys

Expand Down Expand Up @@ -193,15 +193,15 @@ bool checkSamePrefix(StringView key) {
return key.startsWith(Prefix);
}

String findValueFrom(StringView key) {
return espurna::settings::query::findValueFrom(
espurna::settings::query::Result findFrom(StringView key) {
return espurna::settings::query::findFrom(
build::SensorsMax, IndexedSettings, key);
}

void setup() {
settingsRegisterQueryHandler({
.check = checkSamePrefix,
.get = findValueFrom,
.get = findFrom,
});
}

Expand Down
28 changes: 17 additions & 11 deletions code/espurna/settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ static kvs_type kv_store(
namespace query {

String Result::value() const {
if (_value) {
return *_value;
}

if (_ptr == nullptr) {
return String();
}
Expand Down Expand Up @@ -119,17 +123,19 @@ std::forward_list<Handler> handlers;
} // namespace
} // namespace internal

String find(StringView key) {
String out;

Result find(StringView key) {
for (const auto& handler : internal::handlers) {
if (handler.check(key)) {
out = handler.get(key);
break;
if (handler.check != nullptr && !handler.check(key)) {
continue;
}

auto result = handler.get(key);
if (result.ok()) {
return result;
}
}

return out;
return Result(nullptr);
}

} // namespace query
Expand Down Expand Up @@ -367,10 +373,10 @@ void get(::terminal::CommandContext&& ctx) {
for (auto it = (ctx.argv.cbegin() + 1); it != ctx.argv.cend(); ++it) {
auto result = settings::get(*it);
if (!result) {
const auto maybeValue = query::find(*it);
if (maybeValue.length()) {
const auto result = query::find(*it);
if (result.ok()) {
ctx.output.printf_P(PSTR("> %s => %s (default)\n"),
(*it).c_str(), maybeValue.c_str());
(*it).c_str(), result.value().c_str());
} else {
ctx.output.printf_P(PSTR("> %s =>\n"), (*it).c_str());
}
Expand Down Expand Up @@ -452,7 +458,7 @@ void settingsRegisterQueryHandler(espurna::settings::query::Handler handler) {
espurna::settings::query::internal::handlers.push_front(handler);
}

String settingsQuery(espurna::StringView key) {
espurna::settings::query::Result settingsQuery(espurna::StringView key) {
return espurna::settings::query::find(key);
}

Expand Down
4 changes: 2 additions & 2 deletions code/espurna/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ void foreach_prefix(PrefixResultCallback&&, settings::query::StringViewIterator)
namespace query {

using Check = bool(*)(StringView key);
using Get = String(*)(StringView key);
using Get = Result(*)(StringView key);

struct Handler {
Check check;
Expand All @@ -106,7 +106,7 @@ struct Handler {
} // namespace espurna

void settingsRegisterQueryHandler(espurna::settings::query::Handler);
String settingsQuery(espurna::StringView key);
espurna::settings::query::Result settingsQuery(espurna::StringView key);

// --------------------------------------------------------------------------

Expand Down
Loading

0 comments on commit 07743c5

Please sign in to comment.