GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
referee.h
1#pragma once
2
3#include "core/async.hpp"
4#include "core/logger.h"
5#include "device/referee/state.hpp"
6#include "device/referee/ui.hpp"
7#include "utils/singleton.hpp"
8#include <chrono>
9#include <functional>
10#include <string>
11
12namespace roboctrl::io { class serial; }
13namespace roboctrl::device {
14
16class referee : public utils::singleton_base<referee>, public logable<referee> {
17public:
18 struct info_type {
19 using owner_type = referee;
20 std::string serial_name {"referee"};
21 std::chrono::steady_clock::duration offline_timeout {std::chrono::seconds{1}};
22 bool ui_enabled {false};
23 std::chrono::steady_clock::duration ui_period {std::chrono::milliseconds{100}};
24 std::uint16_t ui_receiver_id {0}; // 0 = derive operator client where defined.
25 };
26 bool init(const info_type& info);
27 void connect();
28 void start();
29 awaitable<void> task();
30 [[nodiscard]] bool configured() const { return configured_; }
31 [[nodiscard]] bool offline() const;
32 [[nodiscard]] auto timeout() const { return info_.offline_timeout; }
33 [[nodiscard]] const referee_protocol::state& data() const { return state_; }
34 [[nodiscard]] std::string desc() const { return "referee"; }
35 void set_ui_status(referee_protocol::ui_status status) { ui_status_ = status; }
37 void on_frame(std::function<void(const referee_protocol::frame&)> callback) { frame_callback_ = std::move(callback); }
39 void receive(referee_protocol::bytes data);
40 awaitable<void> send_graphics(std::span<const referee_protocol::graphic> items);
41 awaitable<void> send_text(referee_protocol::graphic item, std::string_view text);
42 awaitable<void> delete_graphics(std::uint8_t operation, std::uint8_t layer);
43private:
44 std::optional<std::pair<std::uint16_t, std::uint16_t>> ui_addresses() const;
45 info_type info_;
46 io::serial* serial_ {nullptr};
47 referee_protocol::stream_parser parser_;
48 referee_protocol::state state_;
49 referee_protocol::ui_status ui_status_;
50 std::optional<referee_protocol::clock::time_point> received_at_;
51 std::function<void(const referee_protocol::frame&)> frame_callback_;
52 std::uint8_t sequence_ {};
53 bool configured_ {}, connected_ {}, started_ {};
54};
55static_assert(utils::singleton<referee>);
56} // namespace roboctrl::device
异步任务上下文组件。
管理一组协程回调的容器。
Definition callback.hpp:36
void on_frame(std::function< void(const referee_protocol::frame &)> callback)
Definition referee.h:37
void receive(referee_protocol::bytes data)
Definition referee.cpp:34
串口设备对象。
Definition serial.h:31
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition logger.h:178
提供单例模式的单例基类
Definition singleton.hpp:19
用于日志输出的组件。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46