From 0fa14368146bd26ef291c3c7028aa887eeeac5b8 Mon Sep 17 00:00:00 2001 From: hreintke Date: Sun, 12 Aug 2018 12:55:13 +0200 Subject: [PATCH 1/5] Implementation of Functional and Scheduled option in Ticker lib --- libraries/Ticker/Ticker.cpp | 14 ++++ libraries/Ticker/Ticker.h | 46 +++++++++--- .../TickerFunctional/TickerFunctional.ino | 70 +++++++++++++++++++ 3 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino diff --git a/libraries/Ticker/Ticker.cpp b/libraries/Ticker/Ticker.cpp index dee3a6363d..5fa2dc9608 100644 --- a/libraries/Ticker/Ticker.cpp +++ b/libraries/Ticker/Ticker.cpp @@ -65,9 +65,23 @@ void Ticker::detach() os_timer_disarm(_timer); delete _timer; _timer = nullptr; + _callback_function = nullptr; } bool Ticker::active() { return (bool)_timer; } + +void Ticker::_static_callback(void* arg) +{ + Ticker* _this = (Ticker*)arg; + if (_this == nullptr) + { + return; + } + if (_this->_callback_function) + { + _this->_callback_function(); + } +} diff --git a/libraries/Ticker/Ticker.h b/libraries/Ticker/Ticker.h index 74725fb76d..d006c8ffc3 100644 --- a/libraries/Ticker/Ticker.h +++ b/libraries/Ticker/Ticker.h @@ -25,6 +25,8 @@ #include #include #include +#include +#include extern "C" { typedef struct _ETSTIMER_ ETSTimer; @@ -37,15 +39,28 @@ class Ticker ~Ticker(); typedef void (*callback_t)(void); typedef void (*callback_with_arg_t)(void*); + typedef std::function callback_function_t; - void attach(float seconds, callback_t callback) + void attach_scheduled(float seconds, callback_function_t callback) { - _attach_ms(seconds * 1000, true, reinterpret_cast(callback), 0); + attach(seconds,std::bind(schedule_function, callback)); } - void attach_ms(uint32_t milliseconds, callback_t callback) + void attach(float seconds, callback_function_t callback) { - _attach_ms(milliseconds, true, reinterpret_cast(callback), 0); + _callback_function = callback; + attach(seconds, _static_callback, (void*)this); + } + + void attach_ms_scheduled(uint32_t milliseconds, callback_function_t callback) + { + attach_ms(milliseconds, std::bind(schedule_function, callback)); + } + + void attach_ms(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = callback; + attach_ms(milliseconds, _static_callback, (void*)this); } template @@ -67,14 +82,26 @@ class Ticker _attach_ms(milliseconds, true, reinterpret_cast(callback), arg32); } - void once(float seconds, callback_t callback) + void once_scheduled(float seconds, callback_function_t callback) { - _attach_ms(seconds * 1000, false, reinterpret_cast(callback), 0); + once(seconds, std::bind(schedule_function, callback)); } - void once_ms(uint32_t milliseconds, callback_t callback) + void once(float seconds, callback_function_t callback) { - _attach_ms(milliseconds, false, reinterpret_cast(callback), 0); + _callback_function = callback; + once(seconds, _static_callback, (void*)this); + } + + void once_ms_scheduled(uint32_t milliseconds, callback_function_t callback) + { + once_ms(milliseconds, std::bind(schedule_function, callback)); + } + + void once_ms(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = callback; + once_ms(milliseconds, _static_callback, (void*)this); } template @@ -98,10 +125,11 @@ class Ticker protected: void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, uint32_t arg); - + static void _static_callback (void* arg); protected: ETSTimer* _timer; + callback_function_t _callback_function = nullptr; }; diff --git a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino new file mode 100644 index 0000000000..08c9dbf032 --- /dev/null +++ b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino @@ -0,0 +1,70 @@ +#include "Arduino.h" +#include "Ticker.h" + +#define LED1 2 +#define LED2 4 +#define LED3 12 +#define LED4 14 +#define LED5 15 + + +class ExampleClass +{ +public: + ExampleClass(int pin, int duration) : _pin(pin), _duration(duration) + { + pinMode(_pin, OUTPUT); + _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink,this)); + } + ~ExampleClass(){}; + + int _pin, _duration; + Ticker _myTicker; + + void classBlink() + { + digitalWrite(_pin, !digitalRead(_pin)); + } +}; + +void staticBlink() +{ + digitalWrite(LED2, !digitalRead(LED2)); +} + +void scheduledBlink() +{ + digitalWrite(LED3, !digitalRead(LED2)); +} + +void parameterBlink(int p) +{ + digitalWrite(p, !digitalRead(p)); +} + +Ticker staticTicker; +Ticker scheduledTicker; +Ticker parameterTicker; +Ticker lambdaTicker; + +ExampleClass example(LED1, 100); + + +void setup() +{ + pinMode(LED2, OUTPUT); + staticTicker.attach_ms(100, staticBlink); + + pinMode(LED3, OUTPUT); + scheduledTicker.attach_ms_scheduled(100, scheduledBlink); + + pinMode(LED4, OUTPUT); + parameterTicker.attach_ms(100, std::bind(parameterBlink,LED4)); + + pinMode(LED5, OUTPUT); + lambdaTicker.attach_ms(100, [](){digitalWrite(LED5, !digitalRead(LED5));} ); +} + +void loop() +{ +} From 00feb5f73143d9902d7c2aea5875a43e2505ca82 Mon Sep 17 00:00:00 2001 From: hreintke Date: Mon, 13 Aug 2018 09:25:23 +0200 Subject: [PATCH 2/5] Update example formatting --- .../TickerFunctional/TickerFunctional.ino | 51 ++++++++----------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino index 08c9dbf032..56cf25aac6 100644 --- a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino +++ b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino @@ -10,36 +10,31 @@ class ExampleClass { -public: - ExampleClass(int pin, int duration) : _pin(pin), _duration(duration) - { - pinMode(_pin, OUTPUT); - _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink,this)); + public: + ExampleClass(int pin, int duration) : _pin(pin), _duration(duration){ + pinMode(_pin, OUTPUT); + _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink,this)); } ~ExampleClass(){}; int _pin, _duration; Ticker _myTicker; - void classBlink() - { - digitalWrite(_pin, !digitalRead(_pin)); + void classBlink() { + digitalWrite(_pin, !digitalRead(_pin)); } }; -void staticBlink() -{ - digitalWrite(LED2, !digitalRead(LED2)); +void staticBlink() { + digitalWrite(LED2, !digitalRead(LED2)); } -void scheduledBlink() -{ - digitalWrite(LED3, !digitalRead(LED2)); +void scheduledBlink() { + digitalWrite(LED3, !digitalRead(LED2)); } -void parameterBlink(int p) -{ - digitalWrite(p, !digitalRead(p)); +void parameterBlink(int p) { + digitalWrite(p, !digitalRead(p)); } Ticker staticTicker; @@ -50,21 +45,19 @@ Ticker lambdaTicker; ExampleClass example(LED1, 100); -void setup() -{ - pinMode(LED2, OUTPUT); - staticTicker.attach_ms(100, staticBlink); +void setup() { + pinMode(LED2, OUTPUT); + staticTicker.attach_ms(100, staticBlink); - pinMode(LED3, OUTPUT); - scheduledTicker.attach_ms_scheduled(100, scheduledBlink); + pinMode(LED3, OUTPUT); + scheduledTicker.attach_ms_scheduled(100, scheduledBlink); - pinMode(LED4, OUTPUT); - parameterTicker.attach_ms(100, std::bind(parameterBlink,LED4)); + pinMode(LED4, OUTPUT); + parameterTicker.attach_ms(100, std::bind(parameterBlink,LED4)); - pinMode(LED5, OUTPUT); - lambdaTicker.attach_ms(100, [](){digitalWrite(LED5, !digitalRead(LED5));} ); + pinMode(LED5, OUTPUT); + lambdaTicker.attach_ms(100, [](){digitalWrite(LED5, !digitalRead(LED5));} ); } -void loop() -{ +void loop() { } From f1c7cb55b422e51a182ac007583119ca00eb4b4f Mon Sep 17 00:00:00 2001 From: hreintke Date: Mon, 13 Aug 2018 10:44:36 +0200 Subject: [PATCH 3/5] More example updates --- .../TickerFunctional/TickerFunctional.ino | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino index 56cf25aac6..06df1a5d2d 100644 --- a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino +++ b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino @@ -8,20 +8,19 @@ #define LED5 15 -class ExampleClass -{ +class ExampleClass { public: - ExampleClass(int pin, int duration) : _pin(pin), _duration(duration){ - pinMode(_pin, OUTPUT); - _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink,this)); + ExampleClass(int pin, int duration) : _pin(pin), _duration(duration){ + pinMode(_pin, OUTPUT); + _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink, this)); } ~ExampleClass(){}; - int _pin, _duration; - Ticker _myTicker; + int _pin, _duration; + Ticker _myTicker; - void classBlink() { - digitalWrite(_pin, !digitalRead(_pin)); + void classBlink() { + digitalWrite(_pin, !digitalRead(_pin)); } }; @@ -53,10 +52,12 @@ void setup() { scheduledTicker.attach_ms_scheduled(100, scheduledBlink); pinMode(LED4, OUTPUT); - parameterTicker.attach_ms(100, std::bind(parameterBlink,LED4)); + parameterTicker.attach_ms(100, std::bind(parameterBlink, LED4)); pinMode(LED5, OUTPUT); - lambdaTicker.attach_ms(100, [](){digitalWrite(LED5, !digitalRead(LED5));} ); + lambdaTicker.attach_ms(100, [](){ + digitalWrite(LED5, !digitalRead(LED5)); + }); } void loop() { From 906bee0b831f03934a99e4869e00eb3b95d8b955 Mon Sep 17 00:00:00 2001 From: hreintke Date: Mon, 13 Aug 2018 10:57:23 +0200 Subject: [PATCH 4/5] More updates to example --- .../examples/TickerFunctional/TickerFunctional.ino | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino index 06df1a5d2d..0119c52505 100644 --- a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino +++ b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino @@ -10,11 +10,11 @@ class ExampleClass { public: - ExampleClass(int pin, int duration) : _pin(pin), _duration(duration){ - pinMode(_pin, OUTPUT); - _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink, this)); - } - ~ExampleClass(){}; + ExampleClass(int pin, int duration) : _pin(pin), _duration(duration) { + pinMode(_pin, OUTPUT); + _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink, this)); + } + ~ExampleClass(){}; int _pin, _duration; Ticker _myTicker; @@ -55,7 +55,7 @@ void setup() { parameterTicker.attach_ms(100, std::bind(parameterBlink, LED4)); pinMode(LED5, OUTPUT); - lambdaTicker.attach_ms(100, [](){ + lambdaTicker.attach_ms(100, []() { digitalWrite(LED5, !digitalRead(LED5)); }); } From 70651ddcdf9c590062d0ac3f2c68862078dab954 Mon Sep 17 00:00:00 2001 From: hreintke Date: Mon, 13 Aug 2018 11:23:39 +0200 Subject: [PATCH 5/5] More updates to example --- .../Ticker/examples/TickerFunctional/TickerFunctional.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino index 0119c52505..33c9435982 100644 --- a/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino +++ b/libraries/Ticker/examples/TickerFunctional/TickerFunctional.ino @@ -14,14 +14,14 @@ class ExampleClass { pinMode(_pin, OUTPUT); _myTicker.attach_ms(_duration, std::bind(&ExampleClass::classBlink, this)); } - ~ExampleClass(){}; + ~ExampleClass() {}; int _pin, _duration; Ticker _myTicker; void classBlink() { digitalWrite(_pin, !digitalRead(_pin)); - } + } }; void staticBlink() {