1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00

drivers/ws281x: add VT100 backend for native

To quickly iterate on animations it is handy to being able to simulate
the output on native.

This adds a VT100 terminal backend to the ws281x driver that outputs
the colors straight to the terminal.
This commit is contained in:
Benjamin Valentin 2019-11-23 09:26:28 +01:00 committed by Benjamin Valentin
parent 2e32a11822
commit 8352e4aae0
2 changed files with 60 additions and 0 deletions

View File

@ -678,10 +678,14 @@ endif
ifneq (,$(filter ws281x,$(USEMODULE)))
FEATURES_OPTIONAL += arch_avr8
FEATURES_OPTIONAL += arch_native
ifeq (,$(filter ws281x_%,$(USEMODULE)))
ifneq (,$(filter arch_avr8,$(FEATURES_USED)))
USEMODULE += ws281x_atmega
endif
ifneq (,$(filter arch_native,$(FEATURES_USED)))
USEMODULE += ws281x_vt100
endif
endif
ifneq (,$(filter ws281x_atmega,$(USEMODULE)))
FEATURES_REQUIRED += arch_avr8
@ -689,6 +693,11 @@ ifneq (,$(filter ws281x,$(USEMODULE)))
USEMODULE += xtimer
endif
ifneq (,$(filter ws281x_vt100,$(USEMODULE)))
CFLAGS += -DWS281X_HAVE_PREPARE_TRANSMISSION
CFLAGS += -DWS281X_HAVE_END_TRANSMISSION
endif
ifneq (,$(filter xbee,$(USEMODULE)))
FEATURES_REQUIRED += periph_uart
FEATURES_REQUIRED += periph_gpio

51
drivers/ws281x/vt100.c Normal file
View File

@ -0,0 +1,51 @@
/*
* Copyright 2019 Benjamin Valentin
*
* 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 drivers_ws281x
*
* @{
*
* @file
* @brief Implementation of `ws281x_write()` for VT100 terminals
*
* @author Benjamin Valentin <benpicco@googlemail.com>
*
* @}
*/
#include <stdio.h>
#include "ws281x.h"
void ws281x_write_buffer(ws281x_t *dev, const void *buf, size_t size)
{
(void) dev;
const uint8_t *src = buf;
for (unsigned i = 0; i < size; ++i) {
int r = src[WS281X_BYTES_PER_DEVICE * i + WS281X_OFFSET_R];
int g = src[WS281X_BYTES_PER_DEVICE * i + WS281X_OFFSET_G];
int b = src[WS281X_BYTES_PER_DEVICE * i + WS281X_OFFSET_B];
printf("\033[48;2;%d;%d;%dm ", r, g, b);
}
}
void ws281x_prepare_transmission(ws281x_t *dev)
{
(void) dev;
/* clear the line and reset cursor position */
printf("\033[2K\r");
}
void ws281x_end_transmission(ws281x_t *dev)
{
(void) dev;
/* set color back to normal */
printf("\033[0m");
}