diff --git a/README.md b/README.md index 7f4684a..de275f8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,10 @@ -# Interval -Arduino knihovna pro časování pomocí intervalů +# Intrval - Arduino knihovna pro časování pomocí intervalů + Koncepce programové konstrukce aplikace pro Arduino spočívá ve dvou hlavních metodách – **setup()** a **loop()**, ve které program neustále běží. Pro pohodlnější práci s obsluhou periodických procesů jsem napsal jednoduchou knihovnu, která tyto úkoly umožňuje napsat velmi elegantním způsobem. + Knihovna **Interval** vytváří časovací objekty a zpřístupňuje dvě metody – metodu **set** a metodu **expired**. + Metoda **set** se používá k nastavení timeoutu a definici začátku časování, metoda **expired** pak slouží k ověření, zda nastavený interval již vypršel. + Zajímavostí je, že knihovna korektně ošetřuje přetečení vnitřního milisekundového čítače, takže nehrozí nebezpečí špatného časování i při velmi dlouhé době chodu zařízení. diff --git a/library.json b/library.json index 42e9cb0..636330d 100644 --- a/library.json +++ b/library.json @@ -10,9 +10,9 @@ "repository": { "type": "git", - "url": "https://github.com/Pablo2048/Interval.git" + "url": "http://git.xpablo.cz/pablo2048/Interval.git" }, - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "frameworks": "arduino", "platforms": "*", diff --git a/library.properties b/library.properties index 145ed36..a90e147 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Interval -version=0.0.2 +version=0.0.3 author=Pavel Brychta maintainer=Pavel Brychta sentence=Make timing by using intervals instead of delay() diff --git a/src/interval.cpp b/src/interval.cpp index ccd4529..1a4d7a5 100644 --- a/src/interval.cpp +++ b/src/interval.cpp @@ -21,11 +21,33 @@ uint32_t Interval::elapsed(void) bool Interval::expired(void) { - - if ((millis() - _timefrom) >= _timeout) - return true; - else - return false; + bool result = false; + if (_done) + { + if (1 == mode) + { // oneshot mode + if ((millis() - _timefrom) >= _timeout) + { + _done = 0; + result = true; + } + } + else if (2 == mode) + { // periodic mode + if ((millis() - _timefrom) >= _timeout) + { + result = true; + _timefrom = millis(); + _timeout = _reload; + } + } + else + { // compatibility mode + if ((millis() - _timefrom) >= _timeout) + result = true; + } + } + return result; } void Interval::set(uint32_t tmout) @@ -34,6 +56,28 @@ void Interval::set(uint32_t tmout) _reload = tmout; _timefrom = millis(); _timeout = _reload; + _mode = 0; + _done = 0xff; +} + +void Interval::setOneshot(uint32_t tmout) +{ + + _reload = tmout; + _timefrom = millis(); + _timeout = _reload; + _mode = 1; + _done = 0xff; +} + +void Interval::setPeriodic(uint32_t tmout) +{ + + _reload = tmout; + _timefrom = millis(); + _timeout = _reload; + _mode = 2; + _done = 0xff; } void Interval::reload(void) diff --git a/src/interval.h b/src/interval.h index 03dc00a..ffa2dc6 100644 --- a/src/interval.h +++ b/src/interval.h @@ -16,9 +16,14 @@ class Interval uint32_t _timefrom; uint32_t _timeout; uint32_t _reload; + uint8_t _mode; // mode of actual operation (compatibility, oneshot, periodic) + uint8_t _done; public: + Interval(): _mode(0), _done(0xff) {} bool expired(void); void set(uint32_t tmout); + void setOneshot(uint32_t tmout); + void setPeriodic(uint32_t tmout); void reload(void); uint32_t elapsed(void); uint32_t remains(void);