add debounce_unit_test.cpp
This commit is contained in:
parent
27f0c2dfaa
commit
51fb06939f
78
examples/debounce_unit_test.cpp
Normal file
78
examples/debounce_unit_test.cpp
Normal file
@ -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() { }
|
@ -6,8 +6,6 @@
|
|||||||
#include <RowPort.h>
|
#include <RowPort.h>
|
||||||
#include <ColPort.h>
|
#include <ColPort.h>
|
||||||
|
|
||||||
#define SAMPLE_COUNT 4 //number of consecutive equal bits needed to change a debounced bit
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Instantiation
|
Instantiation
|
||||||
------------
|
------------
|
||||||
|
Reference in New Issue
Block a user