blob: 564a30a04822330d51a4dde1c4d2382088a7d42d (
plain) (
blame)
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
44
45
46
47
48
49
50
51
52
53
54
|
#include <stdio.h>
#include "byte_math.h"
#include "pattern.h"
static uint8_t pseudo_random(uint8_t x) {
return (1103515245 * x + 12345) & 0xFF; // & 0xFF ensures the result is 0-255
}
static rgb_t get_rgb(uint32_t time, size_t x)
{
int r = 0, g = 0, b = 0;
uint8_t time8 = time & 0xff;
uint8_t time_offset = pseudo_random(x);
uint32_t adjusted_time = time - time_offset;
// The random number for this "metaframe." The metaframe is enough to show 1
// flash. It's used to keep the same LED's from consistently repeating.
uint32_t metaframe = adjusted_time >> 8;
uint8_t rand = pseudo_random(x + metaframe);
uint8_t speed = pseudo_random(rand) % 16;
uint8_t off = pseudo_random(rand + speed);
if (speed > 4) {
speed = 0;
}
uint32_t w_index = ((adjusted_time - off) * speed) & 0xff;
int w = 0;
if (w_index < 255) {
w = calc_w(w_index);
}
r = 0xff;
g = byte_scale(byte_sin(time8 + x * 2), 0x60);
b = 0;
rgb_t color;
color.color = 0;
color.r = clip(r + w);
color.g = clip(byte_scale(g, AS_BYTE(0.75)) + w);
color.b = clip(byte_scale(b, AS_BYTE(0.75)) + w);
return color;
}
static void reset(void)
{
}
__attribute__((__section__(".patterns"))) volatile static pattern_t pat =
((pattern_t){.get_rgb = get_rgb, .name = "Twinkle", .reset = reset});
|