DIGILIGHT
run_rainbow.c
См. документацию.
1 
11 #include <avr/io.h>
12 #include "../avr_helper.h"
13 #include <stdlib.h>
14 #include <avr/eeprom.h>
15 #include "../color_transform.h"
16 #include "../global.h"
17 #include "../pixel.h"
18 #include "../main_effect.h"
23 static void _effect(signal_t *s);
24 static void _stop(void);
25 static void _start(void);
26 static preset_result_t _preset(int8_t d);
27 static void _save(void);
28 
29 // Название эффекта, не более 16 знаков
30 static __flash const char _name[] = "RUNNING RAINBOW";
31 // Описание эффекта. Можно не менять, можно для оптимизации заменить
32 // отсутствующие функции на NULL
33 static flash_effect_t effect_def = {
34  .name = _name,
35  .start = _start, // может быть NULL
36  .work = _effect, // это значение не может быть NULL!
37  .stop = _stop, // может быть NULL
38  .preset = _preset, // может быть NULL
39  .save = _save
40 };
41 
42 #define PRESET_CNT 5
43 
44 static int8_t id;
45 static int16_t first;
46 
47 typedef struct{
48  int8_t step;
49  uint8_t div;
50 } preset_t;
51 
52 static __flash const preset_t preset[PRESET_CNT] = {
53  {.step = 1, .div=5},
54  {.step = 5, .div=5},
55  {.step = 10, .div=2},
56  {.step = 15, .div=1},
57  {.step = 27, .div=1}
58 };
59 
60 static EEMEM uint8_t e_id;
61 
62 INIT(7){
63  // загрузить пресеты и настройки
64  id = eeprom_read_byte(&e_id);
65  _preset(0);
66  // регистрация эффекта - правильно указать тип эффекта!
67  register_effect(BACKGROUND_EFFECT, &effect_def);
68 }
69 
70 static void _save(void){
71  // сохранить настройки
72  eeprom_update_byte(&e_id, id);
73 }
74 
75 static uint8_t br;
76 
77 // главная функция эффекта - вызывается 100 раз в секунду для рендеринга
78 static void _effect(signal_t *s){
79  static uint8_t div = 1;
80  hsv_t hsv;
81  rgb_t rgb;
82 
83  if(--div) return;
84  div = preset[id].div;
85 
86  if(br < 255) br++;
87 
88  hsv.s = hsv.v = 255;
89  hsv.h = first;
90 
91  for(uint8_t i=0; i<PIXEL_CNT; i++){
92  hsv_to_rgb(&hsv, &rgb);
93  set_rgb_color(i, rgb.r, rgb.g, rgb.b);
94  bright_ctrl(i, br, 1);
95  hsv.h += preset[id].step;
96  if(hsv.h > HSV_GRADE) hsv.h -= HSV_GRADE;
97  if(hsv.h < 0) hsv.h += HSV_GRADE;
98  }
99  first++;
100  first %= HSV_GRADE;
101 }
102 
103 // завершение эффекта - вызывается перед тем, как включится другой эффект
104 static void _stop(void){
105  // Требуется реализация
106 }
107 
108 // начало эффекта - вызывается после того, как завершился другой эффект и
109 // в том случае, если функция _preset вернула значение, отличное от PRESET_NOTHING
110 static void _start(void){
111  // Требуется реализация
112  first = rand() % HSV_GRADE;
113  br = 1;
114 }
115 
116 // смена пресета эффекта - вызывается в произвольные моменты
117 static preset_result_t _preset(int8_t d){
118  id += d;
119  if(id >= PRESET_CNT) id = 0;
120  if(id < 0) id = PRESET_CNT-1;
121  return id+1;
122 }
123 
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)
структура пресета
Definition: dbl_rainbow.c:41
void register_effect(uint8_t toe, flash_effect_t *eff)
Регистрация эффекта в списках
Definition: main_effect.c:41