1#include "device/aim_link.hpp"
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");
17void aim_link::connect() {
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);
29void aim_link::start() {
30 if (!udp_)
throw std::logic_error(
"vision link start before connect");
34std::optional<aim_target> aim_link::target()
const {
35 return target_.get(std::chrono::milliseconds{info_.target_timeout_ms});
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);
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");
52void navigation_link::connect() {
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);
64void navigation_link::start() {
65 if (!udp_)
throw std::logic_error(
"navigation link start before connect");
69std::optional<navigation_command> navigation_link::command()
const {
70 return command_.get(std::chrono::milliseconds{info_.target_timeout_ms});
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);