One Framework 0.1.0
RoboMaster嵌入式框架“一键”解决方案,为你的“创意”服务。
载入中...
搜索中...
未找到
PrtsRegistrarT.hpp
浏览该文件的文档.
1#ifndef PRTSREGISTRART_HPP
2#define PRTSREGISTRART_HPP
3
4#include "FunctionTraits.hpp"
5#include "ArgParser.hpp"
6#include "PrtsManager.hpp"
7#include <utility>
8
10
11namespace OF::Prts
12{
13
14 template <auto MemFn, typename OptsVec>
16 {
17 CommandRegistrarT(std::string_view unitName,
18 std::string_view cmdName,
19 std::string_view desc
20 )
21 {
22 using Traits = FunctionTraits<decltype(MemFn)>;
23 using C = typename Traits::ClassType;
24 using ArgTup = typename Traits::ArgTuple;
25
26 std::vector<OptionDesc> opts(
27 OptsVec::value.begin(),
28 OptsVec::value.end()
29 );
30
31 auto handler = [unitName, cmdName, desc](const struct shell* sh, int argc, char** argv) -> int
32 {
33 std::vector<std::string_view> argvec;
34 for (int i = 1; i < argc; ++i)
35 {
36 argvec.push_back(argv[i]);
37 }
38 ArgTup args{};
39 if (!ArgParser<0, ArgTup>::parse(args, argvec))
40 {
41 shell_error(sh, "Missing or invalid options, try prts help [unit] [cmd]");
42 return -EINVAL;
43 }
44 auto uopt = UnitRegistry::findUnit(unitName);
45 if (!uopt)
46 {
47 shell_error(sh, "Unit '%s' not found", unitName.data());
48 return -ENOENT;
49 }
50 C* u = static_cast<C*>(*uopt);
51 return std::apply(
52 [u]<typename... T>(T&&... a)
53 {
54 return (u->*MemFn)(std::forward<T>(a)...);
55 },
56 args);
57 };
58
59 const CommandDesc cd = {
60 .unitName = unitName,
61 .cmdName = cmdName,
62 .description = desc,
63 .options = std::move(opts),
64 .handler = handler
65 };
67 }
68 };
69}
70
71#endif //PRTSREGISTRART_HPP
static void registerCommand(const CommandDesc &d)
定义 PrtsManager.hpp:46
static std::optional< Unit * > findUnit(std::string_view name)
通过名称查找单元信息
定义 UnitRegistry.cpp:85
定义 PrtsManager.hpp:13
static bool parse(Tuple &tup, const std::vector< std::string_view > &opts)
定义 ArgParser.hpp:9
定义 FunctionTraits.hpp:10
定义 PrtsManager.hpp:23
CommandRegistrarT(std::string_view unitName, std::string_view cmdName, std::string_view desc)
定义 PrtsRegistrarT.hpp:17