-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlaborlicht.c
44 lines (37 loc) · 1.34 KB
/
laborlicht.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <avr/pgmspace.h>
#include "hw.h"
#include "laborlicht.h"
#define INTERIM_UPSCALE(a) ((a) * 128)
#define INTERIM_DOWNSCALE(a) ((a) / 128)
unsigned char const PROGMEM g_color_presets[color_MAX][channel_MAX] = {
{ 0, 0, 0}, // black
{255, 0, 0}, // red
{255, 255, 0}, // yellow
{ 0, 255, 0}, // green
{ 0, 255, 255}, // teal
{ 0, 0, 255}, // blue
{255, 0, 255}, // pink
{255, 255, 255} // white
};
void color_fade(unsigned char const *fade_color,
unsigned char const steps,
unsigned int delay) {
int interim_color[channel_MAX];
int offset[channel_MAX];
for (color_channel_t channel = 0; channel < channel_MAX; ++channel) {
interim_color[channel] = INTERIM_UPSCALE(g_color[channel]);
offset[channel] =
INTERIM_UPSCALE(fade_color[channel] - g_color[channel]) / steps;
}
for (unsigned char step = 0; step < steps; ++step) {
for (color_channel_t channel = 0; channel < channel_MAX; ++channel) {
g_color[channel] =
INTERIM_DOWNSCALE(interim_color[channel] += offset[channel]);
}
wait(delay);
}
// counter measure against rounding errors
for (color_channel_t channel = 0; channel < channel_MAX; ++channel) {
g_color[channel] = fade_color[channel];
}
}