zephyr/subsys/shell/backends/shell_dummy.c
Marco Argiolas 9ecef4b415 shell: backends: add init log level for dummy shell
Dummy shell was always started with log backend enabled with filter
 statically set to INFO level.
AFAIK no use of such log backend can be made, thus causing waste of
 resources.
The new changes keep INFO as the default filter level. In order to
 disable log backend to be attached to the Dummy shell,
 CONFIG_SHELL_DUMMY_INIT_LOG_LEVEL_NONE has to be set.

Signed-off-by: Marco Argiolas <marco.argiolas@ftpsolutions.com.au>
2023-02-22 12:15:24 +01:00

140 lines
3.0 KiB
C

/*
* Shell backend used for testing
*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/shell/shell_dummy.h>
#include <zephyr/init.h>
SHELL_DUMMY_DEFINE(shell_transport_dummy);
SHELL_DEFINE(shell_dummy, CONFIG_SHELL_PROMPT_DUMMY, &shell_transport_dummy, 256,
0, SHELL_FLAG_OLF_CRLF);
static int init(const struct shell_transport *transport,
const void *config,
shell_transport_handler_t evt_handler,
void *context)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)transport->ctx;
if (sh_dummy->initialized) {
return -EINVAL;
}
sh_dummy->initialized = true;
return 0;
}
static int uninit(const struct shell_transport *transport)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)transport->ctx;
if (!sh_dummy->initialized) {
return -ENODEV;
}
sh_dummy->initialized = false;
return 0;
}
static int enable(const struct shell_transport *transport, bool blocking)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)transport->ctx;
if (!sh_dummy->initialized) {
return -ENODEV;
}
return 0;
}
static int write(const struct shell_transport *transport,
const void *data, size_t length, size_t *cnt)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)transport->ctx;
size_t store_cnt;
if (!sh_dummy->initialized) {
*cnt = 0;
return -ENODEV;
}
store_cnt = length;
if (sh_dummy->len + store_cnt >= sizeof(sh_dummy->buf)) {
store_cnt = sizeof(sh_dummy->buf) - sh_dummy->len - 1;
}
memcpy(sh_dummy->buf + sh_dummy->len, data, store_cnt);
sh_dummy->len += store_cnt;
*cnt = length;
return 0;
}
static int read(const struct shell_transport *transport,
void *data, size_t length, size_t *cnt)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)transport->ctx;
if (!sh_dummy->initialized) {
return -ENODEV;
}
*cnt = 0;
return 0;
}
const struct shell_transport_api shell_dummy_transport_api = {
.init = init,
.uninit = uninit,
.enable = enable,
.write = write,
.read = read
};
static int enable_shell_dummy(const struct device *arg)
{
ARG_UNUSED(arg);
bool log_backend = CONFIG_SHELL_DUMMY_INIT_LOG_LEVEL > 0;
uint32_t level = (CONFIG_SHELL_DUMMY_INIT_LOG_LEVEL > LOG_LEVEL_DBG) ?
CONFIG_LOG_MAX_LEVEL : CONFIG_SHELL_DUMMY_INIT_LOG_LEVEL;
static const struct shell_backend_config_flags cfg_flags =
SHELL_DEFAULT_BACKEND_CONFIG_FLAGS;
shell_init(&shell_dummy, NULL, cfg_flags, log_backend, level);
return 0;
}
SYS_INIT(enable_shell_dummy, POST_KERNEL, 0);
const struct shell *shell_backend_dummy_get_ptr(void)
{
return &shell_dummy;
}
const char *shell_backend_dummy_get_output(const struct shell *shell,
size_t *sizep)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)shell->iface->ctx;
sh_dummy->buf[sh_dummy->len] = '\0';
*sizep = sh_dummy->len;
sh_dummy->len = 0;
return sh_dummy->buf;
}
void shell_backend_dummy_clear_output(const struct shell *shell)
{
struct shell_dummy *sh_dummy = (struct shell_dummy *)shell->iface->ctx;
sh_dummy->buf[0] = '\0';
sh_dummy->len = 0;
}