DIGILIGHT
pingpong.c
См. документацию.
1 
11 #include <avr/io.h>
12 #include "../avr_helper.h"
13 #include <stdlib.h>
14 #include <avr/eeprom.h>
15 #include "../global.h"
16 #include "../pixel.h"
17 #include "../color_transform.h"
18 #include "../main_effect.h"
22 static __flash const char _name[] = "PING-PONG";
23 
24 typedef struct{
25  uint8_t speed;
26  uint8_t fade;
27  uint8_t color_speed;
28 } preset_t;
29 
30 #define PRESET_CNT 5
31 
32 static int8_t preset_id;
33 static __flash const preset_t preset[PRESET_CNT] = {
34  {.speed = 2, .fade = 10, .color_speed = 1},
35  {.speed = 2, .fade = 1, .color_speed = 10},
36  {.speed = 5, .fade = 10, .color_speed = 1},
37  {.speed = 5, .fade = 1, .color_speed = 10},
38  {.speed = 5, .fade = 1, .color_speed = 0}
39 };
40 
47 static void effect(signal_t *s){
48  static int16_t h1;
49  static uint8_t px;
50  static int8_t dx=1;
51  static uint8_t sil_cnt=1;
52  hsv_t hsv;
53  rgb_t rgb;
54 
55  hsv.s = 255;
56  hsv.v = 255;
57  if(--sil_cnt) return;
58  sil_cnt = preset[preset_id].speed;
59 
60  hsv.h = h1;
61  hsv_to_rgb(&hsv, &rgb);
62 
63  for(uint8_t i=0; i < PIXEL_CNT; i++){
64  pixels[i].bright >>=1;
65  }
66  set_rgb_color(px, rgb.r, rgb.g, rgb.b);
67  bright_ctrl(px, 255, preset[preset_id].fade);
68  px += dx;
69  if(px >= PIXEL_CNT){
70  px -= dx;
71  dx = -dx;
72  if(preset[preset_id].color_speed == 0){
73  h1 = rand() % HSV_GRADE;
74  } else {
75  h1 += preset[preset_id].color_speed;
76  if(h1 >= HSV_GRADE) h1 -= HSV_GRADE;
77  }
78  }
79 }
80 
81 static preset_result_t _preset(int8_t d){
82  preset_id += d;
83  if(preset_id < 0) preset_id = PRESET_CNT-1;
84  if(preset_id >= PRESET_CNT) preset_id = 0;
85  return preset_id + 1;
86 }
87 
88 static void _save(void);
89 
90 static flash_effect_t effect_def = {
91  .name = _name,
92  .start = NULL,
93  .work = effect,
94  .stop = NULL,
95  .preset = _preset,
96  .save = _save
97 };
98 
99 static EEMEM uint8_t e_preset;
100 
101 INIT(7){
102  // загрузить пресеты и настройки
103  preset_id = eeprom_read_byte(&e_preset);
104  _preset(0);
105  // регистрация эффекта
106  register_effect(BACKGROUND_EFFECT, &effect_def);
107 }
108 
109 static void _save(void){
110  // сохранить настройки
111  eeprom_update_byte(&e_preset, preset_id);
112 }
113 
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
Яркость оттенка
void fade(void)
Автоматическое изменение яркости всех пикселов
Definition: pixel.c:49
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-модели
uint8_t fade
чем больше, тем медленнее гаснут огни
Definition: pingpong.c:26
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
uint8_t bright
яркость пиксела
Definition: pixel.h:37