4618 lines
171 KiB
C
4618 lines
171 KiB
C
/*!
|
||
* \file ws2815.c
|
||
*
|
||
* \brief Target xc aotimer driver implementation
|
||
*
|
||
* \copyright Revised BSD License, see section \ref LICENSE.
|
||
*
|
||
* \code
|
||
*
|
||
* _ __ _ ________ _
|
||
* | |/ /(_)___ / ____/ /_ (_)___
|
||
* | // / __ \/ / / __ \/ / __ \
|
||
* / |/ / / / / /___/ / / / / /_/ /
|
||
* /_/|_/_/_/ /_/\____/_/ /_/_/ .___/
|
||
* /_/
|
||
* (C) 2022-2025 XinChip
|
||
*
|
||
* \endcode
|
||
*
|
||
* \author ( XinChip ) Alex-J
|
||
*
|
||
* \author ( XinChip )
|
||
*/
|
||
|
||
/*-----------------------------------------------------------------------------------
|
||
INCLUDE HEADE FILES
|
||
------------------------------------------------------------------------------------*/
|
||
|
||
#if(WS2815_CONTROL_MODE == SPI_DMA_MODE)
|
||
#include "xc_drv_spi_dma.h"
|
||
#include "xc_drv_spi.h"
|
||
#elif(WS2815_CONTROL_MODE == GPIO_DELAY_MODE)
|
||
#include "xc_drv_gpio.h"
|
||
#endif
|
||
|
||
/*------------------------------------------------------------------------------------
|
||
Local Variables
|
||
-------------------------------------------------------------------------------------*/
|
||
LEDX_Task_TypeDef LED_TaskDef;
|
||
uint8_t Temp_Flag = 0;
|
||
uint8_t auto_Flag = 0;
|
||
bool shutdown_Flag = 0;
|
||
uint32_t color_buf[1] = {0};
|
||
uint32_t code_buf[1] = {0};
|
||
uint32_t conversion_color = 0;
|
||
uint8_t step_temp = 0;
|
||
uint8_t Muisc_mode = 0;
|
||
uint8_t Muisc_Flag = 0;
|
||
uint8_t color_ch = 0;
|
||
|
||
uint8_t T1H = (0xF0); // 1码高电平(937.5ns)
|
||
uint8_t T0H = (0xC0); // 0码高电平(312.5ns)
|
||
|
||
// 预定义彩虹颜色表
|
||
const uint32_t rainbow_colors[11] = {
|
||
0xFF0000, // 红色
|
||
0xFF007F, // 粉红
|
||
0xFF00FF, // 紫色
|
||
0x7F00FF, // 靛蓝
|
||
0x0000FF, // 蓝色
|
||
0x00FFFF, // 青色
|
||
0x00FF7F, // 蓝绿色
|
||
0x00FF00, // 绿色
|
||
0x7FFF00, // 黄绿色
|
||
0xFFFF00, // 黄色
|
||
0xFF7F00, // 橙色
|
||
};
|
||
const uint32_t rainbow[7] = {
|
||
0xff0000, // 红
|
||
0x00ff00, // 绿
|
||
0x0000ff, // 蓝
|
||
0xffff00, // 黄
|
||
0x00ffff, // 青
|
||
0x9400D3, // 紫
|
||
0xffffff // 白
|
||
};
|
||
const uint32_t _rgb[3] = {
|
||
0xff0000, // 红
|
||
0x00ff00, // 绿
|
||
0x0000ff // 蓝
|
||
};
|
||
const uint32_t _ycp[3] = {
|
||
0xffff00, // 黄
|
||
0x00ffff, // 青
|
||
0x9400D3 // 紫
|
||
};
|
||
|
||
const uint32_t _ycpb[4] = {
|
||
0xffff00, // 黄
|
||
0x00ffff, // 青
|
||
0x9400D3, // 紫
|
||
0x0000ff // 蓝
|
||
};
|
||
const uint32_t _ycgb[4] = {
|
||
0xffff00, // 黄
|
||
0x00ffff, // 青
|
||
0x00ff00, // 绿
|
||
0x0000ff // 蓝
|
||
};
|
||
|
||
const uint32_t _ry[2] = {
|
||
0xff0000, // 红
|
||
0xffff00 // 黄
|
||
};
|
||
const uint32_t _rp[2] = {
|
||
0xff0000, // 红
|
||
0x9400D3 // 紫
|
||
};
|
||
const uint32_t _gc[2] = {
|
||
0x00ff00, // 绿
|
||
0x00ffff // 青
|
||
};
|
||
const uint32_t _gy[2] = {
|
||
0x00ff00, // 绿
|
||
0xffff00 // 黄
|
||
};
|
||
const uint32_t _bp[2] = {
|
||
0x0000ff, // 蓝
|
||
0x9400D3 // 紫
|
||
};
|
||
const uint32_t _rg[2] = {
|
||
0xff0000, // 红
|
||
0x00ff00 // 绿
|
||
};
|
||
const uint32_t _gb[2] = {
|
||
0x00ff00, // 绿
|
||
0x0000ff // 蓝
|
||
};
|
||
const uint32_t _yb[2] = {
|
||
0xffff00, // 黄
|
||
0x0000ff // 蓝
|
||
};
|
||
const uint32_t _yc[2] = {
|
||
0xffff00, // 黄
|
||
0x00ffff // 青
|
||
};
|
||
const uint32_t _cp[2] = {
|
||
0x00ffff, // 青
|
||
0x9400D3 // 紫
|
||
};
|
||
const uint32_t _bw[2] = {
|
||
0x000000, // 黑
|
||
0xffffff // 白
|
||
};
|
||
|
||
|
||
|
||
|
||
// mode73-74 六色明暗过渡红色
|
||
const uint32_t rainbow1[9] = {
|
||
0x00FF7F, // 绿
|
||
0x1E90FF, // 蓝
|
||
0xDC143C, // 红
|
||
0xFFD700, // 黄
|
||
0x00ffff, // 青
|
||
0xDC143C, // 红
|
||
0x9400D3, // 紫
|
||
0xFFFAF0, // 白
|
||
0xDC143C // 红
|
||
};
|
||
// mode75-76 六色明暗过渡绿色
|
||
const uint32_t rainbow2[9] = {
|
||
0xDC143C, // 红
|
||
0x1E90FF, // 蓝
|
||
0x00FF7F, // 绿
|
||
0xFFD700, // 黄
|
||
0x00ffff, // 青
|
||
0x00FF7F, // 绿
|
||
0x9400D3, // 紫
|
||
0xFFFAF0, // 白
|
||
0x00FF7F // 绿
|
||
};
|
||
// mode77-78 六色明暗过渡蓝色
|
||
const uint32_t rainbow3[9] = {
|
||
0xDC143C, // 红
|
||
0x00FF7F, // 绿
|
||
0x1E90FF, // 蓝
|
||
0xFFD700, // 黄
|
||
0x00ffff, // 青
|
||
0x1E90FF, // 蓝
|
||
0x9400D3, // 紫
|
||
0xFFFAF0, // 白
|
||
0x1E90FF // 蓝
|
||
};
|
||
// mode79-80 六色明暗过渡青色
|
||
const uint32_t rainbow4[9] = {
|
||
0xDC143C, // 红
|
||
0x00FF7F, // 绿
|
||
0x00ffff, // 青
|
||
0x1E90FF, // 蓝
|
||
0xFFD700, // 黄
|
||
0x00ffff, // 青
|
||
0x9400D3, // 紫
|
||
0xFFFAF0, // 白
|
||
0x00ffff // 青
|
||
};
|
||
// mode81-82 六色明暗过渡黄色
|
||
const uint32_t rainbow5[9] = {
|
||
0xDC143C, // 红
|
||
0x00FF7F, // 绿
|
||
0xFFD700, // 黄
|
||
0x1E90FF, // 蓝
|
||
0x00ffff, // 青
|
||
0xFFD700, // 黄
|
||
0x9400D3, // 紫
|
||
0xFFFAF0, // 白
|
||
0xFFD700 // 黄
|
||
};
|
||
// mode83-84 六色明暗过渡紫色
|
||
const uint32_t rainbow6[9] = {
|
||
0xDC143C, // 红
|
||
0x00FF7F, // 绿
|
||
0x9400D3, // 紫
|
||
0x1E90FF, // 蓝
|
||
0x00ffff, // 青
|
||
0x9400D3, // 紫
|
||
0xFFD700, // 黄
|
||
0xFFFAF0, // 白
|
||
0x9400D3 // 紫
|
||
};
|
||
// mode85-86 六色明暗过渡白色
|
||
const uint32_t rainbow7[9] = {
|
||
0xDC143C, // 红
|
||
0x00FF7F, // 绿
|
||
0xF5FFFA, // 白
|
||
0x1E90FF, // 蓝
|
||
0x00ffff, // 青
|
||
0xF5FFFA, // 白
|
||
0xFFD700, // 黄
|
||
0x9400D3, // 紫
|
||
0xF5FFFA // 白
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
// mode3-亮度衰减表
|
||
const uint16_t brightness_table[5] = {
|
||
102, // 位置0: 40%亮度
|
||
179, // 位置1: 70%亮度
|
||
255, // 位置2: 100%亮度
|
||
179, // 位置3: 70%亮度
|
||
102 // 位置4: 40%亮度
|
||
};
|
||
// mode10亮度衰减表
|
||
const uint16_t brightness_table2[21] = {
|
||
255, // 位置0: 100%亮度
|
||
242, // 位置1: 95%亮度
|
||
230, // 位置2: 90%亮度
|
||
217, // 位置3: 85%亮度
|
||
204, // 位置4: 80%亮度
|
||
191, // 位置5: 75%亮度
|
||
179, // 位置6: 70%亮度
|
||
166, // 位置7: 65%亮度
|
||
153, // 位置8: 60%亮度
|
||
140, // 位置9: 55%亮度
|
||
128, // 位置10: 50%亮度
|
||
115, // 位置11: 45%亮度
|
||
102, // 位置12: 40%亮度
|
||
90, // 位置13: 35%亮度
|
||
77, // 位置14: 30%亮度
|
||
64, // 位置15: 25%亮度
|
||
51, // 位置16: 20%亮度
|
||
38, // 位置17: 15%亮度
|
||
26, // 位置18: 10%亮度
|
||
13, // 位置19: 5%亮度
|
||
0 // 位置20: 0%亮度
|
||
};
|
||
// mode11-16亮度衰减表
|
||
const uint16_t brightness_table3[11] = {
|
||
255, // 位置0: 100%亮度
|
||
230, // 位置1: 90%亮度
|
||
204, // 位置2: 80%亮度
|
||
179, // 位置3: 70%亮度
|
||
153, // 位置4: 60%亮度
|
||
128, // 位置5: 50%亮度
|
||
102, // 位置6: 40%亮度
|
||
77, // 位置7: 30%亮度
|
||
51, // 位置8: 20%亮度
|
||
26, // 位置9: 10%亮度
|
||
0 // 位置10: 0%亮度
|
||
};
|
||
// mode67-72亮度衰减表
|
||
const uint16_t brightness_table4[7] = {
|
||
64, // 位置0: 25%亮度
|
||
128, // 位置1: 50%亮度
|
||
191, // 位置2: 75%亮度
|
||
255, // 位置3: 100%亮度
|
||
191, // 位置4: 75%亮度
|
||
128, // 位置5: 50%亮度
|
||
64 // 位置6: 25%亮度
|
||
};
|
||
// mode73-86亮度衰减表
|
||
const uint16_t brightness_table5[7] = {
|
||
255, // 位置0: 100%亮度
|
||
204, // 位置2: 80%亮度
|
||
153, // 位置4: 60%亮度
|
||
102, // 位置6: 40%亮度
|
||
77, // 位置8: 30%亮度
|
||
51, // 位置9: 20%亮度
|
||
26 // 位置6: 10%亮度
|
||
};
|
||
// mode129亮度衰减表
|
||
const uint16_t brightness_table6[24] = {
|
||
0, // 位置0: 亮度
|
||
0,
|
||
0,
|
||
0,
|
||
13, // 位置1: 亮度
|
||
13, // 位置2: 亮度
|
||
13,
|
||
26,
|
||
26, // 位置3: 亮度
|
||
38, // 位置4: 亮度
|
||
38,
|
||
51, // 位置5: 亮度
|
||
64, // 位置6: 亮度
|
||
77, // 位置7: 亮度
|
||
90, // 位置8: 亮度
|
||
102, // 位置9: 亮度
|
||
128, // 位置11: 亮度
|
||
140, // 位置12: 亮度
|
||
166, // 位置14: 亮度
|
||
179, // 位置15: 亮度
|
||
204, // 位置17: 亮度
|
||
217, // 位置18: 亮度
|
||
242, // 位置20: 度
|
||
255
|
||
};
|
||
// mode130亮度衰减表
|
||
const uint16_t brightness_table7[24] = {
|
||
255, // 位置0: 亮度
|
||
242,
|
||
217,
|
||
204,
|
||
217, // 位置1: 亮度
|
||
204, // 位置2: 亮度
|
||
179,
|
||
166,
|
||
140, // 位置3: 亮度
|
||
128, // 位置4: 亮度
|
||
102,
|
||
90, // 位置5: 亮度
|
||
77, // 位置6: 亮度
|
||
64, // 位置7: 亮度
|
||
51, // 位置8: 亮度
|
||
38, // 位置9: 亮度
|
||
38, // 位置11: 亮度
|
||
26, // 位置12: 亮度
|
||
26, // 位置14: 亮度
|
||
13, // 位置15: 亮度
|
||
13, // 位置17: 亮度
|
||
0, // 位置18: 亮度
|
||
0, // 位置20: 度
|
||
0
|
||
};
|
||
//uint32_t sysclk_sel_tbl[] = {2000, 16000, 24000, 48000, 60000, 80000, 1200000, 160000};
|
||
|
||
|
||
#if(WS2815_CONTROL_MODE == SPI_DMA_MODE)
|
||
// 双缓冲区定义
|
||
static uint8_t buffer0[DMA_MAX_BLOCK_SIZE];
|
||
static uint8_t buffer1[DMA_MAX_BLOCK_SIZE];
|
||
static uint8_t* active_buffer = buffer0;
|
||
static uint8_t* fill_buffer = buffer1;
|
||
|
||
// 传输状态
|
||
static RGB_Color led_colors[LEDS_NUM];
|
||
volatile uint8_t dma_busy = 0;
|
||
static volatile TransferState transfer_state = TRANSFER_IDLE;
|
||
static uint16_t current_led_index = 0;
|
||
static uint16_t current_active_len = 0;
|
||
static uint32_t reset_bytes_remaining = 0;
|
||
#elif(WS2815_CONTROL_MODE == GPIO_DELAY_MODE)
|
||
//static RGB_Color led_colors[LEDS_NUM];
|
||
#endif
|
||
/*------------------------------------------------------------------------------------
|
||
Func Prototype
|
||
-------------------------------------------------------------------------------------*/
|
||
#if(WS2815_CONTROL_MODE == SPI_DMA_MODE)
|
||
// 函数声明
|
||
static void start_next_segment(void);
|
||
static uint16_t generate_led_data(uint8_t* buff, uint16_t start_index);
|
||
static uint16_t fill_next_buffer(void);
|
||
__RAM_CODE void ws2815_start_transfer(uint16_t len);
|
||
extern void xc_spi_dma_init(uint8_t spi_idx, uint8_t dfs, uint8_t tdl, uint8_t rdl);
|
||
extern uint32_t xc_spi_prf_data_addr(uint8_t spi_idx, uint8_t *eCode);
|
||
#elif(WS2815_CONTROL_MODE == GPIO_DELAY_MODE)
|
||
extern void xc_clock_set_osc32m_bbpll_64m(CLOCK_InitCfg_t *cb);
|
||
extern void xc_clock_set_osc32m(CLOCK_InitCfg_t *cb);
|
||
#endif
|
||
/*------------------------------------------------------------------------------------
|
||
Functions
|
||
-------------------------------------------------------------------------------------*/
|
||
#if(WS2815_CONTROL_MODE == SPI_DMA_MODE)
|
||
__RAM_CODE DMA_Callback dma_listener_cb(uint8_t eCode)
|
||
{
|
||
DEBUG("\nERROR: DMA error! eCode:%d\n", eCode);
|
||
return 0;
|
||
}
|
||
|
||
__RAM_CODE static uint16_t generate_led_data(uint8_t* buff, uint16_t start_index)
|
||
{
|
||
uint16_t buff_index = 0;
|
||
uint16_t led_index = start_index;
|
||
|
||
while (led_index < LED_TaskDef.RGB_XLED_NUM && buff_index < DMA_MAX_BLOCK_SIZE) {//修改
|
||
RGB_Color color = led_colors[led_index];
|
||
uint32_t grb = ((uint32_t)color.g << 16) |
|
||
((uint32_t)color.r << 8) |
|
||
color.b;
|
||
// 处理24位数据 (MSB优先)
|
||
for (int8_t bit_pos = 23; bit_pos >= 0; bit_pos--) {
|
||
buff[buff_index++] = (grb & (1 << bit_pos)) ? T1H : T0H;
|
||
}
|
||
led_index++;
|
||
}
|
||
// 更新当前LED索引
|
||
current_led_index = led_index;
|
||
return buff_index;
|
||
}
|
||
|
||
__RAM_CODE static uint16_t fill_reset_data(uint8_t* buff)
|
||
{
|
||
uint16_t bytes_to_fill = (reset_bytes_remaining > DMA_MAX_BLOCK_SIZE) ? DMA_MAX_BLOCK_SIZE : reset_bytes_remaining;
|
||
// 填充0x00作为复位信号
|
||
for (uint16_t i = 0; i < bytes_to_fill; i++)
|
||
buff[i] = 0;
|
||
// 更新剩余复位字节数
|
||
reset_bytes_remaining -= bytes_to_fill;
|
||
return bytes_to_fill;
|
||
}
|
||
|
||
__RAM_CODE static uint16_t fill_next_buffer(void)
|
||
{
|
||
if (transfer_state == TRANSFER_LEDS) {
|
||
// 填充LED数据
|
||
return generate_led_data(fill_buffer, current_led_index);
|
||
} else if (transfer_state == TRANSFER_RESET) {
|
||
// 填充复位数据
|
||
return fill_reset_data(fill_buffer);
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
__RAM_CODE static void start_next_segment(void)
|
||
{
|
||
// 检查传输是否完成
|
||
if (transfer_state == TRANSFER_LEDS && current_led_index >= LED_TaskDef.RGB_XLED_NUM) {//修改
|
||
// 所有LED数据传输完成,切换到复位状态
|
||
transfer_state = TRANSFER_RESET;
|
||
reset_bytes_remaining = RESET_BYTES;
|
||
}
|
||
|
||
if (transfer_state == TRANSFER_RESET && reset_bytes_remaining == 0) {
|
||
transfer_state = TRANSFER_IDLE;
|
||
}
|
||
|
||
if (current_active_len == 0) {
|
||
// 整个传输完成
|
||
dma_busy = 0;
|
||
return;
|
||
}
|
||
// 启动DMA传输
|
||
ws2815_start_transfer(current_active_len);
|
||
dma_busy = 1;
|
||
// 填充下一个缓冲区
|
||
current_active_len = fill_next_buffer();
|
||
}
|
||
|
||
__RAM_CODE void ws2815_trans_finish(uint8_t eCode)
|
||
{
|
||
// 交换缓冲区角色
|
||
uint8_t* temp = active_buffer;
|
||
active_buffer = fill_buffer;
|
||
fill_buffer = temp;
|
||
// 继续传输
|
||
start_next_segment();
|
||
}
|
||
/*
|
||
spi初始化
|
||
*/
|
||
void spi_init(uint8_t spix, uint16_t spi_tx_pin)
|
||
{
|
||
uint8_t spi_baud_div;
|
||
|
||
SPI_InitCfg_t spi_cfg = {
|
||
.Mode = SPI_MODE_MASTER,
|
||
.DataSize = SSI_CTRL0_DFS_LEN_8BIT,
|
||
.Direction = SSI_CTRL0_TMOD_W,
|
||
.CLKPolarity = SSI_CTRL0_SCPOL_LOW,
|
||
.CLKPhase = SSI_CTRL0_SCPHA_LEAD,
|
||
.FirstBit = SPI_FirstBit_MSB,
|
||
};
|
||
GPIO_InitCfg_t gpio_cfg = {
|
||
.Mux = GPIO_Mux0,
|
||
.Dir = GPIO_DIR_OUTPUT,
|
||
.Int = NOT_INT,
|
||
.Pull = GPIO_PULLDOWN,
|
||
.Pin = GPIO_DUMMY,
|
||
};
|
||
gpio_cfg.FunSel = SSI1_CLK;
|
||
xc_gpio_init(&gpio_cfg);
|
||
gpio_cfg.FunSel = SSI1_SSN;
|
||
xc_gpio_init(&gpio_cfg);
|
||
gpio_cfg.Dir = GPIO_DIR_INPUT;
|
||
gpio_cfg.FunSel = SSI1_RX;
|
||
xc_gpio_init(&gpio_cfg);
|
||
|
||
gpio_cfg.FunSel = SSI1_TX;
|
||
gpio_cfg.Pin = spi_tx_pin;
|
||
|
||
if ((gpio_cfg.Pin == GPIO_11) || (gpio_cfg.Pin == GPIO_12) ||(gpio_cfg.Pin == GPIO_13))
|
||
gpio_cfg.Mux = GPIO_Mux1;
|
||
|
||
xc_gpio_init(&gpio_cfg);
|
||
|
||
spi_baud_div = (uint32_t)xc_clock_hfclk_in_get() / SPI_FREQUENCY;
|
||
//printf("%s\tspi_baud_div:%d\n",__func__,spi_baud_div);
|
||
spi_cfg.BaudRatePrescaler = spi_baud_div;
|
||
|
||
xc_spi_init(spix, &spi_cfg);
|
||
xc_spi_dma_init(spix, 0x07, 7, 7);
|
||
}
|
||
|
||
int dma_init(uint8_t spix, eDMA_Ch_Num dma_channel)
|
||
{
|
||
uint8_t errorCode = DMA_OK;
|
||
|
||
uint32_t spi_prf_addr = xc_spi_prf_data_addr(spix, &errorCode);
|
||
if (errorCode != DMA_OK)
|
||
{
|
||
return errorCode;
|
||
}
|
||
|
||
DMA_Chx_Cfg_t ch_cfg = {
|
||
.sar = (uint32_t)buffer0, // 初始使用buffer0
|
||
.dar = spi_prf_addr,
|
||
.ctl_src_msize = DMA_MSIZE_1,
|
||
.ctl_dst_msize = DMA_MSIZE_1,
|
||
.ctl_sinc = DMA_ADDR_INCREMENT,
|
||
.ctl_dinc = DMA_ADDR_NOCHANGE,
|
||
.ctl_src_tr_width = DMA_TRANS_WIDTH_8,
|
||
.ctl_dst_tr_width = DMA_TRANS_WIDTH_8,
|
||
.ctl_tt_fc = DMA_MEM2PRF_DMA,
|
||
.cfg_hs_sel_src = DMA_HS_HARDWARE,
|
||
.cfg_hs_sel_dst = DMA_HS_HARDWARE,
|
||
.cfg_fifo_mode = DMA_FIFO_MODE_SINGLE,
|
||
//.cfg_ch_prior = DMA_PRIORITY_0,//配置DMA中断优先级为0,即最高优先级
|
||
};
|
||
|
||
switch (spix)
|
||
{
|
||
case SPI1_IDX:
|
||
{
|
||
ch_cfg.cfg_dst_per = SSI1_DMA_TX_HS_IF3;
|
||
}
|
||
break;
|
||
case SPI2_IDX:
|
||
{
|
||
ch_cfg.cfg_dst_per = SSI2_DMA_TX_HS_IF4;
|
||
}
|
||
break;
|
||
default:
|
||
{
|
||
errorCode = DMA_EINVAL;
|
||
return errorCode;
|
||
}
|
||
}
|
||
errorCode = xc_dma_set_channel_config(dma_channel, &ch_cfg);
|
||
if (errorCode != 0)
|
||
{
|
||
DEBUG("\nERROR: Failed to initialise configuration\n");
|
||
}
|
||
|
||
xc_dma_init();
|
||
xc_dma_set_listener(dma_channel, (DMA_Callback)dma_listener_cb);
|
||
xc_dma_enable();
|
||
NVIC_SetPriority(DMA_IRQn, 2);
|
||
NVIC_EnableIRQ(DMA_IRQn);
|
||
|
||
return errorCode;
|
||
}
|
||
|
||
|
||
__RAM_CODE void ws2815_start_transfer(uint16_t len)
|
||
{
|
||
uint8_t ch_index = xc_dma_get_channel_index(WS2815_DMA_CHANNEL);
|
||
dma_ctl_h__block_ts__setf(ch_index, len);
|
||
// 更新DMA源地址为当前活动缓冲区
|
||
dma_sar_set(ch_index, (uint32_t)active_buffer);
|
||
xc_dma_start_transfer(WS2815_DMA_CHANNEL, (DMA_Callback)ws2815_trans_finish);
|
||
}
|
||
|
||
|
||
int WS2815_Init(void)
|
||
{
|
||
uint8_t errorCode = DMA_OK;
|
||
spi_init(WS2815_SPI_IDX, WS2815_TX_PIN);//对spi进行初始化以及数据的输出引脚进行初始化
|
||
errorCode = dma_init(WS2815_SPI_IDX, WS2815_DMA_CHANNEL);
|
||
WS2815_Clear();
|
||
return errorCode;
|
||
}
|
||
|
||
__RAM_CODE void WS2815_Update(void)
|
||
{
|
||
// 等待前一次传输完成
|
||
while (dma_busy);
|
||
// 重置传输状态
|
||
current_led_index = 0;
|
||
reset_bytes_remaining = 0;
|
||
transfer_state = TRANSFER_LEDS;
|
||
dma_busy = 1;
|
||
// 填充第一个缓冲区
|
||
uint16_t active_len = generate_led_data(active_buffer, current_led_index);
|
||
// 仅当还有剩余数据时才填充第二个缓冲区
|
||
if (current_led_index < LED_TaskDef.RGB_XLED_NUM) {//修改
|
||
current_active_len = fill_next_buffer();
|
||
}else{
|
||
current_active_len = RESET_BYTES;
|
||
}
|
||
// 启动第一个DMA传输
|
||
ws2815_start_transfer(active_len);
|
||
}
|
||
|
||
/*
|
||
__RAM_CODE void WS2815_Update(void)
|
||
{*/
|
||
/*
|
||
* 关键优化点:
|
||
* 1. 去除不必要的原子操作
|
||
* 2. 优化变量访问顺序
|
||
* 3. 简化控制流程
|
||
* 4. 确保DMA传输的可靠性
|
||
*/
|
||
/*
|
||
// 1. 等待DMA完成(紧凑循环)
|
||
while(dma_busy) { rwip_schedule(); __NOP(); } // 使用NOP防止编译器优化掉空循环
|
||
|
||
// 2. 批量初始化状态变量(减少内存写入次数)
|
||
current_led_index = 0;
|
||
reset_bytes_remaining = 0;
|
||
transfer_state = TRANSFER_LEDS;
|
||
dma_busy = 1; // 在最后设置busy标志
|
||
|
||
// 3. 合并缓冲区填充逻辑
|
||
uint16_t active_len = generate_led_data(active_buffer, current_led_index);
|
||
current_active_len = (current_led_index < LEDS_NUM) ? fill_next_buffer() : RESET_BYTES;
|
||
|
||
// 4. 确保内存写入完成后再启动DMA
|
||
__DSB(); // 数据同步屏障
|
||
|
||
// 5. 启动DMA传输
|
||
ws2815_start_transfer(active_len);
|
||
}
|
||
*/
|
||
#elif(WS2815_CONTROL_MODE == GPIO_DELAY_MODE)
|
||
static void gpio_nrz_init(void)
|
||
{
|
||
GPIO_InitCfg_t GPIO_InitCfg = { 0 };
|
||
GPIO_InitCfg.Mux = GPIO_Mux0;
|
||
GPIO_InitCfg.FunSel = GPIO_Dx;
|
||
GPIO_InitCfg.Pull = GPIO_NOPULL;
|
||
GPIO_InitCfg.Dir = GPIO_DIR_OUTPUT;
|
||
GPIO_InitCfg.Int = NOT_INT;
|
||
GPIO_InitCfg.Pin = WS2815_TX_PIN;
|
||
|
||
if ((GPIO_InitCfg.Pin == GPIO_11) || (GPIO_InitCfg.Pin == GPIO_12) ||(GPIO_InitCfg.Pin == GPIO_13))
|
||
GPIO_InitCfg.Mux = GPIO_Mux1;
|
||
|
||
xc_gpio_init(&GPIO_InitCfg);
|
||
xc_gpio_write_pin(GPIO_InitCfg.Pin, GPIO_PIN_RESET);
|
||
}
|
||
|
||
__INLINE void gpio_nrz_0(void)
|
||
{
|
||
WS2815_GPIO_PIN_HIGH;
|
||
for (uint8_t i = 0; i < 1; i++)
|
||
{
|
||
__NOP();
|
||
}
|
||
WS2815_GPIO_PIN_LOW;
|
||
for (uint8_t i = 0; i < 6; i++)
|
||
{
|
||
__NOP();
|
||
}
|
||
}
|
||
|
||
__INLINE void gpio_nrz_1(void)
|
||
{
|
||
WS2815_GPIO_PIN_HIGH;
|
||
for (uint8_t i = 0; i < 7; i++)
|
||
{
|
||
__NOP();
|
||
}
|
||
WS2815_GPIO_PIN_LOW;
|
||
}
|
||
|
||
__RAM_CODE static void send_led_data(void)
|
||
{
|
||
// 临时切换到64MHz时钟以确保时序精确
|
||
CLOCK_InitCfg_t *pclock_cb = &clock_cb;
|
||
uint32_t orig_clock = xc_clock_hfclk_in_get();
|
||
|
||
if (orig_clock < 64000000) {
|
||
xc_clock_set_osc32m_bbpll_64m(pclock_cb);
|
||
}
|
||
|
||
__disable_irq();
|
||
|
||
// 发送所有LED数据
|
||
for (uint16_t i = 0; i < LEDS_NUM; i++) {
|
||
RGB_Color color = led_colors[i];
|
||
uint32_t grb = ((uint32_t)color.g << 16) |
|
||
((uint32_t)color.r << 8) |
|
||
color.b;
|
||
|
||
// 发送24位数据 (MSB优先)
|
||
for (int8_t bit_pos = 23; bit_pos >= 0; bit_pos--) {
|
||
if (grb & (1 << bit_pos)) {
|
||
gpio_nrz_1();
|
||
} else {
|
||
gpio_nrz_0();
|
||
}
|
||
}
|
||
}
|
||
|
||
__enable_irq();
|
||
|
||
// 恢复原始时钟
|
||
if (orig_clock < 64000000) {
|
||
#if (CONFIG_HFCLK_IS_OSC32M_PLL_32M)
|
||
xc_clock_set_osc32m_bbpll_32m(pclock_cb);
|
||
#else
|
||
xc_clock_set_osc32m(pclock_cb);
|
||
#endif
|
||
}
|
||
}
|
||
|
||
int WS2815_Init(void)
|
||
{
|
||
gpio_nrz_init();
|
||
WS2815_Clear();
|
||
|
||
return 0;
|
||
}
|
||
|
||
__RAM_CODE void WS2815_Update(void)
|
||
{
|
||
send_led_data();
|
||
}
|
||
#endif //WS2815_CONTROL_MODE == GPIO_DELAY_MODE
|
||
|
||
void WS2815_SetColor(uint16_t led_num, RGB_Color color)
|
||
{
|
||
if (led_num < LED_TaskDef.RGB_XLED_NUM) {//修改
|
||
led_colors[led_num] = color;
|
||
}
|
||
}
|
||
|
||
|
||
void WS2815_SetAll(RGB_Color color)
|
||
{
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {//修改
|
||
led_colors[i] = color;
|
||
}
|
||
}
|
||
|
||
|
||
void WS2815_Clear(void)
|
||
{
|
||
RGB_Color black = {0, 0, 0};
|
||
WS2815_SetAll(black);
|
||
}
|
||
|
||
#define CHASE_SPEED_MS 30 // 跑马灯移动速度(毫秒)
|
||
//SDK的WS2815灯效的DEMO
|
||
/*
|
||
void WS2815_demo(void)
|
||
{
|
||
// 初始化LED驱动
|
||
if(WS2815_Init() != DMA_OK) {
|
||
DEBUG("WS2815 Init Failed!\n");
|
||
return;
|
||
}
|
||
|
||
// 定义颜色
|
||
RGB_Color red = {255, 0, 0};
|
||
RGB_Color green = {0, 255, 0};
|
||
RGB_Color blue = {0, 0, 255};
|
||
RGB_Color yellow = {255, 150, 0};
|
||
RGB_Color purple = {180, 0, 255};
|
||
|
||
// 彩色光点数组(彩虹色序列)
|
||
RGB_Color chase_colors[] = {
|
||
green, red, blue, yellow, purple
|
||
};
|
||
const uint8_t num_colors = sizeof(chase_colors) / sizeof(chase_colors[0]);
|
||
|
||
// 尾巴长度(光点后面的拖尾效果)
|
||
const uint8_t tail_length = 8;
|
||
|
||
while(1) {
|
||
//xc_wdt_reload();
|
||
// 循环所有彩色光点
|
||
for(uint8_t color_idx = 0; color_idx < num_colors; color_idx++) {
|
||
// 光点从0到末尾移动
|
||
for(uint16_t pos = 0; pos < LEDS_NUM + tail_length; pos++) {
|
||
// 清除所有LED
|
||
WS2815_Clear();
|
||
|
||
// 绘制光点拖尾
|
||
uint8_t intensity = 255;
|
||
for(int i = 0; i < tail_length; i++) {
|
||
if(pos - i < LEDS_NUM && pos - i >= 0) {
|
||
// 拖尾颜色渐变(越远越暗)
|
||
RGB_Color tail_color = chase_colors[color_idx];
|
||
tail_color.r = (uint8_t)(tail_color.r * intensity / 255);
|
||
tail_color.g = (uint8_t)(tail_color.g * intensity / 255);
|
||
tail_color.b = (uint8_t)(tail_color.b * intensity / 255);
|
||
|
||
WS2815_SetColor(pos - i, tail_color);
|
||
intensity = (uint8_t)(intensity * 0.7); // 每节拖尾亮度递减
|
||
}
|
||
}
|
||
|
||
// 绘制主光点(最亮)
|
||
if(pos < LEDS_NUM) {
|
||
WS2815_SetColor(pos, chase_colors[color_idx]);
|
||
}
|
||
|
||
// 更新显示
|
||
WS2815_Update();
|
||
|
||
// 控制速度
|
||
delay_ms(CHASE_SPEED_MS);
|
||
DEBUG("1\n");
|
||
DEBUG("color_idx:%d\n",color_idx);
|
||
}
|
||
|
||
}
|
||
//xc_wdt_reload();
|
||
DEBUG("RETURN_2\n");
|
||
// 反向移动
|
||
for(uint8_t color_idx = 0; color_idx < num_colors; color_idx++) {
|
||
// 光点从末尾到0移动
|
||
for(int pos = LEDS_NUM - 1; pos >= - tail_length; pos--) {
|
||
WS2815_Clear();
|
||
|
||
uint8_t intensity = 255;//亮度
|
||
for(int i = 0; i < tail_length; i++) {
|
||
if(pos + i < LEDS_NUM && pos + i >= 0) {
|
||
RGB_Color tail_color = chase_colors[color_idx];
|
||
tail_color.r = (uint8_t)(tail_color.r * intensity / 255);
|
||
tail_color.g = (uint8_t)(tail_color.g * intensity / 255);
|
||
tail_color.b = (uint8_t)(tail_color.b * intensity / 255);
|
||
|
||
WS2815_SetColor(pos + i, tail_color);
|
||
intensity = (uint8_t)(intensity * 0.7);
|
||
}
|
||
}
|
||
|
||
if(pos >= 0) {
|
||
WS2815_SetColor(pos, chase_colors[color_idx]);
|
||
}
|
||
|
||
WS2815_Update();
|
||
delay_ms(CHASE_SPEED_MS);
|
||
DEBUG("return_finish\n");
|
||
DEBUG("color_idx:%d\n",color_idx);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
|
||
/*
|
||
*
|
||
* 以下为数据处理相关函数
|
||
*
|
||
*/
|
||
RGB_Color Data_24_To_RGB_Color(uint32_t Old_Data,uint8_t intensity){
|
||
RGB_Color Temp;
|
||
Temp.b = (uint8_t)(((Old_Data&0xff0000)>>16)*intensity/100);
|
||
Temp.g = (uint8_t)(((Old_Data&0xff00)>>8)*intensity/100);
|
||
Temp.r = (uint8_t)((Old_Data&0xff)*intensity/100);
|
||
//DEBUG("Data Conversion\n");
|
||
return Temp;
|
||
}
|
||
|
||
|
||
|
||
void ws2815_xledc(uint8_t display_format,uint32_t xLED_color,uint16_t xLED, uint8_t Brightness)
|
||
{ RGB_Color Rev;
|
||
RGB_Color temp = Data_24_To_RGB_Color(ws2815_rgb_color_format_conversion(xLED_color,display_format),Brightness);
|
||
Rev.r = temp.r;
|
||
Rev.g = temp.g;
|
||
Rev.b = temp.b;
|
||
WS2815_SetColor(xLED,Rev);
|
||
}
|
||
|
||
void ledc_dma_kick(uint32_t addr, uint16_t len)
|
||
{
|
||
WS2815_Update();
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief 将数据转换成4字节
|
||
* @retval None
|
||
*/
|
||
void ws2815_rgb_color_out_32to24bit_code_fill(uint32_t buf_code_grb[], uint32_t buf_grb[])
|
||
{
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief 转换像素点数据格式
|
||
* @retval None
|
||
*/
|
||
static uint32_t ws2815_rgb_color_format_conversion(uint32_t display_color,unsigned char display_format)
|
||
{
|
||
uint32_t color_temp = 0;
|
||
|
||
switch (display_format) {
|
||
case LEDC_BRG://实际测试ws2815输出为GRB格式,数据为小端格式,bit0-bit7对应B,bit8-bit15对应R,bit16-bit23对应G
|
||
color_temp = display_color;
|
||
display_color &= 0x000000; //brg
|
||
display_color |= ((color_temp & 0xff0000) >> 8);//0g
|
||
display_color |= ((color_temp & 0x00ff00) << 8);//0r
|
||
display_color |= (color_temp & 0x0000ff);//FF b
|
||
break;
|
||
case LEDC_BGR://实际测试ws2815输出为RGB格式,数据为小端格式,bit0-bit7对应B,bit8-bit15对应R,bit16-bit23对应G
|
||
//格式一致,无需转换 bgr
|
||
break;
|
||
case LEDC_GRB://实际测试ws2815输出为BRG格式,数据为小端格式,bit0-bit7对应B,bit8-bit15对应R,bit16-bit23对应G
|
||
color_temp = display_color;//rbg
|
||
display_color &= 0x000000;
|
||
display_color |= ((color_temp & 0xff0000) >> 8);//g
|
||
display_color |= ((color_temp & 0x00ff00) >> 8);//b
|
||
display_color |= ((color_temp & 0x0000ff) << 16);//r
|
||
break;
|
||
case LEDC_GBR://实际测试ws2815输出为RBG格式,数据为小端格式,bit0-bit7对应B,bit8-bit15对应R,bit16-bit23对应G
|
||
color_temp = display_color;
|
||
display_color &= 0x000000;//gbr
|
||
display_color |= (color_temp & 0xff0000);//r
|
||
display_color |= ((color_temp & 0x00ff00) >> 8);//b
|
||
display_color |= ((color_temp & 0x0000ff) << 8);//g
|
||
break;
|
||
case LEDC_RBG://实际测试ws2815输出为BGR格式,数据为小端格式,bit0-bit7对应B,bit8-bit15对应R,bit16-bit23对应G
|
||
color_temp = display_color;
|
||
display_color &= 0x000000;//grb
|
||
display_color |= ((color_temp & 0xff0000) >> 16);//b
|
||
display_color |= ((color_temp & 0x00ff00) << 8);//r
|
||
display_color |= ((color_temp & 0x0000ff) << 8);//g
|
||
break;
|
||
case LEDC_RGB://实际测试ws2815输出为RGB格式,数据为小端格式,bit0-bit7对应B,bit8-bit15对应R,bit16-bit23对应G
|
||
color_temp = display_color;
|
||
display_color &= 0x000000;//rgb
|
||
display_color |= ((color_temp & 0xff0000) >> 16);//b
|
||
display_color |= (color_temp & 0x00ff00);//g
|
||
display_color |= ((color_temp & 0x0000ff) << 16);//r
|
||
break;
|
||
}
|
||
return display_color;
|
||
}
|
||
|
||
|
||
/*
|
||
**
|
||
** 以下为项目的灯效函数
|
||
**
|
||
*/
|
||
|
||
|
||
/**
|
||
* @brief 初始化LEDdeftask数据
|
||
* @retval None
|
||
*/
|
||
void ledc_Taskdef_init(void)
|
||
{
|
||
LED_TaskDef.CURRENT_TASK = 2; //mode
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
LED_TaskDef.ledc_kick_state = 0; //空闲
|
||
LED_TaskDef.LEDC_TICK_Speed = 150; //10ms*tick
|
||
LED_TaskDef.LED_Brightne = 50; //亮度
|
||
LED_TaskDef.LED_SWITCH = 1; //开启
|
||
LED_TaskDef.RGB_CODE_LEN = 0;
|
||
LED_TaskDef.RGB_XLED_NUM = 100; //像素点
|
||
LED_TaskDef.Timer_count = 0;
|
||
LED_TaskDef.Temp_Step = 0;
|
||
LED_TaskDef.xianxu = LEDC_BRG; //线序
|
||
}
|
||
|
||
|
||
/**
|
||
* @brief mode0 全灯亮.单色全亮
|
||
* @param LED_Maincolor: 颜色.
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_show(uint8_t display_format,uint32_t LED_Maincolor)
|
||
{
|
||
|
||
//printf("LED_SWITCH = %x\n", LED_TaskDef.LED_SWITCH);
|
||
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("LEDC_TICK_Speed = %d\n", LED_TaskDef.LEDC_TICK_Speed);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
//全灯赋值
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,LED_Maincolor,i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//WS2815_Update();
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
WS2815_Update();
|
||
//ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
WS2815_Update();
|
||
//ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mdoe1 单个流水灯.
|
||
* @param LED_Maincolor: 流水灯颜色.
|
||
* @param LED_Background_color: 其他背景灯颜色.
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_singleflu(uint8_t display_format, uint32_t LED_Maincolor, uint32_t LED_Background_color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
//单个流水灯赋值
|
||
if(LED_TaskDef.ledc_fill_state > LED_TaskDef.RGB_XLED_NUM){
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
}
|
||
else {
|
||
ws2815_xledc(display_format,LED_Maincolor,LED_TaskDef.ledc_fill_state,LED_TaskDef.LED_Brightne);
|
||
LED_TaskDef.ledc_fill_state++;
|
||
}
|
||
|
||
//其他灯赋值
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
if(i != (LED_TaskDef.ledc_fill_state -1 )){
|
||
ws2815_xledc(display_format,LED_Background_color,i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//for(i=0;i<LED_TaskDef.RGB_CODE_LEN;i++){
|
||
// printf("%x ", code_buf[i]);
|
||
//}
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode2 彩虹幻彩.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
*/
|
||
void ws2815_ledc_multicolor(uint8_t display_format,uint8_t direction)
|
||
{
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
//空闲状态
|
||
//if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算颜色索引(使用取模保证连续性)
|
||
uint8_t color_index = ((i + LED_TaskDef.ledc_fill_state) / 5) % 10;
|
||
ws2815_xledc(display_format, rainbow_colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if(direction==1){//正向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 反向流动:通过整体偏移使流动方向相反
|
||
int32_t position = LED_TaskDef.RGB_XLED_NUM * 5 - LED_TaskDef.ledc_fill_state + i;
|
||
uint8_t color_index = (position / 5) % 10;
|
||
ws2815_xledc(display_format, rainbow_colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % (LED_TaskDef.RGB_XLED_NUM * 5);
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
//WS2815_Update();
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
//WS2815_Update();
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
// LED_TaskDef.ledc_kick_state = 1;
|
||
// }
|
||
}
|
||
|
||
/**
|
||
* @brief mode3 彩虹幻彩带亮度变化.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
*/
|
||
void ws2815_ledc_multicolorlight(uint8_t display_format,uint8_t direction)
|
||
{
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
//sys_ram_info_dump();
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
|
||
// 计算状态循环模数(确保无缝流动)
|
||
uint32_t mod_factor = COLOR_BLOCK_SIZE * LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
|
||
// 全局位置
|
||
uint32_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算颜色索引(0-6)
|
||
uint8_t color_index = (global_pos / COLOR_BLOCK_SIZE) % RAINBOW_COLORS;
|
||
|
||
// 计算在颜色块内的位置(0-4)
|
||
uint8_t pos_in_block = global_pos % COLOR_BLOCK_SIZE;
|
||
|
||
// 获取亮度系数并计算最终亮度值
|
||
float block_brightness = brightness_table[pos_in_block]/255;
|
||
uint16_t final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * block_brightness);
|
||
|
||
// 确保亮度在安全范围内(5-255)
|
||
if (final_brightness > 255) final_brightness = 255;
|
||
else if (final_brightness < 5) final_brightness = 5;
|
||
final_brightness = final_brightness*100/255;
|
||
|
||
// 调用LED设置函数
|
||
ws2815_xledc(display_format, rainbow[color_index], i, final_brightness);
|
||
}
|
||
|
||
|
||
|
||
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输(考虑不同灯珠数量的情况)
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief mode4 七彩跳变/能量.
|
||
* @param .
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_multjumpshow(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(LED_TaskDef.ledc_fill_state > 6){
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
}
|
||
//全灯赋值
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,rainbow[LED_TaskDef.ledc_fill_state],i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
LED_TaskDef.ledc_fill_state++;
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode5-6 三色跳变.
|
||
* @param .
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_threejumpshow(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
// 状态循环控制(0-1-2-0)
|
||
LED_TaskDef.ledc_fill_state = LED_TaskDef.ledc_fill_state % 3;
|
||
// 单一颜色设置循环
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format, colors[LED_TaskDef.ledc_fill_state], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % 3;
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
//for(i=0;i<LED_TaskDef.RGB_CODE_LEN;i++){
|
||
// printf("%x ", code_buf[i]);
|
||
//}
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode7 七色频闪.
|
||
* @param .
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_multstroboscopic(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
if(LED_TaskDef.ledc_fill_state > 13){
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
}
|
||
if(LED_TaskDef.ledc_fill_state % 2 == 0){
|
||
//全灯赋值 七彩
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,rainbow[LED_TaskDef.ledc_fill_state / 2],i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if(LED_TaskDef.ledc_fill_state % 2 == 1){
|
||
//全灯赋值 黑色
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,Color_BLACK,i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
LED_TaskDef.ledc_fill_state++;
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode8-9 三色频闪.
|
||
* @param .
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_threestroboscopic(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
if(LED_TaskDef.ledc_fill_state > 5){
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
}
|
||
if(LED_TaskDef.ledc_fill_state % 2 == 0){//0 2 4
|
||
//全灯赋值 三色
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,colors[LED_TaskDef.ledc_fill_state / 2],i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if(LED_TaskDef.ledc_fill_state % 2 == 1){//1 3 5
|
||
//全灯赋值 黑色
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,Color_BLACK,i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
LED_TaskDef.ledc_fill_state++;
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode10 七彩渐变.
|
||
* @param 速度500ms最佳.
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_multgradualchange(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//LED_TaskDef.LEDC_TICK_Speed = LED_TaskDef.LEDC_TICK_Speed + 500; //ms
|
||
// 定义彩虹颜色数组
|
||
static uint8_t current_color = 0; // 当前颜色索引(0-6)
|
||
static int8_t brightness_direction = -1; // 亮度变化方向(-1:增加, 1:减少)
|
||
static int8_t current_brightness = 20; // 当前亮度级别索引(5%)
|
||
// 计算实际亮度值
|
||
float brightness = (brightness_table2[current_brightness] / 255.0f) * LED_TaskDef.LED_Brightne;
|
||
// 设置当前颜色的当前亮度
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
ws2815_xledc(display_format, rainbow[current_color], i, brightness);
|
||
}
|
||
// 更新亮度级别
|
||
current_brightness += brightness_direction;
|
||
// 切换方向或更换颜色
|
||
if (brightness_direction < 0) { // 亮度增加过程
|
||
if (current_brightness < 0) {
|
||
current_brightness = 0; // 达到100%亮度
|
||
brightness_direction = 1; // 开始降低亮度
|
||
}
|
||
}
|
||
else { // 亮度减少过程
|
||
if (current_brightness > 20) {
|
||
current_brightness = 20; // 达到0%亮度
|
||
current_color = (current_color + 1) % 7; // 切换颜色
|
||
brightness_direction = -1; // 重置为亮度增加方向
|
||
}
|
||
}
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode11-16 双色交替渐变.
|
||
* @param 速度50ms最佳.
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_secondalternategradient(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//LED_TaskDef.LEDC_TICK_Speed = 100; //ms
|
||
// 定义彩虹颜色数组
|
||
static uint8_t current_color = 0; // 当前颜色索引(0-1)
|
||
static int8_t brightness_direction = -1; // 亮度变化方向(-1:增加, 1:减少)
|
||
static int8_t current_brightness = 10; // 当前亮度级别索引(0%)
|
||
// 计算实际亮度值
|
||
float brightness = (brightness_table3[current_brightness] / 255.0f) * LED_TaskDef.LED_Brightne;
|
||
// 设置当前颜色的当前亮度
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
ws2815_xledc(display_format, colors[current_color], i, brightness);
|
||
}
|
||
// 更新亮度级别
|
||
current_brightness += brightness_direction;
|
||
// 切换方向或更换颜色
|
||
if (brightness_direction < 0) { // 亮度增加过程
|
||
if (current_brightness < 0) {
|
||
current_brightness = 0; // 达到100%亮度
|
||
brightness_direction = 1; // 开始降低亮度
|
||
}
|
||
}
|
||
else { // 亮度减少过程
|
||
if (current_brightness > 10) {
|
||
current_brightness = 10; // 达到0%亮度
|
||
current_color = (current_color + 1) % 2; // 切换颜色
|
||
brightness_direction = -1; // 重置为亮度增加方向
|
||
}
|
||
}
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode17-22 单色跑马.
|
||
* @param .
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_singleridehorse(uint8_t display_format,uint32_t colors)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
// 设置所有LED的颜色
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 奇数位置灯亮,偶数位置灯灭
|
||
// 偶数位置灯亮,奇数位置灯灭
|
||
if ((i % 2) == LED_TaskDef.ledc_fill_state) {
|
||
// 亮灯状态
|
||
ws2815_xledc(display_format, colors, i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 灭灯状态
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
// 更新状态
|
||
LED_TaskDef.ledc_fill_state = LED_TaskDef.ledc_fill_state ? 0 : 1;
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode23-24 七彩追光.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed50ms最佳
|
||
*/
|
||
void ws2815_ledc_multspotlight(uint8_t display_format,uint8_t direction)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
static uint8_t led_index = 0; // 当前灯颜色索引
|
||
static uint8_t last_led_index = 6; // 上一次灯颜色索引
|
||
// 正向追光
|
||
if (direction == 1) {
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
if (i < LED_TaskDef.ledc_fill_state) {
|
||
ws2815_xledc(display_format, rainbow[led_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, rainbow[last_led_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
// 反向追光
|
||
else if (direction == 0) {
|
||
uint16_t reverse_active = LED_TaskDef.RGB_XLED_NUM - LED_TaskDef.ledc_fill_state;
|
||
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
if (i >= reverse_active) {
|
||
ws2815_xledc(display_format, rainbow[led_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, rainbow[last_led_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
LED_TaskDef.ledc_fill_state++;
|
||
// 超出灯数,重置状态并切换到下一个颜色
|
||
if (LED_TaskDef.ledc_fill_state > LED_TaskDef.RGB_XLED_NUM) {
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
last_led_index = led_index;
|
||
led_index = (led_index + 1) % 7; // 循环使用彩虹色
|
||
}
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode25-28 三色追光.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed50ms最佳
|
||
*/
|
||
void ws2815_ledc_threespotlight(uint8_t display_format,uint8_t direction,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
|
||
static uint8_t led_index = 0; // 当前灯颜色索引
|
||
static uint8_t last_led_index = 2; // 上一次灯颜色索引
|
||
|
||
// 正向追光
|
||
if (direction == 1) {
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
if (i < LED_TaskDef.ledc_fill_state) {
|
||
ws2815_xledc(display_format, colors[led_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, colors[last_led_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
// 反向追光
|
||
else if (direction == 0) {
|
||
uint16_t reverse_active = LED_TaskDef.RGB_XLED_NUM - LED_TaskDef.ledc_fill_state;
|
||
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
if (i >= reverse_active) {
|
||
ws2815_xledc(display_format, colors[led_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, colors[last_led_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state++;
|
||
|
||
// 超出灯数,重置状态并切换到下一个颜色
|
||
if (LED_TaskDef.ledc_fill_state > LED_TaskDef.RGB_XLED_NUM) {
|
||
LED_TaskDef.ledc_fill_state = 0;
|
||
last_led_index = led_index;
|
||
led_index = (led_index + 1) % 3;
|
||
}
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode29-30 七色飘动.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_multfloatlight(uint8_t display_format,uint8_t direction)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
uint8_t color_index = (i + LED_TaskDef.ledc_fill_state) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if(direction==1){//正向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
int16_t position = LED_TaskDef.RGB_XLED_NUM - LED_TaskDef.ledc_fill_state + i;
|
||
uint8_t color_index = position % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode31-34 三色飘动.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_threefloatlight(uint8_t display_format,uint8_t direction,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
uint8_t color_index = (i + LED_TaskDef.ledc_fill_state) % 3;
|
||
ws2815_xledc(display_format, colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if(direction==1){//正向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
int16_t position = LED_TaskDef.RGB_XLED_NUM - LED_TaskDef.ledc_fill_state + i;
|
||
uint8_t color_index = position % 3;
|
||
ws2815_xledc(display_format, colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode35-36 七彩刷色.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_multbrushcolor(uint8_t display_format,uint8_t direction)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
// 调试信息
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
static uint8_t color_index = 0; // 当前颜色索引
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
static uint8_t cover_step = 0; // 覆盖步数
|
||
static uint8_t flash_state = 0; // 闪烁状态(0或1)
|
||
|
||
static uint8_t before_color = 6; // 正向上一个颜色
|
||
|
||
// 更新闪烁状态(每帧切换)
|
||
flash_state = !flash_state;
|
||
|
||
// 正向刷色效果
|
||
if (direction == 1) {
|
||
// 设置所有灯的颜色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
// 根据灯的位置和帧计数确定颜色
|
||
if ((i % 2) == ((cover_step % 2) ^ flash_state)) {
|
||
ws2815_xledc(display_format, rainbow[before_color], i, LED_TaskDef.LED_Brightne); // 上一个颜色
|
||
} else {
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
}
|
||
}
|
||
|
||
// 对于已经被覆盖的灯,设置为当前颜色
|
||
for (uint16_t i = 0; i < cover_step; i++) {
|
||
// 覆盖灯(每组两个灯)
|
||
uint16_t pos1 = i * 2;
|
||
uint16_t pos2 = i * 2 + 1;
|
||
|
||
if (pos1 < num_leds) {
|
||
ws2815_xledc(display_format, rainbow[color_index], pos1, LED_TaskDef.LED_Brightne);
|
||
}
|
||
if (pos2 < num_leds) {
|
||
ws2815_xledc(display_format, rainbow[color_index], pos2, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 更新帧计数器
|
||
frame_count++;
|
||
|
||
// 每两帧推进一次覆盖进度
|
||
if (frame_count % 2 == 0) {
|
||
cover_step++;
|
||
|
||
// 检查是否完成当前颜色的覆盖
|
||
if (cover_step > num_leds / 2) {
|
||
cover_step = 0;
|
||
before_color = color_index;
|
||
color_index = (color_index + 1) % 7; // 切换到下一个颜色
|
||
}
|
||
}
|
||
}
|
||
// 反向刷色效果
|
||
else if (direction == 0) {
|
||
// 首先将所有灯设置为当前颜色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 计算前一个颜色索引(彩虹数组中的前一个颜色)
|
||
uint8_t prev_color_index = (color_index + 6) % 7; // 彩虹数组中的前一个颜色
|
||
|
||
// 计算开始位置(从尾部向前)
|
||
uint16_t start_pos = num_leds - 2 * cover_step;
|
||
|
||
// 设置尾部交替闪烁
|
||
for (uint16_t i = start_pos; i < num_leds; i++) {
|
||
// 从尾部开始位置计算偏移量
|
||
uint16_t offset = num_leds - 1 - i;
|
||
|
||
// 根据闪烁状态决定颜色
|
||
if ((offset % 2) == flash_state) {
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
} else {
|
||
ws2815_xledc(display_format, rainbow[prev_color_index], i, LED_TaskDef.LED_Brightne); // 前一个颜色
|
||
}
|
||
}
|
||
|
||
// 更新帧计数器
|
||
frame_count++;
|
||
|
||
// 每两帧推进一次覆盖进度
|
||
if (frame_count % 2 == 0) {
|
||
cover_step++;
|
||
|
||
// 检查是否完成当前颜色的覆盖
|
||
if (cover_step > num_leds / 2) {
|
||
cover_step = 0;
|
||
color_index = (color_index + 1) % 7; // 切换到下一个颜色
|
||
}
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode37-40 三色刷色.
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_threebrushcolor(uint8_t display_format,uint8_t direction,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
// 调试信息
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
static uint8_t color_index = 0; // 当前颜色索引
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
static uint8_t cover_step = 0; // 覆盖步数
|
||
static uint8_t flash_state = 0; // 闪烁状态(0或1)
|
||
|
||
static uint8_t before_color = 2; // 正向上一个颜色
|
||
|
||
// 更新闪烁状态(每帧切换)
|
||
flash_state = !flash_state;
|
||
|
||
// 正向刷色效果
|
||
if (direction == 1) {
|
||
// 设置所有灯的颜色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
// 根据灯的位置和帧计数确定颜色
|
||
if ((i % 2) == ((cover_step % 2) ^ flash_state)) {
|
||
ws2815_xledc(display_format, colors[before_color], i, LED_TaskDef.LED_Brightne); // 上一个颜色
|
||
} else {
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
}
|
||
}
|
||
|
||
// 对于已经被覆盖的灯,设置为当前颜色
|
||
for (uint16_t i = 0; i < cover_step; i++) {
|
||
// 覆盖灯(每组两个灯)
|
||
uint16_t pos1 = i * 2;
|
||
uint16_t pos2 = i * 2 + 1;
|
||
|
||
if (pos1 < num_leds) {
|
||
ws2815_xledc(display_format, colors[color_index], pos1, LED_TaskDef.LED_Brightne);
|
||
}
|
||
if (pos2 < num_leds) {
|
||
ws2815_xledc(display_format, colors[color_index], pos2, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 更新帧计数器
|
||
frame_count++;
|
||
|
||
// 每两帧推进一次覆盖进度
|
||
if (frame_count % 2 == 0) {
|
||
cover_step++;
|
||
|
||
// 检查是否完成当前颜色的覆盖
|
||
if (cover_step > num_leds / 2) {
|
||
cover_step = 0;
|
||
before_color = color_index;
|
||
color_index = (color_index + 1) % 3; // 切换到下一个颜色
|
||
}
|
||
}
|
||
}
|
||
// 反向刷色效果
|
||
else if (direction == 0) {
|
||
// 首先将所有灯设置为当前颜色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 计算前一个颜色索引(彩虹数组中的前一个颜色)
|
||
uint8_t prev_color_index = (color_index + 2) % 3; // 彩虹数组中的前一个颜色
|
||
|
||
// 计算开始位置(从尾部向前)
|
||
uint16_t start_pos = num_leds - 2 * cover_step;
|
||
|
||
// 设置尾部交替闪烁
|
||
for (uint16_t i = start_pos; i < num_leds; i++) {
|
||
// 从尾部开始位置计算偏移量
|
||
uint16_t offset = num_leds - 1 - i;
|
||
|
||
// 根据闪烁状态决定颜色
|
||
if ((offset % 2) == flash_state) {
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
} else {
|
||
ws2815_xledc(display_format, colors[prev_color_index], i, LED_TaskDef.LED_Brightne); // 前一个颜色
|
||
}
|
||
}
|
||
|
||
// 更新帧计数器
|
||
frame_count++;
|
||
|
||
// 每两帧推进一次覆盖进度
|
||
if (frame_count % 2 == 0) {
|
||
cover_step++;
|
||
|
||
// 检查是否完成当前颜色的覆盖
|
||
if (cover_step > num_leds / 2) {
|
||
cover_step = 0;
|
||
color_index = (color_index + 1) % 3; // 切换到下一个颜色
|
||
}
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode41 七彩刷色闭幕.
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_multbrushclosing(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t base_color_index = 0; // 基色索引(当前主要颜色)
|
||
static uint8_t flash_color_index1 = 1; // 第一个闪烁颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t flash_state = 0; // 闪烁状态(0或1)
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 更新闪烁状态(每次调用翻转)
|
||
flash_state = !flash_state;
|
||
|
||
// 获取当前基色和闪烁颜色
|
||
uint32_t base_color = rainbow[base_color_index];
|
||
uint32_t flash_color1 = rainbow[flash_color_index1];
|
||
|
||
// 计算最大步数(从两边向中间推进)
|
||
uint16_t max_steps = (num_leds + 1) / 2; // 中间点位置
|
||
|
||
// 1. 设置整个灯带为基色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
|
||
if ((i % 2) == ((step % 2))) {
|
||
ws2815_xledc(display_format, base_color, i, LED_TaskDef.LED_Brightne); // 上一个颜色
|
||
} else {
|
||
ws2815_xledc(display_format, flash_color1, i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
}
|
||
}
|
||
|
||
// 2. 在覆盖区域设置闪烁颜色(从头尾向中间推进)
|
||
for (uint16_t s = 0; s <= step; s++) {
|
||
// 计算左右覆盖位置(从头尾向中间推进)
|
||
int16_t left_pos = s; // 从头开始
|
||
int16_t right_pos = num_leds - 1 - s; // 从尾开始
|
||
|
||
// 设置左侧LED
|
||
if (left_pos < right_pos && left_pos < num_leds) {
|
||
ws2815_xledc(display_format, flash_color1, left_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 设置右侧LED
|
||
if (right_pos > left_pos && right_pos < num_leds) {
|
||
ws2815_xledc(display_format, flash_color1, right_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 如果是奇数LED数量且到达中间点,设置中间LED
|
||
if (num_leds % 2 == 1 && s == step && step == max_steps - 1) {
|
||
uint16_t center_pos = num_leds / 2;
|
||
ws2815_xledc(display_format, flash_color1, center_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度(根据需求调整)
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step >= max_steps) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
base_color_index = flash_color_index1; // 基色变为第一个闪烁颜色
|
||
flash_color_index1 = (flash_color_index1 + 1) % 7; // 更新闪烁颜色索引
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief mode42 七彩刷色拉幕
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_multbrushsaladcurtain(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t color_index = 0; // 当前颜色索引
|
||
static uint8_t next_color_index = 1; // 下一个颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t flash_state = 0; // 闪烁状态(0或1)
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 更新闪烁状态(每次调用翻转)
|
||
flash_state = !flash_state;
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
uint16_t max_steps = (center > (num_leds - center)) ? center : (num_leds - center);
|
||
|
||
// 获取当前颜色值
|
||
uint32_t current_color = rainbow[color_index];
|
||
uint32_t next_color = rainbow[next_color_index];
|
||
|
||
// 设置所有LED
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
// 计算该LED是否在覆盖区域内
|
||
uint8_t is_covered = 0;
|
||
for (uint16_t s = 0; s <= step; s++) {
|
||
uint16_t left_pos = center - s;
|
||
uint16_t right_pos = center + s - (num_leds % 2 ? 0 : 1);
|
||
|
||
// 当LED数量为偶数时,需要额外处理中心点
|
||
if (num_leds % 2 == 0) {
|
||
left_pos = center - s - 1;
|
||
right_pos = center + s;
|
||
|
||
// 对于偶数LED,中心点有两个
|
||
if (s == 0) {
|
||
if (i == center - 1 || i == center) {
|
||
is_covered = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检查是否在覆盖位置
|
||
if (i == left_pos || i == right_pos) {
|
||
is_covered = 1;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 设置LED颜色
|
||
if (is_covered) {
|
||
// 覆盖区域:根据闪烁状态显示颜色
|
||
if ((i % 2) == ((step % 2))) {
|
||
ws2815_xledc(display_format, current_color, i, LED_TaskDef.LED_Brightne); // 上一个颜色
|
||
} else {
|
||
ws2815_xledc(display_format, next_color, i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
}
|
||
} else {
|
||
// 未覆盖区域:固定显示下一个颜色
|
||
ws2815_xledc(display_format, next_color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step > max_steps) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
color_index = next_color_index;
|
||
next_color_index = (next_color_index + 1) % 7;
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode43,45 三色刷色闭幕.
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_threebrushclosing(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t base_color_index = 0; // 基色索引(当前主要颜色)
|
||
static uint8_t flash_color_index1 = 1; // 第一个闪烁颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t flash_state = 0; // 闪烁状态(0或1)
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 更新闪烁状态(每次调用翻转)
|
||
flash_state = !flash_state;
|
||
|
||
// 获取当前基色和闪烁颜色
|
||
uint32_t base_color = rainbow[base_color_index];
|
||
uint32_t flash_color1 = rainbow[flash_color_index1];
|
||
|
||
// 计算最大步数(从两边向中间推进)
|
||
uint16_t max_steps = (num_leds + 1) / 2; // 中间点位置
|
||
|
||
// 1. 设置整个灯带为基色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
if ((i % 2) == ((step % 2))) {
|
||
ws2815_xledc(display_format, base_color, i, LED_TaskDef.LED_Brightne); // 上一个颜色
|
||
} else {
|
||
ws2815_xledc(display_format, flash_color1, i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
}
|
||
}
|
||
|
||
// 2. 在覆盖区域设置闪烁颜色(从头尾向中间推进)
|
||
for (uint16_t s = 0; s <= step; s++) {
|
||
// 计算左右覆盖位置(从头尾向中间推进)
|
||
int16_t left_pos = s; // 从头开始
|
||
int16_t right_pos = num_leds - 1 - s; // 从尾开始
|
||
|
||
// 设置左侧LED
|
||
if (left_pos < right_pos && left_pos < num_leds) {
|
||
ws2815_xledc(display_format, flash_color1, left_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 设置右侧LED
|
||
if (right_pos > left_pos && right_pos < num_leds) {
|
||
ws2815_xledc(display_format, flash_color1, right_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 如果是奇数LED数量且到达中间点,设置中间LED
|
||
if (num_leds % 2 == 1 && s == step && step == max_steps - 1) {
|
||
uint16_t center_pos = num_leds / 2;
|
||
ws2815_xledc(display_format, flash_color1, center_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度(根据需求调整)
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step >= max_steps) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
base_color_index = flash_color_index1; // 基色变为第一个闪烁颜色
|
||
flash_color_index1 = (flash_color_index1 + 1) % 3; // 更新闪烁颜色索引
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief mode44,46 三色刷色拉幕
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_threebrushsaladcurtain(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t color_index = 0; // 当前颜色索引
|
||
static uint8_t next_color_index = 1; // 下一个颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t flash_state = 0; // 闪烁状态(0或1)
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 更新闪烁状态(每次调用翻转)
|
||
flash_state = !flash_state;
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
uint16_t max_steps = (center > (num_leds - center)) ? center : (num_leds - center);
|
||
|
||
// 获取当前颜色值
|
||
uint32_t current_color = colors[color_index];
|
||
uint32_t next_color = colors[next_color_index];
|
||
|
||
// 设置所有LED
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
// 计算该LED是否在覆盖区域内
|
||
uint8_t is_covered = 0;
|
||
for (uint16_t s = 0; s <= step; s++) {
|
||
uint16_t left_pos = center - s;
|
||
uint16_t right_pos = center + s - (num_leds % 2 ? 0 : 1);
|
||
|
||
// 当LED数量为偶数时,需要额外处理中心点
|
||
if (num_leds % 2 == 0) {
|
||
left_pos = center - s - 1;
|
||
right_pos = center + s;
|
||
|
||
// 对于偶数LED,中心点有两个
|
||
if (s == 0) {
|
||
if (i == center - 1 || i == center) {
|
||
is_covered = 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 检查是否在覆盖位置
|
||
if (i == left_pos || i == right_pos) {
|
||
is_covered = 1;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 设置LED颜色
|
||
if (is_covered) {
|
||
// 覆盖区域:根据闪烁状态显示颜色
|
||
if ((i % 2) == ((step % 2))) {
|
||
ws2815_xledc(display_format, current_color, i, LED_TaskDef.LED_Brightne); // 上一个颜色
|
||
} else {
|
||
ws2815_xledc(display_format, next_color, i, LED_TaskDef.LED_Brightne); // 当前颜色
|
||
}
|
||
} else {
|
||
// 未覆盖区域:固定显示下一个颜色
|
||
ws2815_xledc(display_format, next_color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step > max_steps) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
color_index = next_color_index;
|
||
next_color_index = (next_color_index + 1) % 3;
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode47 七彩闭幕
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_multclosing(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t base_color_index = 0; // 当前颜色索引
|
||
static uint8_t closing_color_index = 1; // 拉幕颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
|
||
// 设置整个灯带为基色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, rainbow[base_color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 左侧区域
|
||
for(uint16_t i = 0; i < step; i++){
|
||
ws2815_xledc(display_format, rainbow[closing_color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 右侧闭幕区域
|
||
for (uint16_t i = num_leds - 1; i > num_leds - 1 - step; i--) {
|
||
ws2815_xledc(display_format, rainbow[closing_color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step >= center) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
base_color_index = closing_color_index; // 基色变为拉幕颜色
|
||
closing_color_index = (closing_color_index + 1) % 7; // 更新拉幕颜色索引
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
// ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode48 七彩拉幕
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_multsaladcurtain(uint8_t display_format)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t base_color_index = 0; // 基色索引(当前主要颜色)
|
||
static uint8_t closing_color_index = 1; // 拉幕颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
uint16_t max_steps = (center > (num_leds - center)) ? center : (num_leds - center);
|
||
|
||
// 获取当前颜色
|
||
uint32_t base_color = rainbow[base_color_index];
|
||
uint32_t closing_color = rainbow[closing_color_index];
|
||
|
||
// 设置整个灯带为基色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, base_color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 在覆盖区域设置拉幕颜色
|
||
for (uint16_t s = 0; s <= step; s++) {
|
||
int16_t left_pos = center - s;
|
||
int16_t right_pos = center + s;
|
||
|
||
// 处理偶数LED数量的中心偏移
|
||
if (num_leds % 2 == 0) {
|
||
left_pos = center - s - 1;
|
||
right_pos = center + s;
|
||
}
|
||
|
||
// 设置左侧LED
|
||
if (left_pos >= 0 && left_pos < num_leds) {
|
||
ws2815_xledc(display_format, closing_color, left_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 设置右侧LED(避免中间点重复设置)
|
||
if (right_pos != left_pos && right_pos >= 0 && right_pos < num_leds) {
|
||
ws2815_xledc(display_format, closing_color, right_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step >= max_steps) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
base_color_index = closing_color_index; // 基色变为拉幕颜色
|
||
closing_color_index = (closing_color_index + 1) % 7; // 更新拉幕颜色索引
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode49,51 三色闭幕
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_threeclosing(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t base_color_index = 0; // 当前颜色索引
|
||
static uint8_t closing_color_index = 1; // 拉幕颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
|
||
// 设置整个灯带为基色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, colors[base_color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 左侧区域
|
||
for(uint16_t i = 0; i < step; i++){
|
||
ws2815_xledc(display_format, colors[closing_color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 右侧闭幕区域
|
||
for (uint16_t i = num_leds - 1; i > num_leds - 1 - step; i--) {
|
||
ws2815_xledc(display_format, colors[closing_color_index], i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step >= center) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
base_color_index = closing_color_index; // 基色变为拉幕颜色
|
||
closing_color_index = (closing_color_index + 1) % 3; // 更新拉幕颜色索引
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode50,52 三色拉幕
|
||
* @param
|
||
* @retval
|
||
* @note speed100ms最佳
|
||
*/
|
||
void ws2815_threesaladcurtain(uint8_t display_format,uint32_t colors[])
|
||
{
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t base_color_index = 0; // 基色索引(当前主要颜色)
|
||
static uint8_t closing_color_index = 1; // 拉幕颜色索引
|
||
static uint16_t step = 0; // 覆盖步数
|
||
static uint8_t frame_count = 0; // 帧计数器
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
uint16_t max_steps = (center > (num_leds - center)) ? center : (num_leds - center);
|
||
|
||
// 获取当前颜色
|
||
uint32_t base_color = colors[base_color_index];
|
||
uint32_t closing_color = colors[closing_color_index];
|
||
|
||
// 设置整个灯带为基色
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, base_color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 在覆盖区域设置拉幕颜色
|
||
for (uint16_t s = 0; s <= step; s++) {
|
||
int16_t left_pos = center - s;
|
||
int16_t right_pos = center + s;
|
||
|
||
// 处理偶数LED数量的中心偏移
|
||
if (num_leds % 2 == 0) {
|
||
left_pos = center - s - 1;
|
||
right_pos = center + s;
|
||
}
|
||
|
||
// 设置左侧LED
|
||
if (left_pos >= 0 && left_pos < num_leds) {
|
||
ws2815_xledc(display_format, closing_color, left_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 设置右侧LED(避免中间点重复设置)
|
||
if (right_pos != left_pos && right_pos >= 0 && right_pos < num_leds) {
|
||
ws2815_xledc(display_format, closing_color, right_pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 每1帧推进一次覆盖进度
|
||
if (frame_count++ % 1 == 0) {
|
||
if (step >= max_steps) {
|
||
// 覆盖完成,切换到下一组颜色
|
||
base_color_index = closing_color_index; // 基色变为拉幕颜色
|
||
closing_color_index = (closing_color_index + 1) % 3; // 更新拉幕颜色索引
|
||
step = 0; // 重置覆盖进度
|
||
} else {
|
||
step++; // 推进覆盖进度
|
||
}
|
||
}
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
|
||
}
|
||
/**
|
||
* @brief mode53,55,57,59,61,63,65 单色闭幕
|
||
* @param
|
||
* @retval
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_singleclosing(uint8_t display_format, uint32_t color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint16_t step = 0; // 推进步数
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
// 整个灯带设置为黑色(背景)
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
uint16_t max_steps = center;
|
||
|
||
// 左边LED颜色 (从开头向中间流动)
|
||
for (uint16_t pos = step; pos < center; pos += 3) {
|
||
if (pos < num_leds) {
|
||
ws2815_xledc(display_format, color, pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 右边LED颜色 (从尾部向中间流动)
|
||
for (uint16_t pos = num_leds - 1 - step; pos >= center && pos < num_leds; pos -= 3) {
|
||
if (pos < num_leds) {
|
||
ws2815_xledc(display_format, color, pos, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 处理奇数LED数量的中间点
|
||
if (num_leds % 2 == 1 && step == max_steps - 1) {
|
||
// 在最后一次推进时点亮中间LED
|
||
ws2815_xledc(display_format, color, center, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 更新帧计数器(0->1->2->0循环)
|
||
step = (step + 1) % 3;
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode54,56,58,60,62,64,66 单色拉幕
|
||
* @param
|
||
* @retval
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_singlesaladcurtain(uint8_t display_format, uint32_t color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
uint16_t num_leds = LED_TaskDef.RGB_XLED_NUM;
|
||
static uint8_t frame = 0; // 帧计数器(0,1,2循环)
|
||
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
// 整个灯带设置为黑色(背景)
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
// 计算中心位置
|
||
uint16_t center = num_leds / 2;
|
||
|
||
// 根据当前帧设置亮灯位置
|
||
for (uint16_t i = 0; i < num_leds; i++) {
|
||
// 计算当前LED相对于中心的位置
|
||
int16_t dist_to_center = i - center;
|
||
|
||
// 从中间向头尾流动的特殊模式
|
||
switch(frame) {
|
||
case 0:
|
||
if ((abs(dist_to_center) % 3) == 0) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
break;
|
||
|
||
case 1:
|
||
if ((abs(dist_to_center) % 3) == 1) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
break;
|
||
|
||
case 2:
|
||
if ((abs(dist_to_center) % 3) == 2) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
// 更新帧计数器(0->1->2->0循环)
|
||
frame = (frame + 1) % 3;
|
||
|
||
// 准备DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (num_leds % 4 == 1) {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((uint32_t)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 标记忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode67,68 七色明暗过渡
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed250ms最佳
|
||
*/
|
||
void ws2815_multlightdarktran(uint8_t display_format, uint8_t direction)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint8_t block_size = 7;
|
||
uint8_t colors_size = 7;
|
||
|
||
// 计算状态循环模数
|
||
uint32_t mod_factor = block_size * LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
|
||
// 全局位置
|
||
uint16_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算颜色索引(0-6)
|
||
uint8_t color_index = (global_pos / block_size) % colors_size;
|
||
|
||
// 计算在颜色块内的位置(0-4)
|
||
uint8_t pos_in_block = global_pos % block_size;
|
||
|
||
// 获取亮度系数并计算最终亮度值
|
||
uint16_t block_brightness = brightness_table4[pos_in_block];
|
||
uint16_t final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * block_brightness/255);
|
||
|
||
// 确保亮度在安全范围内(5-255)
|
||
if (final_brightness > 255) final_brightness = 255;
|
||
else if (final_brightness < 5) final_brightness = 5;
|
||
final_brightness = final_brightness*100/255;
|
||
// 调用LED设置函数
|
||
ws2815_xledc(display_format, rainbow[color_index], i, final_brightness);
|
||
}
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode69,70,71,72 三色明暗过渡
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed250ms最佳
|
||
*/
|
||
void ws2815_threelightdarktran(uint8_t display_format,uint8_t direction, uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint8_t block_size = 7;
|
||
uint8_t colors_size = 3;
|
||
|
||
// 计算状态循环模数
|
||
uint32_t mod_factor = block_size * LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
|
||
// 全局位置
|
||
uint16_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算颜色索引(0-2)
|
||
uint8_t color_index = (global_pos / block_size) % colors_size;
|
||
|
||
// 计算在颜色块内的位置(0-6)
|
||
uint8_t pos_in_block = global_pos % block_size;
|
||
|
||
// 获取亮度系数并计算最终亮度值
|
||
uint16_t block_brightness = brightness_table4[pos_in_block];
|
||
uint16_t final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * block_brightness/255);
|
||
|
||
// 确保亮度在安全范围内
|
||
if (final_brightness > 255) final_brightness = 255;
|
||
else if (final_brightness < 5) final_brightness = 5;
|
||
final_brightness = final_brightness*100/255;
|
||
|
||
// 调用LED设置函数
|
||
ws2815_xledc(display_format, colors[color_index], i, final_brightness);
|
||
}
|
||
|
||
|
||
|
||
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode73-86 六色明暗过渡X色
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed250ms最佳
|
||
*/
|
||
/*
|
||
void ws2815_sixlightdarktran(uint8_t display_format, uint8_t direction, uint32_t colors[], uint32_t color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
uint8_t red_block_size = 2; // 红色块大小
|
||
uint8_t other_block_size = 7; // 其他颜色块大小
|
||
uint8_t colors_size = 12;
|
||
|
||
// 计算状态循环模数(固定总块大小为7)
|
||
uint32_t mod_factor = other_block_size * LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算全局位置
|
||
uint16_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算颜色索引(0-11)
|
||
uint8_t color_index = (global_pos / other_block_size) % colors_size;
|
||
|
||
uint8_t pos_in_block = global_pos % other_block_size;
|
||
|
||
// 检查是否在红色区域内
|
||
if (colors[color_index] == color && pos_in_block >= red_block_size) {
|
||
// 不在红色区域,跳过
|
||
continue;
|
||
}
|
||
|
||
uint16_t final_brightness;
|
||
|
||
// 处理红色
|
||
if (colors[color_index] == color) {
|
||
// 亮度固定 系统亮度
|
||
final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * 63);
|
||
}
|
||
// 处理其他颜色
|
||
else {
|
||
// 获取亮度系数并计算最终亮度值
|
||
uint16_t block_brightness = brightness_table4[pos_in_block];
|
||
uint16_t temp_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * block_brightness);
|
||
|
||
// 确保亮度在安全范围内
|
||
if (temp_brightness > 255) final_brightness = 255;
|
||
else if (temp_brightness < 5) final_brightness = 5;
|
||
else final_brightness = temp_brightness;
|
||
}
|
||
|
||
// 调用LED设置函数
|
||
ws2815_xledc(display_format, colors[color_index], i, (float)final_brightness / 255.0f);
|
||
}
|
||
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if (LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
*/
|
||
void ws2815_sixlightdarktran(uint8_t display_format, uint8_t direction, uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint8_t block_size = 7;
|
||
uint8_t colors_size = 9;
|
||
|
||
// 计算状态循环模数
|
||
uint32_t mod_factor = block_size * LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
|
||
// 全局位置
|
||
uint16_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算颜色索引(0-8)
|
||
uint8_t color_index = (global_pos / block_size) % colors_size;
|
||
|
||
// 计算在颜色块内的位置(0-6)
|
||
uint8_t pos_in_block = global_pos % block_size;
|
||
|
||
// 获取亮度系数并计算最终亮度值
|
||
uint16_t block_brightness = brightness_table5[pos_in_block];
|
||
uint16_t final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * block_brightness/255);
|
||
|
||
// 确保亮度在安全范围内(5-255)
|
||
if (final_brightness > 255) final_brightness = 255;
|
||
else if (final_brightness < 5) final_brightness = 5;
|
||
final_brightness = final_brightness*100/255;
|
||
// 调用LED设置函数
|
||
ws2815_xledc(display_format, colors[color_index], i,final_brightness);
|
||
}
|
||
|
||
|
||
|
||
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode87-88 七色流水
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed250ms最佳
|
||
*/
|
||
void ws2815_multRunningwater(uint8_t display_format, uint8_t direction)
|
||
{
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算颜色索引(使用取模保证连续性)
|
||
uint8_t color_index = ((i + LED_TaskDef.ledc_fill_state) / 7) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
}
|
||
else if(direction==1){//正向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 反向流动:通过整体偏移使流动方向相反
|
||
int32_t position = LED_TaskDef.RGB_XLED_NUM * 7 - LED_TaskDef.ledc_fill_state + i;
|
||
uint8_t color_index = (position / 7) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % (LED_TaskDef.RGB_XLED_NUM * 7);
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
|
||
}
|
||
/**
|
||
* @brief mode89-92 三色流水
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed250ms最佳
|
||
*/
|
||
void ws2815_threeRunningwater(uint8_t display_format, uint8_t direction,uint32_t colors[])
|
||
{
|
||
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算颜色索引(使用取模保证连续性)
|
||
uint8_t color_index = ((i + LED_TaskDef.ledc_fill_state) / 7) % 3;
|
||
ws2815_xledc(display_format, colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
}
|
||
else if(direction==1){//正向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 反向流动:通过整体偏移使流动方向相反
|
||
int32_t position = LED_TaskDef.RGB_XLED_NUM * 7 - LED_TaskDef.ledc_fill_state + i;
|
||
uint8_t color_index = (position / 7) % 3;
|
||
ws2815_xledc(display_format, colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % (LED_TaskDef.RGB_XLED_NUM * 7);
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode93-104 双色流水
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed250ms最佳
|
||
*/
|
||
void ws2815_secondRunningwater(uint8_t display_format, uint8_t direction,uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算颜色索引(使用取模保证连续性)
|
||
uint8_t color_index = ((i + LED_TaskDef.ledc_fill_state) / 7) % 2;
|
||
ws2815_xledc(display_format, colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
|
||
}
|
||
else if(direction==1){//正向流动
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 反向流动:通过整体偏移使流动方向相反
|
||
int32_t position = LED_TaskDef.RGB_XLED_NUM * 7 - LED_TaskDef.ledc_fill_state + i;
|
||
uint8_t color_index = (position / 7) % 2;
|
||
ws2815_xledc(display_format, colors[color_index], i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % (LED_TaskDef.RGB_XLED_NUM * 7);
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode105-128 XYX流动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_flowingstripe(uint8_t display_format, uint8_t direction,
|
||
uint32_t stripe_color, uint32_t gap_color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
const uint16_t pattern_size = 20; // 2(stripe) + 6(gap) + 2(stripe) + 10(black) = 20
|
||
|
||
if(direction == 0){ // 反向
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算在当前帧中的相对位置
|
||
uint16_t pos = (i + LED_TaskDef.ledc_fill_state) % pattern_size;
|
||
|
||
if(pos < 2) // 条纹色
|
||
ws2815_xledc(display_format, stripe_color, i, LED_TaskDef.LED_Brightne);
|
||
else if(pos < 8) // 间隙色
|
||
ws2815_xledc(display_format, gap_color, i, LED_TaskDef.LED_Brightne);
|
||
else if(pos < 10) // 条纹色
|
||
ws2815_xledc(display_format, stripe_color, i, LED_TaskDef.LED_Brightne);
|
||
else // 黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if(direction == 1){ // 正向
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 整体偏移
|
||
int32_t position = (pattern_size - LED_TaskDef.ledc_fill_state) + i;
|
||
uint16_t pos = position % pattern_size;
|
||
|
||
if(pos < 2)
|
||
ws2815_xledc(display_format, stripe_color, i, LED_TaskDef.LED_Brightne);
|
||
else if(pos < 8)
|
||
ws2815_xledc(display_format, gap_color, i, LED_TaskDef.LED_Brightne);
|
||
else if(pos < 10)
|
||
ws2815_xledc(display_format, stripe_color, i, LED_TaskDef.LED_Brightne);
|
||
else
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
|
||
// 更新流动状态
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % pattern_size;
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
// 忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode129-130 七彩拖尾
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note
|
||
*/
|
||
void ws2815_multtrailing(uint8_t display_format, uint8_t direction)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint8_t block_size = 24;
|
||
uint8_t colors_size = 7;
|
||
|
||
// 计算状态循环模数
|
||
uint32_t mod_factor = block_size * LED_TaskDef.RGB_XLED_NUM;
|
||
uint8_t under_Brightne = LED_TaskDef.LED_Brightne*64/255;
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
|
||
// 全局位置
|
||
uint16_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算颜色索引(0-6)
|
||
uint8_t color_index = (global_pos / block_size) % colors_size;
|
||
|
||
// 计算在颜色块内的位置(0-23)
|
||
uint8_t pos_in_block = global_pos % block_size;
|
||
|
||
// 计算亮度值
|
||
uint16_t block_brightness = 0;
|
||
if(direction == 1){
|
||
block_brightness = brightness_table6[pos_in_block];
|
||
}
|
||
else if(direction == 0){
|
||
block_brightness = brightness_table7[pos_in_block];
|
||
}
|
||
uint16_t final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne*block_brightness/255);
|
||
|
||
// 确保亮度在安全范围内(5-255)
|
||
if (final_brightness > 255) final_brightness = 255;
|
||
else if (final_brightness < 5) final_brightness = 5;
|
||
final_brightness = final_brightness*128/255;
|
||
|
||
ws2815_xledc(display_format, rainbow[color_index], i,final_brightness);
|
||
}
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
|
||
}
|
||
/**
|
||
* @brief mode131-144 单色拖尾
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note
|
||
*/
|
||
void ws2815_singletrailing(uint8_t display_format, uint8_t direction, uint32_t color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
uint8_t block_size = 24;
|
||
|
||
// 计算状态循环模数
|
||
uint32_t mod_factor = block_size * LED_TaskDef.RGB_XLED_NUM;
|
||
|
||
// 遍历所有LED灯珠
|
||
for (uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
|
||
// 全局位置
|
||
uint16_t global_pos = (direction == 1) ?
|
||
(mod_factor - LED_TaskDef.ledc_fill_state + i) : // 反向流动
|
||
(i + LED_TaskDef.ledc_fill_state); // 正向流动
|
||
|
||
// 计算在颜色块内的位置(0-23)
|
||
uint8_t pos_in_block = global_pos % block_size;
|
||
|
||
// 计算亮度值
|
||
uint16_t block_brightness = 0;
|
||
if(direction == 1){
|
||
block_brightness = brightness_table6[pos_in_block];
|
||
}
|
||
else if(direction == 0){
|
||
block_brightness = brightness_table7[pos_in_block];
|
||
}
|
||
uint16_t final_brightness = (uint16_t)(LED_TaskDef.LED_Brightne * block_brightness/255);
|
||
|
||
// 确保亮度在安全范围内(5-255)
|
||
if (final_brightness > 255) final_brightness = 255;
|
||
else if (final_brightness < 5) final_brightness = 5;
|
||
final_brightness = final_brightness*128/255;
|
||
|
||
ws2815_xledc(display_format, color, i, final_brightness);
|
||
}
|
||
|
||
// 更新流动状态(确保无限循环)
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % mod_factor;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* @brief mode145-158 单色跑动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed300ms最佳
|
||
*/
|
||
|
||
void ws2815_singlerunning(uint8_t display_format, uint8_t direction, uint32_t color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
const uint8_t gap = 8; // 每隔8个灯珠亮一个
|
||
|
||
// 计算组内的亮灯位置(0-7)
|
||
uint8_t light_pos = LED_TaskDef.ledc_fill_state % gap;
|
||
|
||
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算当前灯珠在组内的位置
|
||
uint8_t pos_in_group = i % gap;
|
||
|
||
if (direction == 0) { // 反向流动
|
||
// 亮灯位置从右向左移动
|
||
uint8_t reversed_pos = gap - 1 - light_pos;
|
||
if (pos_in_group == reversed_pos) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
else if (direction == 1) { // 正向流动
|
||
// 亮灯位置从左向右移动
|
||
if (pos_in_group == light_pos) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 更新流动状态
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % gap;
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode159-160 七色跑动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
|
||
void ws2815_multrunning(uint8_t display_format, uint8_t direction)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
// 打印信息
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction == 1){
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 正向流动
|
||
uint16_t reversed_i = LED_TaskDef.RGB_XLED_NUM - 1 - i;
|
||
|
||
// 位置索引
|
||
uint32_t pos_index = (reversed_i + LED_TaskDef.ledc_fill_state) % 56;
|
||
|
||
// 每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
else if(direction == 0){
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算位置索引(考虑反向流动)
|
||
uint32_t pos_index = (i + LED_TaskDef.ledc_fill_state) % 56;
|
||
|
||
// 计算颜色索引:每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 更新流动状态
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % 56;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief mode161-164 三色跑动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_threerunning(uint8_t display_format, uint8_t direction, uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 反向流动
|
||
uint32_t pos_index = (i + LED_TaskDef.ledc_fill_state) % 24;
|
||
|
||
// 每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 3;
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
else if(direction==1){//正向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 正向流动
|
||
uint16_t reversed_i = LED_TaskDef.RGB_XLED_NUM - 1 - i;
|
||
|
||
// 位置索引
|
||
uint32_t pos_index = (reversed_i + LED_TaskDef.ledc_fill_state) % 24;
|
||
|
||
// 每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 3;
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % (LED_TaskDef.RGB_XLED_NUM * 3);
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode165-168 四色跑动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_fourrunning(uint8_t display_format, uint8_t direction, uint32_t colors[])
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
if(direction==0){//反向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 反向流动
|
||
uint32_t pos_index = (i + LED_TaskDef.ledc_fill_state) % 32;
|
||
|
||
// 每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 4;
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
else if(direction==1){//正向流动
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 正向流动
|
||
uint16_t reversed_i = LED_TaskDef.RGB_XLED_NUM - 1 - i;
|
||
|
||
// 位置索引
|
||
uint32_t pos_index = (reversed_i + LED_TaskDef.ledc_fill_state) % 32;
|
||
|
||
// 每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 4;
|
||
ws2815_xledc(display_format, colors[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, Color_BLACK, i, LED_TaskDef.LED_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % (LED_TaskDef.RGB_XLED_NUM * 4);
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode169-196 单底单色跑动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_undersinglerunning(uint8_t display_format, uint8_t direction, uint32_t undercolor, uint32_t color)
|
||
{
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
|
||
const uint8_t gap = 8; // 每隔8个灯珠亮一个
|
||
|
||
// 计算组内的亮灯位置(0-7)
|
||
uint8_t light_pos = LED_TaskDef.ledc_fill_state % gap;
|
||
|
||
uint8_t under_Brightne = LED_TaskDef.LED_Brightne*64/255;
|
||
if(LED_TaskDef.CURRENT_TASK == 180 || LED_TaskDef.CURRENT_TASK == 179){
|
||
under_Brightne = LED_TaskDef.LED_Brightne*32/255;
|
||
}
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算当前灯珠在组内的位置
|
||
uint8_t pos_in_group = i % gap;
|
||
|
||
if (direction == 0) { // 反向流动
|
||
// 亮灯位置从右向左移动
|
||
uint8_t reversed_pos = gap - 1 - light_pos;
|
||
if (pos_in_group == reversed_pos) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, undercolor, i, under_Brightne);
|
||
}
|
||
}
|
||
else if (direction == 1) { // 正向流动
|
||
// 亮灯位置从左向右移动
|
||
if (pos_in_group == light_pos) {
|
||
ws2815_xledc(display_format, color, i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
ws2815_xledc(display_format, undercolor, i, under_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 更新流动状态
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % gap;
|
||
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// 判断使能DMA发送
|
||
if (LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
}
|
||
else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
// 忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
/**
|
||
* @brief mode197-210 单底七色跑动
|
||
* @param direction: 方向.
|
||
* @retval 0 = 反向 , 1 = 正向
|
||
* @note speed200ms最佳
|
||
*/
|
||
void ws2815_undermultrunning(uint8_t display_format, uint8_t direction, uint32_t undercolor)
|
||
{
|
||
uint8_t under_Brightne;
|
||
if (!LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
// 空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
// 打印信息
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("DMA_CODE_LEN = %x\n", LED_TaskDef.RGB_CODE_LEN);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
if(LED_TaskDef.CURRENT_TASK == 205 || LED_TaskDef.CURRENT_TASK == 206 || LED_TaskDef.CURRENT_TASK == 209 || LED_TaskDef.CURRENT_TASK == 210)
|
||
under_Brightne = LED_TaskDef.LED_Brightne*32/255;
|
||
else
|
||
under_Brightne = LED_TaskDef.LED_Brightne*64/255;
|
||
|
||
if(direction == 1){
|
||
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 正向流动
|
||
uint16_t reversed_i = LED_TaskDef.RGB_XLED_NUM - 1 - i;
|
||
|
||
// 位置索引
|
||
uint32_t pos_index = (reversed_i + LED_TaskDef.ledc_fill_state) % 56;
|
||
|
||
// 每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, undercolor, i, under_Brightne);
|
||
}
|
||
}
|
||
}
|
||
else if(direction == 0){
|
||
// 填充当前帧
|
||
for(uint16_t i = 0; i < LED_TaskDef.RGB_XLED_NUM; i++) {
|
||
// 计算位置索引(考虑反向流动)
|
||
uint32_t pos_index = (i + LED_TaskDef.ledc_fill_state) % 56;
|
||
|
||
// 计算颜色索引:每8个位置中有7个是黑色
|
||
if (pos_index % 8 == 0) {
|
||
// 每8个位置中的第一个显示彩虹色
|
||
uint8_t color_index = (pos_index / 8) % 7;
|
||
ws2815_xledc(display_format, rainbow[color_index], i, LED_TaskDef.LED_Brightne);
|
||
} else {
|
||
// 其他位置显示黑色
|
||
ws2815_xledc(display_format, undercolor, i, under_Brightne);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 更新流动状态
|
||
LED_TaskDef.ledc_fill_state = (LED_TaskDef.ledc_fill_state + 1) % 56;
|
||
|
||
// 生成DMA数据
|
||
//ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0], &color_buf[0]);
|
||
|
||
// DMA传输
|
||
if(LED_TaskDef.RGB_XLED_NUM % 4 == 1) {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN + 1);
|
||
} else {
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
|
||
// 设置为忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 彩色色温调节从红到绿到蓝在到红
|
||
* @param
|
||
* @retval
|
||
* @note
|
||
*/
|
||
|
||
void ws2815_Color_temperature_adjustment(uint8_t display_format,uint8_t Temp){
|
||
const uint16_t R[] = {
|
||
255, 226, 198, 170, 141, 113, 85, 56, 28, 0,
|
||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
0, 28, 56, 85, 113, 141, 170, 198, 226, 255
|
||
};
|
||
const uint16_t G[] = {
|
||
0, 28, 56, 85, 113, 141, 170, 198, 226, 255,
|
||
255, 226, 198, 170, 141, 113, 85, 56, 28, 0,
|
||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||
};
|
||
const uint16_t B[] = {
|
||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||
0, 28, 56, 85, 113, 141, 170, 198, 226, 255,
|
||
255, 226, 198, 170, 141, 113, 85, 56, 28, 0
|
||
};
|
||
uint32_t color = 0;
|
||
color |= R[Temp]<<16;
|
||
color |= G[Temp]<<8;
|
||
color |= B[Temp];
|
||
//RGB_Color Temp_Color = Data_24_To_RGB_Color(color,LED_TaskDef.LED_Brightne);
|
||
//WS2815_SetAll(Temp_Color);
|
||
//WS2815_Update();
|
||
for(uint16_t i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,color,i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
WS2815_Update();
|
||
}
|
||
/**
|
||
* @brief 开关灯.
|
||
* @param LED_Maincolor: 颜色.
|
||
* @retval None
|
||
*/
|
||
void ws2815_ledc_ON_OFF(uint8_t display_format,uint32_t LED_Maincolor)
|
||
{
|
||
//printf("LED_SWITCH = %x\n", LED_TaskDef.LED_SWITCH);
|
||
/*
|
||
if (LED_TaskDef.LED_SWITCH) {
|
||
return;
|
||
}
|
||
*/
|
||
uint16_t i = 0;
|
||
//空闲状态
|
||
if (LED_TaskDef.ledc_kick_state == 0) {
|
||
//printf("CURRENT_TASK = %x\n", LED_TaskDef.CURRENT_TASK);
|
||
//printf("LEDC_TICK_Speed = %d\n", LED_TaskDef.LEDC_TICK_Speed);
|
||
//printf("RGB_XLED_NUM = %x\n", LED_TaskDef.RGB_XLED_NUM);
|
||
//printf("LED_Brightne = %.2f\n", LED_TaskDef.LED_Brightne);
|
||
//全灯赋值
|
||
for(i=0;i<LED_TaskDef.RGB_XLED_NUM;i++){
|
||
ws2815_xledc(display_format,LED_Maincolor,i,LED_TaskDef.LED_Brightne);
|
||
}
|
||
ws2815_rgb_color_out_32to24bit_code_fill(&code_buf[0],&color_buf[0]);
|
||
//判断使能DMA发送
|
||
if(LED_TaskDef.RGB_XLED_NUM%4 == 1){
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN+1);
|
||
}
|
||
else{
|
||
ledc_dma_kick((u32)&code_buf[0], LED_TaskDef.RGB_CODE_LEN);
|
||
}
|
||
//忙碌状态
|
||
LED_TaskDef.ledc_kick_state = 1;
|
||
}
|
||
}
|
||
|
||
/*模式选择*/
|
||
void light_mode(void)
|
||
{
|
||
LED_TaskDef.ledc_kick_state = 0;
|
||
//printf("xianxu:%d\n",LED_TaskDef.xianxu);
|
||
if(LED_TaskDef.CURRENT_TASK == 4 || LED_TaskDef.CURRENT_TASK == 5 || LED_TaskDef.CURRENT_TASK == 6){
|
||
set_TaskComps_itvTime(3, LED_TaskDef.LEDC_TICK_Speed+150);
|
||
}else{
|
||
set_TaskComps_itvTime(3, LED_TaskDef.LEDC_TICK_Speed);
|
||
}
|
||
if(!LED_TaskDef.LED_SWITCH){
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
}else{
|
||
if(Temp_Flag){
|
||
ws2815_Color_temperature_adjustment(LED_TaskDef.xianxu,LED_TaskDef.Temp_Step);
|
||
}else if(mic_start){
|
||
set_TaskComps_itvTime(3, 20);
|
||
Music_Mode_Change();
|
||
}else if(Color_Flag){
|
||
ws2815_ledc_show(LED_TaskDef.xianxu,col_tmp); //全灯亮
|
||
}
|
||
else{
|
||
set_TaskComps_itvTime(3, LED_TaskDef.LEDC_TICK_Speed);
|
||
switch(LED_TaskDef.CURRENT_TASK){
|
||
|
||
//DEBUG("switch\n");
|
||
//printf("%s\n",__func__);
|
||
case 0 : ws2815_ledc_show(LED_TaskDef.xianxu,Color_PURPLE);break; //全灯亮
|
||
case 1 : ws2815_ledc_singleflu(LED_TaskDef.xianxu,Color_PURPLE,Color_BLACK);break;//单个流水灯
|
||
|
||
case 2 : ws2815_ledc_multicolor(LED_TaskDef.xianxu,1);break; //正向幻彩
|
||
case 3 : ws2815_ledc_multicolorlight(LED_TaskDef.xianxu,1);break; //正向七彩流水明暗
|
||
|
||
case 4 : ws2815_ledc_multjumpshow(LED_TaskDef.xianxu);break; //七彩跳变
|
||
case 5 : ws2815_ledc_threejumpshow(LED_TaskDef.xianxu,_rgb);break; //红绿蓝跳变
|
||
case 6 : ws2815_ledc_threejumpshow(LED_TaskDef.xianxu,_ycp);break; //黄青紫跳变
|
||
|
||
case 7 : ws2815_ledc_multstroboscopic(LED_TaskDef.xianxu);break; //七彩频闪
|
||
case 8 : ws2815_ledc_threestroboscopic(LED_TaskDef.xianxu,_rgb);break; //红绿蓝频闪
|
||
case 9 : ws2815_ledc_threestroboscopic(LED_TaskDef.xianxu,_ycp);break; //黄青紫频闪
|
||
|
||
case 10: ws2815_ledc_multgradualchange(LED_TaskDef.xianxu);break; //七彩渐变
|
||
case 11: ws2815_ledc_secondalternategradient(LED_TaskDef.xianxu,_ry);break; //红黄交替渐变
|
||
case 12: ws2815_ledc_secondalternategradient(LED_TaskDef.xianxu,_rp);break; //红紫交替渐变
|
||
case 13: ws2815_ledc_secondalternategradient(LED_TaskDef.xianxu,_gc);break; //绿青交替渐变
|
||
case 14: ws2815_ledc_secondalternategradient(LED_TaskDef.xianxu,_gy);break; //绿黄交替渐变
|
||
case 15: ws2815_ledc_secondalternategradient(LED_TaskDef.xianxu,_bp);break; //蓝紫交替渐变
|
||
|
||
case 16: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_RED);break; //红色跑马
|
||
case 17: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_GREEN);break; //绿色跑马
|
||
case 18: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_BLUE);break; //蓝色跑马
|
||
case 19: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_YELLOW);break; //黄色跑马
|
||
case 20: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_CHING);break; //青色跑马
|
||
case 21: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_PURPLE);break; //紫色跑马
|
||
case 22: ws2815_ledc_singleridehorse(LED_TaskDef.xianxu,Color_WHITE);break; //白色跑马
|
||
|
||
case 23: ws2815_ledc_multspotlight(LED_TaskDef.xianxu,1);break; //正向七彩追光
|
||
case 24: ws2815_ledc_multspotlight(LED_TaskDef.xianxu,0);break; //反向七彩追光
|
||
case 25: ws2815_ledc_threespotlight(LED_TaskDef.xianxu,1,_rgb);break; //正向红绿蓝追光
|
||
case 26: ws2815_ledc_threespotlight(LED_TaskDef.xianxu,0,_rgb);break; //反向红绿蓝追光
|
||
case 27: ws2815_ledc_threespotlight(LED_TaskDef.xianxu,1,_ycp);break; //正向黄青紫追光
|
||
case 28: ws2815_ledc_threespotlight(LED_TaskDef.xianxu,0,_ycp);break; //反向黄青紫追光
|
||
|
||
case 29: ws2815_multfloatlight(LED_TaskDef.xianxu,1);break; //正向七彩飘动
|
||
case 30: ws2815_multfloatlight(LED_TaskDef.xianxu,0);break; //反向七彩飘动
|
||
case 31: ws2815_threefloatlight(LED_TaskDef.xianxu,1,_rgb);break; //正向红绿蓝飘动
|
||
case 32: ws2815_threefloatlight(LED_TaskDef.xianxu,0,_rgb);break; //反向红绿蓝飘动
|
||
case 33: ws2815_threefloatlight(LED_TaskDef.xianxu,1,_ycp);break; //正向黄青蓝飘动
|
||
case 34: ws2815_threefloatlight(LED_TaskDef.xianxu,0,_ycp);break; //反向黄青蓝飘动
|
||
|
||
case 35: ws2815_multbrushcolor(LED_TaskDef.xianxu,1);break; //正向七彩刷色
|
||
case 36: ws2815_multbrushcolor(LED_TaskDef.xianxu,0);break; //反向七彩刷色
|
||
case 37: ws2815_threebrushcolor(LED_TaskDef.xianxu,1,_rgb);break; //正向红绿蓝刷色
|
||
case 38: ws2815_threebrushcolor(LED_TaskDef.xianxu,0,_rgb);break; //反向红绿蓝刷色
|
||
case 39: ws2815_threebrushcolor(LED_TaskDef.xianxu,1,_ycp);break; //正向黄青紫刷色
|
||
case 40: ws2815_threebrushcolor(LED_TaskDef.xianxu,0,_ycp);break; //反向黄青紫刷色
|
||
|
||
case 41: ws2815_multbrushclosing(LED_TaskDef.xianxu);break; //七彩刷色闭幕
|
||
case 42: ws2815_multbrushsaladcurtain(LED_TaskDef.xianxu);break; //七彩刷色拉幕
|
||
case 43: ws2815_threebrushclosing(LED_TaskDef.xianxu,_rgb);break; //红绿蓝刷色闭幕
|
||
case 44: ws2815_threebrushsaladcurtain(LED_TaskDef.xianxu,_rgb);break; //红绿蓝刷色拉幕
|
||
case 45: ws2815_threebrushclosing(LED_TaskDef.xianxu,_ycp);break; //黄青紫刷色闭幕
|
||
case 46: ws2815_threebrushsaladcurtain(LED_TaskDef.xianxu,_ycp);break; //黄青紫刷色拉幕
|
||
|
||
case 47: ws2815_multclosing(LED_TaskDef.xianxu); //七彩闭幕
|
||
case 48: ws2815_multsaladcurtain(LED_TaskDef.xianxu);break; //七彩拉幕
|
||
case 49: ws2815_threeclosing(LED_TaskDef.xianxu,_rgb);break; //红绿蓝闭幕
|
||
case 50: ws2815_threesaladcurtain(LED_TaskDef.xianxu,_rgb);break; //红绿蓝拉幕
|
||
case 51: ws2815_threeclosing(LED_TaskDef.xianxu,_ycp);break; //黄青紫闭幕
|
||
case 52: ws2815_threesaladcurtain(LED_TaskDef.xianxu,_ycp);break; //黄青紫拉幕
|
||
|
||
case 53: ws2815_singleclosing(LED_TaskDef.xianxu,Color_RED);break; //红色闭幕
|
||
case 54: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_RED);break; //红色拉幕
|
||
case 55: ws2815_singleclosing(LED_TaskDef.xianxu,Color_GREEN);break; //绿色闭幕
|
||
case 56: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_GREEN);break; //绿色拉幕
|
||
case 57: ws2815_singleclosing(LED_TaskDef.xianxu,Color_BLUE);break; //蓝色闭幕
|
||
case 58: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_BLUE);break; //蓝色拉幕
|
||
case 59: ws2815_singleclosing(LED_TaskDef.xianxu,Color_YELLOW);break; //黄色闭幕
|
||
case 60: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_YELLOW);break; //黄色拉幕
|
||
case 61: ws2815_singleclosing(LED_TaskDef.xianxu,Color_CHING);break; //青色闭幕
|
||
case 62: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_CHING);break; //青色拉幕
|
||
case 63: ws2815_singleclosing(LED_TaskDef.xianxu,Color_PURPLE);break; //紫色闭幕
|
||
case 64: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_PURPLE);break; //紫色拉幕
|
||
case 65: ws2815_singleclosing(LED_TaskDef.xianxu,Color_WHITE);break; //白色闭幕
|
||
case 66: ws2815_singlesaladcurtain(LED_TaskDef.xianxu,Color_WHITE);break; //白色拉幕
|
||
|
||
|
||
case 67: ws2815_multlightdarktran(LED_TaskDef.xianxu,1);break; //正向七色明暗过渡
|
||
case 68: ws2815_multlightdarktran(LED_TaskDef.xianxu,0);break; //反向七色明暗过渡
|
||
case 69: ws2815_threelightdarktran(LED_TaskDef.xianxu,1,_rgb);break; //正向蓝绿红明暗过渡
|
||
case 70: ws2815_threelightdarktran(LED_TaskDef.xianxu,0,_rgb);break; //反向红绿蓝明暗过渡
|
||
case 71: ws2815_threelightdarktran(LED_TaskDef.xianxu,1,_ycp);break; //正向紫青黄明暗过渡
|
||
case 72: ws2815_threelightdarktran(LED_TaskDef.xianxu,0,_ycp);break; //反向黄青紫明暗过渡
|
||
|
||
case 73: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow1);break; //正向六色明暗过渡红色
|
||
case 74: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow1);break; //反向六色明暗过渡红色
|
||
case 75: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow2);break; //正向六色明暗过渡绿色
|
||
case 76: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow2);break; //反向六色明暗过渡绿色
|
||
case 77: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow3);break; //正向六色明暗过渡蓝色
|
||
case 78: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow3);break; //反向六色明暗过渡蓝色
|
||
case 79: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow4);break; //正向六色明暗过渡青色
|
||
case 80: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow4);break; //反向六色明暗过渡青色
|
||
case 81: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow5);break; //正向六色明暗过渡黄色
|
||
case 82: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow5);break; //反向六色明暗过渡黄色
|
||
case 83: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow6);break; //正向六色明暗过渡紫色
|
||
case 84: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow6);break; //反向六色明暗过渡紫色
|
||
case 85: ws2815_sixlightdarktran(LED_TaskDef.xianxu,1,rainbow7);break; //正向六色明暗过渡白色
|
||
case 86: ws2815_sixlightdarktran(LED_TaskDef.xianxu,0,rainbow7);break; //反向六色明暗过渡白色
|
||
|
||
case 87: ws2815_multRunningwater(LED_TaskDef.xianxu,1);break; //正向七彩流水
|
||
case 88: ws2815_multRunningwater(LED_TaskDef.xianxu,0);break; //反向七彩流水
|
||
case 89: ws2815_threeRunningwater(LED_TaskDef.xianxu,1,_rgb);break; //正向红绿蓝流水
|
||
case 90: ws2815_threeRunningwater(LED_TaskDef.xianxu,0,_rgb);break; //反向红绿蓝流水
|
||
case 91: ws2815_threeRunningwater(LED_TaskDef.xianxu,1,_ycp);break; //正向黄青紫流水
|
||
case 92: ws2815_threeRunningwater(LED_TaskDef.xianxu,0,_ycp);break; //反向黄青紫流水
|
||
case 93: ws2815_secondRunningwater(LED_TaskDef.xianxu,1,_rg);break; //正向红绿流水
|
||
case 94: ws2815_secondRunningwater(LED_TaskDef.xianxu,0,_rg);break; //反向红绿流水
|
||
case 95: ws2815_secondRunningwater(LED_TaskDef.xianxu,1,_gb);break; //正向绿蓝流水
|
||
case 96: ws2815_secondRunningwater(LED_TaskDef.xianxu,0,_gb);break; //反向绿蓝流水
|
||
case 97: ws2815_secondRunningwater(LED_TaskDef.xianxu,1,_yb);break; //正向黄蓝流水
|
||
case 98: ws2815_secondRunningwater(LED_TaskDef.xianxu,0,_yb);break; //反向黄蓝流水
|
||
case 99: ws2815_secondRunningwater(LED_TaskDef.xianxu,1,_yc);break; //正向黄青流水
|
||
case 100: ws2815_secondRunningwater(LED_TaskDef.xianxu,0,_yc);break; //反向黄青流水
|
||
case 101: ws2815_secondRunningwater(LED_TaskDef.xianxu,1,_cp);break; //正向青紫流水
|
||
case 102: ws2815_secondRunningwater(LED_TaskDef.xianxu,0,_cp);break; //反向青紫流水
|
||
case 103: ws2815_secondRunningwater(LED_TaskDef.xianxu,1,_bw);break; //正向黑白流水
|
||
case 104: ws2815_secondRunningwater(LED_TaskDef.xianxu,0,_bw);break; //反向黑白流水
|
||
|
||
case 105:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_WHITE,Color_RED);break; //正向白红白流动
|
||
case 106:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_WHITE,Color_RED);break; //反向白红白流动
|
||
case 107:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_WHITE,Color_GREEN);break;//正向白绿白流动
|
||
case 108:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_WHITE,Color_GREEN);break;//反向白绿白流动
|
||
case 109:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_WHITE,Color_BLUE);break; //正向白蓝白流动
|
||
case 110:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_WHITE,Color_BLUE);break; //反向白蓝白流动
|
||
case 111:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_WHITE,Color_YELLOW);break;//正向白黄白流动
|
||
case 112:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_WHITE,Color_YELLOW);break;//反向白黄白流动
|
||
case 113:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_WHITE,Color_CHING);break; //正向白青白流动
|
||
case 114:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_WHITE,Color_CHING);break; //反向白青白流动
|
||
case 115:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_WHITE,Color_PURPLE);break;//正向白紫白流动
|
||
case 116:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_WHITE,Color_PURPLE);break;//反向白紫白流动
|
||
case 117:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_RED,Color_WHITE);break; //正向红白红流动
|
||
case 118:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_RED,Color_WHITE);break; //反向红白红流动
|
||
case 119:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_GREEN,Color_WHITE);break; //正向绿白绿流动
|
||
case 120:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_GREEN,Color_WHITE);break; //反向绿白绿流动
|
||
case 121:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_BLUE,Color_WHITE);break; //正向蓝白蓝流动
|
||
case 122:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_BLUE,Color_WHITE);break; //反向蓝白蓝流动
|
||
case 123:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_YELLOW,Color_WHITE);break;//正向黄白黄流动
|
||
case 124:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_YELLOW,Color_WHITE);break;//反向黄白黄流动
|
||
case 125:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_CHING,Color_WHITE);break; //正向青白青流动
|
||
case 126:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_CHING,Color_WHITE);break; //反向青白青流动
|
||
case 127:ws2815_flowingstripe(LED_TaskDef.xianxu,1,Color_PURPLE,Color_WHITE);break;//正向紫白紫流动
|
||
case 128:ws2815_flowingstripe(LED_TaskDef.xianxu,0,Color_PURPLE,Color_WHITE);break;//反向紫白紫流动
|
||
|
||
case 129:ws2815_multtrailing(LED_TaskDef.xianxu,1);break; //正向七彩拖尾
|
||
case 130:ws2815_multtrailing(LED_TaskDef.xianxu,0);break; //反向七彩拖尾
|
||
case 131:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_RED);break; //正向红色拖尾
|
||
case 132:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_RED);break; //反向红色拖尾
|
||
case 133:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_GREEN);break; //正向绿色拖尾
|
||
case 134:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_GREEN);break; //反向绿色拖尾
|
||
case 135:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_BLUE);break; //正向蓝色拖尾
|
||
case 136:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_BLUE);break; //反向蓝色拖尾
|
||
case 137:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_YELLOW);break; //正向黄色拖尾
|
||
case 138:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_YELLOW);break; //反向黄色拖尾
|
||
case 139:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_CHING);break; //正向青色拖尾
|
||
case 140:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_CHING);break; //反向青色拖尾
|
||
case 141:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_PURPLE);break; //正向紫色拖尾
|
||
case 142:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_PURPLE);break; //反向紫色拖尾
|
||
case 143:ws2815_singletrailing(LED_TaskDef.xianxu,1,Color_WHITE);break; //正向白色拖尾
|
||
case 144:ws2815_singletrailing(LED_TaskDef.xianxu,0,Color_WHITE);break; //反向白色拖尾
|
||
|
||
case 145:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_RED);break; //正向红色跑动
|
||
case 146:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_RED);break; //反向红色跑动
|
||
case 147:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_GREEN);break; //正向绿色跑动
|
||
case 148:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_GREEN);break; //反向绿色跑动
|
||
case 149:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_BLUE);break; //正向蓝色跑动
|
||
case 150:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_BLUE);break; //反向蓝色跑动
|
||
case 151:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_YELLOW);break; //正向黄色跑动
|
||
case 152:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_YELLOW);break; //反向黄色跑动
|
||
case 153:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_CHING);break; //正向青色跑动
|
||
case 154:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_CHING);break; //反向青色跑动
|
||
case 155:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_PURPLE);break; //正向紫色跑动
|
||
case 156:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_PURPLE);break; //反向紫色跑动
|
||
case 157:ws2815_singlerunning(LED_TaskDef.xianxu,1,Color_WHITE);break; //正向白色跑动
|
||
case 158:ws2815_singlerunning(LED_TaskDef.xianxu,0,Color_WHITE);break; //反向白色跑动
|
||
|
||
case 159:ws2815_multrunning(LED_TaskDef.xianxu,1);break; //正向七色跑动
|
||
case 160:ws2815_multrunning(LED_TaskDef.xianxu,0);break; //反向七色跑动
|
||
case 161:ws2815_threerunning(LED_TaskDef.xianxu,1,_rgb);break; //正向红绿蓝跑动
|
||
case 162:ws2815_threerunning(LED_TaskDef.xianxu,0,_rgb);break; //反向红绿蓝跑动
|
||
case 163:ws2815_threerunning(LED_TaskDef.xianxu,1,_ycp);break; //正向黄青紫跑动
|
||
case 164:ws2815_threerunning(LED_TaskDef.xianxu,0,_ycp);break; //反向黄青紫跑动
|
||
case 165:ws2815_fourrunning(LED_TaskDef.xianxu,1,_ycpb);break; //正向黄青紫蓝跑动
|
||
case 166:ws2815_fourrunning(LED_TaskDef.xianxu,0,_ycpb);break; //反向黄青紫蓝跑动
|
||
case 167:ws2815_fourrunning(LED_TaskDef.xianxu,1,_ycgb);break; //正向黄青绿蓝跑动
|
||
case 168:ws2815_fourrunning(LED_TaskDef.xianxu,0,_ycgb);break; //反向黄青绿蓝跑动
|
||
|
||
case 169:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_WHITE,Color_RED);break; //正向白底红点跑动
|
||
case 170:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_WHITE,Color_RED);break; //反向白底红点跑动
|
||
case 171:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_RED,Color_GREEN);break; //正向红底绿点跑动
|
||
case 172:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_RED,Color_GREEN);break; //反向红底绿点跑动
|
||
case 173:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_GREEN,Color_BLUE);break; //正向绿底蓝点跑动
|
||
case 174:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_GREEN,Color_BLUE);break; //反向绿底蓝点跑动
|
||
case 175:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_BLUE,Color_YELLOW);break; //正向蓝底黄点跑动
|
||
case 176:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_BLUE,Color_YELLOW);break; //反向蓝底黄点跑动
|
||
case 177:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_YELLOW,Color_CHING);break;//正向黄底青点跑动
|
||
case 178:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_YELLOW,Color_CHING);break;//反向黄底青点跑动
|
||
case 179:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_CHING,Color_PURPLE);break;//正向青底紫点跑动
|
||
case 180:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_CHING,Color_PURPLE);break;//反向青底紫点跑动
|
||
case 181:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_PURPLE,Color_WHITE);break;//正向紫底白点跑动
|
||
case 182:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_PURPLE,Color_WHITE);break;//反向紫底白点跑动
|
||
case 183:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_RED,Color_WHITE);break; //正向红底白点跑动
|
||
case 184:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_RED,Color_WHITE);break; //反向红底白点跑动
|
||
case 185:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_BLUE,Color_GREEN);break; //正向蓝底绿点跑动
|
||
case 186:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_BLUE,Color_GREEN);break; //反向蓝底绿点跑动
|
||
case 187:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_RED,Color_GREEN);break; //正向红底绿点跑动
|
||
case 188:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_RED,Color_GREEN);break; //反向红底绿点跑动
|
||
case 189:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_BLUE,Color_RED);break; //正向蓝底红点跑动
|
||
case 190:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_BLUE,Color_RED);break; //反向蓝底红点跑动
|
||
case 191:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_PURPLE,Color_YELLOW);break;//正向紫底黄点跑动
|
||
case 192:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_PURPLE,Color_YELLOW);break;//反向紫底黄点跑动
|
||
case 193:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_YELLOW,Color_WHITE);break; //正向黄底白点跑动
|
||
case 194:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_YELLOW,Color_WHITE);break; //反向黄底白点跑动
|
||
case 195:ws2815_undersinglerunning(LED_TaskDef.xianxu,1,Color_WHITE,Color_YELLOW);break; //正向白底黄点跑动
|
||
case 196:ws2815_undersinglerunning(LED_TaskDef.xianxu,0,Color_WHITE,Color_YELLOW);break; //反向白底黄点跑动
|
||
|
||
case 197:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_RED);break; //正向红底七色跑动
|
||
case 198:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_RED);break; //反向红底七色跑动
|
||
case 199:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_GREEN);break; //正向绿底七色跑动
|
||
case 200:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_GREEN);break; //反向绿底七色跑动
|
||
case 201:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_BLUE);break; //正向蓝底七色跑动
|
||
case 202:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_BLUE);break; //反向蓝底七色跑动
|
||
case 203:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_YELLOW);break; //正向黄底七色跑动
|
||
case 204:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_YELLOW);break; //反向黄底七色跑动
|
||
case 205:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_CHING);break; //正向青底七色跑动
|
||
case 206:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_CHING);break; //反向青底七色跑动
|
||
case 207:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_PURPLE);break; //正向紫底七色跑动
|
||
case 208:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_PURPLE);break; //反向紫底七色跑动
|
||
case 209:ws2815_undermultrunning(LED_TaskDef.xianxu,1,Color_WHITE);break; //正向白底七色跑动
|
||
case 210:ws2815_undermultrunning(LED_TaskDef.xianxu,0,Color_WHITE);break; //反向白底七色跑动
|
||
|
||
case 211:ws2815_ledc_show(LED_TaskDef.xianxu,Color_WHITE);break; //全灯亮白色
|
||
case 212:ws2815_ledc_show(LED_TaskDef.xianxu,Color_YELLOW);break; //全灯亮黄色
|
||
case 213:ws2815_ledc_show(LED_TaskDef.xianxu,Color_CHING);break; //全灯亮青色
|
||
case 214:ws2815_ledc_show(LED_TaskDef.xianxu,Color_PINK);break; //全灯亮粉色
|
||
case 215:ws2815_ledc_show(LED_TaskDef.xianxu,Color_RED);break; //全灯亮红色
|
||
case 216:ws2815_ledc_show(LED_TaskDef.xianxu,Color_GREEN);break; //全灯亮绿色
|
||
case 217:ws2815_ledc_show(LED_TaskDef.xianxu,Color_BLUE);break; //全灯亮紫色
|
||
/*
|
||
case 218:ws2815_ledc_show(LED_TaskDef.xianxu,K2700);break; //暖白光
|
||
case 219:ws2815_ledc_show(LED_TaskDef.xianxu,K3000);break; //暖白光
|
||
case 220:ws2815_ledc_show(LED_TaskDef.xianxu,K3300);break; //暖白光
|
||
case 221:ws2815_ledc_show(LED_TaskDef.xianxu,K3600);break; //暖白光
|
||
case 222:ws2815_ledc_show(LED_TaskDef.xianxu,K3900);break; //暖白光
|
||
case 223:ws2815_ledc_show(LED_TaskDef.xianxu,K4200);break; //暖白光
|
||
case 224:ws2815_ledc_show(LED_TaskDef.xianxu,K4500);break; //暖白光
|
||
case 225:ws2815_ledc_show(LED_TaskDef.xianxu,K5000);break; //暖白光
|
||
case 226:ws2815_ledc_show(LED_TaskDef.xianxu,K5500);break; //暖白光
|
||
case 227:ws2815_ledc_show(LED_TaskDef.xianxu,K6000);break; //暖白光
|
||
case 228:ws2815_ledc_show(LED_TaskDef.xianxu,K6500);break; //暖白光
|
||
*/
|
||
default: break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
void scheduled_shutdown_task(void)
|
||
{
|
||
if(shutdown_Flag){
|
||
LED_TaskDef.LED_SWITCH = 0;//关机
|
||
shutdown_Flag = 0;
|
||
//mic_start = 0;
|
||
}
|
||
|
||
}
|
||
|
||
void automatic_task_cycle(void)
|
||
{
|
||
//DEBUG("auto_falg:%d\n",auto_Flag);
|
||
if(auto_Flag){
|
||
//DEBUG("Come in Auto\n");
|
||
if(LED_TaskDef.CURRENT_TASK <= 217 && LED_TaskDef.CURRENT_TASK > 1){
|
||
// if(LED_TaskDef.CURRENT_TASK == 0){
|
||
// LED_TaskDef.CURRENT_TASK++;
|
||
// }else
|
||
if(LED_TaskDef.CURRENT_TASK >= 211){
|
||
LED_TaskDef.CURRENT_TASK = 2;
|
||
}else{
|
||
LED_TaskDef.CURRENT_TASK++;
|
||
}
|
||
}else{
|
||
LED_TaskDef.CURRENT_TASK = 2;
|
||
}
|
||
set_TaskComps_timer(7, 30000);
|
||
}
|
||
}
|
||
|
||
void Music_Mode_Change(void){
|
||
if(mic_start){
|
||
//DEBUG("mic_start is True\tlevel is :%d\n",level);
|
||
switch(Muisc_mode){
|
||
case 0:
|
||
app_ws2812_set__music_fireworks_light_forward(rainbow_colors[step],4);
|
||
break;
|
||
case 1:
|
||
app_ws2812_set__music_fireworks_light_reverse(rainbow_colors[step],4);
|
||
break;
|
||
case 2:
|
||
ws2815_bidirectional_meteor(rainbow_colors[step],4);
|
||
break;
|
||
case 3:
|
||
ws2815_center_to_edges(rainbow_colors[step],LED_TaskDef.RGB_XLED_NUM/2);
|
||
break;
|
||
case 4:
|
||
ws2815_integrated_effects(LED_TaskDef.RGB_XLED_NUM);
|
||
break;
|
||
case 5:
|
||
ws2815_center_to_edges_optimized(0,LED_TaskDef.RGB_XLED_NUM);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
//目前LED_MODE函数的索引为0
|
||
uint8_t Task_tamp = 0;
|
||
//接收到命令的处理过程有误,即:在关闭的状态下,不能修改其他属性。
|
||
void handle_remote_key(uint8_t key_value)
|
||
{
|
||
|
||
uint32_t Countdown = 0;// 0 ms
|
||
if(!LED_TaskDef.LED_SWITCH){
|
||
if(key_value == ON){//关机状态按开机才有识别
|
||
LED_TaskDef.LED_SWITCH = 1;//开机
|
||
}
|
||
}else{
|
||
|
||
Countdown = 0;
|
||
switch (key_value)
|
||
{
|
||
case OFF:
|
||
if (LED_TaskDef.LED_SWITCH == 1)//关机状态按开机才有识别
|
||
LED_TaskDef.LED_SWITCH = 0;//关机
|
||
break;
|
||
case SPEED_IN:
|
||
if (LED_TaskDef.LEDC_TICK_Speed > 50)
|
||
{
|
||
LED_TaskDef.LEDC_TICK_Speed -= 10;
|
||
set_TaskComps_itvTime(3, LED_TaskDef.LEDC_TICK_Speed);
|
||
}
|
||
break;
|
||
case SPEED_RE:
|
||
if (LED_TaskDef.LEDC_TICK_Speed < 160)
|
||
{
|
||
LED_TaskDef.LEDC_TICK_Speed += 10;
|
||
set_TaskComps_itvTime(3, LED_TaskDef.LEDC_TICK_Speed);
|
||
//DEBUG("%d\n",LED_TaskDef.LEDC_TICK_Speed);
|
||
}
|
||
break;
|
||
case BRIGHTNESS_IN:
|
||
if (LED_TaskDef.LED_Brightne < 100)
|
||
{
|
||
LED_TaskDef.LED_Brightne += 10;
|
||
if (LED_TaskDef.LED_Brightne > 100)
|
||
LED_TaskDef.LED_Brightne = 100;
|
||
}
|
||
break;
|
||
case BRIGHTNESS_RE:
|
||
if (LED_TaskDef.LED_Brightne > 10)
|
||
{
|
||
LED_TaskDef.LED_Brightne -= 10;
|
||
if(LED_TaskDef.LED_Brightne < 10){
|
||
LED_TaskDef.LED_Brightne = 10;
|
||
}
|
||
}
|
||
break;
|
||
case MODE_IN:
|
||
if(LED_TaskDef.CURRENT_TASK>217){
|
||
LED_TaskDef.CURRENT_TASK = Task_tamp;
|
||
}
|
||
if (LED_TaskDef.CURRENT_TASK < 217 && LED_TaskDef.CURRENT_TASK >= 0)
|
||
LED_TaskDef.CURRENT_TASK++;
|
||
// else
|
||
// LED_TaskDef.CURRENT_TASK = 0;
|
||
Temp_Flag = 0;auto_Flag = 0;Color_Flag = 0;mic_start = 0;
|
||
//set_TaskComps_timer(2, 30000);
|
||
break;
|
||
case MODE_RE:
|
||
if (LED_TaskDef.CURRENT_TASK > 0)
|
||
LED_TaskDef.CURRENT_TASK--;
|
||
Temp_Flag = 0;auto_Flag = 0;Color_Flag = 0;mic_start = 0;
|
||
//set_TaskComps_timer(2, 30000);
|
||
break;
|
||
|
||
case IR_AUTO:
|
||
//printf ("LED_auto\n");
|
||
if(auto_Flag){
|
||
auto_Flag = 0;
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
light_mode();
|
||
delay_ms(200);
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
//DEBUG("auto_close\n");
|
||
set_TaskComps_timer(7, 30000);
|
||
}else{
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
auto_Flag = 1;
|
||
Color_Flag = 0;
|
||
Temp_Flag = 0;
|
||
mic_start = 0;
|
||
LED_TaskDef.CURRENT_TASK = 1;
|
||
//DEBUG("auto_open\n");
|
||
set_TaskComps_timer(7, 11);
|
||
}
|
||
break;
|
||
case IR_INMUSIC:
|
||
//printf ("IR_INMUSIC\n");
|
||
Temp_Flag = 0;
|
||
mic_start = 1;Color_Flag = 0;
|
||
if(Muisc_mode < 5)
|
||
Muisc_mode++;
|
||
//DEBUG("mic_start:%d\n",mic_start);
|
||
break;
|
||
case IR_DEMUSIC:
|
||
//printf ("IR_DEMUSIC\n");
|
||
Temp_Flag = 0;
|
||
mic_start = 1;Color_Flag = 0;
|
||
if(Muisc_mode > 0)
|
||
Muisc_mode--;
|
||
break;
|
||
case IR_TIME1H:
|
||
//printf ("IR_TIME1H\n");
|
||
if(shutdown_Flag){
|
||
shutdown_Flag = 0;
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
light_mode();
|
||
delay_ms(200);
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
}else{
|
||
shutdown_Flag = 1;
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
Countdown = 3600000;//3600
|
||
set_TaskComps_timer(6, Countdown);
|
||
}
|
||
break;
|
||
case IR_TIME2H:
|
||
if(shutdown_Flag){
|
||
shutdown_Flag = 0;
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
light_mode();
|
||
delay_ms(200);
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
}else{
|
||
shutdown_Flag = 1;
|
||
WS2815_Clear();
|
||
WS2815_Update();
|
||
delay_ms(200);
|
||
Countdown = 3600000 * 2;
|
||
set_TaskComps_timer(6, Countdown);
|
||
}
|
||
//printf ("IR_TIME2H\n");
|
||
break;
|
||
case IR_INTEMP :
|
||
mic_start = 0;
|
||
auto_Flag = 0;Color_Flag = 0;
|
||
//printf ("IR_INTEMP\n");
|
||
if(!Temp_Flag){
|
||
LED_TaskDef.Temp_Step = 0;
|
||
Temp_Flag = 1;
|
||
}else{
|
||
if(LED_TaskDef.Temp_Step < 28){
|
||
LED_TaskDef.Temp_Step++;
|
||
}
|
||
}
|
||
break;
|
||
case IR_DETEMP :
|
||
mic_start = 0;
|
||
auto_Flag = 0;Color_Flag = 0;
|
||
//printf ("IR_DETEMP\n");
|
||
if(!Temp_Flag){
|
||
LED_TaskDef.Temp_Step = 28;
|
||
Temp_Flag = 1;
|
||
}else{
|
||
if(LED_TaskDef.Temp_Step > 0){
|
||
LED_TaskDef.Temp_Step-- ;
|
||
}
|
||
}
|
||
break;
|
||
|
||
case IR_WHITE:
|
||
//printf ("IR_WHITE\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 211;
|
||
break;
|
||
case IR_YELLOW:
|
||
//printf ("IR_YELLOW\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 212;
|
||
break;
|
||
case IR_CHING:
|
||
//printf ("IR_CHING\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 213;
|
||
break;
|
||
case IR_PINK:
|
||
//printf ("IR_PINK\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 214;
|
||
break;
|
||
case IR_RED:
|
||
//printf ("IR_RED\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 215;
|
||
break;
|
||
case IR_GREEN:
|
||
//printf ("IR_GREEN\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 216;
|
||
break;
|
||
case IR_BLUE:
|
||
//printf ("IR_BLUE\n");
|
||
Temp_Flag = 0;mic_start = 0;auto_Flag = 0;Color_Flag = 0;
|
||
LED_TaskDef.CURRENT_TASK = 217;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
set_TaskComps_timer(5,500);//延时保存数据 5000
|
||
}
|