diff --git a/firmware/include/extensions/AlexaExtension.h b/firmware/include/extensions/AlexaExtension.h index ad8ce44b..454bdd69 100644 --- a/firmware/include/extensions/AlexaExtension.h +++ b/firmware/include/extensions/AlexaExtension.h @@ -10,21 +10,21 @@ class AlexaExtension final : public ExtensionModule { private: - fauxmoESP fauxmo = fauxmoESP(); + static constexpr std::string_view name{"Alexa"}; + + static inline fauxmoESP fauxmo = fauxmoESP(); static void onGet(AsyncWebServerRequest *request); static void onSet(AsyncWebServerRequest *request, uint8_t *data, size_t len, size_t index, size_t total); static void onSetState(unsigned char deviceId, const char *deviceName, bool state, unsigned char value); public: - explicit AlexaExtension(); + explicit AlexaExtension() : ExtensionModule(name) {}; void begin() override; void handle() override; - void onTransmit(JsonObjectConst payload, const char *source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; }; -extern AlexaExtension *Alexa; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_ALEXA diff --git a/firmware/include/extensions/ButtonExtension.h b/firmware/include/extensions/ButtonExtension.h index a49491cc..ea944eb5 100644 --- a/firmware/include/extensions/ButtonExtension.h +++ b/firmware/include/extensions/ButtonExtension.h @@ -8,28 +8,30 @@ class ButtonExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Button"}; + #ifdef PIN_SW1 bool brightnessIncrease = false; - bool powerLong = false; - bool powerShort = false; + inline static bool powerLong = false; + inline static bool powerShort = false; #endif #ifdef PIN_SW2 - bool modeLong = false; - bool modeShort = false; + inline static bool modeLong = false; + inline static bool modeShort = false; #endif #ifdef PIN_SW1 - volatile bool powerState = false; + static inline volatile bool powerState = false; #endif #ifdef PIN_SW2 - volatile bool modeState = false; + inline static volatile bool modeState = false; #endif #ifdef PIN_SW1 - volatile unsigned long powerMillis = 0; + static inline volatile unsigned long powerMillis = 0; #endif #ifdef PIN_SW2 - volatile unsigned long modeMillis = 0; + static inline volatile unsigned long modeMillis = 0; #endif static IRAM_ATTR void onInterrupt(); @@ -37,12 +39,10 @@ class ButtonExtension final : public ExtensionModule static void event(const char *key, const char *value); public: - explicit ButtonExtension(); + explicit ButtonExtension() : ExtensionModule(name) {}; void configure() override; void handle() override; }; -extern ButtonExtension *Button; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_BUTTON diff --git a/firmware/include/extensions/HeapExtension.h b/firmware/include/extensions/HeapExtension.h index 984cd3dd..d5d924ff 100644 --- a/firmware/include/extensions/HeapExtension.h +++ b/firmware/include/extensions/HeapExtension.h @@ -7,10 +7,12 @@ class HeapExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Heap"}; + unsigned long lastMillis = 0; public: - explicit HeapExtension(); + explicit HeapExtension() : ExtensionModule(name) {}; #if EXTENSION_HOMEASSISTANT void configure() override; @@ -20,6 +22,4 @@ class HeapExtension final : public ExtensionModule void transmit(); }; -extern HeapExtension *Heap; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_HEAP diff --git a/firmware/include/extensions/HomeAssistantExtension.h b/firmware/include/extensions/HomeAssistantExtension.h index 5c7fd03e..26ca1fd3 100644 --- a/firmware/include/extensions/HomeAssistantExtension.h +++ b/firmware/include/extensions/HomeAssistantExtension.h @@ -9,6 +9,8 @@ class HomeAssistantExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Home Assistant"}; + bool pending = false; inline static const std::string discoveryTopic = @@ -20,7 +22,7 @@ class HomeAssistantExtension final : public ExtensionModule void transmit(); public: - explicit HomeAssistantExtension(); + explicit HomeAssistantExtension() : ExtensionModule(name) {}; inline static const std::string uniquePrefix = std::format("0x{:x}_", ESP.getEfuseMac()); @@ -32,11 +34,9 @@ class HomeAssistantExtension final : public ExtensionModule void undiscover(); - void onTransmit(JsonObjectConst payload, const char *source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; }; -extern HomeAssistantExtension *HomeAssistant; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - namespace HomeAssistantAbbreviations { static constexpr std::string_view action_template = "act_tpl"; diff --git a/firmware/include/extensions/InfraredExtension.h b/firmware/include/extensions/InfraredExtension.h index 5cda9aba..814165b1 100644 --- a/firmware/include/extensions/InfraredExtension.h +++ b/firmware/include/extensions/InfraredExtension.h @@ -16,6 +16,8 @@ class InfraredExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Infrared"}; + struct Code { decode_type_t protocol{}; @@ -137,7 +139,7 @@ class InfraredExtension final : public ExtensionModule void transmit(); public: - explicit InfraredExtension(); + explicit InfraredExtension() : ExtensionModule(name) {}; void configure() override; void begin() override; @@ -147,9 +149,7 @@ class InfraredExtension final : public ExtensionModule void setActive(bool active); void parse(); - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; -extern InfraredExtension *Infrared; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_INFRARED diff --git a/firmware/include/extensions/MessageExtension.h b/firmware/include/extensions/MessageExtension.h index 6fa3170d..5972a50f 100644 --- a/firmware/include/extensions/MessageExtension.h +++ b/firmware/include/extensions/MessageExtension.h @@ -13,6 +13,8 @@ class MessageExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Message"}; + bool active = false; bool pending = false; @@ -46,7 +48,7 @@ class MessageExtension final : public ExtensionModule void transmit(); public: - explicit MessageExtension(); + explicit MessageExtension() : ExtensionModule(name) {}; #if EXTENSION_HOMEASSISTANT void configure() override; @@ -54,9 +56,7 @@ class MessageExtension final : public ExtensionModule void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; -extern MessageExtension *Message; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_MESSAGE diff --git a/firmware/include/extensions/MicrophoneExtension.h b/firmware/include/extensions/MicrophoneExtension.h index a5eea918..3a62bf21 100644 --- a/firmware/include/extensions/MicrophoneExtension.h +++ b/firmware/include/extensions/MicrophoneExtension.h @@ -7,6 +7,8 @@ class MicrophoneExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Microphone"}; + bool active = false; bool detected = false; bool pending = false; @@ -21,7 +23,7 @@ class MicrophoneExtension final : public ExtensionModule void transmit(); public: - explicit MicrophoneExtension(); + explicit MicrophoneExtension() : ExtensionModule(name) {}; void configure() override; void begin() override; @@ -32,9 +34,7 @@ class MicrophoneExtension final : public ExtensionModule void setThreshold(uint16_t _threshold); [[nodiscard]] bool isTriggered() const; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; -extern MicrophoneExtension *Microphone; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_MICROPHONE diff --git a/firmware/include/extensions/MqttExtension.h b/firmware/include/extensions/MqttExtension.h index edd0bc05..bca33f3e 100644 --- a/firmware/include/extensions/MqttExtension.h +++ b/firmware/include/extensions/MqttExtension.h @@ -9,6 +9,8 @@ class MqttExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"MQTT"}; + unsigned long lastMillis = 0; static inline bool subscribed = false; @@ -22,7 +24,7 @@ class MqttExtension final : public ExtensionModule const uint8_t *payload, size_t len, size_t index, size_t total); public: - explicit MqttExtension(); + explicit MqttExtension() : ExtensionModule(name) {}; espMqttClient client; @@ -31,9 +33,7 @@ class MqttExtension final : public ExtensionModule void disconnect(); - void onTransmit(JsonObjectConst payload, const char *source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; }; -extern MqttExtension *Mqtt; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_MQTT diff --git a/firmware/include/extensions/OtaExtension.h b/firmware/include/extensions/OtaExtension.h index 05dd8320..e02b0177 100644 --- a/firmware/include/extensions/OtaExtension.h +++ b/firmware/include/extensions/OtaExtension.h @@ -10,6 +10,8 @@ class OtaExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"OTA"}; + ArduinoOTAClass ArduinoOTA; static void onStart(); @@ -21,13 +23,11 @@ class OtaExtension final : public ExtensionModule #endif public: - explicit OtaExtension(); + explicit OtaExtension() : ExtensionModule(name) {}; void configure() override; void begin() override; void handle() override; }; -extern OtaExtension *Ota; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_OTA diff --git a/firmware/include/extensions/PhotocellExtension.h b/firmware/include/extensions/PhotocellExtension.h index 585d300e..828d1870 100644 --- a/firmware/include/extensions/PhotocellExtension.h +++ b/firmware/include/extensions/PhotocellExtension.h @@ -7,6 +7,8 @@ class PhotocellExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Photocell"}; + bool active = false; bool direction = false; bool pending = false; @@ -27,7 +29,7 @@ class PhotocellExtension final : public ExtensionModule void transmit(); public: - explicit PhotocellExtension(); + explicit PhotocellExtension() : ExtensionModule(name) {}; void configure() override; void begin() override; @@ -36,10 +38,8 @@ class PhotocellExtension final : public ExtensionModule [[nodiscard]] bool getActive() const; void setActive(bool active); - void onReceive(JsonObjectConst payload, const char *source) override; - void onTransmit(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; }; -extern PhotocellExtension *Photocell; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_PHOTOCELL diff --git a/firmware/include/extensions/PlaylistExtension.h b/firmware/include/extensions/PlaylistExtension.h index a888c4d6..d7bc9750 100644 --- a/firmware/include/extensions/PlaylistExtension.h +++ b/firmware/include/extensions/PlaylistExtension.h @@ -10,7 +10,7 @@ class PlaylistExtension final : public ExtensionModule { public: - explicit PlaylistExtension(); + explicit PlaylistExtension() : ExtensionModule(name) {}; struct Mode { @@ -24,10 +24,12 @@ class PlaylistExtension final : public ExtensionModule [[nodiscard]] bool getActive() const; void setActive(bool active); - void onReceive(JsonObjectConst payload, const char *source) override; - void onTransmit(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; private: + static constexpr std::string_view name{"Playlist"}; + bool active = false; uint8_t step = 0; @@ -40,6 +42,4 @@ class PlaylistExtension final : public ExtensionModule void transmit(); }; -extern PlaylistExtension *Playlist; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_PLAYLIST diff --git a/firmware/include/extensions/RestfulExtension.h b/firmware/include/extensions/RestfulExtension.h index 307b9670..237fff2b 100644 --- a/firmware/include/extensions/RestfulExtension.h +++ b/firmware/include/extensions/RestfulExtension.h @@ -9,17 +9,17 @@ class RestfulExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Restful"}; + static constexpr size_t prefixLength = sizeof("/restful/") - 1; static void onGet(AsyncWebServerRequest *request); static void onPatch(AsyncWebServerRequest *request, const uint8_t *data, size_t len, size_t index, size_t total); public: - explicit RestfulExtension(); + explicit RestfulExtension() : ExtensionModule(name) {}; void begin() override; }; -extern RestfulExtension *Restful; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_RESTFUL diff --git a/firmware/include/extensions/RtcExtension.h b/firmware/include/extensions/RtcExtension.h index 88363caa..3bb0c7ae 100644 --- a/firmware/include/extensions/RtcExtension.h +++ b/firmware/include/extensions/RtcExtension.h @@ -14,8 +14,10 @@ class RtcExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"RTC"}; + #ifdef PIN_INT - bool pending = true; + inline static bool pending = true; #endif #if defined(RTC_DS3231) || defined(RTC_DS3232) @@ -33,16 +35,16 @@ class RtcExtension final : public ExtensionModule #endif public: - explicit RtcExtension(); + explicit RtcExtension() : ExtensionModule(name) {}; #ifdef RTC_DS1307 - RtcDS1307 rtc{Wire}; + inline static RtcDS1307 rtc{Wire}; #elif defined(RTC_DS3231) - RtcDS3231 rtc{Wire}; + inline static RtcDS3231 rtc{Wire}; #elif defined(RTC_DS3232) - RtcDS3232 rtc{Wire}; + inline static RtcDS3232 rtc{Wire}; #elif defined(RTC_PCF8563) - RtcPCF8563 rtc{Wire}; + inline static RtcPCF8563 rtc{Wire}; #endif // RTC_DS1307 void configure() override; @@ -51,6 +53,4 @@ class RtcExtension final : public ExtensionModule #endif }; -extern RtcExtension *Rtc; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_RTC diff --git a/firmware/include/extensions/ServerSentEventsExtension.h b/firmware/include/extensions/ServerSentEventsExtension.h index faba1856..34e82baa 100644 --- a/firmware/include/extensions/ServerSentEventsExtension.h +++ b/firmware/include/extensions/ServerSentEventsExtension.h @@ -9,17 +9,17 @@ class ServerSentEventsExtension final : public ExtensionModule { public: - explicit ServerSentEventsExtension(); + static constexpr std::string_view name{"Server-Sent Events"}; - AsyncEventSource *client = new AsyncEventSource("/server-sent%20events"); + explicit ServerSentEventsExtension() : ExtensionModule(name) {}; + + AsyncEventSource events{"/server-sent%20events"}; void begin() override; - void onTransmit(JsonObjectConst payload, const char *source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; static void onConnect(AsyncEventSourceClient *client); }; -extern ServerSentEventsExtension *ServerSentEvents; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_SERVERSENTEVENTS diff --git a/firmware/include/extensions/SignalExtension.h b/firmware/include/extensions/SignalExtension.h index ae93a66b..5084bafb 100644 --- a/firmware/include/extensions/SignalExtension.h +++ b/firmware/include/extensions/SignalExtension.h @@ -10,6 +10,8 @@ class SignalExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Signal"}; + bool active = false; unsigned long lastMillis = 0; @@ -24,14 +26,12 @@ class SignalExtension final : public ExtensionModule void transmit(); public: - explicit SignalExtension(); + explicit SignalExtension() : ExtensionModule(name) {}; void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; -extern SignalExtension *Signal; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_SIGNAL diff --git a/firmware/include/extensions/WebAppExtension.h b/firmware/include/extensions/WebAppExtension.h index 10e60a46..8b0594a9 100644 --- a/firmware/include/extensions/WebAppExtension.h +++ b/firmware/include/extensions/WebAppExtension.h @@ -9,15 +9,15 @@ class WebAppExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"Web app"}; + static void onHeadRoot(AsyncWebServerRequest *request); public: - explicit WebAppExtension(); + explicit WebAppExtension() : ExtensionModule(name) {}; void configure() override; void begin() override; }; -extern WebAppExtension *WebApp; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_WEBAPP diff --git a/firmware/include/extensions/WebSocketExtension.h b/firmware/include/extensions/WebSocketExtension.h index 1b2b5b26..914ca990 100644 --- a/firmware/include/extensions/WebSocketExtension.h +++ b/firmware/include/extensions/WebSocketExtension.h @@ -9,20 +9,20 @@ class WebSocketExtension final : public ExtensionModule { private: + static constexpr std::string_view name{"WebSocket"}; + static void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, const uint8_t *data, size_t len); public: - explicit WebSocketExtension(); + explicit WebSocketExtension() : ExtensionModule(name) {}; AsyncWebSocket *server = new AsyncWebSocket("/websocket"); void begin() override; void handle() override; - void onTransmit(JsonObjectConst payload, const char *source) override; + void onTransmit(JsonObjectConst payload, std::string_view source) override; }; -extern WebSocketExtension *WebSocket; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - #endif // EXTENSION_WEBSOCKET diff --git a/firmware/include/modes/AnimationMode.h b/firmware/include/modes/AnimationMode.h index e45c8acb..50280e10 100644 --- a/firmware/include/modes/AnimationMode.h +++ b/firmware/include/modes/AnimationMode.h @@ -30,7 +30,7 @@ class AnimationMode final : public ModeModule void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_ANIMATION diff --git a/firmware/include/modes/ClockMode.h b/firmware/include/modes/ClockMode.h index e69b1130..d6d55037 100644 --- a/firmware/include/modes/ClockMode.h +++ b/firmware/include/modes/ClockMode.h @@ -54,7 +54,7 @@ class ClockMode final : public ModeModule void configure() override; void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_CLOCK diff --git a/firmware/include/modes/CountdownMode.h b/firmware/include/modes/CountdownMode.h index 17d5cb4b..7b0a84a7 100644 --- a/firmware/include/modes/CountdownMode.h +++ b/firmware/include/modes/CountdownMode.h @@ -48,7 +48,7 @@ class CountdownMode final : public ModeModule void begin() override; void handle() override; void setFont(std::string_view _fontName); - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_COUNTDOWN diff --git a/firmware/include/modes/DrawMode.h b/firmware/include/modes/DrawMode.h index c524f197..7caffe16 100644 --- a/firmware/include/modes/DrawMode.h +++ b/firmware/include/modes/DrawMode.h @@ -25,7 +25,7 @@ class DrawMode final : public ModeModule void begin() override; void handle() override; void end() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_DRAW diff --git a/firmware/include/modes/FliesMode.h b/firmware/include/modes/FliesMode.h index f07598f5..4f60fa4a 100644 --- a/firmware/include/modes/FliesMode.h +++ b/firmware/include/modes/FliesMode.h @@ -24,7 +24,7 @@ class FliesMode final : public ModeModule explicit FliesMode() : ModeModule("Flies") {}; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_FLIES diff --git a/firmware/include/modes/GameOfLifeMode.h b/firmware/include/modes/GameOfLifeMode.h index 37a69dd2..7f2ae0dc 100644 --- a/firmware/include/modes/GameOfLifeMode.h +++ b/firmware/include/modes/GameOfLifeMode.h @@ -28,7 +28,7 @@ class GameOfLifeMode final : public ModeModule void configure() override; void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_GAMEOFLIFE diff --git a/firmware/include/modes/HomeThermometerMode.h b/firmware/include/modes/HomeThermometerMode.h index 01ca3f3d..a583880e 100644 --- a/firmware/include/modes/HomeThermometerMode.h +++ b/firmware/include/modes/HomeThermometerMode.h @@ -19,7 +19,7 @@ class HomeThermometerMode final : public ModeModule void configure() override; void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_HOMETHERMOMETER diff --git a/firmware/include/modes/PingPongMode.h b/firmware/include/modes/PingPongMode.h index 1d15c244..51e12ec0 100644 --- a/firmware/include/modes/PingPongMode.h +++ b/firmware/include/modes/PingPongMode.h @@ -42,7 +42,7 @@ class PingPongMode final : public ModeModule void configure() override; void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_PINGPONG diff --git a/firmware/include/modes/SnakeMode.h b/firmware/include/modes/SnakeMode.h index 89f56a4d..8776c4c5 100644 --- a/firmware/include/modes/SnakeMode.h +++ b/firmware/include/modes/SnakeMode.h @@ -52,7 +52,7 @@ class SnakeMode final : public ModeModule void configure() override; void begin() override; void handle() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_SNAKE diff --git a/firmware/include/modes/StreamMode.h b/firmware/include/modes/StreamMode.h index bee59863..8d8f9589 100644 --- a/firmware/include/modes/StreamMode.h +++ b/firmware/include/modes/StreamMode.h @@ -28,7 +28,7 @@ class StreamMode final : public ModeModule void begin() override; void end() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_STREAM diff --git a/firmware/include/modes/TickerMode.h b/firmware/include/modes/TickerMode.h index b24dd077..5c24ad22 100644 --- a/firmware/include/modes/TickerMode.h +++ b/firmware/include/modes/TickerMode.h @@ -39,7 +39,7 @@ class TickerMode final : public ModeModule void handle() override; void end() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_TICKER diff --git a/firmware/include/modes/WeatherMode.h b/firmware/include/modes/WeatherMode.h index 02437e84..c737ea19 100644 --- a/firmware/include/modes/WeatherMode.h +++ b/firmware/include/modes/WeatherMode.h @@ -76,7 +76,7 @@ class WeatherMode final : public ModeModule void handle() override; void end() override; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; }; #endif // MODE_WEATHER diff --git a/firmware/include/modules/ExtensionModule.h b/firmware/include/modules/ExtensionModule.h index 30e2bc2d..8bb3a3ac 100644 --- a/firmware/include/modules/ExtensionModule.h +++ b/firmware/include/modules/ExtensionModule.h @@ -1,11 +1,12 @@ #pragma once #include // NOLINT(misc-include-cleaner) +#include class ExtensionModule { protected: - explicit ExtensionModule(const char *name) : name(name) {}; + explicit ExtensionModule(std::string_view name) : name(name) {}; public: virtual ~ExtensionModule() = default; @@ -15,12 +16,12 @@ class ExtensionModule ExtensionModule(ExtensionModule &&) = delete; ExtensionModule &operator=(ExtensionModule &&) = delete; - const char *const name; + const std::string_view name{}; virtual void configure(); virtual void begin(); virtual void handle(); - virtual void onReceive(JsonObjectConst payload, const char *source); - virtual void onTransmit(JsonObjectConst payload, const char *source); + virtual void onReceive(JsonObjectConst payload, std::string_view source); + virtual void onTransmit(JsonObjectConst payload, std::string_view source); }; diff --git a/firmware/include/modules/ModeModule.h b/firmware/include/modules/ModeModule.h index 9a3d86d4..8e920ef3 100644 --- a/firmware/include/modules/ModeModule.h +++ b/firmware/include/modules/ModeModule.h @@ -22,5 +22,5 @@ class ModeModule virtual void handle(); virtual void end(); - virtual void onReceive(JsonObjectConst payload, const char *source); + virtual void onReceive(JsonObjectConst payload, std::string_view source); }; diff --git a/firmware/include/modules/ServiceModule.h b/firmware/include/modules/ServiceModule.h index 4d0fcf1e..a6af2149 100644 --- a/firmware/include/modules/ServiceModule.h +++ b/firmware/include/modules/ServiceModule.h @@ -17,5 +17,5 @@ class ServiceModule const char *const name; - virtual void onReceive(JsonObjectConst payload, const char *source); + virtual void onReceive(JsonObjectConst payload, std::string_view source); }; diff --git a/firmware/include/services/ConnectivityService.h b/firmware/include/services/ConnectivityService.h index a402fb80..11073a73 100644 --- a/firmware/include/services/ConnectivityService.h +++ b/firmware/include/services/ConnectivityService.h @@ -42,7 +42,7 @@ class ConnectivityService final : public ServiceModule void configure(); void begin(); void handle(); - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; static ConnectivityService &getInstance(); }; diff --git a/firmware/include/services/DeviceService.h b/firmware/include/services/DeviceService.h index 4835adf4..89ad869b 100644 --- a/firmware/include/services/DeviceService.h +++ b/firmware/include/services/DeviceService.h @@ -17,7 +17,7 @@ class DeviceService final : public ServiceModule void transmit(); - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; public: TaskHandle_t taskHandle = nullptr; @@ -28,8 +28,8 @@ class DeviceService final : public ServiceModule void setPower(bool power); void restore(); - void transmit(JsonObjectConst payload, const char *source, bool retain = true); - void receive(JsonObjectConst payload, const char *source, const char *destination) const; + void transmit(JsonObjectConst payload, std::string_view source, bool retain = true); + void receive(JsonObjectConst payload, std::string_view source, std::string_view destination) const; [[nodiscard]] JsonObjectConst getTransmits() const; diff --git a/firmware/include/services/DisplayService.h b/firmware/include/services/DisplayService.h index 48f73362..918cd3a3 100644 --- a/firmware/include/services/DisplayService.h +++ b/firmware/include/services/DisplayService.h @@ -103,7 +103,7 @@ class DisplayService final : public ServiceModule void flush(); - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; static DisplayService &getInstance(); }; diff --git a/firmware/include/services/ExtensionsService.h b/firmware/include/services/ExtensionsService.h index 06f4423d..05e71b08 100644 --- a/firmware/include/services/ExtensionsService.h +++ b/firmware/include/services/ExtensionsService.h @@ -1,6 +1,5 @@ #pragma once -// NOLINTBEGIN(misc-include-cleaner) #include "extensions/AlexaExtension.h" #include "extensions/ButtonExtension.h" #include "extensions/HeapExtension.h" @@ -20,71 +19,122 @@ #include "extensions/WebSocketExtension.h" #include "modules/ExtensionModule.h" #include "modules/ServiceModule.h" -// NOLINTEND(misc-include-cleaner) -#include +#include +#include class ExtensionsService final : public ServiceModule { private: explicit ExtensionsService() : ServiceModule("Extensions") {}; - // NOLINTNEXTLINE(bugprone-throwing-static-initialization,cert-err58-cpp) - inline static const std::vector modules{ + unsigned long lastMillis = 0; + #if EXTENSION_ALEXA - new AlexaExtension(), + AlexaExtension extensionAlexa; #endif #if EXTENSION_BUTTON - new ButtonExtension(), + ButtonExtension extensionButton; #endif #if EXTENSION_HEAP - new HeapExtension(), + HeapExtension extensionHeap; #endif #if EXTENSION_HOMEASSISTANT - new HomeAssistantExtension(), + HomeAssistantExtension extensionHomeAssistant; #endif #if EXTENSION_INFRARED - new InfraredExtension(), + InfraredExtension extensionInfrared; #endif #if EXTENSION_MESSAGE - new MessageExtension(), + MessageExtension extensionMessage; #endif #if EXTENSION_MICROPHONE - new MicrophoneExtension(), + MicrophoneExtension extensionMicrophone; #endif #if EXTENSION_MQTT - new MqttExtension(), + MqttExtension extensionMqtt; #endif #if EXTENSION_OTA - new OtaExtension(), + OtaExtension extensionOta; #endif #if EXTENSION_PHOTOCELL - new PhotocellExtension(), + PhotocellExtension extensionPhotocell; #endif #if EXTENSION_PLAYLIST - new PlaylistExtension(), + PlaylistExtension extensionPlaylist; #endif #if EXTENSION_RESTFUL - new RestfulExtension(), + RestfulExtension extensionRestful; #endif #if EXTENSION_RTC - new RtcExtension(), + RtcExtension extensionRtc; #endif #if EXTENSION_SERVERSENTEVENTS - new ServerSentEventsExtension(), + ServerSentEventsExtension extensionServerSentEvents; #endif #if EXTENSION_SIGNAL - new SignalExtension(), + SignalExtension extensionSignal; #endif #if EXTENSION_WEBAPP - new WebAppExtension(), + WebAppExtension extensionWebApp; #endif #if EXTENSION_WEBSOCKET - new WebSocketExtension(), + WebSocketExtension extensionWebSocket; #endif - }; - unsigned long lastMillis = 0; + const std::array modules{ +#if EXTENSION_ALEXA + &extensionAlexa, +#endif +#if EXTENSION_BUTTON + &extensionButton, +#endif +#if EXTENSION_HEAP + &extensionHeap, +#endif +#if EXTENSION_HOMEASSISTANT + &extensionHomeAssistant, +#endif +#if EXTENSION_INFRARED + &extensionInfrared, +#endif +#if EXTENSION_MESSAGE + &extensionMessage, +#endif +#if EXTENSION_MICROPHONE + &extensionMicrophone, +#endif +#if EXTENSION_MQTT + &extensionMqtt, +#endif +#if EXTENSION_OTA + &extensionOta, +#endif +#if EXTENSION_PHOTOCELL + &extensionPhotocell, +#endif +#if EXTENSION_PLAYLIST + &extensionPlaylist, +#endif +#if EXTENSION_RESTFUL + &extensionRestful, +#endif +#if EXTENSION_RTC + &extensionRtc, +#endif +#if EXTENSION_SERVERSENTEVENTS + &extensionServerSentEvents, +#endif +#if EXTENSION_SIGNAL + &extensionSignal, +#endif +#if EXTENSION_WEBAPP + &extensionWebApp, +#endif +#if EXTENSION_WEBSOCKET + &extensionWebSocket, +#endif + }; void transmit(); @@ -98,7 +148,29 @@ class ExtensionsService final : public ServiceModule void configure(); void begin(); - [[nodiscard]] const std::vector &getAll() const; +#if EXTENSION_HOMEASSISTANT + HomeAssistantExtension &HomeAssistant(); +#endif +#if EXTENSION_MICROPHONE + MicrophoneExtension &Microphone(); +#endif +#if EXTENSION_MQTT + MqttExtension &MQTT(); +#endif +#if EXTENSION_PHOTOCELL + PhotocellExtension &Photocell(); +#endif +#if EXTENSION_PLAYLIST + PlaylistExtension &Playlist(); +#endif +#if EXTENSION_SERVERSENTEVENTS + ServerSentEventsExtension &ServerSentEvents(); +#endif +#if EXTENSION_WEBSOCKET + WebSocketExtension &WebSocket(); +#endif + + [[nodiscard]] std::span getAll(); static ExtensionsService &getInstance(); }; diff --git a/firmware/include/services/ModesService.h b/firmware/include/services/ModesService.h index 83339bde..8f61dfc2 100644 --- a/firmware/include/services/ModesService.h +++ b/firmware/include/services/ModesService.h @@ -181,7 +181,7 @@ class ModesService final : public ServiceModule void setModePrevious(); [[nodiscard]] TaskHandle_t getTaskHandle() const; [[nodiscard]] const std::vector &getAll() const; - void onReceive(JsonObjectConst payload, const char *source) override; + void onReceive(JsonObjectConst payload, std::string_view source) override; static ModesService &getInstance(); }; diff --git a/firmware/src/extensions/AlexaExtension.cpp b/firmware/src/extensions/AlexaExtension.cpp index aec4a53d..362cdb62 100644 --- a/firmware/src/extensions/AlexaExtension.cpp +++ b/firmware/src/extensions/AlexaExtension.cpp @@ -3,14 +3,11 @@ #include "extensions/AlexaExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include "services/WebServerService.h" #include -AlexaExtension *Alexa = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -AlexaExtension::AlexaExtension() : ExtensionModule("Alexa") { Alexa = this; } - void AlexaExtension::begin() { fauxmo.createServer(false); @@ -51,7 +48,7 @@ void AlexaExtension::onSetState(unsigned char deviceId, // NOLINT(misc-unused-pa void AlexaExtension::onGet(AsyncWebServerRequest *request) { - if (!Alexa->fauxmo.process(request->client(), true, request->url(), "")) + if (!fauxmo.process(request->client(), true, request->url(), "")) { request->send(t_http_codes::HTTP_CODE_INTERNAL_SERVER_ERROR); } @@ -61,7 +58,7 @@ void AlexaExtension::onSet(AsyncWebServerRequest *request, uint8_t *data, size_t size_t index, // NOLINT(misc-unused-parameters) size_t total) // NOLINT(misc-unused-parameters) { - if (!Alexa->fauxmo.process( + if (!fauxmo.process( request->client(), false, request->url(), @@ -71,11 +68,11 @@ void AlexaExtension::onSet(AsyncWebServerRequest *request, uint8_t *data, size_t } } -void AlexaExtension::onTransmit(JsonObjectConst payload, const char *source) +void AlexaExtension::onTransmit(JsonObjectConst payload, std::string_view source) { // Display: Brightness // Display: Power - if (!strcmp(source, Display.name) && (payload["brightness"].is() || payload["power"].is())) + if (!strcmp(source.data(), Display.name) && (payload["brightness"].is() || payload["power"].is())) { fauxmo.setState(NAME, payload["power"].is() ? payload["power"].as() : Display.getPower(), diff --git a/firmware/src/extensions/ButtonExtension.cpp b/firmware/src/extensions/ButtonExtension.cpp index 62ee33c0..0d90baa9 100644 --- a/firmware/src/extensions/ButtonExtension.cpp +++ b/firmware/src/extensions/ButtonExtension.cpp @@ -2,15 +2,11 @@ #include "extensions/ButtonExtension.h" -#include "extensions/HomeAssistantExtension.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include "services/ModesService.h" -ButtonExtension *Button = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -ButtonExtension::ButtonExtension() : ExtensionModule("Button") { Button = this; } - void ButtonExtension::configure() { #ifdef PIN_SW1 @@ -29,43 +25,38 @@ void ButtonExtension::configure() #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); + for (const char *const payload : { + "long", + "short", + }) { - for (const char *const payload : { - "long", - "short", - }) - { #ifdef PIN_SW1 - { - const std::string id{std::string(name).append("_power_").append(payload)}; - JsonObject component{ - (*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; - component[HomeAssistantAbbreviations::automation_type].set("trigger"); - component[HomeAssistantAbbreviations::payload].set(payload); - component[HomeAssistantAbbreviations::platform].set("device_automation"); - component[HomeAssistantAbbreviations::subtype].set("Power button"); - component[HomeAssistantAbbreviations::topic].set(topic); - component[HomeAssistantAbbreviations::type].set( - std::string("button_").append(payload).append("_press")); - component[HomeAssistantAbbreviations::value_template].set("{{value_json.event.power}}"); - } + { + const std::string id{std::string(name).append("_power_").append(payload)}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; + component[HomeAssistantAbbreviations::automation_type].set("trigger"); + component[HomeAssistantAbbreviations::payload].set(payload); + component[HomeAssistantAbbreviations::platform].set("device_automation"); + component[HomeAssistantAbbreviations::subtype].set("Power button"); + component[HomeAssistantAbbreviations::topic].set(topic); + component[HomeAssistantAbbreviations::type].set(std::string("button_").append(payload).append("_press")); + component[HomeAssistantAbbreviations::value_template].set("{{value_json.event.power}}"); + } #endif // PIN_SW1 #ifdef PIN_SW2 - { - const std::string id{std::string(name).append("_mode_").append(payload)}; - JsonObject component{ - (*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; - component[HomeAssistantAbbreviations::automation_type].set("trigger"); - component[HomeAssistantAbbreviations::payload].set(payload); - component[HomeAssistantAbbreviations::platform].set("device_automation"); - component[HomeAssistantAbbreviations::subtype].set("Mode button"); - component[HomeAssistantAbbreviations::topic].set(topic); - component[HomeAssistantAbbreviations::type].set( - std::string("button_").append(payload).append("_press")); - component[HomeAssistantAbbreviations::value_template].set("{{value_json.event.mode}}"); - } -#endif // PIN_SW2 + { + const std::string id{std::string(name).append("_mode_").append(payload)}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; + component[HomeAssistantAbbreviations::automation_type].set("trigger"); + component[HomeAssistantAbbreviations::payload].set(payload); + component[HomeAssistantAbbreviations::platform].set("device_automation"); + component[HomeAssistantAbbreviations::subtype].set("Mode button"); + component[HomeAssistantAbbreviations::topic].set(topic); + component[HomeAssistantAbbreviations::type].set(std::string("button_").append(payload).append("_press")); + component[HomeAssistantAbbreviations::value_template].set("{{value_json.event.mode}}"); } +#endif // PIN_SW2 } #endif // EXTENSION_HOMEASSISTANT } @@ -140,33 +131,33 @@ void IRAM_ATTR ButtonExtension::onInterrupt() #ifdef PIN_SW1 if (digitalRead(PIN_SW1) == LOW) { - Button->powerMillis = millis(); - Button->powerState = true; + powerMillis = millis(); + powerState = true; } else { - if (Button->powerState && !Button->powerLong) + if (powerState && !powerLong) { - Button->powerShort = true; + powerShort = true; } - Button->powerLong = false; - Button->powerState = false; + powerLong = false; + powerState = false; } #endif // PIN_SW1 #ifdef PIN_SW2 if (digitalRead(PIN_SW2) == LOW) { - Button->modeMillis = millis(); - Button->modeState = true; + modeMillis = millis(); + modeState = true; } else { - if (Button->modeState && !Button->modeLong) + if (modeState && !modeLong) { - Button->modeShort = true; + modeShort = true; } - Button->modeLong = false; - Button->modeState = false; + modeLong = false; + modeState = false; } #endif // PIN_SW2 } @@ -175,7 +166,7 @@ void ButtonExtension::event(const char *key, const char *value) // NOLINT(bugpro { JsonDocument doc; // NOLINT(misc-const-correctness) doc["event"][key] = value; - Device.transmit(doc.as(), Button->name, false); + Device.transmit(doc.as(), name, false); } #endif // EXTENSION_BUTTON diff --git a/firmware/src/extensions/HeapExtension.cpp b/firmware/src/extensions/HeapExtension.cpp index d6e897e5..c8f87388 100644 --- a/firmware/src/extensions/HeapExtension.cpp +++ b/firmware/src/extensions/HeapExtension.cpp @@ -7,17 +7,14 @@ #include "services/ExtensionsService.h" // NOLINT(misc-include-cleaner) #include "services/ModesService.h" -HeapExtension *Heap = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -HeapExtension::HeapExtension() : ExtensionModule("Heap") { Heap = this; } - #if EXTENSION_HOMEASSISTANT void HeapExtension::configure() { const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_extensions")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("data_size"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); @@ -28,13 +25,13 @@ void HeapExtension::configure() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("kB"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.extensions/2**10}}"); } { const std::string id{std::string(name).append("_heap")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("data_size"); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); component[HomeAssistantAbbreviations::expire_after].set(UINT8_MAX); @@ -44,13 +41,13 @@ void HeapExtension::configure() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("kB"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.heap/2**10}}"); } { const std::string id{std::string(name).append("_main")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("data_size"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); @@ -61,13 +58,13 @@ void HeapExtension::configure() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("kB"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.main/2**10}}"); } { const std::string id{std::string(name).append("_modes")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("data_size"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); @@ -78,7 +75,7 @@ void HeapExtension::configure() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("kB"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.modes/2**10}}"); } diff --git a/firmware/src/extensions/HomeAssistantExtension.cpp b/firmware/src/extensions/HomeAssistantExtension.cpp index 580b388b..1d145c04 100644 --- a/firmware/src/extensions/HomeAssistantExtension.cpp +++ b/firmware/src/extensions/HomeAssistantExtension.cpp @@ -6,23 +6,21 @@ #include "extensions/MqttExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" // NOLINT(misc-include-cleaner) -#include "services/ModesService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" +#include "services/ModesService.h" // NOLINT(misc-include-cleaner) #include #include #include -HomeAssistantExtension *HomeAssistant = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -HomeAssistantExtension::HomeAssistantExtension() : ExtensionModule("Home Assistant") { HomeAssistant = this; } - void HomeAssistantExtension::configure() { const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { - const std::string id{std::regex_replace(name, std::regex(R"(\s+)"), "").append("_main")}; + const std::string id{std::regex_replace(name.data(), std::regex(R"(\s+)"), "").append("_main")}; const std::string topicDisplay{std::string("frekvens/" HOSTNAME "/").append(Display.name)}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::brightness_command_template].set(R"({"brightness":{{value}}})"); component[HomeAssistantAbbreviations::brightness_command_topic].set(topicDisplay + "/set"); component[HomeAssistantAbbreviations::brightness_state_topic].set(topicDisplay); @@ -49,7 +47,7 @@ void HomeAssistantExtension::configure() component[HomeAssistantAbbreviations::state_topic].set(topic); component[HomeAssistantAbbreviations::state_value_template].set( std::string("{{value_json.").append(Display.name).append(".power}}")); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); } } @@ -92,7 +90,7 @@ void HomeAssistantExtension::begin() serializeJson(*discovery, payload.data(), length + 1); delete discovery; discovery = nullptr; - Mqtt->client.publish(discoveryTopic.c_str(), 0, true, payload.data(), length); + Extensions.MQTT().client.publish(discoveryTopic.c_str(), 0, true, payload.data(), length); } void HomeAssistantExtension::handle() @@ -106,7 +104,7 @@ void HomeAssistantExtension::handle() void HomeAssistantExtension::undiscover() { - Mqtt->client.publish(discoveryTopic.c_str(), 1, true, std::array{0}.data(), 0); + Extensions.MQTT().client.publish(discoveryTopic.c_str(), 1, true, std::array{0}.data(), 0); ESP_LOGW(name, "discovery packet removed"); // NOLINT(cppcoreguidelines-avoid-do-while) } @@ -117,10 +115,10 @@ void HomeAssistantExtension::transmit() Device.transmit(doc.as(), name); } -void HomeAssistantExtension::onTransmit(JsonObjectConst payload, const char *source) +void HomeAssistantExtension::onTransmit(JsonObjectConst payload, std::string_view source) { // Display: Power - if (!strcmp(source, Display.name) && payload["power"].is()) + if (!strcmp(source.data(), Display.name) && payload["power"].is()) { pending = true; } diff --git a/firmware/src/extensions/InfraredExtension.cpp b/firmware/src/extensions/InfraredExtension.cpp index 1277870f..7afbda2f 100644 --- a/firmware/src/extensions/InfraredExtension.cpp +++ b/firmware/src/extensions/InfraredExtension.cpp @@ -3,21 +3,14 @@ #include "extensions/InfraredExtension.h" #include "config/constants.h" // NOLINT(misc-include-cleaner) -#include "extensions/HomeAssistantExtension.h" -#include "extensions/MicrophoneExtension.h" // NOLINT(misc-include-cleaner) -#include "extensions/PhotocellExtension.h" // NOLINT(misc-include-cleaner) -#include "extensions/PlaylistExtension.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" // NOLINT(misc-include-cleaner) -#include "services/ModesService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" +#include "services/ModesService.h" // NOLINT(misc-include-cleaner) #include // NOLINT(misc-include-cleaner) #include -InfraredExtension *Infrared = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -InfraredExtension::InfraredExtension() : ExtensionModule("Infrared") { Infrared = this; } - void InfraredExtension::configure() { pinMode(PIN_IR, INPUT); @@ -25,9 +18,10 @@ void InfraredExtension::configure() #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_active")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"active":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::entity_category].set("config"); @@ -40,7 +34,7 @@ void InfraredExtension::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.active}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -49,7 +43,7 @@ void InfraredExtension::configure() void InfraredExtension::begin() { Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); const bool _active = Storage.isKey("active") && Storage.getBool("active"); Storage.end(); _active ? setActive(true) : transmit(); @@ -103,7 +97,7 @@ void InfraredExtension::parse() // NOLINT(readability-make-member-function-const code.extensionMicrophoneToggle.end(), IrReceiver.decodedIRData.command) != code.extensionMicrophoneToggle.end()) { - Microphone->setActive(!Microphone->getActive()); + Extensions.Microphone().setActive(!Extensions.Microphone().getActive()); lastMillis = millis(); return; } @@ -114,7 +108,7 @@ void InfraredExtension::parse() // NOLINT(readability-make-member-function-const code.extensionPhotocellToggle.end(), IrReceiver.decodedIRData.command) != code.extensionPhotocellToggle.end()) { - Photocell->setActive(!Photocell->getActive()); + Extensions.Photocell().setActive(!Extensions.Photocell().getActive()); lastMillis = millis(); return; } @@ -125,7 +119,7 @@ void InfraredExtension::parse() // NOLINT(readability-make-member-function-const code.extensionPlaylistStart.end(), IrReceiver.decodedIRData.command) != code.extensionPlaylistStart.end()) { - Playlist->setActive(true); + Extensions.Playlist().setActive(true); lastMillis = millis(); return; } @@ -134,7 +128,7 @@ void InfraredExtension::parse() // NOLINT(readability-make-member-function-const code.extensionPlaylistStop.end(), IrReceiver.decodedIRData.command) != code.extensionPlaylistStop.end()) { - Playlist->setActive(false); + Extensions.Playlist().setActive(false); lastMillis = millis(); return; } @@ -174,7 +168,7 @@ void InfraredExtension::setActive(bool active) this->active = active; this->active ? IrReceiver.start() : IrReceiver.stop(); Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putBool("active", this->active); Storage.end(); transmit(); @@ -191,7 +185,7 @@ void InfraredExtension::transmit() } void InfraredExtension::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Active if (payload["active"].is()) diff --git a/firmware/src/extensions/MessageExtension.cpp b/firmware/src/extensions/MessageExtension.cpp index 3fde5145..97f6064b 100644 --- a/firmware/src/extensions/MessageExtension.cpp +++ b/firmware/src/extensions/MessageExtension.cpp @@ -5,22 +5,20 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include "services/FontsService.h" // NOLINT(misc-include-cleaner) #include "services/ModesService.h" #include -MessageExtension *Message = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -MessageExtension::MessageExtension() : ExtensionModule("Message") { Message = this; } - #if EXTENSION_HOMEASSISTANT void MessageExtension::configure() { const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_font")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"font":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -35,22 +33,22 @@ void MessageExtension::configure() } component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.font}}"); } { const std::string id{std::string(name).append("_notify")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"message":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::name].set(""); component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::platform].set("notify"); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); } { const std::string id{std::string(name).append("_repeat")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template] = R"({"repeat":"{{value}}"})"; component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -62,7 +60,7 @@ void MessageExtension::configure() component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::platform].set("number"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.repeat}}"); } } @@ -71,7 +69,7 @@ void MessageExtension::configure() void MessageExtension::begin() { Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); if (Storage.isKey("font")) { fontName = Storage.getString("font").c_str(); @@ -153,7 +151,7 @@ void MessageExtension::setFont(std::string_view _fontName) { fontName = _font->name.data(); Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putString("font", fontName.c_str()); Storage.end(); pending = true; @@ -166,7 +164,7 @@ void MessageExtension::setRepeat(uint8_t count) { repeat = count; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putUShort("repeat", repeat); Storage.end(); pending = true; @@ -182,7 +180,7 @@ void MessageExtension::transmit() } void MessageExtension::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Font if (payload["font"].is()) diff --git a/firmware/src/extensions/MicrophoneExtension.cpp b/firmware/src/extensions/MicrophoneExtension.cpp index cf947458..81d8a34f 100644 --- a/firmware/src/extensions/MicrophoneExtension.cpp +++ b/firmware/src/extensions/MicrophoneExtension.cpp @@ -6,19 +6,16 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include -MicrophoneExtension *Microphone = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -MicrophoneExtension::MicrophoneExtension() : ExtensionModule("Microphone") { Microphone = this; } - void MicrophoneExtension::configure() { pinMode(PIN_MIC, ANALOG); Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); if (Storage.isKey("max")) { levelMax = Storage.getUShort("max"); @@ -27,9 +24,10 @@ void MicrophoneExtension::configure() #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_active")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"active":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::icon].set("mdi:microphone"); @@ -41,12 +39,12 @@ void MicrophoneExtension::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.active}}"); } { const std::string id{std::string(name).append("_sound")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::automation_type].set("trigger"); component[HomeAssistantAbbreviations::payload].set("sound"); component[HomeAssistantAbbreviations::platform].set("device_automation"); @@ -57,7 +55,7 @@ void MicrophoneExtension::configure() } { const std::string id{std::string(name).append("_threshold")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template] = R"({"threshold":{{value}}})"; component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -70,7 +68,7 @@ void MicrophoneExtension::configure() component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::platform].set("number"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.threshold}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -79,7 +77,7 @@ void MicrophoneExtension::configure() void MicrophoneExtension::begin() { Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); const bool _active = Storage.isKey("active") && Storage.getBool("active"); if (Storage.isKey("threshold")) { @@ -120,7 +118,7 @@ void MicrophoneExtension::handle() { levelMax = level; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putUShort("max", levelMax); Storage.end(); pending = true; @@ -146,7 +144,7 @@ void MicrophoneExtension::setActive(bool active) } this->active = active; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putBool("active", this->active); Storage.end(); pending = true; @@ -160,7 +158,7 @@ void MicrophoneExtension::setThreshold(uint16_t _threshold) { threshold = _threshold; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putUShort("threshold", threshold); Storage.end(); pending = true; @@ -179,7 +177,7 @@ void MicrophoneExtension::transmit() } void MicrophoneExtension::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Active if (payload["active"].is()) diff --git a/firmware/src/extensions/MqttExtension.cpp b/firmware/src/extensions/MqttExtension.cpp index 3498fcb0..3470cb32 100644 --- a/firmware/src/extensions/MqttExtension.cpp +++ b/firmware/src/extensions/MqttExtension.cpp @@ -4,14 +4,11 @@ #include "config/constants.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" +#include "services/ExtensionsService.h" #include #include -MqttExtension *Mqtt = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -MqttExtension::MqttExtension() : ExtensionModule("MQTT") { Mqtt = this; } - void MqttExtension::configure() { client.onConnect(&onConnect); @@ -40,7 +37,7 @@ void MqttExtension::handle() if (!client.connect() && client.queueSize() > INT8_MAX) { client.clearQueue(); - ESP_LOGD(Mqtt->name, "queue dropped"); // NOLINT(cppcoreguidelines-avoid-do-while) + ESP_LOGD(name, "queue dropped"); // NOLINT(cppcoreguidelines-avoid-do-while) } } } @@ -58,14 +55,14 @@ void MqttExtension::disconnect() void MqttExtension::onConnect(bool sessionPresent) { - ESP_LOGD(Mqtt->name, "connected"); // NOLINT(cppcoreguidelines-avoid-do-while) + ESP_LOGD(name, "connected"); // NOLINT(cppcoreguidelines-avoid-do-while) if (!sessionPresent || (!subscribed && esp_sleep_get_wakeup_cause() == esp_sleep_source_t::ESP_SLEEP_WAKEUP_UNDEFINED)) { - Mqtt->client.subscribe("frekvens/" HOSTNAME "/+/set", 2); + Extensions.MQTT().client.subscribe("frekvens/" HOSTNAME "/+/set", 2); subscribed = true; } - Mqtt->client.publish("frekvens/" HOSTNAME "/availability", 1, true, "online"); + Extensions.MQTT().client.publish("frekvens/" HOSTNAME "/availability", 1, true, "online"); } void MqttExtension::onMessage(const espMqttClientTypes::MessageProperties &properties, // NOLINT(misc-unused-parameters) @@ -77,19 +74,19 @@ void MqttExtension::onMessage(const espMqttClientTypes::MessageProperties &prope if (deserializeJson(doc, payload, len) == DeserializationError::Code::Ok) { Device.receive(doc.as(), - Mqtt->name, + name, std::string(topic).substr(prefixLength, strlen(topic) - prefixLength - suffixLength).c_str()); } } void MqttExtension::onDisconnect(espMqttClientTypes::DisconnectReason reason) // NOLINT(misc-unused-parameters) { - ESP_LOGD(Mqtt->name, "disconnected"); // NOLINT(cppcoreguidelines-avoid-do-while) + ESP_LOGD(name, "disconnected"); // NOLINT(cppcoreguidelines-avoid-do-while) // NOLINTNEXTLINE(cppcoreguidelines-avoid-do-while) - ESP_LOGV(Mqtt->name, "%s", espMqttClientTypes::disconnectReasonToString(reason)); + ESP_LOGV(name, "%s", espMqttClientTypes::disconnectReasonToString(reason)); } -void MqttExtension::onTransmit(JsonObjectConst payload, const char *source) +void MqttExtension::onTransmit(JsonObjectConst payload, std::string_view source) { const size_t length = measureJson(payload); std::vector message(length + 1); diff --git a/firmware/src/extensions/OtaExtension.cpp b/firmware/src/extensions/OtaExtension.cpp index 4cf389cf..734beba8 100644 --- a/firmware/src/extensions/OtaExtension.cpp +++ b/firmware/src/extensions/OtaExtension.cpp @@ -11,10 +11,6 @@ #include #include -OtaExtension *Ota = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -OtaExtension::OtaExtension() : ExtensionModule("OTA") { Ota = this; } - void OtaExtension::configure() { ArduinoOTA.setHostname(HOSTNAME); @@ -42,7 +38,7 @@ void OtaExtension::handle() { ArduinoOTA.handle(); } // NOLINT(cppcoreguidelines void OtaExtension::onStart() { - ESP_LOGI(Ota->name, "updating"); // NOLINT(cppcoreguidelines-avoid-do-while) + ESP_LOGI(name, "updating"); // NOLINT(cppcoreguidelines-avoid-do-while) Modes.setActive(false); const LargeFont font; Display.clearFrame(); @@ -54,7 +50,7 @@ void OtaExtension::onStart() void OtaExtension::onEnd() { - ESP_LOGI(Ota->name, "complete"); // NOLINT(cppcoreguidelines-avoid-do-while) + ESP_LOGI(name, "complete"); // NOLINT(cppcoreguidelines-avoid-do-while) } #ifndef OTA_KEY @@ -68,7 +64,7 @@ void OtaExtension::onPost(AsyncWebServerRequest *request, const String &filename if ((index == 0 && !Update.begin(UPDATE_SIZE_UNKNOWN, filename.indexOf("littlefs") >= 0 ? U_LITTLEFS : U_FLASH)) || Update.write(data, len) != len || (final && !Update.end(true))) { - ESP_LOGE(Ota->name, "%s", Update.errorString()); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + ESP_LOGE(name, "%s", Update.errorString()); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) request->send(t_http_codes::HTTP_CODE_INTERNAL_SERVER_ERROR); } else if (final) diff --git a/firmware/src/extensions/PhotocellExtension.cpp b/firmware/src/extensions/PhotocellExtension.cpp index c1ee0b15..51c8b7e1 100644 --- a/firmware/src/extensions/PhotocellExtension.cpp +++ b/firmware/src/extensions/PhotocellExtension.cpp @@ -6,21 +6,19 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include -PhotocellExtension *Photocell = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -PhotocellExtension::PhotocellExtension() : ExtensionModule("Photocell") { Photocell = this; } - void PhotocellExtension::configure() { pinMode(PIN_LDR, ANALOG); #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_active")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"active":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::icon].set("mdi:brightness-auto"); @@ -32,12 +30,12 @@ void PhotocellExtension::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.active}}"); } { const std::string id{std::string(name).append("_illuminance")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::enabled_by_default].set(false); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); component[HomeAssistantAbbreviations::icon].set("mdi:brightness-5"); @@ -46,7 +44,7 @@ void PhotocellExtension::configure() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.illuminance}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -55,7 +53,7 @@ void PhotocellExtension::configure() void PhotocellExtension::begin() { Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); const bool _active = Storage.isKey("active") && Storage.getBool("active"); if (Storage.isKey("gamma")) { @@ -110,7 +108,7 @@ void PhotocellExtension::setActive(bool active) } this->active = active; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putBool("active", this->active); Storage.end(); pending = true; @@ -124,7 +122,7 @@ void PhotocellExtension::setGamma(float _gamma) { gamma = _gamma; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putFloat("gamma", gamma); Storage.end(); } @@ -140,7 +138,7 @@ void PhotocellExtension::transmit() } void PhotocellExtension::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Active if (payload["active"].is()) @@ -149,12 +147,12 @@ void PhotocellExtension::onReceive(JsonObjectConst payload, } } -void PhotocellExtension::onTransmit(JsonObjectConst payload, const char *source) +void PhotocellExtension::onTransmit(JsonObjectConst payload, std::string_view source) { // Display: Brightness - if (active && !strcmp(source, Display.name) && payload["brightness"].is()) + if (active && !strcmp(source.data(), Display.name) && payload["brightness"].is()) { - const uint8_t _brightness = payload["brightness"].as(); // NOLINT(cppcoreguidelines-init-variables) + const uint8_t _brightness{payload["brightness"].as()}; if (_brightness != brightness) { setGamma(logf(static_cast(_brightness) / static_cast(1U << 8U)) / diff --git a/firmware/src/extensions/PlaylistExtension.cpp b/firmware/src/extensions/PlaylistExtension.cpp index eff5509d..888c33ba 100644 --- a/firmware/src/extensions/PlaylistExtension.cpp +++ b/firmware/src/extensions/PlaylistExtension.cpp @@ -5,19 +5,16 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" #include "services/ModesService.h" #include -PlaylistExtension *Playlist = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -PlaylistExtension::PlaylistExtension() : ExtensionModule("Playlist") { Playlist = this; } - void PlaylistExtension::configure() { JsonDocument doc; // NOLINT(misc-const-correctness) Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); if (Storage.isKey("modes")) { const size_t length = Storage.getBytesLength("modes"); @@ -43,9 +40,10 @@ void PlaylistExtension::configure() } #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_active")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"active":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::icon].set("mdi:format-list-bulleted"); @@ -60,7 +58,7 @@ void PlaylistExtension::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.active}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -70,7 +68,7 @@ void PlaylistExtension::begin() { bool _active = false; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); switch (esp_reset_reason()) { case esp_reset_reason_t::ESP_RST_BROWNOUT: @@ -116,7 +114,7 @@ void PlaylistExtension::setActive(bool active) step = 0; this->active = active; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putBool("active", this->active); Storage.end(); transmit(); @@ -141,7 +139,7 @@ void PlaylistExtension::setPlaylist(std::span modes) std::vector buffer(length + 1); serializeJson(doc, reinterpret_cast(buffer.data()), length + 1); Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putBytes("modes", buffer.data(), length + 1); Storage.end(); transmit(); @@ -161,10 +159,10 @@ void PlaylistExtension::transmit() Device.transmit(doc.as(), name); } -void PlaylistExtension::onTransmit(JsonObjectConst payload, const char *source) +void PlaylistExtension::onTransmit(JsonObjectConst payload, std::string_view source) { // Modes: Mode - if (active && !strcmp(source, Modes.name) && payload["mode"].is() && + if (active && !strcmp(source.data(), Modes.name) && payload["mode"].is() && payload["mode"].as() != playlist[step].mode) { setActive(false); @@ -172,7 +170,7 @@ void PlaylistExtension::onTransmit(JsonObjectConst payload, const char *source) } void PlaylistExtension::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Playlist if (payload["playlist"].is()) diff --git a/firmware/src/extensions/RestfulExtension.cpp b/firmware/src/extensions/RestfulExtension.cpp index 189c63fc..d79a6acc 100644 --- a/firmware/src/extensions/RestfulExtension.cpp +++ b/firmware/src/extensions/RestfulExtension.cpp @@ -8,10 +8,6 @@ #include #include -RestfulExtension *Restful = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -RestfulExtension::RestfulExtension() : ExtensionModule("RESTful") { Restful = this; } - void RestfulExtension::begin() { WebServer.http->on(AsyncURIMatcher::dir("/restful/"), WebRequestMethod::HTTP_GET, &onGet); @@ -51,7 +47,7 @@ void RestfulExtension::onPatch(AsyncWebServerRequest *request, const uint8_t *da if (request->contentType() == "application/json" && deserializeJson(doc, data, len) == DeserializationError::Code::Ok) { - Device.receive(doc.as(), Restful->name, request->url().substring(prefixLength).c_str()); + Device.receive(doc.as(), name, request->url().substring(prefixLength).c_str()); request->send(t_http_codes::HTTP_CODE_NO_CONTENT); } else diff --git a/firmware/src/extensions/RtcExtension.cpp b/firmware/src/extensions/RtcExtension.cpp index 7110833b..21aa85f0 100644 --- a/firmware/src/extensions/RtcExtension.cpp +++ b/firmware/src/extensions/RtcExtension.cpp @@ -5,13 +5,10 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include -RtcExtension *Rtc = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -RtcExtension::RtcExtension() : ExtensionModule("RTC") { Rtc = this; } - void RtcExtension::configure() { #ifdef PIN_INT @@ -43,9 +40,10 @@ void RtcExtension::configure() #if EXTENSION_HOMEASSISTANT && (defined(RTC_DS3231) || defined(RTC_DS3232)) const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_temperature")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("temperature"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); component[HomeAssistantAbbreviations::expire_after].set(UINT8_MAX); @@ -55,7 +53,7 @@ void RtcExtension::configure() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("°C"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.temperature}}"); } @@ -92,7 +90,7 @@ void RtcExtension::handle() #endif // defined(RTC_DS3231) || defined(RTC_DS3232) || defined(RTC_PCF8563) #ifdef PIN_INT -IRAM_ATTR void RtcExtension::onInterrupt() { Rtc->pending = true; } +IRAM_ATTR void RtcExtension::onInterrupt() { pending = true; } #endif // PIN_INT #if defined(RTC_DS3231) || defined(RTC_DS3232) @@ -108,9 +106,9 @@ void RtcExtension::sntpSetTimeSyncNotificationCallback(struct timeval *tv) { const time_t timer = tv->tv_sec; const tm *local = gmtime(&timer); - Rtc->rtc.SetDateTime(RtcDateTime( + rtc.SetDateTime(RtcDateTime( local->tm_year + 1900, local->tm_mon + 1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec)); - ESP_LOGV(Rtc->name, "NTP sync"); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) + ESP_LOGV(name, "NTP sync"); // NOLINT(cppcoreguidelines-pro-type-vararg,hicpp-vararg) } #endif // EXTENSION_RTC diff --git a/firmware/src/extensions/ServerSentEventsExtension.cpp b/firmware/src/extensions/ServerSentEventsExtension.cpp index 95557d77..b92affff 100644 --- a/firmware/src/extensions/ServerSentEventsExtension.cpp +++ b/firmware/src/extensions/ServerSentEventsExtension.cpp @@ -5,25 +5,18 @@ #include "services/DeviceService.h" #include "services/WebServerService.h" -ServerSentEventsExtension *ServerSentEvents = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -ServerSentEventsExtension::ServerSentEventsExtension() : ExtensionModule("Server-Sent Events") -{ - ServerSentEvents = this; -} - void ServerSentEventsExtension::begin() { - client->onConnect(&onConnect); - WebServer.http->addHandler(client); + events.onConnect(&onConnect); + WebServer.http->addHandler(&events); } -void ServerSentEventsExtension::onTransmit(JsonObjectConst payload, const char *source) +void ServerSentEventsExtension::onTransmit(JsonObjectConst payload, std::string_view source) { const size_t length = measureJson(payload); std::vector message(length + 1); serializeJson(payload, message.data(), length + 1); - client->send(message.data(), source); + events.send(message.data(), source.data()); } void ServerSentEventsExtension::onConnect(AsyncEventSourceClient *client) diff --git a/firmware/src/extensions/SignalExtension.cpp b/firmware/src/extensions/SignalExtension.cpp index 6f013363..3cd4784a 100644 --- a/firmware/src/extensions/SignalExtension.cpp +++ b/firmware/src/extensions/SignalExtension.cpp @@ -10,14 +10,10 @@ #include #include -SignalExtension *Signal = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -SignalExtension::SignalExtension() : ExtensionModule("Signal") { Signal = this; } - void SignalExtension::begin() { Preferences Storage; - Storage.begin(name, true); + Storage.begin(name.data(), true); if (Storage.isKey("duration")) { duration = Storage.getUShort("duration"); @@ -60,7 +56,7 @@ void SignalExtension::setDuration(uint8_t seconds) { duration = seconds; Preferences Storage; - Storage.begin(name); + Storage.begin(name.data()); Storage.putUShort("duration", duration); Storage.end(); transmit(); @@ -75,7 +71,7 @@ void SignalExtension::transmit() } void SignalExtension::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Duration if (payload["duration"].is()) diff --git a/firmware/src/extensions/WebAppExtension.cpp b/firmware/src/extensions/WebAppExtension.cpp index 47e3fa1a..eac24089 100644 --- a/firmware/src/extensions/WebAppExtension.cpp +++ b/firmware/src/extensions/WebAppExtension.cpp @@ -7,10 +7,6 @@ #include #include -WebAppExtension *WebApp = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -WebAppExtension::WebAppExtension() : ExtensionModule("Web app") { WebApp = this; } - void WebAppExtension::configure() { if (!LittleFS.begin(false, "/littlefs", 1, "littlefs") || !LittleFS.exists("/webapp/index.html.gz")) diff --git a/firmware/src/extensions/WebSocketExtension.cpp b/firmware/src/extensions/WebSocketExtension.cpp index 671e0e9e..22275c74 100644 --- a/firmware/src/extensions/WebSocketExtension.cpp +++ b/firmware/src/extensions/WebSocketExtension.cpp @@ -5,10 +5,6 @@ #include "services/DeviceService.h" #include "services/WebServerService.h" -WebSocketExtension *WebSocket = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) - -WebSocketExtension::WebSocketExtension() : ExtensionModule("WebSocket") { WebSocket = this; } - void WebSocketExtension::begin() { server->onEvent(&onEvent); @@ -17,7 +13,7 @@ void WebSocketExtension::begin() void WebSocketExtension::handle() { server->cleanupClients(); } -void WebSocketExtension::onTransmit(JsonObjectConst payload, const char *source) +void WebSocketExtension::onTransmit(JsonObjectConst payload, std::string_view source) { JsonDocument doc; // NOLINT(misc-const-correctness) doc[source].set(payload); @@ -53,7 +49,7 @@ void WebSocketExtension::onEvent(AsyncWebSocket *server, // NOLINT(misc-unused-p { if (pair.value().is()) { - Device.receive(pair.value().as(), WebSocket->name, pair.key().c_str()); + Device.receive(pair.value().as(), name, pair.key().c_str()); } } } diff --git a/firmware/src/modes/AnimationMode.cpp b/firmware/src/modes/AnimationMode.cpp index 4f2b20bd..0d7532c1 100644 --- a/firmware/src/modes/AnimationMode.cpp +++ b/firmware/src/modes/AnimationMode.cpp @@ -2,9 +2,9 @@ #include "modes/AnimationMode.h" -#include "extensions/MicrophoneExtension.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include #include @@ -18,7 +18,7 @@ void AnimationMode::begin() void AnimationMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis >= interval && Microphone->isTriggered()) + if (millis() - lastMillis >= interval && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis >= interval) #endif // EXTENSION_MICROPHONE @@ -102,7 +102,7 @@ void AnimationMode::transmit(uint8_t index, std::span frame) } void AnimationMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Action: pull if (payload["action"].is() && !strcmp(payload["action"].as(), "pull")) diff --git a/firmware/src/modes/ArrowMode.cpp b/firmware/src/modes/ArrowMode.cpp index 843e25c1..f75ad114 100644 --- a/firmware/src/modes/ArrowMode.cpp +++ b/firmware/src/modes/ArrowMode.cpp @@ -2,15 +2,15 @@ #include "modes/ArrowMode.h" -#include "config/constants.h" // NOLINT(misc-include-cleaner) -#include "extensions/MicrophoneExtension.h" // NOLINT(misc-include-cleaner) -#include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) -#include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "config/constants.h" // NOLINT(misc-include-cleaner) +#include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) +#include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" void ArrowMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > INT8_MAX && Microphone->isTriggered()) + if (millis() - lastMillis > INT8_MAX && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > INT8_MAX) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/BlindsMode.cpp b/firmware/src/modes/BlindsMode.cpp index 948bb741..f91469d3 100644 --- a/firmware/src/modes/BlindsMode.cpp +++ b/firmware/src/modes/BlindsMode.cpp @@ -4,11 +4,12 @@ #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void BlindsMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > UINT8_MAX && Microphone->isTriggered()) + if (millis() - lastMillis > UINT8_MAX && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > UINT8_MAX) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/BlinkMode.cpp b/firmware/src/modes/BlinkMode.cpp index e8013113..7f21abc4 100644 --- a/firmware/src/modes/BlinkMode.cpp +++ b/firmware/src/modes/BlinkMode.cpp @@ -4,11 +4,12 @@ #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void BlinkMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > (1UL << 10U) && Microphone->isTriggered()) + if (millis() - lastMillis > (1UL << 10U) && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > (1UL << 10U)) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/CircleMode.cpp b/firmware/src/modes/CircleMode.cpp index 74167de6..8e03f9f3 100644 --- a/firmware/src/modes/CircleMode.cpp +++ b/firmware/src/modes/CircleMode.cpp @@ -2,13 +2,13 @@ #include "modes/CircleMode.h" -#include "extensions/MicrophoneExtension.h" // NOLINT(misc-include-cleaner) -#include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" void CircleMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > (1UL << 6U) && Microphone->isTriggered()) + if (millis() - lastMillis > (1UL << 6U) && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > (1UL << 6U)) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/ClockMode.cpp b/firmware/src/modes/ClockMode.cpp index 82b3b25c..44e580bf 100644 --- a/firmware/src/modes/ClockMode.cpp +++ b/firmware/src/modes/ClockMode.cpp @@ -6,6 +6,7 @@ #include "handlers/TextHandler.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include "services/FontsService.h" // NOLINT(misc-include-cleaner) #include @@ -25,9 +26,10 @@ void ClockMode::configure() Storage.end(); #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_font")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"font":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -42,12 +44,12 @@ void ClockMode::configure() } component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.font}}"); } { const std::string id{std::string(name).append("_ticking")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"ticking":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -61,7 +63,7 @@ void ClockMode::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.ticking}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -191,7 +193,7 @@ void ClockMode::transmit() } void ClockMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Font if (payload["font"].is()) diff --git a/firmware/src/modes/CountdownMode.cpp b/firmware/src/modes/CountdownMode.cpp index fb35d078..456e4de4 100644 --- a/firmware/src/modes/CountdownMode.cpp +++ b/firmware/src/modes/CountdownMode.cpp @@ -6,6 +6,7 @@ #include "handlers/TextHandler.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include "services/FontsService.h" #include @@ -34,9 +35,10 @@ void CountdownMode::configure() } #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_font")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"font":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -51,12 +53,12 @@ void CountdownMode::configure() } component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.font}}"); } { const std::string id{std::string(name).append("_timestamp")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"timestamp":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::entity_category].set("config"); @@ -67,7 +69,7 @@ void CountdownMode::configure() R"(^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])T([01]\d|2[0-3]):[0-5]\d:[0-5]\d$)"); component[HomeAssistantAbbreviations::platform].set("text"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.timestamp}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -174,7 +176,7 @@ void CountdownMode::transmit() } void CountdownMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Font if (payload["font"].is()) diff --git a/firmware/src/modes/DrawMode.cpp b/firmware/src/modes/DrawMode.cpp index 0fcf8358..5b585392 100644 --- a/firmware/src/modes/DrawMode.cpp +++ b/firmware/src/modes/DrawMode.cpp @@ -90,7 +90,7 @@ void DrawMode::transmit() } void DrawMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { if (payload["action"].is()) { diff --git a/firmware/src/modes/EqualizerMode.cpp b/firmware/src/modes/EqualizerMode.cpp index c507bb27..4205a1d9 100644 --- a/firmware/src/modes/EqualizerMode.cpp +++ b/firmware/src/modes/EqualizerMode.cpp @@ -4,6 +4,7 @@ #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void EqualizerMode::begin() { @@ -22,7 +23,7 @@ void EqualizerMode::handle() { lastMillis = millis(); #if EXTENSION_MICROPHONE - const bool play = Microphone->isTriggered(); + const bool play = Extensions.Microphone().isTriggered(); #endif // EXTENSION_MICROPHONE for (size_t i = 0; i < bars.size(); ++i) { diff --git a/firmware/src/modes/FireworkMode.cpp b/firmware/src/modes/FireworkMode.cpp index 31e5ab63..686aab13 100644 --- a/firmware/src/modes/FireworkMode.cpp +++ b/firmware/src/modes/FireworkMode.cpp @@ -4,6 +4,7 @@ #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void FireworkMode::handle() { @@ -27,7 +28,7 @@ void FireworkMode::handle() void FireworkMode::pad() { #if EXTENSION_MICROPHONE - if (Microphone->isTriggered()) + if (Extensions.Microphone().isTriggered()) #endif // EXTENSION_MICROPHONE { rocketX = random(GRID_COLUMNS); diff --git a/firmware/src/modes/FliesMode.cpp b/firmware/src/modes/FliesMode.cpp index c8f8a2aa..a0d955a0 100644 --- a/firmware/src/modes/FliesMode.cpp +++ b/firmware/src/modes/FliesMode.cpp @@ -18,7 +18,7 @@ void FliesMode::handle() } void FliesMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { if (payload["id"].is() && payload["x"].is() && payload["y"].is()) { diff --git a/firmware/src/modes/GameOfLifeMode.cpp b/firmware/src/modes/GameOfLifeMode.cpp index a6584a71..f7ec87cc 100644 --- a/firmware/src/modes/GameOfLifeMode.cpp +++ b/firmware/src/modes/GameOfLifeMode.cpp @@ -8,6 +8,7 @@ #include "handlers/TextHandler.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include #include @@ -16,9 +17,10 @@ void GameOfLifeMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_clock")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"clock":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -32,7 +34,7 @@ void GameOfLifeMode::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.clock}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -131,7 +133,7 @@ void GameOfLifeMode::transmit() } void GameOfLifeMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Clock if (payload["clock"].is()) diff --git a/firmware/src/modes/HomeThermometerMode.cpp b/firmware/src/modes/HomeThermometerMode.cpp index 3bc1f30a..3a4df30b 100644 --- a/firmware/src/modes/HomeThermometerMode.cpp +++ b/firmware/src/modes/HomeThermometerMode.cpp @@ -2,12 +2,12 @@ #include "modes/HomeThermometerMode.h" -#include "config/constants.h" // NOLINT(misc-include-cleaner) -#include "extensions/HomeAssistantExtension.h" // NOLINT(misc-include-cleaner) -#include "fonts/MiniFont.h" // NOLINT(misc-include-cleaner) +#include "config/constants.h" // NOLINT(misc-include-cleaner) +#include "fonts/MiniFont.h" // NOLINT(misc-include-cleaner) #include "handlers/TextHandler.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include #include @@ -17,6 +17,7 @@ void HomeThermometerMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { for (const char *const where : { "indoor", @@ -24,8 +25,7 @@ void HomeThermometerMode::configure() }) { const std::string id{std::regex_replace(name, std::regex(R"(\s+)"), "").append("_").append(where)}; - JsonObject component{ - (*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set( std::string(R"({")").append(where).append(R"(":{{value}}})")); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); @@ -50,7 +50,7 @@ void HomeThermometerMode::configure() component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::platform].set("number"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); #ifdef TEMPERATURE_UNIT component[HomeAssistantAbbreviations::unit_of_measurement].set(TEMPERATURE_UNIT); #endif // TEMPERATURE_UNIT @@ -117,7 +117,7 @@ void HomeThermometerMode::transmit() } void HomeThermometerMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { if (payload["indoor"].is()) { diff --git a/firmware/src/modes/JaggedWaveformMode.cpp b/firmware/src/modes/JaggedWaveformMode.cpp index c5e00e94..37cd94ab 100644 --- a/firmware/src/modes/JaggedWaveformMode.cpp +++ b/firmware/src/modes/JaggedWaveformMode.cpp @@ -5,11 +5,12 @@ #include "extensions/MicrophoneExtension.h" #include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void JaggedWaveformMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > (1UL << 9U) && Microphone->isTriggered()) + if (millis() - lastMillis > (1UL << 9U) && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > (1UL << 9U)) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/LinesMode.cpp b/firmware/src/modes/LinesMode.cpp index 29309710..b0b4b6e0 100644 --- a/firmware/src/modes/LinesMode.cpp +++ b/firmware/src/modes/LinesMode.cpp @@ -5,11 +5,12 @@ #include "config/constants.h" // NOLINT(misc-include-cleaner) #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void LinesMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > INT8_MAX && Microphone->isTriggered()) + if (millis() - lastMillis > INT8_MAX && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > INT8_MAX) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/MetaballsMode.cpp b/firmware/src/modes/MetaballsMode.cpp index c2c80b3e..73710c31 100644 --- a/firmware/src/modes/MetaballsMode.cpp +++ b/firmware/src/modes/MetaballsMode.cpp @@ -4,6 +4,7 @@ #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" void MetaballsMode::configure() { @@ -23,7 +24,7 @@ void MetaballsMode::configure() void MetaballsMode::handle() { #if EXTENSION_MICROPHONE - if (Microphone->isTriggered()) + if (Extensions.Microphone().isTriggered()) #endif // EXTENSION_MICROPHONE { #if PITCH_HORIZONTAL != PITCH_VERTICAL diff --git a/firmware/src/modes/PingPongMode.cpp b/firmware/src/modes/PingPongMode.cpp index 877ffaeb..604e56ba 100644 --- a/firmware/src/modes/PingPongMode.cpp +++ b/firmware/src/modes/PingPongMode.cpp @@ -7,6 +7,7 @@ #include "handlers/TextHandler.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include @@ -14,9 +15,10 @@ void PingPongMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_clock")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"clock":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -30,7 +32,7 @@ void PingPongMode::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.clock}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -214,7 +216,7 @@ void PingPongMode::transmit() } void PingPongMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Clock if (payload["clock"].is()) diff --git a/firmware/src/modes/PixelSequenceMode.cpp b/firmware/src/modes/PixelSequenceMode.cpp index 08bff4c4..47b6ac4f 100644 --- a/firmware/src/modes/PixelSequenceMode.cpp +++ b/firmware/src/modes/PixelSequenceMode.cpp @@ -4,11 +4,12 @@ #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void PixelSequenceMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > INT8_MAX && Microphone->isTriggered()) + if (millis() - lastMillis > INT8_MAX && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > INT8_MAX) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/RingMode.cpp b/firmware/src/modes/RingMode.cpp index 68f38bd2..04b1f49b 100644 --- a/firmware/src/modes/RingMode.cpp +++ b/firmware/src/modes/RingMode.cpp @@ -5,11 +5,12 @@ #include "extensions/MicrophoneExtension.h" #include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void RingMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > INT8_MAX && Microphone->isTriggered()) + if (millis() - lastMillis > INT8_MAX && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > INT8_MAX) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/ScanMode.cpp b/firmware/src/modes/ScanMode.cpp index ddc2acad..8d71b211 100644 --- a/firmware/src/modes/ScanMode.cpp +++ b/firmware/src/modes/ScanMode.cpp @@ -5,11 +5,12 @@ #include "config/constants.h" // NOLINT(misc-include-cleaner) #include "extensions/MicrophoneExtension.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void ScanMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > INT8_MAX && Microphone->isTriggered()) + if (millis() - lastMillis > INT8_MAX && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > INT8_MAX) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/SmoothWaveformMode.cpp b/firmware/src/modes/SmoothWaveformMode.cpp index a200ae9e..b3290c10 100644 --- a/firmware/src/modes/SmoothWaveformMode.cpp +++ b/firmware/src/modes/SmoothWaveformMode.cpp @@ -5,11 +5,12 @@ #include "extensions/MicrophoneExtension.h" #include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void SmoothWaveformMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > (1UL << 9U) && Microphone->isTriggered()) + if (millis() - lastMillis > (1UL << 9U) && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > (1UL << 9U)) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/SnakeMode.cpp b/firmware/src/modes/SnakeMode.cpp index 95be3c54..d4f43d51 100644 --- a/firmware/src/modes/SnakeMode.cpp +++ b/firmware/src/modes/SnakeMode.cpp @@ -8,6 +8,7 @@ #include "handlers/TextHandler.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include #include @@ -17,9 +18,10 @@ void SnakeMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_clock")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"clock":{{value}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -33,7 +35,7 @@ void SnakeMode::configure() component[HomeAssistantAbbreviations::state_off].set("False"); component[HomeAssistantAbbreviations::state_on].set("True"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.clock}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -278,7 +280,7 @@ void SnakeMode::transmit() } void SnakeMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Clock if (payload["clock"].is()) diff --git a/firmware/src/modes/StreamMode.cpp b/firmware/src/modes/StreamMode.cpp index 660cd233..a27a9d37 100644 --- a/firmware/src/modes/StreamMode.cpp +++ b/firmware/src/modes/StreamMode.cpp @@ -6,6 +6,7 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include #include @@ -14,9 +15,10 @@ void StreamMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_protocol")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set( R"({"port":{{{"Art-Net":6454,"Distributed Display Protocol":4048,"E1.31":5568}.get(value)}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); @@ -31,7 +33,7 @@ void StreamMode::configure() options.add("E1.31"); component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set( R"({{{4048:"Distributed Display Protocol",5568:"E1.31",6454:"Art-Net"}.get(value_json.port)}})"); } @@ -82,7 +84,7 @@ void StreamMode::transmit() } void StreamMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Port if (payload["port"].is()) diff --git a/firmware/src/modes/TickerMode.cpp b/firmware/src/modes/TickerMode.cpp index f6fd42f2..2625d5b5 100644 --- a/firmware/src/modes/TickerMode.cpp +++ b/firmware/src/modes/TickerMode.cpp @@ -6,6 +6,7 @@ #include "fonts/SmallFont.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include "services/FontsService.h" // NOLINT(misc-include-cleaner) #include @@ -14,9 +15,10 @@ void TickerMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_font")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"font":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -31,12 +33,12 @@ void TickerMode::configure() } component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.font}}"); } { const std::string id{std::string(name).append("_message")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"message":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::icon].set("mdi:message"); @@ -44,7 +46,7 @@ void TickerMode::configure() component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::platform].set("text"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.message}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -136,7 +138,7 @@ void TickerMode::transmit() } void TickerMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Font if (payload["font"].is()) diff --git a/firmware/src/modes/WaveformMode.cpp b/firmware/src/modes/WaveformMode.cpp index 55f3c723..96847429 100644 --- a/firmware/src/modes/WaveformMode.cpp +++ b/firmware/src/modes/WaveformMode.cpp @@ -5,11 +5,12 @@ #include "extensions/MicrophoneExtension.h" #include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) #include "services/DisplayService.h" +#include "services/ExtensionsService.h" void WaveformMode::handle() { #if EXTENSION_MICROPHONE - if (millis() - lastMillis > (1UL << 9U) && Microphone->isTriggered()) + if (millis() - lastMillis > (1UL << 9U) && Extensions.Microphone().isTriggered()) #else if (millis() - lastMillis > (1UL << 9U)) #endif // EXTENSION_MICROPHONE diff --git a/firmware/src/modes/WeatherMode.cpp b/firmware/src/modes/WeatherMode.cpp index 984ffafe..64713db3 100644 --- a/firmware/src/modes/WeatherMode.cpp +++ b/firmware/src/modes/WeatherMode.cpp @@ -8,6 +8,7 @@ #include "handlers/TextHandler.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" // NOLINT(misc-include-cleaner) +#include "services/ExtensionsService.h" #include #include // NOLINT(misc-include-cleaner) @@ -16,9 +17,10 @@ void WeatherMode::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_protocol")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"provider":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -33,7 +35,7 @@ void WeatherMode::configure() } component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.provider}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -168,7 +170,7 @@ void WeatherMode::transmit() } void WeatherMode::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Provider if (payload["provider"].is()) diff --git a/firmware/src/modules/ExtensionModule.cpp b/firmware/src/modules/ExtensionModule.cpp index 93d496ab..ea25246a 100644 --- a/firmware/src/modules/ExtensionModule.cpp +++ b/firmware/src/modules/ExtensionModule.cpp @@ -4,5 +4,5 @@ void ExtensionModule::configure() {} void ExtensionModule::begin() {} void ExtensionModule::handle() {} -void ExtensionModule::onReceive(JsonObjectConst payload, const char *source) {} -void ExtensionModule::onTransmit(JsonObjectConst payload, const char *source) {} +void ExtensionModule::onReceive(JsonObjectConst payload, std::string_view source) {} +void ExtensionModule::onTransmit(JsonObjectConst payload, std::string_view source) {} diff --git a/firmware/src/modules/ModeModule.cpp b/firmware/src/modules/ModeModule.cpp index 0dc9d03f..2c570c77 100644 --- a/firmware/src/modules/ModeModule.cpp +++ b/firmware/src/modules/ModeModule.cpp @@ -5,4 +5,4 @@ void ModeModule::begin() {} void ModeModule::handle() {} void ModeModule::end() {} -void ModeModule::onReceive(JsonObjectConst payload, const char *source) {} +void ModeModule::onReceive(JsonObjectConst payload, std::string_view source) {} diff --git a/firmware/src/modules/ServiceModule.cpp b/firmware/src/modules/ServiceModule.cpp index 1dea399a..0fb1f1ee 100644 --- a/firmware/src/modules/ServiceModule.cpp +++ b/firmware/src/modules/ServiceModule.cpp @@ -1,3 +1,3 @@ #include "modules/ServiceModule.h" -void ServiceModule::onReceive(JsonObjectConst payload, const char *source) {} +void ServiceModule::onReceive(JsonObjectConst payload, std::string_view source) {} diff --git a/firmware/src/services/ConnectivityService.cpp b/firmware/src/services/ConnectivityService.cpp index 4a14d54a..5929159b 100644 --- a/firmware/src/services/ConnectivityService.cpp +++ b/firmware/src/services/ConnectivityService.cpp @@ -2,6 +2,7 @@ #include "extensions/HomeAssistantExtension.h" #include "services/DeviceService.h" +#include "services/ExtensionsService.h" #include #include @@ -66,9 +67,10 @@ void ConnectivityService::begin() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_rssi")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("signal_strength"); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); component[HomeAssistantAbbreviations::expire_after].set(UINT8_MAX); @@ -78,7 +80,7 @@ void ConnectivityService::begin() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("dBm"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.rssi}}"); } @@ -282,7 +284,7 @@ void ConnectivityService::onScan(WiFiEvent_t event, // NOLINT(misc-unused-par _scan["rssi"].set(WiFi.RSSI(i)); _scan["ssid"].set(WiFi.SSID(i)); } - Device.transmit(doc.as(), _name.data(), false); + Device.transmit(doc.as(), _name, false); } } @@ -320,7 +322,7 @@ void ConnectivityService::transmit() } void ConnectivityService::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Connect if (payload["ssid"].is()) diff --git a/firmware/src/services/DeviceService.cpp b/firmware/src/services/DeviceService.cpp index 6fc3c8a6..de421710 100644 --- a/firmware/src/services/DeviceService.cpp +++ b/firmware/src/services/DeviceService.cpp @@ -1,9 +1,5 @@ #include "services/DeviceService.h" -#include "extensions/HomeAssistantExtension.h" -#include "extensions/MqttExtension.h" -#include "extensions/ServerSentEventsExtension.h" -#include "extensions/WebSocketExtension.h" #include "services/ConnectivityService.h" #include "services/DisplayService.h" #include "services/ExtensionsService.h" @@ -14,6 +10,7 @@ #include #include #include +#include void DeviceService::begin() { @@ -108,9 +105,10 @@ void DeviceService::begin() #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_reboot")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"action":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::device_class].set("restart"); @@ -120,11 +118,11 @@ void DeviceService::begin() component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::payload_press].set("reboot"); component[HomeAssistantAbbreviations::platform].set("button"); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); } { const std::string id{std::string(name).append("_power")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"action":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::entity_category].set("config"); @@ -133,11 +131,11 @@ void DeviceService::begin() component[HomeAssistantAbbreviations::object_id].set(HOSTNAME "_" + id); component[HomeAssistantAbbreviations::payload_press].set("power"); component[HomeAssistantAbbreviations::platform].set("button"); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); } { const std::string id{std::string(name).append("_temperature")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::device_class].set("temperature"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); component[HomeAssistantAbbreviations::entity_category].set("diagnostic"); @@ -148,7 +146,7 @@ void DeviceService::begin() component[HomeAssistantAbbreviations::platform].set("sensor"); component[HomeAssistantAbbreviations::state_class].set("measurement"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::unit_of_measurement].set("°C"); component[HomeAssistantAbbreviations::value_template].set("{{value_json.temperature}}"); } @@ -188,13 +186,13 @@ void DeviceService::setPower(bool power) Display.clearFrame(); Display.flush(); #if EXTENSION_MQTT - Mqtt->disconnect(); + Extensions.MQTT().disconnect(); #endif #if EXTENSION_SERVERSENTEVENTS - ServerSentEvents->client->close(); + Extensions.ServerSentEvents().events.close(); #endif #if EXTENSION_WEBSOCKET - WebSocket->server->closeAll(); + Extensions.WebSocket().server->closeAll(); #endif WiFi.disconnect(true); power ? ESP.restart() : esp_deep_sleep_start(); @@ -206,17 +204,17 @@ void DeviceService::restore() Modes.setActive(false); Display.setPower(false); #if EXTENSION_HOMEASSISTANT - HomeAssistant->undiscover(); + Extensions.HomeAssistant().undiscover(); #endif #if EXTENSION_MQTT - Mqtt->client.loop(); - Mqtt->client.disconnect(); + Extensions.MQTT().client.loop(); + Extensions.MQTT().client.disconnect(); #endif #if EXTENSION_SERVERSENTEVENTS - ServerSentEvents->client->close(); + Extensions.ServerSentEvents().events.close(); #endif #if EXTENSION_WEBSOCKET - WebSocket->server->closeAll(); + Extensions.WebSocket().server->closeAll(); #endif WiFi.disconnect(true, true); esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_ALL); @@ -243,7 +241,7 @@ void DeviceService::transmit() } // NOLINTNEXTLINE(readability-make-member-function-const) -void DeviceService::transmit(JsonObjectConst payload, const char *source, bool retain) +void DeviceService::transmit(JsonObjectConst payload, std::string_view source, bool retain) { if (retain) { @@ -260,7 +258,7 @@ void DeviceService::transmit(JsonObjectConst payload, const char *source, bool r } // NOLINTNEXTLINE(bugprone-easily-swappable-parameters) -void DeviceService::receive(JsonObjectConst payload, const char *source, const char *destination) const +void DeviceService::receive(JsonObjectConst payload, std::string_view source, std::string_view destination) const { if (operational) { @@ -273,7 +271,7 @@ void DeviceService::receive(JsonObjectConst payload, const char *source, const c }; for (ServiceModule *service : services) { - if (!strcmp(service->name, destination)) + if (service->name == destination) { service->onReceive(payload, source); return; @@ -281,7 +279,7 @@ void DeviceService::receive(JsonObjectConst payload, const char *source, const c } for (ExtensionModule *extension : Extensions.getAll()) { - if (!strcmp(extension->name, destination)) + if (extension->name == destination) { extension->onReceive(payload, source); return; @@ -289,7 +287,7 @@ void DeviceService::receive(JsonObjectConst payload, const char *source, const c } for (ModeModule *mode : Modes.getAll()) { - if (!strcmp(mode->name, destination)) + if (mode->name == destination) { mode->onReceive(payload, source); return; @@ -299,7 +297,7 @@ void DeviceService::receive(JsonObjectConst payload, const char *source, const c } void DeviceService::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { if (payload["action"].is()) { diff --git a/firmware/src/services/DisplayService.cpp b/firmware/src/services/DisplayService.cpp index 38c86e60..17e77480 100644 --- a/firmware/src/services/DisplayService.cpp +++ b/firmware/src/services/DisplayService.cpp @@ -3,6 +3,7 @@ #include "extensions/HomeAssistantExtension.h" #include "handlers/BitmapHandler.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" +#include "services/ExtensionsService.h" #include "services/ModesService.h" #include @@ -54,9 +55,10 @@ void DisplayService::begin() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_orientation")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"orientation":{{value.replace('°','')}}})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::enabled_by_default].set(false); @@ -75,7 +77,7 @@ void DisplayService::begin() #endif // GRID_COLUMNS == GRID_ROWS component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.orientation}}°"); } #endif // EXTENSION_HOMEASSISTANT @@ -429,7 +431,7 @@ void DisplayService::transmit() } void DisplayService::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Brightness if (payload["brightness"].is()) diff --git a/firmware/src/services/ExtensionsService.cpp b/firmware/src/services/ExtensionsService.cpp index aa4f6cd4..a4c7b5c8 100644 --- a/firmware/src/services/ExtensionsService.cpp +++ b/firmware/src/services/ExtensionsService.cpp @@ -20,7 +20,7 @@ void ExtensionsService::begin() transmit(); } -const std::vector &ExtensionsService::getAll() const { return modules; } +std::span ExtensionsService::getAll() { return modules; } void ExtensionsService::transmit() { @@ -46,6 +46,28 @@ void ExtensionsService::onTask(void *parameter) // NOLINT(misc-unused-parameters } } +#if EXTENSION_HOMEASSISTANT +HomeAssistantExtension &ExtensionsService::HomeAssistant() { return extensionHomeAssistant; } +#endif +#if EXTENSION_MICROPHONE +MicrophoneExtension &ExtensionsService::Microphone() { return extensionMicrophone; } +#endif +#if EXTENSION_MQTT +MqttExtension &ExtensionsService::MQTT() { return extensionMqtt; } +#endif +#if EXTENSION_PHOTOCELL +PhotocellExtension &ExtensionsService::Photocell() { return extensionPhotocell; } +#endif +#if EXTENSION_PLAYLIST +PlaylistExtension &ExtensionsService::Playlist() { return extensionPlaylist; } +#endif +#if EXTENSION_SERVERSENTEVENTS +ServerSentEventsExtension &ExtensionsService::ServerSentEvents() { return extensionServerSentEvents; } +#endif +#if EXTENSION_WEBSOCKET +WebSocketExtension &ExtensionsService::WebSocket() { return extensionWebSocket; } +#endif + ExtensionsService &ExtensionsService::getInstance() { static ExtensionsService instance; diff --git a/firmware/src/services/ModesService.cpp b/firmware/src/services/ModesService.cpp index 202d7987..099dcca4 100644 --- a/firmware/src/services/ModesService.cpp +++ b/firmware/src/services/ModesService.cpp @@ -5,6 +5,7 @@ #include "handlers/TextHandler.h" // NOLINT(misc-include-cleaner) #include "services/DeviceService.h" #include "services/DisplayService.h" +#include "services/ExtensionsService.h" #include #include @@ -13,9 +14,10 @@ void ModesService::configure() { #if EXTENSION_HOMEASSISTANT const std::string topic{std::string("frekvens/" HOSTNAME "/").append(name)}; + const HomeAssistantExtension &_ha = Extensions.HomeAssistant(); { const std::string id{std::string(name).append("_mode")}; - JsonObject component{(*HomeAssistant->discovery)[HomeAssistantAbbreviations::components][id].to()}; + JsonObject component{(*_ha.discovery)[HomeAssistantAbbreviations::components][id].to()}; component[HomeAssistantAbbreviations::command_template].set(R"({"mode":"{{value}}"})"); component[HomeAssistantAbbreviations::command_topic].set(topic + "/set"); component[HomeAssistantAbbreviations::icon].set("mdi:format-list-bulleted"); @@ -28,7 +30,7 @@ void ModesService::configure() } component[HomeAssistantAbbreviations::platform].set("select"); component[HomeAssistantAbbreviations::state_topic].set(topic); - component[HomeAssistantAbbreviations::unique_id].set(HomeAssistant->uniquePrefix + id); + component[HomeAssistantAbbreviations::unique_id].set(_ha.uniquePrefix + id); component[HomeAssistantAbbreviations::value_template].set("{{value_json.mode}}"); } #endif // EXTENSION_HOMEASSISTANT @@ -241,7 +243,7 @@ void ModesService::transmit() } void ModesService::onReceive(JsonObjectConst payload, - const char *source) // NOLINT(misc-unused-parameters) + std::string_view source) // NOLINT(misc-unused-parameters) { // Mode if (payload["mode"].is()) diff --git a/scripts/src/Firmware.py b/scripts/src/Firmware.py index 9fd4d0f8..03ed92db 100644 --- a/scripts/src/Firmware.py +++ b/scripts/src/Firmware.py @@ -21,7 +21,7 @@ def finalize(self) -> None: self._define_pio() def _define_env(self) -> None: - count_font = 7 + count_extension = 0 count_weather = 0 for option, _value in self.project.dotenv.items(): if (value := _value or "") in [ @@ -34,8 +34,8 @@ def _define_env(self) -> None: ] ) if value == "true": - if option.startswith("FONT_"): - count_font += 1 + if option.startswith("EXTENSION_"): + count_extension += 1 elif option.startswith("WEATHER_"): count_weather += 1 else: @@ -74,7 +74,7 @@ def _define_env(self) -> None: { option: value for option, value in { - "COUNT_FONT": count_font, + "COUNT_EXTENSION": count_extension, "COUNT_WEATHER": count_weather, }.items() if value diff --git a/webapp/src/modes/HomeThermometer.tsx b/webapp/src/modes/HomeThermometer.tsx index 8a45bd7a..e93c8f3c 100644 --- a/webapp/src/modes/HomeThermometer.tsx +++ b/webapp/src/modes/HomeThermometer.tsx @@ -3,6 +3,7 @@ import { type Component, createSignal } from "solid-js"; import { Icon } from "../components/Icon"; import { Tooltip } from "../components/Tooltip"; +import { TEMPERATURE_UNIT } from "../config/constants"; import { EXTENSION_HOMEASSISTANT, EXTENSION_MQTT, EXTENSION_RESTFUL } from "../config/modules"; import { name as ExtensionHomeAssistantName } from "../extensions/HomeAssistant"; import { name as ExtensionMqttName, MqttTopic } from "../extensions/Mqtt"; @@ -12,8 +13,8 @@ import { MainComponent as ModesMainComponent, name as ModesName } from "../servi export const name = "Home thermometer"; -const [getIndoor, setIndoor] = createSignal(0); -const [getOutdoor, setOutdoor] = createSignal(0); +const [getIndoor, setIndoor] = createSignal(undefined); +const [getOutdoor, setOutdoor] = createSignal(undefined); export const receiver = (json: { indoor?: number; outdoor?: number }) => { json?.indoor !== undefined && setIndoor(json.indoor); @@ -24,7 +25,11 @@ export const Main: Component = () => ( ); @@ -44,8 +49,27 @@ export const Link: Component = () => ( ); export const MainSecondary: Component = () => { - const payload = `{"indoor": ${getIndoor()}, "outdoor": ${getOutdoor()}}`; - const payloadAlt = `{"${name}": ${payload}}`; + const fallback = (() => { + switch (TEMPERATURE_UNIT) { + case "°C": + return { + indoor: 20, + outdoor: 10, + }; + case "°F": + return { + indoor: 70, + outdoor: 50, + }; + case "°K": + return { + indoor: 295, + outdoor: 280, + }; + } + })(); + + const payload = `{"indoor": ${getIndoor() ?? fallback?.indoor ?? 0}, "outdoor": ${getOutdoor() ?? fallback?.outdoor ?? 0}}`; return (
@@ -121,7 +145,7 @@ export const MainSecondary: Component = () => {
Message:{" "} - {payloadAlt} + {`{"${name}": ${payload}}`}