From c091bc01dd4ff421ce70c87e57782415e6305771 Mon Sep 17 00:00:00 2001 From: Maxim Prokhorov Date: Fri, 7 Apr 2023 14:43:54 +0300 Subject: [PATCH] utils: return blocking delay condition result --- code/espurna/system.cpp | 20 +++++++++++--------- code/espurna/system.h | 29 ++++++++++++++++++----------- code/espurna/wifi.cpp | 5 ++--- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/code/espurna/system.cpp b/code/espurna/system.cpp index 48010057..aa4a9e52 100644 --- a/code/espurna/system.cpp +++ b/code/espurna/system.cpp @@ -173,9 +173,8 @@ extern "C" bool fpm_rf_is_closed(void); // We have to wait for certain {F,}PM changes that happen in SDK system idle task template bool wait_for_fpm(duration::Milliseconds timeout, T&& condition) { - time::blockingDelay( - timeout, duration::Milliseconds{ 1 }, condition); - return condition(); + return time::blockingDelay( + timeout, duration::Milliseconds{ 1 }, std::forward(condition)); } template @@ -632,14 +631,17 @@ bool tryDelay(CoreClock::time_point start, CoreClock::duration timeout, CoreCloc return true; } -void blockingDelay(CoreClock::duration timeout, CoreClock::duration interval) { - blockingDelay(timeout, interval, []() { - return true; - }); +bool blockingDelay(CoreClock::duration timeout, CoreClock::duration interval) { + return blockingDelay( + timeout, + interval, + []() { + return true; + }); } -void blockingDelay(CoreClock::duration timeout) { - blockingDelay(timeout, timeout); +bool blockingDelay(CoreClock::duration timeout) { + return blockingDelay(timeout, timeout); } } // namespace time diff --git a/code/espurna/system.h b/code/espurna/system.h index 0fb09538..0c984ead 100644 --- a/code/espurna/system.h +++ b/code/espurna/system.h @@ -188,24 +188,31 @@ inline void delay(CoreClock::duration value) { bool tryDelay(CoreClock::time_point start, CoreClock::duration timeout, CoreClock::duration interval); template -void blockingDelay(CoreClock::duration timeout, CoreClock::duration interval, T&& blocked) { - const auto start = CoreClock::now(); - for (;;) { - if (tryDelay(start, timeout, interval)) { - break; - } - - if (!blocked()) { - break; +bool blockingDelay(CoreClock::duration timeout, CoreClock::duration interval, T&& blocked) { + auto result = blocked(); + + if (result) { + const auto start = CoreClock::now(); + for (;;) { + if (tryDelay(start, timeout, interval)) { + break; + } + + result = blocked(); + if (!result) { + break; + } } } + + return result; } // Local implementation of 'delay' that will make sure that we wait for the specified // time, even after being woken up. Allows to service Core tasks that are scheduled // in-between context switches, where the interval controls the minimum sleep time. -void blockingDelay(CoreClock::duration timeout, CoreClock::duration interval); -void blockingDelay(CoreClock::duration timeout); +bool blockingDelay(CoreClock::duration timeout, CoreClock::duration interval); +bool blockingDelay(CoreClock::duration timeout); } // namespace time diff --git a/code/espurna/wifi.cpp b/code/espurna/wifi.cpp index ad13ec9f..a19e601f 100644 --- a/code/espurna/wifi.cpp +++ b/code/espurna/wifi.cpp @@ -278,14 +278,13 @@ void ensure_opmode(uint8_t mode) { const auto current = wifi_get_opmode(); wifi_set_opmode_current(mode); - espurna::time::blockingDelay( + const auto result = espurna::time::blockingDelay( espurna::duration::Seconds(1), espurna::duration::Milliseconds(10), [&]() { return !is_set(); }); - - if (!is_set()) { + if (result) { abort(); }