/* * threads_basethread.hpp * * Created on: Jun 11, 2021 * Author: erki */ #ifndef SKULLC_THREADS_PRIMITIVETHREAD_HPP_ #define SKULLC_THREADS_PRIMITIVETHREAD_HPP_ #include #include #include #include namespace Threads { class PrimitiveThread { public: PrimitiveThread() = delete; PrimitiveThread(const PrimitiveThread&) = default; PrimitiveThread(PrimitiveThread&&) = default; PrimitiveThread& operator=(const PrimitiveThread&) = default; PrimitiveThread& operator=(PrimitiveThread&&) = default; explicit PrimitiveThread(osThreadFunc_t function, void* runner_data, const osThreadAttr_t& attrs); template PrimitiveThread(F runner, void* runner_data, const char* name, const osPriority_t priority, const std::uint32_t stack_size) : PrimitiveThread(runner, runner_data, constructThreadAttrs_(name, priority, stack_size)) { static_assert(std::is_convertible_v, "Run function F is not convertible to osThreadFunc_t (void (void*))."); } osThreadId_t thread_id; osThreadAttr_t attributes; #ifdef INCLUDE_xTaskGetCurrentTaskHandle static PrimitiveThread getCurrentThread(); #endif [[nodiscard]] constexpr TaskHandle_t taskHandle() const { return static_cast(thread_id); } [[nodiscard]] BaseType_t notify(const long value, const eNotifyAction action); /** * * @returns Tuple. First member indicating the return value of the underlying notify * function, the second member indicating whether a higher priority task was awoken. * */ [[nodiscard]] std::pair notifyFromIsr(const long value, const eNotifyAction action); void yield(); void sleep(const unsigned long delay); void sleepUntil(const unsigned long deadline); [[nodiscard]] bool notifyWait(const TickType_t delay) const; [[nodiscard]] std::pair notifyWait(const TickType_t delay, const unsigned long set_on_entry, const unsigned long set_on_exit) const; private: void* runner_data_ = nullptr; explicit PrimitiveThread(TaskHandle_t threadHandle); osThreadAttr_t constructThreadAttrs_(const char* name, const osPriority_t priority, const std::uint32_t stack_size); }; inline bool operator==(const PrimitiveThread& lhs, const PrimitiveThread& rhs) { if (!lhs.thread_id || !rhs.thread_id) return false; return lhs.thread_id == rhs.thread_id; } }// namespace Threads #endif /* SKULLC_THREADS_PRIMITIVETHREAD_HPP_ */