GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
base.cpp
2
3#include <mutex>
4#include <unordered_map>
5#include <utility>
6#include <vector>
7
8namespace roboctrl::device {
9namespace {
10
11std::unordered_map<std::string, gimbal_registry::factory>& gimbal_factories() {
12 static std::unordered_map<std::string, gimbal_registry::factory> value;
13 return value;
14}
15
16std::mutex& gimbal_factories_mutex() {
17 static std::mutex mutex;
18 return mutex;
19}
20
21gimbal_base*& current_gimbal() {
22 static gimbal_base* value = nullptr;
23 return value;
24}
25
26} // namespace
27
28bool gimbal_registry::register_type(std::string type, factory creator) {
29 std::lock_guard lock{gimbal_factories_mutex()};
30 return gimbal_factories().emplace(std::move(type), std::move(creator)).second;
31}
32
34 return current_gimbal();
35}
36
37gimbal_base* gimbal_registry::create(std::string_view type, const std::any& info) {
38 factory creator;
39 {
40 std::lock_guard lock{gimbal_factories_mutex()};
41 const auto it = gimbal_factories().find(std::string{type});
42 if (it == gimbal_factories().end()) return nullptr;
43 creator = it->second;
44 }
45 auto result = creator(info);
46 if (!result) return nullptr;
47 auto* pointer = result.get();
48 // Controllers and their coroutines live for the process lifetime.
49 static std::vector<std::unique_ptr<gimbal_base>> instances;
50 instances.push_back(std::move(result));
51 return pointer;
52}
53
54bool gimbal_registry::init(std::string_view type, const std::any& info) {
55 auto* result = create(type, info);
56 current_gimbal() = result;
57 return result != nullptr;
58}
59
60} // namespace roboctrl::device
云台的统一姿态目标接口。
Definition base.hpp:22
static gimbal_base * current()
获取当前已初始化的云台。
Definition base.cpp:33
static gimbal_base * create(std::string_view type, const std::any &info)
按类型名创建并初始化云台。
Definition base.cpp:37
static bool init(std::string_view type, const std::any &info)
按类型名初始化当前云台。
Definition base.cpp:54
static bool register_type(std::string type, factory creator)
注册一个类型名及其工厂;重复类型名返回 false。
Definition base.cpp:28
云台抽象接口与运行时注册表。