20#include <idfxx/chrono>
23#include <idfxx/memory>
26#include <freertos/FreeRTOS.h>
27#include <freertos/task.h>
32#include <system_error>
79 [[nodiscard]]
const char*
name() const noexcept override final;
82 [[nodiscard]] std::
string message(
int ec) const override final;
91 [[nodiscard]]
bool equivalent(
int code, const std::error_condition& condition) const noexcept override final;
102 explicit self(context* ctx) noexcept
143 void wait() noexcept;
159 template<typename Rep, typename Period>
160 bool wait_for(const std::chrono::duration<Rep, Period>&
timeout) noexcept {
178 template<
typename Clock,
typename Duration>
179 bool wait_until(
const std::chrono::time_point<Clock, Duration>& deadline)
noexcept {
180 auto remaining = deadline - Clock::now();
181 if (remaining <=
decltype(remaining)::zero()) {
182 return _take(0) != 0;
215 template<typename Rep, typename Period>
216 uint32_t take_for(const std::chrono::duration<Rep, Period>&
timeout) noexcept {
235 template<
typename Clock,
typename Duration>
236 uint32_t
take_until(
const std::chrono::time_point<Clock, Duration>& deadline)
noexcept {
237 auto remaining = deadline - Clock::now();
238 if (remaining <=
decltype(remaining)::zero()) {
273 [[nodiscard]] std::
string name() const;
283 uint32_t _take(TickType_t ticks) noexcept;
293 std::string_view
name =
"task";
294 size_t stack_size = 4096;
296 std::optional<core_id> core_affinity = std::nullopt;
310 [[nodiscard]]
explicit task(
const config& cfg, std::move_only_function<
void(
self&)> task_func);
352 [[nodiscard]] TaskHandle_t
idf_handle() const noexcept {
return _handle; }
359 [[nodiscard]]
const std::string&
name() const noexcept {
return _name; }
393 [[nodiscard]]
bool joinable() const noexcept {
return _handle !=
nullptr; }
414#ifdef CONFIG_COMPILER_CXX_EXCEPTIONS
470#ifdef CONFIG_COMPILER_CXX_EXCEPTIONS
523#ifdef CONFIG_COMPILER_CXX_EXCEPTIONS
543#ifdef CONFIG_COMPILER_CXX_EXCEPTIONS
572#ifdef CONFIG_COMPILER_CXX_EXCEPTIONS
624#ifdef CONFIG_COMPILER_CXX_EXCEPTIONS
653 template<
typename Rep,
typename Period>
671 template<
typename Clock,
typename Duration>
672 void join_until(
const std::chrono::time_point<Clock, Duration>& deadline) {
708 template<
typename Rep,
typename Period>
729 template<
typename Clock,
typename Duration>
731 auto remaining = deadline - Clock::now();
732 if (remaining <=
decltype(remaining)::zero()) {
747 [[nodiscard]]
static TaskHandle_t
current_handle() noexcept {
return xTaskGetCurrentTaskHandle(); }
754 [[nodiscard]]
static std::string
current_name() {
return pcTaskGetName(
nullptr); }
757 static void trampoline(
void* arg);
759 static TaskHandle_t _create(context* ctx,
const config& cfg,
const char*
name);
761 void _stop_and_delete() noexcept;
762 [[nodiscard]]
bool _is_running() const noexcept;
764 explicit
task(TaskHandle_t handle, std::
string name, context* ctx);
766 TaskHandle_t _handle =
nullptr;
768 context* _context =
nullptr;
796struct is_error_code_enum<
idfxx::task::errc> : true_type {};
Error category for IDFXX and ESP-IDF error codes.
Type-safe set of flags from a scoped enum.
Error category for task errors.
const char * name() const noexcept override final
Returns the name of the error category.
bool equivalent(int code, const std::error_condition &condition) const noexcept override final
Tests whether an errc value is equivalent to a standard condition.
std::string message(int ec) const override final
Returns a human-readable message for the given error code.
Handle for task self-interaction.
task_priority priority() const noexcept
Returns the current task priority.
bool wait_until(const std::chrono::time_point< Clock, Duration > &deadline) noexcept
Waits for a notification until a deadline (binary semaphore pattern).
uint32_t take_until(const std::chrono::time_point< Clock, Duration > &deadline) noexcept
Takes accumulated notifications until a deadline (counting semaphore pattern).
self(const self &)=delete
bool is_detached() const noexcept
Checks if the current task has been detached.
self & operator=(const self &)=delete
uint32_t take() noexcept
Takes accumulated notifications (counting semaphore pattern).
Type-safe wrapper for FreeRTOS task priority values.
Task lifecycle management.
result< void > try_resume()
Resumes a suspended task.
void join(const std::chrono::duration< Rep, Period > &timeout)
Blocks until the task function completes or the timeout expires.
static TaskHandle_t current_handle() noexcept
Returns the handle of the currently executing task.
void join()
Blocks until the task function completes.
result< void > try_detach()
Releases ownership of the task.
void notify()
Sends a notification to the task.
const std::string & name() const noexcept
Returns the task name.
bool stop_requested() const noexcept
Checks if a stop has been requested for this task.
errc
Error codes for task operations.
bool notify_from_isr() noexcept
Sends a notification to the task from ISR context.
void resume()
Resumes a suspended task.
result< void > try_join()
Blocks until the task function completes.
task_priority priority() const noexcept
Returns the current task priority.
task & operator=(const task &)=delete
void detach()
Releases ownership of the task.
void suspend()
Suspends the task.
result< void > try_kill()
Immediately terminates the task without waiting for completion.
result< void > try_join_until(const std::chrono::time_point< Clock, Duration > &deadline)
Blocks until the task function completes or the deadline is reached.
static void spawn(config cfg, std::move_only_function< void(self &)> task_func)
Creates a fire-and-forget task with a std::move_only_function callback.
task(const task &)=delete
void kill()
Immediately terminates the task without waiting for completion.
task(task &&other) noexcept
result< void > try_notify()
Sends a notification to the task.
static std::string current_name()
Returns the name of the currently executing task.
result< void > try_join(const std::chrono::duration< Rep, Period > &timeout)
Blocks until the task function completes or the timeout expires.
bool is_completed() const noexcept
Checks if the task function has returned.
bool joinable() const noexcept
Checks if this task object owns the task.
result< void > try_set_priority(task_priority new_priority)
Changes the task priority.
~task()
Destroys the task, requesting stop and blocking until the task function completes.
bool request_stop() noexcept
Requests the task to stop.
void set_priority(task_priority new_priority)
Changes the task priority.
bool resume_from_isr() noexcept
Resumes a suspended task from ISR context.
result< void > try_suspend()
Suspends the task.
TaskHandle_t idf_handle() const noexcept
Returns the underlying FreeRTOS task handle.
task(const config &cfg, std::move_only_function< void(self &)> task_func)
Creates a task with a std::move_only_function callback.
task & operator=(task &&other) noexcept
void join_until(const std::chrono::time_point< Clock, Duration > &deadline)
Blocks until the task function completes or the deadline is reached.
size_t stack_high_water_mark() const noexcept
Returns the minimum free stack space (in bytes) since the task started.
constexpr TickType_t ticks(const std::chrono::duration< Rep, Period > &d)
Converts a std::chrono duration to TickType_t ticks.
@ dram
Internal DRAM (8-bit accessible)
const task::error_category & task_category() noexcept
Returns a reference to the task error category singleton.
std::error_code make_error_code(errc e) noexcept
Creates a std::error_code from an idfxx::errc value.
T unwrap(result< T > result)
Throws a std::system_error if the result is an error.
@ timeout
Operation timed out.
std::expected< T, std::error_code > result
result type wrapping a value or error code.
Task configuration parameters.