| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- #include "user_ws2812b.h"
- #include "ws2812b_spi.h"
- static uint32_t uUser_ws2812b_delaycount = 0;
- static user_ws2812b_work_s user_ws2812b_work = {
- .txStat = false,
- .count = 0, //灯的数量
- .rgbValue = NULL,
- };
- /*******************************************************************************
- * @函数名称 vUser_ws2812b_set_wrByte
- * @函数说明 转换ws2812b颜色数据
- * @输入参数 byte:字节
- color:spi发送数据属猪
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void vUser_ws2812b_set_wrByte(uint8_t byte, uint8_t *color)
- {
- for(uint8_t i = 0; i < 8; i++)
- {
- if((byte & 0x80) == 0x80)
- {
- *color++ = WS2812B_HIGH;
- }
- else
- {
- *color++ = WS2812B_LOW;
- }
- byte <<= 1;
- }
- }
- /*******************************************************************************
- * @函数名称 prvUser_ws2812b_set_breath
- * @函数说明 设置ws2812b 呼吸灯效果
- * @输入参数 idx:左边或者右边
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void prvUser_ws2812b_set_breath(uint8_t idx)
- {
- // 应用二次衰减算法(非线性),亮度更柔和自然
- uint8_t bri = (user_ws2812b_work.led_param[idx].bright * user_ws2812b_work.led_param[idx].bright) >> 8;
- // 应用亮度到颜色
- uint8_t out_r = ((uint16_t)user_ws2812b_work.led_param[idx].rValue * (uint16_t)bri) >> 8;
- uint8_t out_g = ((uint16_t)user_ws2812b_work.led_param[idx].gValue * (uint16_t)bri) >> 8;
- uint8_t out_b = ((uint16_t)user_ws2812b_work.led_param[idx].bValue * (uint16_t)bri) >> 8;
- vUser_ws2812b_set_wrByte(out_g, &user_ws2812b_work.rgbValue[idx * 24]);
- vUser_ws2812b_set_wrByte(out_r, &user_ws2812b_work.rgbValue[idx * 24 + 8]);
- vUser_ws2812b_set_wrByte(out_b, &user_ws2812b_work.rgbValue[idx * 24 + 16]);
- }
- /*******************************************************************************
- * @函数名称 prvUser_ws2812b_txData
- * @函数说明 发送ws2812b数据
- * @输入参数 idx:左边或者右边
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void prvUser_ws2812b_txData(void)
- {
- bWs2812b_spi_WriteByte(user_ws2812b_work.rgbValue, user_ws2812b_work.count * 3 * 8);
- }
- /*******************************************************************************
- * @函数名称 vUser_ws2812b_left_time_task
- * @函数说明 ws2812b时间循环任务
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void vUser_ws2812b_check(void)
- {
- if(user_ws2812b_work.txStat == false)
- {
- bool stat = false;
- for(uint8_t i = 0; i < user_ws2812b_work.count; i++)
- {
- if(user_ws2812b_work.led_param[i].change == true)
- {
- user_ws2812b_work.led_param[i].change = false;
- stat = true;
- prvUser_ws2812b_set_breath(i);
- }
- }
- if(stat == true)
- {
- // PRINT("\n***********\n");
- // for(int i = 0; i < user_ws2812b_work.count; i++)
- // {
- // PRINT("#%02X%02X%02X\n", user_ws2812b_work.led_param[i].rValue, user_ws2812b_work.led_param[i].gValue, user_ws2812b_work.led_param[i].bValue);
- // }
- // PRINT("***********\n");
- prvUser_ws2812b_txData();
- }
- }
- }
- /*******************************************************************************
- * @函数名称 vUser_ws2812b_time_task
- * @函数说明 ws2812b时间循环任务
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void vUser_ws2812b_time_task(void)
- {
- vUser_ws2812b_check();
- }
- /*******************************************************************************
- * @函数名称 vUser_ws2812b_init
- * @函数说明 初始化
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vUser_ws2812b_init(uint8_t count)
- {
- user_ws2812b_work.count = count;
- user_ws2812b_work.led_param = (ws2812b_led_param_s *)malloc(count * sizeof(ws2812b_led_param_s));
- user_ws2812b_work.rgbValue = (uint8_t *)malloc(count * 3 * 8);
- memset(user_ws2812b_work.rgbValue, WS2812B_LOW, count * 3 * 8);
- for(int i = 0; i < count; i++)
- {
- user_ws2812b_work.led_param[i].change = false; //是否有变化
- user_ws2812b_work.led_param[i].bright = 0; //灯亮度
- user_ws2812b_work.led_param[i].rValue = 0;
- user_ws2812b_work.led_param[i].gValue = 0;
- user_ws2812b_work.led_param[i].bValue = 0;
- }
- ws2812b_spi_Init();
- Ws2812b_spi_dma_init(user_ws2812b_work.rgbValue, user_ws2812b_work.count * 3 * 8);
- }
- /*******************************************************************************
- * @函数名称 vUser_ws2812b_set_tx_stat
- * @函数说明 设置数据发射状态
- * @输入参数 stat:状态
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vUser_ws2812b_set_tx_stat(bool stat)
- {
- user_ws2812b_work.txStat = stat;
- }
- /*******************************************************************************
- * @函数名称 vUser_ws2812b_set_stat
- * @函数说明 设置RGB灯状态
- * @输入参数 idx:灯下标
- r:红色值
- g:绿色值
- b:蓝色值
- bright:亮度
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vUser_ws2812b_set_stat(uint8_t idx, uint8_t r, uint8_t g, uint8_t b, uint8_t bright)
- {
- // PRINT("idx=%d,r=%02X,g=%02X,b=%02X,bright=%d\n",idx, r,g,b,bright);
-
- user_ws2812b_work.led_param[idx].rValue = r;
- user_ws2812b_work.led_param[idx].gValue = g;
- user_ws2812b_work.led_param[idx].bValue = b;
- user_ws2812b_work.led_param[idx].bright = bright;
- user_ws2812b_work.led_param[idx].change = true;
- }
- /*******************************************************************************
- * @函数名称 vWs2812b_task
- * @函数说明 ws2812b任务
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vWs2812b_task(void)
- {
- if(uUser_ws2812b_delaycount == 0)
- {
- uUser_ws2812b_delaycount = USER_WS2812B_INTERVAL;
- vUser_ws2812b_time_task();
- }
- }
- /*******************************************************************************
- * @函数名称 vWs2812b_task_tick
- * @函数说明 任务计时器
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vWs2812b_task_tick(void)
- {
- if(uUser_ws2812b_delaycount > 0)
- {
- uUser_ws2812b_delaycount--;
- }
- }
|