Added the config for the relays
[cerebrum.git] / avr / ws2801.c.tp
blobe27dad60d4a6c1b2fdbd235c6b4acb7437814459
1 /*
2  Copyright (C) 2012 jaseg <s@jaseg.de>
4  This program is free software; you can redistribute it and/or
5  modify it under the terms of the GNU General Public License
6  version 3 as published by the Free Software Foundation.
7  */
9 #include <avr/io.h>
10 #include <util/delay.h>
11 #include <avr/pgmspace.h>
13 #include "spi.h"
15 ${modulevar("buffer", "uint8_t", "{}B".format(member["length"]*3), array=member["length"]*3)};
16 // Segments
17 % for [name, start, len] in member.get("segments", []):
18 //CAUTION Despite this being a comment, the module variable registration template call is still handled.
19 //${modulevar("buffer_"+name, None, "{}B".format(len*3),
20     callbacks=(("generic_getter_callback", modulevar("buffer")+'+'+str(start*3), len*3),
21                (None, modulevar("buffer")+'+'+str(start*3), len*3)))};
22 % endfor
23 //   B     G     R
24 #define NR_OF_PATTERNS 11
26 const uint8_t patterns[NR_OF_PATTERNS*${member["length"]*3}] PROGMEM = {
28 % for i in range(member["length"]):
29     0x00, 0x00, 0x00,
30 % endfor
32 // TEMPLATE CODE //////////////////////////////////////
34 % for i in range(member["length"]):
35 <% foo=int(i*6/member["length"]) %>
36 <% r=i-foo*member["length"]/6 %>
37 % if foo == 0:
38         0xFF,
39         ${r*6/member["length"]}*255,
40         0x00,
41 % endif
42 % if foo == 1:
43         ${1-r*6/member["length"]}*255,
44         0xFF,
45         0x00,
46 % endif
47 % if foo == 2:
48         0x00,
49         0xFF,
50         ${r*6/member["length"]}*255,
51 % endif
52 % if foo == 3:
53         0x00,
54         ${1-r*6/member["length"]}*255,
55         0xFF,
56 % endif
57 % if foo == 4:
58         ${r*6/member["length"]}*255,
59         0x00,
60         0xFF,
61 % endif
62 % if foo == 5:
63         0xFF,
64         0x00,
65         ${1-r*6/member["length"]}*255,
66 % endif
67 % endfor
70 // TEMPLATE CODE //////////////////////////////////////
71 // gruene wuerstchen
73 % for i in range(member["length"]):
74 % if i % 64 < 32:
75     0x00, 0xFF, 0x00,
76 % else:
77     0x00, 0x00, 0x00,
78 % endif
79 % endfor
82 // TEMPLATE CODE //////////////////////////////////////
84 // blaue/gruene wuerstchen
85 % for i in range(member["length"]):
86 % if (i+1) % 64 < 32:
87     0x00, 0xFF, 0x00,
88 % else:
89     0xFF, 0x00, 0x00,
90 % endif
91 % endfor
94 // TEMPLATE CODE //////////////////////////////////////
96 // rote lange wuerstchen
97 % for i in range(member["length"]):
98 % if i % 128 < 64:
99     0xFF, 0x00, 0x00,
100 % else:
101     0x00, 0x00, 0x00,
102 % endif
103 % endfor
106 // TEMPLATE CODE //////////////////////////////////////
108 // rote lange wuerstchen
109 % for i in range(member["length"]):
110 % if i % 128 < 64:
111     0x00, 0x00, 0xFF,
112 % else:
113     0x00, 0x00, 0x00,
114 % endif
115 % endfor
118 // TEMPLATE CODE //////////////////////////////////////
120 // kleiner weisser pupsi
122 % for i in range(member["length"]):
123 % if i % 256 < 16:
124         0xFF, 0xFF, 0xFF,
125 % else:
126     0x00, 0x00, 0x00,
127 % endif
128 % endfor
131 // TEMPLATE CODE //////////////////////////////////////
133 // kleiner blauer pupsi
135 % for i in range(member["length"]):
136 % if i % 256 < 16:
137         0xFF, 0x00, 0x00,
138 % else:
139     0x00, 0x00, 0x00,
140 % endif
141 % endfor
143 // TEMPLATE CODE //////////////////////////////////////
145 // kleiner gruener pupsi
147 % for i in range(member["length"]):
148 % if i % 256 < 16:
149         0x00, 0xFF, 0x00,
150 % else:
151     0x00, 0x00, 0x00,
152 % endif
153 % endfor
156 // TEMPLATE CODE //////////////////////////////////////
158 // kleiner roter pupsi
160 % for i in range(member["length"]):
161 % if i % 256 < 16:
162         0x00, 0x00, 0xFF,
163 % else:
164     0x00, 0x00, 0x00,
165 % endif
166 % endfor
169 // TEMPLATE CODE //////////////////////////////////////
170 // notbeleuchtung
172 % for i in range(member["length"]):
173 % if i % 32 < 4:
174     0x00, 0x24, 0x24,
175 % else:
176     0x00, 0x00, 0x00,
177 % endif
178 % endfor
181 // notbeleuchtung
183 //% for i in range(member["length"]):
184 //% if i % 32 < 4:
185     //0x00, 0x24, 0x24,
186 //% else:
187     //0x00, 0x00, 0x00,
188 //% endif
189 //% endfor
193 //--- CALLBACK REGISTRATION DO NOT REMOVE ---
194 //${modulevar("pattern", None, "B", callbacks=((True, "global_argbuf", "ARGBUF_SIZE"), (True, "global_argbuf", "ARGBUF_SIZE")))}
195 //--- CALLBACK REGISTRATION DO NOT REMOVE ---
196 void ${setter("pattern")} (const comm_callback_descriptor* cb, void* argbuf_end){
197     uint8_t pattern=((uint8_t*)cb->argbuf)[0];
198     if (pattern < NR_OF_PATTERNS) {
199         memcpy_PF(${modulevar("buffer")}, patterns+(${member["length"]*3}*pattern), ${member["length"]*3});
200     }
201     uart_putc(0x00);
202     uart_putc(0x00);
205 void ${getter("pattern")} (const comm_callback_descriptor* cb, void* argbuf_end){
206     uart_putc(0x00);
207     uart_putc(0x00);
210 ${modulevar("offset", "int16_t", "h")} = 0;
211 ${modulevar("speed", "int8_t", "b")} = ${member.get("speed", 2)};
213 void ${loop_function()}(void){
214         for(uint16_t i=0; i<${member["length"]}; i++){
215                 uint16_t j=${modulevar("offset")}+i;
216                 if(j>=${member["length"]})
217                         j-=${member["length"]};
218                 spi_transfer(${modulevar("buffer")}[j*3]);
219                 spi_transfer(${modulevar("buffer")}[j*3+1]);
220                 spi_transfer(${modulevar("buffer")}[j*3+2]);
221         }
222         ${modulevar("offset")}+=${modulevar("speed")};
223         if(${modulevar("offset")}>=${member["length"]})
224                 ${modulevar("offset")}-=${member["length"]};
225     if(${modulevar("offset")}<0)
226         ${modulevar("offset")}+=${member["length"]};
227         _delay_us(1000);
230 void ${init_function()}(void){
231     uint8_t index = 1;
232     memcpy_PF(${modulevar("buffer")}, patterns+(${member["length"]*3}*index), ${member["length"]*3});