From 2409ad8271a2339bb4a9751da74fed48e80d1bf8 Mon Sep 17 00:00:00 2001 From: hreintke Date: Sat, 2 Feb 2019 09:56:23 +0100 Subject: [PATCH 1/3] Initial version --- cores/esp8266/CallBackList.h | 84 +++++++++++++++++++ .../examples/CallBackList/CallBackGeneric.ino | 64 ++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 cores/esp8266/CallBackList.h create mode 100644 libraries/esp8266/examples/CallBackList/CallBackGeneric.ino diff --git a/cores/esp8266/CallBackList.h b/cores/esp8266/CallBackList.h new file mode 100644 index 0000000000..76e1f451b0 --- /dev/null +++ b/cores/esp8266/CallBackList.h @@ -0,0 +1,84 @@ +#ifndef __CALLBACKLIST_H__ +#define __CALLBACKLIST_H__ + + +/* + CallBackList, An implemention for handling callback execution + + Copyright (c) 2019 Herman Reintke. All rights reserved. + This file is part of the esp8266 core for Arduino environment. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include +#include +#include +#include + +namespace esp8266 +{ +namespace CBListImplentation +{ + +template +class CallBackList +{ +public: + CallBackList (){}; + + struct CallBackInfo + { + CallBackInfo(cbFunctionT f) : cbFunction(f, true){}; + CallBackInfo(cbFunctionT f, bool ar) : cbFunction(f), _allowRemove(ar) {}; + cbFunctionT cbFunction; + bool _allowRemove = true; + bool allowRemove() + { + return _allowRemove; + } + }; + using CallBackHandler = std::shared_ptr ; + std::list callBackEventList; + + CallBackHandler add(cbFunctionT af, bool ad = true) { + CallBackHandler handler = std::make_shared(CallBackInfo(af,ad)); + callBackEventList.emplace_back(handler); + return handler; + } + + void remove(CallBackHandler& dh) { + callBackEventList.remove(dh); + } + + template + void execute(Args... params) { + for(auto it = std::begin(callBackEventList); it != std::end(callBackEventList); ) { + CallBackHandler &handler = *it; + if (handler->allowRemove() && handler.unique()) { + it = callBackEventList.erase(it); + } + else { + handler->cbFunction(params...); + ++it; + } + } + } +}; + +} //CBListImplementation +}//esp8266 + +#endif // __CALLBACKLIST_H__ diff --git a/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino b/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino new file mode 100644 index 0000000000..616c418e5f --- /dev/null +++ b/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino @@ -0,0 +1,64 @@ +#include +#include +#include "CallBackList.h" + +using namespace esp8266::CBListImplentation; + +class exampleClass { + public: + exampleClass() {}; + + using exCallBack = std::function; + using exHandler = CallBackList::CallBackHandler; + + CallBackList myHandlers; + + exHandler setHandler(exCallBack cb) { + return myHandlers.add(cb); + } + + void removeHandler(exHandler hnd) { + myHandlers.remove(hnd); + } + + void trigger(int t) { + myHandlers.execute(t); + } +}; + +exampleClass myExample; + +void cb1(int in) { + Serial.printf("Callback 1, in = %d\n", in); +} + +void cb2(int in) { + Serial.printf("Callback 2, in = %d\n", in); +} + +void cb3(int in, int s) { + Serial.printf("Callback 3, in = %d, s = %d\n", in, s); +} + +Ticker tk, tk2, tk3; +exampleClass::exHandler e1 = myExample.setHandler(cb1); +exampleClass::exHandler e2 = myExample.setHandler(cb2); +exampleClass::exHandler e3 = myExample.setHandler(std::bind(cb3, std::placeholders::_1, 10)); + +void setup() { + Serial.begin(115200); + + tk.attach_ms(2000, []() { + Serial.printf("trigger %d\n", (uint32_t)millis()); + myExample.trigger(millis()); + }); + tk2.once_ms(10000, []() { + myExample.removeHandler(e2); + }); + tk3.once_ms(20000, []() { + e3.reset(); + }); +} + +void loop() { +} From e926b37cdea341d549aca0f8f02efc271d3033f3 Mon Sep 17 00:00:00 2001 From: Develo Date: Tue, 5 Nov 2019 18:29:04 -0300 Subject: [PATCH 2/3] Update CallBackList.h Move to experimental namespace --- cores/esp8266/CallBackList.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/CallBackList.h b/cores/esp8266/CallBackList.h index 76e1f451b0..187c86c2ad 100644 --- a/cores/esp8266/CallBackList.h +++ b/cores/esp8266/CallBackList.h @@ -28,7 +28,7 @@ #include #include -namespace esp8266 +namespace experimental { namespace CBListImplentation { @@ -79,6 +79,6 @@ class CallBackList }; } //CBListImplementation -}//esp8266 +}//experimental #endif // __CALLBACKLIST_H__ From 538bbe8e4e9168a3da3e08b7453b93630f5a7572 Mon Sep 17 00:00:00 2001 From: Develo Date: Tue, 5 Nov 2019 18:29:40 -0300 Subject: [PATCH 3/3] Update CallBackGeneric.ino Change namespace --- libraries/esp8266/examples/CallBackList/CallBackGeneric.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino b/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino index 616c418e5f..ce4dac2470 100644 --- a/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino +++ b/libraries/esp8266/examples/CallBackList/CallBackGeneric.ino @@ -2,7 +2,7 @@ #include #include "CallBackList.h" -using namespace esp8266::CBListImplentation; +using namespace experimental::CBListImplentation; class exampleClass { public: