]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/ut47/LED_controls.ino
turn it on
[qmk_firmware.git] / keyboards / ut47 / LED_controls.ino
1 #include <FastGPIO.h>
2 #include <TimerOne.h>
3
4 int iByte;
5 byte col = 0;
6 byte leds[12][4];
7 byte pass = 1;
8 int fadecount = 1;
9 const int fadelimit = 3000;
10 const int fadelimitshort = 1000;
11 byte mode = 4;
12 byte brightness = 2;
13 boolean changemode = 0;
14 int rain = 0;
15 const int rainlimit = 5000;
16 const int rainfade = 5000;
17 byte rx = 0;
18 byte ry = 0;
19
20 // pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
21 int pins[17] = {
22   -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 14, 15, 18, 19, 20, 21
23 };
24
25 // col[xx] of leds = pin yy on led matrix
26 int cols[12] = {
27   pins[8], pins[7], pins[6], pins[5], pins[9], pins[10], pins[11], pins[12], pins[13], pins[14], pins[15], pins[16]
28 };
29
30 // row[xx] of leds = pin yy on led matrix
31 int rows[4] = {
32   pins[1], pins[2], pins[3], pins[4]
33 };
34
35
36 #define DELAY 0
37 extern byte leds[12][4];
38
39 void setup() {
40   Serial1.begin(9600);
41   setupLeds();
42   for (int s = 0; s < 5; s++) {
43     for ( int r = 1; r  < 9; r++)  {
44       delayMicroseconds(65000);
45       delayMicroseconds(65000);
46       for (int j = 0; j < 4; j++) {
47         for (int i = 0; i < 12; i++) {
48           leds[i][j] = 1;
49           for (int p = 0; p < 25; p++) {
50           }
51           leds[i][j] = r;
52         }
53       }
54     }
55     for ( int r = 9; r  > 0; r--)  {
56       delayMicroseconds(65000);
57       delayMicroseconds(65000);
58       delayMicroseconds(65000);
59       for (int j = 0; j < 4; j++) {
60         for (int i = 0; i < 12; i++) {
61           leds[i][j] = 1;
62           for (int p = 0; p < 25; p++) {
63           }
64           leds[i][j] = r;
65         }
66       }
67     }
68   }
69 }
70
71 void loop() {
72
73   switch (mode) {
74     case 0:
75       //Blacklight
76       for (int i = 0; i < 12; i++) {
77         for (int j = 0; j < 4; j++) {
78           leds[i][j] = brightness;
79         }
80       }
81       checkserial();
82       break;
83     case 1:
84       //Breathing
85       for ( int r = 1; r  < 9; r++)  {
86         checkserial();
87         if (changemode == 0) {
88           delayMicroseconds(65000);
89           delayMicroseconds(65000);
90           delayMicroseconds(65000);
91           for (int j = 0; j < 4; j++) {
92             for (int i = 0; i < 12; i++) {
93               leds[i][j] = 1;
94               for (int p = 0; p < 25; p++) {
95               }
96               leds[i][j] = r;
97             }
98           }
99         }
100         else {
101           break;
102         }
103       }
104       for ( int r = 9; r  > 0; r--)  {
105         checkserial();
106         if (changemode == 0) {
107           delayMicroseconds(65000);
108           delayMicroseconds(65000);
109           delayMicroseconds(65000);
110           delayMicroseconds(65000);
111           for (int j = 0; j < 4; j++) {
112             for (int i = 0; i < 12; i++) {
113               leds[i][j] = 1;
114               for (int p = 0; p < 25; p++) {
115               }
116               leds[i][j] = r;
117             }
118           }
119         }
120         else {
121           break;
122         }
123       }
124       for ( int r = 1; r  < 30; r++)  {
125         checkserial();
126         if (changemode == 0) {
127           delayMicroseconds(65000);
128           delayMicroseconds(65000);
129         }
130         else {
131           break;
132         }
133       }
134       break;
135     case 2:
136       //Random
137       leds[random(12)][random(4)] = random(8);
138       delayMicroseconds(10000);
139       checkserial();
140       break;
141     case 3:
142       //Rain
143       rain++;
144       if (rain > rainlimit) {
145         rain = 0;
146         rx = random(12);
147         ry = random(4);
148         if (leds[rx][ry] == 0) {
149           leds[rx][ry] = 18;
150         }
151       }
152       fadecount++;
153       if (fadecount > rainfade) {
154         fadecount = 1;
155         for (int i = 0; i < 12; i++) {
156           for (int j = 0; j < 4; j++) {
157             if (leds[i][j] > 0) {
158               leds[i][j] = leds[i][j] - 1;
159             }
160           }
161         }
162       }
163       checkserial();
164       break;
165     case 4:
166       //Reactive
167       fadecount++;
168       if (fadecount > fadelimit) {
169         fadecount = 1;
170         for (int i = 0; i < 12; i++) {
171           for (int j = 0; j < 4; j++) {
172             if (leds[i][j] > 0) {
173               leds[i][j] = leds[i][j] - 1;
174             }
175           }
176         }
177       }
178       checkserial();
179       break;
180     case 5:
181       //Reactive Target
182       fadecount++;
183       if (fadecount > fadelimitshort) {
184         fadecount = 1;
185         for (int i = 0; i < 12; i++) {
186           for (int j = 0; j < 4; j++) {
187             if (leds[i][j] > 0) {
188               leds[i][j] = leds[i][j] - 1;
189             }
190           }
191         }
192       }
193       checkserial();
194       break;
195     default:
196       mode = 0;
197       break;
198   }
199   changemode = 0;
200 }
201
202 void checkserial() {
203   if (Serial1.available() > 0) {
204     iByte = Serial1.read();
205     if (iByte == 100) {
206       brightness++;
207       if (brightness > 9) {
208         brightness = 1;
209       }
210     }
211     if (iByte == 101) {
212       mode++;
213     }
214     if (iByte < 100) {
215       if (mode == 4) {
216         byte row = iByte / 16;
217         byte col = iByte % 16;
218         leds[col][row] = 18;
219       }
220       if (mode == 5) {
221         byte row = iByte / 16;
222         byte col = iByte % 16;
223         for (byte i = 0; i < 12;  i++) {
224           leds[i][row] = 18;
225         }
226         for (byte p = 0; p < 4;  p++) {
227           leds[col][p] = 18;
228         }
229       }
230     }
231   }
232 }
233
234 void setupLeds() {
235   // sets the pins as output
236   FastGPIO::Pin<2>::setOutputLow();
237   FastGPIO::Pin<3>::setOutputLow();
238   FastGPIO::Pin<4>::setOutputLow();
239   FastGPIO::Pin<5>::setOutputLow();
240   FastGPIO::Pin<6>::setOutputLow();
241   FastGPIO::Pin<7>::setOutputLow();
242   FastGPIO::Pin<8>::setOutputLow();
243   FastGPIO::Pin<9>::setOutputLow();
244   FastGPIO::Pin<10>::setOutputLow();
245   FastGPIO::Pin<16>::setOutputLow();
246   FastGPIO::Pin<14>::setOutputLow();
247   FastGPIO::Pin<15>::setOutputLow();
248   FastGPIO::Pin<18>::setOutputLow();
249   FastGPIO::Pin<19>::setOutputLow();
250   FastGPIO::Pin<20>::setOutputLow();
251   FastGPIO::Pin<21>::setOutputLow();
252
253   // set up Cols
254   FastGPIO::Pin<6>::setOutputValueLow();
255   FastGPIO::Pin<7>::setOutputValueLow();
256   FastGPIO::Pin<8>::setOutputValueLow();
257   FastGPIO::Pin<9>::setOutputValueLow();
258   FastGPIO::Pin<10>::setOutputValueLow();
259   FastGPIO::Pin<16>::setOutputValueLow();
260   FastGPIO::Pin<14>::setOutputValueLow();
261   FastGPIO::Pin<15>::setOutputValueLow();
262   FastGPIO::Pin<18>::setOutputValueLow();
263   FastGPIO::Pin<19>::setOutputValueLow();
264   FastGPIO::Pin<20>::setOutputValueLow();
265   FastGPIO::Pin<21>::setOutputValueLow();
266
267   // set up Rows
268   FastGPIO::Pin<2>::setOutputValueLow();
269   FastGPIO::Pin<3>::setOutputValueLow();
270   FastGPIO::Pin<4>::setOutputValueLow();
271   FastGPIO::Pin<5>::setOutputValueLow();
272
273   clearLeds();
274   Timer1.initialize(25);
275   Timer1.attachInterrupt(display);
276
277 }
278
279 void clearLeds() {
280   // Clear display array
281   for (int i = 0; i < 12; i++) {
282     for (int j = 0; j < 4; j++) {
283       leds[i][j] = 0;
284     }
285   }
286 }
287
288 void onLeds() {
289   // Clear display array
290   for (int i = 0; i < 12; i++) {
291     for (int j = 0; j < 4; j++) {
292       leds[i][j] = 7;
293     }
294   }
295 }
296
297 // Interrupt routine
298 void display() {
299
300   switch (col) { // Turn whole previous column off
301     case 0:
302       FastGPIO::Pin<6>::setOutputValueLow();
303       break;
304     case 1:
305       FastGPIO::Pin<7>::setOutputValueLow();
306       break;
307     case 2:
308       FastGPIO::Pin<8>::setOutputValueLow();
309       break;
310     case 3:
311       FastGPIO::Pin<9>::setOutputValueLow();
312       break;
313     case 4:
314       FastGPIO::Pin<10>::setOutputValueLow();
315       break;
316     case 5:
317       FastGPIO::Pin<16>::setOutputValueLow();
318       break;
319     case 6:
320       FastGPIO::Pin<14>::setOutputValueLow();
321       break;
322     case 7:
323       FastGPIO::Pin<15>::setOutputValueLow();
324       break;
325     case 8:
326       FastGPIO::Pin<18>::setOutputValueLow();
327       break;
328     case 9:
329       FastGPIO::Pin<19>::setOutputValueLow();
330       break;
331     case 10:
332       FastGPIO::Pin<20>::setOutputValueLow();
333       break;
334     case 11:
335       FastGPIO::Pin<21>::setOutputValueLow();
336       break;
337   }
338
339   col++;
340   if (col == 12) {
341     col = 0;
342     pass++;
343     if (pass > 8) {
344       pass = 1;
345     }
346   }
347   for (int row = 0; row < 4; row++) {
348     if (leds[col][row] > pass) {
349       switch (row) { // Turn on this led
350         case 0:
351           FastGPIO::Pin<2>::setOutputValueLow();
352           break;
353         case 1:
354           FastGPIO::Pin<3>::setOutputValueLow();
355           break;
356         case 2:
357           FastGPIO::Pin<4>::setOutputValueLow();
358           break;
359         case 3:
360           FastGPIO::Pin<5>::setOutputValueLow();
361           break;
362       }
363     }
364     else {
365       switch (row) { // Turn off this led
366         case 0:
367           FastGPIO::Pin<2>::setOutputValueHigh();
368           break;
369         case 1:
370           FastGPIO::Pin<3>::setOutputValueHigh();
371           break;
372         case 2:
373           FastGPIO::Pin<4>::setOutputValueHigh();
374           break;
375         case 3:
376           FastGPIO::Pin<5>::setOutputValueHigh();
377           break;
378       }
379     }
380   }
381   switch (col) { // Turn column on
382     case 0:
383       FastGPIO::Pin<6>::setOutputValueHigh();
384       break;
385     case 1:
386       FastGPIO::Pin<7>::setOutputValueHigh();
387       break;
388     case 2:
389       FastGPIO::Pin<8>::setOutputValueHigh();
390       break;
391     case 3:
392       FastGPIO::Pin<9>::setOutputValueHigh();
393       break;
394     case 4:
395       FastGPIO::Pin<10>::setOutputValueHigh();
396       break;
397     case 5:
398       FastGPIO::Pin<16>::setOutputValueHigh();
399       break;
400     case 6:
401       FastGPIO::Pin<14>::setOutputValueHigh();
402       break;
403     case 7:
404       FastGPIO::Pin<15>::setOutputValueHigh();
405       break;
406     case 8:
407       FastGPIO::Pin<18>::setOutputValueHigh();
408       break;
409     case 9:
410       FastGPIO::Pin<19>::setOutputValueHigh();
411       break;
412     case 10:
413       FastGPIO::Pin<20>::setOutputValueHigh();
414       break;
415     case 11:
416       FastGPIO::Pin<21>::setOutputValueHigh();
417       break;
418   }
419
420 }