mirror of
https://github.com/ETLCPP/etl.git
synced 2026-06-15 16:36:03 +08:00
* Add ranges * Initial Hugo setup * Work in progress * Added selection for local or remote site * Updated to 'light' theme * Changed to using Hextra Hugo theme * Changed to using Hextra Hugo theme * Changed to Hextra Hugo theme * Change to Hextra Hugo theme * Updated Hugo setup. * Updated Hugo setup. # Conflicts: # docs/releases/_index.md * Work in progress * Added new fonts Added new documentation * Latest documentation updates * Latest documentation updates # Conflicts: # docs/containers/array.md # docs/containers/array_view.md # docs/containers/array_wrapper.md # docs/containers/bip_buffer_spsc_atomic.md # docs/containers/bitset.md # docs/containers/indirect_vector.md # docs/containers/vector.md # docs/getting-started/compilers.md * Added bloom_filter markdown doc * Added more documentation Updated CSS for light and dark modes * Fixed some menus Added mode documentation files * Updated CSS rules Added badges to home page Added uniqur_ptr + pool tutorial * Fixed formatting on the home page markdown Modified light amd dark code formatting * Updated unique_ptr-with-pool * Added container and shared message tutorials * Updates to documentation * Added const_multimap * Updated source-formatting.md * Added initial raw text files form Web site editor * Innore coverage build directory * Exported raw text documentation files from the web site editor * Hugo updates * Added Hugo intalation and markdown descriptions * More addition to the documentation * Added closure.md and updates to delegate.md * Added format.md * Added documentation for etl::delegate_observable, etl::function, Base64 codec * Added io_port documentation * Added basic_format_spec * Added documentation for string_stream and string utilities. * Added more documentation Updated the documentation CSS * Added documentation for clocks, day, duration * Added more documentation for chrono classes Updated callouts * More chrono documentation * Completed chrono documentation * Maths functions documentation * Completed maths documentation * Completed maths documentation * Completed maths documentation * Completed maths documentation * Added multiple documentation files * Added iterator.md * Added debug_count.md and versions.md * Added debug_count.md and versions.md * Added more documentation * More documentation * Added some design pattern documentation Modified some of the layout files Modified the About documentation * Converted more documentation pages Modified the site CSS * Added more documentation Moced some documentation files to new directories * Added more documentation Tweaks to CSS * Added callback_timer_deferred_locked documentation * Added callback_timer_locked documentation * More documentation updates * More documentation updates * More documentation updates * New documentation files. Harmonised file name format * New documentation files. * Multiple document updates * Multiple document updates * Final conversion of web pages * Updates before PR * Updates before PR * Updates before PR # Conflicts: # docs/blog/_index.md * Final pre PR updates * Updates to message framework documentation * Renamed directory * Fix spelling * Added author and date to blog files Moved documentation files merged from development * Fixed 'Description' typo * Fix typos # Conflicts: # docs/IO/io_port.md # docs/containers/sets/const-multiset.md # docs/containers/sets/const-set.md # docs/maths/correlation.md # docs/maths/gamma.md * Renamed two files to lower case * Minor renaming * Added author and date * Updated callout on bresenham_line.md Added support for showing the ETL version on the documentation first page, by copying the version.txt file as a hugo asset. Updated the Python 'update_release.py' to copy 'version.txt' * Replace space in filename with hyphen. Added more information to hugo-commands.md * Replace space in filename with hyphen. Added more information to hugo-commands.md # Conflicts: # docs/getting-started/view-the-docs-locally/hugo-commands.md * Added a link to pseudo_moving_average.md * Updated title pages for groups * Fixed missing 404 for non-existent pages * Fixed coordinate variable names in the 'Calculating the intersection' example --------- Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de> Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com> Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk>
247 lines
5.5 KiB
Markdown
247 lines
5.5 KiB
Markdown
---
|
|
title: "debounce"
|
|
---
|
|
|
|
{{< callout type="info">}}
|
|
Header: `debounce.h`
|
|
Since: `TBC`
|
|
{{< /callout >}}
|
|
|
|
A class to debounce signals.
|
|
|
|
It can detect signal hold, and generate auto repeat.
|
|
|
|
```cpp
|
|
etl::debounce<uint16_t Valid_Count = 0,
|
|
uint16_t Hold_Count = 0,
|
|
uint16_t Repeat_Count = 0>
|
|
```
|
|
|
|
There are four variants of the class which are selected at compile time according to the supplied template parameters.
|
|
All of the template parameters are optional.
|
|
|
|
If the first parameter is supplied then the debouncer acts as a simple signal debounce.
|
|
The signal will become valid after `VALID_COUNT` identical samples have been added.
|
|
|
|
If the second parameter is supplied then the debouncer will detect the signal being held true for `HOLD_COUNT` samples after becoming valid.
|
|
|
|
If the third parameter is supplied then the debouncer will indicate that a change has occurred for the signal being held true for each `REPEAT_COUNT` that occurs after entering the hold state.
|
|
|
|
If no template parameters are supplied then the template variant using internal variables is used.
|
|
This has similar parameters supplied to the constructor or the `set` member function.
|
|
|
|
The diagram below shows the effect of the various parameters.
|
|
|
|

