96 lines
2.3 KiB
C
96 lines
2.3 KiB
C
|
|
#include "ws2812_spi_shell.h"
|
||
|
|
#include "ws2812_spi.h"
|
||
|
|
#include "shell/sh.h"
|
||
|
|
#include "sh_vset.h"
|
||
|
|
|
||
|
|
#include <string.h>
|
||
|
|
|
||
|
|
static ws2812_spi_led_strip_t *s_led_strip;
|
||
|
|
static uint32_t s_value;
|
||
|
|
|
||
|
|
SH_CMD_FN(set);
|
||
|
|
SH_CMD_FN(clr);
|
||
|
|
|
||
|
|
SH_DEF_SUB_CMD(
|
||
|
|
sub_led,
|
||
|
|
SH_SETUP_CMD("set", "点亮灯珠 <引脚号> <灯珠号> [红] [绿] [蓝]", set, NULL), //
|
||
|
|
SH_SETUP_CMD("clr", "熄灭全部灯珠 <引脚号>", clr, NULL), //
|
||
|
|
);
|
||
|
|
|
||
|
|
SH_DEF_CMD(
|
||
|
|
_register_cmd,
|
||
|
|
SH_SETUP_CMD("led", "操作灯带驱动", NULL, sub_led), //
|
||
|
|
);
|
||
|
|
|
||
|
|
void ws2812_spi_shell_register(ws2812_spi_led_strip_t *led_strip)
|
||
|
|
{
|
||
|
|
s_led_strip = led_strip;
|
||
|
|
sh_register_cmd(&_register_cmd);
|
||
|
|
}
|
||
|
|
|
||
|
|
void ws2812_spi_shell_unregister(void)
|
||
|
|
{
|
||
|
|
sh_unregister_cmd(&_register_cmd);
|
||
|
|
}
|
||
|
|
|
||
|
|
static int _set_value(const char *argv[]) { return SET_VAR(&s_value, 0, 0x100); }
|
||
|
|
|
||
|
|
SH_CMD_FN(set)
|
||
|
|
{
|
||
|
|
uint32_t pin = 0, index = 0, red = 0, green = 0, blue = 0;
|
||
|
|
if (argc < 2)
|
||
|
|
{
|
||
|
|
sh_echo(sh_hdl, "输入少于 2 个参数\r\n");
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (argc >= 1 && _set_value(&argv[0]))
|
||
|
|
return -1;
|
||
|
|
pin = *(volatile __typeof(s_value) *)&s_value;
|
||
|
|
|
||
|
|
if (argc >= 2 && _set_value(&argv[1]))
|
||
|
|
return -1;
|
||
|
|
index = *(volatile __typeof(s_value) *)&s_value;
|
||
|
|
|
||
|
|
if (argc >= 3 && _set_value(&argv[2]))
|
||
|
|
return -1;
|
||
|
|
red = *(volatile __typeof(s_value) *)&s_value;
|
||
|
|
|
||
|
|
if (argc >= 4 && _set_value(&argv[3]))
|
||
|
|
return -1;
|
||
|
|
green = *(volatile __typeof(s_value) *)&s_value;
|
||
|
|
|
||
|
|
if (argc >= 5 && _set_value(&argv[4]))
|
||
|
|
return -1;
|
||
|
|
blue = *(volatile __typeof(s_value) *)&s_value;
|
||
|
|
|
||
|
|
ws2812_spi_led_strip_set_pixel(s_led_strip, index, red, green, blue);
|
||
|
|
#if (CONFIG_LED_STRIP_MAX_LEDS)
|
||
|
|
ws2812_spi_led_strip_refresh(s_led_strip, CONFIG_LED_STRIP_MAX_LEDS, pin);
|
||
|
|
#else
|
||
|
|
ws2812_spi_led_strip_refresh(s_led_strip, 126, pin);
|
||
|
|
#endif
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
SH_CMD_FN(clr)
|
||
|
|
{
|
||
|
|
uint32_t pin = 0;
|
||
|
|
if (argc < 1)
|
||
|
|
{
|
||
|
|
sh_echo(sh_hdl, "输入少于 1 个参数\r\n");
|
||
|
|
return -1;
|
||
|
|
}
|
||
|
|
|
||
|
|
_set_value(&argv[0]);
|
||
|
|
pin = *(volatile __typeof(s_value) *)&s_value;
|
||
|
|
|
||
|
|
ws2812_spi_led_strip_clear(s_led_strip);
|
||
|
|
#if (CONFIG_LED_STRIP_MAX_LEDS)
|
||
|
|
ws2812_spi_led_strip_refresh(s_led_strip, CONFIG_LED_STRIP_MAX_LEDS, pin);
|
||
|
|
#else
|
||
|
|
ws2812_spi_led_strip_refresh(s_led_strip, 126, pin);
|
||
|
|
#endif
|
||
|
|
return 0;
|
||
|
|
}
|