|
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); |
|
} |
|
} |
|
|