GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
base.hpp 文件参考

IO的基础组件。 更多...

详细描述

IO的基础组件。

作者
Junity

提供基础的IO处理类,包括裸IO和带键值的IO。 我们把电控中的IO分为两类:裸IO和带键值的IO。

版本
0.1
日期
2025-11-09

在文件 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"
base.hpp 的引用(Include)关系图:
此图展示该文件直接或间接的被哪些文件引用了:

浏览源代码.

类

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)
 发送平凡类型数据,会自动转为字节流发送。
 

类型定义说明

◆ byte_span

using roboctrl::io::byte_span = typedef std::span<const std::byte>

只读 byte span。

在文件 base.hpp 第 45 行定义.

◆ data_ptr

using roboctrl::io::data_ptr = typedef std::shared_ptr<const std::vector<std::byte> >

只读共享数据缓冲。

在文件 base.hpp 第 40 行定义.

◆ typed_callback_arg_t

template<typename Fn >
using roboctrl::io::detail::typed_callback_arg_t = typedef utils::function_arg_t<Fn>

在文件 base.hpp 第 60 行定义.

函数说明

◆ invoke_raw_callback()

template<typename Fn >
awaitable< void > roboctrl::io::detail::invoke_raw_callback ( Fn &  fn,
data_ptr  data 
)

在文件 base.hpp 第 50 行定义.

◆ invoke_typed_callback()

template<typename Arg , typename Fn >
awaitable< void > roboctrl::io::detail::invoke_typed_callback ( Fn &  fn,
byte_span  bytes 
)

解析 typed payload,并让解析结果覆盖异步回调的完整执行期。

asio::awaitable 是惰性协程。若直接把 from_bytes() 返回的临时对象传给 异步回调,回调真正开始执行前该对象就可能已经析构。这里把解析结果保存在 当前协程帧中,并等待用户回调完成后才释放。

在文件 base.hpp 第 76 行定义.

引用了 roboctrl::io::detail::invoke_typed_callback().

被这些函数引用 roboctrl::io::detail::invoke_typed_callback().

◆ make_shared_from()

template<utils::byte_container T>
data_ptr roboctrl::io::make_shared_from ( const T &  t)

将任意满足 byte_container 的数据拷贝到共享缓冲。

参数
t输入缓冲

在文件 base.hpp 第 94 行定义.

引用了 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().

◆ send() [1/4]

template<bare_io io_type>
awaitable< void > roboctrl::io::send ( const typename io_type::info_type::key_type &  key,
byte_span  data 
)

发送原始字节流,适配任意裸 IO。

示例:

co_await send<io::udp>("xxx",data);

在文件 base.hpp 第 408 行定义.

引用了 roboctrl::io::send().

◆ send() [2/4]

template<bare_io io_type>
awaitable< void > roboctrl::io::send ( io_type &  io,
byte_span  data 
)

发送原始字节流,适配任意裸 IO。

示例:

co_await send(io,data);

在文件 base.hpp 第 395 行定义.

引用了 roboctrl::io::send().

被这些函数引用 roboctrl::io::send(), roboctrl::io::send(), roboctrl::io::send() , 以及 roboctrl::io::send().

◆ send() [3/4]

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 
)

发送平凡类型数据,会自动转为字节流发送。

示例:

co_await send(io,pkg);

在文件 base.hpp 第 423 行定义.

引用了 roboctrl::io::send().

◆ send() [4/4]

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 
)

发送平凡类型数据,会自动转为字节流发送。

示例:

co_await send<io::udp>("xxx",pkg);

在文件 base.hpp 第 438 行定义.

引用了 roboctrl::io::send().