|
GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
|
IO的基础组件。 更多...
IO的基础组件。
提供基础的IO处理类,包括裸IO和带键值的IO。 我们把电控中的IO分为两类:裸IO和带键值的IO。
在文件 base.hpp 中定义.
#include <algorithm>#include <array>#include <concepts>#include <cstddef>#include <cstring>#include <functional>#include <span>#include <tuple>#include <type_traits>#include <map>#include <memory>#include <optional>#include <stdexcept>#include <utility>#include "core/async.hpp"#include "utils/callback.hpp"#include "utils/utils.hpp"#include "utils/concepts.hpp"

类 | |
| class | roboctrl::io::bare_io_base |
| 裸IO组件。 更多... | |
| class | roboctrl::io::keyed_io_base< TK > |
| 带 key 的 IO 基类,根据键值派发数据。 更多... | |
| struct | roboctrl::io::combined_parser< parser_types > |
| 组合式解析器,可顺序堆叠多个数据解析单元。 更多... | |
| struct | roboctrl::io::nbytes< N > |
| 固定长度字节解析器。 更多... | |
| struct | roboctrl::io::struct_data< T > |
| 平凡结构体解析器。 更多... | |
| struct | roboctrl::io::fixed_data< bytes > |
| 固定内容匹配解析器。 更多... | |
| struct | roboctrl::io::other_all |
| 吃掉剩余全部数据的解析器。 更多... | |
概念 | |
| concept | roboctrl::io::detail::typed_callback_fn |
| concept | roboctrl::io::bare_io |
| 裸 IO 概念,要求具备 send/task 协程接口。 | |
| concept | roboctrl::io::keyed_io |
| 带 key 的 IO 概念,要求具备 send/task 协程接口。 | |
| concept | roboctrl::io::data_parser |
| 数据解析器概念,负责按需消费字节并返回结果。 | |
类型定义 | |
| using | roboctrl::io::data_ptr = std::shared_ptr< const std::vector< std::byte > > |
| 只读共享数据缓冲。 | |
| using | roboctrl::io::byte_span = std::span< const std::byte > |
| 只读 byte span。 | |
| template<typename Fn > | |
| using | roboctrl::io::detail::typed_callback_arg_t = utils::function_arg_t< Fn > |
函数 | |
| template<typename Fn > | |
| awaitable< void > | roboctrl::io::detail::invoke_raw_callback (Fn &fn, data_ptr data) |
| template<typename Arg , typename Fn > | |
| awaitable< void > | roboctrl::io::detail::invoke_typed_callback (Fn &fn, byte_span bytes) |
| 解析 typed payload,并让解析结果覆盖异步回调的完整执行期。 | |
| template<utils::byte_container T> | |
| data_ptr | roboctrl::io::make_shared_from (const T &t) |
| 将任意满足 byte_container 的数据拷贝到共享缓冲。 | |
| template<bare_io io_type> | |
| awaitable< void > | roboctrl::io::send (io_type &io, byte_span data) |
| 发送原始字节流,适配任意裸 IO。 | |
| template<bare_io io_type> | |
| awaitable< void > | roboctrl::io::send (const typename io_type::info_type::key_type &key, byte_span data) |
| 发送原始字节流,适配任意裸 IO。 | |
| template<bare_io io_type, utils::package T> requires (!std::same_as<T, byte_span>) | |
| awaitable< void > | roboctrl::io::send (io_type &io, T pkg) |
| 发送平凡类型数据,会自动转为字节流发送。 | |
| template<bare_io io_type, utils::package T> requires (!std::same_as<T, byte_span>) | |
| awaitable< void > | roboctrl::io::send (typename io_type::info_type::key_type key, T pkg) |
| 发送平凡类型数据,会自动转为字节流发送。 | |
| using roboctrl::io::byte_span = typedef std::span<const std::byte> |
| using roboctrl::io::data_ptr = typedef std::shared_ptr<const std::vector<std::byte> > |
| using roboctrl::io::detail::typed_callback_arg_t = typedef utils::function_arg_t<Fn> |
| awaitable< void > roboctrl::io::detail::invoke_raw_callback | ( | Fn & | fn, |
| data_ptr | data | ||
| ) |
| awaitable< void > roboctrl::io::detail::invoke_typed_callback | ( | Fn & | fn, |
| byte_span | bytes | ||
| ) |
解析 typed payload,并让解析结果覆盖异步回调的完整执行期。
asio::awaitable 是惰性协程。若直接把 from_bytes() 返回的临时对象传给 异步回调,回调真正开始执行前该对象就可能已经析构。这里把解析结果保存在 当前协程帧中,并等待用户回调完成后才释放。
| data_ptr roboctrl::io::make_shared_from | ( | const T & | t | ) |
将任意满足 byte_container 的数据拷贝到共享缓冲。
| t | 输入缓冲 |
引用了 roboctrl::io::make_shared_from().
被这些函数引用 roboctrl::io::bare_io_base::dispatch(), roboctrl::io::keyed_io_base< TK >::dispatch(), roboctrl::io::make_shared_from() , 以及 roboctrl::io::serial::task().
| awaitable< void > roboctrl::io::send | ( | const typename io_type::info_type::key_type & | key, |
| byte_span | data | ||
| ) |
| awaitable< void > roboctrl::io::send | ( | io_type & | io, |
| byte_span | data | ||
| ) |
发送原始字节流,适配任意裸 IO。
示例:
引用了 roboctrl::io::send().
被这些函数引用 roboctrl::io::send(), roboctrl::io::send(), roboctrl::io::send() , 以及 roboctrl::io::send().
| awaitable< void > roboctrl::io::send | ( | io_type & | io, |
| T | pkg | ||
| ) |
| awaitable< void > roboctrl::io::send | ( | typename io_type::info_type::key_type | key, |
| T | pkg | ||
| ) |