DIGILIGHT
plasma.c
См. документацию.
1 
15 #include <avr/io.h>
16 #include "../avr_helper.h"
17 #include <stdlib.h>
18 #include <stddef.h>
19 #include <avr/eeprom.h>
20 #include "../pixel.h"
21 #include "../global.h"
22 #include "../main_effect.h"
27 static __flash const char _name[] = "PLASMA";
28 
29 static uint8_t get_rand(void){
30  return rand() % PIXEL_CNT;
31 }
32 
34 typedef struct{
35  uint16_t divider;
36  uint8_t shift;
37  uint8_t fade;
38 } preset_t;
39 
40 #define PRESET_NUM 12
41 // пресеты: отличаются количеством пикселов, скоростью их погасания.
42 static __flash const preset_t preset[PRESET_NUM] = {
43  {.divider = 250, .shift = 1, .fade = 15}, //** - basic
44  {.divider = 250, .shift = 2, .fade = 15},
45  {.divider = 250, .shift = 3, .fade = 15},
46 
47  {.divider = 250, .shift = 1, .fade = 75},
48  {.divider = 250, .shift = 2, .fade = 75},
49  {.divider = 250, .shift = 3, .fade = 75},
50 
51  {.divider = 500, .shift = 1, .fade = 15},
52  {.divider = 500, .shift = 2, .fade = 15},
53  {.divider = 500, .shift = 3, .fade = 15},
54 
55  {.divider = 500, .shift = 1, .fade = 75},
56  {.divider = 500, .shift = 2, .fade = 75},
57  {.divider = 500, .shift = 3, .fade = 75}
58 };
59 
60 static int8_t pr_num;
61 
71 static void effect(signal_t *s){
72  uint8_t id, _r, _g, _b;
73  static uint8_t div =1;
74 
75  if(!--div){
76  div = 1;
77  _r = s->band[LF] / preset[pr_num].divider;
78  _g = s->band[MF] / preset[pr_num].divider;
79  _b = s->band[HF] / preset[pr_num].divider;
80 
81  for(; _r; _r--){
82  id = get_rand();
83  pixels[id].r = 255;//s->peak_volume;
84  if(pixels[id].g) pixels[id].g >>= preset[pr_num].shift;
85  if(pixels[id].b) pixels[id].b >>= preset[pr_num].shift;
86  bright_ctrl(id, 255, preset[pr_num].fade);
87  }
88 
89  for(; _g; _g--){
90  id = get_rand();
91  pixels[id].g = 255;//s->peak_volume;
92  if(pixels[id].r) pixels[id].r >>= preset[pr_num].shift;
93  if(pixels[id].b) pixels[id].b >>= preset[pr_num].shift;
94  bright_ctrl(id, 255, preset[pr_num].fade);
95  }
96 
97  for(; _b; _b--){
98  id = get_rand();
99  pixels[id].b = 255;//s->peak_volume;
100  if(pixels[id].g) pixels[id].g >>= preset[pr_num].shift;
101  if(pixels[id].r) pixels[id].r >>= preset[pr_num].shift;
102  bright_ctrl(id, 255, preset[pr_num].fade);
103  }
104  }
105 }
106 
107 static preset_result_t _preset(int8_t d){
108  pr_num += d;
109  if(pr_num < 0) pr_num = PRESET_NUM-1;
110  if(pr_num >= PRESET_NUM) pr_num = 0;
111  return pr_num + 1;
112 }
113 
114 static void _save(void);
115 
116 static flash_effect_t effect_def = {
117  .name = _name,
118  .start = NULL,
119  .work = effect,
120  .stop = NULL,
121  .preset = _preset,
122  .save = _save
123 };
124 
125 static EEMEM uint8_t e_preset;
126 
127 INIT(7){
128  // загрузить пресеты и настройки
129  pr_num = eeprom_read_byte(&e_preset);
130  if((pr_num < 0) || (pr_num >= PRESET_NUM)) pr_num = 0;
131  // регистрация эффекта
132  register_effect(FOREGROUND_EFFECT, &effect_def);
133 }
134 
135 static void _save(void){
136  // сохранить настройки
137  eeprom_update_byte(&e_preset, pr_num);
138 }
139 
void bright_ctrl(uint8_t id, uint8_t bright, int8_t delta)
Управление яркостью
Definition: pixel.c:95
uint8_t b
синяя составляющая цвета
Definition: pixel.h:36
uint8_t shift
чем больше, интенсивнее основные цвета
Definition: plasma.c:36
power_t band[BAND_CNT]
"мощности" полос сигнала
Definition: global.h:75
const __flash effect_t flash_effect_t
тип описания эффекта, размещенного во FLASH.
Definition: main_effect.h:79
uint16_t divider
чем больше, тем меньше количество огней
Definition: plasma.c:35
структура параметров звукового сигнала
Definition: global.h:72
void fade(void)
Автоматическое изменение яркости всех пикселов
Definition: pixel.c:49
preset_result_t
результат функции смены пресета
Definition: main_effect.h:56
#define PIXEL_CNT
Общее количество пикселов
Definition: pixel.h:27
#define FOREGROUND_EFFECT
основной эффект
Definition: main_effect.h:50
uint8_t g
зеленая составляющая цвета
Definition: pixel.h:35
uint8_t r
красная составляющая цвета
Definition: pixel.h:34
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