summaryrefslogtreecommitdiffstats
path: root/keyboards/40percentclub/ut47/LED_controls.ino
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/40percentclub/ut47/LED_controls.ino')
-rw-r--r--keyboards/40percentclub/ut47/LED_controls.ino420
1 files changed, 420 insertions, 0 deletions
diff --git a/keyboards/40percentclub/ut47/LED_controls.ino b/keyboards/40percentclub/ut47/LED_controls.ino
new file mode 100644
index 000000000..dd50300eb
--- /dev/null
+++ b/keyboards/40percentclub/ut47/LED_controls.ino
@@ -0,0 +1,420 @@
+#include <FastGPIO.h>
+#include <TimerOne.h>
+
+int iByte;
+byte col = 0;
+byte leds[12][4];
+byte pass = 1;
+int fadecount = 1;
+const int fadelimit = 3000;
+const int fadelimitshort = 1000;
+byte mode = 4;
+byte brightness = 2;
+boolean changemode = 0;
+int rain = 0;
+const int rainlimit = 5000;
+const int rainfade = 5000;
+byte rx = 0;
+byte ry = 0;
+
+// pin[xx] on led matrix connected to nn on Arduino (-1 is dummy to make array start at pos 1)
+int pins[17] = {
+ -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 16, 14, 15, 18, 19, 20, 21
+};
+
+// col[xx] of leds = pin yy on led matrix
+int cols[12] = {
+ pins[8], pins[7], pins[6], pins[5], pins[9], pins[10], pins[11], pins[12], pins[13], pins[14], pins[15], pins[16]
+};
+
+// row[xx] of leds = pin yy on led matrix
+int rows[4] = {
+ pins[1], pins[2], pins[3], pins[4]
+};
+
+
+#define DELAY 0
+extern byte leds[12][4];
+
+void setup() {
+ Serial1.begin(9600);
+ setupLeds();
+ for (int s = 0; s < 5; s++) {
+ for ( int r = 1; r < 9; r++) {
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ for (int j = 0; j < 4; j++) {
+ for (int i = 0; i < 12; i++) {
+ leds[i][j] = 1;
+ for (int p = 0; p < 25; p++) {
+ }
+ leds[i][j] = r;
+ }
+ }
+ }
+ for ( int r = 9; r > 0; r--) {
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ for (int j = 0; j < 4; j++) {
+ for (int i = 0; i < 12; i++) {
+ leds[i][j] = 1;
+ for (int p = 0; p < 25; p++) {
+ }
+ leds[i][j] = r;
+ }
+ }
+ }
+ }
+}
+
+void loop() {
+
+ switch (mode) {
+ case 0:
+ //Blacklight
+ for (int i = 0; i < 12; i++) {
+ for (int j = 0; j < 4; j++) {
+ leds[i][j] = brightness;
+ }
+ }
+ checkserial();
+ break;
+ case 1:
+ //Breathing
+ for ( int r = 1; r < 9; r++) {
+ checkserial();
+ if (changemode == 0) {
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ for (int j = 0; j < 4; j++) {
+ for (int i = 0; i < 12; i++) {
+ leds[i][j] = 1;
+ for (int p = 0; p < 25; p++) {
+ }
+ leds[i][j] = r;
+ }
+ }
+ }
+ else {
+ break;
+ }
+ }
+ for ( int r = 9; r > 0; r--) {
+ checkserial();
+ if (changemode == 0) {
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ for (int j = 0; j < 4; j++) {
+ for (int i = 0; i < 12; i++) {
+ leds[i][j] = 1;
+ for (int p = 0; p < 25; p++) {
+ }
+ leds[i][j] = r;
+ }
+ }
+ }
+ else {
+ break;
+ }
+ }
+ for ( int r = 1; r < 30; r++) {
+ checkserial();
+ if (changemode == 0) {
+ delayMicroseconds(65000);
+ delayMicroseconds(65000);
+ }
+ else {
+ break;
+ }
+ }
+ break;
+ case 2:
+ //Random
+ leds[random(12)][random(4)] = random(8);
+ delayMicroseconds(10000);
+ checkserial();
+ break;
+ case 3:
+ //Rain
+ rain++;
+ if (rain > rainlimit) {
+ rain = 0;
+ rx = random(12);
+ ry = random(4);
+ if (leds[rx][ry] == 0) {
+ leds[rx][ry] = 18;
+ }
+ }
+ fadecount++;
+ if (fadecount > rainfade) {
+ fadecount = 1;
+ for (int i = 0; i < 12; i++) {
+ for (int j = 0; j < 4; j++) {
+ if (leds[i][j] > 0) {
+ leds[i][j] = leds[i][j] - 1;
+ }
+ }
+ }
+ }
+ checkserial();
+ break;
+ case 4:
+ //Reactive
+ fadecount++;
+ if (fadecount > fadelimit) {
+ fadecount = 1;
+ for (int i = 0; i < 12; i++) {
+ for (int j = 0; j < 4; j++) {
+ if (leds[i][j] > 0) {
+ leds[i][j] = leds[i][j] - 1;
+ }
+ }
+ }
+ }
+ checkserial();
+ break;
+ case 5:
+ //Reactive Target
+ fadecount++;
+ if (fadecount > fadelimitshort) {
+ fadecount = 1;
+ for (int i = 0; i < 12; i++) {
+ for (int j = 0; j < 4; j++) {
+ if (leds[i][j] > 0) {
+ leds[i][j] = leds[i][j] - 1;
+ }
+ }
+ }
+ }
+ checkserial();
+ break;
+ default:
+ mode = 0;
+ break;
+ }
+ changemode = 0;
+}
+
+void checkserial() {
+ if (Serial1.available() > 0) {
+ iByte = Serial1.read();
+ if (iByte == 100) {
+ brightness++;
+ if (brightness > 9) {
+ brightness = 1;
+ }
+ }
+ if (iByte == 101) {
+ mode++;
+ }
+ if (iByte < 100) {
+ if (mode == 4) {
+ byte row = iByte / 16;
+ byte col = iByte % 16;
+ leds[col][row] = 18;
+ }
+ if (mode == 5) {
+ byte row = iByte / 16;
+ byte col = iByte % 16;
+ for (byte i = 0; i < 12; i++) {
+ leds[i][row] = 18;
+ }
+ for (byte p = 0; p < 4; p++) {
+ leds[col][p] = 18;
+ }
+ }
+ }
+ }
+}
+
+void setupLeds() {
+ // sets the pins as output
+ FastGPIO::Pin<2>::setOutputLow();
+ FastGPIO::Pin<3>::setOutputLow();
+ FastGPIO::Pin<4>::setOutputLow();
+ FastGPIO::Pin<5>::setOutputLow();
+ FastGPIO::Pin<6>::setOutputLow();
+ FastGPIO::Pin<7>::setOutputLow();
+ FastGPIO::Pin<8>::setOutputLow();
+ FastGPIO::Pin<9>::setOutputLow();
+ FastGPIO::Pin<10>::setOutputLow();
+ FastGPIO::Pin<16>::setOutputLow();
+ FastGPIO::Pin<14>::setOutputLow();
+ FastGPIO::Pin<15>::setOutputLow();
+ FastGPIO::Pin<18>::setOutputLow();
+ FastGPIO::Pin<19>::setOutputLow();
+ FastGPIO::Pin<20>::setOutputLow();
+ FastGPIO::Pin<21>::setOutputLow();
+
+ // set up Cols
+ FastGPIO::Pin<6>::setOutputValueLow();
+ FastGPIO::Pin<7>::setOutputValueLow();
+ FastGPIO::Pin<8>::setOutputValueLow();
+ FastGPIO::Pin<9>::setOutputValueLow();
+ FastGPIO::Pin<10>::setOutputValueLow();
+ FastGPIO::Pin<16>::setOutputValueLow();
+ FastGPIO::Pin<14>::setOutputValueLow();
+ FastGPIO::Pin<15>::setOutputValueLow();
+ FastGPIO::Pin<18>::setOutputValueLow();
+ FastGPIO::Pin<19>::setOutputValueLow();
+ FastGPIO::Pin<20>::setOutputValueLow();
+ FastGPIO::Pin<21>::setOutputValueLow();
+
+ // set up Rows
+ FastGPIO::Pin<2>::setOutputValueLow();
+ FastGPIO::Pin<3>::setOutputValueLow();
+ FastGPIO::Pin<4>::setOutputValueLow();
+ FastGPIO::Pin<5>::setOutputValueLow();
+
+ clearLeds();
+ Timer1.initialize(25);
+ Timer1.attachInterrupt(display);
+
+}
+
+void clearLeds() {
+ // Clear display array
+ for (int i = 0; i < 12; i++) {
+ for (int j = 0; j < 4; j++) {
+ leds[i][j] = 0;
+ }
+ }
+}
+
+void onLeds() {
+ // Clear display array
+ for (int i = 0; i < 12; i++) {
+ for (int j = 0; j < 4; j++) {
+ leds[i][j] = 7;
+ }
+ }
+}
+
+// Interrupt routine
+void display() {
+
+ switch (col) { // Turn whole previous column off
+ case 0:
+ FastGPIO::Pin<6>::setOutputValueLow();
+ break;
+ case 1:
+ FastGPIO::Pin<7>::setOutputValueLow();
+ break;
+ case 2:
+ FastGPIO::Pin<8>::setOutputValueLow();
+ break;
+ case 3:
+ FastGPIO::Pin<9>::setOutputValueLow();
+ break;
+ case 4:
+ FastGPIO::Pin<10>::setOutputValueLow();
+ break;
+ case 5:
+ FastGPIO::Pin<16>::setOutputValueLow();
+ break;
+ case 6:
+ FastGPIO::Pin<14>::setOutputValueLow();
+ break;
+ case 7:
+ FastGPIO::Pin<15>::setOutputValueLow();
+ break;
+ case 8:
+ FastGPIO::Pin<18>::setOutputValueLow();
+ break;
+ case 9:
+ FastGPIO::Pin<19>::setOutputValueLow();
+ break;
+ case 10:
+ FastGPIO::Pin<20>::setOutputValueLow();
+ break;
+ case 11:
+ FastGPIO::Pin<21>::setOutputValueLow();
+ break;
+ }
+
+ col++;
+ if (col == 12) {
+ col = 0;
+ pass++;
+ if (pass > 8) {
+ pass = 1;
+ }
+ }
+ for (int row = 0; row < 4; row++) {
+ if (leds[col][row] > pass) {
+ switch (row) { // Turn on this led
+ case 0:
+ FastGPIO::Pin<2>::setOutputValueLow();
+ break;
+ case 1:
+ FastGPIO::Pin<3>::setOutputValueLow();
+ break;
+ case 2:
+ FastGPIO::Pin<4>::setOutputValueLow();
+ break;
+ case 3:
+ FastGPIO::Pin<5>::setOutputValueLow();
+ break;
+ }
+ }
+ else {
+ switch (row) { // Turn off this led
+ case 0:
+ FastGPIO::Pin<2>::setOutputValueHigh();
+ break;
+ case 1:
+ FastGPIO::Pin<3>::setOutputValueHigh();
+ break;
+ case 2:
+ FastGPIO::Pin<4>::setOutputValueHigh();
+ break;
+ case 3:
+ FastGPIO::Pin<5>::setOutputValueHigh();
+ break;
+ }
+ }
+ }
+ switch (col) { // Turn column on
+ case 0:
+ FastGPIO::Pin<6>::setOutputValueHigh();
+ break;
+ case 1:
+ FastGPIO::Pin<7>::setOutputValueHigh();
+ break;
+ case 2:
+ FastGPIO::Pin<8>::setOutputValueHigh();
+ break;
+ case 3:
+ FastGPIO::Pin<9>::setOutputValueHigh();
+ break;
+ case 4:
+ FastGPIO::Pin<10>::setOutputValueHigh();
+ break;
+ case 5:
+ FastGPIO::Pin<16>::setOutputValueHigh();
+ break;
+ case 6:
+ FastGPIO::Pin<14>::setOutputValueHigh();
+ break;
+ case 7:
+ FastGPIO::Pin<15>::setOutputValueHigh();
+ break;
+ case 8:
+ FastGPIO::Pin<18>::setOutputValueHigh();
+ break;
+ case 9:
+ FastGPIO::Pin<19>::setOutputValueHigh();
+ break;
+ case 10:
+ FastGPIO::Pin<20>::setOutputValueHigh();
+ break;
+ case 11:
+ FastGPIO::Pin<21>::setOutputValueHigh();
+ break;
+ }
+
+}