mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-10-03 18:09:02 -04:00
126 lines
2.6 KiB
C++
126 lines
2.6 KiB
C++
//
|
|
// FILE: AnalogKeypad.cpp
|
|
// AUTHOR: Rob Tillaart
|
|
// VERSION: 0.1.6
|
|
// DATE: 2019-01-31
|
|
// PURPOSE: Class for (Robotdyn) 4x4 and 4x3 analog keypad
|
|
//
|
|
// HISTORY:
|
|
// 0.1.0 2019-01-31 initial version
|
|
// 0.1.1 2019-02-01 add pressed() event() last()
|
|
// 0.1.2 2019-02-01 refactored rawRead(), first stable version
|
|
// 0.1.3 2020-03-25 minor refactoring
|
|
// 0.1.4 2020-05-27 update library.json
|
|
// 0.1.5 2020-12-09 add arduino-ci
|
|
// 0.1.6 2021-05-27 fix arduino-lint
|
|
|
|
|
|
#include "AnalogKeypad.h"
|
|
|
|
|
|
// NOTE the MAGIC NUMBERS in rawRead() are for 8 BIT ADC
|
|
// (8 bit compares are fast)
|
|
//
|
|
// The AKP_SHIFT takes care if the ADC generates more
|
|
// than e.g. 10 bits. Change AKP_BITS to match your
|
|
// build in ADC.
|
|
//
|
|
// Arduino UNO3 build in ==> 10 BITS
|
|
// so AKP_SHIFT ==> 2
|
|
//
|
|
#define AKP_BITS 10
|
|
#define AKP_SHIFT (AKP_BITS - 8)
|
|
|
|
|
|
AnalogKeypad::AnalogKeypad(const uint8_t pin)
|
|
{
|
|
_pin = pin;
|
|
_lastKey = NOKEY;
|
|
}
|
|
|
|
|
|
uint8_t AnalogKeypad::event()
|
|
{
|
|
int rv = NOKEY;
|
|
uint8_t _key = rawRead();
|
|
|
|
if (_key == 0 && _lastKey == 0) rv = NOKEY;
|
|
else if (_key != 0 && _lastKey == 0) rv = PRESSED;
|
|
else if (_key == 0 && _lastKey != 0) rv = RELEASED;
|
|
else if (_key != 0 && _lastKey != 0 && _key == _lastKey) rv = REPEATED;
|
|
else if (_key != 0 && _lastKey != 0 && _key != _lastKey) rv = CHANGED;
|
|
|
|
_lastKey = _key;
|
|
|
|
return rv;
|
|
}
|
|
|
|
|
|
uint8_t AnalogKeypad::pressed()
|
|
{
|
|
int rv = NOKEY;
|
|
|
|
uint8_t _key = rawRead();
|
|
if (_key == _lastKey) // NOKEY OR REPEAT
|
|
{
|
|
rv = _lastKey;
|
|
}
|
|
else if (_key == 0 && _lastKey != 0) // RELEASE
|
|
{
|
|
_lastKey = _key;
|
|
rv = _lastKey;
|
|
}
|
|
else if (_key != 0 && _lastKey == 0) // PRESS
|
|
{
|
|
_lastKey = _key;
|
|
rv = _lastKey;
|
|
}
|
|
else if (_key != 0 && _lastKey != 0 && _key != _lastKey) // SUPPRESS CHANGE
|
|
{
|
|
rv = _lastKey;
|
|
}
|
|
|
|
return rv;
|
|
}
|
|
|
|
|
|
uint8_t AnalogKeypad::read()
|
|
{
|
|
_lastKey = rawRead();
|
|
return _lastKey;
|
|
}
|
|
|
|
|
|
// Adjust numbers for other than 4x4 keypad
|
|
uint8_t AnalogKeypad::rawRead()
|
|
{
|
|
// spends most time in analogRead (uno ~110 usec)
|
|
uint8_t val = analogRead(_pin) >> AKP_SHIFT;
|
|
|
|
// handle NOKEY first
|
|
if (val < 57) return 0;
|
|
|
|
// reduce average # compares by 2 (4x4 keypad)
|
|
if (val < 135)
|
|
{
|
|
if (val < 62) return 16;
|
|
if (val < 75) return 15;
|
|
if (val < 92) return 14;
|
|
if (val < 106) return 13;
|
|
if (val < 113) return 12;
|
|
if (val < 119) return 11;
|
|
if (val < 125) return 10;
|
|
return 9;
|
|
}
|
|
if (val < 146) return 8;
|
|
if (val < 155) return 7;
|
|
if (val < 165) return 6;
|
|
if (val < 187) return 5;
|
|
if (val < 205) return 4;
|
|
if (val < 222) return 3;
|
|
if (val < 244) return 2;
|
|
return 1;
|
|
}
|
|
|
|
// -- END OF FILE --
|