1
0
Fork 0

use the same callback runner for all callback types

This commit is contained in:
Kevin Matz 2022-12-06 13:35:18 -05:00
parent 5ad7b5505e
commit e7297c42ff
2 changed files with 18 additions and 39 deletions

View File

@ -123,7 +123,7 @@ void Universe::setData(const std::vector<uint8_t>& data)
null_start_mutex.unlock(); // free the lock
rx_timeout_(true); // update rx times
doDataCallbacks(); // notify callbacks
do_callbacks_(cb_dataChange); // run callbacks
}
@ -178,7 +178,7 @@ void Universe::setStatus(uint8_t val)
return;
status_ = val;
doStatusCallbacks();
do_callbacks_(cb_statusChange);
}
@ -198,26 +198,6 @@ std::shared_ptr<void> Universe::onStatusChange(const std::function<void(Universe
}
/**
* @brief Universe::doStatusCallbacks
*/
void Universe::doStatusCallbacks()
{
for (auto it = cb_statusChange.begin(); it != cb_statusChange.end();)
{
if (auto sp = it->lock())
{ // if the caller is still holding the token
(*sp)();
++it;
}
else
{ // or remove the callback
it = cb_statusChange.erase(it);
}
}
}
/**
* @brief Universe::setValue
* @param address
@ -259,7 +239,7 @@ void Universe::setValue(const uint16_t start, const uint16_t footprint,
setStatus(DMX_ACTIVE);
last_updated_ = std::chrono::system_clock::now();
doDataCallbacks();
do_callbacks_(cb_dataChange);
}
@ -268,10 +248,10 @@ void Universe::setValue(const uint16_t start, const uint16_t footprint,
* @param cb
* @return
*/
std::shared_ptr<void> Universe::onDataChange(const DataHandler cb)
std::shared_ptr<void> Universe::onDataChange(const std::function<void(Universe*)> cb)
{
// wrap the callback with a shared pointer
auto sp = std::make_shared<DataHandler>(std::move(cb));
auto sp = std::make_shared<std::function<void(Universe*)>>(std::move(cb));
// add callback to list (as a weak pointer)
cb_dataChange.push_back(sp);
// return token that caller must keep throughout it's scope
@ -280,20 +260,21 @@ std::shared_ptr<void> Universe::onDataChange(const DataHandler cb)
/**
* @brief Universe::doDataCallbacks
* @brief Universe::doCallbacks
* @param callbacks
*/
void Universe::doDataCallbacks()
void Universe::do_callbacks_(std::vector<std::weak_ptr<const std::function<void(Universe*)>>> & callbacks)
{
for (auto it = cb_dataChange.begin(); it != cb_dataChange.end();)
for (auto it = callbacks.begin(); it != callbacks.end();)
{
if (auto sp = it->lock())
{ // if the caller is still holding the token
{ // the owner is still holding the token
(*sp)(this);
++it;
}
else
{ // or remove the callback
it = cb_dataChange.erase(it);
{ // the owner has released the token
it = callbacks.erase(it);
}
}
}

View File

@ -35,9 +35,7 @@
namespace DMX {
class Universe; // forward declare the Univserse class
using DimmerData = std::array<uint8_t, E111_LAST_SLOT + 1>; //!< Array of 513 bytes for basic data.
using DataHandler = std::function<void(Universe *)>; //!< Callback function for data handling.
/**
* @brief The Universe class
@ -60,10 +58,10 @@ class Universe {
const uint8_t* data);
void setData (const std::vector<uint8_t> &);
std::shared_ptr<void> onDataChange (const DataHandler);
virtual void altSCdata(const std::vector<uint8_t> &);
std::shared_ptr<void> onDataChange(const std::function<void(Universe*)>);
/**
* @brief The Status enum
*/
@ -78,22 +76,22 @@ class Universe {
virtual uint8_t status();
protected:
void doDataCallbacks() {do_callbacks_(cb_dataChange);} //!< Run Data Change Callbacks
void doStatusCallbacks() {do_callbacks_(cb_statusChange);} //!< Run Status Change Callbacks
DimmerData null_start_data; //!< NULL Start Code data
mutable std::mutex null_start_mutex; //!< memory protect Null Start data
void doDataCallbacks(); //!< execute data changed callbacks
void doStatusCallbacks(); //!< execute status changed callbacks
std::chrono::system_clock::time_point last_updated_; //!< time of the latest update
private:
std::queue<std::chrono::time_point<std::chrono::system_clock>> rx_times_;
void rx_timeout_(bool add_now = false);
void do_callbacks_(std::vector<std::weak_ptr<const std::function<void(Universe*)>>>&);
const int rx_timeout_period_;
uint8_t status_; //!< the operating state of the universe
std::vector<std::weak_ptr<DataHandler>> cb_dataChange;
std::vector<std::weak_ptr<const std::function<void(Universe*)>>> cb_dataChange;
std::vector<std::weak_ptr<const std::function<void(Universe*)>>> cb_statusChange;
};