From c81a96973d674df004678937dbda03a049b33f5d Mon Sep 17 00:00:00 2001 From: heck Date: Sun, 6 Oct 2024 03:58:54 +0200 Subject: [PATCH] Utils: Add Cache` - ft. notify_change_callback Add DigitalIn --- src/utils.hh | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/src/utils.hh b/src/utils.hh index f9229de..ce49ce7 100644 --- a/src/utils.hh +++ b/src/utils.hh @@ -174,4 +174,110 @@ namespace Heck { DeliverCallback deliver_cb_{}; }; } // namespace Heck + +namespace Heck { + template class Cache { + + public: + using UpdateCallback = std::function; + using NotifyChangeCallback = std::function&)>; + + Cache() = delete; + ~Cache() = default; + + explicit Cache(UpdateCallback update_cb, NotifyChangeCallback notify_change_cb) + { + init(update_cb, notify_change_cb); + } + + Cache(Cache&) = delete; + Cache& operator=(Cache) = delete; + + Cache(Cache&&) = delete; + Cache& operator=(Cache&&) = delete; + + T read() + { + return val_current_; + } + + void set_update_callback(UpdateCallback cb) + { + update_cb_ = cb; + } + + void set_notify_change_callback(NotifyChangeCallback cb) + { + notify_change_cb_ = cb; + } + + bool update_and_notify_change() + { + T val_fetched{ update_cb_() }; + if (val_fetched != val_current_) { + val_current_ = val_fetched; + notify_change_cb_(*this); + return true; + } + return false; + } + + bool update_and_notify_change_fuzzy(T min_deviation) + { + T val_fetched{ update_cb_() }; + if (std::abs(val_fetched - val_current_) >= min_deviation) { + val_current_ = val_fetched; + notify_change_cb_(*this); + return true; + } + return false; + } + + private: + void init(UpdateCallback fetch_cb, NotifyChangeCallback deliver_cb) + { + set_update_callback(fetch_cb); + set_notify_change_callback(deliver_cb); + } + + T val_current_{}; + UpdateCallback update_cb_{}; + NotifyChangeCallback notify_change_cb_{}; + }; + + struct DigitalIn { + public: + DigitalIn() = default; + ~DigitalIn() = default; + + DigitalIn(u8 daisy_pin) + { + init(daisy_pin); + } + + DigitalIn(DigitalIn&) = delete; + DigitalIn& operator=(DigitalIn&) = delete; + + DigitalIn(DigitalIn&&) = delete; + DigitalIn& operator=(DigitalIn&&) = delete; + + void init(u8 daisy_pin) + { + gpio_.Init(ld::DaisySeed::GetPin(daisy_pin), ld::GPIO::Mode::INPUT, ld::GPIO::Pull::PULLUP); + } + + bool read() + { + return !gpio_.Read(); + } + + Cache cache{ [&]() -> bool { return read(); }, [](Cache&) {} }; + + private: + + ld::GPIO gpio_{}; + }; + + +} // namespace Heck #endif // HECK_DAISY_UTILS_HH` \ No newline at end of file