A digital input with switch debouncing
Dependents: DebounceIn_Demo RotaryEncoderWaterFlow
Diff: DebounceIn.cpp
- Revision:
- 0:e43521d55082
diff -r 000000000000 -r e43521d55082 DebounceIn.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DebounceIn.cpp Sun Dec 20 12:04:08 2015 +0000 @@ -0,0 +1,62 @@ +/* A digital input with switch debouncing + * Copyright 2015, Takuo Watanabe + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DebounceIn.h" + +DebounceIn::DebounceIn(PinName pin, timestamp_t us) : DigitalIn(pin) { + _prev = _curr = 0; + _rise = _fall = NULL; + set_sample_rate(us); +} + +DebounceIn::~DebounceIn() { + _ticker.detach(); +} + +int DebounceIn::read() { + return _curr; +} + +#ifdef MBED_OPERATORS + /** An operator shorthand for read() + */ + DebounceIn::operator int() { + return read(); + } +#endif + +void DebounceIn::set_sample_rate(timestamp_t us) { + _ticker.detach(); + _ticker.attach_us(this, &DebounceIn::sample, us); +} + +void DebounceIn::rise(void (*fptr)(void)) { + _rise.attach(fptr); +} + +void DebounceIn::fall(void (*fptr)(void)) { + _fall.attach(fptr); +} + +void DebounceIn::sample() { + int now = DigitalIn::read(); + if (now == _prev) { + if (!_curr && now) _rise.call(); + if (_curr && !now) _fall.call(); + _curr = now; + } + _prev = now; +}