Skip to content

Commit 322e76f

Browse files
MarekPietapdunaj
authored andcommitted
subsys: event_manager: Shell integration
Change adds shell integration to Event Manager. JIRA:DESK-421 Signed-off-by: Marek Pieta <[email protected]>
1 parent 8533061 commit 322e76f

File tree

4 files changed

+196
-60
lines changed

4 files changed

+196
-60
lines changed

subsys/event_manager/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
#
66

77
zephyr_sources(event_manager.c)
8+
zephyr_sources_ifdef(CONFIG_SHELL event_manager_shell.c)

subsys/event_manager/Kconfig

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,6 @@ config DESKTOP_EVENT_MANAGER_SHOW_EVENT_HANDLERS
2828
help
2929
This option controls if event handlers are printed to console.
3030

31-
config DESKTOP_EVENT_MANAGER_SHOW_LISTENERS
32-
bool "Show event listeners"
33-
depends on LOG
34-
help
35-
Show listeners with events they subscribe to.
36-
37-
3831
module = DESKTOP_EVENT_MANAGER
3932
module-str = Event Manager
4033
source "${ZEPHYR_BASE}/subsys/logging/Kconfig.template.log_config"

subsys/event_manager/event_manager.c

Lines changed: 13 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
#include <event_manager.h>
1212
#include <logging/log.h>
1313

14+
#ifdef CONFIG_SHELL
15+
extern u32_t event_manager_displayed_events;
16+
#else
17+
/* By default, when there is no shell, all events are shown */
18+
static u32_t event_manager_displayed_events = 0xffffffff;
19+
#endif
20+
1421
LOG_MODULE_REGISTER(event_manager, CONFIG_DESKTOP_EVENT_MANAGER_LOG_LEVEL);
1522

1623
static void event_processor_fn(struct k_work *work);
@@ -59,8 +66,13 @@ static void event_processor_fn(struct k_work *work)
5966

6067
const struct event_type *et = eh->type_id;
6168

