Skip to content

Instantly share code, notes, and snippets.

@markedagain
Created June 16, 2017 04:16
Show Gist options
  • Save markedagain/244440e31dbeb3c9621f278a8713d642 to your computer and use it in GitHub Desktop.
Save markedagain/244440e31dbeb3c9621f278a8713d642 to your computer and use it in GitHub Desktop.
const int LED_PIN = 13;
const int BRAUD_RATE = 9600;
const int PIN_NO = 29;
const int STATE_PIN_NO = 4;
// Input pin management
int rPins[PIN_NO] = {A3,A4,A11,A12,A13,A14,A15,5,6,7,8,9,10,11,12,22,23,24,25,26,27,34,35,36,37,38,39,40,41};
int rPinsFlags[PIN_NO][2];
int statePins[STATE_PIN_NO] = {28,29,31,32};
int statePinsFlags[STATE_PIN_NO][2];
uint8_t codebuffer[8] = { 0 }; // Global keyboard keycodes buffer
uint8_t keyModifier = 0;
void setup() {
//Start Serial
Serial.begin(BRAUD_RATE);
pinMode(LED_PIN, OUTPUT);//for led status
pinMode(30, INPUT_PULLUP);
pinMode(33, INPUT_PULLUP);
setInputPinsPullup(rPins,PIN_NO);
setInputPinsPullup(statePins,STATE_PIN_NO);
delay(200);
}
void loop() {
keyModifier = 0;
if(digitalRead(30) == LOW ){
keyModifier = 0x01;
}
if(digitalRead(33) == LOW ){//main power switch
handleButtonPress(rPins,PIN_NO,rPinsFlags,false);
handleButtonPress(statePins,STATE_PIN_NO,statePinsFlags,true);
}
}
void handleButtonPress(int pinsToCheck[], int numPins, int flags[][2],bool statePins){
for(int Pin = 0; Pin < numPins; Pin++)
{
if(digitalRead(pinsToCheck[Pin]) == LOW ) //something is pressed and fires off once only, statePin or not
{
if (flags[Pin][1] == 0){
flags[Pin][1] = 1;
codebuffer[0] = keyModifier;//KEY_LEFT_CTRL + KEY_LEFT_ALT + KEY_LEFT_SHIFT;
codebuffer[2] = Pin + 4;
outputBuffer();
releaseKey();
delay(200);
}
}else if(digitalRead(pinsToCheck[Pin]) == HIGH and flags[Pin][1] == 1 and statePins){ //if nothing pressed and is statePin and was previously pressed, send signal: "off state" (ie new keycode)
flags[Pin][1] = 0;
codebuffer[0] = keyModifier;//KEY_LEFT_CTRL + KEY_LEFT_ALT + KEY_LEFT_SHIFT;
codebuffer[2] = PIN_NO + Pin + 4;
outputBuffer();
releaseKey();
delay(200);
}else{
flags[Pin][1] = 0;
}
}
}
void outputBuffer(){
Serial.write(codebuffer,8);
}
void releaseKey(){
codebuffer[0] = 0;
codebuffer[2] = 0;
Serial.write(codebuffer, 8); // Release key
}
void setInputPinsPullup(int pinsToSet[], int numPins){
for(int Pin = 0; Pin < numPins; Pin++)
{
pinMode(pinsToSet[Pin], INPUT_PULLUP);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment