Linux Audio

Check our new training course

Embedded Linux Audio

Check our new training course
with Creative Commons CC-BY-SA
lecture materials

Bootlin logo

Elixir Cross Referencer

Loading...
/*
 * Copyright (c) 2018 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <kernel.h>
#include <stdio.h>
#include <misc/printk.h>
#include <shell/shell.h>
#include <openthread/cli.h>
#include <openthread/platform/platform.h>

#include "platform-zephyr.h"

#define OT_SHELL_MODULE "ot"

#define OT_SHELL_BUFFER_SIZE 256

static char rx_buffer[OT_SHELL_BUFFER_SIZE];

int otConsoleOutputCallback(const char *aBuf, uint16_t aBufLength,
			    void *aContext)
{
	ARG_UNUSED(aContext);

	printk("%s", aBuf);

	return aBufLength;
}

static int ot_cmd(int argc, char *argv[])
{
	char *buf_ptr = rx_buffer;
	size_t buf_len = OT_SHELL_BUFFER_SIZE;
	size_t arg_len = 0;
	int i;

	if (argc < 2) {
		return -1;
	}

	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 = snprintf(buf_ptr, buf_len, "%s", argv[i]);

		if (arg_len >= buf_len) {
			printk("OT shell buffer full\n");
			return -1;
		}
	}

	if (i == argc) {
		buf_len -= arg_len;
	}

	otCliConsoleInputLine(rx_buffer, OT_SHELL_BUFFER_SIZE - buf_len);

	return 0;
}

static struct shell_cmd ot_commands[] = {
	{ "cmd", ot_cmd, "OpenThread command" },
	{NULL, NULL, NULL}
};

void platformShellInit(otInstance *aInstance)
{
	SHELL_REGISTER(OT_SHELL_MODULE, ot_commands);
	otCliConsoleInit(aInstance, otConsoleOutputCallback, NULL);
}