GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
callback.hpp
浏览该文件的文档.
1
6#pragma once
7
8#include <concepts>
9#include <functional>
10#include <exception>
11#include <type_traits>
12#include <tuple>
13#include <vector>
14#include <utility>
15
16#include "core/async.hpp"
17
18namespace roboctrl {
19
26template<typename F, typename... Args>
27concept callback_fn = std::invocable<F, Args...> &&
28 (std::same_as<std::invoke_result_t<F, Args...>, void> ||
29 std::same_as<std::invoke_result_t<F, Args...>, awaitable<void>>);
30
35template<typename... Args>
36class callback {
37public:
38 callback() = default;
39
44 void operator()(Args... args) const {
45 // Coroutine parameters are owned by the frame. A temporary capturing
46 // coroutine lambda would retain a dangling pointer to its closure.
47 roboctrl::spawn(invoke_callbacks(fns_, std::make_tuple(std::move(args)...)));
48 }
49
54 template<callback_fn<Args...> F>
55 void add(F&& f) {
56 using result_t = std::invoke_result_t<F, Args...>;
57 if constexpr (std::same_as<result_t, awaitable<void>>) {
58 fns_.push_back(std::function<awaitable<void>(Args...)>(std::forward<F>(f)));
59 } else {
60 fns_.push_back(std::function<awaitable<void>(Args...)>(
61 [fn = std::forward<F>(f)](Args... args) mutable -> awaitable<void> {
62 fn(args...);
63 co_return;
64 }
65 ));
66 }
67 }
68
69private:
70 static awaitable<void> invoke_callbacks(
71 std::vector<std::function<awaitable<void>(Args...)>> fns,
72 std::tuple<std::decay_t<Args>...> call_args) {
73 for (auto& fn : fns) {
74 try {
75 co_await std::apply(fn, call_args);
76 } catch (const std::exception& error) {
77 logger::instance().log_error("callback failed: {}", error.what());
78 } catch (...) {
79 logger::instance().log_error("callback failed with an unknown exception");
80 }
81 }
82 }
83
84 std::vector<std::function<awaitable<void>(Args...)>> fns_;
85};
86
87} // namespace roboctrl
异步任务上下文组件。
管理一组协程回调的容器。
Definition callback.hpp:36
void add(F &&f)
添加一个新的回调。
Definition callback.hpp:55
void operator()(Args... args) const
触发所有回调。
Definition callback.hpp:44
约束回调类型可被调用且返回 void 或 awaitable<void>。
Definition callback.hpp:27
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:191
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46