mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
tests/driver_nrf24l01p_ng: Test for nrf24l01p netdev driver
This commit is contained in:
parent
f7a77ebb04
commit
dc9e915231
16
tests/driver_nrf24l01p_ng/Makefile
Normal file
16
tests/driver_nrf24l01p_ng/Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
DEBUG ?= 0
|
||||
|
||||
include ../Makefile.tests_common
|
||||
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
USEMODULE += ps
|
||||
USEMODULE += gnrc
|
||||
USEMODULE += auto_init_gnrc_netif
|
||||
USEMODULE += nrf24l01p_ng
|
||||
USEMODULE += nrf24l01p_ng_diagnostics
|
||||
USEMODULE += netstats_l2
|
||||
USEMODULE += gnrc_txtsnd
|
||||
|
||||
CFLAGS += -DDEBUG_ASSERT_VERBOSE=1
|
||||
include $(RIOTBASE)/Makefile.include
|
27
tests/driver_nrf24l01p_ng/Makefile.ci
Normal file
27
tests/driver_nrf24l01p_ng/Makefile.ci
Normal file
@ -0,0 +1,27 @@
|
||||
BOARD_INSUFFICIENT_MEMORY := \
|
||||
arduino-duemilanove \
|
||||
arduino-leonardo \
|
||||
arduino-mega2560 \
|
||||
arduino-nano \
|
||||
arduino-uno \
|
||||
atmega1284p \
|
||||
atmega128rfa1 \
|
||||
atmega328p \
|
||||
derfmega128 \
|
||||
i-nucleo-lrwan1 \
|
||||
mega-xplained \
|
||||
microduino-corerf \
|
||||
nucleo-f031k6 \
|
||||
nucleo-f042k6 \
|
||||
nucleo-l011k4 \
|
||||
nucleo-l031k6 \
|
||||
nucleo-l053r8 \
|
||||
samd10-xmini \
|
||||
slstk3400a \
|
||||
stk3200 \
|
||||
stm32f030f4-demo \
|
||||
stm32f0discovery \
|
||||
stm32l0538-disco \
|
||||
telosb \
|
||||
waspmote-pro \
|
||||
#
|
43
tests/driver_nrf24l01p_ng/main.c
Normal file
43
tests/driver_nrf24l01p_ng/main.c
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Otto-von-Guericke Universität Magdeburg
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
/**
|
||||
* @ingroup tests
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Test application for the NRF24L01+ transceiver
|
||||
*
|
||||
* @author Fabian Hüßler <fabian.huessler@ovgu.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "shell.h"
|
||||
#include "shell_commands.h"
|
||||
#include "net/gnrc.h"
|
||||
|
||||
#define MAIN_QUEUE_SIZE (8)
|
||||
|
||||
int sc_nrf24ctl(int argc, char *argv[]);
|
||||
|
||||
static const shell_command_t shell_commands[] = {
|
||||
{ "nrf24ctl", "Configure an NRF24L01+ (NG) device", sc_nrf24ctl },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
static msg_t _main_msg_queue[MAIN_QUEUE_SIZE];
|
||||
|
||||
int main(void)
|
||||
{
|
||||
msg_init_queue(_main_msg_queue, MAIN_QUEUE_SIZE);
|
||||
char line_buf[SHELL_DEFAULT_BUFSIZE];
|
||||
shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE);
|
||||
return 0;
|
||||
}
|
330
tests/driver_nrf24l01p_ng/nrf24ctl.c
Normal file
330
tests/driver_nrf24l01p_ng/nrf24ctl.c
Normal file
@ -0,0 +1,330 @@
|
||||
/*
|
||||
* Copyright (C) 2019 Otto-von-Guericke Universität Magdeburg
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU Lesser
|
||||
* General Public License v2.1. See the file LICENSE in the top level
|
||||
* directory for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @ingroup tests
|
||||
* @{
|
||||
*
|
||||
* @file
|
||||
* @brief Tool to configure NRF24L01+ (NG) transceiver
|
||||
*
|
||||
* @author Fabian Hüßler <fabian.huessler@ovgu.de>
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "nrf24l01p_ng.h"
|
||||
#include "nrf24l01p_ng_params.h"
|
||||
|
||||
#ifndef EXIT_SUCCESS
|
||||
#define EXIT_SUCCESS (0)
|
||||
#endif
|
||||
#ifndef EXIT_FAILURE
|
||||
#define EXIT_FAILURE (1)
|
||||
#endif
|
||||
|
||||
#define MIN_ARGC (2)
|
||||
|
||||
extern nrf24l01p_ng_t _nrf24l01p_ng_devs[NRF24L01P_NG_NUM];
|
||||
|
||||
static void print_help(void)
|
||||
{
|
||||
puts(
|
||||
"Usage:\n"
|
||||
|
||||
"nrf24ctl <device index> "
|
||||
"--set "
|
||||
"<address | pipe> <value> <pipe index>\n"
|
||||
|
||||
"nrf24ctl <device index> "
|
||||
"--set "
|
||||
"<channel | crc | data_rate | power | retr_delay | state | max_retr> "
|
||||
"<value>\n"
|
||||
|
||||
"nrf24ctl <device index> "
|
||||
"--get "
|
||||
"<address | pipe> <pipe index>\n"
|
||||
|
||||
"nrf24ctl <device index> "
|
||||
"--get "
|
||||
"<pipe | channel | crc | data_rate | power | retr_delay | stata | "
|
||||
"max_retr>\n"
|
||||
|
||||
"nrf24ctl <device index>" " --regs\n"
|
||||
"nrf24ctl <device index>" " --info\n"
|
||||
);
|
||||
}
|
||||
|
||||
int sc_nrf24ctl(int argc, char *argv[])
|
||||
{
|
||||
if (argc < MIN_ARGC) {
|
||||
printf("[nrf24ctl] Expect at least %d arguments\n", MIN_ARGC);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
int dev_index = atoi(argv[1]);
|
||||
if (dev_index < 0 || dev_index >= (int)NRF24L01P_NG_NUM) {
|
||||
printf("[nrf24ctl] Invalid device index: %d\n", dev_index);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
nrf24l01p_ng_t *dev = &_nrf24l01p_ng_devs[dev_index];
|
||||
int ret = 0;
|
||||
switch (argc) {
|
||||
case 6: {
|
||||
/* nrf24ctl <dev_index> --set <attribute> <value> <pipe> */
|
||||
int pipe = atoi(argv[5]);
|
||||
if (pipe < 0 || pipe >= NRF24L01P_NG_PX_NUM_OF) {
|
||||
printf("[nrf24ctl] bad pipe index\n");
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
if ((!strcmp(argv[2], "-s")) || (!strcmp(argv[2], "--set"))) {
|
||||
if (!(strcmp(argv[3], "address"))) {
|
||||
uint8_t address[NRF24L01P_NG_MAX_ADDR_WIDTH];
|
||||
char *tok = NULL;
|
||||
unsigned a = 0;
|
||||
while (a < sizeof(address) &&
|
||||
(tok = strtok(a ? NULL : argv[4], ":"))) {
|
||||
if (strlen(tok) > 2) {
|
||||
printf("[nrf24ctl] Invalid address token: %s\n",
|
||||
tok);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
address[a++] = (int)strtol(tok, NULL, 16);
|
||||
}
|
||||
ret = nrf24l01p_ng_set_rx_address(dev, address, pipe);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] Could not set address (%d)\n", ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "pipe"))) {
|
||||
bool enable = !!(atoi(argv[4]));
|
||||
ret = nrf24l01p_ng_set_enable_pipe(dev, pipe, enable);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] "
|
||||
"Could not enable/disable pipe %d\n", pipe);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid attribute: --set %s\n",
|
||||
argv[3]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid command: %s\n", argv[2]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
} break;
|
||||
case 5: {
|
||||
/* nrf24ctl <dev_index> --set <attribute> <value> */
|
||||
if ((!strcmp(argv[2], "-s")) || (!strcmp(argv[2], "--set"))) {
|
||||
if (!(strcmp(argv[3], "channel"))) {
|
||||
int ch = atoi(argv[4]);
|
||||
ret = nrf24l01p_ng_set_channel(dev, ch);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] Could not switch to channel (%d)\n",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "crc"))) {
|
||||
int crc_len = atoi(argv[4]);
|
||||
nrf24l01p_ng_crc_t crco = nrf24l01p_ng_valtoe_crc(crc_len);
|
||||
ret = nrf24l01p_ng_set_crc(dev, crco);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] Could not set CRC length (%d)\n",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "data_rate"))) {
|
||||
int dr = atoi(argv[4]);
|
||||
nrf24l01p_ng_rfdr_t adr = nrf24l01p_ng_valtoe_rfdr(dr);
|
||||
ret = nrf24l01p_ng_set_air_data_rate(dev, adr);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] Could not set air data rate (%d)\n",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "power"))) {
|
||||
int pwr = atoi(argv[4]);
|
||||
nrf24l01p_ng_tx_power_t txp =
|
||||
nrf24l01p_ng_valtoe_tx_power(pwr);
|
||||
ret = nrf24l01p_ng_set_tx_power(dev, txp);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] Could not set Tx power (%d)\n",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "retr_delay"))) {
|
||||
int del = atoi(argv[4]);
|
||||
nrf24l01p_ng_ard_t ard = nrf24l01p_ng_valtoe_ard(del);
|
||||
ret = nrf24l01p_ng_set_retransm_delay(dev, ard);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] "
|
||||
"Could not set retransmission delay (%d)\n",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "state"))) {
|
||||
nrf24l01p_ng_state_t s =
|
||||
nrf24l01p_ng_diagnostics_string_to_state(argv[4]);
|
||||
ret = nrf24l01p_ng_set_state(dev, s);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24l01p] "
|
||||
"Could not change device state (%d)",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else if (!(strcmp(argv[3], "max_retr"))) {
|
||||
int retr = atoi(argv[4]);
|
||||
ret = nrf24l01p_ng_set_max_retransm(dev, retr);
|
||||
if (ret < 0) {
|
||||
printf("[nrf24ctl] "
|
||||
"Could not set max. retransmissions (%d)\n",
|
||||
ret);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid attribute: --set %s\n",
|
||||
argv[3]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
/* nrf24ctl <dev_index> --get <attribute> <pipe> */
|
||||
else if ((!strcmp(argv[2], "-g")) ||
|
||||
(!strcmp(argv[2], "--get"))) {
|
||||
int pipe = atoi(argv[4]);
|
||||
if (pipe < 0 || pipe >= NRF24L01P_NG_PX_NUM_OF) {
|
||||
printf("[nrf24ctl] bad pipe index\n");
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
if (!(strcmp(argv[3], "address"))) {
|
||||
uint8_t address[2 * NRF24L01P_NG_MAX_ADDR_WIDTH + 5];
|
||||
address[sizeof(address) - 1] = '\0';
|
||||
ret = nrf24l01p_ng_get_rx_address(dev, address, pipe);
|
||||
uint8_t i;
|
||||
for (i = sizeof(address) - 2; ret > 0;) {
|
||||
char hx[3] = { '0', '0', 0 };
|
||||
sprintf(hx, "%2x", address[--ret]);
|
||||
address[i--] = hx[1];
|
||||
address[i--] = hx[0];
|
||||
if (ret) {
|
||||
address[i--] = ':';
|
||||
}
|
||||
}
|
||||
printf("%s\n", address + (i += 1));
|
||||
}
|
||||
else if (!(strcmp(argv[3], "pipe"))) {
|
||||
bool enable = false;
|
||||
nrf24l01p_ng_get_enable_pipe(dev, pipe, &enable);
|
||||
printf("nrf24l01p device %d - pipe %d: %s\n",
|
||||
dev_index, pipe,
|
||||
(enable ? "enabled" : "disabled"));
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid attribute: --get %s\n",
|
||||
argv[3]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid command: %s\n", argv[2]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
} break;
|
||||
case 4: {
|
||||
/* nrf24ctl <dev_index> --get <attribute> */
|
||||
if ((!strcmp(argv[2], "-g")) || (!strcmp(argv[2], "--get"))) {
|
||||
if (!(strcmp(argv[3], "channel"))) {
|
||||
uint8_t ch = nrf24l01p_ng_get_channel(dev);
|
||||
printf("nrf24l01p device %d - Channel: %u (%d MHz)\n",
|
||||
dev_index, ch, NRF24L01P_NG_BASE_FRQ_MHZ + ch);
|
||||
}
|
||||
else if (!(strcmp(argv[3], "crc"))) {
|
||||
uint8_t crc_len = nrf24l01p_ng_get_crc(dev, NULL);
|
||||
printf("nrf24l01p device %d - "
|
||||
"CRC length: %u [bytes]\n",
|
||||
dev_index, crc_len);
|
||||
}
|
||||
else if (!(strcmp(argv[3], "data_rate"))) {
|
||||
uint16_t data_rate =
|
||||
nrf24l01p_ng_get_air_data_rate(dev, NULL);
|
||||
printf("nrf24l01p device %d - "
|
||||
"Air data rate: %u [kbit/s]\n",
|
||||
dev_index, data_rate);
|
||||
}
|
||||
else if (!(strcmp(argv[3], "power"))) {
|
||||
int8_t power = nrf24l01p_ng_get_tx_power(dev, NULL);
|
||||
printf("nrf24l01p device %d - "
|
||||
"Tx Power: %d [dbm]\n",
|
||||
dev_index, power);
|
||||
}
|
||||
else if (!(strcmp(argv[3], "retr_delay"))) {
|
||||
uint16_t delay =
|
||||
nrf24l01p_ng_get_retransm_delay(dev, NULL);
|
||||
printf(
|
||||
"nrf24l01p device %d - "
|
||||
"Retransmission delay: %u [us]\n",
|
||||
dev_index, delay);
|
||||
}
|
||||
else if (!(strcmp(argv[3], "state"))) {
|
||||
const char *sstate =
|
||||
nrf24l01p_ng_diagnostics_state_to_string(dev->state);
|
||||
printf("nrf24l01p device %d - State: %s\n", dev_index,
|
||||
sstate);
|
||||
}
|
||||
else if (!(strcmp(argv[3], "max_retr"))) {
|
||||
uint8_t retransm = nrf24l01p_ng_get_max_retransm(dev);
|
||||
printf("nrf24l01p device %d - "
|
||||
"Maximum retransmission: %u\n",
|
||||
dev_index, retransm);
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid attribute: --get %s\n",
|
||||
argv[3]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid command: %s\n", argv[2]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
} break;
|
||||
case 3: {
|
||||
/* nrf24ctl <dev_index> --regs */
|
||||
if ((!strcmp(argv[2], "-r")) || (!strcmp(argv[2], "--regs"))) {
|
||||
nrf24l01p_ng_print_all_regs(dev);
|
||||
}
|
||||
/* nrf24ctl <dev_index> --info */
|
||||
else if ((!strcmp(argv[2], "-i")) ||
|
||||
(!strcmp(argv[2], "--info"))) {
|
||||
nrf24l01p_ng_print_dev_info(dev);
|
||||
}
|
||||
else {
|
||||
printf("[nrf24ctl] Invalid command: %s\n", argv[2]);
|
||||
goto PRINT_HELP_EXIT;
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
PRINT_HELP_EXIT:
|
||||
print_help();
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
puts("[nrf24ctl] Success");
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Loading…
Reference in New Issue
Block a user