OpenThread requires platform definition with standarized API so we have to add wrappers to make it compatible with Zephyr. OpenThread is based on autoconf, this requires more specific CMakeLists.txt which allows to clone specific commit or point to local copy of openthread. Signed-off-by: Kamil Sroka <kamil.sroka@nordicsemi.no>
80 lines
1.4 KiB
C
80 lines
1.4 KiB
C
/*
|
|
* 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);
|
|
}
|
|
|