Line data Source code
1 0 : /*
2 : * Copyright (c) 2018 Nordic Semiconductor ASA
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_SHELL_LOG_BACKEND_H_
8 : #define ZEPHYR_INCLUDE_SHELL_LOG_BACKEND_H_
9 :
10 : #include <zephyr/kernel.h>
11 : #include <zephyr/logging/log_backend.h>
12 : #include <zephyr/logging/log_output.h>
13 : #include <zephyr/sys/mpsc_pbuf.h>
14 : #include <zephyr/sys/atomic.h>
15 : #ifdef __cplusplus
16 : extern "C" {
17 : #endif
18 :
19 0 : extern const struct log_backend_api log_backend_shell_api;
20 :
21 : /** @brief Shell log backend states. */
22 0 : enum shell_log_backend_state {
23 : SHELL_LOG_BACKEND_UNINIT,
24 : SHELL_LOG_BACKEND_ENABLED,
25 : SHELL_LOG_BACKEND_DISABLED,
26 : SHELL_LOG_BACKEND_PANIC,
27 : };
28 :
29 : /** @brief Shell log backend control block (RW data). */
30 1 : struct shell_log_backend_control_block {
31 0 : atomic_t dropped_cnt;
32 0 : enum shell_log_backend_state state;
33 : };
34 :
35 : /** @brief Shell log backend instance structure (RO data). */
36 1 : struct shell_log_backend {
37 0 : const struct log_backend *backend;
38 0 : const struct log_output *log_output;
39 0 : struct shell_log_backend_control_block *control_block;
40 0 : uint32_t timeout;
41 0 : const struct mpsc_pbuf_buffer_config *mpsc_buffer_config;
42 0 : struct mpsc_pbuf_buffer *mpsc_buffer;
43 : };
44 :
45 : /** @brief Shell log backend message structure. */
46 1 : struct shell_log_backend_msg {
47 0 : struct log_msg *msg;
48 0 : uint32_t timestamp;
49 : };
50 :
51 : /** @brief Prototype of function outputting processed data. */
52 : int z_shell_log_backend_output_func(uint8_t *data, size_t length, void *ctx);
53 :
54 : /** @def Z_SHELL_LOG_BACKEND_DEFINE
55 : * @brief Macro for creating instance of shell log backend.
56 : *
57 : * @param _name Shell name.
58 : * @param _buf Output buffer.
59 : * @param _size Output buffer size.
60 : * @param _queue_size Log message queue size.
61 : * @param _timeout Timeout in milliseconds for pending on queue full.
62 : * Message is dropped on timeout.
63 : */
64 : /** @def Z_SHELL_LOG_BACKEND_PTR
65 : * @brief Macro for retrieving pointer to the instance of shell log backend.
66 : *
67 : * @param _name Shell name.
68 : */
69 : #ifdef CONFIG_SHELL_LOG_BACKEND
70 : #define Z_SHELL_LOG_BACKEND_DEFINE(_name, _buf, _size, _queue_size, _timeout) \
71 : LOG_BACKEND_DEFINE(_name##_backend, log_backend_shell_api, false); \
72 : LOG_OUTPUT_DEFINE(_name##_log_output, z_shell_log_backend_output_func,\
73 : _buf, _size); \
74 : static struct shell_log_backend_control_block _name##_control_block; \
75 : static uint32_t __aligned(Z_LOG_MSG_ALIGNMENT) \
76 : _name##_buf[_queue_size / sizeof(uint32_t)]; \
77 : const struct mpsc_pbuf_buffer_config _name##_mpsc_buffer_config = { \
78 : .buf = _name##_buf, \
79 : .size = ARRAY_SIZE(_name##_buf), \
80 : .notify_drop = NULL, \
81 : .get_wlen = log_msg_generic_get_wlen, \
82 : .flags = MPSC_PBUF_MODE_OVERWRITE, \
83 : }; \
84 : struct mpsc_pbuf_buffer _name##_mpsc_buffer; \
85 : static const struct shell_log_backend _name##_log_backend = { \
86 : .backend = &_name##_backend, \
87 : .log_output = &_name##_log_output, \
88 : .control_block = &_name##_control_block, \
89 : .timeout = _timeout, \
90 : .mpsc_buffer_config = &_name##_mpsc_buffer_config, \
91 : .mpsc_buffer = &_name##_mpsc_buffer, \
92 : }
93 :
94 : #define Z_SHELL_LOG_BACKEND_PTR(_name) (&_name##_log_backend)
95 : #else /* CONFIG_LOG */
96 : #define Z_SHELL_LOG_BACKEND_DEFINE(_name, _buf, _size, _queue_size, _timeout)
97 : #define Z_SHELL_LOG_BACKEND_PTR(_name) NULL
98 : #endif /* CONFIG_LOG */
99 :
100 : /** @brief Enable shell log backend.
101 : *
102 : * @param backend Shell log backend instance.
103 : * @param ctx Pointer to shell instance.
104 : * @param init_log_level Initial log level set to all logging sources.
105 : */
106 : void z_shell_log_backend_enable(const struct shell_log_backend *backend,
107 : void *ctx, uint32_t init_log_level);
108 :
109 : /** @brief Disable shell log backend.
110 : *
111 : * @param backend Shell log backend instance.
112 : */
113 : void z_shell_log_backend_disable(const struct shell_log_backend *backend);
114 :
115 : /** @brief Trigger processing of one log entry.
116 : *
117 : * @param backend Shell log backend instance.
118 : *
119 : * @return True if message was processed, false if FIFO was empty
120 : */
121 : bool z_shell_log_backend_process(const struct shell_log_backend *backend);
122 :
123 : #ifdef __cplusplus
124 : }
125 : #endif
126 :
127 : #endif /* ZEPHYR_INCLUDE_SHELL_LOG_BACKEND_H_ */
|