Software based digital input debouncer
DigitalInDebounced.cpp@1:b59d305c4365, 2014-06-02 (annotated)
- Committer:
- Waldek
- Date:
- Mon Jun 02 14:09:31 2014 +0000
- Revision:
- 1:b59d305c4365
- Parent:
- 0:76aea589cbdd
.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Waldek | 0:76aea589cbdd | 1 | #include "DigitalInDebounced.h" |
Waldek | 0:76aea589cbdd | 2 | /*------------------------------------------------------------- |
Waldek | 0:76aea589cbdd | 3 | |
Waldek | 0:76aea589cbdd | 4 | (c) W.D. 2014 |
Waldek | 0:76aea589cbdd | 5 | |
Waldek | 0:76aea589cbdd | 6 | -------------------------------------------------------------*/ |
Waldek | 0:76aea589cbdd | 7 | |
Waldek | 0:76aea589cbdd | 8 | DigitalInDebounced::DigitalInDebounced(PinName pin_in, unsigned int inDebounceTime) |
Waldek | 0:76aea589cbdd | 9 | { |
Waldek | 0:76aea589cbdd | 10 | Switch = new DigitalIn(pin_in); |
Waldek | 0:76aea589cbdd | 11 | DigitalInDebounced_common(Switch, inDebounceTime); |
Waldek | 0:76aea589cbdd | 12 | } |
Waldek | 0:76aea589cbdd | 13 | |
Waldek | 0:76aea589cbdd | 14 | DigitalInDebounced::DigitalInDebounced(PinName pin_in, PinMode mode, unsigned int inDebounceTime) |
Waldek | 0:76aea589cbdd | 15 | { |
Waldek | 0:76aea589cbdd | 16 | Switch = new DigitalIn(pin_in, mode); |
Waldek | 0:76aea589cbdd | 17 | DigitalInDebounced_common(Switch, inDebounceTime); |
Waldek | 0:76aea589cbdd | 18 | } |
Waldek | 0:76aea589cbdd | 19 | |
Waldek | 0:76aea589cbdd | 20 | void DigitalInDebounced::DigitalInDebounced_common(DigitalIn *SwitchIn, unsigned int inDebounceTime) |
Waldek | 0:76aea589cbdd | 21 | { |
Waldek | 0:76aea589cbdd | 22 | recent = !SwitchIn->read(); |
Waldek | 0:76aea589cbdd | 23 | stable = false; |
Waldek | 0:76aea589cbdd | 24 | DebounceTime = inDebounceTime; |
Waldek | 0:76aea589cbdd | 25 | long int DebounceCount = (inDebounceTime*1000l) / timer_user.TickerPeriod_rd(); |
Waldek | 0:76aea589cbdd | 26 | if (DebounceCount > SAMPLES_TO_DEBOUNCE) |
Waldek | 0:76aea589cbdd | 27 | { |
Waldek | 0:76aea589cbdd | 28 | PreDivider = DebounceCount / SAMPLES_TO_DEBOUNCE; |
Waldek | 0:76aea589cbdd | 29 | Divider = DebounceCount / PreDivider; |
Waldek | 1:b59d305c4365 | 30 | if ((DebounceCount - (PreDivider * PreDivider)) > 0) Divider++; |
Waldek | 0:76aea589cbdd | 31 | } |
Waldek | 0:76aea589cbdd | 32 | else |
Waldek | 0:76aea589cbdd | 33 | { |
Waldek | 0:76aea589cbdd | 34 | PreDivider = 1; |
Waldek | 0:76aea589cbdd | 35 | Divider = DebounceCount; |
Waldek | 0:76aea589cbdd | 36 | } |
Waldek | 0:76aea589cbdd | 37 | |
Waldek | 0:76aea589cbdd | 38 | DebounceCounter = Divider; |
Waldek | 0:76aea589cbdd | 39 | timer_user.Subscribe (this, PreDivider); |
Waldek | 0:76aea589cbdd | 40 | } |
Waldek | 0:76aea589cbdd | 41 | |
Waldek | 0:76aea589cbdd | 42 | bool DigitalInDebounced::read(void) |
Waldek | 0:76aea589cbdd | 43 | { |
Waldek | 0:76aea589cbdd | 44 | if (this->stable) |
Waldek | 0:76aea589cbdd | 45 | return this->recent; |
Waldek | 0:76aea589cbdd | 46 | else |
Waldek | 0:76aea589cbdd | 47 | return false; |
Waldek | 0:76aea589cbdd | 48 | } |
Waldek | 0:76aea589cbdd | 49 | |
Waldek | 0:76aea589cbdd | 50 | DigitalInDebounced::~DigitalInDebounced() |
Waldek | 0:76aea589cbdd | 51 | { |
Waldek | 0:76aea589cbdd | 52 | timer_user.UnSubscribe(this); |
Waldek | 0:76aea589cbdd | 53 | } |
Waldek | 0:76aea589cbdd | 54 | |
Waldek | 0:76aea589cbdd | 55 | void DigitalInDebounced::TimerEvent(void) |
Waldek | 0:76aea589cbdd | 56 | { |
Waldek | 0:76aea589cbdd | 57 | bool temp = !Switch->read(); |
Waldek | 0:76aea589cbdd | 58 | if (temp == recent) |
Waldek | 0:76aea589cbdd | 59 | { |
Waldek | 0:76aea589cbdd | 60 | if (!stable) |
Waldek | 0:76aea589cbdd | 61 | if (0 == (--DebounceCounter)) |
Waldek | 0:76aea589cbdd | 62 | stable = true; |
Waldek | 0:76aea589cbdd | 63 | } |
Waldek | 0:76aea589cbdd | 64 | else |
Waldek | 0:76aea589cbdd | 65 | { |
Waldek | 0:76aea589cbdd | 66 | stable = false; |
Waldek | 0:76aea589cbdd | 67 | recent = temp; |
Waldek | 0:76aea589cbdd | 68 | DebounceCounter = Divider; |
Waldek | 0:76aea589cbdd | 69 | } |
Waldek | 0:76aea589cbdd | 70 | } |