Software based digital input debouncer

Committer:
Waldek
Date:
Wed Jun 04 10:01:37 2014 +0000
Revision:
2:dabe90a0bdc1
Parent:
1:b59d305c4365
First fully working version

Who changed what in which revision?

UserRevisionLine numberNew 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 }