diff --git a/code/espurna/ifan.cpp b/code/espurna/ifan.cpp index 7b9381c4..28ca748c 100644 --- a/code/espurna/ifan.cpp +++ b/code/espurna/ifan.cpp @@ -133,7 +133,7 @@ struct StatePins { return _state; } - String mask(); + String toString() const; private: // XXX: while these are hard-coded, we don't really benefit from having these in the hardware cfg @@ -165,15 +165,6 @@ StatePins::State StatePins::state(FanSpeed speed) { return _state; } -String StatePins::mask() { - String out("0b000"); - for (size_t index = 2; index != out.length(); ++index) { - out[index] = (_state[index - 2] == HIGH) ? '1' : '0'; - } - - return out; -} - void StatePins::reset() { for (auto& pin : _pins) { if (pin.handle) { @@ -218,6 +209,17 @@ StatePins::State StatePins::update(FanSpeed speed) { return out; } +#if DEBUG_SUPPORT +String StatePins::toString() const { + String out("0b000"); + for (size_t index = 2; index != out.length(); ++index) { + out[index] = (_state[index - 2] == HIGH) ? '1' : '0'; + } + + return out; +} +#endif + struct ControlPin { ~ControlPin() { reset(); @@ -308,7 +310,8 @@ void save(FanSpeed speed) { [speed]() { const auto value = speedToPayload(speed); setSetting(settings::keys::Speed, value); - DEBUG_MSG_P(PSTR("[IFAN] Saved speed \"%s\"\n"), value.c_str()); + DEBUG_MSG_P(PSTR("[IFAN] Saved speed \"%s\" (%s)\n"), + value.c_str(), internal::state_pins.toString().c_str()); }); } } diff --git a/code/espurna/relay.cpp b/code/espurna/relay.cpp index e0737aa0..ac405661 100644 --- a/code/espurna/relay.cpp +++ b/code/espurna/relay.cpp @@ -270,32 +270,44 @@ PROGMEM_STRING(PayloadOn, RELAY_MQTT_ON); PROGMEM_STRING(PayloadOff, RELAY_MQTT_OFF); PROGMEM_STRING(PayloadToggle, RELAY_MQTT_TOGGLE); -const StringView mqttTopicSub(size_t index) { - return ( - (index == 0) ? StringView(PSTR(RELAY1_MQTT_TOPIC_SUB)) : - (index == 1) ? StringView(PSTR(RELAY2_MQTT_TOPIC_SUB)) : - (index == 2) ? StringView(PSTR(RELAY3_MQTT_TOPIC_SUB)) : - (index == 3) ? StringView(PSTR(RELAY4_MQTT_TOPIC_SUB)) : - (index == 4) ? StringView(PSTR(RELAY5_MQTT_TOPIC_SUB)) : - (index == 5) ? StringView(PSTR(RELAY6_MQTT_TOPIC_SUB)) : - (index == 6) ? StringView(PSTR(RELAY7_MQTT_TOPIC_SUB)) : - (index == 7) ? StringView(PSTR(RELAY8_MQTT_TOPIC_SUB)) : "" +#define RELAY_SETTING_STRING_RESULT(FIRST, SECOND, THIRD, FOURTH, FIFTH, SIXTH, SEVENTH, EIGHTH)\ + (index == 0) ? STRING_VIEW_SETTING(FIRST) :\ + (index == 1) ? STRING_VIEW_SETTING(SECOND) :\ + (index == 2) ? STRING_VIEW_SETTING(THIRD) :\ + (index == 3) ? STRING_VIEW_SETTING(FOURTH) :\ + (index == 4) ? STRING_VIEW_SETTING(FIFTH) :\ + (index == 5) ? STRING_VIEW_SETTING(SIXTH) :\ + (index == 6) ? STRING_VIEW_SETTING(SEVENTH) :\ + (index == 7) ? STRING_VIEW_SETTING(EIGHTH) : StringView() + +StringView mqttTopicSub(size_t index) { + return RELAY_SETTING_STRING_RESULT( + RELAY1_MQTT_TOPIC_SUB, + RELAY2_MQTT_TOPIC_SUB, + RELAY3_MQTT_TOPIC_SUB, + RELAY4_MQTT_TOPIC_SUB, + RELAY5_MQTT_TOPIC_SUB, + RELAY6_MQTT_TOPIC_SUB, + RELAY7_MQTT_TOPIC_SUB, + RELAY8_MQTT_TOPIC_SUB ); } -const StringView mqttTopicPub(size_t index) { - return ( - (index == 0) ? StringView(PSTR(RELAY1_MQTT_TOPIC_PUB)) : - (index == 1) ? StringView(PSTR(RELAY2_MQTT_TOPIC_PUB)) : - (index == 2) ? StringView(PSTR(RELAY3_MQTT_TOPIC_PUB)) : - (index == 3) ? StringView(PSTR(RELAY4_MQTT_TOPIC_PUB)) : - (index == 4) ? StringView(PSTR(RELAY5_MQTT_TOPIC_PUB)) : - (index == 5) ? StringView(PSTR(RELAY6_MQTT_TOPIC_PUB)) : - (index == 6) ? StringView(PSTR(RELAY7_MQTT_TOPIC_PUB)) : - (index == 7) ? StringView(PSTR(RELAY8_MQTT_TOPIC_PUB)) : "" +StringView mqttTopicPub(size_t index) { + return RELAY_SETTING_STRING_RESULT( + RELAY1_MQTT_TOPIC_PUB, + RELAY2_MQTT_TOPIC_PUB, + RELAY3_MQTT_TOPIC_PUB, + RELAY4_MQTT_TOPIC_PUB, + RELAY5_MQTT_TOPIC_PUB, + RELAY6_MQTT_TOPIC_PUB, + RELAY7_MQTT_TOPIC_PUB, + RELAY8_MQTT_TOPIC_PUB ); } +#undef RELAY_SETTING_STRING_RESULT + constexpr PayloadStatus mqttDisconnectionStatus(size_t index) { return ( (index == 0) ? (RELAY1_MQTT_DISCONNECT_STATUS) : @@ -565,6 +577,7 @@ void expire() { }); } +[[gnu::unused]] Seconds findDuration(size_t id) { Seconds out{}; @@ -1623,6 +1636,7 @@ void _relayHandleStatus(size_t id, PayloadStatus status) { } } +[[gnu::unused]] bool _relayHandlePayload(size_t id, espurna::StringView payload) { const auto status = relayParsePayload(payload); if (status != PayloadStatus::Unknown) { @@ -1714,6 +1728,7 @@ String _relayTristateToPayload(T value) { return espurna::settings::internal::RelayTristateHelper::serialize(value); } +[[gnu::unused]] bool _relayHandleLockPayload(size_t id, espurna::StringView payload) { if (id < _relays.size()) { const auto status = relayStatusTarget(id); diff --git a/code/espurna/rpnrules.cpp b/code/espurna/rpnrules.cpp index 483d9882..fc8c342c 100644 --- a/code/espurna/rpnrules.cpp +++ b/code/espurna/rpnrules.cpp @@ -140,22 +140,6 @@ String name(size_t index) { return getSetting({keys::Name, index}); } -#if MQTT_SUPPORT -size_t countMqttNames() { - size_t index { 0 }; - for (;;) { - auto name = espurna::settings::Key(keys::Name, index); - if (!espurna::settings::has(name.value())) { - break; - } - - ++index; - } - - return index; -} -#endif - } // namespace settings namespace internal { @@ -385,6 +369,27 @@ void setup() { #if WEB_SUPPORT namespace web { +#if MQTT_SUPPORT +static constexpr std::array Settings PROGMEM { + {{settings::keys::Name, settings::name}, + {settings::keys::Topic, settings::topic}} +}; + +size_t countMqttNames() { + size_t index { 0 }; + for (;;) { + auto name = espurna::settings::Key(settings::keys::Name, index); + if (!espurna::settings::has(name.value())) { + break; + } + + ++index; + } + + return index; +} +#endif + bool onKeyCheck(espurna::StringView key, const JsonVariant& value) { return espurna::settings::query::samePrefix(key, STRING_VIEW("rpn")); } @@ -411,13 +416,8 @@ void onConnected(JsonObject& root) { } #if MQTT_SUPPORT - static constexpr std::array Settings { - {{settings::keys::Name, settings::name}, - {settings::keys::Topic, settings::topic}} - }; - espurna::web::ws::EnumerableConfig config{ root, STRING_VIEW("rpnTopics") }; - config(STRING_VIEW("topics"), settings::countMqttNames(), Settings); + config(STRING_VIEW("topics"), countMqttNames(), Settings); #endif } diff --git a/code/espurna/system.cpp b/code/espurna/system.cpp index a1ad4dbd..48010057 100644 --- a/code/espurna/system.cpp +++ b/code/espurna/system.cpp @@ -1328,7 +1328,8 @@ void push(Callback callback, Mode mode, duration::Seconds interval) { schedule(); } -void pushOnce(Callback callback) { +[[gnu::unused]] +void push_once(Callback callback) { push(callback, Mode::Once, espurna::duration::Seconds::min()); } @@ -1363,7 +1364,7 @@ void loop() { void init() { #if DEBUG_SUPPORT - pushOnce([](Mask) { + push_once([](Mask) { const auto mode = settings::mode(); if (mode != Mode::None) { DEBUG_MSG_P(PSTR("[MAIN] Heartbeat \"%s\", every %u (seconds)\n"), @@ -1375,7 +1376,7 @@ void init() { return true; }); #if SYSTEM_CHECK_ENABLED - pushOnce([](Mask) { + push_once([](Mask) { if (!espurna::boot::stability::check()) { DEBUG_MSG_P(PSTR("[MAIN] System UNSTABLE\n")); } else if (espurna::boot::internal::timer) { diff --git a/code/espurna/telnet.cpp b/code/espurna/telnet.cpp index 60a30ba2..cdbdab30 100644 --- a/code/espurna/telnet.cpp +++ b/code/espurna/telnet.cpp @@ -327,6 +327,7 @@ Address address(tcp_pcb* pcb) { return out; } +[[gnu::unused]] String address_string(Address address) { return IPAddress(address.ip).toString() + ':' + String(address.port, 10); } @@ -676,10 +677,6 @@ next: ClientWriter _writer; }; -String address_string(const Client* ptr) { - return address_string(ptr->remote()); -} - using ClientPtr = std::unique_ptr; template @@ -813,14 +810,14 @@ bool add(ClientPtr client) { auto result = internal::clients.add(std::move(client)); if (result) { DEBUG_MSG_P(PSTR("[TELNET] Connected %s\n"), - address_string(result).c_str()); + address_string(result->remote()).c_str()); result->maybe_ask_auth(); return true; } client->abort(); DEBUG_MSG_P(PSTR("[TELNET] Rejecting %s\n"), - address_string(client.get()).c_str()); + address_string(client.get()->remote()).c_str()); return false; }