diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index 7eec547e48..5937756671 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -145,7 +145,6 @@ class timeoutTemplate using timeType = typename TimePolicyT::timeType; static_assert(std::is_unsigned::value == true, "timeType must be unsigned"); - static constexpr timeType alwaysExpired = 0; static constexpr timeType neverExpires = std::numeric_limits::max(); static constexpr timeType rangeCompensate = TimePolicyT::rangeCompensate; //debug @@ -157,10 +156,10 @@ class timeoutTemplate IRAM_ATTR // fast bool expired() { - YieldPolicyT::execute(); //in case of DoNothing: gets optimized away - if(PeriodicT) //in case of false: gets optimized away - return expiredRetrigger(); - return expiredOneShot(); + bool hasExpired = PeriodicT ? expiredRetrigger() : expiredOneShot(); + if (!hasExpired) //in case of DoNothing: gets optimized away + YieldPolicyT::execute(); + return hasExpired; } IRAM_ATTR // fast @@ -176,7 +175,7 @@ class timeoutTemplate bool canWait () const { - return _timeout != alwaysExpired; + return _timeout != 0; } // Resets, will trigger after this new timeout. @@ -185,7 +184,7 @@ class timeoutTemplate { reset(); _timeout = TimePolicyT::toTimeTypeUnit(newUserTimeout); - _neverExpires = (newUserTimeout < 0) || (newUserTimeout > timeMax()); + _neverExpires = newUserTimeout > timeMax(); } // Resets, will trigger after the timeout previously set. @@ -214,15 +213,31 @@ class timeoutTemplate void resetToNeverExpires () { - _timeout = alwaysExpired + 1; // because canWait() has precedence + _timeout = 1; // because canWait() has precedence _neverExpires = true; } + void stop() + { + resetToNeverExpires(); + } + timeType getTimeout() const { return TimePolicyT::toUserUnit(_timeout); } + IRAM_ATTR // fast + timeType remaining() const + { + if (_neverExpires) + return timeMax(); + timeType current = TimePolicyT::time(); + if (checkExpired(current)) + return TimePolicyT::toUserUnit(0); + return TimePolicyT::toUserUnit(_timeout - (current - _start)); + } + static constexpr timeType timeMax() { return TimePolicyT::timeMax; @@ -234,7 +249,7 @@ class timeoutTemplate bool checkExpired(const timeType internalUnit) const { // canWait() is not checked here - // returns "can expire" and "time expired" + // returns "can expire" and "time has expired" return (!_neverExpires) && ((internalUnit - _start) >= _timeout); } @@ -249,7 +264,7 @@ class timeoutTemplate timeType current = TimePolicyT::time(); if(checkExpired(current)) { - unsigned long n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout) + timeType n = (current - _start) / _timeout; //how many _timeouts periods have elapsed, will usually be 1 (current - _start >= _timeout) _start += n * _timeout; return true; } diff --git a/cores/esp8266/Stream.h b/cores/esp8266/Stream.h index 340d4f9c78..596d9be5e8 100644 --- a/cores/esp8266/Stream.h +++ b/cores/esp8266/Stream.h @@ -168,7 +168,7 @@ class Stream: public Print { // transfers already buffered / immediately available data (no timeout) // returns number of transfered bytes - size_t sendAvailable (Print* to) { return sendGeneric(to, -1, -1, oneShotMs::alwaysExpired); } + size_t sendAvailable (Print* to) { return sendGeneric(to, -1, -1, 0); } size_t sendAvailable (Print& to) { return sendAvailable(&to); } // transfers data until timeout