DIGILIGHT
dbl_rainbow.c
См. документацию.
1 
12 #include <avr/io.h>
13 #include "../avr_helper.h"
14 #include <stdlib.h>
15 #include <avr/eeprom.h>
16 #include "../global.h"
17 #include "../pixel.h"
18 #include "../color_transform.h"
19 #include "../main_effect.h"
23 static int16_t h1, h2;
24 
25 static void ini(void){
26  int8_t dl = 255 / (PIXEL_CNT / 2);
27  int16_t h = 255;
28  for(uint8_t i=0; i < PIXEL_CNT; i++){
29  set_rgb_color(i, 0,0,0);
30  bright_ctrl(i, h, 0);
31  h -= dl;
32  if(h < 0){
33  dl = -dl;
34  h -= dl;
35  }
36  }
37  h1 = rand() % HSV_GRADE;
38  h2 = rand() % HSV_GRADE;
39 }
40 
41 typedef struct{
42  int8_t speed1;
43  int8_t speed2;
44 } preset_t;
45 
46 #define PRESET_CNT 4
47 static int8_t id;
48 static __flash const preset_t preset[PRESET_CNT] = {
49  {.speed1 = 20, .speed2 = 20},
50  {.speed1 = 5, .speed2 = 20},
51  {.speed1 = 20, .speed2 = 5},
52  {.speed1 = 5, .speed2 = 5}
53 };
54 
62 static void effect(signal_t *s){
63  static uint8_t d1=1, d2=1;
64  hsv_t hsv;
65  rgb_t rgb1, rgb2;
66  if(pixels[0].bright == 0) ini();
67 
68  hsv.s = 255;
69  hsv.v = 255;
70 
71  if(!--d1){
72  d1 = preset[id].speed1;
73  h1++;
74  if(h1 >= HSV_GRADE) h1 = 0;
75  }
76  if(!--d2){
77  d2 = preset[id].speed2;
78  h2--;
79  if(h2 < 0) h2 = HSV_GRADE-1;
80  }
81  hsv.h = h1;
82  hsv_to_rgb(&hsv, &rgb1);
83  hsv.h = h2;
84  hsv_to_rgb(&hsv, &rgb2);
85  // во время тишины рисуем фоновый рисунок
86  for(uint8_t i=0; i < PIXEL_CNT; i++){
87  if(i < (PIXEL_CNT/2))
88  set_rgb_color(i, rgb1.r, rgb1.g, rgb1.b);
89  else
90  set_rgb_color(i, rgb2.r, rgb2.g, rgb2.b);
91  }
92 }
93 
94 static __flash const char _name[] = "DOUBLE SPECTRE";
95 
96 static preset_result_t _preset(int8_t d){
97  id += d;
98  if(id >= PRESET_CNT) id = 0;
99  if(id < 0) id = PRESET_CNT-1;
100  return id+1;
101 }
102 
103 static EEMEM uint8_t e_id;
104 
105 static void _save(void){
106  // сохранить настройки
107  eeprom_update_byte(&e_id, id);
108 }
109 
110 static flash_effect_t effect_def = {
111  .name = _name,
112  .start = ini,
113  .work = effect,
114  .stop = NULL,
115  .preset = _preset,
116  .save = _save
117 };
118 
119 INIT(7){
120  // загрузить пресеты и настройки
121  id = eeprom_read_byte(&e_id);
122  _preset(0);
123  // регистрация эффекта
124  register_effect(BACKGROUND_EFFECT, &effect_def);
125 }
126 
void bright_ctrl(uint8_t id, uint8_t bright, int8_t delta)
Управление яркостью
Definition: pixel.c:95
void set_rgb_color(uint8_t pos, uint8_t r, uint8_t g, uint8_t b)
Пиксел произвольного цвета
Definition: pixel.c:107
const __flash effect_t flash_effect_t
тип описания эффекта, размещенного во FLASH.
Definition: main_effect.h:79
структура параметров звукового сигнала
Definition: global.h:72
uint16_t h
Оттенок цвета, значения в градусах 0...359.
uint8_t v
Яркость оттенка
uint8_t s
Насыщенность оттенка
#define BACKGROUND_EFFECT
фоновый эффект
Definition: main_effect.h:48
preset_result_t
результат функции смены пресета
Definition: main_effect.h:56
#define PIXEL_CNT
Общее количество пикселов
Definition: pixel.h:27
Тип для представления цвета в HSV-модели
Тип для представления цвета в RGB-модели
void hsv_to_rgb(hsv_t *src, rgb_t *dst)
pixel_t pixels[MAX_TOTAL_PIX]
Массив пикселей предельного размера
Definition: pixel.c:22
структура пресета
Definition: dbl_rainbow.c:41
void register_effect(uint8_t toe, flash_effect_t *eff)
Регистрация эффекта в списках
Definition: main_effect.c:41