10#include "roo_scheduler.h"
23 const char* key, T default_value = T(),
24 uint8_t stable_write_latency_s = 2,
25 uint8_t unstable_write_latency_s = 10);
31 bool set(
const T& value);
36 bool has_pending_write()
const {
return flusher_.is_scheduled(); }
40 uint8_t stable_write_latency_s_;
41 uint8_t unstable_write_latency_s_;
43 roo_scheduler::SingletonTask flusher_;
44 uint32_t last_write_ms_;
45 uint32_t last_change_ms_;
62 roo_scheduler::Scheduler& scheduler,
63 const char* key, T default_value,
64 uint8_t stable_write_latency_s,
65 uint8_t unstable_write_latency_s)
66 : pref_(collection, key, std::move(default_value)),
67 stable_write_latency_s_(stable_write_latency_s),
68 unstable_write_latency_s_(unstable_write_latency_s),
69 flusher_(scheduler, [this]() { maybeFlush(); }) {
70 if (unstable_write_latency_s_ < stable_write_latency_s_) {
71 unstable_write_latency_s_ = stable_write_latency_s_;
77 return has_pending_write() || pref_.isSet();
82 return has_pending_write() ? pending_write_ : pref_.get();
87 if (pending_write_ == value)
return true;
88 pending_write_ = value;
89 last_change_ms_ = roo_time::Uptime::Now().inMillis();
90 if (!has_pending_write()) {
91 flusher_.scheduleAfter(roo_time::Seconds(stable_write_latency_s_));
98 uint32_t now = roo_time::Uptime::Now().inMillis();
99 uint32_t ms_elapsed_since_last_write_s = (now - last_write_ms_) / 1000;
100 uint32_t ms_elapsed_since_last_change_s = (now - last_change_ms_) / 1000;
101 if (ms_elapsed_since_last_write_s >= unstable_write_latency_s_ ||
102 ms_elapsed_since_last_change_s >= stable_write_latency_s_) {
103 if (pref_.set(pending_write_)) {
104 last_write_ms_ = now;
109 flusher_.scheduleAfter(roo_time::Seconds(stable_write_latency_s_),
110 roo_scheduler::PRIORITY_BACKGROUND);
115 return pref_.
clear();
Collection corresponds to a preferences namespace. Use it to group related preferences.
LazyWritePref(Collection &collection, roo_scheduler::Scheduler &scheduler, const char *key, T default_value=T(), uint8_t stable_write_latency_s=2, uint8_t unstable_write_latency_s=10)
Creates a lazy-write preference. The data is flushed to persistent storage using scheduler,...
Persistent preference of a specific type. The preference will store its value in the preferences coll...
Similar to Pref<T>, but does not immediately store written data in persistent storage....