|
|
@@ -0,0 +1,78 @@ |
|
|
|
/* test debounce() function. 16/6/1 Passed test for SAMPLE_COUNT 1, 2, and 4. |
|
|
|
copied from keybrd/src/Row::debounce() |
|
|
|
|
|
|
|
to run test: |
|
|
|
$ g++ debounce_unit_test.cpp |
|
|
|
$ ./a.out |
|
|
|
*/ |
|
|
|
#include <inttypes.h> |
|
|
|
#include <iostream> |
|
|
|
|
|
|
|
#define SAMPLE_COUNT 4 //number of consecutive equal bits needed to change a debounced bit |
|
|
|
|
|
|
|
uint8_t samples[SAMPLE_COUNT]; //bitwise, one bit per key, most recent readings |
|
|
|
uint8_t samplesIndex = 0; //samples[] current write index |
|
|
|
uint8_t debounced = 0; //bitwise, one bit per key |
|
|
|
|
|
|
|
uint8_t debounce(const uint8_t rowState) |
|
|
|
{ |
|
|
|
uint8_t all_1 = ~0; //bitwise |
|
|
|
uint8_t all_0 = 0; //bitwise |
|
|
|
|
|
|
|
//delayMicroseconds(DELAY_MICROSECONDS); //delay between Row scans to debounce key |
|
|
|
|
|
|
|
samples[samplesIndex] = rowState; //insert rowState into samples[] ring buffer |
|
|
|
|
|
|
|
if (++samplesIndex >= SAMPLE_COUNT) //if end of ring buffer |
|
|
|
{ |
|
|
|
samplesIndex = 0; //wrap samplesIndex to beginning of ring buffer |
|
|
|
} |
|
|
|
|
|
|
|
for (uint8_t j = 0; j < SAMPLE_COUNT; j++) //traverse the sample[] ring buffer |
|
|
|
{ |
|
|
|
all_1 &= samples[j]; //1 if all samples are 1 |
|
|
|
all_0 |= samples[j]; //0 if all samples are 0 |
|
|
|
} |
|
|
|
|
|
|
|
// update newDebounce if all the samples agree with one another |
|
|
|
// if all samples=1 then newDebounced=1 |
|
|
|
// elseif all samples=0 then newDebounced=0 |
|
|
|
// else newDebounced=debounced i.e. no change |
|
|
|
//return all_1 | (all_0 & debounced); |
|
|
|
debounced = all_1 | (all_0 & debounced); |
|
|
|
return debounced; |
|
|
|
} |
|
|
|
|
|
|
|
int main() |
|
|
|
{ |
|
|
|
//Test input and output only shows first bit of each byte. |
|
|
|
const uint8_t pressed[] = {1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0}; |
|
|
|
const uint8_t bouncy[] = {1,0,0,0,0,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0}; |
|
|
|
const uint8_t SCAN_COUNT = sizeof(bouncy)/sizeof(*bouncy); |
|
|
|
uint8_t i; |
|
|
|
uint8_t newDebounced; |
|
|
|
|
|
|
|
std::cout << "button pressed: "; |
|
|
|
for (i=0; i<SCAN_COUNT; i++) |
|
|
|
{ |
|
|
|
std::cout << (int)pressed[i]; |
|
|
|
} |
|
|
|
std::cout << std::endl; |
|
|
|
|
|
|
|
std::cout << "bouncy signal: "; |
|
|
|
for (i=0; i<SCAN_COUNT; i++) |
|
|
|
{ |
|
|
|
std::cout << (int)bouncy[i]; |
|
|
|
} |
|
|
|
std::cout << std::endl; |
|
|
|
|
|
|
|
std::cout << "debounced signal: "; |
|
|
|
for (i=0; i<SCAN_COUNT; i++) |
|
|
|
{ |
|
|
|
newDebounced = debounce(bouncy[i]); |
|
|
|
std::cout << (int)newDebounced; |
|
|
|
} |
|
|
|
std::cout << std::endl; |
|
|
|
} |
|
|
|
|
|
|
|
void loop() { } |