]> www.fi.muni.cz Git - tinyboard.git/blob - projects/rgb-led-string/main.c
dc968613c6d85b9878405e13dd712f9e06d1b086
[tinyboard.git] / projects / rgb-led-string / main.c
1 #include <avr/io.h>
2 #include <util/delay.h>
3 #include <avr/interrupt.h>
4
5 #include "rgbstring.h"
6
7 unsigned char jiffies;
8
9 typedef struct {
10         unsigned char type : 4;
11         unsigned char order : 4;
12 } pixel_t;
13
14 pixel_t pixels[STRIP_SIZE];
15
16
17 int main(void)
18 {
19         unsigned char i, start, rgb, jiffies;
20         init_log();
21         init_serial();
22
23         _delay_ms(3000/8);
24         CLKPR = _BV(CLKPCE);
25         CLKPR = 0;
26
27         for (i = 0; i < STRIP_SIZE; i+= 23)
28                 pixels[i].type = 2;
29
30         while (1) {
31                 jiffies++;
32                 if ((jiffies & 7) == 0) {
33                         pixels[start].type = 1;
34                         pixels[start].order = 14;
35                 }
36
37                 if ((jiffies & 7) == 3) {
38                         pixels[start].type = 2;
39                         pixels[start].order = 0;
40                         start += 19;
41                 }
42
43                 start += 63;
44                 if (start >= STRIP_SIZE)
45                         start -= STRIP_SIZE;
46
47                 for (i = 0; i < STRIP_SIZE; i++) {
48                         unsigned char type = pixels[i].type;
49                         unsigned char order = pixels[i].order;
50
51                         switch (type) {
52                         case 0:
53                                 send_rgb(0, 0, 4);
54                                 break;
55                         case 1:
56                         case 3:
57                                 send_rgb(
58                                         6+(1 << (order/2)),
59                                         6+(1 << (order/2)),
60                                         6+(1 << (order/2))
61                                 );
62                                 pixels[i].type = type == 3 ? 2 : 0;;
63                                 if (order > 1 && i) {
64                                         pixels[i-1].type = pixels[i-1].type == 2 ? 3 : 1;
65                                         pixels[i-1].order = order-1;
66                                 }
67                                 break;
68                         case 2:
69                                 if (order >= 8) {
70                                         send_rgb(1 << ((15-order) / 2), 0, 0);
71                                 } else {
72                                         send_rgb(1 << (order/2), 0, 0);
73                                 }
74                                 if (++order >= 15)
75                                         pixels[i].type = 0;
76                                 pixels[i].order = order;
77                                 break;
78                         }
79                 }
80
81                 end_frame();
82
83                 _delay_ms(50);
84 #if 0
85                 log_byte(0xFa);
86                 log_flush();
87 #endif
88         }
89 }