From f14a698531dc3cb8afab5c7923c2535df5266203 Mon Sep 17 00:00:00 2001 From: wang Date: Mon, 21 Dec 2020 23:26:44 +0800 Subject: [PATCH 1/4] fix: Homie framework fails with exception when compiled with sloeber Tested by NodeMCU, Esp8266 V2.7.4, Sensor & Event demo. Signed-off-by: wang --- src/Homie.cpp | 8 ++++++-- src/Homie.hpp | 23 +++++++++++++++++------ src/Homie/Boot/BootNormal.hpp | 2 +- src/Homie/Datatypes/Interface.cpp | 10 ++++++---- src/Homie/Datatypes/Interface.hpp | 24 ++++++++++++++---------- 5 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/Homie.cpp b/src/Homie.cpp index 46d5c162..46462460 100644 --- a/src/Homie.cpp +++ b/src/Homie.cpp @@ -5,7 +5,8 @@ using namespace HomieInternals; HomieClass::HomieClass() : _setupCalled(false) , _firmwareSet(false) - , __HOMIE_SIGNATURE("\x25\x48\x4f\x4d\x49\x45\x5f\x45\x53\x50\x38\x32\x36\x36\x5f\x46\x57\x25") { + , __HOMIE_SIGNATURE("\x25\x48\x4f\x4d\x49\x45\x5f\x45\x53\x50\x38\x32\x36\x36\x5f\x46\x57\x25") + ,_boot(nullptr) { strlcpy(Interface::get().brand, DEFAULT_BRAND, MAX_BRAND_LENGTH); Interface::get().bootMode = HomieBootMode::UNDEFINED; Interface::get().configurationAp.secured = false; @@ -400,5 +401,8 @@ void HomieClass::doDeepSleep(uint64_t time_us, RFMode mode) { } #endif // ESP32 +//HomieClass Homie; +HomieClass& getHomie() { + return *(HomieClass::getInstance().get()); +} -HomieClass Homie; diff --git a/src/Homie.hpp b/src/Homie.hpp index f3ba0898..ffb2ebaf 100644 --- a/src/Homie.hpp +++ b/src/Homie.hpp @@ -28,12 +28,20 @@ #define Homie_setBrand(brand) const char* __FLAGGED_BRAND = "\xfb\x2a\xf5\x68\xc0" brand "\x6e\x2f\x0f\xeb\x2d"; Homie.__setBrand(__FLAGGED_BRAND); namespace HomieInternals { -class HomieClass { - friend class ::HomieNode; - friend SendingPromise; +class HomieClass; +using HomieClassPtr = std::shared_ptr; + +class HomieClass: public std::enable_shared_from_this { + friend class ::HomieNode; + friend SendingPromise; +public: + static HomieClassPtr getInstance() { + static HomieClassPtr m_inst = HomieClassPtr(new HomieClass()); + return m_inst; + } + HomieClass(const HomieClass&) = delete; + HomieClass& operator=(const HomieClass&) = delete; - public: - HomieClass(); ~HomieClass(); void setup(); void loop(); @@ -74,6 +82,7 @@ class HomieClass { #endif // ESP32 private: + HomieClass(); bool _setupCalled; bool _firmwareSet; Boot* _boot; @@ -95,4 +104,6 @@ class HomieClass { }; } // namespace HomieInternals -extern HomieInternals::HomieClass Homie; +//extern HomieInternals::HomieClass Homie; +#define Homie (getHomie()) +extern HomieInternals::HomieClass& getHomie(); diff --git a/src/Homie/Boot/BootNormal.hpp b/src/Homie/Boot/BootNormal.hpp index 491524a1..00314619 100644 --- a/src/Homie/Boot/BootNormal.hpp +++ b/src/Homie/Boot/BootNormal.hpp @@ -43,7 +43,7 @@ namespace HomieInternals { class BootNormal : public Boot { public: BootNormal(); - ~BootNormal(); + virtual ~BootNormal(); void setup(); void loop(); diff --git a/src/Homie/Datatypes/Interface.cpp b/src/Homie/Datatypes/Interface.cpp index 290ce923..f1532659 100644 --- a/src/Homie/Datatypes/Interface.cpp +++ b/src/Homie/Datatypes/Interface.cpp @@ -2,8 +2,6 @@ using namespace HomieInternals; -InterfaceData Interface::_interface; // need to define the static variable - InterfaceData::InterfaceData() : brand{ '\0' } , bootMode{ HomieBootMode::UNDEFINED } @@ -22,6 +20,10 @@ InterfaceData::InterfaceData() , _sendingPromise{ nullptr } { } -InterfaceData& Interface::get() { - return _interface; +namespace HomieInternals { + namespace Interface { + InterfaceData& get() { + return *( InterfaceData::getInstance().get()); + } + } } diff --git a/src/Homie/Datatypes/Interface.hpp b/src/Homie/Datatypes/Interface.hpp index 3e67a788..40790d63 100644 --- a/src/Homie/Datatypes/Interface.hpp +++ b/src/Homie/Datatypes/Interface.hpp @@ -19,11 +19,19 @@ class Config; class SendingPromise; class HomieClass; -class InterfaceData { +class InterfaceData; +using InterfaceDataPtr = std::shared_ptr; + +class InterfaceData : public std::enable_shared_from_this { friend HomieClass; public: - InterfaceData(); + static InterfaceDataPtr getInstance() { + static InterfaceDataPtr m_inst = InterfaceDataPtr(new InterfaceData()); + return m_inst; + } + InterfaceData(const InterfaceData&) = delete; + InterfaceData& operator=(const InterfaceData&) = delete; /***** User configurable data *****/ char brand[MAX_BRAND_LENGTH]; @@ -74,18 +82,14 @@ class InterfaceData { SendingPromise& getSendingPromise() { return *_sendingPromise; } private: + InterfaceData(); Logger* _logger; Blinker* _blinker; Config* _config; AsyncMqttClient* _mqttClient; SendingPromise* _sendingPromise; }; - -class Interface { - public: - static InterfaceData& get(); - - private: - static InterfaceData _interface; -}; +namespace Interface { + extern InterfaceData& get(); +} } // namespace HomieInternals From 3e61e70880c8466809d9bc254fa21f7edb4ff41f Mon Sep 17 00:00:00 2001 From: wang Date: Fri, 25 Dec 2020 23:13:46 +0800 Subject: [PATCH 2/4] fix ci Signed-off-by: wang --- src/Homie.hpp | 3 ++- src/Homie/Datatypes/Interface.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Homie.hpp b/src/Homie.hpp index ffb2ebaf..6fd2aa9f 100644 --- a/src/Homie.hpp +++ b/src/Homie.hpp @@ -34,7 +34,8 @@ using HomieClassPtr = std::shared_ptr; class HomieClass: public std::enable_shared_from_this { friend class ::HomieNode; friend SendingPromise; -public: + + public: static HomieClassPtr getInstance() { static HomieClassPtr m_inst = HomieClassPtr(new HomieClass()); return m_inst; diff --git a/src/Homie/Datatypes/Interface.cpp b/src/Homie/Datatypes/Interface.cpp index f1532659..0df8d57a 100644 --- a/src/Homie/Datatypes/Interface.cpp +++ b/src/Homie/Datatypes/Interface.cpp @@ -21,9 +21,9 @@ InterfaceData::InterfaceData() } namespace HomieInternals { - namespace Interface { - InterfaceData& get() { - return *( InterfaceData::getInstance().get()); - } - } +namespace Interface { + InterfaceData& get() { + return *( InterfaceData::getInstance().get()); + } +} } From c1125bb6ac8f76f9f2fa111aabbfb027e0437353 Mon Sep 17 00:00:00 2001 From: wang Date: Fri, 25 Dec 2020 23:45:29 +0800 Subject: [PATCH 3/4] Signed-off-by: wang --- src/Homie.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Homie.cpp b/src/Homie.cpp index 46462460..32b41a48 100644 --- a/src/Homie.cpp +++ b/src/Homie.cpp @@ -5,8 +5,9 @@ using namespace HomieInternals; HomieClass::HomieClass() : _setupCalled(false) , _firmwareSet(false) - , __HOMIE_SIGNATURE("\x25\x48\x4f\x4d\x49\x45\x5f\x45\x53\x50\x38\x32\x36\x36\x5f\x46\x57\x25") - ,_boot(nullptr) { + ,_boot(nullptr) + ,_flaggedForReboot(false) + , __HOMIE_SIGNATURE("\x25\x48\x4f\x4d\x49\x45\x5f\x45\x53\x50\x38\x32\x36\x36\x5f\x46\x57\x25") { strlcpy(Interface::get().brand, DEFAULT_BRAND, MAX_BRAND_LENGTH); Interface::get().bootMode = HomieBootMode::UNDEFINED; Interface::get().configurationAp.secured = false; From 15a364f72457950e1a947d7e721b5189dd7f122d Mon Sep 17 00:00:00 2001 From: wang Date: Sat, 26 Dec 2020 00:02:31 +0800 Subject: [PATCH 4/4] fix ci Signed-off-by: wang --- src/Homie.cpp | 4 ++-- src/Homie/Datatypes/Interface.cpp | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Homie.cpp b/src/Homie.cpp index 32b41a48..b301846d 100644 --- a/src/Homie.cpp +++ b/src/Homie.cpp @@ -5,8 +5,8 @@ using namespace HomieInternals; HomieClass::HomieClass() : _setupCalled(false) , _firmwareSet(false) - ,_boot(nullptr) - ,_flaggedForReboot(false) + , _boot(nullptr) + , _flaggedForReboot(false) , __HOMIE_SIGNATURE("\x25\x48\x4f\x4d\x49\x45\x5f\x45\x53\x50\x38\x32\x36\x36\x5f\x46\x57\x25") { strlcpy(Interface::get().brand, DEFAULT_BRAND, MAX_BRAND_LENGTH); Interface::get().bootMode = HomieBootMode::UNDEFINED; diff --git a/src/Homie/Datatypes/Interface.cpp b/src/Homie/Datatypes/Interface.cpp index 0df8d57a..cd67f7d5 100644 --- a/src/Homie/Datatypes/Interface.cpp +++ b/src/Homie/Datatypes/Interface.cpp @@ -22,8 +22,8 @@ InterfaceData::InterfaceData() namespace HomieInternals { namespace Interface { - InterfaceData& get() { - return *( InterfaceData::getInstance().get()); - } + InterfaceData& get() { + return *( InterfaceData::getInstance().get()); + } } }