* 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
		
			
				
	
	
		
			421 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			421 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#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;
 | 
						|
  }
 | 
						|
 | 
						|
}
 |