1 /*
2 * Copyright (c) 2006-2022, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2021-06-05 WillianChan first version
9 */
10
11 #include <var_export.h>
12
13 static int ve_cmd_help(int argc, char **argv);
14 static int ve_find_module(int argc, char **argv);
15 static int ve_find_value(int argc, char **argv);
16
17
18 struct ve_cmd_des
19 {
20 const char *cmd;
21 int (*fun)(int argc, char **argv);
22 };
23
24 /* dcm cmd table */
25 static const struct ve_cmd_des cmd_tab[] =
26 {
27 {"module", ve_find_module},
28 {"value", ve_find_value},
29 };
30
ve_cmd_help(int argc,char ** argv)31 static int ve_cmd_help(int argc, char **argv)
32 {
33 rt_kprintf("Usage:\n");
34 rt_kprintf("ve_find module <module> - Find by module name\n");
35 rt_kprintf("ve_find value <module> <identifier> - Find accurately\n");
36
37 return RT_EOK;
38 }
39
ve_object_split(int len)40 rt_inline void ve_object_split(int len)
41 {
42 while (len--) rt_kprintf("-");
43 }
44
ve_find_module(int argc,char ** argv)45 static int ve_find_module(int argc, char **argv)
46 {
47 ve_iterator_t iter;
48 const ve_exporter_t *exporter;
49 ve_module_t module;
50 int maxlen = (RT_NAME_MAX * 2);
51 const char *item_title = "ve_module";
52
53 rt_kprintf("%-*.s identifier value\n", maxlen, item_title); ve_object_split(maxlen);
54 rt_kprintf(" ---------------- -----\n");
55
56 if (!ve_module_init(&module, argv[2]))
57 {
58 ve_iter_init(&module, &iter);
59 }
60 else
61 {
62 return -RT_ERROR;
63 }
64
65 while (1)
66 {
67 exporter = ve_iter_next(&iter);
68 if (exporter == RT_NULL)
69 {
70 return -RT_ERROR;
71 }
72 else
73 {
74 rt_kprintf("%-*.s %-*.s %d\n",
75 maxlen, exporter->module,
76 maxlen, exporter->identifier,
77 exporter->value);
78 }
79 }
80 }
81
ve_find_value(int argc,char ** argv)82 static int ve_find_value(int argc, char **argv)
83 {
84 ve_iterator_t iter;
85 const ve_exporter_t *exporter;
86 ve_module_t module;
87 int maxlen = (RT_NAME_MAX * 2);
88 const char *item_title = "ve_module";
89
90 rt_kprintf("%-*.s identifier value\n", maxlen, item_title); ve_object_split(maxlen);
91 rt_kprintf(" ---------------- -----\n");
92
93 if (!ve_module_init(&module, argv[2]))
94 {
95 ve_iter_init(&module, &iter);
96 }
97 else
98 {
99 return -RT_ERROR;
100 }
101
102 while (1)
103 {
104 exporter = ve_iter_next(&iter);
105 if (exporter == RT_NULL)
106 {
107 return -RT_ERROR;
108 }
109 else
110 {
111 if (!rt_strcmp(exporter->identifier, argv[3]))
112 {
113 rt_kprintf("%-*.s %-*.s %d\n",
114 maxlen, exporter->module,
115 maxlen, exporter->identifier,
116 exporter->value);
117
118 return RT_EOK;
119 }
120 }
121 }
122 }
123
ve_find(int argc,char ** argv)124 static int ve_find(int argc, char **argv)
125 {
126 int i, resule = RT_EOK;
127 const struct ve_cmd_des *run_cmd = RT_NULL;
128
129 if (argc == 1)
130 {
131 ve_cmd_help(argc, argv);
132 return RT_EOK;
133 }
134
135 /* find command function */
136 for (i = 0; i < sizeof(cmd_tab) / sizeof(cmd_tab[0]); i++)
137 {
138 if (rt_strcmp(cmd_tab[i].cmd, argv[1]) == 0)
139 {
140 run_cmd = &cmd_tab[i];
141 break;
142 }
143 }
144
145 /* not find command function, print help information */
146 if (run_cmd == RT_NULL)
147 {
148 rt_kprintf("There is no command option named %s.\n", argv[1]);
149 ve_cmd_help(argc, argv);
150 return RT_EOK;
151 }
152
153 /* run command function */
154 if (run_cmd->fun != RT_NULL)
155 {
156 resule = run_cmd->fun(argc, argv);
157 }
158
159 if (resule)
160 {
161 ve_cmd_help(argc, argv);
162 }
163
164 return RT_EOK;
165 }
166 MSH_CMD_EXPORT(ve_find, find the specified export variable);
167