| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- #include "user_led.h"
- #include "user_ws2812b.h"
- #include "define.h"
- #include "stdarg.h"
- static uint32_t alarm_stat = 0;
- static uint32_t uUser_led_delaycount = 0;
- static void prvSet_led_duty(uint8_t idx);
- static led_work_s led_work[DEV_MAX_COUNT] = {
- {
- .color = {
- .red = 0,
- .green = 0xFF,
- .blue = 0,
- },
- .workStat = LED_WORK_OFF,
- .viewStat = LED_VIEW_NULL,
- .single_flicker_period = 0,
- .flicker_period = 0,
- .flicker_onperiod = 0,
- .flicker_count = 0,
- .duty_value = 0,
- .single_on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
- .on_durationTime = 0, //PWM变化结束后持续时间,单位:ms
- .single_off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
- .off_durationTime = 0, //PWM变化结束后持续时间,单位:ms
- },
- };
- /*******************************************************************************
- * @函数名称 prvSet_led_duty
- * @函数说明 设置指示灯亮度
- * @输入参数 type:灯下标
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void prvSet_led_duty(uint8_t idx)
- {
- vUser_ws2812b_set_stat(idx, led_work[idx].color.red, led_work[idx].color.green,
- led_work[idx].color.blue, led_work[idx].duty_value);
- }
- /*******************************************************************************
- * @函数名称 led_invert
- * @函数说明 LED闪烁处理
- * @输入参数 led_work:led灯结构体直针
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void led_invert(uint8_t idx, led_work_s *led_work)
- {
- if(led_work->flicker_count > 0)
- {
- if(led_work->single_flicker_period == 0)
- {
- led_work->single_flicker_period = led_work->flicker_period;
- led_work->stat = LED_STAT_ON;
- led_work->duty_value = 100;
- prvSet_led_duty(idx);
- }
- else if(led_work->single_flicker_period == (led_work->flicker_period - led_work->flicker_onperiod))
- {
- led_work->single_flicker_period--;
- led_work->stat = LED_STAT_OFF;
- led_work->duty_value = 0;
- prvSet_led_duty(idx);
- led_work->flicker_count--;
- }
- else{
- led_work->single_flicker_period--;
- }
- }
- else{
- led_work->workStat = LED_WORK_OFF;
- led_work->duty_value = 0;
- prvSet_led_duty(idx);
- }
- }
- /*******************************************************************************
- * @函数名称 led_heart
- * @函数说明 LED呼吸灯处理
- * @输入参数 led_work:led灯结构体直针
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void led_heart(uint8_t idx, led_work_s *led_work)
- {
- if(led_work->flicker_count > 0)
- {
- uint32_t off_period = led_work->flicker_period - led_work->flicker_onperiod;
- if(led_work->single_flicker_period == 0)
- {
- led_work->single_flicker_period = led_work->flicker_period;
- led_work->duty_value = 0;
- led_work->single_off_durationTime = led_work->off_durationTime;
- prvSet_led_duty(idx);
- led_work->flicker_count--;
- }
- else if(led_work->single_flicker_period == off_period)
- {
- led_work->single_flicker_period--;
- led_work->duty_value = 100;
- led_work->single_on_durationTime = led_work->on_durationTime;
- prvSet_led_duty(idx);
- }
- else{
- if(led_work->single_flicker_period > off_period)
- {
- if(led_work->single_off_durationTime == 0)
- {
- led_work->single_flicker_period--;
- led_work->duty_value = (led_work->flicker_period - led_work->single_flicker_period) * 100 / led_work->flicker_onperiod;
- prvSet_led_duty(idx);
- }
- else{
- led_work->single_off_durationTime--;
- }
- }
- else{
- if(led_work->single_on_durationTime == 0)
- {
- led_work->single_flicker_period--;
- led_work->duty_value = led_work->single_flicker_period * 100 / off_period;
- prvSet_led_duty(idx);
- }
- else{
- led_work->single_on_durationTime--;
- }
- }
- }
- }
- else{
- led_work->workStat = LED_WORK_OFF;
- }
- }
- /*******************************************************************************
- * @函数名称 led_indication
- * @函数说明 LED灯处理
- * @输入参数 led_work:led灯结构体直针
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void led_indication(uint8_t idx, led_work_s *led_work)
- {
- switch(led_work->workStat)
- {
- case LED_WORK_OFF:
- {
- break;
- }
- case LED_WORK_ON:
- {
- break;
- }
- case LED_WORK_INVERT:
- {
- led_invert(idx, led_work);
- break;
- }
- case LED_WORK_BREATHE:
- {
- led_heart(idx, led_work);
- break;
- }
- default:break;
- }
- }
- /*******************************************************************************
- * @函数名称 led_task
- * @函数说明 LED任务
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- static void led_task(void)
- {
- if(uUser_led_delaycount == 0)
- {
- uUser_led_delaycount = LED_INTERVAL;
- for(int i = 0; i < DEV_MAX_COUNT; i++)
- {
- led_indication(i, &led_work[i]);
- }
- }
- }
- /*******************************************************************************
- * @函数名称 vLed_task_pro
- * @函数说明 LED任务
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vLed_task_pro(void)
- {
- led_task();
- vWs2812b_task();
- }
- /*******************************************************************************
- * @函数名称 led_task_tick
- * @函数说明 任务计时器
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void led_task_tick(void)
- {
- if(uUser_led_delaycount > 0)
- {
- uUser_led_delaycount--;
- }
- }
- /*******************************************************************************
- * @函数名称 set_led_indication
- * @函数说明 LED参数设置
- * @输入参数 type:LED灯号
- color:颜色
- workStat:状态
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- bool set_led_indication(uint8_t idx, uint32_t color, LED_WORK_STAT work_stat, ...)
- {
- bool stat = false;
- if(idx >= DEV_MAX_COUNT)
- {
- goto exit;
- }
- led_work[idx].color.red = (color >> 16) & 0xFF;
- led_work[idx].color.green = (color >> 8) & 0xFF;
- led_work[idx].color.blue = color & 0xFF;
- if(work_stat == LED_WORK_OFF || work_stat == LED_WORK_ON)
- {
- led_work[idx].workStat = work_stat;
- led_work[idx].duty_value = (work_stat == LED_WORK_ON) ? 100 : 0;
- prvSet_led_duty(idx);
- stat = true;
- }
- else if(work_stat == LED_WORK_INVERT || work_stat == LED_WORK_BREATHE)
- {
- led_work[idx].workStat = work_stat;
- led_work[idx].duty_value = 0;
- led_work[idx].stat = LED_STAT_OFF;
- va_list ap; //保存所有参数
- va_start(ap, work_stat); //第一个参数的位置
- led_work[idx].flicker_period = va_arg(ap, uint32_t)/LED_INTERVAL;
- led_work[idx].flicker_onperiod = va_arg(ap, uint32_t)/LED_INTERVAL;
- led_work[idx].flicker_count = va_arg(ap, uint32_t);
- if(led_work[idx].flicker_count == 0)
- {
- led_work[idx].flicker_count = 0x7FFFFFFF;
- }
- led_work[idx].single_flicker_period = led_work[idx].flicker_period;
- if(work_stat == LED_WORK_BREATHE)
- {
- led_work[idx].on_durationTime = va_arg(ap, uint32_t) / LED_INTERVAL;
- led_work[idx].off_durationTime = va_arg(ap, uint32_t) / LED_INTERVAL;
- led_work[idx].single_on_durationTime = led_work[idx].on_durationTime;
- led_work[idx].single_off_durationTime = led_work[idx].off_durationTime;
- }
- va_end(ap);
- for(int i = 0; i < DEV_MAX_COUNT; i++)
- {
- if(led_work[i].workStat == LED_WORK_INVERT
- || led_work[i].workStat == LED_WORK_BREATHE)
- {
- led_work[i].single_flicker_period = led_work[i].flicker_period;
- led_work[i].duty_value = 0;
- if(led_work[i].workStat == LED_WORK_BREATHE)
- {
- led_work[i].single_on_durationTime = led_work[i].on_durationTime;
- led_work[i].single_off_durationTime = led_work[i].off_durationTime;
- }
- }
- }
- stat = true;
- }
- exit:
- return stat;
- }
- /*******************************************************************************
- * @函数名称 vUser_led_set_view_stat
- * @函数说明 设置LED显示状态
- * @输入参数 stat:led显示状态
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void vUser_led_set_view_stat(uint8_t idx, led_view_stat_e stat)
- {
- led_work[idx].viewStat = stat;
- if(alarm_stat == 0)
- {
- switch(stat)
- {
- case LED_VIEW_ERROR_ITEMS:set_led_indication(idx, LED_VIEW_ERROR_ITEMS_COLOR, LED_WORK_INVERT, 200, 100, 0);break; //物资错误
- case LED_VIEW_NO_BOARD:set_led_indication(idx, LED_VIEW_NO_BOARD_COLOR, LED_WORK_BREATHE, 500, 250, 0);break; //无光敏传感器
- case LED_VIEW_ITEMS:set_led_indication(idx, LED_VIEW_ITEMS_COLOR, LED_WORK_ON);break; //有物品
- case LED_VIEW_PUT_ITEMS:set_led_indication(idx, LED_VIEW_PUT_ITEMS_COLOR, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break; //存物资
- case LED_VIEW_TAKE_ITEMS:set_led_indication(idx, LED_VIEW_TAKE_ITEMS_COLOR, LED_WORK_BREATHE, 500, 250, 0, 100, 100);break; //取物资
- case LED_VIEW_NO_ITEMS:set_led_indication(idx, LED_VIEW_NO_ITEMS_COLOR, LED_WORK_ON);break; //无物品
- default:break;
- }
- }
- }
- /*******************************************************************************
- * @函数名称 led_init
- * @函数说明 初始化
- * @输入参数 无
- * @输出参数 无
- * @返回参数 无
- *******************************************************************************/
- void led_init(void)
- {
- vUser_ws2812b_init(DEV_MAX_COUNT);
- }
|