Library for detecting button clicks, doubleclicks and long press pattern on a single button.

Dependents:   OneButton_Example ABBlind

OneButton.h

Committer:
jaup
Date:
2016-08-31
Revision:
0:62d614796022
Child:
1:fdf67f893a5c

File content as of revision 0:62d614796022:

// -----
// OneButton.h - Library for detecting button clicks, doubleclicks and long press pattern on a single button.
// This class is implemented for use with the Arduino environment.
// Copyright (c) by Matthias Hertel, http://www.mathertel.de
// This work is licensed under a BSD style license. See http://www.mathertel.de/License.aspx
// More information on: http://www.mathertel.de/Arduino
// -----
// 02.10.2010 created by Matthias Hertel
// 21.04.2011 transformed into a library
// 01.12.2011 include file changed to work with the Arduino 1.0 environment
// 23.03.2014 Enhanced long press functionalities by adding longPressStart and longPressStop callbacks
// 21.09.2015 A simple way for debounce detection added.
// -----

#ifndef OneButton_h
#define OneButton_h

#include "mbed.h"
#include "millis.h"

#define HIGH		1
#define LOW         0

// ----- Callback function types -----

extern "C" {
	typedef void (*callbackFunction)(void);
}


class OneButton
{
public:
	// ----- Constructor -----
	OneButton(PinName pin, int active = 1);

	// ----- Set runtime parameters -----

	// set # millisec after single click is assumed.
	void setClickTicks(int ticks);

	// set # millisec after press is assumed.
	void setPressTicks(int ticks);

	// attach functions that will be called when button was pressed in the specified way.
	void attachClick(callbackFunction newFunction);
	void attachDoubleClick(callbackFunction newFunction);
	void attachPress(callbackFunction newFunction); // DEPRECATED, replaced by longPressStart, longPressStop and duringLongPress
	void attachLongPressStart(callbackFunction newFunction);
	void attachLongPressStop(callbackFunction newFunction);
	void attachDuringLongPress(callbackFunction newFunction);

	// ----- State machine functions -----

	// call this function every some milliseconds for handling button events.
	void tick(void);
	bool isLongPressed();

private:
	int _pin;        // hardware pin number.
	int _clickTicks; // number of ticks that have to pass by before a click is detected
	int _pressTicks; // number of ticks that have to pass by before a long button press is detected
	static 
	const int _debounceTicks = 10; // number of ticks for debounce times.

	int _buttonReleased;
	int _buttonPressed;

	bool _isLongPressed;

	// These variables will hold functions acting as event source.
	callbackFunction _clickFunc;
	callbackFunction _doubleClickFunc;
	callbackFunction _pressFunc;
	callbackFunction _longPressStartFunc;
	callbackFunction _longPressStopFunc;
	callbackFunction _duringLongPressFunc;

	// These variables that hold information across the upcoming tick calls.
	// They are initialized once on program start and are updated every time the tick function is called.
	int _state;
	unsigned long _startTime; // will be set in state 1
	
	DigitalIn* btn_pin;
};

#endif