diff --git a/app/drivers/led_strip/led_strip.c b/app/drivers/led_strip/led_strip.c index d208a54..8f8a9f4 100644 --- a/app/drivers/led_strip/led_strip.c +++ b/app/drivers/led_strip/led_strip.c @@ -10,14 +10,15 @@ static uint8_t led_strip_pixels[EXAMPLE_LED_NUMBERS * 3]; uint16_t toggle_cycle = 1000; static uint8_t rgb_color_index = RGB_COLOR_RAD; -rgb_color_t rgb_color_rad = {0,255,0,0,0}; -rgb_color_t rgb_color_orange = {0,255,80,0,0}; -rgb_color_t rgb_color_green = {0,0,255,0,0}; -rgb_color_t rgb_color_blue = {0,0,0,255,0}; -rgb_color_t rgb_color_cyan = {0,0,255,255,0}; -rgb_color_t rgb_color_purple = {0,255,0,255,0}; -rgb_color_t rgb_color_white = {0,255,255,255,0}; - +rgb_color_t rgb_color_rad = {0,255,0,0,0,1,0}; +rgb_color_t rgb_color_orange = {0,255,80,0,0,1,0}; +rgb_color_t rgb_color_green = {0,0,255,0,0,1,0}; +rgb_color_t rgb_color_blue = {0,0,0,255,0,1,0}; +rgb_color_t rgb_color_cyan = {0,0,255,255,0,1,0}; +rgb_color_t rgb_color_purple = {0,255,0,255,0,1,0}; +rgb_color_t rgb_color_white = {0,255,255,255,0,1,0}; +rgb_color_t rgb_color_green_white = {0,0,255,0,0,2,5}; +rgb_color_t rgb_color_green_purple = {0,0,255,0,0,2,5}; void led_strip_init(void) { @@ -68,41 +69,127 @@ void work_rgb_led_start(void) void _work_rgb_led(void *arg) { static rgb_color_t* expression; - switch (rgb_color_index) + static uint8_t rgb_color_index_lat = 255; + if(rgb_color_index_lat != rgb_color_index) { - case RGB_COLOR_RAD: - expression = &rgb_color_rad; - break; - case RGB_COLOR_ORANGE: - expression = &rgb_color_orange; - break; - case RGB_COLOR_GREEN: - expression = &rgb_color_green; - break; - case RGB_COLOR_WHITE: - expression = &rgb_color_white; - break; - case RGB_COLOR_PURPLE: - expression = &rgb_color_purple; - break; - case RGB_COLOR_CYAN: - expression = &rgb_color_cyan; - break; - case RGB_COLOR_BLUE: - expression = &rgb_color_blue; - break; - default: - break; + rgb_color_index_lat = rgb_color_index; + switch (rgb_color_index) + { + case RGB_COLOR_RAD: + expression = &rgb_color_rad; + break; + case RGB_COLOR_ORANGE: + expression = &rgb_color_orange; + break; + case RGB_COLOR_GREEN: + expression = &rgb_color_green; + break; + case RGB_COLOR_WHITE: + expression = &rgb_color_white; + break; + case RGB_COLOR_PURPLE: + expression = &rgb_color_purple; + break; + case RGB_COLOR_CYAN: + expression = &rgb_color_cyan; + break; + case RGB_COLOR_BLUE: + expression = &rgb_color_blue; + break; + case RGB_COLOR_GREEN_WHITE: + expression = &rgb_color_green_white; + break; + case RGB_COLOR_GREEN_PURPLE: + expression = &rgb_color_green_purple; + break; + default: + break; + } } + rgb_toggle(expression); os_work_later(toggle_cycle * 0.5); } + void rgb_update_cyle(uint16_t cyle) { toggle_cycle = cyle; } +uint8_t breathing_dispose(rgb_color_t* rgb_color,int16_t* vel, uint8_t color_min, uint8_t color_max) +{ + static int dir = 1, color_dir = 1, color_cnt = 0; + *vel += dir * rgb_color->colortoggle_speed; + if(*vel > color_max){*vel = color_max; dir = -1;} + else if(*vel < color_min){*vel = color_min; dir = 1; color_cnt += color_dir;} + + if(color_cnt >= rgb_color->color_cnt -1 ) + color_dir = -1; + else if(color_cnt <= 0) + color_dir = 1; + + return color_cnt; +} +void breathing_color_change(rgb_color_t* rgb_color) +{ + static int16_t COLOR_SUM; + uint8_t color_cnt = breathing_dispose(rgb_color, &COLOR_SUM, 0, 255); + switch (rgb_color_index) + { + case RGB_COLOR_GREEN_WHITE: + { + switch(color_cnt) + { + case 0: + { + rgb_color->red = 0; + rgb_color->green = (uint8_t)COLOR_SUM; + rgb_color->blue = 0; + break; + } + case 1: + { + rgb_color->red = (uint8_t)COLOR_SUM; + rgb_color->green = (uint8_t)COLOR_SUM; + rgb_color->blue = (uint8_t)COLOR_SUM; + break; + } + } + break; + } + case RGB_COLOR_GREEN_PURPLE: + { + switch(color_cnt) + { + case 0: + { + rgb_color->red = 0; + rgb_color->green = (uint8_t)COLOR_SUM; + rgb_color->blue = 0; + break; + } + case 1: + { + rgb_color->red = (uint8_t)COLOR_SUM; + rgb_color->green = 0; + rgb_color->blue = (uint8_t)COLOR_SUM; + break; + } + } + break; + } + + default: + break; + } +} void rgb_toggle(rgb_color_t* rgb_color) { + if(rgb_color->color_cnt > 1) + { + breathing_color_change(rgb_color); + led_strip_set_pixel(0,rgb_color->index,rgb_color->green,rgb_color->blue,rgb_color->red); + return; + } if(rgb_color->toggle_flag == 0) led_strip_set_pixel(0,rgb_color->index,rgb_color->green,rgb_color->blue,rgb_color->red); else diff --git a/app/drivers/led_strip/led_strip.h b/app/drivers/led_strip/led_strip.h index 7030560..ba2fcb1 100644 --- a/app/drivers/led_strip/led_strip.h +++ b/app/drivers/led_strip/led_strip.h @@ -30,6 +30,9 @@ typedef struct rgb_color_s uint8_t green; uint8_t blue; uint8_t toggle_flag; + uint8_t color_cnt; + uint8_t colortoggle_speed; + }rgb_color_t; typedef enum @@ -41,6 +44,8 @@ typedef enum RGB_COLOR_PURPLE, RGB_COLOR_CYAN, RGB_COLOR_BLUE, + RGB_COLOR_GREEN_WHITE, + RGB_COLOR_GREEN_PURPLE, }RGB_COLOR; void led_strip_init(void);