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