|
|
|
|
## Functions
|
|
|
|
```cpp
|
|
debounce(bool initial_state = false)
|
|
```
|
|
**Description**
|
|
Default constructor.
|
|
|
|
`etl::debounce<Valid_Count, Hold_Count, Repeat_Count>`
|
|
|
|
The initial state defaults to:
|
|
|
|
Initial state = `false`
|
|
Valid count = `Valid_Count`
|
|
Hold count = `Hold_Count`
|
|
Repeat count = `Repeat_Count`
|
|
|
|
---
|
|
|
|
`etl::debounce<Valid_Count, Hold_Count>`
|
|
|
|
The initial state defaults to:
|
|
|
|
Initial state = `false`
|
|
Valid count = `Valid_Count`
|
|
Hold count = `Hold_Count`
|
|
Repeat count = `0` (Disabled)
|
|
|
|
---
|
|
|
|
`etl::debounce<Valid_Count>`
|
|
|
|
The initial state defaults to:
|
|
|
|
Initial state = `false`
|
|
Valid count = `Valid_Count`
|
|
Hold count = `0` (Disabled)
|
|
Repeat count = `0` (Disabled)
|
|
|
|
---
|
|
|
|
`etl::debounce<>`
|
|
|
|
The initial state defaults to:
|
|
|
|
Initial state = `false`
|
|
Valid count = `1`
|
|
Hold count = `0` (Disabled)
|
|
Repeat count = `0` (Disabled)
|
|
|
|
---
|
|
|
|
```cpp
|
|
debounce(bool initial_state,
|
|
uint16_t valid_count = 1,
|
|
uint16_t hold_count = 0,
|
|
uint16_t repeat_count = 0)
|
|
```
|
|
**Description**
|
|
The constructor available when no template parameters are supplied.
|
|
|
|
Valid count = `1`
|
|
Hold count = `0` (Disabled)
|
|
Repeat count = `0` (Disabled)
|
|
|
|
---
|
|
|
|
```cpp
|
|
bool add(bool sample)
|
|
```
|
|
**Description**
|
|
Adds a new signal sample. Returns true if the state of the debouncer becomes valid, held or repeating.
|
|
|
|
```cpp
|
|
bool has_changed() const
|
|
```
|
|
**Description**
|
|
Returns `true` if the state of the debouncer became valid, held or repeating after the last sample
|
|
|
|
---
|
|
|
|
```cpp
|
|
bool is_set() const
|
|
```
|
|
**Description**
|
|
Returns `true` if the debouncer is set, `false` if cleared.
|
|
|
|
---
|
|
|
|
```cpp
|
|
bool is_held() const
|
|
```
|
|
**Description**
|
|
Returns `true` if the debouncer signal is being held.
|
|
|
|
---
|
|
|
|
```cpp
|
|
bool is_repeating() const
|
|
```
|
|
**Description**
|
|
Returns `true` if the debouncer signal is repeating.
|
|
|
|
---
|
|
|
|
```cpp
|
|
void set(uint16_t valid_count, uint16_t hold_count = 0, uint16_t repeat_count = 0)
|
|
```
|
|
**Description**
|
|
Sets the debouncer parameters.
|
|
Only available when no template parameters are supplied.
|
|
|
|
## Examples
|
|
```cpp
|
|
etl::debounce<20> debouncer;
|
|
```
|
|
**Description**
|
|
Simple debounce.
|
|
Valid after 20 identical samples.
|
|
|
|
---
|
|
|
|
```cpp
|
|
etl::debounce<20, 1000> debouncer;
|
|
```
|
|
**Description**
|
|
Key debounce.
|
|
Valid after 20 identical samples.
|
|
Hold detection after 1000 'set' samples.
|
|
|
|
---
|
|
|
|
```cpp
|
|
etl::debounce<20, 1000, 100> debouncer;
|
|
```
|
|
**Description**
|
|
Key debounce with hold and auto repeat.
|
|
Valid after 20 identical samples.
|
|
Hold detection after 1000 'set' samples.
|
|
Repeat every 100 samples after hold.
|
|
|
|
---
|
|
|
|
```cpp
|
|
etl::debounce<> debouncer;
|
|
debouncer.set(20, 1000, 100);
|
|
```
|
|
**Description**
|
|
Key debounce with hold and auto repeat.
|
|
Runtime parameters.
|
|
|
|
---
|
|
|
|
The example below targets the Arduino hardware.
|
|
|
|
```cpp
|
|
//***********************************************************************************
|
|
// A debounce demo that reads a key and toggles the LED.
|
|
// Set the pin to the correct one for your key.
|
|
//***********************************************************************************
|
|
|
|
#include <debounce.h>
|
|
|
|
// The sample time in ms.
|
|
const int Sample_Time = 1;
|
|
|
|
// The number of samples that must agree before a key state change is recognised.
|
|
// 50 = 50ms for 1ms sample time.
|
|
const int Debounce_Count = 50;
|
|
|
|
// The number of samples that must agree before a key held state is recognised.
|
|
// 1000 = 1s for 1ms sample time.
|
|
const int Hold_Count = 1000;
|
|
|
|
// The number of samples that must agree before a key repeat state is recognised.
|
|
// 200 = 200ms for 1ms sample time.
|
|
const int Repeat_Count = 200;
|
|
|
|
// The pin that the key is attached to.
|
|
const int Key = XX;
|
|
|
|
void setup()
|
|
{
|
|
// Initialize LED pin as an output.
|
|
pinMode(LED_BUILTIN , OUTPUT);
|
|
digitalWrite(LED_BUILTIN, LOW);
|
|
|
|
// Initialize KEY pin as an input.
|
|
pinMode(KEY, INPUT);
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
static int led_state = LOW;
|
|
static etl::debounce<Debounce_Count, Hold_Count, Repeat_Count> key_state;
|
|
|
|
// Assumes 'HIGH' is 'pressed' and 'LOW' is 'released'.
|
|
if (key_state.add(digitalRead(KEY) == HIGH))
|
|
{
|
|
if (key_state.is_set())
|
|
{
|
|
// Toggle the LED state on every validated press or repeat.
|
|
led_state = (led_state == LOW ? HIGH : LOW);
|
|
digitalWrite(LED_BUILTIN, led_state);
|
|
}
|
|
}
|
|
|
|
delay(1); // Wait 1ms
|
|
}
|
|
```
|