Browse Source

utils: return blocking delay condition result

network/test
Maxim Prokhorov 1 year ago
parent
commit
c091bc01dd
3 changed files with 31 additions and 23 deletions
  1. +11
    -9
      code/espurna/system.cpp
  2. +18
    -11
      code/espurna/system.h
  3. +2
    -3
      code/espurna/wifi.cpp

+ 11
- 9
code/espurna/system.cpp View File

@ -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 <typename T>
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<T>(condition));
}
template <typename Condition, typename Action>
@ -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


+ 18
- 11
code/espurna/system.h View File

@ -188,24 +188,31 @@ inline void delay(CoreClock::duration value) {
bool tryDelay(CoreClock::time_point start, CoreClock::duration timeout, CoreClock::duration interval);
template <typename T>
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


+ 2
- 3
code/espurna/wifi.cpp View File

@ -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();
}


Loading…
Cancel
Save