shell: Shell subsystem reimplementation
New shell support features like: - multi-instance - command tree - static and dynamic commands - multiline - help print function - smart tab (autocompletion) - meta-keys - history, wildcards etc. - generic transport (initially, uart present) Signed-off-by: Jakub Rzeszutko <jakub.rzeszutko@nordicsemi.no> Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no> Signed-off-by: Piotr Zięcik <piotr.ziecik@nordicsemi.no>
This commit is contained in:
parent
527256501f
commit
6aed72e487
17 changed files with 3781 additions and 2 deletions
89
subsys/shell/shell_uart.c
Normal file
89
subsys/shell/shell_uart.c
Normal file
|
@ -0,0 +1,89 @@
|
|||
/*
|
||||
* Copyright (c) 2018 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
#include <shell/shell_uart.h>
|
||||
#include <uart.h>
|
||||
|
||||
static void timer_handler(struct k_timer *timer)
|
||||
{
|
||||
struct shell_uart *sh_uart =
|
||||
CONTAINER_OF(timer, struct shell_uart, timer);
|
||||
|
||||
if (uart_poll_in(sh_uart->dev, sh_uart->rx) == 0) {
|
||||
sh_uart->rx_cnt = 1;
|
||||
sh_uart->handler(SHELL_TRANSPORT_EVT_RX_RDY, sh_uart->context);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int init(const struct shell_transport *transport,
|
||||
const void *config,
|
||||
shell_transport_handler_t evt_handler,
|
||||
void *context)
|
||||
{
|
||||
struct shell_uart *sh_uart = (struct shell_uart *)transport->ctx;
|
||||
|
||||
sh_uart->dev = device_get_binding(CONFIG_UART_CONSOLE_ON_DEV_NAME);
|
||||
sh_uart->handler = evt_handler;
|
||||
sh_uart->context = context;
|
||||
|
||||
k_timer_init(&sh_uart->timer, timer_handler, NULL);
|
||||
|
||||
k_timer_start(&sh_uart->timer, 20, 20);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int uninit(const struct shell_transport *transport)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int enable(const struct shell_transport *transport, bool blocking)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int write(const struct shell_transport *transport,
|
||||
const void *data, size_t length, size_t *cnt)
|
||||
{
|
||||
struct shell_uart *sh_uart = (struct shell_uart *)transport->ctx;
|
||||
const u8_t *data8 = (const u8_t *)data;
|
||||
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
uart_poll_out(sh_uart->dev, data8[i]);
|
||||
}
|
||||
|
||||
*cnt = length;
|
||||
|
||||
sh_uart->handler(SHELL_TRANSPORT_EVT_TX_RDY, sh_uart->context);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int read(const struct shell_transport *transport,
|
||||
void *data, size_t length, size_t *cnt)
|
||||
{
|
||||
struct shell_uart *sh_uart = (struct shell_uart *)transport->ctx;
|
||||
|
||||
if (sh_uart->rx_cnt) {
|
||||
memcpy(data, sh_uart->rx, 1);
|
||||
sh_uart->rx_cnt = 0;
|
||||
*cnt = 1;
|
||||
} else {
|
||||
*cnt = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct shell_transport_api shell_uart_transport_api = {
|
||||
.init = init,
|
||||
.uninit = uninit,
|
||||
.enable = enable,
|
||||
.write = write,
|
||||
.read = read
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue