GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
remote_logger.cpp
1#include "device/remote_logger.hpp"
2
3#include <stdexcept>
4
5namespace roboctrl::device {
6remote_logger::remote_logger(const info_type& info)
7 : info_{info}, peer_{asio::ip::make_address(info.address), info.port} {
8 if (info.key_.empty() || info.udp_name.empty() || info.port == 0) {
9 throw std::invalid_argument("invalid remote logger configuration");
10 }
11}
12
13void remote_logger::connect() {
14 if (!udp_) udp_ = &roboctrl::get<io::udp_server>(info_.udp_name);
15}
16
17void remote_logger::start() {
18 if (!udp_) throw std::logic_error("remote logger start before connect");
19 started_ = true;
20}
21
22awaitable<void> remote_logger::push_value(std::string name, double value) {
23 if (!started_) co_return;
24 // Repeat registration in the same datagram as every sample. Receivers can
25 // start late, and loss of the first UDP frame cannot orphan later values.
26 auto packet = network_protocol::encode_log_name(name);
27 const auto sample = network_protocol::encode_log_value(network_protocol::log_name_id(name), value);
28 packet.insert(packet.end(), sample.begin(), sample.end());
29 co_await udp_->send(peer_, packet);
30}
31
32awaitable<void> remote_logger::push_console_message(std::string message) {
33 if (!started_) co_return;
34 const auto packet = network_protocol::encode_log_text(message);
35 co_await udp_->send(peer_, packet);
36}
37
38awaitable<void> remote_logger::push_message_box(std::string message) {
39 if (!started_) co_return;
40 const auto packet = network_protocol::encode_log_text(message, true);
41 co_await udp_->send(peer_, packet);
42}
43} // namespace roboctrl::device