UT47 layout (#2791)
* Add new project files for UT47 * Copy over keymap and related files * Add LED_controls.ino * Add README instructions * Attempt sending press byte data * Disable mousekeys * Enable sending serial data to LED controller * Update LED mode names * Remove extra file * Add LED enable flag * Update READMEs with more info * Credit original author * Update copyrights * Update docs * Changed based on review * Move layout screenshot to Imgur * Append to src * Enable mousekeys to fix bad keycodes * Additional changes based on feedback * Fix fn layer keys
This commit is contained in:
parent
1feb42a108
commit
32446eeeb6
11 changed files with 1095 additions and 0 deletions
420
keyboards/ut47/LED_controls.ino
Normal file
420
keyboards/ut47/LED_controls.ino
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue