DIGILIGHT
pixel.c
См. документацию.
1 
15 #include <avr/io.h>
16 #include "avr_helper.h"
17 #include <stdlib.h>
18 #include "global.h"
19 #include "pixel.h"
20 
22 pixel_t pixels[MAX_TOTAL_PIX];
23 
25 static const
26 __flash rgb_t fix_colors[FIXED_COLORS] = {
27  {RED}, {YELLOW}, {GREEN}, {LBLUE}, {ORANGE}, {BLUE}, {PURPLE}, {COLOR1}
28 };
29 
30 static void fade_out(pixel_t *px){
31  if(px->delta < 0){
32  if((px->bright - px->delta) > 255){
33  px->bright = 255;
34  px->delta = -px->delta;
35  }else
36  px->bright -= px->delta;
37  } else {
38  if(px->bright >= px->delta)
39  px->bright -= px->delta;
40  else
41  px->bright = 0;
42  }
43 }
44 
49 void fade(void){
50  static uint8_t div = FADE_DIV;
51  if(--div) return;
52  div = FADE_DIV;
53  pixel_t *pixel = pixels;
54  for(uint8_t i=0; i<PIXEL_CNT; i++){
55  fade_out(pixel++);
56  }
57 }
58 
66 static uint8_t is_light_pix(uint8_t id){
67  return !!((uint16_t)(
68  (pixels[id].r * (pixels[id].bright+1)) |
69  (pixels[id].g * (pixels[id].bright+1)) |
70  (pixels[id].b * (pixels[id].bright+1)))>>8
71  );
72 }
73 
78 uint8_t get_light_cnt(void){
79  uint8_t sum = 0;
80  for(uint8_t i=0; i<PIXEL_CNT; i++)
81  sum += is_light_pix(i);
82  return sum;
83 }
84 
95 void bright_ctrl(uint8_t id, uint8_t bright, int8_t delta){
96  pixels[id].bright = bright;
97  pixels[id].delta = delta;
98 }
99 
107 void set_rgb_color(uint8_t pos, uint8_t r, uint8_t g, uint8_t b){
108  pixels[pos].r = r;
109  pixels[pos].g = g;
110  pixels[pos].b = b;
111 }
112 
113 void set_hsv_color(uint8_t pos, hsv_t hsv){
114  rgb_t rgb;
115  hsv_to_rgb(&hsv, &rgb);
116  set_rgb_color(pos, rgb.r, rgb.g, rgb.b);
117 }
118 
124 void set_fix_color(uint8_t pos, uint8_t fix_cid){
125  pixels[pos].r = fix_colors[fix_cid].r;
126  pixels[pos].g = fix_colors[fix_cid].g;
127  pixels[pos].b = fix_colors[fix_cid].b;
128 }
129 
141 void rnd_pix(uint8_t fix_cid, int8_t delta){
142  uint8_t id;
143 
144  //do id = (rand() >> 4) & PIXEL_CNT_MASK; while((id >= PIXEL_CNT) || is_light_pix(id));
145 
146  do id = rand() % PIXEL_CNT; while (is_light_pix(id));
147 
148  bright_ctrl(id, delta >= 0 ? 255 : 0, delta);
149  set_fix_color(id, fix_cid);
150 }
151 
152 void rnd_pix_rgb(uint8_t _r, uint8_t _g, uint8_t _b, int8_t delta){
153  uint8_t id;
154 
155  //do id = (rand() >> 4) & PIXEL_CNT_MASK; while((id >= PIXEL_CNT) || is_light_pix(id));
156  do id = rand() % PIXEL_CNT; while (is_light_pix(id));
157 
158  bright_ctrl(id, delta >= 0 ? 255 : 0, delta);
159  set_rgb_color(id, _r, _g, _b);
160 }
161 
162 void off_all_pixels(void){
163  for(uint8_t i=0; i < PIXEL_CNT; i++)
164  bright_ctrl(i, 0, 0);
165 }
void bright_ctrl(uint8_t id, uint8_t bright, int8_t delta)
Управление яркостью
Definition: pixel.c:95
#define GREEN
Чисто зеленый цвет
Definition: pixel.h:53
#define PURPLE
фиолетовый цвет
Definition: pixel.h:59
uint8_t b
синяя составляющая цвета
Definition: pixel.h:36
void off_all_pixels(void)
Выключение всех пикселов
Definition: pixel.c:162
int8_t delta
условная скорость автоматического изменения яркости
Definition: pixel.h:38
Общие описания
void set_rgb_color(uint8_t pos, uint8_t r, uint8_t g, uint8_t b)
Пиксел произвольного цвета
Definition: pixel.c:107
#define YELLOW
Ярко-желтый цвет
Definition: pixel.h:49
void fade(void)
Автоматическое изменение яркости всех пикселов
Definition: pixel.c:49
Структура, описывающая один пиксель
Definition: pixel.h:33
сервисный модуль для реализации эффектов Набор вспомогательных функций для базовых манипуляций над це...
#define ORANGE
Оранжевый цвет
Definition: pixel.h:51
#define PIXEL_CNT
Общее количество пикселов
Definition: pixel.h:27
Тип для представления цвета в HSV-модели
Тип для представления цвета в RGB-модели
#define FIXED_COLORS
Количество предопределенных цветов
Definition: pixel.h:42
#define RED
Чисто красный цвет
Definition: pixel.h:47
uint8_t g
зеленая составляющая цвета
Definition: pixel.h:35
void hsv_to_rgb(hsv_t *src, rgb_t *dst)
uint8_t r
красная составляющая цвета
Definition: pixel.h:34
pixel_t pixels[MAX_TOTAL_PIX]
Массив пикселей предельного размера
Definition: pixel.c:22
#define COLOR1
Оттенок сиреневого
Definition: pixel.h:61
#define FADE_DIV
Условная скорость автоматического изменения яркости (чем больше, тем медленнее)
Definition: pixel.h:68
void rnd_pix(uint8_t fix_cid, int8_t delta)
Случайный пиксел
Definition: pixel.c:141
void set_fix_color(uint8_t pos, uint8_t fix_cid)
Пиксел одного из фиксированных цветов
Definition: pixel.c:124
#define BLUE
Чисто синий цвет
Definition: pixel.h:57
#define LBLUE
Светлоголубой цвет
Definition: pixel.h:55
uint8_t bright
яркость пиксела
Definition: pixel.h:37
uint8_t get_light_cnt(void)
Подсчет светящихся пикселов
Definition: pixel.c:78