DIGILIGHT
main_effect.c
См. документацию.
1 
12 #include <avr/io.h>
13 #include <avr/eeprom.h>
14 #include "avr_helper.h"
15 #include <avr/pgmspace.h>
16 #include <stdlib.h>
17 #include "pixel.h"
18 #include "main_effect.h"
19 #include "gain_ctrl.h"
20 #include "spectrum.h"
21 #include "lcd_show.h"
22 #include "sd_script.h"
23 
25 typedef struct{
26  int8_t cur;
27  int8_t total;
28  uint8_t first;
31 
33 static effect_state_t effects[2];
34 
41 void register_effect(uint8_t toe, flash_effect_t *eff){
42 #if defined(_FFT_DEBUG_)
43  if(eff->name[0] != '@') return;
44 #endif
45  if(effects[toe].total >= MAX_EFFECT_CNT) return;
46  effects[toe].effect[effects[toe].total] = eff;
47  effects[toe].total++;
48 }
49 
51 #define BACK effects[BACKGROUND_EFFECT]
52 #define FORE effects[FOREGROUND_EFFECT]
54 #define CUR_BACK effects[BACKGROUND_EFFECT].effect[effects[BACKGROUND_EFFECT].cur]
56 #define CUR_FORE effects[FOREGROUND_EFFECT].effect[effects[FOREGROUND_EFFECT].cur]
58 
64  sens_control(s);
66  // foreground
67  if(FORE.first){
68  if(CUR_BACK->stop != NULL) CUR_BACK->stop();
69  if(CUR_FORE->start != NULL)CUR_FORE->start();
70  FORE.first = 0;
71  }
72  CUR_FORE->work(s);
73  BACK.first = 1;
74  } else {
75  // background
76  if(BACK.first){
77  if(CUR_FORE->stop != NULL) CUR_FORE->stop();
78  if(CUR_BACK->start != NULL) CUR_BACK->start();
79  BACK.first = 0;
80  }
81  CUR_BACK->work(s);
82  FORE.first = 1;
83  }
84 }
85 
94 int8_t change_preset(signal_t *s, int8_t delta){
98 
99  if(ptr->preset != NULL) result = ptr->preset(delta);
100 
101  if(result != PRESET_NOTHING) st->first = 1;
102  return result;
103 }
104 
105 static char tmp[17];
106 
113  strcpy_P(tmp, (s->average_vol > DEF_SILENCE_LVL) ? CUR_FORE->name : CUR_BACK->name);
114  return tmp;
115 }
116 
117 static char* get_preset_name(signal_t *s){
120 
121  if(ptr->preset != NULL) _preset = ptr->preset(0);
122 
123  switch(_preset){
124  case PRESET_HIDDEN:
125  case PRESET_NOTHING:
126  tmp[0] = 0;
127  break;
128  default:
129  // пока что только нумерованные эффекты
130  strcpy_P(tmp, PSTR("PRESET "));
131  itoa(_preset, &tmp[7], 10);
132  }
133  return tmp;
134 }
135 
138 
139  if(ptr->info != NULL){
140  ptr->info(1);
141  } else {
142  center_str(1, get_preset_name(s));
143  }
144 }
145 
147  static uint8_t mode = 1;
148  uint8_t changed = 0;
149 
151  if(ptr->info != NULL) changed = ptr->info(0) == INFO_ALWAYS;
152 
153  uint8_t cur_mode = s->average_vol > DEF_SILENCE_LVL;
154 
155  changed = changed || (cur_mode != mode);
156  mode = cur_mode;
157  return changed;
158 }
159 
163 static void default_stop_effect(void){
164  for(uint8_t i=0; i<PIXEL_CNT; i++){
165  pixels[i].delta = 10;
166  }
167 }
168 
169 static EEMEM int8_t e_cur_back;
170 static EEMEM int8_t e_cur_fore;
171 
172 void select_fg_effect(signal_t *s, uint8_t num){
173  if(s->average_vol > DEF_SILENCE_LVL){
174  if(num < FORE.total){
175  if(CUR_FORE->stop != NULL) CUR_FORE->stop();
176  default_stop_effect();
177  FORE.cur = num;
178  FORE.first = 1;
179  eeprom_update_byte((void*)&e_cur_fore, FORE.cur);
180  }
181  }
182 }
183 
184 void select_bg_effect(signal_t *s, uint8_t num){
185  if(s->average_vol <= DEF_SILENCE_LVL){
186  if(num < BACK.total){
187  if(CUR_BACK->stop != NULL) CUR_BACK->stop();
188  default_stop_effect();
189  BACK.cur = num;
190  BACK.first = 1;
191  eeprom_update_byte((void*)&e_cur_back, BACK.cur);
192  }
193  }
194 }
195 
196 
200 void save_all_effects(void){
201  eeprom_update_byte((void*)&e_cur_fore, FORE.cur);
202  eeprom_update_byte((void*)&e_cur_back, BACK.cur);
203  for(uint8_t i = 0; i < FORE.total; i++){
204  if(FORE.effect[i]->save != NULL)
205  FORE.effect[i]->save();
206  }
207  for(uint8_t i = 0; i < BACK.total; i++){
208  if(BACK.effect[i]->save != NULL)
209  BACK.effect[i]->save();
210  }
211 }
212 
218 void change_effect(signal_t *s, int8_t delta){
221 
222  if(ptr->stop != NULL) ptr->stop();
223 
224  default_stop_effect();
225 
226  st->cur += delta;
227  if(st->cur < 0) st->cur = st->total-1;
228  if(st->cur >= st->total) st->cur = 0;
229 
231  st->first = 1;
232  eeprom_update_byte((void*)&e_cur_fore, FORE.cur);
233  eeprom_update_byte((void*)&e_cur_back, BACK.cur);
234 }
235 
236 INIT(8){
237  FORE.cur = eeprom_read_byte((void*)&e_cur_fore);
238  if((FORE.cur < 0) || (FORE.cur >= FORE.total)) FORE.cur = 0;
239  BACK.cur = eeprom_read_byte((void*)&e_cur_back);
240  if((BACK.cur < 0) || (BACK.cur >= BACK.total)) BACK.cur = 0;
241 }
#define CUR_FORE
простой доступ к текущему основному эффекту
Definition: main_effect.c:57
void save_all_effects(void)
Сохранение настроек всех эффектов
Definition: main_effect.c:200
void center_str(uint8_t row, char *src)
вывод строки по центру дисплея
Definition: lcd_show.c:123
#define DEF_SILENCE_LVL
Предел уровня громкости, считающийся тишиной
Definition: global.h:23
#define CUR_BACK
простой доступ к текущему фоновому эффекту
Definition: main_effect.c:55
int8_t delta
условная скорость автоматического изменения яркости
Definition: pixel.h:38
void show_info(signal_t *s)
Название текущего пресета для текущего эффекта
Definition: main_effect.c:136
void select_bg_effect(signal_t *s, uint8_t num)
Выбор пресета непосредственно
Definition: main_effect.c:184
volume_t average_vol
средняя громкость
Definition: global.h:74
#define MAX_EFFECT_CNT
предельное количество эффектов любого типа
Definition: main_effect.h:46
нет пресетов
Definition: main_effect.h:58
void select_fg_effect(signal_t *s, uint8_t num)
Выбор эффекта непосредственно
Definition: main_effect.c:172
Вспомогательные эффекты ЖКИ
int8_t total
общее количество эффектов
Definition: main_effect.c:27
const __flash effect_t flash_effect_t
тип описания эффекта, размещенного во FLASH.
Definition: main_effect.h:79
структура параметров звукового сигнала
Definition: global.h:72
сервисный модуль для реализации эффектов Набор вспомогательных функций для базовых манипуляций над це...
Структура хранения списков эффектов
Definition: main_effect.c:25
Описания для модуля реализации спектрального анализа
uint8_t first
признак первого запуска эффекта
Definition: main_effect.c:28
int8_t change_preset(signal_t *s, int8_t delta)
Смена пресета для текущегоэффекта последовательно
Definition: main_effect.c:94
int8_t cur
номер текущего выбранного эффект
Definition: main_effect.c:26
отображать название пресета не надо
Definition: main_effect.h:59
preset_result_t
результат функции смены пресета
Definition: main_effect.h:56
#define PIXEL_CNT
Общее количество пикселов
Definition: pixel.h:27
Описания модуля скрипт-плейера
Интерфейс визуальных эффектов
void sens_control(signal_t *s)
Регулировка чувствительности
Definition: gain_ctrl.c:45
pixel_t pixels[MAX_TOTAL_PIX]
Массив пикселей предельного размера
Definition: pixel.c:22
flash_effect_t * effect[MAX_EFFECT_CNT]
массив указателей на эффекты
Definition: main_effect.c:29
#define FORE
простой доступ к массиву основных эффектов
Definition: main_effect.c:53
Модуль управления усилением
void register_effect(uint8_t toe, flash_effect_t *eff)
Регистрация эффекта в списках
Definition: main_effect.c:41
#define BACK
простой доступ к массиву фоновых эффектов
Definition: main_effect.c:51
void change_effect(signal_t *s, int8_t delta)
Смена эффекта последовательно
Definition: main_effect.c:218
void execute_effect(signal_t *s)
Рендеринг эффекта
Definition: main_effect.c:63
char * get_effect_name(signal_t *s)
Название текущего эффекта
Definition: main_effect.c:112
uint8_t effect_auto_changed(signal_t *s)
Проверка смены фонового эффекта на основной или наоборот
Definition: main_effect.c:146