From 482516e393b169f727afd10df374dc5d6ddb1cc9 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" <19971886+dok-net@users.noreply.github.com> Date: Thu, 14 Nov 2019 14:02:32 +0100 Subject: [PATCH] Minimize header use, move Ticker function definitions into cpp file (#6496) * Backport from ESP32 * Use new library layout (.../src) * Cleanup test case. * C++ style cast required. * Whitespace * Inlining via header has better baseline ROM footprint. * Reordered functions for better code-compare to master * Reduces ROM footprint some more. * Avoid unnecessary parameter passing - refactoring, same generated footprint. * Reformat example sources --- libraries/Ticker/Ticker.h | 129 ----------------- .../TickerParameter/TickerParameter.ino | 23 ++- libraries/Ticker/keywords.txt | 17 +-- libraries/Ticker/{ => src}/Ticker.cpp | 55 +++----- libraries/Ticker/src/Ticker.h | 133 ++++++++++++++++++ 5 files changed, 172 insertions(+), 185 deletions(-) delete mode 100644 libraries/Ticker/Ticker.h rename libraries/Ticker/{ => src}/Ticker.cpp (65%) create mode 100644 libraries/Ticker/src/Ticker.h diff --git a/libraries/Ticker/Ticker.h b/libraries/Ticker/Ticker.h deleted file mode 100644 index 074e5ba32..000000000 --- a/libraries/Ticker/Ticker.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - Ticker.h - esp8266 library that calls functions periodically - - Copyright (c) 2014 Ivan Grokhotkov. 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 -*/ - -#ifndef TICKER_H -#define TICKER_H - -#include -#include -#include - -class Ticker -{ -public: - Ticker(); - ~Ticker(); - - typedef void (*callback_with_arg_t)(void *); - typedef std::function callback_function_t; - - void attach_scheduled(float seconds, callback_function_t callback) - { - attach(seconds, [callback]() { schedule_function(callback); }); - } - - void attach(float seconds, callback_function_t callback) - { - _callback_function = std::move(callback); - _attach_s(seconds, true, _static_callback, this); - } - - void attach_ms_scheduled(uint32_t milliseconds, callback_function_t callback) - { - attach_ms(milliseconds, [callback]() { schedule_function(callback); }); - } - - void attach_ms(uint32_t milliseconds, callback_function_t callback) - { - _callback_function = std::move(callback); - _attach_ms(milliseconds, true, _static_callback, this); - } - - template - void attach(float seconds, void (*callback)(TArg), TArg arg) - { - static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); - // C-cast serves two purposes: - // static_cast for smaller integer types, - // reinterpret_cast + const_cast for pointer types - _attach_s(seconds, true, reinterpret_cast(callback), reinterpret_cast(arg)); - } - - template - void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) - { - static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); - _attach_ms(milliseconds, true, reinterpret_cast(callback), reinterpret_cast(arg)); - } - - void once_scheduled(float seconds, callback_function_t callback) - { - once(seconds, [callback]() { schedule_function(callback); }); - } - - void once(float seconds, callback_function_t callback) - { - _callback_function = std::move(callback); - _attach_s(seconds, false, _static_callback, this); - } - - void once_ms_scheduled(uint32_t milliseconds, callback_function_t callback) - { - once_ms(milliseconds, [callback]() { schedule_function(callback); }); - } - - void once_ms(uint32_t milliseconds, callback_function_t callback) - { - _callback_function = std::move(callback); - _attach_ms(milliseconds, false, _static_callback, this); - } - - template - void once(float seconds, void (*callback)(TArg), TArg arg) - { - static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); - _attach_s(seconds, false, reinterpret_cast(callback), reinterpret_cast(arg)); - } - - template - void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) - { - static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); - _attach_ms(milliseconds, false, reinterpret_cast(callback), reinterpret_cast(arg)); - } - - void detach(); - bool active() const; - -protected: - void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, void* arg); - static void _static_callback(void* arg); - - ETSTimer* _timer; - callback_function_t _callback_function = nullptr; - -private: - void _attach_s(float seconds, bool repeat, callback_with_arg_t callback, void* arg); - ETSTimer _etsTimer; -}; - - -#endif//TICKER_H diff --git a/libraries/Ticker/examples/TickerParameter/TickerParameter.ino b/libraries/Ticker/examples/TickerParameter/TickerParameter.ino index 80734a1a6..066905d09 100644 --- a/libraries/Ticker/examples/TickerParameter/TickerParameter.ino +++ b/libraries/Ticker/examples/TickerParameter/TickerParameter.ino @@ -13,9 +13,17 @@ #include -Ticker tickerSetHigh; -Ticker tickerSetAnalog; Ticker tickerSetLow; +Ticker tickerSetHigh; +Ticker tickerSetChar; + +void setPinLow() { + digitalWrite(LED_BUILTIN, 0); +} + +void setPinHigh() { + digitalWrite(LED_BUILTIN, 1); +} void setPin(int state) { digitalWrite(LED_BUILTIN, state); @@ -27,14 +35,15 @@ void setPinChar(char state) { void setup() { pinMode(LED_BUILTIN, OUTPUT); - digitalWrite(1, LOW); - // every 25 ms, call setPin(0) - tickerSetLow.attach_ms(25, setPin, 0); + // every 25 ms, call setPinLow() + tickerSetLow.attach_ms(25, setPinLow); - // every 26 ms, call setPinChar(1) - tickerSetHigh.attach_ms(26, setPinChar, (char)1); + // every 26 ms, call setPinHigh() + tickerSetHigh.attach_ms(26, setPinHigh); + // every 54 ms, call setPinChar(1) + tickerSetChar.attach_ms(26, setPinChar, (char)1); } void loop() { diff --git a/libraries/Ticker/keywords.txt b/libraries/Ticker/keywords.txt index 1ecd8d0ed..ab0b07e03 100644 --- a/libraries/Ticker/keywords.txt +++ b/libraries/Ticker/keywords.txt @@ -1,11 +1,9 @@ -####################################### -# Syntax Coloring Map For Wire -####################################### - ####################################### # Datatypes (KEYWORD1) ####################################### +Ticker KEYWORD1 + ####################################### # Methods and Functions (KEYWORD2) ####################################### @@ -16,14 +14,3 @@ once KEYWORD2 once_ms KEYWORD2 detach KEYWORD2 active KEYWORD2 - -####################################### -# Instances (KEYWORD2) -####################################### - -Ticker KEYWORD2 - -####################################### -# Constants (LITERAL1) -####################################### - diff --git a/libraries/Ticker/Ticker.cpp b/libraries/Ticker/src/Ticker.cpp similarity index 65% rename from libraries/Ticker/Ticker.cpp rename to libraries/Ticker/src/Ticker.cpp index 35ec21cdc..dca4435dc 100644 --- a/libraries/Ticker/Ticker.cpp +++ b/libraries/Ticker/src/Ticker.cpp @@ -25,60 +25,47 @@ #include "Ticker.h" -namespace -{ - constexpr int ONCE = 0; - constexpr int REPEAT = 1; -} - Ticker::Ticker() - : _timer(nullptr) -{ -} + : _timer(nullptr) {} Ticker::~Ticker() { - detach(); -} - -void Ticker::_attach_s(float seconds, bool repeat, callback_with_arg_t callback, void* arg) -{ - _attach_ms(1000 * seconds, repeat, callback, arg); + detach(); } void Ticker::_attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, void* arg) { - if (_timer) - { - os_timer_disarm(_timer); - } - else - { - _timer = &_etsTimer; - } + if (_timer) + { + os_timer_disarm(_timer); + } + else + { + _timer = &_etsTimer; + } - os_timer_setfn(_timer, callback, arg); - os_timer_arm(_timer, milliseconds, (repeat) ? REPEAT : ONCE); + os_timer_setfn(_timer, callback, arg); + os_timer_arm(_timer, milliseconds, repeat); } void Ticker::detach() { - if (!_timer) - return; + if (!_timer) + return; - os_timer_disarm(_timer); - _timer = nullptr; - _callback_function = nullptr; + os_timer_disarm(_timer); + _timer = nullptr; + _callback_function = nullptr; } bool Ticker::active() const { - return _timer; + return _timer; } void Ticker::_static_callback(void* arg) { - Ticker* _this = reinterpret_cast(arg); - if (_this && _this->_callback_function) - _this->_callback_function(); + Ticker* _this = reinterpret_cast(arg); + if (_this && _this->_callback_function) + _this->_callback_function(); } diff --git a/libraries/Ticker/src/Ticker.h b/libraries/Ticker/src/Ticker.h new file mode 100644 index 000000000..436a68ce8 --- /dev/null +++ b/libraries/Ticker/src/Ticker.h @@ -0,0 +1,133 @@ +/* + Ticker.h - esp8266 library that calls functions periodically + + Copyright (c) 2014 Ivan Grokhotkov. 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 +*/ + +#ifndef TICKER_H +#define TICKER_H + +#include +#include +#include + +class Ticker +{ +public: + Ticker(); + ~Ticker(); + + typedef void (*callback_with_arg_t)(void*); + typedef std::function callback_function_t; + + void attach_scheduled(float seconds, callback_function_t callback) + { + _callback_function = [callback]() { schedule_function(callback); }; + _attach_ms(1000UL * seconds, true); + } + + void attach(float seconds, callback_function_t callback) + { + _callback_function = std::move(callback); + _attach_ms(1000UL * seconds, true); + } + + void attach_ms_scheduled(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = [callback]() { schedule_function(callback); }; + _attach_ms(milliseconds, true); + } + + void attach_ms(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = std::move(callback); + _attach_ms(milliseconds, true); + } + + template + void attach(float seconds, void (*callback)(TArg), TArg arg) + { + static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); + _attach_ms(1000UL * seconds, true, reinterpret_cast(callback), reinterpret_cast(arg)); + } + + template + void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) + { + static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); + _attach_ms(milliseconds, true, reinterpret_cast(callback), reinterpret_cast(arg)); + } + + void once_scheduled(float seconds, callback_function_t callback) + { + _callback_function = [callback]() { schedule_function(callback); }; + _attach_ms(1000UL * seconds, false); + } + + void once(float seconds, callback_function_t callback) + { + _callback_function = std::move(callback); + _attach_ms(1000UL * seconds, false); + } + + void once_ms_scheduled(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = [callback]() { schedule_function(callback); }; + _attach_ms(milliseconds, false); + } + + void once_ms(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = std::move(callback); + _attach_ms(milliseconds, false); + } + + template + void once(float seconds, void (*callback)(TArg), TArg arg) + { + static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); + _attach_ms(1000UL * seconds, false, reinterpret_cast(callback), reinterpret_cast(arg)); + } + + template + void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg) + { + static_assert(sizeof(TArg) <= sizeof(void*), "attach() callback argument size must be <= sizeof(void*)"); + _attach_ms(milliseconds, false, reinterpret_cast(callback), reinterpret_cast(arg)); + } + + void detach(); + bool active() const; + +protected: + static void _static_callback(void* arg); + void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, void* arg); + void _attach_ms(uint32_t milliseconds, bool repeat) + { + _attach_ms(milliseconds, repeat, _static_callback, this); + } + + ETSTimer* _timer; + callback_function_t _callback_function = nullptr; + +private: + ETSTimer _etsTimer; +}; + + +#endif //TICKER_H