diff --git a/Threads/Inc/threads_signal_mux.hpp b/Threads/Inc/threads_signal_mux.hpp new file mode 100644 index 0000000..fdd0ba8 --- /dev/null +++ b/Threads/Inc/threads_signal_mux.hpp @@ -0,0 +1,70 @@ +/* + * threads_signal_mux.hpp + * + * Created on: Jun 26, 2021 + * Author: erki + */ + +#ifndef SKULLC_THREADS_SIGNAL_MUX_HPP_ +#define SKULLC_THREADS_SIGNAL_MUX_HPP_ + +#include "threads_signal.hpp" + +#include +#include + +namespace Threads +{ + +template +struct SignalMux : Signallable +{ + std::tuple signals; + + SignalMux(Ss... args) + : signals(std::make_tuple(args...)) + {} + + SignalMux(Ss&&... args) + : signals(std::make_tuple(args...)) + {} + + void emit(const T& t) override + { + std::apply([&t](auto&... sig) { (..., sig.emit(t)); }, signals); + } + + BaseType_t emitFromIsr(const T& t) override + { + BaseType_t higher_was_awoken = pdFALSE; + + auto emitSignal = [&higher_was_awoken, &t](auto& sig) { + const BaseType_t awoken = sig.emitFromIsr(t); + higher_was_awoken = awoken || higher_was_awoken; + }; + + std::apply([&t, &emitSignal](auto&... sig) { + (..., emitSignal(sig)); + }, + signals); + + return higher_was_awoken; + } +}; + +template +SignalMux makeSignalMux(Ss&&... args) +{ + return SignalMux(std::forward(args...)); +} + +template +SignalMux makeSignalMux(Ss... args) +{ + return SignalMux(args...); +} + +}// namespace Threads + + +#endif /* SKULLC_THREADS_SIGNAL_MUX_HPP_ */