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