zephyr/modules/openthread/platform/shell.c
Robert Lubos 815ebc316e net: openthread: Move glue code into module directory
Move OpenThread's glue code along with the Kconfig files that configure
OpenThread stack itself into module directory.

Update the maintainers file to reflect this change.

Signed-off-by: Robert Lubos <robert.lubos@nordicsemi.no>
2022-07-11 11:00:12 +02:00

97 lines
1.9 KiB
C

/*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <stdio.h>
#include <zephyr/net/openthread.h>
#include <zephyr/sys/printk.h>
#include <zephyr/shell/shell.h>
#include <zephyr/shell/shell_uart.h>
#include <openthread/cli.h>
#include <openthread/instance.h>
#include "platform-zephyr.h"
#define OT_SHELL_BUFFER_SIZE CONFIG_SHELL_CMD_BUFF_SIZE
static char rx_buffer[OT_SHELL_BUFFER_SIZE];
static const struct shell *shell_p;
static bool is_shell_initialized;
static int ot_console_cb(void *context, const char *format, va_list arg)
{
ARG_UNUSED(context);
if (shell_p == NULL) {
return 0;
}
shell_vfprintf(shell_p, SHELL_NORMAL, format, arg);
return 0;
}
#define SHELL_HELP_OT "OpenThread subcommands\n" \
"Use \"ot help\" to get the list of subcommands"
static int ot_cmd(const struct shell *shell, size_t argc, char *argv[])
{
char *buf_ptr = rx_buffer;
size_t buf_len = OT_SHELL_BUFFER_SIZE;
size_t arg_len = 0;
int i;
if (!is_shell_initialized) {
return -ENOEXEC;
}
for (i = 1; i < argc; i++) {
if (arg_len) {
buf_len -= arg_len + 1;
if (buf_len) {
buf_ptr[arg_len] = ' ';
}
buf_ptr += arg_len + 1;
}
arg_len = snprintk(buf_ptr, buf_len, "%s", argv[i]);
if (arg_len >= buf_len) {
shell_fprintf(shell, SHELL_WARNING,
"OT shell buffer full\n");
return -ENOEXEC;
}
}
if (i == argc) {
buf_len -= arg_len;
}
shell_p = shell;
openthread_api_mutex_lock(openthread_get_default_context());
otCliInputLine(rx_buffer);
openthread_api_mutex_unlock(openthread_get_default_context());
return 0;
}
SHELL_CMD_ARG_REGISTER(ot, NULL, SHELL_HELP_OT, ot_cmd, 2, 255);
void platformShellInit(otInstance *aInstance)
{
if (IS_ENABLED(CONFIG_SHELL_BACKEND_SERIAL)) {
shell_p = shell_backend_uart_get_ptr();
} else {
shell_p = NULL;
}
otCliInit(aInstance, ot_console_cb, NULL);
is_shell_initialized = true;
}