diff --git a/code/espurna/mqtt.cpp b/code/espurna/mqtt.cpp index ea346c1e..36592bdd 100644 --- a/code/espurna/mqtt.cpp +++ b/code/espurna/mqtt.cpp @@ -838,59 +838,75 @@ void _mqttBackwards() { } } -const char* _mqttBuildInfo() { #define __MQTT_INFO_STR(X) #X #define _MQTT_INFO_STR(X) __MQTT_INFO_STR(X) - alignas(4) static constexpr char out[] PROGMEM_STRING_ATTR { +alignas(4) static constexpr char MqttBuild[] PROGMEM_STRING_ATTR { #if MQTT_LIBRARY == MQTT_LIBRARY_ASYNCMQTTCLIENT - "AsyncMqttClient" + "AsyncMqttClient" #elif MQTT_LIBRARY == MQTT_LIBRARY_ARDUINOMQTT - "Arduino-MQTT" + "Arduino-MQTT" #elif MQTT_LIBRARY == MQTT_LIBRARY_PUBSUBCLIENT - "PubSubClient" + "PubSubClient" #endif #if SECURE_CLIENT != SEURE_CLIENT_NONE - " (w/ SECURE CLIENT)" + " (w/ SECURE CLIENT)" #endif - " Buffer size " _MQTT_INFO_STR(MQTT_BUFFER_MAX_SIZE) " (bytes)" - }; + " Buffer size " _MQTT_INFO_STR(MQTT_BUFFER_MAX_SIZE) " (bytes)" +}; #undef _MQTT_INFO_STR #undef __MQTT_INFO_STR - return out; -} -const char* _mqttClientEnabled() { - return _mqtt_enabled ? PSTR("ENABLED") : PSTR("DISABLED"); +constexpr espurna::StringView _mqttBuildInfo() { + return MqttBuild; +} + +String _mqttClientState(AsyncClientState state) { + espurna::StringView out; + + switch (state) { + case AsyncClientState::Connecting: + out = STRING_VIEW("CONNECTING"); + break; + case AsyncClientState::Connected: + out = STRING_VIEW("CONNECTED"); + break; + case AsyncClientState::Disconnected: + out = STRING_VIEW("DISCONNECTED"); + break; + case AsyncClientState::Disconnecting: + out = STRING_VIEW("DISCONNECTING"); + break; + default: + out = STRING_VIEW("WAITING"); + break; + } + + return out.toString(); } -String _mqttClientState() { - const __FlashStringHelper* state = nullptr; - switch (_mqtt_state) { - case AsyncClientState::Connecting: - state = F("CONNECTING"); - break; - case AsyncClientState::Connected: - state = F("CONNECTED"); - break; - case AsyncClientState::Disconnected: - state = F("DISCONNECTED"); - break; - case AsyncClientState::Disconnecting: - state = F("DISCONNECTING"); - break; - default: - state = F("WAITING"); - break; +String _mqttClientInfo(bool enabled, AsyncClientState state) { + String out; + + if (_mqtt_enabled) { + out += _mqttClientState(state); + } else { + out += STRING_VIEW("DISABLED"); } - return state; + return out; +} + +String _mqttClientInfo() { + return _mqttClientInfo(_mqtt_enabled, _mqtt_state); } void _mqttInfo() { - DEBUG_MSG_P(PSTR("[MQTT] %s\n"), _mqttBuildInfo()); - DEBUG_MSG_P(PSTR("[MQTT] Client %s (%s)\n"), - _mqttClientEnabled(), _mqttClientState().c_str()); + constexpr auto build = _mqttBuildInfo(); + DEBUG_MSG_P(PSTR("[MQTT] %.*s\n"), build.length(), build.data()); + + const auto client = _mqttClientInfo(); + DEBUG_MSG_P(PSTR("[MQTT] Client %.*s\n"), client.length(), client.c_str()); if (_mqtt_enabled && (_mqtt_state != AsyncClientState::Connected)) { DEBUG_MSG_P(PSTR("[MQTT] Retrying, Last %u with Delay %u (Step %u)\n"), @@ -960,8 +976,12 @@ namespace { PROGMEM_STRING(MqttCommand, "MQTT"); static void _mqttCommand(::terminal::CommandContext&& ctx) { - ctx.output.printf_P(PSTR("%s\n"), _mqttBuildInfo()); - ctx.output.printf_P(PSTR("client %s\n"), _mqttClientState().c_str()); + constexpr auto build = _mqttBuildInfo(); + ctx.output.printf_P(PSTR("%.*s\n"), build.length(), build.c_str()); + + const auto client = _mqttClientInfo(); + ctx.output.printf_P(PSTR("client %.*s\n"), client.length(), client.c_str()); + settingsDump(ctx, mqtt::settings::query::Settings); terminalOK(ctx); } diff --git a/code/espurna/types.h b/code/espurna/types.h index 44acdd9c..172d2f8e 100644 --- a/code/espurna/types.h +++ b/code/espurna/types.h @@ -312,6 +312,10 @@ struct StringView { return _ptr; } + constexpr const char* data() const { + return _ptr; + } + constexpr const char& operator[](size_t offset) const { return *(_ptr + offset); }