69+
__ASSERT_NO_MSG(et < __stop_event_types
70+
&& et >= __start_event_types);
6271
trace_event_execution(eh, true);
63-
if (IS_ENABLED(CONFIG_DESKTOP_EVENT_MANAGER_SHOW_EVENTS)) {
72+
if (IS_ENABLED(CONFIG_DESKTOP_EVENT_MANAGER_SHOW_EVENTS)
73+
&& (event_manager_displayed_events
74+
& BIT(et - __start_event_types))) {
75+
6476
if (et->log_event) {
6577
const size_t buf_len = CONFIG_DESKTOP_EVENT_MANAGER_EVENT_LOG_BUF_LEN;
6678
char event_log_buf[buf_len];
@@ -140,54 +152,6 @@ void _event_submit(struct event_header *eh)
140152
k_work_submit(&event_processor);
141153
}
142154

143-
static void event_manager_show_listeners(void)
144-
{
145-
LOG_INF("Registered Listeners:");
146-
for (const struct event_listener *el = __start_event_listeners;
147-
el != __stop_event_listeners;
148-
el++) {
149-
__ASSERT_NO_MSG(el != NULL);
150-
LOG_INF("|\t[L:%s]", el->name);
151-
}
152-
LOG_INF("");
153-
}
154-
155-
static void event_manager_show_subscribers(void)
156-
{
157-
LOG_INF("Registered Subscribers:");
158-
for (const struct event_type *et = __start_event_types;
159-
(et != NULL) && (et != __stop_event_types);
160-
et++) {
161-
162-
bool is_subscribed = false;
163-
164-
for (size_t prio = SUBS_PRIO_MIN;
165-
prio <= SUBS_PRIO_MAX;
166-
prio++) {
167-
for (const struct event_subscriber *es =
168-
et->subs_start[prio];
169-
es != et->subs_stop[prio];
170-
es++) {
171-
172-
__ASSERT_NO_MSG(es != NULL);
173-
const struct event_listener *el = es->listener;
174-
175-
__ASSERT_NO_MSG(el != NULL);
176-
LOG_INF("|\tprio:%u\t[E:%s] -> [L:%s]", prio,
177-
et->name, el->name);
178-
179-
is_subscribed = true;
180-
}
181-
}
182-
183-
if (!is_subscribed) {
184-
LOG_INF("|\t[E:%s] has no subscribers", et->name);
185-
}
186-
LOG_INF("");
187-
}
188-
LOG_INF("");
189-
}
190-
191155
static void register_execution_tracking_events(void)
192156
{
193157
const enum profiler_arg types[] = {PROFILER_ARG_U32};
@@ -266,10 +230,6 @@ int event_manager_init(void)
266230
register_events();
267231
}
268232

269-
if (IS_ENABLED(CONFIG_DESKTOP_EVENT_MANAGER_SHOW_LISTENERS)) {
270-
event_manager_show_listeners();
271-
event_manager_show_subscribers();
272-
}
273233
return 0;
274234
}
275235

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
/*
2+
* Copyright (c) 2019 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic
5+
*/
6+
7+
#include <stdlib.h>
8+
#include <shell/shell.h>
9+
#include <event_manager.h>
10+
11+
u32_t event_manager_displayed_events;
12+
13+
static int show_events(const struct shell *shell, size_t argc,
14+
char **argv)
15+
{
16+
shell_fprintf(shell, SHELL_NORMAL,
17+
"Registered Events:\n");
18+
19+
for (const struct event_type *et = __start_event_types;
20+
(et != NULL) && (et != __stop_event_types); et++) {
21+
22+
size_t ev_id = et - __start_event_types;
23+
24+
shell_fprintf(shell,
25+
SHELL_NORMAL,
26+
"%c %d:\t%s\n",
27+
(event_manager_displayed_events & BIT(ev_id)) ?
28+
'E' : 'D',
29+
ev_id,
30+
et->name);
31+
}
32+
33+
return 0;
34+
}
35+
36+
static int show_listeners(const struct shell *shell, size_t argc,
37+
char **argv)
38+
{
39+
shell_fprintf(shell, SHELL_NORMAL, "Registered Listeners:\n");
40+
for (const struct event_listener *el = __start_event_listeners;
41+
el != __stop_event_listeners;
42+
el++) {
43+
44+
__ASSERT_NO_MSG(el != NULL);
45+
shell_fprintf(shell, SHELL_NORMAL, "|\t[L:%s]\n", el->name);
46+
}
47+
48+
return 0;
49+
}
50+
51+
static int show_subscribers(const struct shell *shell, size_t argc,
52+
char **argv)
53+
{
54+
shell_fprintf(shell, SHELL_NORMAL, "Registered Subscribers:\n");
55+
for (const struct event_type *et = __start_event_types;
56+
(et != NULL) && (et != __stop_event_types);
57+
et++) {
58+
59+
bool is_subscribed = false;
60+
61+
for (size_t prio = SUBS_PRIO_MIN;
62+
prio <= SUBS_PRIO_MAX;
63+
prio++) {
64+
for (const struct event_subscriber *es =
65+
et->subs_start[prio];
66+
es != et->subs_stop[prio];
67+
es++) {
68+
69+
__ASSERT_NO_MSG(es != NULL);
70+
const struct event_listener *el = es->listener;
71+
72+
__ASSERT_NO_MSG(el != NULL);
73+
shell_fprintf(shell, SHELL_NORMAL,
74+
"|\tprio:%u\t[E:%s] -> [L:%s]\n",
75+
prio, et->name, el->name);
76+
77+
is_subscribed = true;
78+
}
79+
}
80+
81+
if (!is_subscribed) {
82+
shell_fprintf(shell, SHELL_NORMAL,
83+
"|\t[E:%s] has no subscribers\n",
84+
et->name);
85+
}
86+
shell_fprintf(shell, SHELL_NORMAL, "\n");
87+
}
88+
89+
return 0;
90+
}
91+
92+
static void set_event_displaying(const struct shell *shell, size_t argc,
93+
char **argv, bool enable)
94+
{
95+
u32_t evt_mask = 0;
96+
97+
/* If no IDs specified, all registered events are affected */
98+
if (argc == 1) {
99+
for (const struct event_type *et = __start_event_types;
100+
(et != NULL) && (et != __stop_event_types);
101+
et++) {
102+
103+
size_t ev_id = et - __start_event_types;
104+
105+
evt_mask |= BIT(ev_id);
106+
}
107+
108+
shell_fprintf(shell,
109+
SHELL_NORMAL,
110+
"Displaying all events %sabled\n",
111+
enable ? "en":"dis");
112+
} else {
113+
int event_indexes[argc - 1];
114+
115+
for (size_t i = 0; i < ARRAY_SIZE(event_indexes); i++) {
116+
char *end;
117+
118+
event_indexes[i] = strtol(argv[i + 1], &end, 10);
119+
120+
if ((event_indexes[i] < 0)
121+
|| (event_indexes[i] >= __stop_event_types - __start_event_types)
122+
|| (*end != '\0')) {
123+
124+
shell_error(shell, "Invalid event ID: %s",
125+
argv[i + 1]);
126+
return;
127+
}
128+
}
129+
130+
for (size_t i = 0; i < ARRAY_SIZE(event_indexes); i++) {
131+
evt_mask |= BIT(event_indexes[i]);
132+
const struct event_type *et =
133+
__start_event_types + event_indexes[i];
134+
const char *event_name = et->name;
135+
136+
shell_fprintf(shell,
137+
SHELL_NORMAL,
138+
"Displaying event %s %sabled\n",
139+
event_name,
140+
enable ? "en":"dis");
141+
}
142+
}
143+
if (enable) {
144+
event_manager_displayed_events |= evt_mask;
145+
} else {
146+
event_manager_displayed_events &= ~evt_mask;
147+
}
148+
}
149+
150+
static int enable_event_displaying(const struct shell *shell, size_t argc,
151+
char **argv)
152+
{
153+
set_event_displaying(shell, argc, argv, true);
154+
return 0;
155+
}
156+
157+
static int disable_event_displaying(const struct shell *shell, size_t argc,
158+
char **argv)
159+
{
160+
set_event_displaying(shell, argc, argv, false);
161+
return 0;
162+
}
163+
164+
165+
SHELL_CREATE_STATIC_SUBCMD_SET(sub_event_manager)
166+
{
167+
SHELL_CMD_ARG(show_listeners, NULL, "Show listeners",
168+
show_listeners, 0, 0),
169+
SHELL_CMD_ARG(show_subscribers, NULL, "Show subscribers",
170+
show_subscribers, 0, 0),
171+
SHELL_CMD_ARG(show_events, NULL, "Show events", show_events, 0, 0),
172+
SHELL_CMD_ARG(disable, NULL, "Disable displaying event with given ID",
173+
disable_event_displaying, 0,
174+
sizeof(event_manager_displayed_events) * 8 - 1),
175+
SHELL_CMD_ARG(enable, NULL, "Enable displaying event with given ID",
176+
enable_event_displaying, 0,
177+
sizeof(event_manager_displayed_events) * 8 - 1),
178+
SHELL_SUBCMD_SET_END
179+
};
180+
181+
SHELL_CMD_REGISTER(event_manager, &sub_event_manager,
182+
"Event Manager commands", NULL);

0 commit comments

Comments
 (0)