From 6a77bf6ea6e03152beb519dbcb3acf754150a07d Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Fri, 19 Dec 2014 01:43:40 +0300 Subject: [PATCH] Ticker library --- .../esp8266/libraries/Ticker/Ticker.cpp | 48 ++++++++++++++++ .../arduino/esp8266/libraries/Ticker/Ticker.h | 56 +++++++++++++++++++ .../examples/TickerBasic/TickerBasic.ino | 49 ++++++++++++++++ .../TickerParameter/TickerParameter.ino | 36 ++++++++++++ .../esp8266/libraries/Ticker/keywords.txt | 26 +++++++++ .../libraries/Ticker/library.properties | 8 +++ 6 files changed, 223 insertions(+) create mode 100644 hardware/arduino/esp8266/libraries/Ticker/Ticker.cpp create mode 100644 hardware/arduino/esp8266/libraries/Ticker/Ticker.h create mode 100644 hardware/arduino/esp8266/libraries/Ticker/examples/TickerBasic/TickerBasic.ino create mode 100644 hardware/arduino/esp8266/libraries/Ticker/examples/TickerParameter/TickerParameter.ino create mode 100644 hardware/arduino/esp8266/libraries/Ticker/keywords.txt create mode 100644 hardware/arduino/esp8266/libraries/Ticker/library.properties diff --git a/hardware/arduino/esp8266/libraries/Ticker/Ticker.cpp b/hardware/arduino/esp8266/libraries/Ticker/Ticker.cpp new file mode 100644 index 000000000..0e1c8391e --- /dev/null +++ b/hardware/arduino/esp8266/libraries/Ticker/Ticker.cpp @@ -0,0 +1,48 @@ +#include +#include + +extern "C" { +#include "c_types.h" +#include "eagle_soc.h" +#include "ets_sys.h" +#include "osapi.h" +} + +#include "Ticker.h" + +Ticker::Ticker() +: _timer(0) +{ +} + +Ticker::~Ticker() +{ + detach(); +} + +void Ticker::_attach_ms(callback_with_arg_t callback, uint32_t milliseconds, void* arg) +{ + const int REPEAT = 1; + + if (_timer) + { + os_timer_disarm(_timer); + } + else + { + _timer = new ETSTimer; + } + + os_timer_setfn(_timer, reinterpret_cast(callback), arg); + os_timer_arm(_timer, milliseconds, REPEAT); +} + +void Ticker::detach() +{ + if (!_timer) + return; + + os_timer_disarm(_timer); + delete _timer; + _timer = 0; +} diff --git a/hardware/arduino/esp8266/libraries/Ticker/Ticker.h b/hardware/arduino/esp8266/libraries/Ticker/Ticker.h new file mode 100644 index 000000000..556acda93 --- /dev/null +++ b/hardware/arduino/esp8266/libraries/Ticker/Ticker.h @@ -0,0 +1,56 @@ +#ifndef TICKER_H +#define TICKER_H + +#include +#include + +extern "C" { + typedef struct _ETSTIMER_ ETSTimer; +} + +class Ticker +{ +public: + Ticker(); + ~Ticker(); + typedef void (*callback_t)(void); + typedef void (*callback_with_arg_t)(void*); + + void attach(callback_t callback, float seconds) + { + _attach_ms(reinterpret_cast(callback), seconds * 1000, 0); + } + + void attach_ms(callback_t callback, uint32_t milliseconds) + { + _attach_ms(reinterpret_cast(callback), milliseconds, 0); + } + + template + void attach(void (*callback)(TArg), float seconds, TArg arg) + { + static_assert(sizeof(TArg) <= sizeof(uint32_t), "attach() callback argument size must be <= 4 bytes"); + uint32_t arg32 = static_cast(arg); + _attach_ms(reinterpret_cast(callback), seconds * 1000, reinterpret_cast(arg32)); + } + + template + void attach_ms(void (*callback)(TArg), uint32_t milliseconds, TArg arg) + { + static_assert(sizeof(TArg) <= sizeof(uint32_t), "attach_ms() callback argument size must be <= 4 bytes"); + uint32_t arg32 = static_cast(arg); + _attach_ms(reinterpret_cast(callback), milliseconds, reinterpret_cast(arg32)); + } + + void detach(); + +protected: + void _attach_ms(callback_with_arg_t callback, uint32_t milliseconds, void* arg); + + +protected: + ETSTimer* _timer; +}; + + +#endif//TICKER_H diff --git a/hardware/arduino/esp8266/libraries/Ticker/examples/TickerBasic/TickerBasic.ino b/hardware/arduino/esp8266/libraries/Ticker/examples/TickerBasic/TickerBasic.ino new file mode 100644 index 000000000..4b21818e5 --- /dev/null +++ b/hardware/arduino/esp8266/libraries/Ticker/examples/TickerBasic/TickerBasic.ino @@ -0,0 +1,49 @@ +/* + Basic Ticker usage + + Ticker is an object that will call a given function with a certain period. + Each Ticker calls one function. You can have as many Tickers as you like, + memory being the only limitation. + + A function may be attached to a ticker and detached from the ticker. + There are two variants of the attach function: attach and attach_ms. + The first one takes period in seconds, the second one in milliseconds. + + An LED connected to GPIO1 will be blinking. Use a built-in LED on ESP-01 + or connect an external one to TXD on other boards. +*/ + +#include + +Ticker flipper; + +int count = 0; + +void flip() +{ + int state = digitalRead(1); // get the current state of GPIO1 pin + digitalWrite(1, !state); // set pin to the opposite state + + ++count; + // when the counter reaches a certain value, start blinking like crazy + if (count == 20) + { + flipper.attach(&flip, 0.1); + } + // when the counter reaches yet another value, stop blinking + else if (count == 120) + { + flipper.detach(); + } +} + +void setup() { + pinMode(1, OUTPUT); + digitalWrite(1, LOW); + + // flip the pin every 0.3s + flipper.attach(&flip, 0.3); +} + +void loop() { +} diff --git a/hardware/arduino/esp8266/libraries/Ticker/examples/TickerParameter/TickerParameter.ino b/hardware/arduino/esp8266/libraries/Ticker/examples/TickerParameter/TickerParameter.ino new file mode 100644 index 000000000..832f35405 --- /dev/null +++ b/hardware/arduino/esp8266/libraries/Ticker/examples/TickerParameter/TickerParameter.ino @@ -0,0 +1,36 @@ +/* + Passing paramters to Ticker callbacks + + Apart from void(void) functions, the Ticker library supports + functions taking one argument. This argument's size has to be less or + equal to 4 bytes (so char, short, int, float, void*, char* types will do). + + This sample runs two tickers that both call one callback function, + but with different arguments. + + An LED connected to GPIO1 will be pulsing. Use a built-in LED on ESP-01 + or connect an external one to TXD on other boards. +*/ + +#include + +Ticker tickerSetHigh; +Ticker tickerSetLow; + +void setPin(int state) { + digitalWrite(1, state); +} + +void setup() { + pinMode(1, OUTPUT); + digitalWrite(1, LOW); + + // call setPin(0) every 25 ms + tickerSetLow.attach_ms(&setPin, 25, 0); + + // call setPin(1) every 26 ms + tickerSetHigh.attach_ms(&setPin, 26, 1); +} + +void loop() { +} diff --git a/hardware/arduino/esp8266/libraries/Ticker/keywords.txt b/hardware/arduino/esp8266/libraries/Ticker/keywords.txt new file mode 100644 index 000000000..8fae1c33e --- /dev/null +++ b/hardware/arduino/esp8266/libraries/Ticker/keywords.txt @@ -0,0 +1,26 @@ +####################################### +# Syntax Coloring Map For Wire +####################################### + +####################################### +# Datatypes (KEYWORD1) +####################################### + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +attach KEYWORD2 +attach_ms KEYWORD2 +detach KEYWORD2 + +####################################### +# Instances (KEYWORD2) +####################################### + +Ticker KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + diff --git a/hardware/arduino/esp8266/libraries/Ticker/library.properties b/hardware/arduino/esp8266/libraries/Ticker/library.properties new file mode 100644 index 000000000..589125041 --- /dev/null +++ b/hardware/arduino/esp8266/libraries/Ticker/library.properties @@ -0,0 +1,8 @@ +name=Ticker +version=1.0 +author=Ivan Grokhtokov +maintainer=Ivan Grokhtokov +sentence=Allows to call functions with a given interval. +paragraph= +url= +architectures=esp8266