/* || || @file Keypad.h || @version 1.8 || @author Mark Stanley, Alexander Brevig || @contact mstanley@technologist.com, alexanderbrevig@gmail.com || || @description || | This library provides a simple interface for using matrix || | keypads. It supports the use of multiple keypads with the || | same or different sets of keys. It also supports user || | selectable pins and definable keymaps. || # || || @license || | This library is free software; you can redistribute it and/or || | modify it under the terms of the GNU Lesser General Public || | License as published by the Free Software Foundation; version || | 2.1 of the License. || | || | This library is distributed in the hope that it will be useful, || | but WITHOUT ANY WARRANTY; without even the implied warranty of || | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU || | Lesser General Public License for more details. || | || | You should have received a copy of the GNU Lesser General Public || | License along with this library; if not, write to the Free Software || | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA || # || */ #include "Keypad.h" // <> Allows custom keymap. pin configuration and keypad size Keypad::Keypad(char *userKeymap, byte *row, byte *col, byte rows, byte cols) { rowPins = row; columnPins = col; //Serial.println("Override"); size.rows = rows; //size.rows = 8; size.columns = cols; //size.columns = 16; //Serial.print("Constructor Col "); //int colSize = size.columns; //Serial.print(colSize); //int rowSize = size.rows; //Serial.print(" Row "); //Serial.println(rowSize); begin(userKeymap); lastUpdate = 0; debounceTime = 50; holdTime = 1000; keypadEventListener = 0; currentKey = NO_KEY; state = IDLE; initializePins(); } // Let the user define a keymap - assume the same row- / columncount as defined in constructor void Keypad::begin( char *userKeymap){ keymap = userKeymap; } // Returns the keykode of the pressed key, or NO_KEY if no key is pressed char Keypad::getKey(){ //Serial.print("GetKey Col "); //int colSize = size.columns; //Serial.print(colSize); //int rowSize = size.rows; //Serial.print(" Row "); //Serial.println(rowSize); char key = NO_KEY; // Assume that no key is pressed, this is the default return for getKey() for (byte c=0; c= holdTime) && digitalRead(rowPins[r]) == LOW){ transitionTo(HOLD); } // Button release if (((millis()-lastUpdate) >= debounceTime) && digitalRead(rowPins[r]) == HIGH){ transitionTo(RELEASED); currentKey = NO_KEY; } } // Button pressed event. The user pressed a button. else if (((millis()-lastUpdate) >= debounceTime) && digitalRead(rowPins[r]) == LOW){ digitalWrite(columnPins[c],HIGH); // De-activate the current column. key = keymap[c+(r*size.columns)]; lastUpdate = millis(); goto EVALUATE_KEY; // Save resources and do not attempt to parse to keys at a time } } digitalWrite(columnPins[c],HIGH); // De-activate the current column. } EVALUATE_KEY: if (key != NO_KEY && key != currentKey){ currentKey = key; transitionTo(PRESSED); return currentKey; } else{ return NO_KEY; } } KeypadState Keypad::getState(){ return state; } void Keypad::setDebounceTime(unsigned int debounce){ debounceTime = debounce; } void Keypad::setHoldTime(unsigned int hold){ holdTime = hold; } void Keypad::addEventListener(void (*listener)(char)){ keypadEventListener = listener; } //private void Keypad::transitionTo(KeypadState newState){ if (state!=newState){ state = newState; if (keypadEventListener!=NULL){ keypadEventListener(currentKey); } } } void Keypad::initializePins(){ for (byte r=0; r