One Framework 0.1.0
RoboMaster嵌入式框架“一键”解决方案,为你的“创意”服务。
载入中...
搜索中...
未找到
UnitRegistry.hpp
浏览该文件的文档.
1// Copyright (c) 2025. MoonFeather
2// SPDX-License-Identifier: BSD-3-Clause
3
4#ifndef UNITREGISTRY_HPP
5#define UNITREGISTRY_HPP
6
7#include <memory>
8#include <optional>
9#include <unordered_map>
10#include <vector>
11#include "Unit.hpp"
12
13#if defined(CONFIG_UNIT_THREAD_ANALYZER)
14#include <zephyr/debug/thread_analyzer.h>
15#endif
16
17#define OF_CONCAT_INTERNAL(x, y) x##y
18#define OF_CONCAT(x, y) OF_CONCAT_INTERNAL(x, y)
19
20namespace OF
21{
30 {
31 public:
36 using UnitRegistrationFunction = void (*)();
37
42 using UnitFactoryFunction = std::unique_ptr<Unit> (*)();
43
52 template <typename UnitType>
53 static void registerUnit()
54 {
55 g_unitFactories.push_back([]() -> std::unique_ptr<Unit> { return std::make_unique<UnitType>(); });
56 }
57
64 static std::unordered_map<std::string_view, std::unique_ptr<Unit>>& initialize();
65
72 static std::optional<Unit*> findUnit(std::string_view name);
73
74 static void tryStartUnit(std::string_view name);
75
76 static void tryStopUnit(std::string_view name);
77
78 static void tryRestartUnit(std::string_view name);
79
83 static void updateAllUnitStats();
84
85 private:
86 static std::vector<UnitFactoryFunction> g_unitFactories;
87 static std::vector<UnitRegistrationFunction> g_registrationFunctions;
88 static std::unordered_map<std::string_view, std::unique_ptr<Unit>> g_units;
89
90#if defined(CONFIG_UNIT_THREAD_ANALYZER)
98 static void threadStatCallback(thread_analyzer_info* info);
99#endif
100 };
101
109#define DEFINE_UNIT_TYPE(TypeId) \
110 static constexpr uint32_t TYPE_ID = TypeId; \
111 uint32_t getTypeId() const override { return TYPE_ID; }
112
121 constexpr uint32_t typeNameHash(const char* str)
122 {
123 uint32_t hash = 5381;
124 for (size_t i = 0; str[i]; ++i)
125 {
126 hash = ((hash << 5) + hash) ^ str[i];
127 }
128 return hash;
129 }
130
138#define AUTO_UNIT_TYPE(TypeName) \
139 static constexpr uint32_t TYPE_ID = typeNameHash(#TypeName); \
140 uint32_t getTypeId() const override { return TYPE_ID; }
141
149
150#define REGISTER_UNIT(UnitClass) \
151 extern "C" { \
152 OF::UnitRegistry::UnitFactoryFunction \
153 _unit_factory_##UnitClass __attribute__((section(".unit_registry"),used)) = \
154 []() -> std::unique_ptr<OF::Unit> { return std::make_unique<UnitClass>(); }; \
155 }
156
157} // namespace OF
158
159#endif // UNITREGISTRY_HPP
单元注册类
定义 UnitRegistry.hpp:30
static std::optional< Unit * > findUnit(std::string_view name)
通过名称查找单元信息
定义 UnitRegistry.cpp:85
static void tryRestartUnit(std::string_view name)
定义 UnitRegistry.cpp:110
static void updateAllUnitStats()
更新所有单元的资源使用统计
定义 UnitRegistry.cpp:136
static void tryStartUnit(std::string_view name)
定义 UnitRegistry.cpp:94
static std::unordered_map< std::string_view, std::unique_ptr< Unit > > & initialize()
初始化所有注册的单元
定义 UnitRegistry.cpp:44
static void tryStopUnit(std::string_view name)
定义 UnitRegistry.cpp:102
std::unique_ptr< Unit >(*)() UnitFactoryFunction
单元工厂函数类型
定义 UnitRegistry.hpp:42
static void registerUnit()
注册单个单元类型
定义 UnitRegistry.hpp:53
void(*)() UnitRegistrationFunction
单元注册函数类型
定义 UnitRegistry.hpp:36
定义 PrtsManager.hpp:13
constexpr uint32_t typeNameHash(const char *str)
计算类型名称的哈希值
定义 UnitRegistry.hpp:121