Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
DebouncedIn.cpp@0:d31aa980a1f9, 2019-05-06 (annotated)
- Committer:
- victorhlvsilva
- Date:
- Mon May 06 20:27:21 2019 +0000
- Revision:
- 0:d31aa980a1f9
Acionamento retrovisor;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| victorhlvsilva | 0:d31aa980a1f9 | 1 | #include "DebouncedIn.h" |
| victorhlvsilva | 0:d31aa980a1f9 | 2 | #include "mbed.h" |
| victorhlvsilva | 0:d31aa980a1f9 | 3 | |
| victorhlvsilva | 0:d31aa980a1f9 | 4 | /* |
| victorhlvsilva | 0:d31aa980a1f9 | 5 | * Constructor |
| victorhlvsilva | 0:d31aa980a1f9 | 6 | */ |
| victorhlvsilva | 0:d31aa980a1f9 | 7 | DebouncedIn::DebouncedIn(PinName in) |
| victorhlvsilva | 0:d31aa980a1f9 | 8 | : _in(in) { |
| victorhlvsilva | 0:d31aa980a1f9 | 9 | |
| victorhlvsilva | 0:d31aa980a1f9 | 10 | // reset all the flags and counters |
| victorhlvsilva | 0:d31aa980a1f9 | 11 | _samples = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 12 | _output = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 13 | _output_last = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 14 | _rising_flag = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 15 | _falling_flag = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 16 | _state_counter = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 17 | |
| victorhlvsilva | 0:d31aa980a1f9 | 18 | // Attach ticker |
| victorhlvsilva | 0:d31aa980a1f9 | 19 | _ticker.attach(this, &DebouncedIn::_sample, 0.005); |
| victorhlvsilva | 0:d31aa980a1f9 | 20 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 21 | |
| victorhlvsilva | 0:d31aa980a1f9 | 22 | void DebouncedIn::_sample() { |
| victorhlvsilva | 0:d31aa980a1f9 | 23 | |
| victorhlvsilva | 0:d31aa980a1f9 | 24 | // take a sample |
| victorhlvsilva | 0:d31aa980a1f9 | 25 | _samples = _samples >> 1; // shift left |
| victorhlvsilva | 0:d31aa980a1f9 | 26 | |
| victorhlvsilva | 0:d31aa980a1f9 | 27 | if (_in) { |
| victorhlvsilva | 0:d31aa980a1f9 | 28 | _samples |= 0x80; |
| victorhlvsilva | 0:d31aa980a1f9 | 29 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 30 | |
| victorhlvsilva | 0:d31aa980a1f9 | 31 | // examine the sample window, look for steady state |
| victorhlvsilva | 0:d31aa980a1f9 | 32 | if (_samples == 0x00) { |
| victorhlvsilva | 0:d31aa980a1f9 | 33 | _output = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 34 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 35 | else if (_samples == 0xFF) { |
| victorhlvsilva | 0:d31aa980a1f9 | 36 | _output = 1; |
| victorhlvsilva | 0:d31aa980a1f9 | 37 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 38 | |
| victorhlvsilva | 0:d31aa980a1f9 | 39 | |
| victorhlvsilva | 0:d31aa980a1f9 | 40 | // Rising edge detection |
| victorhlvsilva | 0:d31aa980a1f9 | 41 | if ((_output == 1) && (_output_last == 0)) { |
| victorhlvsilva | 0:d31aa980a1f9 | 42 | _rising_flag++; |
| victorhlvsilva | 0:d31aa980a1f9 | 43 | _state_counter = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 44 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 45 | |
| victorhlvsilva | 0:d31aa980a1f9 | 46 | // Falling edge detection |
| victorhlvsilva | 0:d31aa980a1f9 | 47 | else if ((_output == 0) && (_output_last == 1)) { |
| victorhlvsilva | 0:d31aa980a1f9 | 48 | _falling_flag++; |
| victorhlvsilva | 0:d31aa980a1f9 | 49 | _state_counter = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 50 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 51 | |
| victorhlvsilva | 0:d31aa980a1f9 | 52 | // steady state |
| victorhlvsilva | 0:d31aa980a1f9 | 53 | else { |
| victorhlvsilva | 0:d31aa980a1f9 | 54 | _state_counter++; |
| victorhlvsilva | 0:d31aa980a1f9 | 55 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 56 | |
| victorhlvsilva | 0:d31aa980a1f9 | 57 | // update the output |
| victorhlvsilva | 0:d31aa980a1f9 | 58 | _output_last = _output; |
| victorhlvsilva | 0:d31aa980a1f9 | 59 | |
| victorhlvsilva | 0:d31aa980a1f9 | 60 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 61 | |
| victorhlvsilva | 0:d31aa980a1f9 | 62 | |
| victorhlvsilva | 0:d31aa980a1f9 | 63 | |
| victorhlvsilva | 0:d31aa980a1f9 | 64 | // return number of rising edges |
| victorhlvsilva | 0:d31aa980a1f9 | 65 | int DebouncedIn::rising(void) { |
| victorhlvsilva | 0:d31aa980a1f9 | 66 | int return_value = _rising_flag; |
| victorhlvsilva | 0:d31aa980a1f9 | 67 | _rising_flag = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 68 | return(return_value); |
| victorhlvsilva | 0:d31aa980a1f9 | 69 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 70 | |
| victorhlvsilva | 0:d31aa980a1f9 | 71 | // return number of falling edges |
| victorhlvsilva | 0:d31aa980a1f9 | 72 | int DebouncedIn::falling(void) { |
| victorhlvsilva | 0:d31aa980a1f9 | 73 | int return_value = _falling_flag; |
| victorhlvsilva | 0:d31aa980a1f9 | 74 | _falling_flag = 0; |
| victorhlvsilva | 0:d31aa980a1f9 | 75 | return(return_value); |
| victorhlvsilva | 0:d31aa980a1f9 | 76 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 77 | |
| victorhlvsilva | 0:d31aa980a1f9 | 78 | // return number of ticsk we've bene steady for |
| victorhlvsilva | 0:d31aa980a1f9 | 79 | int DebouncedIn::steady(void) { |
| victorhlvsilva | 0:d31aa980a1f9 | 80 | return(_state_counter); |
| victorhlvsilva | 0:d31aa980a1f9 | 81 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 82 | |
| victorhlvsilva | 0:d31aa980a1f9 | 83 | // return the debounced status |
| victorhlvsilva | 0:d31aa980a1f9 | 84 | int DebouncedIn::read(void) { |
| victorhlvsilva | 0:d31aa980a1f9 | 85 | return(_output); |
| victorhlvsilva | 0:d31aa980a1f9 | 86 | } |
| victorhlvsilva | 0:d31aa980a1f9 | 87 | |
| victorhlvsilva | 0:d31aa980a1f9 | 88 | // shorthand for read() |
| victorhlvsilva | 0:d31aa980a1f9 | 89 | DebouncedIn::operator int() { |
| victorhlvsilva | 0:d31aa980a1f9 | 90 | return read(); |
| victorhlvsilva | 0:d31aa980a1f9 | 91 | } |