GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
udp.cpp
1#include "io/udp.h"
2#include "core/async.hpp"
3#include "io/base.hpp"
4
5#include <stdexcept>
6
7using namespace roboctrl::io;
8
10 : bare_io_base{},
11 socket_{roboctrl::executor()},
12 write_queue_{[this](byte_span data) -> awaitable<void> {
13 const auto sent = co_await socket_.async_send(asio::buffer(data), asio::use_awaitable);
14 if (sent != data.size()) {
15 throw std::runtime_error("short UDP datagram write");
16 }
17 }},
18 info_{info}
19{
20 auto endpoint = asio::ip::udp::endpoint(asio::ip::make_address(info.address),info.port);
21 socket_.connect(endpoint);
22}
23
24void udp::start() {
25 if (started_) {
26 return;
27 }
28 started_ = true;
30}
31
33{
34 co_await write_queue_.send(data);
35}
36
38{
39 try {
40 while(true){
41 auto bytes = co_await socket_.async_receive(asio::buffer(buffer_),asio::use_awaitable);
42 dispatch(byte_span{buffer_.data(),bytes});
43 }
44 } catch (const asio::system_error& error) {
45 if (error.code() != asio::error::operation_aborted) {
46 roboctrl::logger::instance().log_warn("udp receive stopped: {}", error.what());
47 }
48 }
49}
异步任务上下文组件。
void dispatch(byte_span bytes)
分发收到的字节流。
Definition base.hpp:140
awaitable< void > task()
接收循环任务。
Definition udp.cpp:37
awaitable< void > send(byte_span data)
异步发送一段字节数据。
Definition udp.cpp:32
udp(info_type info)
构造并连接到指定远端。
Definition udp.cpp:9
void start()
启动 UDP 接收协程;重复调用不会重复启动。
Definition udp.cpp:24
IO的基础组件。
std::span< const std::byte > byte_span
只读 byte span。
Definition base.hpp:45
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:191
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46
auto executor()
获取全局任务上下文的executor。
Definition async.hpp:271
UDP 初始化参数。
Definition udp.h:28
UDP 裸 IO 封装。