GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
aim_link.cpp
1#include "device/aim_link.hpp"
2
3#include <stdexcept>
4
5namespace roboctrl::device {
6aim_link::aim_link(const info_type& info)
7 : device_base{std::chrono::milliseconds{info.target_timeout_ms}}, info_{info},
8 peer_{asio::ip::make_address(info.address), info.port} {
9 if (info.key_.empty() || info.udp_name.empty() || info.port == 0 ||
10 info.header == 0x37 || info.target_timeout_ms == 0 ||
11 (info.wire_format != vision_wire_format::legacy_14 &&
12 info.wire_format != vision_wire_format::compact_10)) {
13 throw std::invalid_argument("invalid vision link configuration");
14 }
15}
16
17void aim_link::connect() {
18 if (udp_) return;
19 udp_ = &roboctrl::get<io::udp_server>(info_.udp_name);
20 udp_->on_data(peer_, [this](io::byte_span bytes) {
21 if (!started_) return;
22 if (const auto value = network_protocol::decode_aim(bytes, info_.header, info_.wire_format)) {
23 target_.update(*value);
24 tick();
25 }
26 });
27}
28
29void aim_link::start() {
30 if (!udp_) throw std::logic_error("vision link start before connect");
31 started_ = true;
32}
33
34std::optional<aim_target> aim_link::target() const {
35 return target_.get(std::chrono::milliseconds{info_.target_timeout_ms});
36}
37
38awaitable<void> aim_link::send_posture(float yaw, float pitch, bool red) {
39 if (!started_) co_return;
40 const auto packet = network_protocol::encode_posture(info_.header, yaw, pitch, red);
41 co_await udp_->send(peer_, packet);
42}
43
44navigation_link::navigation_link(const info_type& info)
45 : device_base{std::chrono::milliseconds{info.target_timeout_ms}}, info_{info},
46 peer_{asio::ip::make_address(info.address), info.port} {
47 if (info.key_.empty() || info.udp_name.empty() || info.port == 0 || info.target_timeout_ms == 0) {
48 throw std::invalid_argument("invalid navigation link configuration");
49 }
50}
51
52void navigation_link::connect() {
53 if (udp_) return;
54 udp_ = &roboctrl::get<io::udp_server>(info_.udp_name);
55 udp_->on_data(peer_, [this](io::byte_span bytes) {
56 if (!started_) return;
57 if (const auto value = network_protocol::decode_navigation(bytes)) {
58 command_.update(*value);
59 tick();
60 }
61 });
62}
63
64void navigation_link::start() {
65 if (!udp_) throw std::logic_error("navigation link start before connect");
66 started_ = true;
67}
68
69std::optional<navigation_command> navigation_link::command() const {
70 return command_.get(std::chrono::milliseconds{info_.target_timeout_ms});
71}
72
73awaitable<void> navigation_link::send_status(float yaw, float hp_fraction, bool match_started) {
74 if (!started_) co_return;
75 const auto packet = network_protocol::encode_navigation(yaw, hp_fraction, match_started);
76 co_await udp_->send(peer_, packet);
77}
78} // namespace roboctrl::device