DIGILIGHT
modern.c
См. документацию.
1 
17 #include <avr/io.h>
18 #include "../avr_helper.h"
19 #include <stdlib.h>
20 #include <avr/eeprom.h>
21 #include <avr/pgmspace.h>
22 #include "../color_transform.h"
23 #include "../global.h"
24 #include "../pixel.h"
25 #include "../main_effect.h"
26 #include "../lcd_show.h"
31 static void _effect(signal_t *s);
32 static void _start(void);
33 static preset_result_t _preset(int8_t d);
34 static effect_info_t _info(uint8_t show);
35 
36 // Название эффекта, не более 16 знаков
37 static __flash const char _name[] = "MODERN";
38 // Описание эффекта. Можно не менять, можно для оптимизации заменить
39 // отсутствующие функции на NULL
40 static flash_effect_t effect_def = {
41  .name = _name,
42  .start = _start, // может быть NULL
43  .work = _effect, // это значение не может быть NULL!
44  .preset = _preset, // может быть NULL
45  .info = _info
46 };
47 
48 // кол-во цветных каналов
49 #define CHANEL_CNT 6
50 
51 static const __flash uint8_t chanel[CHANEL_CNT] = {
53 
54 static __flash const rgb_t color[CHANEL_CNT] = {
55  {0xFF,0x0F,0x00},{RED},{GREEN},{ORANGE},{BLUE},{PURPLE},{RED},{YELLOW},{GREEN},{ORANGE},{BLUE},{PURPLE},{RED},{YELLOW},{GREEN},{ORANGE}
56 };
57 
58 typedef struct{
59  uint16_t level;
60  uint8_t wait;
61  uint8_t age;
62 } chanel_t;
63 
64 typedef struct {
65  int8_t preset;
66  uint8_t DIV;
67  uint8_t div;
68  chanel_t chanel[CHANEL_CNT];
69 } param_t;
70 
71 static param_t par;
72 static param_t *param=&par;
73 
74 #define CHANEL_WIDTH (PIXEL_CNT / CHANEL_CNT)
75 
76 INIT(7){
77  // регистрация эффекта - правильно указать тип эффекта!
78  register_effect(FOREGROUND_EFFECT, &effect_def);
79 }
80 
81 static effect_info_t _info(uint8_t show){
82  if(show){
83  center_str_p(1, PSTR("6 CHANELS"));
84  }
85  return INFO_ONCE;
86 }
87 
88 #define MAX_AGE 10
89 
90 // начало эффекта - вызывается после того, как завершился другой эффект и
91 // в том случае, если функция _preset вернула значение, отличное от PRESET_NOTHING
92 static void _start(void){
93  param->preset = 0;
94  param->DIV = 3;
95  param->div = param->DIV;
96  for(uint8_t i=0; i<CHANEL_CNT; i++)
97  param->chanel[i].age = MAX_AGE;
98 }
99 
100 // смена пресета эффекта - вызывается в произвольные моменты
101 static preset_result_t _preset(int8_t d){
102  return PRESET_NOTHING;
103 }
104 
105 #define WAIT 2
106 #define LVL_DEC 30
107 
108 // главная функция эффекта - вызывается 100 раз в секунду для рендеринга
109 static void _effect(signal_t *s){
110  // предделение
111  if(param->div){
112  param->div--;
113  return;
114  }
115  param->div = param->DIV;
116  off_all_pixels();
117 
118  uint16_t d;
119  uint8_t w = CHANEL_WIDTH;
120  uint16_t k;
121 
122  // определение пиков
123  for(uint8_t i=0; i<CHANEL_CNT; i++){
124  d = s->harmonics[chanel[i]];
125  k = param->chanel[i].level;
126  if((d > k)){
127  param->chanel[i].level = d;
128  param->chanel[i].wait = WAIT;
129  d = d - k;
130  k = CHANEL_WIDTH/2;
131  while(d && k){
132  d >>= 1;
133  k--;
134 
135  }
136  param->chanel[i].age = k;
137 
138  }
139  switch(param->preset){
140  case 0:
141  for(uint8_t p=0; p<w; p++){
142  //if(i==0)
143  k = -(CHANEL_WIDTH/2);
144  if((p >= param->chanel[i].age) && (p < (w - param->chanel[i].age))){
145  k += p+w*i;
146  if(k >= 0){
147  set_rgb_color(k, color[i].r, color[i].g, color[i].b);
148  bright_ctrl(k, 255, 30);
149  }
150  }
151  }
152  break;
153  }
154  if(param->chanel[i].wait){
155  param->chanel[i].wait--;
156  } else {
157  if(param->chanel[i].level >= LVL_DEC)
158  param->chanel[i].level -= LVL_DEC;
159  else
160  param->chanel[i].level = 0;
161  if(param->chanel[i].age <= MAX_AGE)
162  param->chanel[i].age++;
163  }
164  }
165 }
166 
void bright_ctrl(uint8_t id, uint8_t bright, int8_t delta)
Управление яркостью
Definition: pixel.c:95
#define GREEN
Чисто зеленый цвет
Definition: pixel.h:53
Гармоника 250 Гц
Definition: global.h:28
#define PURPLE
фиолетовый цвет
Definition: pixel.h:59
void off_all_pixels(void)
Выключение всех пикселов
Definition: pixel.c:162
нет пресетов
Definition: main_effect.h:58
Постоянная составляющая (инфранизкие частоты)
Definition: global.h:27
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
#define YELLOW
Ярко-желтый цвет
Definition: pixel.h:49
Гармоника 3750 Гц
Definition: global.h:42
uint16_t harmonics[F_CNT]
амплитуды всех гармоник сигнала
Definition: global.h:77
Гармоника 1500 Гц
Definition: global.h:33
#define ORANGE
Оранжевый цвет
Definition: pixel.h:51
void center_str_p(uint8_t row, const char *src)
вывод строки из flash по центру дисплея
Definition: lcd_show.c:111
preset_result_t
результат функции смены пресета
Definition: main_effect.h:56
Тип для представления цвета в RGB-модели
#define FOREGROUND_EFFECT
основной эффект
Definition: main_effect.h:50
Гармоника 2250 Гц
Definition: global.h:36
#define RED
Чисто красный цвет
Definition: pixel.h:47
void register_effect(uint8_t toe, flash_effect_t *eff)
Регистрация эффекта в списках
Definition: main_effect.c:41
#define BLUE
Чисто синий цвет
Definition: pixel.h:57
Гармоника 3250 Гц
Definition: global.h:40