mirror of
https://github.com/RIOT-OS/RIOT.git
synced 2024-12-29 04:50:03 +01:00
tests/dali_host: add initial lowlevel test for DALI host mode
This commit is contained in:
parent
dcf5d7ab7f
commit
cac3616e6b
17
tests/driver_dali_host/Makefile
Normal file
17
tests/driver_dali_host/Makefile
Normal file
@ -0,0 +1,17 @@
|
||||
include ../Makefile.tests_common
|
||||
|
||||
QUIET ?= 1
|
||||
# DEVELHELP enabled by default for all tests, set 0 to disable
|
||||
DEVELHELP ?= 1
|
||||
|
||||
# Shell modules
|
||||
USEMODULE += app_metadata
|
||||
USEMODULE += shell
|
||||
USEMODULE += shell_commands
|
||||
USEMODULE += ps
|
||||
USEMODULE += dali_host
|
||||
USEMODULE += dali
|
||||
USEMODULE += ztimer
|
||||
USEMODULE += ztimer_msec
|
||||
|
||||
include $(RIOTBASE)/Makefile.include
|
199
tests/driver_dali_host/main.c
Normal file
199
tests/driver_dali_host/main.c
Normal file
@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Copyright (C) 2021 Mesotic SAS
|
||||
*
|
||||
* 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 DALI device drivers
|
||||
*
|
||||
* @author Dylan Laduranty <dylan.laduranty@mesotic.com>
|
||||
* @}
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "board.h"
|
||||
#include "shell_commands.h"
|
||||
#include "shell.h"
|
||||
#include "dali.h"
|
||||
#include "dali_params.h"
|
||||
|
||||
#define ENABLE_DEBUG 0
|
||||
#include "debug.h"
|
||||
|
||||
#ifndef SHELL_BUFSIZE
|
||||
#define SHELL_BUFSIZE (128U)
|
||||
#endif
|
||||
|
||||
#define CONVERT_ERROR (-32768)
|
||||
#define DALI_CMD 0x90
|
||||
|
||||
static dali_host_t dev;
|
||||
|
||||
static inline int _get_num(const char *str)
|
||||
{
|
||||
errno = 0;
|
||||
char *temp;
|
||||
long val = strtol(str, &temp, 0);
|
||||
|
||||
if (temp == str || *temp != '\0' ||
|
||||
((val == LONG_MIN || val == LONG_MAX) && errno == ERANGE)) {
|
||||
val = CONVERT_ERROR;
|
||||
}
|
||||
return (int)val;
|
||||
}
|
||||
|
||||
static int cmd_send(int argc, char **argv)
|
||||
{
|
||||
uint8_t addr, cmd;
|
||||
if (argc < 3) {
|
||||
puts("send: missing argument");
|
||||
return -1;
|
||||
}
|
||||
addr = _get_num(argv[1]);
|
||||
cmd = _get_num(argv[2]);
|
||||
|
||||
printf("sending cmd:0x%x to 0x%x\n", cmd, addr);
|
||||
dali_host_xfer(&dev, addr, cmd, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmd_conf(int argc, char **argv)
|
||||
{
|
||||
uint8_t addr, cmd;
|
||||
if (argc < 3) {
|
||||
puts("send: missing argument");
|
||||
return -1;
|
||||
}
|
||||
addr = _get_num(argv[1]);
|
||||
cmd = _get_num(argv[2]);
|
||||
|
||||
printf("sending cmd:0x%x to 0x%x\n", cmd, addr);
|
||||
dali_host_xfer(&dev, addr, cmd, NULL);
|
||||
ztimer_sleep(ZTIMER_MSEC, 30);
|
||||
dali_host_xfer(&dev, addr, cmd, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmd_send_bcast(int argc, char **argv)
|
||||
{
|
||||
uint8_t cmd;
|
||||
if (argc < 2) {
|
||||
puts("sendall: missing argument");
|
||||
return -1;
|
||||
}
|
||||
cmd = _get_num(argv[1]);
|
||||
for (unsigned i=0; i<64; i++) {
|
||||
printf("sending cmd:0x%x to 0x%x\n", cmd, i);
|
||||
dali_host_xfer(&dev, (i << 1) | 1, cmd, NULL);
|
||||
ztimer_sleep(ZTIMER_MSEC, 25);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmd_xfer(int argc, char **argv)
|
||||
{
|
||||
uint8_t addr, cmd;
|
||||
uint8_t data;
|
||||
int ret;
|
||||
if (argc < 3) {
|
||||
puts("xfer: missing argument");
|
||||
return -1;
|
||||
}
|
||||
addr = _get_num(argv[1]);
|
||||
cmd = _get_num(argv[2]);
|
||||
|
||||
printf("sending cmd:0x%x to 0x%x\n", cmd, addr);
|
||||
ret = dali_host_xfer(&dev, addr, cmd, &data);
|
||||
if (ret != 0) {
|
||||
printf("error on reception:%d\n", ret);
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("device answered: 0x%x\n", data);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmd_detect(int argc, char **argv)
|
||||
{
|
||||
uint8_t data;
|
||||
(void)data;
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
puts("Scanning for DALI devices...");
|
||||
|
||||
puts(
|
||||
"addr not ack'ed = \"-\", addr ack'ed = \"X\", error = \"E\"\n"
|
||||
" 0 1 2 3 4 5 6 7 8 9 a b c d e f"
|
||||
);
|
||||
|
||||
for (char i = 0; i < 4; i++) {
|
||||
char row[] = { '0', 'x', '0' + i, '0', '\0' };
|
||||
fputs(row, stdout);
|
||||
uint8_t addr = i;
|
||||
addr <<= 4;
|
||||
for (unsigned j = 0; j < 16; j++) {
|
||||
char str[] = { ' ', '-', '\0' };
|
||||
uint8_t data;
|
||||
int ret;
|
||||
ret = dali_host_xfer(&dev, (addr << 1) | 1, DALI_CMD, &data);
|
||||
|
||||
switch (ret) {
|
||||
case 0:
|
||||
/* success: Device did respond */
|
||||
str[1] = 'X';
|
||||
break;
|
||||
case -ENXIO:
|
||||
/* No ACK --> no device */
|
||||
break;
|
||||
default:
|
||||
/* Some unexpected error */
|
||||
str[1] = 'E';
|
||||
break;
|
||||
}
|
||||
|
||||
fputs(str, stdout);
|
||||
addr++;
|
||||
}
|
||||
puts("");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const shell_command_t shell_commands[] = {
|
||||
{ "send", "send a command to a device", cmd_send },
|
||||
{ "conf", "send a configuration command (twice a command"\
|
||||
"under 100 ms) to a device", cmd_conf },
|
||||
{ "send_bcast", "send a command to 64 devices", cmd_send_bcast},
|
||||
{ "xfer", "send a command and wait for response", cmd_xfer },
|
||||
{ "detect", "query available devices on the bus", cmd_detect},
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
int main(void)
|
||||
{
|
||||
puts("\nDALI host driver test application");
|
||||
|
||||
memset(&dev, 0, sizeof(dali_host_t));
|
||||
dali_host_init(&dev, &dali_config[0]);
|
||||
|
||||
/* run the shell */
|
||||
char line_buf[SHELL_BUFSIZE];
|
||||
shell_run(shell_commands, line_buf, SHELL_BUFSIZE);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user